[
  {
    "path": ".all-contributorsrc",
    "content": "{\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": false,\n  \"contributors\": [\n    {\n      \"login\": \"darshkpatel\",\n      \"name\": \"Darsh Patel\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/11258286?v=4\",\n      \"profile\": \"http://darshkpatel.com\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"infra\"\n      ]\n    },\n    {\n      \"login\": \"dssudake\",\n      \"name\": \"Darshan Sudake\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/42094875?v=4\",\n      \"profile\": \"https://www.linkedin.com/in/darshan-sudake-a640ba1b1/\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"design\"\n      ]\n    },\n    {\n      \"login\": \"felixfaisal\",\n      \"name\": \"felixfaisal\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/42486737?v=4\",\n      \"profile\": \"https://felixfaisal.github.io/\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"design\"\n      ]\n    },\n    {\n      \"login\": \"rohitgeddam\",\n      \"name\": \"rohitgeddam\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/48797475?v=4\",\n      \"profile\": \"https://github.com/rohitgeddam\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"design\"\n      ]\n    },\n    {\n      \"login\": \"NavonilDas\",\n      \"name\": \"Navonil Das\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/29132316?v=4\",\n      \"profile\": \"http://navonildas.github.io/\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"design\"\n      ]\n    },\n    {\n      \"login\": \"meet-10\",\n      \"name\": \"Meet10\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/61341284?v=4\",\n      \"profile\": \"https://github.com/meet-10\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"design\"\n      ]\n    },\n    {\n      \"login\": \"gupta-arpit\",\n      \"name\": \"gupta-arpit\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/12170429?v=4\",\n      \"profile\": \"https://github.com/gupta-arpit\",\n      \"contributions\": [\n        \"code\",\n        \"design\"\n      ]\n    },\n    {\n      \"login\": \"ikartikgautam\",\n      \"name\": \"Kartik Gautam\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/39825660?v=4\",\n      \"profile\": \"http://ikartikgautam.web.app/\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"design\"\n      ]\n    },\n    {\n      \"login\": \"kumanik5661\",\n      \"name\": \"Nikhil Kumar\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/42597251?v=4\",\n      \"profile\": \"https://github.com/kumanik5661\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"design\"\n      ]\n    },\n    {\n      \"login\": \"Kaustuv942\",\n      \"name\": \"Kaustuv K Chattopadhyay\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/56028031?v=4\",\n      \"profile\": \"https://github.com/Kaustuv942\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"design\"\n      ]\n    },\n    {\n      \"login\": \"akshat2602\",\n      \"name\": \"Akshat Sharma\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/35724794?v=4\",\n      \"profile\": \"https://akshat-sharma.me\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"design\"\n      ]\n    },\n    {\n      \"login\": \"Rugz007\",\n      \"name\": \"Rugved Somwanshi\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/16833604?v=4\",\n      \"profile\": \"http://rugvedsomwanshi.me\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"design\"\n      ]\n    },\n    {\n      \"login\": \"rajatmaheshwari2512\",\n      \"name\": \"Rajat Maheshwari\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/54249328?v=4\",\n      \"profile\": \"https://rajatmaheshwari.me/\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"design\"\n      ]\n    }\n  ],\n  \"contributorsPerLine\": 7,\n  \"projectName\": \"eSim-Cloud\",\n  \"projectOwner\": \"frg-fossee\",\n  \"repoType\": \"github\",\n  \"repoHost\": \"https://github.com\",\n  \"skipCi\": true\n}\n"
  },
  {
    "path": ".github/workflows/angularTestBuild.yml",
    "content": "name: Angular Build and Tests\n\non:\n  push:\n    paths: [ 'ArduinoFrontend/**' ]\n  pull_request:\n    paths: [ 'ArduinoFrontend/**' ]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v2\n    - name: Use Node js\n      uses: actions/setup-node@v1\n      with:\n        node-version: 10.5.0\n    - name: Install packages,lint,build and Unit testing\n      working-directory: ./ArduinoFrontend\n      run: |\n        npm install\n        npm run lint\n        npm run build -- --prod\n        npm test -- --configuration=ci\n"
  },
  {
    "path": ".github/workflows/devDockerCompose.yml",
    "content": "name: Containers\n\non:\n  push:\n    #Until changes are merged to master initially\n    branches: [ develop, docker-images ]\n\njobs:\n\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n    - name: Login to docker\n      run: echo \"${{ secrets.GITHUB_TOKEN }}\" | docker login https://docker.pkg.github.com -u ${{ github.repository_owner }} --password-stdin\n\n    - name: Build the docker-compose stack\n      run: |\n        docker-compose -f docker-compose.dev.yml --env-file .env pull --ignore-pull-failures\n        docker-compose -f docker-compose.dev.yml --env-file .env build\n\n    - name: Run the docker-compose step\n      run: docker-compose -f docker-compose.dev.yml --env-file .env up -d\n\n    - name: Check running containers\n      run: docker ps -a\n\n    - name: Publish images\n      run: docker-compose -f docker-compose.dev.yml --env-file .env push\n"
  },
  {
    "path": ".github/workflows/dockerTestBackend.yml",
    "content": "name: Django Build and Tests\n\non:\n  push:\n    paths: [ 'esim-cloud-backend/**' ]\n  pull_request:\n    paths: [ 'esim-cloud-backend/**' ]\n\n\njobs:\n\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v2\n\n    - name: Login to docker\n      run: echo \"${{ secrets.GITHUB_TOKEN }}\" | docker login https://docker.pkg.github.com -u ${{ github.repository_owner }} --password-stdin\n    - name: Build Images\n      run: |\n        docker-compose -f docker-compose.dev.yml --env-file .env pull --ignore-pull-failures\n        docker-compose -f docker-compose.dev.yml --env-file .env build\n    - name: Run Django Test Suite\n      run: |\n        docker-compose -f docker-compose.dev.yml run django python manage.py test\n"
  },
  {
    "path": ".github/workflows/masterDockerCompose.yml",
    "content": "name: Containers\n\non:\n  push:\n    branches: [ master, devops ]\n\njobs:\n\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n    - name: Login to docker\n      run: echo \"${{ secrets.GITHUB_TOKEN }}\" | docker login https://docker.pkg.github.com -u ${{ github.repository_owner }} --password-stdin\n\n    - name: Build the docker-compose stack\n      run: |\n        cp .env .env.prod\n        docker-compose -f docker-compose.prod.yml --env-file .env.prod pull --ignore-pull-failures\n        docker-compose -f docker-compose.prod.yml --env-file .env.prod build\n\n    - name: Run the docker-compose step\n      run: docker-compose -f docker-compose.prod.yml --env-file .env.prod up -d\n\n    - name: Check running containers\n      run: docker ps -a\n\n    - name: Publish images\n      if: github.ref == 'refs/heads/master'\n      run: docker-compose -f docker-compose.prod.yml --env-file .env.prod push\n"
  },
  {
    "path": ".github/workflows/prodContainers.yml",
    "content": "name: Master Containers\n\non:\n  push:\n    branches: [ master ]\n\njobs:\n  publish:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v1\n    - name: Login to docker\n      run: echo \"${{ secrets.GITHUB_TOKEN }}\" | docker login https://docker.pkg.github.com -u ${{ github.repository_owner }} --password-stdin\n\n    - name: Build the docker-compose stack\n      run: |\n        cp .env .env.prod\n        docker-compose -f docker-compose.prod.yml --env-file .env.prod pull --ignore-pull-failures\n        docker-compose -f docker-compose.prod.yml --env-file .env.prod build\n    - name: Run the docker-compose step\n      run: docker-compose -f docker-compose.prod.yml --env-file .env.prod up -d\n\n    - name: Check running containers\n      run: docker ps -a\n\n    - name: Publish images\n      run: docker-compose -f docker-compose.prod.yml --env-file .env.prod push\n"
  },
  {
    "path": ".github/workflows/reactEslint.yml",
    "content": "name: ESLint eda-frontend\n\non:\n  push:\n    paths: [ 'eda-frontend/**' ]\n\njobs:\n  eslint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v1\n      - uses: darshkpatel/eslint-action@master\n        with:\n          repo-token: ${{secrets.GITHUB_TOKEN}}\n          source-root: 'eda-frontend'\n"
  },
  {
    "path": ".github/workflows/reactTestBuild.yml",
    "content": "name: React Build and Tests\n\non:\n  push:\n    paths: [ 'eda-frontend/**' ]\n  pull_request:\n    paths: [ 'eda-frontend/**' ]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v2\n    - name: Use Node js\n      uses: actions/setup-node@v1\n      with:\n        node-version: 10.5.0\n    - name: Install packages,lint,build and Unit testing\n      working-directory: ./eda-frontend\n      run: |\n        export NODE_OPTIONS=--max_old_space_size=4096\n        npm install\n        CI=true npm run build\n        CI=true npm test\n"
  },
  {
    "path": ".gitignore",
    "content": "redis_data/\nmysql_data/\n.vscode\nvenv\nenv\n*.sqlite3\n.env.prod\nmongo_data/\nsample_lib/\nsymbols/*\n.DS_Store\nmigrations\nsymbol_svgs\npostgres_data\nfile_storage\nnode_modules\n"
  },
  {
    "path": "ArduinoFrontend/.editorconfig",
    "content": "# Editor configuration, see https://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[*.md]\nmax_line_length = off\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": "ArduinoFrontend/.gitignore",
    "content": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n\n# compiled output\n/dist\n/doc\n/documentation\n/tmp\n/out-tsc\n# Only exists if Bazel was run\n/bazel-out\n\n# dependencies\n/node_modules\n\n# profiling files\nchrome-profiler-events.json\nspeed-measure-plugin.json\n\n# IDEs and editors\n/.idea\n.project\n.classpath\n.c9/\n*.launch\n.settings/\n*.sublime-workspace\n\n# IDE - VSCode\n.vscode/*\n!.vscode/settings.json\n!.vscode/tasks.json\n!.vscode/launch.json\n!.vscode/extensions.json\n.history/*\n\n# misc\n/.sass-cache\n/connect.lock\n/coverage\n/libpeerconnection.log\nnpm-debug.log\nyarn-error.log\ntestem.log\n/typings\n\n# System Files\n.DS_Store\nThumbs.db\n"
  },
  {
    "path": "ArduinoFrontend/Dockerfile",
    "content": "FROM node:10-alpine3.11\n\nRUN mkdir /code\nWORKDIR /code\n\nCOPY package.json /code/package.json\nCOPY package-lock.json /code/package-lock.json\n\n"
  },
  {
    "path": "ArduinoFrontend/README.md",
    "content": "# ArduinoFrontend\n\n## Instructions\n\n* Install Packages\n\n```bash\nnpm install\n```\n\n* Run Server\n\n```bash\nng serve\n```\n\n* Angular Linting\n\n```bash\nng lint\n```\n\n* Angular Unit testing\n\n```bash\nng test\n```\n\n* To generate documentation\n\n```bash\nnpm run doc\n```\n\nThen open a server on the \"documentation\" folder.\n"
  },
  {
    "path": "ArduinoFrontend/angular.json",
    "content": "{\n  \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n  \"version\": 1,\n  \"newProjectRoot\": \"projects\",\n  \"projects\": {\n    \"ArduinoFrontend\": {\n      \"root\": \"\",\n      \"sourceRoot\": \"src\",\n      \"projectType\": \"application\",\n      \"prefix\": \"app\",\n      \"schematics\": {},\n      \"architect\": {\n        \"build\": {\n          \"builder\": \"@angular-devkit/build-angular:browser\",\n          \"options\": {\n            \"outputPath\": \"dist/ArduinoFrontend\",\n            \"index\": \"src/index.html\",\n            \"main\": \"src/main.ts\",\n            \"polyfills\": \"src/polyfills.ts\",\n            \"tsConfig\": \"src/tsconfig.app.json\",\n            \"assets\": [\n              \"src/favicon.ico\",\n              \"src/assets\",\n              {\n                \"glob\": \"**/*\",\n                \"input\": \"node_modules/ngx-monaco-editor/assets/monaco\",\n                \"output\": \"./assets/monaco/\"\n              }\n            ],\n            \"styles\": [\n              \"./node_modules/@angular/material/prebuilt-themes/indigo-pink.css\",\n              \"src/styles.css\"\n            ],\n            \"scripts\": [],\n            \"es5BrowserSupport\": true,\n            \"showCircularDependencies\": false\n          },\n          \"configurations\": {\n            \"production\": {\n              \"fileReplacements\": [\n                {\n                  \"replace\": \"src/environments/environment.ts\",\n                  \"with\": \"src/environments/environment.prod.ts\"\n                }\n              ],\n              \"optimization\": true,\n              \"outputHashing\": \"all\",\n              \"sourceMap\": true,\n              \"extractCss\": true,\n              \"namedChunks\": false,\n              \"aot\": true,\n              \"extractLicenses\": true,\n              \"vendorChunk\": false,\n              \"buildOptimizer\": true,\n              \"budgets\": [\n                {\n                  \"type\": \"initial\",\n                  \"maximumWarning\": \"8mb\",\n                  \"maximumError\": \"10mb\"\n                }\n              ]\n            }\n          }\n        },\n        \"serve\": {\n          \"builder\": \"@angular-devkit/build-angular:dev-server\",\n          \"options\": {\n            \"browserTarget\": \"ArduinoFrontend:build\",\n            \"host\": \"0.0.0.0\"\n          },\n          \"configurations\": {\n            \"production\": {\n              \"browserTarget\": \"ArduinoFrontend:build:production\"\n            }\n          }\n        },\n        \"extract-i18n\": {\n          \"builder\": \"@angular-devkit/build-angular:extract-i18n\",\n          \"options\": {\n            \"browserTarget\": \"ArduinoFrontend:build\"\n          }\n        },\n        \"test\": {\n          \"builder\": \"@angular-devkit/build-angular:karma\",\n          \"options\": {\n            \"main\": \"src/test.ts\",\n            \"polyfills\": \"src/polyfills.ts\",\n            \"tsConfig\": \"src/tsconfig.spec.json\",\n            \"karmaConfig\": \"src/karma.conf.js\",\n            \"styles\": [\n              \"./node_modules/@angular/material/prebuilt-themes/indigo-pink.css\",\n              \"src/styles.css\"\n            ],\n            \"scripts\": [],\n            \"assets\": [\n              \"src/favicon.ico\",\n              \"src/assets\"\n            ]\n          },\n          \"configurations\": {\n            \"ci\": {\n              \"watch\": false,\n              \"progress\": false,\n              \"browsers\": \"CIChromeHeadless\"\n            }\n          }\n        },\n        \"lint\": {\n          \"builder\": \"@angular-devkit/build-angular:tslint\",\n          \"options\": {\n            \"tsConfig\": [\n              \"src/tsconfig.app.json\",\n              \"src/tsconfig.spec.json\"\n            ],\n            \"exclude\": [\n              \"**/node_modules/**\"\n            ]\n          }\n        }\n      }\n    },\n    \"ArduinoFrontend-e2e\": {\n      \"root\": \"e2e/\",\n      \"projectType\": \"application\",\n      \"prefix\": \"\",\n      \"architect\": {\n        \"e2e\": {\n          \"builder\": \"@angular-devkit/build-angular:protractor\",\n          \"options\": {\n            \"protractorConfig\": \"e2e/protractor.conf.js\",\n            \"devServerTarget\": \"ArduinoFrontend:serve\"\n          },\n          \"configurations\": {\n            \"production\": {\n              \"devServerTarget\": \"ArduinoFrontend:serve:production\"\n            },\n            \"ci\": {\n              \"devServerTarget\": \"ArduinoFrontend:serve:production\",\n              \"protractorConfig\": \"e2e/protractor-ci.conf.js\"\n            }\n          }\n        },\n        \"lint\": {\n          \"builder\": \"@angular-devkit/build-angular:tslint\",\n          \"options\": {\n            \"tsConfig\": \"e2e/tsconfig.e2e.json\",\n            \"exclude\": [\n              \"**/node_modules/**\"\n            ]\n          }\n        }\n      }\n    }\n  },\n  \"defaultProject\": \"ArduinoFrontend\",\n  \"cli\": {\n    \"analytics\": \"aae09df8-6ed6-4120-adda-1b9080860d1e\"\n  }\n}"
  },
  {
    "path": "ArduinoFrontend/e2e/protractor-ci.conf.js",
    "content": "\nconst config = require('./protractor.conf').config;\n\nconfig.capabilities = {\n  browserName: 'chrome',\n  chromeOptions: {\n    args: ['--headless', '--no-sandbox', '--disable-gpu'],\n    binary: require('puppeteer').executablePath(),\n  },\n};\n\nexports.config = config;\n"
  },
  {
    "path": "ArduinoFrontend/e2e/protractor.conf.js",
    "content": "// Protractor configuration file, see link for more information\n// https://github.com/angular/protractor/blob/master/lib/config.ts\n\nconst { SpecReporter } = require('jasmine-spec-reporter');\n\nexports.config = {\n  allScriptsTimeout: 11000,\n  specs: [\n    './src/**/*.e2e-spec.ts'\n  ],\n  capabilities: {\n    'browserName': 'chrome'\n  },\n  directConnect: true,\n  baseUrl: 'http://localhost:4200/',\n  framework: 'jasmine',\n  jasmineNodeOpts: {\n    showColors: true,\n    defaultTimeoutInterval: 30000,\n    print: function() {}\n  },\n  onPrepare() {\n    require('ts-node').register({\n      project: require('path').join(__dirname, './tsconfig.e2e.json')\n    });\n    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));\n  }\n};"
  },
  {
    "path": "ArduinoFrontend/e2e/src/app.e2e-spec.ts",
    "content": "import { AppPage } from './app.po';\nimport { browser, logging } from 'protractor';\n\ndescribe('workspace-project App', () => {\n  let page: AppPage;\n\n  beforeEach(() => {\n    page = new AppPage();\n  });\n\n\n  afterEach(async () => {\n    // Assert that there are no errors emitted from the browser\n    const logs = await browser.manage().logs().get(logging.Type.BROWSER);\n    expect(logs).not.toContain(jasmine.objectContaining({\n      level: logging.Level.SEVERE,\n    } as logging.Entry));\n  });\n});\n"
  },
  {
    "path": "ArduinoFrontend/e2e/src/app.po.ts",
    "content": "import { browser, by, element } from 'protractor';\n\n/**\n * AppPage End to End Testing\n */\nexport class AppPage {\n  /**\n   * Navigate to Base URL\n   */\n  navigateTo() {\n    return browser.get(browser.baseUrl) as Promise<any>;\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/e2e/tsconfig.e2e.json",
    "content": "{\n  \"extends\": \"../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../out-tsc/app\",\n    \"module\": \"commonjs\",\n    \"target\": \"es5\",\n    \"types\": [\n      \"jasmine\",\n      \"jasminewd2\",\n      \"node\"\n    ]\n  }\n}"
  },
  {
    "path": "ArduinoFrontend/package.json",
    "content": "{\n  \"name\": \"arduino-frontend\",\n  \"version\": \"0.8.0\",\n  \"scripts\": {\n    \"ng\": \"ng\",\n    \"start\": \"ng serve --disableHostCheck\",\n    \"build\": \" ng build --prod --aot --buildOptimizer --extractCss --optimization --extractLicenses\",\n    \"test\": \"ng test\",\n    \"lint\": \"ng lint\",\n    \"e2e\": \"ng e2e\",\n    \"postinstall\": \"webdriver-manager update --standalone false --gecko false --versions.chrome 76.0.3809.68\",\n    \"doc\": \"compodoc -p tsconfig.json\"\n  },\n  \"private\": true,\n  \"dependencies\": {\n    \"@angular/animations\": \"~7.2.0\",\n    \"@angular/cdk\": \"~7.3.7\",\n    \"@angular/common\": \"~7.2.0\",\n    \"@angular/compiler\": \"~7.2.0\",\n    \"@angular/core\": \"~7.2.0\",\n    \"@angular/forms\": \"~7.2.0\",\n    \"@angular/material\": \"^7.3.7\",\n    \"@angular/platform-browser\": \"~7.2.0\",\n    \"@angular/platform-browser-dynamic\": \"~7.2.0\",\n    \"@angular/router\": \"~7.2.0\",\n    \"chart.js\": \"^2.9.4\",\n    \"chroma-js\": \"^1.3.5\",\n    \"core-js\": \"^2.6.12\",\n    \"file-saver\": \"^2.0.5\",\n    \"is-promise\": \"2.2.2\",\n    \"lodash\": \"^4.17.19\",\n    \"lodash-transpose\": \"^0.2.1\",\n    \"ng2-charts\": \"^2.4.3\",\n    \"ngx-filter-pipe\": \"^2.1.2\",\n    \"ngx-monaco-editor\": \"^7.0.0\",\n    \"or\": \"^0.2.0\",\n    \"rxjs\": \"~6.3.3\",\n    \"tslib\": \"^1.14.1\",\n    \"zone.js\": \"~0.8.26\"\n  },\n  \"devDependencies\": {\n    \"@angular-devkit/build-angular\": \"^0.13.10\",\n    \"@angular/cli\": \"~7.3.8\",\n    \"@angular/compiler-cli\": \"~7.2.0\",\n    \"@angular/language-service\": \"~7.2.0\",\n    \"@compodoc/compodoc\": \"^1.1.11\",\n    \"@types/jasmine\": \"^2.8.17\",\n    \"@types/jasminewd2\": \"^2.0.9\",\n    \"@types/node\": \"^8.10.66\",\n    \"avr8js\": \"^0.9.2\",\n    \"codelyzer\": \"~4.5.0\",\n    \"jasmine-core\": \"~2.99.1\",\n    \"jasmine-spec-reporter\": \"~4.2.1\",\n    \"karma\": \"~4.0.0\",\n    \"karma-chrome-launcher\": \"~2.2.0\",\n    \"karma-coverage-istanbul-reporter\": \"~2.0.1\",\n    \"karma-jasmine\": \"~1.1.2\",\n    \"karma-jasmine-html-reporter\": \"^0.2.2\",\n    \"protractor\": \"~5.4.0\",\n    \"puppeteer\": \"chrome-76\",\n    \"ts-node\": \"~7.0.0\",\n    \"tslint\": \"~5.11.0\",\n    \"typescript\": \"~3.2.2\"\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/AVR8/Execute.ts",
    "content": "import { TaskScheduler } from './Scheduler';\nimport { parseHex } from './IntelHex';\n\n/**\n * AVR8 Global Variable\n */\ndeclare var AVR8: any;\n\n/**\n * Event to change the Value of a pin after some duration in microseconds\n */\nexport interface MicroEvent {\n  /**\n   * State of the Pin\n   */\n  state: boolean;\n  /**\n   * Pin Number\n   */\n  pin: number;\n  /**\n   * Port register\n   */\n  port: string;\n  /**\n   * Start of the clock\n   */\n  start: number;\n  /**\n   * Complete time period in microsecond\n   */\n  period: number;\n  /**\n   * Is Event enabled\n   */\n  enable: boolean;\n}\n\n/**\n * PWM Event\n */\nexport interface ServoEvent {\n  /**\n   * Pin where component is attached\n   */\n  pin: number;\n  /**\n   * Start time of the event\n   */\n  start: number;\n  /**\n   * prev value of pwm (angle in case of servo)\n   */\n  prevAngle: number;\n  /**\n   * is we only need pwm output\n   */\n  isPWM?: boolean;\n  /**\n   * Port where component is attached.\n   */\n  port?: string;\n  /**\n   * Callback with current value and previous value\n   */\n  callback: (angle: number, prevAngle: number) => void;\n}\n\n/**\n * Arduino Program Loop class ie. Arduino runner\n */\nexport class ArduinoRunner {\n  /**\n   * Program Data\n   */\n  readonly program = new Uint16Array(0x8000);\n  /**\n   * Arduino CPU\n   */\n  readonly cpu: any;\n  /**\n   * Arduino Timer 0\n   */\n  readonly timer0: any;\n  /**\n   * Arduino Timer 1\n   */\n  readonly timer1: any;\n  /**\n   * Arduino Timer 2\n   */\n  readonly timer2: any;\n  /**\n   * Arduino register Port B\n   */\n  readonly portB: any;\n  /**\n   * Arduino register Port C\n   */\n  readonly portC: any;\n  /**\n   * Arduino register Port D\n   */\n  readonly portD: any;\n  /**\n   * Arduino Universal Synchronous/Asynchronous Receiver/Transmitter\n   */\n  readonly usart: any;\n  /**\n   * Arduino Analog to Digital Convertor\n   */\n  readonly adc: any;\n  /**\n   * Arduino Frequency\n   */\n  readonly frequency = 16e6;\n  /**\n   * Task Scheduler for Arduino\n   */\n  readonly scheduler: TaskScheduler = new TaskScheduler();\n  /**\n   * Work Unit Cycles\n   */\n  readonly workUnitCycles = 500000; // TODO: FIGURE OUT\n  /**\n   * All microseconds event\n   */\n  private events: MicroEvent[] = [];\n  /**\n   * List for all PWM events\n   */\n  private servo: ServoEvent[] = [];\n  /**\n   * Port Listeners\n   */\n  private listeners: any = {};\n  /**\n   * Contains Serial data\n   */\n  private serialBuffer: string[] = [];\n  /**\n   * Arduino runner constructor\n   * @param hex Compiled Hex string\n   */\n  constructor(hex: string) {\n    // Parse the compiled hex\n    parseHex(hex, new Uint8Array(this.program.buffer));\n    // initialize variables\n    this.cpu = new AVR8.CPU(this.program);\n    this.timer0 = new AVR8.AVRTimer(this.cpu, AVR8.timer0Config);\n    this.timer1 = new AVR8.AVRTimer(this.cpu, AVR8.timer1Config);\n    this.timer2 = new AVR8.AVRTimer(this.cpu, AVR8.timer2Config);\n    this.portB = new AVR8.AVRIOPort(this.cpu, AVR8.portBConfig);\n    this.portC = new AVR8.AVRIOPort(this.cpu, AVR8.portCConfig);\n    this.portD = new AVR8.AVRIOPort(this.cpu, AVR8.portDConfig);\n    this.usart = new AVR8.AVRUSART(this.cpu, AVR8.usart0Config, this.frequency);\n    this.adc = new AVR8.ADC(this.cpu);\n    // Start the scheduler\n    this.scheduler.start();\n  }\n  /**\n   * The Execute loop\n   */\n  execute() {\n    // Complete work unit cycle\n    const cyclesToRun = this.cpu.cycles + this.workUnitCycles;\n    while (this.cpu.cycles < cyclesToRun) {\n      AVR8.avrInstruction(this.cpu); // Parse the instruction\n      // Update timers\n      this.timer0.tick();\n      this.timer1.tick();\n      this.timer2.tick();\n      this.usart.tick();\n      // For handling microsecond events\n      for (const event of this.events) {\n        const ms = Math.floor(((this.cpu.cycles - event.start) * 1000000) / this.frequency);\n        if (event.enable && ms !== 0 && ms % event.period === 0) {\n          this[event.port].setPin(event.pin, event.state);\n          event.state = !event.state;\n          event.start = this.cpu.cycles;\n        }\n      }\n    }\n    // Send Serial data to the arduino\n    if (((this.cpu.data[0xc0] >> 7) & 1) === 0 && this.serialBuffer.length > 0) {\n      const chr = this.serialBuffer.shift();\n      this.cpu.data[0xc6] = chr.charCodeAt(0) & 255;\n      let tmp = this.cpu.data[0xc0];\n      tmp &= ~(1 << 6);\n      tmp &= ~(1 << 5);\n      tmp |= (1 << 7);\n      this.cpu.writeData(0xc0, tmp);\n    }\n    // add task to queue\n    this.scheduler.postTask(() => this.execute());\n  }\n  /**\n   * Return Miliseconds of time span\n   * @param seconds CPU Seconds\n   */\n  getmiliS(seconds: number) {\n    const ms = Math.floor(seconds * 1000) % 1000;\n    return ms;\n  }\n  /**\n   * Returns Microsecond of timespan\n   * @param seconds CPU Seconds\n   */\n  getMicroSeconds(seconds: number) {\n    return (seconds * 1000000) % 1000000;\n  }\n  /**\n   * Delete The runner\n   */\n  delete() {\n    this.events = null;\n    this.servo = null;\n    this.listeners = null;\n    this.scheduler.stop();\n  }\n  /**\n   * Stop the scheduler\n   */\n  stop() {\n    this.scheduler.stop();\n  }\n  /**\n   * Add microsecond event\n   * @param event Micro second event\n   */\n  addMicroEvent(event: MicroEvent) {\n    return this.events.push(event) - 1;\n  }\n  /**\n   * Get the Microsecond event\n   * @param index Index of Microevent\n   */\n  getMicroEvent(index: number): MicroEvent {\n    // TODO: Check index is in range\n    return this.events[index];\n  }\n  /**\n   * Add a PWM EVENT\n   * @param port The PWM Port\n   * @param pin The PWM Pin\n   * @param callback callback to send pwm value\n   * @param isPwm isPwm or servo (if servo the callback will get angle)\n   */\n  addServo(port: string, pin: number, callback: (angle: number, prevAngle: number) => void, isPwm = false) {\n    // Add the event to the queue\n    this.servo.push({\n      pin,\n      prevAngle: -10,\n      start: 0,\n      callback,\n      isPWM: isPwm,\n      port\n    });\n\n    if (!(port in this.listeners)) {\n      this[port].addListener((value) => {\n        for (const item of this.servo) {\n          if (port !== item.port) {\n            continue;\n          }\n\n          // Logic for handling PWM\n          if (((value >> item.pin) & 1) === 1) {\n            item.start = this.cpu.cycles;\n          } else {\n            if (item.start === 0) {\n              continue;\n            }\n            const seconds = ((this.cpu.cycles - item.start) * 1000000) / this.frequency;\n            let ang = 0.0;\n            if (item.isPWM) {\n              ang = (Math.floor(seconds) - 7) / 4.048;\n              ang = Math.floor(ang);\n            } else {\n              ang = (Math.floor(seconds) - 543) / 10.316;\n              ang = Math.floor(ang);\n            }\n            if (\n              (ang + 1) !== item.prevAngle &&\n              (ang - 1) !== item.prevAngle &&\n              ang !== item.prevAngle\n            ) {\n              callback(ang, item.prevAngle);\n              item.prevAngle = ang;\n            }\n            item.start = 0;\n          }\n\n        }\n      });\n      this.listeners[port] = true;\n    }\n  }\n  /**\n   * Add serial input to the buffer\n   * @param inp Input String that needs to be sent\n   */\n  serialInput(inp: string) {\n    this.serialBuffer = inp.split('');\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/AVR8/IntelHex.ts",
    "content": "import { saveAs } from 'file-saver';\n/**\n * PART OF AVR8js (Minimal Hex Parser)\n * To Understand Proper Working visit\n * https://en.wikipedia.org/wiki/Intel_HEX\n * @param source String Hex\n * @param target Program memory\n */\nexport function parseHex(source: string, target: Uint8Array) {\n  // Split By Lines\n  // writeText(source, \"hexCode.hex\");\n  for (const line of source.split('\\n')) {\n    if (line[0] === ':' && line.substr(7, 2) === '00') {\n      const bytes = parseInt(line.substr(1, 2), 16);\n      const addr = parseInt(line.substr(3, 4), 16);\n      for (let i = 0; i < bytes; i++) {\n        target[addr + i] = parseInt(line.substr(9 + i * 2, 2), 16);\n      }\n    }\n  }\n}\n\nfunction writeText(data, filename) {\n    const blob = new Blob([data], {type: 'text/plain;charset=utf-8'});\n    saveAs(blob, filename);\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/AVR8/Scheduler.ts",
    "content": "/**\n * Type Definition of Task Callback aka Job that needs to be executed\n */\nexport type TaskCallback = () => void;\n/**\n * Faster setTimeout(fn, 0) implementation using postMessage API\n * Based on https://dbaron.org/log/20100309-faster-timeouts\n */\nexport class TaskScheduler {\n  /**\n   * Message used to check for Arduino task\n   */\n  readonly messageName = 'arduinoRocks';\n\n  /**\n   * Queue to store Task (JOB)\n   */\n  private Queue: Array<TaskCallback> = [];\n  /**\n   * Store the state of queue\n   */\n  private stopped = true;\n\n  /**\n   * Start The Scheduler\n   */\n  start() {\n    // If it is on Stop State then start\n    if (this.stopped) {\n      this.stopped = false;\n      window.addEventListener('message', this.handleMessage, true);\n    }\n  }\n  /**\n   * Stop The Scheduler\n   */\n  stop() {\n    this.stopped = true;\n    window.removeEventListener('message', this.handleMessage, true);\n  }\n  /**\n   * Add task to the Scheduler\n   * @param fn The Task that needs to complete\n   */\n  postTask(fn: TaskCallback) {\n    // if it is stop then don't add to queue\n    if (!this.stopped) {\n      this.Queue.push(fn);\n      window.postMessage(this.messageName, '*');\n    }\n  }\n  /**\n   * Message Event Listener\n   * @param event Message Event\n   */\n  private handleMessage = (event: MessageEvent) => {\n    // Only Process Arduino Task and ignore others\n    if (event.data === this.messageName) {\n      // Prevents further propagation of the current event\n      event.stopPropagation();\n      // Takes the Task (job) from queue and execute it\n      const executeJob = this.Queue.shift();\n      if (executeJob !== undefined) {\n        executeJob();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/Battery.ts",
    "content": "import { CircuitElement } from './CircuitElement';\n\n/**\n * Battery9V class\n */\nexport class Battery9v extends CircuitElement {\n  /**\n   * Battery9V constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('Battery9v', x, y, 'Battery9v.json', canvas);\n  }\n  /** init is called when the component is complety drawn to the canvas */\n  init() {\n    // console.log(this.nodes[0].label);\n    // console.log(this.nodes[1].label);\n    this.nodes[1].addValueListener((v, calledby) => {\n      // if both the terminals of battery are connected with each other\n      if (calledby.parent.id === this.id) {\n        /// TODO: Show Toast and Stop Simulation\n        console.log('Short Circuit');\n        window['showToast']('Short Circuit');\n      }\n      if (v >= 0 && this.nodes[0].value <= 0) {\n        this.nodes[0].setValue(9, this.nodes[0]);\n      }\n      if (v < 0) {\n        this.nodes[0].setValue(-1, this.nodes[0]);\n      }\n    });\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: 'Battery9v',\n      id: this.id,\n      body,\n      title: '9v Battery'\n    };\n  }\n  /**\n   * Initialize variable when start simulation is pressed\n   */\n  initSimulation(): void {\n    this.nodes[0].setValue(9, null);\n    setTimeout(() => {\n      if (this.nodes[1].value < 0) {\n        this.nodes[0].setValue(-1, null);\n      }\n    }, 10);\n  }\n  /**\n   * Called on Stop Simulation\n   */\n  closeSimulation(): void {\n  }\n}\n\n/**\n * CoinCell3V class\n */\nexport class CoinCell extends CircuitElement {\n  /**\n   * CoinCell 3V constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('CoinCell', x, y, 'CoinCell.json', canvas);\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  init() {\n    this.nodes[1].addValueListener((_, calledby, __) => {\n      if (calledby.parent.id === this.id) {\n        /// TODO: Show Toast and Stop Simulation\n        window['showToast']('Short Circuit');\n      }\n    });\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'Coin Cell'\n    };\n  }\n  /**\n   * Initialize variable when start simulation is pressed\n   */\n  initSimulation(): void {\n    this.nodes[0].setValue(3, null);\n  }\n  /**\n   * Called on stop Simulation\n   */\n  closeSimulation(): void {\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/CircuitElement.spec.ts",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/CircuitElement.ts",
    "content": "import { Point } from './Point';\nimport { Wire } from './Wire';\nimport { isNull } from 'util';\nimport { BoundingBox } from './Geometry';\nimport { UndoUtils } from './UndoUtils';\n\n/**\n * Abstract Class Circuit Elements\n * Inherited by Each Circuit Component\n */\nexport abstract class CircuitElement {\n  /**\n   * Circuit Component Name\n   */\n  public keyName: string;\n  /**\n   * Stores the id of the Component\n   */\n  public id: number;\n  /**\n   * Stores the Nodes of a Component\n   */\n  public nodes: Point[] = [];\n  /**\n   * Raphael Set of elements\n   */\n  public elements: any;\n  /**\n   * Translation X\n   */\n  public tx = 0;\n  /**\n   * Translation Y\n   */\n  public ty = 0;\n  /**\n   * Title of the component\n   */\n  public title: string;\n  /**\n   * Store Values That are required during simulation\n   */\n  public simulationData: any = {};\n  /**\n   * Store Values that are additionaly require by class\n   */\n  public data: any = {};\n  /**\n   * Stores Information regarding a component\n   */\n  public info: any;\n  /**\n   * The Half Size of the Circuit Node\n   */\n  public pointHalf: number;\n  /**\n   * Node ID\n   */\n  public nid = 0;\n  /**\n   * Constructor For Circuit Element Class (Parent of every component)\n   * @param keyName KeyName For a Component required for mapping class to string\n   * @param x X position of component\n   * @param y Y Position Of component\n   * @param filename Json Data filename\n   * @param canvas Raphael Canvas\n   */\n  constructor(keyName: string, public x: number, public y: number, filename: string = '', canvas: any = null) {\n    this.id = Date.now(); // Generate New id\n    this.keyName = keyName; // Set key name\n    // Create Raphael Set\n    this.elements = window['canvas'].set();\n\n    // if filename is present fetch the file\n    if (filename) {\n\n      fetch(`./assets/jsons/${filename}`)\n        .then(v => v.json())\n        .then(obj => {\n          // get the title\n          this.title = obj.name;\n\n          this.pointHalf = obj.pointHalf;\n          // Draw Elements of the component\n\n          this.DrawElement(canvas, obj.draw);\n          // Add Circuiy Nodes\n          this.DrawNodes(canvas, obj.pins, obj.pointHalf);\n          // Add info and data\n          this.info = obj.info;\n          this.data = obj.data;\n          // Add a Drag listener\n          this.setDragListeners();\n          // Add a Click Listener\n          this.setClickListener(null);\n          // Add Hover Listener\n          this.setHoverListener();\n          // Translate the elements to the tranformation\n          this.elements.transform(`t${this.tx},${this.ty}`);\n          // Move the node according to the translatiom\n          for (const node of this.nodes) {\n            node.relativeMove(this.tx, this.ty);\n          }\n          // Decrease the Queue\n          window['queue'] -= 1;\n          // Call the init method\n          this.init();\n        })\n        .catch(err => {\n          console.error(err);\n          window['showToast']('Failed to load');\n          // TODO: Delete the Component\n        });\n    }\n  }\n\n  /**\n   * Returns bounding box of the circuit element\n   */\n  getBoundingBox(): BoundingBox {\n    return BoundingBox.loadFromRaphaelBbox(this.elements.getBBox());\n  }\n\n  /**\n   * Draws circuit nodes\n   * @param canvas Raphael Canvas\n   * @param pinData Pin Position and name\n   * @param pointHalf The Half size of circuit node\n   */\n  DrawNodes(canvas: any, pinData: any, pointHalf: number) {\n    for (const pin of pinData) {\n      this.nodes.push(\n        new Point(\n          canvas,\n          this.x + pin.x,\n          this.y + pin.y,\n          pin.name,\n          pointHalf,\n          this\n        )\n      );\n    }\n  }\n  /**\n   * Draw Elements inside an component\n   * @param canvas Raphael Canvas\n   * @param drawData Draw Data\n   */\n  DrawElement(canvas: any, drawData: any) {\n    const elementsDrawn = [];\n    for (const item of drawData) {\n      let element;\n      // Draw image\n      if (item.type === 'image') {\n        element = canvas.image(\n          item.url,\n          this.x + item.x,\n          this.y + item.y,\n          item.width,\n          item.height\n        );\n      } else if (item.type === 'path') {\n        element = this.DrawPath(canvas, item);\n      } else if (item.type === 'rectangle') {\n        // Draw rectangle\n        element = canvas.rect(\n          this.x + item.x,\n          this.y + item.y,\n          item.width,\n          item.height,\n          item.radius || 0\n        ).attr({\n          fill: item.fill || 'none',\n          stroke: item.stroke || 'none'\n        });\n      } else if (item.type === 'circle') {\n        // Draw a circle\n        element = canvas.circle(\n          this.x + item.x,\n          this.y + item.y,\n          item.radius,\n        ).attr({\n          fill: item.fill || 'none',\n          stroke: item.stroke || 'none'\n        });\n      } else if (item.type === 'polygon') {\n        element = this.DrawPolygon(canvas, item);\n      }\n      this.elements.push(element);\n      elementsDrawn.push(element);\n    }\n    return elementsDrawn;\n  }\n  /**\n   * Draws an Polygon\n   * @param canvas Raphael Paper(Canvas)\n   * @param item Polygon points in a 2d array format\n   */\n  DrawPolygon(canvas: any, item: any) {\n    if (item.points.length <= 1) {\n      return;\n    }\n    const points = item.points;\n    let tmp = 'M';\n    for (const point of points) {\n      tmp += `${this.x + point[0]},${this.y + point[1]}L`;\n    }\n    tmp = tmp.substr(0, tmp.length - 1) + 'z';\n    return canvas.path(tmp)\n      .attr({\n        fill: item.fill || 'none',\n        stroke: item.stroke || 'none'\n      });\n  }\n  /**\n   * Draw a Path\n   * @param canvas Raphael Paper (Canvas)\n   * @param item Path Data\n   */\n  DrawPath(canvas: any, item: any) {\n    // Regex used to parse the path data\n    const lines = /L[\\-]?\\d+(\\.\\d*)?\\,[\\-]?\\d+(\\.\\d*)?/g; // L a,b\n    const start = /M[\\-]?\\d+(\\.\\d*)?\\,[\\-]?\\d+(\\.\\d*)?/g; // M a,b\n    const curves = /C([\\-]?\\d+(\\.\\d*)?\\,){5}[\\-]?\\d+(\\.\\d*)?/g;\n    const horizontal = /H[\\-]?\\d+(\\.\\d*)?/g; // H a\n    const vertical = /V[\\-]?\\d+(\\.\\d*)?/g; // V b\n    const sCurve = /S([\\-]?\\d+(\\.\\d*)?\\,){3}[\\-]?\\d+(\\.\\d*)?/g;\n    let str: string = item.value;\n\n    str = this.calcRelative(str, start, canvas);\n    str = this.calcRelative(str, lines, canvas);\n    str = this.calcRelative(str, curves, canvas);\n    str = this.calcRelative(str, horizontal, canvas);\n    str = this.calcRelative(str, vertical, canvas);\n    str = this.calcRelative(str, sCurve, canvas);\n    return canvas.path(str)\n      .attr({\n        fill: item.fill || 'none',\n        stroke: item.stroke || 'none'\n      });\n  }\n  /**\n   * Draw path relative to the component\n   * @param input Path Data\n   * @param pattern The regex pattern\n   * @param canvas Raphael Paper\n   */\n  calcRelative(input: string, pattern: RegExp, canvas: any) {\n    const founds = input.match(pattern);\n    if (founds) {\n      for (const found of founds) {\n        let output = '';\n        const start = found.charAt(0);\n        let tmp: any = found.substring(1).split(',');\n        tmp = tmp.map(v => parseFloat(v));\n        if (start === 'M' || start === 'L') {\n          output += `${start}${this.x + tmp[0]},${this.y + tmp[1]}`;\n        } else if (start === 'V') {\n          output += `${start}${this.y + tmp[0]}`;\n        } else if (start === 'H') {\n          output += `${start}${this.x + tmp[0]}`;\n        } else if (start === 'C') {\n          output += `${start}${this.x + tmp[0]},`;\n          output += `${this.y + tmp[1]},`;\n          output += `${this.x + tmp[2]},`;\n          output += `${this.y + tmp[3]},`;\n          output += `${this.x + tmp[4]},`;\n          output += `${this.y + tmp[5]}`;\n        } else if (start === 'S') {\n          output += `${start}${this.x + tmp[0]},`;\n          output += `${this.y + tmp[1]},`;\n          output += `${this.x + tmp[2]},`;\n          output += `${this.y + tmp[3]},`;\n        }\n        input = input.replace(found, output);\n      }\n    }\n    return input;\n  }\n  /**\n   * Add Drag listener to the components\n   */\n  setDragListeners() {\n\n    let fdx = 0;\n    let fdy = 0;\n    let tmpar = [];\n    this.elements.drag((dx, dy) => {\n\n      this.elements.transform(`t${this.tx + dx},${this.ty + dy}`);\n      // tmpx = this.tx + dx;\n      // tmpy = this.ty + dy;\n      fdx = dx;\n      fdy = dy;\n      for (let i = 0; i < this.nodes.length; ++i) {\n        this.nodes[i].move(tmpar[i][0] + dx, tmpar[i][1] + dy);\n      }\n      window['onDragEvent'](this);\n    }, () => {\n      fdx = 0;\n      fdy = 0;\n      tmpar = [];\n      for (const node of this.nodes) {\n        // node.remainHidden();\n        tmpar.push(\n          [node.x, node.y]\n        );\n      }\n    }, () => {\n      // for (const node of this.nodes) {\n      //   node.relativeMove(fdx, fdy);\n      //   node.remainShow();\n      // }\n\n      // Push dump to Undo stack & Reset\n      UndoUtils.pushChangeToUndoAndReset({ keyName: this.keyName, element: this.save(), event: 'drag', dragJson: { dx: fdx, dy: fdy } });\n      this.tx += fdx;\n      this.ty += fdy;\n      window['onDragStopEvent'](this);\n    });\n  }\n  /**\n   * Add Hover Listener\n   */\n  setHoverListener() {\n    // this.elements.mouseover(() => {\n    //   for (const node of this.nodes) {\n    //     // node.show();\n    //   }\n    // });\n    // this.elements.mouseout(() => {\n    //   for (const node of this.nodes) {\n    //     // node.hide();\n    //   }\n    // });\n  }\n  /**\n   * Add a Click listenert to component and show properties on click\n   * @param callback On Click Callback\n   */\n  setClickListener(callback: () => void) {\n    this.elements.mousedown(() => {\n      if (window['Selected'] && (window['Selected'] instanceof Wire)) {\n        if ((isNull(window['Selected'].start) || isNull(window['Selected'].end))) {\n          return;\n        }\n        window['Selected'].deselect();\n      }\n      window['isSelected'] = true;\n      window['Selected'] = this;\n      window['showProperty'](() => this.properties());\n      if (callback) {\n        callback();\n      }\n    });\n  }\n  /**\n   * Initialize Variable after inheriting this function\n   */\n  init() { }\n\n  /**\n   * Save Circuit Component\n   */\n  save(): any {\n    const data = this.SaveData();\n    const ret = {\n      x: this.x,\n      y: this.y,\n      tx: this.tx,\n      ty: this.ty,\n      id: this.id\n    };\n    if (data) {\n      ret['data'] = data;\n    }\n    return ret;\n  }\n  /**\n   * The Additional data that needs to be saved inside database.\n   * After Inheriting return the Data Object\n   */\n  SaveData() {\n    return null;\n  }\n  /**\n   * Load Circuit Component\n   */\n  load(data: any): void {\n\n    for (const i in window['DragListeners']) {\n      if (window['DragListeners'].hasOwnProperty(i)) {\n        const itrFn = window['DragListeners'][i];\n        if (itrFn.id === this.id) {\n          window['DragListeners'][i].id = data.id;\n        }\n      }\n    }\n    for (const i in window['DragStopListeners']) {\n      if (window['DragStopListeners'].hasOwnProperty(i)) {\n        const itrFn = window['DragStopListeners'][i];\n        if (itrFn.id === this.id) {\n          window['DragStopListeners'][i].id = data.id;\n        }\n      }\n    }\n\n    this.id = data.id;\n    this.tx = data.tx;\n    this.ty = data.ty;\n    this.LoadData(data);\n  }\n  /**\n   * The additional data which is stored in database needs to be load.\n   * Inherit this function for loading additional data.\n   * @param data Data from Database\n   */\n  LoadData(data: any) { }\n  /**\n   * Returns the Circuit Node based on the x,y Position\n   */\n  getNode(x: number, y: number, id: number = null): Point {\n    for (const node of this.nodes) {\n      if (\n        (Math.floor(node.x + this.pointHalf) === Math.floor(x) &&\n          Math.floor(node.y + this.pointHalf) === Math.floor(y))\n        ||\n        node.id === id\n      ) {\n        return node;\n      }\n    }\n    return null;\n  }\n  /**\n   * Removes Component from Canvas and memory\n   */\n  remove(): void {\n    this.elements.remove();\n    for (const n of this.nodes) {\n      n.remove();\n    }\n    this.delete();\n  }\n  /**\n   * Inherit this function to remove some variable\n   */\n  delete() { }\n  /**\n   * Return the Name of the component.Can be inheriter to return custom name.\n   */\n  getName() { return this.title; }\n  /**\n   * Function to move/transform an element\n   * @param fdx relative x position to move\n   * @param fdy relative y position to move\n   */\n  getNodesCoord(): number[] {\n    const tmpar = [];\n    for (const node of this.nodes) {\n      tmpar.push(\n        [node.x, node.y]\n      );\n    }\n    return tmpar;\n  }\n  dragAlong(tmpar: any, fdx: number, fdy: number): any {\n    this.elements.transform(`t${this.tx + fdx},${this.ty + fdy}`);\n    for (const node of this.nodes) {\n      tmpar.push(\n        [node.x, node.y]\n      );\n    }\n    for (let i = 0; i < this.nodes.length; ++i) {\n      this.nodes[i].move(tmpar[i][0] + fdx, tmpar[i][1] + fdy);\n    }\n  }\n  dragAlongStop(x: number, y: number): void {\n    this.tx = x;\n    this.ty = y;\n  }\n\n\n  /**\n   * Function to move/transform an element\n   * @param fdx relative x position to move\n   * @param fdy relative y position to move\n   */\n  transformPosition(fdx: number, fdy: number): void {\n    const tmpar = [];\n    this.elements.transform(`t${this.tx + fdx},${this.ty + fdy}`);\n\n    for (const node of this.nodes) {\n      tmpar.push(\n        [node.x, node.y]\n      );\n    }\n    for (let i = 0; i < this.nodes.length; ++i) {\n      this.nodes[i].move(tmpar[i][0] + fdx, tmpar[i][1] + fdy);\n    }\n    this.tx += fdx;\n    this.ty += fdy;\n  }\n\n  /**\n   * Return the Property of the Circuit Component\n   * @returns Object containing component name,id and the html required to be shown on property box\n   */\n  abstract properties(): { keyName: string, id: number, body: HTMLElement, title: string };\n  /**\n   * Initialize variable required for simulation\n   * Called before simulation\n   */\n  abstract initSimulation(): void;\n  /**\n   * Called when Stop Simulation\n   */\n  abstract closeSimulation(): void;\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/ConvertJSONFormat.ts",
    "content": "import { ImageToByteArray } from './ImageToByteArray';\n\nexport class ConvertJSONFormat {\n  /**\n   * Converts JSON of cloud-stored circuit into JSON format for storing it temporarily\n   * @param id Project Id\n   * @param data JSON data of the circuit\n   * @returns JSON data of the circuit with format for saving it temporarily\n   */\n  static async convertToOfflineFormat(id, data) {\n    const obj = JSON.parse(data.data_dump);\n    const project = {\n      name: data.name,\n      description: data.description,\n      image: data.base64_image,\n      created_at: Date.now(),\n    };\n    obj['id'] = id;\n    obj['project'] = project;\n\n    // Correction required for the following two lines of code\n    // Image data is recieved after the image gets loaded which is async code\n    // In short, for now this function will not return image data but its url.\n    ImageToByteArray.getDataURLForm(project.image);\n    obj.project.image = ImageToByteArray.result !== '' ? ImageToByteArray.result : project.image;\n    return obj;\n  }\n\n  /**\n   * Converts JSON of temporarily saved circuit to JSON format on Cloud\n   * @param data JSON data of the circuit\n   * @returns JSON data of the circuit with format for saving it on cloud\n   */\n  static convertToOnlineFormat(data) {\n    const obj = {\n      data_dump: '',\n      is_arduino: true,\n      description: data.project.description,\n      name: data.project.name,\n      base64_image: data.project.image,\n      branch: 'master',\n      version: this.getRandomString(20)\n    };\n    // Remove unwanted props from JSON\n    delete data['id'];\n    delete data['project'];\n    // Data Dump will contain Circuit data\n    const dataDump = data;\n    // Convert Data Dump to an String and add to Save Object\n    obj.data_dump = JSON.stringify(dataDump);\n    return obj;\n  }\n\n  /**\n   * Generate and return a random string\n   * @param length Length of random string\n   * @returns random string\n   */\n  static getRandomString(length): string {\n    let result = '';\n    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n    const charactersLength = characters.length;\n    for (let i = 0; i < length; i++) {\n      result += characters.charAt(Math.floor(Math.random() *\n        charactersLength));\n    }\n    return result;\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/Download.ts",
    "content": "// Declare an Enumeration For Image Type\nexport enum ImageType { PNG, JPG, SVG }\n/**\n * Canvg used For Rendering SVG\n */\ndeclare var canvg;\n/**\n * Download Class\n */\nexport class Download {\n  /**\n   * Downloads Image From Base64 Data\n   * @param data Base64 Image Data\n   * @param filename Filename For Download\n   * @param type Type of the image\n   */\n  static DownloadImage(data: any, filename: string, type: ImageType) {\n    const evt = new MouseEvent('click', {\n      view: window,\n      bubbles: false,\n      cancelable: true\n    });\n    const a = document.createElement('a');\n    const ext = (type === ImageType.PNG) ? 'png' : 'jpg';\n    a.setAttribute('download', `${filename}.${ext}`);\n    a.setAttribute('href', data);\n    a.setAttribute('target', '_blank');\n    a.dispatchEvent(evt);\n  }\n  /**\n   * Download Text File\n   * @param filename Filename of the download\n   * @param data Data inside the download\n   * @param options Extra Options for mime\n   */\n  static DownloadText(filename: string, data: any[], options: any) {\n    const blob = new Blob(data, options);\n    const evt = new MouseEvent('click', {\n      view: window,\n      bubbles: false,\n      cancelable: true\n    });\n    const a = document.createElement('a');\n    a.setAttribute('download', `${filename}`);\n    a.href = URL.createObjectURL(blob);\n    a.target = '_blank';\n    a.setAttribute('target', '_blank');\n    a.dispatchEvent(evt);\n  }\n  /**\n   * Asynchronous Function for Export Image to a Base64 Format.\n   * @param type Type of the Image\n   */\n  static async ExportImage(type: ImageType) {\n    // Get SVG from Workspace an Clone it\n    const svg = (document.querySelector('#holder > svg').cloneNode(true) as SVGSVGElement);\n    svg.getElementsByTagName('g')[0].removeAttribute('transform'); // Remove any transformation\n\n    // Extract all image from svg\n    const images = (svg.getElementsByTagName('image') as any);\n    for (const image of images) {\n      // Fetch each image and convert image into base64\n      let data = await fetch(image.getAttribute('href'))\n        .then((v) => {\n          return v.text();\n        });\n      data = (data.replace('<svg ', `<svg width=\"${image.getAttribute('width')}\" height=\"${image.getAttribute('height')}\" `));\n      image.setAttribute(\n        'href',\n        'data:image/svg+xml;base64,' + window.btoa(data)\n      );\n    }\n    // Return a new Promise\n    return new Promise((res, _) => {\n      // Get the client pixel ratio\n      const pixelRatio = 1.25;\n      // get The Bounding box of the circuit\n      const gtag = (document.querySelector('#holder > svg > g') as SVGSVGElement).getBBox();\n      if (gtag.width === 0 || gtag.height === 0) {\n        gtag.width = 100;\n        gtag.height = 100;\n      }\n      // Add transformation to the g tag\n      svg.getElementsByTagName('g')[0].setAttribute('transform', `scale(1,1)translate(${-gtag.x + 10},${-gtag.y + 10})`);\n      // if type is svg then return new svg\n      if (type === ImageType.SVG) {\n        res(svg.outerHTML);\n        return;\n      }\n      // if type is not svg then render svg using canvg\n      const canvas = document.createElement('canvas');\n      // set canvas width and height\n      canvas.width = (gtag.width + gtag.x + 20) * pixelRatio;\n      canvas.height = (gtag.height + gtag.y + 20) * pixelRatio;\n      canvas.style.width = canvas.width + 'px';\n      canvas.style.height = canvas.width + 'px';\n      // change the width and height of svg\n      svg.setAttribute('width', '' + canvas.width);\n      svg.setAttribute('height', '' + canvas.height);\n\n      // Get Canvas Context\n      const ctx = (canvas.getContext('2d') as any);\n      // enable smoothing\n      ctx.mozImageSmoothingEnabled = true;\n      ctx.webkitImageSmoothingEnabled = true;\n      ctx.msImageSmoothingEnabled = true;\n      ctx.imageSmoothingEnabled = true;\n      // Apply tranformation\n      ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n      // render for modified svg\n      const v = canvg.Canvg.fromString(ctx, svg.outerHTML);\n      v.render().then(() => {\n        let image;\n        if (type === ImageType.JPG) {\n          // if type is jpg remove the black background\n          const imgdata = ctx.getImageData(0, 0, canvas.width, canvas.height);\n          for (let i = 0; i < imgdata.data.length; i += 4) {\n            if (imgdata.data[i + 3] === 0) {\n              imgdata.data[i] = 255;\n              imgdata.data[i + 1] = 255;\n              imgdata.data[i + 2] = 255;\n              imgdata.data[i + 3] = 255;\n            }\n          }\n          // Add Image to canvas\n          ctx.putImageData(imgdata, 0, 0);\n          image = canvas.toDataURL('image/jpeg');\n        } else {\n          // Get The base64\n          if (type === ImageType.PNG) {\n            image = canvas.toDataURL('image/png');\n          }\n        }\n        res(image);\n      });\n    });\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/General.ts",
    "content": "import { CircuitElement } from './CircuitElement';\nimport { Point } from './Point';\nimport { areBoundingBoxesIntersecting } from './RaphaelUtils';\nimport _ from 'lodash';\nimport { Wire } from './Wire';\nimport { UndoUtils } from './UndoUtils';\n\n/**\n * Declare window so that custom created function don't throw error\n */\ndeclare var window;\n\n/**\n * Node tuple class to store breadboard node and element node which are in proximity\n */\nclass BreadboardProximityNodeTuple {\n  breadboardNode: Point;\n  elementNode: Point;\n\n  constructor(breadboardNode: Point, elementNode: Point) {\n    this.breadboardNode = breadboardNode;\n    this.elementNode = elementNode;\n  }\n}\n\n/**\n * Resistor Class\n */\nexport class Resistor extends CircuitElement {\n  /**\n   * color table(hex values) of resistor\n   */\n  static colorTable: string[] = [];\n  /**\n   * tolerance color mapping values of resistor\n   */\n  static tolColorMap: number[] = [];\n  /**\n   * tolerance value of resistor\n   */\n  static toleranceValues: string[] = [];\n  /**\n   * unit labels of resistor\n   */\n  static unitLabels: string[] = [];\n  /**\n   * unit values of resistor\n   */\n  static unitValues: number[] = [];\n  /**\n   * Resistance value of the resistor.\n   */\n  value: number;\n  /**\n   * Tolerance index of the resistor.\n   */\n  toleranceIndex: number;\n  /**\n   * Resistor constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('Resistor', x, y, 'Resistor.json', canvas);\n  }\n  /** init is called when the component is completely drawn to the canvas */\n  init() {\n    if (Resistor.colorTable.length === 0) {\n      Resistor.colorTable = this.data.colorTable;\n      Resistor.toleranceValues = this.data.toleranceValues;\n      Resistor.tolColorMap = this.data.tolColorMap;\n      Resistor.unitLabels = this.data.unitLabels;\n      Resistor.unitValues = this.data.unitValues;\n    }\n    this.value = this.data.initial;\n    this.toleranceIndex = this.data.initialToleranceIndex;\n    this.updateColors();\n    delete this.data;\n    this.data = null;\n\n    this.nodes[0].addValueListener((v, cby, par) => {\n      if (cby.parent.id !== this.id) {\n        this.nodes[1].setValue(v, this.nodes[0]);\n      }\n    });\n    this.nodes[1].addValueListener((v, cby, par) => {\n      if (cby.parent.id !== this.id) {\n        this.nodes[0].setValue(v, this.nodes[1]);\n      }\n    });\n  }\n  /** Saves data/values that are provided to resistor  */\n  SaveData() {\n    return {\n      value: this.value,\n      tolerance: this.toleranceIndex\n    };\n  }\n  /**\n   * function loads the SaveData()\n   * @param data save object\n   */\n  LoadData(data: any) {\n    this.value = data.data.value;\n    this.toleranceIndex = data.data.tolerance;\n  }\n  /**\n   * Updates Resistor Properties\n   */\n  updateColors() {\n    const cur = this.getValue();\n    this.elements[1].attr({\n      fill: Resistor.colorTable[cur.third]\n    }); // Third\n    this.elements[2].attr({\n      fill: Resistor.colorTable[cur.second]\n    }); // Second\n    this.elements[3].attr({\n      fill: Resistor.colorTable[cur.first]\n    }); // First\n    this.elements[5].attr({\n      fill: Resistor.colorTable[cur.multiplier]\n    }); // multiplier\n    this.elements[4].attr({\n      fill: Resistor.colorTable[this.toleranceIndex]\n    }); // Tolerance\n  }\n  /** Function gets Resistence value */\n  getValue() {\n    const l = `${this.value}`.length;\n    const tmp = `${this.value}`;\n    if (l < 2) {\n      return {\n        multiplier: 11,\n        first: this.value,\n        second: 0,\n        third: 0\n      };\n    } else if (l < 3) {\n      return {\n        multiplier: 10,\n        first: +tmp.charAt(0),\n        second: +tmp.charAt(1),\n        third: 0,\n      };\n    }\n    return {\n      multiplier: l - 3,\n      first: +tmp.charAt(0),\n      second: +tmp.charAt(1),\n      third: +tmp.charAt(2),\n    };\n  }\n  /** Power values for unitvalues 1K ohm => 10^3 */\n  private getPower(index: number) {\n    if (index >= 0 && index <= Resistor.unitValues.length) {\n      return Resistor.unitValues[index];\n    }\n    return 0;\n  }\n  /**\n   * Calculate the resistance based on the user input.\n   * @param value The Input resistance\n   * @param unitIndex The selected unit index\n   */\n  update(value: string, unitIndex: number) {\n    const val = parseFloat(value);\n    const p = this.getPower(unitIndex);\n    const tmp = parseInt((val * p).toFixed(0), 10);\n    if (value.length > 12 || isNaN(tmp) || tmp === Infinity || tmp < 1.0 || `${tmp}`.length > 12) {\n      window['showToast']('Resistance Not possible');\n      return;\n    } else {\n      this.value = tmp;\n      this.updateColors();\n    }\n  }\n  /** Function returns resistence values 10K ohm => 10 */\n  getInputValues() {\n    const val = this.value;\n    let tmp = val;\n    for (let i = 0; i < Resistor.unitValues.length; ++i) {\n      tmp = Math.floor(val / Resistor.unitValues[i]);\n      if (tmp > 0) {\n        continue;\n      } else {\n        return {\n          index: i - 1,\n          val: val / Resistor.unitValues[i - 1]\n        };\n      }\n    }\n    return {\n      index: Resistor.unitValues.length - 1,\n      val: this.value / Resistor.unitValues[\n        Resistor.unitLabels.length - 1\n      ]\n    };\n  }\n  /** Function returns the resistor with resistence */\n  getName() {\n    const cur = this.getInputValues();\n    return `Resistor ${cur.val}${Resistor.unitLabels[cur.index]}`;\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    let tmp;\n    const cur = this.getInputValues();\n    const body = document.createElement('div');\n    const inp = document.createElement('input');\n    inp.type = 'number';\n    inp.value = `${cur.val}`;\n    inp.min = '1';\n    inp.addEventListener('wheel', (event) => {\n      event.preventDefault();\n    });\n\n    const unit = document.createElement('select');\n    tmp = '';\n    for (const ohm of Resistor.unitLabels) {\n      tmp += `<option>${ohm} &#8486;</option>`;\n    }\n    unit.innerHTML = tmp;\n    unit.selectedIndex = cur.index;\n\n    const tole = document.createElement('select');\n    tmp = '';\n    for (const t of Resistor.toleranceValues) {\n      tmp += `<option>&#177; ${t}%</option>`;\n    }\n    tole.innerHTML = tmp;\n\n    unit.onchange = () => this.update(inp.value, unit.selectedIndex);\n    inp.onkeyup = () => this.update(inp.value, unit.selectedIndex);\n    inp.onchange = () => this.update(inp.value, unit.selectedIndex);\n    tole.onchange = () => {\n      this.toleranceIndex = Resistor.tolColorMap[tole.selectedIndex];\n      this.updateColors();\n    };\n\n    const lab = document.createElement('label');\n    lab.innerText = 'Resistance';\n    body.append(lab);\n    body.append(inp);\n    body.append(unit);\n    const lab2 = document.createElement('label');\n    lab2.innerText = 'Tolerance';\n    body.append(lab2);\n    body.append(tole);\n\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      title: 'Resistor',\n      body\n    };\n  }\n  /**\n   * Called by the start simulation.\n   */\n  initSimulation(): void {\n  }\n  /**\n   * Called by the stop simulation.\n   */\n  closeSimulation(): void {\n  }\n\n  /**\n   * Get resistance value of resistor\n   */\n  getResistance() {\n    return this.value;\n  }\n  /**\n   * Get ID of the resistor\n   * TODO: Add this function inside CircuitElements.ts instead\n   */\n  getID() {\n    return this.id;\n  }\n}\n\n/**\n * Breadboard Class\n */\nexport class BreadBoard extends CircuitElement {\n  /**\n   * Minimum distance of node to be classified as in proximity\n   */\n  static PROXIMITY_DISTANCE = 20;\n\n  /**\n   * Set to keep track of visited nodes\n   */\n  static visitedNodesv2 = new Set();\n\n  /**\n   * Stores group of points which are interconnected\n   */\n  static groupings: any = [];\n\n  /**\n   * Nodes that are connected\n   */\n  public joined: Point[] = [];\n\n  /**\n   * List to store current nodes in the proximity of any of the breadboard' node\n   */\n  public highlightedPoints: BreadboardProximityNodeTuple[] = [];\n\n  /**\n   * Nodes sorted by 'x' and 'y' position\n   */\n  public sortedNodes: Point[] = [];\n\n  /**\n   * Cached list of nodes that are soldered\n   */\n  private solderedNodes: Point[] = null;\n\n  /**\n   * Map of x and nodes with x-coordinates as x\n   */\n  public sameXNodes: { [key: string]: Point[] } = {};\n\n  /**\n   * Map of y and nodes with y-coordinates as y\n   */\n  public sameYNodes: { [key: string]: Point[] } = {};\n\n\n  /**\n   * Breadboard constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('BreadBoard', x, y, 'Breadboard.json', canvas);\n    this.subsribeToDrag({ id: this.id, fn: this.onOtherComponentDrag.bind(this) });\n    this.subscribeToDragStop({ id: this.id, fn: this.onOtherComponentDragStop.bind(this) });\n  }\n\n  /**\n   * Returns node connected to arduino\n   * @param node node to start search on\n   * @param startedOn label of node search started on\n   * @returns Arduino connected Node\n   */\n  static getRecArduinov2(node: Point, startedOn: string) {\n    try {\n      if (node.connectedTo.start.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to start node\n        return node.connectedTo.start;\n      } else if (node.connectedTo.end.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to end node\n        return node.connectedTo.end;\n      } else if (node.connectedTo.start.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.start.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.end.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'Battery9v' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to 9V Battery\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'CoinCell' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to Coin Cell\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'RelayModule') {\n        // TODO: Handle RelayModule\n        if (startedOn === 'POSITIVE') {\n          // If search was started on Positive node then return connected node of VCC in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[3], startedOn);\n        } else if (startedOn === 'NEGATIVE') {\n          // If search was started on Negative node then return connected node of GND in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[5], startedOn);\n        }\n      } else {\n        // TODO: If nothing matches\n        // IF/ELSE: Determine if start is to be used OR end for further recursion\n        if (node.connectedTo.end.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.end.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.end.parent.nodes[e].gid !== node.connectedTo.end.gid\n              && !this.visitedNodesv2.has(node.connectedTo.end.parent.nodes[e].gid) && node.connectedTo.end.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.end.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.end.parent.nodes[e], startedOn);\n            }\n          }\n        } else if (node.connectedTo.start.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.start.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.start.parent.nodes[e].gid !== node.connectedTo.start.gid\n              && !this.visitedNodesv2.has(node.connectedTo.start.parent.nodes[e].gid)\n              && node.connectedTo.start.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.start.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.start.parent.nodes[e], startedOn);\n            }\n          }\n        }\n\n      }\n    } catch (e) {\n      console.warn(e);\n      return false;\n    }\n\n  }\n\n  /**\n   * Recursive Function to handle BreadBoard\n   * @param node Node which is to be checked for BreadBoard\n   */\n  static getRecArduinoBreadv2(node: Point, startedOn: string) {\n    // IF/ELSE: Determine if start is to be used OR end for further recursion\n    if (node.connectedTo.end.gid !== node.gid) {\n      const bb = (node.connectedTo.end.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.end.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.end.label.substring(1, node.connectedTo.end.label.length)) {\n            const ascii = node.connectedTo.end.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    } else if (node.connectedTo.start.gid !== node.gid) {\n      const bb = (node.connectedTo.start.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.start.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.start.label.substring(1, node.connectedTo.start.label.length)) {\n            const ascii = node.connectedTo.start.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    }\n\n  }\n\n  /**\n   * Subscribes to drag listener of the workspace\n   * @param fn listener functino\n   */\n  subsribeToDrag(fn) {\n    // copied the function from Workspace here to avoid circular dependency. TODO: resolve file dependencies\n    window['DragListeners'].push(fn);\n  }\n\n  /**\n   * Subscribes to drag stop listener of the workspace\n   * @param fn listener function\n   */\n  subscribeToDragStop(fn) {\n    window['DragStopListeners'].push(fn);\n  }\n\n  /**\n   * Resets highlighted points\n   */\n  resetHighlightedPoints() {\n    if (this.highlightedPoints.length > 0) {\n      this.highlightedPoints.forEach(nodeTuple => nodeTuple.breadboardNode.undoHighlight());\n      this.highlightedPoints = [];\n    }\n  }\n\n  /**\n   * Returns list of soldered elements on the breadboard\n   */\n  getSolderedElements() {\n    return this.getSolderedNodes().map(node => node.connectedTo);\n  }\n\n  /**\n   * Unsolders element from the breadboard if soldered\n   * @param element element to find and unsolder\n   */\n  private maybeUnsolderElement(element) {\n    const elementNodesWires = element.nodes.map(node => node.connectedTo);\n    const solderedNodes = [...this.getSolderedNodes()];\n    for (const breadboardNode of solderedNodes) {\n      if (elementNodesWires.includes(breadboardNode.connectedTo)) {\n        breadboardNode.unsolderWire();\n        _.remove(this.solderedNodes, node => node === breadboardNode);\n      }\n    }\n  }\n\n  /**\n   * Listens for drag of other circuit elements in the workspace\n   */\n  onOtherComponentDrag(element) {\n    const bBox = this.elements.getBBox();\n    const elementBBox = element.elements.getBBox();\n    // Disable Node Bubble on hover\n    Point.showBubbleBool = false;\n    this.resetHighlightedPoints();\n\n    if (!areBoundingBoxesIntersecting(bBox, elementBBox)) {\n      return;\n    }\n    // unsolder element if it's soldered to either of the breadboard's node\n    this.maybeUnsolderElement(element);\n\n    // for all the nodes of the elements, find the nodes in proximity to the nodes of the breadboard\n    // and add them to this.highlightedPoints\n    for (const node of element.nodes) {\n      if (node.isConnected()) {\n        continue;\n      }\n      const nearestNode = this.getNearestNodes(node.x, node.y);\n      if (nearestNode) {\n        this.highlightedPoints.push(new BreadboardProximityNodeTuple(nearestNode, node));\n      }\n    }\n\n    // highlight points stored in highlightedPoints\n    for (const node of this.highlightedPoints) {\n      node.breadboardNode.highlight();\n    }\n  }\n\n  /**\n   * Listener to handle when dragging of a component stops\n   */\n  onOtherComponentDragStop() {\n    // Enable Node Bubble on hover\n    Point.showBubbleBool = true;\n    // if no highlighted points when the dragging stops, return\n    if (this.highlightedPoints.length === 0) {\n      return;\n    }\n\n    // connect highlightedPoints\n    for (const nodeTuple of this.highlightedPoints) {\n      const wire = nodeTuple.breadboardNode.solderWire();\n      wire.addPoint(nodeTuple.elementNode.x, nodeTuple.elementNode.y);\n      // wire.connect(nodeTuple.elementNode, true);\n      nodeTuple.elementNode.connectWire(wire, false);\n      this.addSolderedNode(nodeTuple.breadboardNode);\n    }\n\n    this.resetHighlightedPoints();\n  }\n\n  /** init is called when the component is complety drawn to the canvas */\n  init() {\n    this.sortedNodes = _.sortBy(this.nodes, ['x', 'y']);\n\n    if (BreadBoard.groupings.length === 0) {\n      BreadBoard.groupings = this.data.groupings;\n    }\n\n    // initialise sameX and sameY node sets\n    for (const node of this.nodes) {\n      // create the set for x\n      this.sameXNodes[node.x] = this.sameXNodes[node.x] || [];\n      this.sameXNodes[node.x].push(node);\n\n      // Create the set for y\n      this.sameYNodes[node.y] = this.sameYNodes[node.y] || [];\n      this.sameYNodes[node.y].push(node);\n    }\n\n    // add a connect callback listener\n    for (const node of this.nodes) {\n      node.connectCallback = (item) => {\n        this.joined.push(item);\n      };\n      node.disconnectCallback = (item) => {\n        const index = this.joined.indexOf(item);\n        if (index > -1) {\n          this.joined.splice(index, 1);\n        }\n      };\n    }\n    this.elements.toBack();\n    // Remove the drag event\n    this.elements.undrag();\n    let tmpx = 0;\n    let tmpy = 0;\n    let fdx = 0;\n    let fdy = 0;\n    let tmpar = [];\n    let tmpar2 = [];\n    let ConnEleList = [];\n    let NodeList = [];\n    let tmpx2 = [];\n    let tmpy2 = [];\n    // Create Custom Drag event\n    this.elements.drag((dx, dy) => {\n      this.elements.transform(`t${this.tx + dx},${this.ty + dy}`);\n      tmpx = this.tx + dx;\n      tmpy = this.ty + dy;\n      fdx = dx;\n      fdy = dy;\n      for (let i = 0; i < this.joined.length; ++i) {\n        this.joined[i].move(tmpar[i][0] + dx, tmpar[i][1] + dy);\n      }\n      for (let i = 0; i < ConnEleList.length; ++i) {\n        ConnEleList[i].dragAlong(NodeList[i], dx, dy);\n        tmpx2[i] = ConnEleList[i].tx + dx;\n        tmpy2[i] = ConnEleList[i].ty + dy;\n      }\n    }, () => {\n      fdx = 0;\n      fdy = 0;\n      tmpar = [];\n      tmpar2 = [];\n      for (const node of this.nodes) {\n        tmpar2.push(\n          [node.x, node.y]\n        );\n        node.remainHidden();\n      }\n      for (const node of this.joined) {\n        let ElementFlag = false;\n        tmpar.push(\n          [node.x, node.y]\n        );\n        node.remainShow();\n        if (node.connectedTo != null) {\n          const ConnElement1 = node.connectedTo.start.parent;\n          const ConnElement2 = node.connectedTo.end.parent;\n          console.log(ConnElement1.keyName);\n          console.log(ConnElement2.keyName);\n          if (ConnElement1.keyName !== 'BreadBoard') {\n            for (const ele of ConnEleList) {\n              if (ele === ConnElement1) {\n                ElementFlag = true;\n                break;\n              }\n            }\n            const PlaceableCheck = 'isBreadBoardPlaceable' in ConnElement1.info.properties;\n            const isBreadBoardPlaceable = ConnElement1.info.properties.isBreadBoardPlaceable;\n            if (!ElementFlag && PlaceableCheck && isBreadBoardPlaceable === 1) {\n              ConnEleList.push(ConnElement1);\n              tmpx2.push(0);\n              tmpy2.push(0);\n              NodeList.push(ConnElement1.getNodesCoord());\n            }\n          } else {\n            for (const ele of ConnEleList) {\n              if (ele === ConnElement1) {\n                ElementFlag = true;\n                break;\n              }\n            }\n            const PlaceableCheck = 'isBreadBoardPlaceable' in ConnElement2.info.properties;\n            const isBreadBoardPlaceable = ConnElement2.info.properties.isBreadBoardPlaceable;\n            if (!ElementFlag && PlaceableCheck && isBreadBoardPlaceable === 1) {\n              ConnEleList.push(ConnElement2);\n              tmpx2.push(0);\n              tmpy2.push(0);\n              NodeList.push(ConnElement2.getNodesCoord());\n            }\n          }\n        }\n      }\n\n    }, () => {\n      // Push dump to Undo stack & Reset\n      UndoUtils.pushChangeToUndoAndReset({ keyName: this.keyName, element: this.save(), event: 'drag', dragJson: { dx: fdx, dy: fdy } });\n      for (let i = 0; i < this.nodes.length; ++i) {\n        this.nodes[i].move(tmpar2[i][0] + fdx, tmpar2[i][1] + fdy);\n        this.nodes[i].remainShow();\n      }\n      tmpar2 = [];\n\n      this.tx = tmpx;\n      this.ty = tmpy;\n      // reBuild SameNodeObject after drag stop\n      for (let i = 0; i < ConnEleList.length; i++) {\n        ConnEleList[i].dragAlongStop(tmpx2[i], tmpy2[i]);\n      }\n      ConnEleList = [];\n      NodeList = [];\n      tmpx2 = [];\n      tmpy2 = [];\n      tmpar = [];\n      this.reBuildSameNodes();\n    });\n  }\n\n  /**\n   * Function to move/transform breadboard\n   * @param fdx relative x position to move\n   * @param fdy relative y position to move\n   */\n  transformBoardPosition(fdx: number, fdy: number): void {\n    let tmpar = [];\n    let tmpar2 = [];\n    let tmpx = 0;\n    let tmpy = 0;\n    let ffdx = 0;\n    let ffdy = 0;\n    let ConnEleList = [];\n    let NodeList = [];\n    let tmpx2 = [];\n    let tmpy2 = [];\n    ffdx = 0;\n    ffdy = 0;\n    tmpar = [];\n    tmpar2 = [];\n    for (const node of this.nodes) {\n      tmpar2.push(\n        [node.x, node.y]\n      );\n      node.remainHidden();\n    }\n    for (const node of this.joined) {\n      tmpar.push(\n        [node.x, node.y]\n      );\n      node.remainShow();\n      const ConnElement1 = node.connectedTo.start.parent;\n      const ConnElement2 = node.connectedTo.end.parent;\n      console.log(ConnElement1.keyName);\n      console.log(ConnElement2.keyName);\n      let ElementFlag = false;\n      if (ConnElement1.keyName !== 'BreadBoard') {\n\n        for (const ele of ConnEleList) {\n          if (ele === ConnElement1) {\n            ElementFlag = true;\n            break;\n          }\n        }\n        if (!ElementFlag && ConnElement1.info.properties.isBreadBoardPlaceable === 1) {\n          ConnEleList.push(ConnElement1);\n          tmpx2.push(0);\n          tmpy2.push(0);\n          NodeList.push(ConnElement1.getNodesCoord());\n        }\n      } else {\n        for (const ele of ConnEleList) {\n          if (ele === ConnElement1) {\n            ElementFlag = true;\n            break;\n          }\n        }\n        if (!ElementFlag && ConnElement2.info.properties.isBreadBoardPlaceable === 1) {\n          ConnEleList.push(ConnElement2);\n          tmpx2.push(0);\n          tmpy2.push(0);\n          NodeList.push(ConnElement2.getNodesCoord());\n        }\n      }\n\n\n    }\n\n    this.elements.transform(`t${this.tx + fdx},${this.ty + fdy}`);\n    tmpx = this.tx + fdx;\n    tmpy = this.ty + fdy;\n    ffdx = fdx;\n    ffdy = fdy;\n    for (let i = 0; i < this.joined.length; ++i) {\n      this.joined[i].move(tmpar[i][0] + fdx, tmpar[i][1] + fdy);\n    }\n\n    for (let i = 0; i < ConnEleList.length; ++i) {\n      ConnEleList[i].dragAlong(NodeList[i], fdx, fdy);\n      tmpx2[i] = ConnEleList[i].tx + fdx;\n      tmpy2[i] = ConnEleList[i].ty + fdy;\n    }\n\n    for (let i = 0; i < this.nodes.length; ++i) {\n      this.nodes[i].move(tmpar2[i][0] + ffdx, tmpar2[i][1] + ffdy);\n      this.nodes[i].remainShow();\n    }\n\n    this.tx = tmpx;\n    this.ty = tmpy;\n    for (let i = 0; i < ConnEleList.length; i++) {\n      ConnEleList[i].dragAlongStop(tmpx2[i], tmpy2[i]);\n    }\n    ConnEleList = [];\n    NodeList = [];\n    tmpx2 = [];\n    tmpy2 = [];\n    tmpar = [];\n    this.reBuildSameNodes();\n  }\n\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: this.title\n    };\n  }\n\n  /**\n   * Re-build sameNode variables\n   */\n  reBuildSameNodes() {\n    this.sameXNodes = {};\n    this.sameYNodes = {};\n    // initialise sameX and sameY node sets\n    for (const node of this.nodes) {\n      // create the set for x\n      this.sameXNodes[node.x] = this.sameXNodes[node.x] || [];\n      this.sameXNodes[node.x].push(node);\n\n      // Create the set for y\n      this.sameYNodes[node.y] = this.sameYNodes[node.y] || [];\n      this.sameYNodes[node.y].push(node);\n    }\n  }\n\n  /**\n   * Checks if the point is inside the passed bounding box\n   * TODO: move the function to a utils\n   * @param boundingBox: Raphael Bounding box object\n   * @param x: x-coordinate of the point\n   * @param y: y-coordinate of the point\n   */\n  isPointWithinBbox(boundingBox, x, y): boolean {\n    return ((x < boundingBox.cx && x > boundingBox.cx - 1.2 * boundingBox.width) &&\n      (y < boundingBox.cy && y > boundingBox.cy - 1.2 * boundingBox.height));\n  }\n\n  /**\n   * Returns the shortlisted list of the nodes within the proximity of (x, y) coordinate\n   * @param x: x-coordinate\n   * @param y: y-coordinate\n   */\n  shortlistNodes(x, y) {\n    const xIndexFrom = _.sortedIndexBy(this.sortedNodes, { x: x - BreadBoard.PROXIMITY_DISTANCE }, 'x');\n    const xIndexTo = _.sortedLastIndexBy(this.sortedNodes, { x: x + BreadBoard.PROXIMITY_DISTANCE }, 'x');\n\n    return this.sortedNodes.slice(xIndexFrom, xIndexTo);\n  }\n\n  /**\n   * Returns the nearest node on the breadboard to the passed coordinate\n   * @param x: x-coordinate\n   * @param y: y-coordinate\n   */\n  getNearestNodes(x, y) {\n    // this.elements.getElementByPoint()\n    const nodesToSearch = this.shortlistNodes(x, y);\n    for (const node of nodesToSearch) {\n      if (this.isPointWithinBbox(node.body.getBBox(), x, y)) {\n        return node;\n      }\n    }\n  }\n\n  /**\n   * Returns the list of nodes that are soldered on the breadboard\n   */\n  getSolderedNodes() {\n    if (this.solderedNodes == null) {\n      this.solderedNodes = this.nodes.filter(node => node.isSoldered());\n    }\n    return this.solderedNodes;\n  }\n\n  /**\n   * Adds soldered nodes to the cache\n   * @param node node\n   */\n  addSolderedNode(node) {\n    if (this.solderedNodes == null) {\n      this.solderedNodes = [];\n    }\n    this.solderedNodes.push(node);\n  }\n\n  /**\n   * Initialize Breadboard for simultion\n   */\n  initSimulation(): void {\n    // Stores set of node which has same x values\n    const xtemp = this.sameXNodes;\n    // Stores set of node which has same y values\n    const ytemp = this.sameYNodes;\n\n    for (const node of this.nodes) {\n      // Add a Node value change listener\n      node.addValueListener((value, calledBy, parent) => {\n        const labelCalledBy = calledBy.label;\n        const labelParent = parent.label;\n        if (calledBy.y === parent.y\n          && (labelCalledBy.charCodeAt(0) !== labelParent.charCodeAt(0) || labelCalledBy === labelParent)) {\n          return;\n        }\n        if (node.label === '-') {\n          for (const neigh of ytemp[node.y]) {\n            if (neigh.x !== node.x && value <= 0) {\n              neigh.setValue(value, neigh);\n            }\n          }\n        } else if (node.label === '+') {\n          for (const neigh of ytemp[node.y]) {\n            if (neigh.x !== node.x) {\n              neigh.setValue(value, neigh);\n            }\n          }\n        } else {\n          const op = node.label.charCodeAt(0);\n          if (op >= 102) {\n            for (const neigh of xtemp[node.x]) {\n              if (neigh.y !== node.y && neigh.label.charCodeAt(0) >= 102) {\n                neigh.setValue(value, neigh);\n              }\n            }\n          }\n          if (op <= 101) {\n            for (const neigh of xtemp[node.x]) {\n              if (neigh.y !== node.y && neigh.label.charCodeAt(0) <= 101) {\n                neigh.setValue(value, neigh);\n              }\n            }\n          }\n        }\n      });\n    }\n\n  }\n  /**\n   * Called on Stop Simulation is pressed\n   */\n  closeSimulation(): void {\n    BreadBoard.visitedNodesv2.clear();\n  }\n  /**\n   * Returns groupings\n   */\n  getGroupings() {\n    const groups = _.cloneDeep(BreadBoard.groupings);\n    return groups;\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/Geometry.ts",
    "content": "import _ from 'lodash';\n\nexport class BoundingBox {\n    x: number;\n    y: number;\n    height: number;\n    width: number;\n\n    constructor(x: number, y: number, width: number, height: number) {\n        this.x = x;\n        this.y = y;\n        this.width = width;\n        this.height = height;\n    }\n\n    static loadFromRaphaelBbox(bBox) {\n        return new BoundingBox(bBox.x, bBox.y, bBox.width, bBox.height);\n    }\n\n    static getCombinedBBox(bBoxes: BoundingBox[]) {\n        const minX = _.minBy(bBoxes, box => box.x).x;\n        const maxX = _.maxBy(bBoxes, box => box.x).x;\n        const minY = _.minBy(bBoxes, box => box.y).y;\n        const maxY = _.maxBy(bBoxes, box => box.y).y;\n        return new BoundingBox(\n            minX, minY, maxX - minX, maxY - minY\n        );\n    }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/ImageToByteArray.ts",
    "content": "export class ImageToByteArray {\n    static result = '';\n\n    static getDataURLForm(url: string) {\n        this.result = '';\n        const image = this.createImage(url);\n        image.onload = () => {\n            this.result = this.convertImage(image);\n        };\n    }\n\n    static createImage(url: string) {\n        const image = document.createElement('img');\n        image.setAttribute('src', url);\n        image.setAttribute('visibility', 'hidden');\n        return image;\n    }\n\n    static convertImage(image) {\n        const canvas = this.drawImageToCanvas(image);\n        return canvas.toDataURL();\n    }\n\n    static drawImageToCanvas(image) {\n        const canvas = document.createElement('canvas');\n        canvas.width = image.width;\n        canvas.height = image.height;\n        canvas.getContext('2d').drawImage(image, 0, 0, image.width, image.height);\n        return canvas;\n    }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/Login.ts",
    "content": "import { environment } from '../../environments/environment';\n\n/**\n * Class For handling Login & Logout\n */\nexport class Login {\n  /**\n   * Get Auth Token\n   */\n  static getToken(): string {\n    return window.localStorage.getItem('esim_token');\n  }\n  /**\n   * Logout and redirect to home page\n   */\n  static logout() {\n    window.localStorage.removeItem('esim_token');\n    window.open(new URL('../../', window.location.href).href, '_self');\n  }\n  /**\n   * Redirect to the login Page\n   * @param isFront Is Frontpage\n   */\n  static redirectLogin(isFront: boolean = false): void {\n    const dashboardURI = (new URL(environment.DASHBOARD_URL, window.location.href)).href;\n    if (Login.getToken()) {\n      window.open(dashboardURI, '_self');\n    } else {\n      let redirectUri = isFront ? dashboardURI : window.location.href;\n      redirectUri = encodeURIComponent(redirectUri);\n      // const url = `${window.location.protocol}\\\\\\\\${window.location.host}\\\\eda\\\\#\\\\login?url=${redirectUri}`;\n      const url = `${environment.LOGIN_URL}${redirectUri}`;\n      window.open(url, '_self');\n    }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/MathUtils.ts",
    "content": "export class MathUtils {\n  static modulo(n, m) {\n      return ((n % m) + m) % m;\n  }\n\n  static isPointBetween(point: [number, number], point1: [number, number], point2: [number, number]): boolean {\n      return (point[0] >= point1[0] && point[0] < point2[0]) && (point[1] >= point1[1] && point[1] < point2[1]);\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/Miscellaneous.ts",
    "content": "import { CircuitElement } from './CircuitElement';\n/**\n * Label class\n */\nexport class Label extends CircuitElement {\n  /**\n   * Text of the label\n   */\n  text = 'Label';\n  /**\n   * Font Size of the Label\n   */\n  fontSize = 15;\n  /**\n   * Font color of the label.\n   */\n  fontColor = '#000000';\n  /**\n   * Font style of the label\n   */\n  fontStyle = 'normal';\n  /**\n   * Font weight of the label.\n   */\n  fontWeight = 'normal';\n  /**\n   * Get Name Function\n   */\n  getName = null;\n  /**\n   * Label constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('Label', x, y);\n    this.elements.push(\n      canvas.text(x, y, this.text)\n    );\n    this.update();\n    this.setClickListener(null);\n    this.setDragListeners();\n    this.setHoverListener();\n    window['queue'] -= 1;\n  }\n  /** Saves data for label class */\n  SaveData() {\n    return {\n      text: this.text,\n      size: this.fontSize,\n      color: this.fontColor,\n      weight: this.fontWeight,\n      style: this.fontStyle\n    };\n  }\n  /**\n   * Loads data of SaveData()\n   * @param data saved object\n   */\n  LoadData(data: any) {\n    this.text = data.data.text;\n    this.fontSize = data.data.size;\n    this.fontColor = data.data.color;\n    this.fontWeight = data.data.weight;\n    this.fontStyle = data.data.style;\n    this.elements.transform(`t${this.tx},${this.ty}`);\n    this.update();\n  }\n  /** Function updates the label class */\n  update() {\n    this.elements[0]\n      .attr({\n        'font-size': this.fontSize,\n        'font-family': 'Times New Roman,Georgia,Serif',\n        'font-weight': this.fontWeight,\n        'font-style': this.fontStyle,\n        text: this.text,\n        fill: this.fontColor\n      });\n  }\n  /** Changes text for label  */\n  changeLabel(value: string) {\n    // if text field is empty\n    if (value === '') {\n      // TODO: Show Toast\n      window['showToast']('Label cannot be empty');\n      return;\n    }\n    this.text = value;\n    this.update();\n  }\n  /**\n   * Function provides label details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    let tmp;\n    const body = document.createElement('div');\n    body.style.display = 'flex';\n    body.style.flexDirection = 'column';\n\n    const inp = document.createElement('input');\n    inp.value = this.text;\n    inp.onkeyup = () => {\n      this.changeLabel(inp.value);\n    };\n\n    inp.addEventListener('focusout', () => {\n      if (inp.value === '') {\n        inp.value = this.text;\n      }\n    });\n    const sz = document.createElement('input');\n    sz.type = 'number';\n    sz.min = '10';\n    sz.value = `${this.fontSize}`;\n    sz.max = '100';\n    sz.onchange = () => {\n      const num = parseInt(sz.value, 10);\n      if (num) {\n        this.fontSize = Math.min(100, Math.max(10, num));\n        this.update();\n      }\n    };\n    const colors = [\n      ['Black', '#000000'],\n      ['Red', '#ff0000'],\n      ['Green', '#04942b'],\n      ['Blue', '#0000ff'],\n      ['Purple', '#6a0dad'],\n    ];\n    const colorSelect = document.createElement('select');\n    tmp = '';\n    for (const col of colors) {\n      tmp += `<option>${col[0]}</option>`;\n    }\n    colorSelect.innerHTML = tmp;\n    colorSelect.onchange = () => {\n      this.fontColor = colors[colorSelect.selectedIndex][1];\n      this.update();\n    };\n    const styles = ['Normal', 'Italic'];\n    const styleSelect = document.createElement('select');\n    tmp = '';\n    for (const styl of styles) {\n      tmp += `<option>${styl}</option>`;\n    }\n    styleSelect.innerHTML = tmp;\n    styleSelect.onchange = () => {\n      this.fontStyle = styles[styleSelect.selectedIndex];\n      this.update();\n    };\n    const weights = ['Normal', 'Bold', 'Bolder', 'Lighter'];\n    const weightSelect = document.createElement('select');\n    tmp = '';\n    for (const wght of weights) {\n      tmp += `<option>${wght}</option>`;\n    }\n    weightSelect.innerHTML = tmp;\n    weightSelect.onchange = () => {\n      this.fontWeight = weights[weightSelect.selectedIndex];\n      this.update();\n    };\n    tmp = document.createElement('label');\n    tmp.innerText = 'Text';\n    body.appendChild(tmp);\n    body.appendChild(inp);\n    tmp = document.createElement('label');\n    tmp.innerText = 'Size';\n    body.appendChild(tmp);\n    body.appendChild(sz);\n    tmp = document.createElement('label');\n    tmp.innerText = 'Colors';\n    body.appendChild(tmp);\n    body.appendChild(colorSelect);\n    tmp = document.createElement('label');\n    tmp.innerText = 'Styles';\n    body.appendChild(tmp);\n    body.appendChild(styleSelect);\n    tmp = document.createElement('label');\n    tmp.innerText = 'Weight';\n    body.appendChild(tmp);\n    body.appendChild(weightSelect);\n\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'Label'\n    };\n  }\n  /**\n   * Called on Start Simulation\n   */\n  initSimulation(): void {\n  }\n  /**\n   * Called on Stop simulation.\n   */\n  closeSimulation(): void {\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/Point.ts",
    "content": "import { Wire } from './Wire';\nimport { CircuitElement } from './CircuitElement';\nimport { isNull } from 'util';\nimport { BoundingBox } from './Geometry';\nimport _ from 'lodash';\nimport { BreadBoard } from './General';\n\n\n/**\n * Declare window so that custom created function don't throw error\n */\ndeclare var window;\n\n/**\n * Class For Circuit Node ie. Point wires can connect with nodes\n */\nexport class Point {\n\n  /**\n   * Boolean to either show bubble on hover or not\n   */\n  static showBubbleBool = true;\n  /**\n   * Hide node on creation\n   */\n  static defaultAttr: any = {\n    fill: 'rgba(0,0,0,0)',\n    stroke: 'rgba(0,0,0,0)'\n  };\n  /**\n   * Show red color with black stroke on hover\n   */\n  static nodeAttr: any = {\n    fill: 'rgba(255,0,0,1)',\n    stroke: 'rgba(0,0,0,1)'\n  };\n  /**\n   * Body of the Circuit Node\n   */\n  body: any;\n\n  /**\n   * Stores the reference of wire which is connected to it\n   */\n  connectedTo: Wire = null;\n\n  /**\n   * Is the point soldered with wire.\n   */\n  private soldered = false;\n\n  /**\n   * Hover callback called on hover over node\n   */\n  hoverCallback: any = null;\n\n  /**\n   * Hover Close Callback called if hover is removed\n   */\n  hoverCloseCallback: any = null;\n\n  /**\n   * Callback called when we connect wire.\n   */\n  connectCallback: any = null;\n  /*\n  Callback called on disconnecting a wire.\n  */\n  disconnectCallback: any = null;\n  /**\n   * The Value of the node\n   */\n  value = -1;\n  /**\n   * Value change listener\n   */\n  listener: (val: number, calledby: Point, current: Point) => void = null;\n  /**\n   * Graph id used while starting simulation.\n   */\n  gid = -1;\n  /**\n   * The Node ID\n   */\n  id: number;\n  /**\n   * Boolean for inputPullUp\n   */\n  pullUpEnabled = false;\n\n  /**\n   * Constructor for Circuit Node\n   * @param canvas Raphael Canvas / paper\n   * @param x x position of node\n   * @param y y position of node\n   * @param label label to be shown when hover\n   * @param half The Half width of Square\n   * @param parent parent of the circuit node\n   */\n  constructor(\n    private canvas: any,\n    public x: number,\n    public y: number,\n    public label: string,\n    public half: number,\n    public parent: CircuitElement\n  ) {\n    // if (window['point_id']) {\n    //   this.id = window['point_id'];\n    //   window.point_id += 1;\n    // }\n    // else {\n    //   this.id = 1;\n    //   window['point_id'] = 2;\n    // }\n    this.id = this.parent.nid;\n    ++this.parent.nid;\n    // Create a rectangle of 4x4 and set default color and stroke\n    this.body = this.canvas.rect(x, y, 2 * this.half, 2 * this.half);\n\n    this.body.attr(Point.defaultAttr);\n    this.body.node.setAttribute('class', 'mynode');\n\n    // Set Hover callback\n    this.body.hover((evt: MouseEvent) => {\n      // Check if showBubbleBool is enabled\n      if (Point.showBubbleBool) {\n        // Check if callback is present if it is then call it\n        if (this.hoverCallback) {\n          this.hoverCallback(this.x, this.y);\n        }\n        window.showBubble(this.label, evt.clientX, evt.clientY);\n        if (this.parent.keyName === 'BreadBoard') {\n\n          const ref = this.parent as BreadBoard;\n\n          if (this.label === '+' || this.label === '-') {\n            for (const point of ref.sameYNodes[this.y]) {\n              if (this.id === point.id) {\n                this.highlight();\n              } else {\n                point.outline();\n              }\n            }\n\n          } else {\n            const groups = ref.getGroupings();\n            const index = groups.findIndex(prefix => prefix.includes(this.label.charAt(0)));\n\n            for (const point of ref.sameXNodes[this.x]) {\n              if (point.label !== '+' && point.label !== '-') {\n                if (groups[index].includes(point.label.charAt(0))) {\n                  if (this.id === point.id) {\n                    this.highlight();\n                  } else {\n                    point.outline();\n                  }\n                }\n              }\n            }\n          }\n        }\n      } else {\n        // TODO: Do not show node highligtht\n        this.remainHidden();\n      }\n    }, () => {\n      // Check if close callback is present if present call it\n      if (this.hoverCloseCallback) {\n        this.hoverCloseCallback(this.x, this.y);\n      }\n      window.hideBubble();\n\n      if (this.parent.keyName === 'BreadBoard') {\n\n        const ref = this.parent as BreadBoard;\n\n        if (this.label === '+' || this.label === '-') {\n          for (const point of ref.sameYNodes[this.y]) {\n            if (this.id === point.id) {\n              this.undoHighlight();\n            } else {\n              point.undoOutline();\n            }\n          }\n        } else {\n          for (const point of ref.sameXNodes[this.x]) {\n            if (point.label !== '+' && point.label !== '-') {\n              if (this.id === point.id) {\n                this.undoHighlight();\n              } else {\n                point.undoOutline();\n              }\n            }\n          }\n        }\n      }\n      // Show node highligtht\n      this.remainShow();\n    });\n\n    // TODO: Remove The following code After Development\n    // this.body.drag((dx, dy) => {\n    //   this.body.attr({\n    //     x: this.x + dx,\n    //     y: this.y + dy\n    //   });\n    // }, () => {\n    //   this.x = this.body.attr(\"x\");\n    //   this.y = this.body.attr(\"y\");\n    // }, () => {\n    //   this.x = this.body.attr(\"x\");\n    //   this.y = this.body.attr(\"y\");\n    // });\n    // this.body.dblclick(() => {\n    //   alert((this.x - this.parent.x) + \",\" + (this.y - this.parent.y) + \"   \" + this.label);\n    // });\n    // return;\n\n    // Set click listener\n    this.body.mousedown(() => {\n      if (this.connectedTo != null) {\n        return;\n      }\n      if ((window['Selected'] instanceof Wire) && !window.Selected.isConnected()) {\n        this.connectWire(window['Selected']);\n        window['isSelected'] = false; // deselect object\n        window['Selected'] = null;\n      } else {\n        // if nothing is selected create a new wire object\n        window.isSelected = true;\n        const wire = this.startNewWire();\n        // select the wire and insert into the scope of circuit\n        window.Selected = wire;\n      }\n      if (this.connectCallback) {\n        this.connectCallback(this);\n      }\n    });\n\n  }\n\n  isConnected(): boolean {\n    return !!this.connectedTo;\n  }\n\n  isSoldered(): boolean {\n    return this.soldered;\n  }\n\n  /**\n   * Solders wire to the point\n   * @param wire wire to solder (if existing wire, else pass empty to create a new wire at the node)\n   */\n  solderWire(wire?): Wire {\n    if (!wire) {\n      wire = this.startNewWire();\n    }\n    this.soldered = true;\n    const newClass = `${this.body.node.getAttribute('class')} solder-highlight`;\n    this.body.node.setAttribute('class', newClass);\n    if (this.connectCallback) {\n      this.connectCallback(this);\n    }\n    return wire;\n  }\n\n  /**\n   * Unsolders wire to the point\n   */\n  unsolderWire() {\n    const wire = this.connectedTo;\n    if (wire) {\n      this.setValue(-1, this);\n      wire.delete();\n    }\n    this.soldered = false;\n    const newClass = this.body.node.getAttribute('class').replace(' solder-highlight', '');\n    this.body.node.setAttribute('class', newClass);\n\n    if (this.disconnectCallback) {\n      this.disconnectCallback(this);\n    }\n  }\n\n  connectWire(wire, pushToUndo = true) {\n    // if selected item is wire then connect the wire with the node\n    // console.log([]);\n    if (wire.start === this) { return; }\n    this.connectedTo = wire;\n    wire.connect(this, true, false, !pushToUndo, pushToUndo ? 'add' : 'breadDrag');\n    wire.deselect();\n    if (wire.start && wire.end) {\n      window['scope']['wires'].push(wire);\n    } else {\n      window['showToast']('Wire was not connected properly !');\n    }\n  }\n\n  /**\n   * Creates and originates new wire at the point\n   */\n  startNewWire() {\n    const wire = new Wire(this.canvas, this);\n    this.connectedTo = wire;\n    return wire;\n  }\n\n  /**\n   * Returns the bounding box of the point\n   */\n  getBoundingBox(): BoundingBox {\n    return BoundingBox.loadFromRaphaelBbox(this.body.getBBox());\n  }\n\n  /**\n   * Set Hover and Hover close Callback\n   * @param callback Hover Callback\n   * @param closeCallback Hover Close Callback\n   */\n  setHoverCallback(callback = null, closeCallback = null) {\n    this.hoverCallback = callback;\n    this.hoverCloseCallback = closeCallback;\n  }\n\n  /**\n   * Return the center position of the Node\n   */\n  position() {\n    return [this.x + this.half, this.y + this.half];\n  }\n\n  highlight() {\n    const newClass = `${this.body.node.getAttribute('class')} highlight`;\n    this.body.node.setAttribute('class', newClass);\n  }\n\n  undoHighlight() {\n    const newClass = this.body.node.getAttribute('class').replace(' highlight', '');\n    this.body.node.setAttribute('class', newClass);\n  }\n  outline() {\n    const newClass = `${this.body.node.getAttribute('class')} outline`;\n    this.body.node.setAttribute('class', newClass);\n  }\n\n  undoOutline() {\n    const newClass = this.body.node.getAttribute('class').replace(' outline', '');\n    this.body.node.setAttribute('class', newClass);\n  }\n\n  /**\n   * Change the Position of Node with relative to current position\n   * @param dx change in x axis\n   * @param dy change in y axis\n   */\n  relativeMove(dx: number, dy: number) {\n    this.x += dx;\n    this.y += dy;\n    // update the position\n    this.body.attr({\n      x: this.x,\n      y: this.y\n    });\n  }\n\n  /**\n   * Hide Node\n   */\n  hide() {\n    this.body.attr(Point.defaultAttr);\n  }\n  /**\n   * This will permanently hide the node\n   */\n  remainHidden() {\n    this.body.hide();\n  }\n  /**\n   * This will show node if its is permanently hidden\n   */\n  remainShow() {\n    this.body.show();\n  }\n\n  /**\n   * Show Node\n   */\n  show() {\n    if (this.connectedTo) { return; }\n    this.body.attr(Point.nodeAttr);\n  }\n\n  /**\n   * Move Node to x,y\n   * @param x new x position of Node\n   * @param y new y position of Node\n   */\n  move(x: number, y: number) {\n    this.x = x;\n    this.y = y;\n    // Update the positon\n    this.body.attr({\n      x: this.x,\n      y: this.y\n    });\n  }\n\n  /**\n   * Disconnects the point to wire\n   */\n  disconnect() {\n    this.connectedTo = null;\n    if (this.isSoldered()) {\n      this.unsolderWire();\n    }\n  }\n\n  /**\n   * Remove Node from canvas\n   */\n  remove() {\n    this.body.remove();\n    if (this.connectedTo) {\n      this.connectedTo.remove();\n      this.connectedTo = null;\n      this.parent = null;\n    }\n  }\n  /**\n   * Adding a Value Change Listener.\n   * @param listener Value Change Listener\n   */\n  addValueListener(listener: (val: number, calledby: Point, parent: Point) => void) {\n    this.listener = listener;\n  }\n  /**\n   * Set the value of a Circuit node.\n   * @param value New Value\n   * @param calledby The node which sets the value\n   */\n  setValue(value: number, calledby: Point) {\n    this.value = value;\n\n    if (calledby && this.listener) {\n      this.listener(this.value, calledby, this);\n    }\n\n    if (isNull(calledby)) {\n      calledby = this;\n    }\n    // Propogate the value further\n\n    if (this.connectedTo && this.connectedTo.end) {\n      if (this.connectedTo.end.gid !== calledby.gid && this.connectedTo.end.gid !== this.gid) {\n        this.connectedTo.end.setValue(this.value, this);\n      }\n    }\n\n    if (this.connectedTo && this.connectedTo.start) {\n      if (this.connectedTo.start.gid !== calledby.gid && this.connectedTo.start.gid !== this.gid) {\n        this.connectedTo.start.setValue(this.value, this);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/RaphaelUtils.ts",
    "content": "/**\n * Checks if two raphael element's bounding boxes intersect\n */\nexport function areBoundingBoxesIntersecting(box1, box2): boolean {\n  if (box1.x >= box2.x2 || box2.x >= box1.x2) {\n    return false;\n  }\n  if (box1.y2 <= box2.y || box2.y2 <= box1.y) {\n    return false;\n  }\n  return true;\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/SaveOffiline.ts",
    "content": "import { AlertService } from '../alert/alert-service/alert.service';\n\n/**\n * Declare window so that custom created function don't throw error\n */\ndeclare var window;\n/**\n * Class to Save Project in IndexedDB\n */\nexport class SaveOffline {\n  /**\n   * Check if IndexedDB exist if not show alert\n   * @param callback If IndexedDB exist call the callback\n   */\n  static Check(callback: (result: any) => void = null) {\n    // check db exist\n    if (window.indexedDB) {\n    } else {\n      // support for other browser\n      window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;\n      window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;\n    }\n\n    // if exist create/open project database\n    if (window.indexedDB) {\n      const request = window.indexedDB.open('projects', 1);\n      // Database was not able to open/create\n      request.onerror = (err) => {\n        console.log(err);\n        AlertService.showAlert('Error Occurred for Ofline Circuit (Private Window Can be a Reason)');\n      };\n\n      // if everything works call the callback with result\n      request.onsuccess = () => {\n        if (callback) {\n          callback(request.result);\n        }\n      };\n      // Create Object Store on success\n      request.onupgradeneeded = (event) => {\n        const datab = event.target.result;\n        if (!datab.objectStoreNames.contains('projects')) {\n          datab.createObjectStore('project', { keyPath: 'id' });\n        }\n      };\n\n      return true;\n    }\n\n    // IndexedDB not found\n    AlertService.showAlert('Save Offline Feature Will Not Work');\n    return false;\n  }\n  /**\n   * Save Project to Indexed DB\n   * @param mydata Project Data\n   * @param callback Callback if Project is saved\n   */\n  static Save(mydata, callback: (data: any) => void = null) {\n    if (!SaveOffline.Check(db => {\n      db.transaction(['project'], 'readwrite')\n        .objectStore('project')\n        .add(mydata);\n      if (callback) {\n        callback(mydata);\n      }\n      AlertService.showAlert('Done saved.');\n    })) {\n      return;\n    }\n    // let db;\n    // const request = window.indexedDB.open('projects', 1);\n    // request.onerror = () => {\n    //   // console.log('error: ');\n    //   alert('Error Occurred');\n    // };\n\n    // request.onsuccess = () => {\n    //   db = request.result;\n    // };\n\n    // request.onupgradeneeded = (event) => {\n    //   const datab = event.target.result;\n    //   if (!datab.objectStoreNames.contains('projects')) {\n    //     datab.createObjectStore('project', { keyPath: 'id' });\n    //   }\n    // };\n  }\n\n  /**\n   * Read all Project from Indexed DB\n   * @param callback Callback if after all the data is fetched\n   */\n  static ReadALL(callback: (data: any) => void = null) {\n    if (!SaveOffline.Check(db => {\n      const objectStore = db.transaction('project').objectStore('project');\n      const data = [];\n      objectStore.openCursor().onsuccess = (event) => {\n        const cursor = event.target.result;\n        if (cursor) {\n          data.push(cursor.value);\n          cursor.continue();\n        } else {\n          if (callback) {\n            callback(data);\n          }\n        }\n      };\n    })) {\n      return;\n    }\n    // let db;\n    // const request = window.indexedDB.open('projects', 1);\n    // request.onerror = (event) => {\n    //   // console.log('error: ');\n    //   alert('Error Occurred');\n    // };\n\n    // request.onsuccess = () => {\n    //   db = request.result;\n    // console.log('success: ' + db);\n    // };\n  }\n  /**\n   * Delete Project Fron Indexed DB\n   * @param id Project ID\n   * @param callback Callback if it was deleted Succesfully\n   */\n  static Delete(id, callback: () => void = null) {\n    if (!SaveOffline.Check(db => {\n      const ok = db.transaction(['project'], 'readwrite')\n        .objectStore('project')\n        .delete(id);\n\n      ok.onsuccess = (_) => {\n        if (callback) {\n          callback();\n        }\n      };\n    })) {\n      return;\n    }\n    // let db;\n    // const request = window.indexedDB.open('projects', 1);\n    // request.onerror = (_) => {\n    //   // console.log('error: ');\n    //   alert('Error Occurred');\n    // };\n\n    // request.onsuccess = (__) => {\n    //   db = request.result;\n\n    // };\n  }\n  /**\n   * Update respective Project in Indexed DB\n   * @param mydata Project data contains id\n   * @param callback Callback when Project is succesfully updated\n   */\n  static Update(mydata, callback: (data: any) => void = null) {\n    if (!SaveOffline.Check(db => {\n      const ok = db.transaction(['project'], 'readwrite')\n        .objectStore('project')\n        .put(mydata);\n\n      ok.onsuccess = (_) => {\n        AlertService.showAlert('Done updating.');\n        if (callback) {\n          callback(mydata);\n        }\n      };\n    })) {\n      return;\n    }\n    // let db;\n    // const request = window.indexedDB.open('projects', 1);\n    // request.onerror = (_) => {\n    //   alert('Error Occurred');\n    //   // console.log('error: ');\n    // };\n\n    // request.onsuccess = (__) => {\n    //   db = request.result;\n\n\n    // };\n  }\n  /**\n   * Read a Particular project from Indexed DB\n   * @param id Project ID\n   * @param callback Callback if Project read is completed\n   */\n  static Read(id, callback: (data: any) => void = null) {\n    if (!SaveOffline.Check(db => {\n      const transaction = db.transaction(['project']);\n      const objectStore = transaction.objectStore('project');\n      const ok = objectStore.get(parseInt(id, 10));\n\n      ok.onerror = () => {\n        AlertService.showAlert('Unable to retrieve data from database!');\n        callback(null);\n      };\n\n      ok.onsuccess = () => {\n        callback(ok.result);\n      };\n    })) {\n      return;\n    }\n    // let db;\n    // const request = window.indexedDB.open('projects', 1);\n    // request.onerror = () => {\n    //   alert('Error Occurred');\n    //   // console.log('error: ');\n    // };\n\n    // request.onsuccess = () => {\n    // db = request.result;\n\n\n    // };\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/SaveOnline.ts",
    "content": "import { isNull } from 'util';\nimport { Login } from './Login';\nimport { Download, ImageType } from './Download';\nimport { ApiService } from '../api.service';\nimport { Workspace } from './Workspace';\nimport { AlertService } from '../alert/alert-service/alert.service';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { ConvertJSONFormat } from './ConvertJSONFormat';\n\n/**\n * Declare window so that custom created function don't throw error\n */\ndeclare var window;\n\n/**\n * Class For Saving Online\n */\nexport class SaveOnline {\n  /**\n   * Check if input is an UUID.\n   * @param input Input that needs to be tested\n   */\n  static isUUID(input: string) {\n    const rgx = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n    return rgx.test(input);\n  }\n  /**\n   * Save or Update Project\n   * @param name Project Name\n   * @param description Project Description\n   * @param api API Service\n   * @param branch Branch of variation\n   * @param version Version of variation\n   * @param callback Callback when save/update is done\n   * @param id Project ID\n   */\n  static Save(name = '', description = '', api: ApiService, branch, version, callback: (data: any) => void = null, id: string = null) {\n    // Get Token\n    const token = Login.getToken();\n    // if id is present then update\n    let toUpdate = false;\n    if (isNull(id)) {\n    } else {\n      toUpdate = true;\n    }\n    // Save Object that needs to send to server\n    const saveObj = {\n      data_dump: '',\n      is_arduino: true,\n      description,\n      name,\n      branch,\n      version,\n    };\n    // Data Dump will contain Workspace Data and Circuit data\n    const dataDump = {\n      canvas: {\n        x: Workspace.translateX,\n        y: Workspace.translateY,\n        scale: Workspace.scale\n      }\n    };\n    // For each item in scope\n    for (const key in window.scope) {\n      // if at least one component present in the scope\n      if (window.scope[key] && window.scope[key].length > 0) {\n        dataDump[key] = []; // Intialize datadump\n        // Call the save function and push the return object\n        for (const item of window.scope[key]) {\n          if (item.save) {\n            dataDump[key].push(item.save());\n          }\n        }\n\n      }\n    }\n    // Convert Data Dump to an String and add to Save Object\n    saveObj.data_dump = JSON.stringify(dataDump);\n\n    // Generate Thumbnail for the project\n    Download.ExportImage(ImageType.PNG).then(v => {\n      saveObj['base64_image'] = v; // Store the base64 image\n\n      // if update then update the project\n      if (toUpdate) {\n        api.updateProject(id, saveObj, token).subscribe(out => {\n          if (callback) {\n            callback(out);\n          }\n        }, err => {\n          if (err.status === 401) {\n            AlertService.showAlert('You Cannot Save the Circuit as you are not the Ownwer');\n            return;\n          }\n          console.log(err);\n        });\n      } else {\n        // Otherwise save the project\n        api.saveProject(saveObj, token).subscribe(output => {\n          if (callback) {\n            callback(output);\n          }\n        }, err => {\n          let message = '';\n          for (const key in err.error) {\n            if (err.error[key]) {\n              message += '\\n' + key;\n              for (const item of err.error[key]) {\n                message += `${item},`;\n              }\n            }\n          }\n          AlertService.showAlert(message);\n        });\n\n      }\n\n    });\n\n  }\n\n  /**\n   * Save Staff Project\n   * @param name Project Name\n   * @param description Project Description\n   * @param api API Service\n   * @param callback Callback when save is done\n   */\n  static staffSaveGallery(name = '', description = '', api: ApiService, callback: (data: any) => void = null) {\n    //  Get Token\n    const token = Login.getToken();\n    // Save Object that needs to send to server\n    const saveObj = {\n      data_dump: '',\n      is_arduino: true,\n      description: '',\n      name,\n      save_id: 'gallery' + Math.random() * 100000\n    };\n    // Data Dump will contain Workspace Data and Circuit data\n    const dataDump = {\n      canvas: {\n        x: Workspace.translateX,\n        y: Workspace.translateY,\n        scale: Workspace.scale\n      }\n    };\n    // For each item in scope\n    for (const key in window.scope) {\n      // if at least one component present in the scope\n      if (window.scope[key] && window.scope[key].length > 0) {\n        dataDump[key] = []; // Intialize datadump\n        // Call the save function and push the return object\n        for (const item of window.scope[key]) {\n          if (item.save) {\n            dataDump[key].push(item.save());\n          }\n        }\n\n      }\n    }\n    // Convert Data Dump to an String and add to Save Object\n    saveObj.data_dump = JSON.stringify(dataDump);\n    // Generate Thumbnail for the project\n    Download.ExportImage(ImageType.PNG).then(v => {\n      saveObj['media'] = v; // Store the base64 image\n      // Otherwise save the project\n      api.saveProjectToGallery(saveObj, token).subscribe(output => {\n        if (callback) {\n          callback(output);\n\n          AlertService.showAlert('Saved In Gallery');\n        }\n      }, err => {\n        console.log(err);\n        let message = '';\n        for (const key in err.error) {\n          if (err.error[key]) {\n            message += '\\n' + key;\n            for (const item of err.error[key]) {\n              message += `${item},`;\n            }\n          }\n        }\n        AlertService.showAlert(message);\n      });\n    });\n  }\n  /**\n   * Save or Update Project from Dashboard\n   * @param data Project data\n   * @param api API Service\n   * @param callback Callback when save/update is done\n   * @param toUpdate Determines whether to save or update the circuit\n   */\n  static SaveFromDashboard(data: any, api: ApiService, callback: (data: any) => void = null, toUpdate: boolean) {\n    const id = data.id;\n    // Get Token\n    const token = Login.getToken();\n    if (token) {\n      // Converting data to required format\n      const saveObj = ConvertJSONFormat.convertToOnlineFormat(data);\n      if (toUpdate) {\n        api.readProject(id, 'master', this.getRandomString(20), token).subscribe(() => {\n          // if exists then update the project\n          api.updateProject(id, saveObj, token).subscribe(out => {\n            if (callback) {\n              AlertService.showAlert('Updated');\n              callback(out);\n            }\n          }, err => {\n            if (err.status === 401) {\n              AlertService.showAlert('You Cannot Save the Circuit as you are not the Ownwer');\n              return;\n            }\n            console.log(err);\n          });\n        },\n          (err: HttpErrorResponse) => {\n            if (err.status === 404) {\n              // Otherwise save the project\n              this.CallToAPISaveService(api, saveObj, token, callback);\n              AlertService.showAlert('Circuit ID has been changed as circuit was deleted');\n            } else if (err.status === 401) {\n              AlertService.showAlert('You are Not Authorized to download this circuit');\n              window.open('../../../', '_self');\n              return;\n            } else {\n              AlertService.showAlert('Something Went Wrong');\n            }\n            console.log(err);\n          }\n        );\n      } else {\n        // Save the project due to invalid id\n        this.CallToAPISaveService(api, saveObj, token, callback);\n      }\n    }\n  }\n  /**\n   * Calls api to save project data on cloud.\n   * This function was created to reduce repeating code from above function.\n   * @param api API Service\n   * @param saveObj JSON Object containing Project\n   * @param token Login Token\n   * @param callback Callback when project saved\n   */\n  static CallToAPISaveService(api: ApiService, saveObj: any, token: string, callback: (data: any) => void = null) {\n    api.saveProject(saveObj, token).subscribe(output => {\n      if (callback) {\n        AlertService.showAlert('Saved');\n        callback(output);\n      }\n    }, err => {\n      let message = '';\n      for (const key in err.error) {\n        if (err.error[key]) {\n          message += '\\n' + key;\n          for (const item of err.error[key]) {\n            message += `${item},`;\n          }\n        }\n      }\n      AlertService.showAlert(message);\n    });\n  }\n\n  /**\n   * Generate and return a random string\n   * @param length Length of random string\n   * @returns random string\n   */\n  static getRandomString(length) {\n    let result = '';\n    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n    const charactersLength = characters.length;\n    for (let i = 0; i < length; i++) {\n      result += characters.charAt(Math.floor(Math.random() *\n        charactersLength));\n    }\n    return result;\n  }\n\n}\n\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/UndoUtils.ts",
    "content": "import { Utils } from './Utils';\nimport { Workspace } from './Workspace';\nimport { isNull } from 'util';\n\ndeclare var window;\n\n/**\n * Abstract Class UndoUtils\n * Inherited to implement Undo & Redo Functionality\n */\nexport abstract class UndoUtils {\n\n    /**\n     * Boolean to disable undo/redo buttons for some time until circuit is loading\n     */\n    static enableButtonsBool = true;\n    /**\n     * Undo Stack\n     */\n    static undo = [];\n    /**\n     * Redo Stack\n     */\n    static redo = [];\n    /**\n     * Workspace changed\n     */\n    static event = new CustomEvent('changed', {\n        detail : {\n            changed: true,\n        }\n    });\n\n    /**\n     * Call this function to Undo\n     */\n    static workspaceUndo() {\n        if (this.undo.length > 0) {\n            const cng = this.undo.pop();\n            this.loadChange(cng, 'undo');\n        }\n    }\n\n    /**\n     * Call this function to Redo\n     */\n    static workspaceRedo() {\n        if (this.redo.length > 0) {\n            const cng = this.redo.pop();\n            this.loadChange(cng, 'redo');\n        }\n    }\n\n    /**\n     * Function to reset redo stack & push into undo stack\n     * @param ele event snapshot\n     */\n    static pushChangeToUndoAndReset(ele) {\n\n        // Empty Redo Stack\n        this.redo = [];\n\n        // This is used to save wires connected to element in case of delete event only\n        if (ele.event === 'delete') {\n            let step = 0;\n            const grup = window.scope[ele.keyName];\n            const temp = this.getExistingWindowElement(grup, ele);\n            for (const e in temp.nodes) {\n                if (temp.nodes[e].connectedTo) {\n                    const wire = temp.nodes[e].connectedTo;\n                    UndoUtils.pushChangeToUndo({ keyName: wire.keyName, element: wire.save(), event: 'delete' });\n                    step += 1;\n                }\n            }\n            if (ele.event === 'add' || ele.event === 'delete') {\n                UndoUtils.event.detail['ele'] = ele;\n                console.log(ele);\n                document.dispatchEvent(UndoUtils.event);\n            }\n            ele.step = step;\n            this.undo.push(ele);\n            return;\n        }\n        // If not delete continue to normal Undo Process\n        this.pushChangeToUndo(ele);\n    }\n\n    /**\n     * Function to push into redo stack\n     * @param ele event snapshot\n     */\n    static pushChangeToRedo(ele) {\n        this.redo.push(ele);\n    }\n\n    /**\n     * Function to push into undo stack\n     * @param ele event snapshot\n     */\n    static pushChangeToUndo(ele) {\n        // This is used to save wires connected to element in case of delete event only\n        if (ele.event === 'delete') {\n            let step = 0;\n            const grup = window.scope[ele.keyName];\n            const temp = this.getExistingWindowElement(grup, ele);\n            for (const e in temp.nodes) {\n                if (temp.nodes[e].connectedTo) {\n                    const wire = temp.nodes[e].connectedTo;\n                    UndoUtils.pushChangeToUndo({ keyName: wire.keyName, element: wire.save(), event: 'delete' });\n                    step += 1;\n                }\n            }\n            ele.step = step;\n        }\n        // Push to Undo stack\n        this.undo.push(ele);\n        if (ele.event === 'add' || ele.event === 'delete') {\n            UndoUtils.event.detail['ele'] = ele;\n            console.log(ele);\n            document.dispatchEvent(UndoUtils.event);\n        }\n    }\n\n    /**\n     * Load The Changes, Called after Undo and redo operation to process the event snapshot\n     * @param ele event snapshot\n     * @param operation undo/redo\n     */\n    static async loadChange(ele, operation) {\n        // All elements in window.scope with similar\n        const grup = window.scope[ele.keyName];\n\n        // Check if dragJson is present, & jump to next operation if both dx & dy are 0\n        if (ele.dragJson) {\n            if (ele.dragJson.dx === 0 && ele.dragJson.dy === 0) {\n                if (operation === 'undo') {\n                    this.workspaceUndo();\n                } else if (operation === 'redo') {\n                    this.workspaceRedo();\n                }\n                return;\n            }\n        }\n        if (ele.event === 'add' || ele.event === 'delete') {\n            UndoUtils.event.detail['ele'] = ele;\n            console.log(ele);\n            document.dispatchEvent(UndoUtils.event);\n        }\n\n        // handle Delete events\n        if (operation === 'undo' && ele.event === 'delete') {\n            UndoUtils.createElement(ele).then(res => {\n                // if (ele.keyName === 'BreadBoard') {\n                //     window['DragListeners'] = [];\n                //     window['DragStopListeners'] = [];\n                // }\n                for (let i = 0; i < ele.step; i++) {\n                    const chg = this.undo.pop();\n                    UndoUtils.createElement(chg);\n                }\n                UndoUtils.pushChangeToRedo({ keyName: ele.keyName, element: ele.element, event: ele.event, step: ele.step });\n            });\n            return;\n        } else if (operation === 'redo' && ele.event === 'delete') {\n            const temp = this.getExistingWindowElement(grup, ele);\n            window['Selected'] = temp;\n            Workspace.DeleteComponent(false);\n            return;\n        }\n\n        // handle auto-layout of wires\n        if (ele.event === 'layout' && operation === 'undo') {\n            const existing = this.getExistingWindowElement(grup, ele);\n            UndoUtils.pushChangeToRedo({ keyName: existing.keyName, element: existing.save(), event: ele.event, step: ele.step });\n            UndoUtils.removeElement(ele).then(res => {\n                UndoUtils.createElement(ele).then(result => {\n                    for (let i = 0; i < ele.step - 1; i++) {\n                        const chg = this.undo.pop();\n                        const innerExisting = this.getExistingWindowElement(grup, chg);\n                        const obj = { keyName: innerExisting.keyName, element: innerExisting.save(), event: chg.event, step: chg.step };\n                        UndoUtils.pushChangeToRedo(obj);\n                        UndoUtils.removeElement(chg).then(ress => {\n                            UndoUtils.createElement(chg);\n                        });\n                    }\n                });\n            });\n            return;\n        } else if (ele.event === 'layout' && operation === 'redo') {\n            const existing = this.getExistingWindowElement(grup, ele);\n            UndoUtils.pushChangeToUndo({ keyName: existing.keyName, element: existing.save(), event: ele.event, step: ele.step });\n            UndoUtils.removeElement(ele).then(res => {\n                UndoUtils.createElement(ele).then(result => {\n                    for (let i = 0; i < ele.step - 1; i++) {\n                        const chg = this.redo.pop();\n                        const innerExisting = this.getExistingWindowElement(grup, chg);\n                        const obj = { keyName: innerExisting.keyName, element: innerExisting.save(), event: chg.event, step: chg.step };\n                        UndoUtils.pushChangeToUndo(obj);\n                        UndoUtils.removeElement(chg).then(ress => {\n                            UndoUtils.createElement(chg);\n                        });\n                    }\n                });\n            });\n        }\n\n        if (ele.event === 'breadDrag' && operation === 'undo') {\n            UndoUtils.removeElement(ele).then(res => {\n                UndoUtils.workspaceUndo();\n            });\n            return;\n        }\n\n        // handle Wire change events like add & color change\n        if (ele.event === 'add' && operation === 'redo' && ele.keyName === 'wires') {\n            UndoUtils.pushChangeToUndo(ele);\n            UndoUtils.createElement(ele);\n            return;\n        } else if (ele.event === 'add' && operation === 'undo' && ele.keyName === 'wires') {\n            UndoUtils.pushChangeToRedo(ele);\n            UndoUtils.removeElement(ele);\n            return;\n        } else if (ele.event === 'wire_color' && operation === 'undo' && ele.keyName === 'wires') {\n            const temp = this.getExistingWindowElement(grup, ele);\n            UndoUtils.pushChangeToRedo({ keyName: ele.keyName, element: temp.save(), event: ele.event });\n            temp.setColor(ele.element.color);\n            return;\n        } else if (ele.event === 'wire_color' && operation === 'redo' && ele.keyName === 'wires') {\n            const temp = this.getExistingWindowElement(grup, ele);\n            UndoUtils.pushChangeToUndo({ keyName: ele.keyName, element: temp.save(), event: ele.event });\n            temp.setColor(ele.element.color);\n            return;\n        }\n\n        // Only trigger if there is nothing in scope | is empty\n        if (grup.length <= 0) {\n            window['scope'][ele.keyName] = [];\n            if (ele.event === 'add' && operation === 'redo') {\n                UndoUtils.createElement(ele).then(done => {\n                    if (ele.keyName === 'BreadBoard') {\n                        // window['DragListeners'].splice(0, 1)\n                        // window['DragStopListeners'].splice(0, 1)\n                    }\n                });\n                UndoUtils.pushChangeToUndo({ keyName: ele.keyName, element: window.scope[ele.keyName][0].save(), event: ele.event });\n            }\n        }\n\n        // Trigger if window.scope is not empty\n        for (const e in grup) {\n            if (grup[e].id === ele.element.id) {\n                if (window.scope[ele.keyName][e].load) {\n                    // Push to Undo/Redo stack\n                    if (operation === 'undo') {\n                        const obj = {\n                            keyName: ele.keyName,\n                            element: window.scope[ele.keyName][e].save(),\n                            event: ele.event,\n                            dragJson: ele.dragJson\n                        };\n                        UndoUtils.pushChangeToRedo(obj);\n                    } else if (operation === 'redo') {\n                        const obj = {\n                            keyName: ele.keyName,\n                            element: window.scope[ele.keyName][e].save(),\n                            event: ele.event,\n                            dragJson: ele.dragJson\n                        };\n                        UndoUtils.pushChangeToUndo(obj);\n                    }\n                    // handle Add events\n                    if (ele.event === 'add' && operation === 'undo') {\n                        UndoUtils.removeElement(ele);\n                        return;\n                    } else if (ele.event === 'add' && operation === 'redo') {\n                        UndoUtils.createElement(ele);\n                        UndoUtils.removeElement(ele);\n                    } else if (ele.event === 'drag') {\n                        // TODO: handle element Drag events\n                        const existing = this.getExistingWindowElement(grup, ele);\n                        if (operation === 'undo') {\n                            if (ele.keyName === 'BreadBoard') {\n                                existing.transformBoardPosition(-ele.dragJson.dx, -ele.dragJson.dy);\n                            } else {\n                                existing.transformPosition(-ele.dragJson.dx, -ele.dragJson.dy);\n                            }\n                        } else {\n                            if (ele.keyName !== 'BreadBoard') {\n                                existing.transformPosition(ele.dragJson.dx, ele.dragJson.dy);\n                                Workspace.onDragEvent(existing);\n                                Workspace.onDragStopEvent(existing);\n                            } else {\n                                existing.transformBoardPosition(ele.dragJson.dx, ele.dragJson.dy);\n                            }\n                        }\n                        for (const ec in window.scope['wires']) {\n                            if (window.scope['wires'].hasOwnProperty(ec)) {\n                                window.scope['wires'][ec].update();\n                            }\n                        }\n                    } else {\n                        // TODO: Handle all other events which weren't handled before\n                        // Create Element with dump of ele\n                        UndoUtils.createElement(ele).then(createdEle => {\n                            // Remove existing Element\n                            UndoUtils.removeElement(ele).then(done => {\n                                // Remove drag listeners if element is a breadboard\n                                if (ele.keyName === 'BreadBoard') {\n                                    // window['DragListeners'].splice(0, 1)\n                                    // window['DragStopListeners'].splice(0, 1)\n                                }\n                            });\n                        });\n                    }\n\n                }\n            }\n        }\n    }\n\n    /**\n     * Used to get the existing element in window.scope\n     * @param grup window.scope['element_name']\n     * @param ele event snapshot\n     * @returns already present element in window.scope\n     */\n    static getExistingWindowElement(grup, ele) {\n        for (const e in grup) {\n            if (grup[e].id === ele.element.id) {\n                if (window.scope[ele.keyName][e].load) {\n                    return window.scope[ele.keyName][e];\n                }\n            }\n        }\n    }\n\n    /**\n     * create element again using its snapshot\n     * @param ele element snapshot\n     * @returns Promise\n     */\n    static createElement(ele) {\n        return new Promise((resolve, reject) => {\n            window.queue = 0;\n\n            const comp = ele.element;\n            const key = ele.keyName;\n\n            if (key === 'wires') {\n                Workspace.LoadWires([ele.element], true, true);\n                // resolve\n                resolve(true);\n            }\n\n            // Get class from keyname using the map\n            const myClass = Utils.components[key].className;\n            // Create Component Object from class\n            const obj = new myClass(\n                window['canvas'],\n                comp.x,\n                comp.y\n            );\n            window.queue += 1;\n            // Add to scope\n            window['scope'][key].push(obj);\n            // Load data for each object\n            if (obj.load) {\n                obj.load(comp);\n            }\n            // Wait until all components are drawn\n            const interval = setInterval(() => {\n                if (window.queue === 0) {\n                    clearInterval(interval);\n                    // resolve when done\n                    resolve(obj);\n                    // Hide loading animation\n                } else {\n                    // resolve anyways\n                    // resolve(obj)\n                }\n            }, 100);\n\n        });\n    }\n\n    /**\n     * Remove and element from workspace using linear search\n     * @param key Key of elements to delete\n     * @param uid Id of element to delete\n     * @returns Promise\n     */\n    static removeElement(ele) {\n        return new Promise((resolve, reject) => {\n            const key = ele.keyName;\n            const uid = ele.element.id;\n            // get existing element that is to be removed\n            const toRem = this.getExistingWindowElement(window.scope[key], ele);\n\n            // If Current Selected item is a Wire which is not Connected from both end\n            if (key === 'wires') {\n                if (isNull(ele.element.end)) {\n                    // Remove and deselect\n                    toRem.remove();\n                }\n                // make selected variables null\n                window.Selected = null;\n                window.isSelected = false;\n            }\n            // If BreadBoard remove draglistners too\n            if (key === 'BreadBoard') {\n                for (const i in window['DragListeners']) {\n                    if (window['DragListeners'].hasOwnProperty(i)) {\n                        const itrFn = window['DragListeners'][i];\n                        if (itrFn.id === toRem.id) {\n                            window['DragListeners'].splice(i, 1);\n                        }\n                    }\n                }\n                for (const i in window['DragStopListeners']) {\n                    if (window['DragStopListeners'].hasOwnProperty(i)) {\n                        const itrFn = window['DragStopListeners'][i];\n                        if (itrFn.id === toRem.id) {\n                            window['DragStopListeners'].splice(i, 1);\n                        }\n                    }\n                }\n            }\n\n            // get the component keyname\n            const items = window.scope[key];\n\n            // Use linear search find the element\n            for (let i = 0; i < items.length; ++i) {\n                if (items[i].id === uid) {\n                    // remove from DOM\n                    items[i].remove();\n                    // Remove from scope\n                    const k = items.splice(i, 1);\n                    // Remove data from it recursively\n                    Workspace.removeMeta(k[0]);\n\n                    if (key !== 'wires') {\n                        let index = 0;\n                        while (index < window.scope.wires.length) {\n                            const wire = window.scope.wires[index];\n                            if (isNull(wire.start) && isNull(wire.end)) {\n                                window.scope.wires.splice(index, 1);\n                                continue;\n                            }\n                            ++index;\n                        }\n                    }\n\n                    break;\n                }\n            }\n            window.hideProperties();\n            resolve(true);\n        });\n    }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/Utils.ts",
    "content": "import { Buzzer } from './outputs/Buzzer';\nimport { Battery9v, CoinCell } from './Battery';\nimport { PushButton, SlideSwitch } from './inputs/Buttons';\nimport { ArduinoUno } from './outputs/Arduino';\nimport { LED, RGBLED } from './outputs/Led';\nimport { UltrasonicSensor } from './inputs/UltrasonicSensor';\nimport { PIRSensor } from './inputs/PIRSensor';\nimport { Motor, L298N, ServoMotor } from './outputs/Motors';\nimport { LCD16X2, SevenSegment } from './outputs/Display';\nimport { Label } from './Miscellaneous';\nimport { PhotoResistor } from './inputs/PhotoResistor';\nimport { TMP36 } from './inputs/TemperatureSensors';\nimport { Potentiometer } from './inputs/Potentiometer';\nimport { Relay } from './inputs/Relay';\nimport { MQ2 } from './inputs/GasSensor';\nimport { Resistor, BreadBoard } from './General';\nimport { L293D } from './drivers/L293D';\nimport { Thermistor } from './inputs/Thermistor';\n\n/**\n * Utils class\n * Contains All components with their section\n */\nexport class Utils {\n  /**\n   * Stores an object required by the Side Component Panel\n   */\n  static componentBox = {\n    input: [\n      ['PushButton', 'UltrasonicSensor', 'PIRSensor'], // Row\n      ['SlideSwitch', 'MQ2', 'TMP36'],\n      ['PotentioMeter', 'PhotoResistor', 'Thermistor']\n    ],\n    power: [\n      ['Battery9v', 'CoinCell'] // Row\n    ],\n    controllers: [\n      ['ArduinoUno'] // Row\n    ],\n    output: [\n      ['Buzzer', 'LED', 'Motor'], // Row\n      ['RGBLED', 'ServoMotor', 'SevenSegment'],\n      ['LCD16X2']\n    ],\n    drivers: [\n      ['L298N', 'L293D']\n    ],\n    misc: [\n      ['Label', 'RelayModule']\n    ],\n    general: [\n      ['Resistor', 'BreadBoard']\n    ]\n  };\n\n  /** Components with thier name, image, classname */\n  static components = {\n    BreadBoard: {\n      name: 'BreadBoard',\n      image: './assets/images/components/Breadboard.svg',\n      className: BreadBoard\n    },\n    Resistor: {\n      name: 'Resistor',\n      image: './assets/images/components/Resistor.png',\n      className: Resistor\n    },\n    RGBLED: {\n      name: 'RGB LED',\n      image: './assets/images/components/RGBLED.png',\n      className: RGBLED\n    },\n    SevenSegment: {\n      name: 'Seven Segment Display',\n      image: './assets/images/components/SevenSegment.png',\n      className: SevenSegment\n    },\n    MQ2: {\n      name: 'Gas Sensor MQ2',\n      image: './assets/images/components/GasSensor.svg',\n      className: MQ2\n    },\n    ServoMotor: {\n      name: 'Servo Motor',\n      image: './assets/images/components/Servo.png',\n      className: ServoMotor\n    },\n    RelayModule: {\n      name: 'Relay Module',\n      image: './assets/images/components/1ChannelRelay.svg',\n      className: Relay\n    },\n    PotentioMeter: {\n      name: 'Potentiometer',\n      image: './assets/images/components/Potentiometer.png',\n      className: Potentiometer\n    },\n    TMP36: {\n      name: 'Temperature Sensor TMP36',\n      image: './assets/images/components/TMP36.svg',\n      className: TMP36\n    },\n    PhotoResistor: {\n      name: 'Photo Resistor',\n      image: './assets/images/components/PhotoResistor.svg',\n      className: PhotoResistor\n    },\n    Label: {\n      name: 'Label',\n      image: './assets/images/components/Text.png',\n      className: Label\n    },\n    CoinCell: {\n      name: 'Coin Cell 3V',\n      image: './assets/images/components/CoinCell.svg',\n      className: CoinCell\n    },\n    SlideSwitch: {\n      name: 'Slide Switch',\n      image: './assets/images/components/SlideSwitch.png',\n      className: SlideSwitch\n    },\n    LCD16X2: {\n      name: 'LCD 16x2',\n      image: './assets/images/components/LCD16X2.png',\n      className: LCD16X2\n    },\n    L298N: {\n      name: 'Motor Driver L298N',\n      image: './assets/images/components/L298N.png',\n      className: L298N\n    },\n    Motor: {\n      name: 'Motor',\n      image: './assets/images/components/Motor.png',\n      className: Motor\n    },\n    PIRSensor: {\n      name: 'PIR Sensor',\n      image: './assets/images/components/PIRSensor.png',\n      className: PIRSensor\n    },\n    UltrasonicSensor: {\n      name: 'Ultrasonic Distance Sensor',\n      image: './assets/images/components/UltrasonicSensor.png',\n      className: UltrasonicSensor\n    },\n    LED: {\n      name: 'LED',\n      image: './assets/images/components/led.png',\n      className: LED\n    },\n    ArduinoUno: {\n      name: 'Arduino UNO',\n      image: './assets/images/components/ArduinoUno.png',\n      className: ArduinoUno\n    },\n    PushButton: {\n      name: 'Push Button',\n      image: './assets/images/components/PushButton.png',\n      className: PushButton\n    },\n    Battery9v: {\n      name: '9v Battery',\n      image: './assets/images/components/Battery9v.png',\n      className: Battery9v\n    },\n    Buzzer: {\n      name: 'Buzzer',\n      image: './assets/images/components/Buzzer.png',\n      className: Buzzer\n    },\n    L293D: {\n      name: 'L293D',\n      image: './assets/images/components/L293D.png',\n      className: L293D\n    },\n    Thermistor: {\n      name: 'Thermistor',\n      image: './assets/images/components/Thermistor.png',\n      className: Thermistor\n    }\n  };\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/Wire.ts",
    "content": "import { Point } from './Point';\nimport _ from 'lodash';\nimport { UndoUtils } from './UndoUtils';\n\n/**\n * To prevent window from throwing error\n */\ndeclare let window;\n/**\n * Class for Wire\n */\nexport class Wire {\n  /**\n   * Keyname require for mapping\n   */\n  keyName = 'wires';\n  /**\n   * Stores array of position [x,y]\n   */\n  points: number[][] = [];\n  /**\n   * Store the Raphael elements of the joints\n   */\n  joints: any[] = [];\n  /**\n   * End circuit node of wire\n   */\n  end: Point = null;\n  /**\n   * Body of the wire\n   */\n  element: any;\n  /**\n   * Color of the wire\n   */\n  color: any = '#000';\n  /**\n   * Store the glows on Hover\n   */\n  glows: any[] = [];\n  /**\n   * Id of the Wire\n   */\n  id: number;\n  /**\n   * Temporary point (which was used to draw perpendicular last time) of the wire while in drawing status\n   */\n  lastTempPoint: [number, number];\n\n  /**\n   * Constructor of wire\n   * @param canvas Raphael Canvas / paper\n   * @param start Start circuit node of wire\n   */\n  constructor(public canvas, public start: Point, public existingId = null) {\n    if (existingId) {\n      this.id = existingId;\n    } else {\n      this.id = this.getUniqueId(Date.now());\n    }\n\n    // insert the position of start node in array\n    this.points.push(start.position());\n  }\n\n  /**\n   * Recursive function to check if id is already present.\n   * If present then return a new unique id\n   * @param id current id\n   * @returns id number\n   */\n  getUniqueId(id): number {\n    for (const e in window.scope) {\n      if (window.scope.hasOwnProperty(e)) {\n        for (const i in window.scope[e]) {\n          if (window.scope[e][i].id === id) {\n            return this.getUniqueId(Date.now() + Math.floor(Math.random() * 1000000));\n          }\n        }\n      }\n    }\n    return id;\n  }\n  /**\n   * Creates path element for the wire\n   * @param element canvas element\n   */\n  createElement(element) {\n    if (this.element) {\n      this.removeGlows();\n      this.element.remove();\n    }\n\n    this.element = element;\n    this.element.attr({ 'stroke-linecap': 'round', 'stroke-linejoin': 'round', 'stroke-width': '4', stroke: this.color });\n\n    this.element.mouseover(() => {\n      // only glow if the wire has a start and an end\n      if (this.start && this.end) {\n        this.glows.push(\n          this.element.glow({\n            color: this.color\n          })\n        );\n      }\n    });\n\n    this.element.mouseout(() => {\n      this.removeGlows();\n    });\n\n    // set click listener\n    this.element.click(() => {\n      this.handleClick();\n    });\n  }\n  /**\n   * Adds a new coordinate (x, y) to the wire\n   * @param x x-coordinate of cursor\n   * @param y y-coordinate of cursor\n   * @param isPerpendicular is the point to be drawn perpendicular\n   */\n  addPoint(x: number, y: number, isPerpendicular = false, index?) {\n    let newX = x;\n    let newY = y;\n\n    if (isPerpendicular) {\n      const n = this.points.length;\n      const [previousX, previousY] = this.points[n - 1];\n      [newX, newY] = this.getPerpendicularXY(x, y, previousX, previousY);\n    }\n\n    this.add(newX, newY, index);\n\n    // draw the line from the previous point to cursor's current position\n    if (isPerpendicular) {\n      this.drawPerpendicular(x, y);\n    } else {\n      this.draw(x, y);\n    }\n  }\n\n  /**\n   * Removes all the intermediate points from the wire path\n   */\n  removeAllMiddlePoints() {\n    for (let i = this.points.length; i > 0; i--) {\n      this.removeJoint(i);\n    }\n    this.points = [this.points[0], this.points[this.points.length - 1]];\n  }\n\n  /**\n   * Makes the current temporary line perpendicular depending on current x and y\n   * @param toggle: true to draw perpendicular line upto current cursor's position\n   * false to undo the current perpendicular status\n   */\n  togglePerpendicularLine(toggle: boolean) {\n    const currentPathAttrs = this.element.attrs.path;\n    const n = currentPathAttrs.length;\n    const [x, y] = currentPathAttrs[n - 1].slice(1);\n\n    let newX = null;\n    let newY = null;\n\n    if (toggle) {\n      // if toggle is true, draw perpendicular lines\n      const [previousX, previousY] = currentPathAttrs[n - 2].slice(1);\n      [newX, newY] = this.getPerpendicularXY(x, y, previousX, previousY);\n    } else {\n      [newX, newY] = this.lastTempPoint;\n    }\n\n    this.drawWire(newX, newY);\n  }\n\n  /**\n   * draws perpendicular lines based on current x, y coordinates\n   * @param x x-coordinate of cursor\n   * @param y y-coordinate of cursor\n   */\n  drawPerpendicular(x: number, y: number) {\n    this.lastTempPoint = [x, y];\n    const n = this.points.length;\n    const [previousX, previousY] = this.points[n - 1];\n    const [newX, newY] = this.getPerpendicularXY(x, y, previousX, previousY);\n    this.drawWire(newX, newY);\n  }\n\n  /**\n   * Draws wire to (x, y)\n   * @param x x-coordinate\n   * @param y y-coordiante\n   */\n  draw(x: number, y: number) {\n    this.lastTempPoint = [x, y];\n    this.drawWire(x, y);\n  }\n\n  /**\n   * Returns x, y for perpendicular lines\n   * @param x current x-coordinate\n   * @param y current y-coordinate\n   * @param previousX previous x-coordinate\n   * @param previousY previous y-coordinate\n   */\n  private getPerpendicularXY(x: number, y: number, previousX: number, previousY: number) {\n    const delX = Math.abs(x - previousX);\n    const delY = Math.abs(y - previousY);\n    return (delX > delY) ? [x, previousY] : [previousX, y];\n  }\n\n  /**\n   * updates the path of the wire\n   * @param newPath new path of the wire\n   */\n  private updateWirePath(newPath: string) {\n    if (this.element) {\n      // only update the path if the new path is different\n      if (this.element.attrs.path.toString() !== newPath) {\n        this.element.attr('path', newPath);\n      }\n    } else {\n      this.createElement(this.canvas.path(newPath));\n    }\n  }\n\n  /**\n   *  Draws wire on the canvas\n   * @param x x position of point to be added\n   * @param y y position of point to be added\n   */\n  private drawWire(x?: number, y?: number) {\n    let path = `M${this.points[0][0]},${this.points[0][1]}`;\n    // Draw lines to other points\n    for (let i = 1; i < this.points.length; ++i) {\n      path += `L${this.points[i][0]},${this.points[i][1]}`;\n    }\n\n    if (x && y) {\n      path += `L${x},${y}`;\n    }\n\n    // Update path\n    this.updateWirePath(path);\n  }\n\n  /**\n   * Add a point to wire\n   * @param x x position\n   * @param y y position\n   */\n  private add(x: number, y: number, index?) {\n    if (index) {\n      // insert the point [x, y] at the index and create joint\n      this.points.splice(index, 0, [x, y]);\n      this.createJoint(index, true);\n    } else {\n      // else, insert at the end\n      this.points.push([x, y]);\n    }\n  }\n  /**\n   * Handle click on Wire\n   */\n  handleClick() {\n    // If Current Selected item is wire then deselect it\n    if (window['Selected'] && (window['Selected'] instanceof Wire)) {\n      window['Selected'].deselect();\n    }\n\n    // Show all joints\n    for (const joint of this.joints) {\n      joint.show();\n    }\n\n    // Select current instance\n    window['isSelected'] = true;\n    window['Selected'] = this;\n\n    // Show properties\n    window.showProperty(() => {\n      return this.properties();\n    });\n  }\n\n  /**\n   * Set Color of the wire\n   * @param color color of the wire\n   */\n  setColor(color: string) {\n    this.color = color;\n    this.element.attr({ stroke: color }); // set attribute\n    // Update the color of joints\n    for (const joint of this.joints) {\n      joint.attr({ fill: color, stroke: color });\n    }\n  }\n\n  /**\n   * Return Properties of wire\n   */\n  properties() {\n    // Create div and insert options form color\n    const body = document.createElement('div');\n    body.innerHTML = '<label>Color:</label><br>';\n    const select = document.createElement('select');\n    select.innerHTML = `<option style=\"color:#000;\">Black</option>\n                        <option style=\"color:#ff0000;\">Red</option>\n                        <option style=\"color:#e6a800;\">Yellow</option>\n                        <option style=\"color:#2593fa;\">Blue</option>\n                        <option style=\"color:#31c404;\">Green</option>\n                        <option style=\"color:#FF5733;\">Orange</option>\n                        <option style=\"color:#30D5C8;\">Turquoise</option>\n                        <option style=\"color:#800080;\">Purple</option>\n                        <option style=\"color:#FF00FF;\">Pink</option>\n                        <option style=\"color:#964B00;\">Brown</option>\n                        <option style=\"color:#696969;\">Grey</option>\n                        `;\n    const colors = ['#000',\n                    '#ff0000',\n                    '#e6a800',\n                    '#2593fa',\n                    '#31c404',\n                    '#FF5733',\n                    '#30D5C8',\n                    '#800080',\n                    '#FF00FF',\n                    '#964B00',\n                    '#696969'\n                  ];\n    // set the current color\n    for (let i = 0; i < colors.length; ++i) {\n      if (colors[i] === this.color) {\n        select.selectedIndex = i;\n      }\n    }\n    // set on change listener\n    select.onchange = () => {\n      // Push dump to Undo stack & Reset\n      UndoUtils.pushChangeToUndoAndReset({ keyName: this.keyName, element: this.save(), event: 'wire_color' });\n      this.setColor(colors[select.selectedIndex]);\n    };\n\n    body.append(select);\n    return {\n      title: 'Wire',\n      keyName: this.keyName,\n      id: this.id,\n      body\n    };\n  }\n\n  /**\n   * Function to connect wire with the node\n   * @param t End point / END circuit node\n   * @param removeLast remove previously inserted item\n   */\n  connect(t: Point, removeLast: boolean = false, hideJoint: boolean = false, pushUndo = false, undoEvtType = 'add') {\n    // if remove last then pop from array\n    if (removeLast && this.points.length > 1) {\n      this.points.pop();\n    }\n    // change the end letiable\n    this.end = t;\n    // insert the end position\n    this.points.push(t.position());\n\n    if (this.points.length > 2) {\n      // For each point in the wire except first and last\n      for (let i = 1; i < this.points.length - 1; ++i) {\n        // Create a Joint\n        this.createJoint(i, hideJoint);\n      }\n    }\n    // Update Wire\n    this.update();\n    // Push dump to Undo stack, only if pushUndo is false\n    if (!pushUndo) {\n      UndoUtils.pushChangeToUndoAndReset({ keyName: this.keyName, element: this.save(), event: undoEvtType });\n    }\n    if (undoEvtType === 'breadDrag') {\n      UndoUtils.pushChangeToUndo({ keyName: this.keyName, element: this.save(), event: undoEvtType });\n    }\n  }\n\n  /**\n   * Removes joint present at the point at index `pointIndex`\n   * @param pointIndex: index of the point whose joint needs to be removed\n   */\n  removeJoint(pointIndex: number) {\n    const jointIndex = pointIndex - 1;\n    const joint = this.joints[jointIndex];\n    if (joint) {\n      joint.remove();\n      this.joints.splice(jointIndex, 1);\n    }\n  }\n\n  /**\n   * Creates joint at the index `pointIndex`\n   * @param pointIndex index of the point\n   * @param hideJoint hide the joint?\n   */\n  createJoint(pointIndex: number, hideJoint: boolean = false) {\n    const joint = this.canvas.circle(this.points[pointIndex][0], this.points[pointIndex][1], 6);\n    joint.attr({ fill: this.color, stroke: this.color });  // Give the joint a Color\n    // Variables used while dragging joints\n    let tmpx;\n    let tmpy;\n    // set drag listener\n    joint.drag((dx, dy) => {\n      // Update joints position\n      joint.attr({ cx: tmpx + dx, cy: tmpy + dy });\n      // Update repective Point\n      this.points[pointIndex] = [tmpx + dx, tmpy + dy];\n      // Update the wire\n      this.update();\n    }, () => {\n      // Get the Joints center\n      const jointAttr = joint.attr();\n      tmpx = jointAttr.cx;\n      tmpy = jointAttr.cy;\n    }, () => {\n    });\n    this.joints.push(joint);\n    // Hide joint if required\n    if (hideJoint) {\n      joint.hide();\n    }\n  }\n\n  /**\n   * Returns true if both end of wire is connected\n   */\n  isConnected() {\n    return (this.start !== null && this.end !== null);\n  }\n  /**\n   * Update the wire position if the parent element is changed\n   */\n  update() {\n    // check if both start and end node are present\n    if (this.end && this.start) {\n      // Update the start and ending position\n      this.points[0] = this.start.position();\n      this.points[this.points.length - 1] = this.end.position();\n      this.drawWire();\n      return true;\n    }\n    return false;\n  }\n  /**\n   * Callback called after the wire is deselect\n   */\n  deselect() {\n    for (const joint of this.joints) {\n      joint.hide();\n    }\n  }\n  /**\n   * Return save object for the wire\n   */\n  save() {\n    return {\n      // object contains points,color,start point(id,keyname),end point(id,keybame)\n      id: this.id,\n      points: this.points,\n      color: this.color,\n      start: {\n        id: this.start.parent.id,\n        keyName: this.start.parent.keyName,\n        pid: this.start.id,\n        isSoldered: this.start.isSoldered()\n      },\n      end: {\n        id: this.end.parent.id,\n        keyName: this.end.parent.keyName,\n        pid: this.end.id,\n        isSoldered: this.end.isSoldered()\n      }\n    };\n  }\n  /**\n   * Load data from saved object\n   * @param data Saved object\n   */\n  load(data) {\n    this.color = data.color;\n    this.points = data.points;\n    if (data.start.isSoldered) {\n      this.start.solderWire();\n    }\n    if (data.end.isSoldered) {\n      this.end.solderWire();\n    }\n  }\n  /**\n   * Remove Glow of Wire\n   */\n  private removeGlows() {\n    if (this.glows) {\n      while (this.glows.length !== 0) {\n        this.glows.pop().remove();\n      }\n    }\n  }\n  /**\n   * Remove wire from canvas\n   */\n  remove() {\n    // Remove Joint\n    for (const joint of this.joints) {\n      joint.remove();\n    }\n    // Remove Glow\n    this.removeGlows();\n    // Clear Joints\n    this.joints = null;\n    // Clear Points\n    this.points = null;\n    // Remove element from dom\n    this.element.remove();\n    // Clear connection from start node\n    if (this.start) {\n      this.start.disconnect();\n    }\n    // Clear connection from end node\n    if (this.end) {\n      this.end.disconnect();\n    }\n    this.start = null;\n    this.end = null;\n    this.element = null;\n  }\n\n  /**\n   * Removes the wire from window.scope and canvas\n   */\n  delete() {\n    _.remove(window.scope.wires, wire => wire === this);\n    this.remove();\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/Workspace.ts",
    "content": "import { Utils } from './Utils';\nimport { Wire } from './Wire';\nimport { ArduinoUno } from './outputs/Arduino';\nimport { ApiService } from '../api.service';\nimport { Download, ImageType } from './Download';\nimport { isNull, isUndefined } from 'util';\nimport { SaveOffline } from './SaveOffiline';\nimport { Point } from './Point';\nimport { UndoUtils } from './UndoUtils';\nimport { EventEmitter } from '@angular/core';\n\n/**\n * Declare window so that custom created function don't throw error\n */\ndeclare var window;\n\n// Enum function for Colour values to print in console\nexport enum ConsoleType { INFO, WARN, ERROR, OUTPUT }\n/**\n * This class contains all Workspace related functions.\n */\nexport class Workspace {\n  /**\n   * The Worspace Translation x value\n   */\n  static translateX = 0.0;\n  /**\n   * The Worspace Translation y value\n   */\n  static translateY = 0.0;\n  /**\n   * Stores scaling factor value for zoom in/out\n   */\n  static scale = 1.0;\n  /**\n   * zoomin/out increments by 0.01\n   */\n  static readonly zooomIncrement = 0.01;\n  /**\n   * Translation Rate while holding and moving canvas\n   */\n  static readonly translateRate = 0.25;\n  /**\n   * tores initial position values for x and y\n   */\n  static moveCanvas = {\n    x: 0,\n    y: 0,\n    start: false\n  };\n  /**\n   * Stores value of copied component\n   */\n  static copiedItem: any;\n  /**\n   * If simulation is on progress or not\n   */\n  static simulating = false;\n  /**\n   * If circuit is loaded or not\n   */\n  static circuitLoaded = false;\n  static circuitLoadStatus: EventEmitter<boolean> = new EventEmitter<boolean>();\n  static simulationStopped: EventEmitter<boolean> = new EventEmitter<boolean>();\n  static simulationStarted: EventEmitter<boolean> = new EventEmitter<boolean>();\n  /** function to zoom in workspace */\n  static zoomIn() {\n    Workspace.scale = Math.min(10, Workspace.scale + Workspace.zooomIncrement);\n    Workspace.scale = Math.min(10, Workspace.scale + Workspace.zooomIncrement);\n    const ele = (window['canvas'].canvas as HTMLElement);\n    ele.setAttribute('transform', `scale(\n      ${Workspace.scale},\n      ${Workspace.scale})\n      translate(${Workspace.translateX},\n      ${Workspace.translateY})`);\n    Workspace.updateWires();\n  }\n\n  /** function to zoom out workspace */\n  static zoomOut() {\n    Workspace.scale = Math.max(0.1, Workspace.scale - Workspace.zooomIncrement);\n    Workspace.scale = Math.max(0.1, Workspace.scale - Workspace.zooomIncrement);\n    const ele = (window['canvas'].canvas as HTMLElement);\n    ele.setAttribute('transform', `scale(\n      ${Workspace.scale},\n      ${Workspace.scale})\n      translate(${Workspace.translateX},\n      ${Workspace.translateY})`);\n    Workspace.updateWires();\n  }\n\n  /** Function deals with min and max value of zoom, hold and move  */\n  static minMax(min: number, max: number, value: number) {\n    if (value < min) {\n      return min;\n    }\n    if (value > max) {\n      return max;\n    }\n    return value;\n  }\n  /**\n   * Initialize Global Variables\n   * @param canvas Raphael Paper (Canvas)\n   */\n  static initalizeGlobalVariables(canvas: any) {\n    Workspace.simulating = false;\n    Workspace.copiedItem = null;\n    Workspace.moveCanvas = {\n      x: 0, y: 0, start: false\n    };\n    Workspace.scale = 1.0;\n    Workspace.translateY = 0.0;\n    Workspace.translateX = 0.0;\n    window['canvas'] = canvas;\n    window['holder'] = document.getElementById('holder').getBoundingClientRect();\n    window['holder_svg'] = document.querySelector('#holder > svg');\n    window['ArduinoUno_name'] = {};\n    window.scope = null;\n    // Stores all the Circuit Information\n    window['scope'] = {\n      wires: []\n    };\n    for (const key in Utils.components) {\n      if (window['scope'][key] === null || window['scope'][key] === undefined) {\n        window['scope'][key] = [];\n      }\n    }\n    // Default programming language is Arduino\n    window['progLang'] = 0;\n    // True when simulation takes place\n    window['isSimulating'] = false;\n    // Stores the reference to the selected circuit component\n    window['Selected'] = null;\n    // True when a component is selected\n    window['isSelected'] = false;\n    // Intialize a variable for Property Box\n    window['property_box'] = {\n      x: 0,\n      y: 0,\n      element: document.getElementById('propertybox'),\n      title: document.querySelector('#propertybox .title'),\n      body: document.querySelector('#propertybox .body'),\n      mousedown: false\n    };\n    window['DragListeners'] = [];\n    window['DragStopListeners'] = [];\n\n    window['onDragEvent'] = Workspace.onDragEvent;\n    window['onDragStopEvent'] = Workspace.onDragStopEvent;\n  }\n\n  /**\n   * Handler for drag stop event\n   */\n  static onDragStopEvent(element) {\n    for (const fn of window.DragStopListeners) {\n      fn.fn(element);\n    }\n  }\n\n  /**\n   * Handler for drag event\n   */\n  static onDragEvent(element) {\n    for (const fn of window.DragListeners) {\n      fn.fn(element);\n    }\n  }\n\n  /**\n   * Subscribes to drag event of element in the workspace\n   * @param fn listener function\n   */\n  static subsribeToDrag(fn) {\n    window['DragListeners'].push(fn);\n  }\n\n  /**\n   * Subscribes to drag stop event of element in the workspace\n   * @param fn listener function\n   */\n  static subsribeToDragStop(fn) {\n    window['DragStopListeners'].push(fn);\n  }\n\n  /**\n   * Initialize Property Box\n   * @param toggle Callback For Property Box\n   */\n  static initProperty(toggle: (state: boolean) => void) {\n    // Global Function to Show Properties of Circuit Component\n    window['showProperty'] = (callback: any) => {\n      const data = callback();\n      window['property_box'].element.setAttribute('key', data.keyName);\n      window['property_box'].title.innerText = data.title;\n      window['property_box'].body.innerHTML = '';\n      window['property_box'].body.appendChild(data.body);\n      toggle(false);\n    };\n    // Global Function to Hide Properties of Circuit Component\n    window['hideProperties'] = () => {\n      if (window.Selected && window.Selected.deselect) {\n        window.Selected.deselect();\n      }\n      window['Selected'] = null;\n      window['isSelected'] = false;\n      window['property_box'].body.innerHTML = '';\n      window['property_box'].title.innerText = 'Project Info';\n      toggle(true);\n    };\n  }\n  /**\n   * Initialize Global Functions\n   */\n  static initializeGlobalFunctions() {\n    // Global Function to show Popup Bubble\n    window['showBubble'] = (label: string, x: number, y: number) => {\n      // id label is empty don't show anything\n      if (label === '') { return; }\n      const ele = document.getElementById('bubblebox');\n      ele.innerText = label;\n      ele.style.display = 'block';\n      ele.style.top = `${y + 25}px`;\n      ele.style.left = `${(x - ele.clientWidth / 2)}px`;\n    };\n    // Global Function to hide Popub Bubble\n    window['hideBubble'] = () => {\n      const ele = document.getElementById('bubblebox');\n      ele.style.display = 'none';\n    };\n    // Global Function to show Toast Message\n    window['showToast'] = (message: string) => {\n      const ele = document.getElementById('ToastMessage');\n\n      ele.style.display = 'block';\n      ele.innerText = message;\n      ele.style.padding = '15px 25px 15px 25px';\n      setTimeout(() => {\n        ele.style.display = 'none';\n      }, 10000);\n\n    };\n    // Global Function to print output in Console\n    window['printConsole'] = (textmsg: string, type: ConsoleType) => {\n      const msg = document.getElementById('msg');\n      const container = document.createElement('label');\n      container.innerText = textmsg;\n      //  checks which type of output needs to be printed\n      //  depending on which the colour is assigned\n      if (type === ConsoleType.ERROR) {\n        container.style.color = 'red';\n      } else if (type === ConsoleType.WARN) {\n        container.style.color = 'yellow';\n      } else if (type === ConsoleType.INFO) {\n        container.style.color = 'white';\n      } else if (type === ConsoleType.OUTPUT) {\n        container.style.color = '#03fc6b';\n      }\n      msg.appendChild(container);\n    };\n  }\n  /**\n   * Before Unload Event Handler\n   * @param event Before Unload Event\n   */\n  static BeforeUnload(event) {\n    event.preventDefault();\n    event.returnValue = 'did you save the stuff?';\n  }\n  /**\n   * Event Listener for mousemove on html body\n   * @param event Mouse Event\n   */\n  static bodyMouseMove(event: MouseEvent) {\n    if (Workspace.moveCanvas.start) {\n      const dx = (event.clientX - Workspace.moveCanvas.x) * Workspace.translateRate;\n      const dy = (event.clientY - Workspace.moveCanvas.y) * Workspace.translateRate;\n      const ele = (window['canvas'].canvas as HTMLElement);\n      ele.setAttribute('transform', `scale(\n        ${Workspace.scale},\n        ${Workspace.scale})\n        translate(${Workspace.translateX + dx},\n        ${Workspace.translateY + dy})`);\n    }\n    if (window['property_box'].start) {\n      const el = window['property_box'].element;\n      el.style.left = `${Workspace.minMax(0, window.innerWidth - 220, event.clientX - window['property_box'].x)}px`;\n      el.style.top = `${Workspace.minMax(0, window.innerHeight - 50, event.clientY - window['property_box'].y)}px`;\n    }\n  }\n  /**\n   * Event Listener for mouseup on html body\n   * @param event Mouse Event\n   */\n  static bodyMouseUp(event: MouseEvent) {\n    if (Workspace.moveCanvas.start) {\n      const dx = (event.clientX - Workspace.moveCanvas.x) * Workspace.translateRate;\n      const dy = (event.clientY - Workspace.moveCanvas.y) * Workspace.translateRate;\n      Workspace.translateX += dx;\n      Workspace.translateY += dy;\n      Workspace.moveCanvas.start = false;\n      document.getElementById('holder').classList.remove('grabbing');\n    }\n    window['property_box'].start = false;\n  }\n  /**\n   * Event Listener for mousedown on html body\n   * @param event MouseDown\n   */\n  static mouseDown(event: MouseEvent) {\n    Workspace.hideContextMenu();\n    if (window['isSelected'] && (window['Selected'] instanceof Wire)) {\n      // if selected item is wire and it is not connected then add the point\n      if (window.Selected.end == null) {\n        const pt = Workspace.svgPoint(event.clientX, event.clientY);\n        window.Selected.addPoint(pt.x, pt.y, event.shiftKey);\n        return;\n      }\n    }\n    if ((event.target as HTMLElement).tagName === 'svg') {\n      Workspace.moveCanvas = {\n        x: event.clientX,\n        y: event.clientY,\n        start: true\n      };\n      document.getElementById('holder').classList.add('grabbing');\n    }\n  }\n  /**\n   * Event Handler On clicking on workspace\n   * @param event Mouse Click event\n   */\n  static click(event: MouseEvent) {\n  }\n  /**\n   * Returns true if current selected item is wire\n   */\n  private static isWireSelected(): boolean {\n    return window['isSelected'] && (window['Selected'] instanceof Wire);\n  }\n\n  /**\n   * Event Listener for mouseMove on html body\n   * @param event MouseMove\n   */\n  static mouseMove(event: MouseEvent) {\n    event.preventDefault();\n    // if wire is selected then draw temporary lines\n    if (Workspace.isWireSelected()) {\n      const pt = Workspace.svgPoint(event.clientX - 2, event.clientY - 2);\n      if (event.shiftKey) {\n        window.Selected.drawPerpendicular(pt.x, pt.y);\n      } else {\n        window.Selected.draw(pt.x, pt.y);\n      }\n    } else {\n      // deselect item\n      if (window.Selected && window.Selected.deselect) {\n        window.Selected.deselect();\n      }\n    }\n    Workspace.updateWires();\n  }\n\n  /*\n  TODO: Remove if not Required\n  static mouseEnter(event: MouseEvent) {\n\n  }\n  static mouseLeave(event: MouseEvent) {\n\n  }\n\n  static mouseOver(event: MouseEvent) {\n\n  }\n\n  static mouseOut(event: MouseEvent) {\n\n  }*/\n  /**\n   * Event handler for mouse up on workspace.\n   * @param event Mouse Event\n   */\n  static mouseUp(event: MouseEvent) {\n\n  }\n\n  /**\n   * Event Listener to display Context menu (for performing copy, paste, delete operation)\n   * @param event Mouse Event\n   */\n  static contextMenu(event: MouseEvent) {\n    event.preventDefault();\n    const element = document.getElementById('contextMenu');\n    element.style.display = 'block';\n    element.style.left = `${event.clientX}px`;\n    element.style.top = `${event.clientY}px`;\n    return true;\n  }\n\n  /** Function called to hide ContextMenu */\n  static hideContextMenu() {\n    const element = document.getElementById('contextMenu');\n    element.style.display = 'none';\n\n  }\n  /**\n   * Event handler for copy on workspace.\n   * @param event Clipboard Event\n   */\n  static copy(event: ClipboardEvent) {\n  }\n  /**\n   * Event handler for CUT on workspace.\n   * @param event Clipboard Event\n   */\n  static cut(event: ClipboardEvent) {\n  }\n\n  /**\n   * function deselects the item on Canvas\n   * @param event DoubleClick\n   */\n  static doubleClick(event: MouseEvent) {\n    if (window['isSelected'] && (window['Selected'] instanceof Wire) && !window.Selected.isConnected()) {\n      return;\n    }\n    if ((event.target as HTMLElement).tagName !== 'svg') {\n      return;\n    }\n    // deselect item\n    window.hideProperties();\n  }\n  /**\n   * function drags element to valid drop target\n   * @param event DragEvent\n   */\n  static dragLeave(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n  }\n  /**\n   * function drags element over a valid drop target\n   * @param event DragEvent\n   */\n  static dragOver(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n  }\n  /**\n   * function drop element at drop target\n   * @param event DragEvent\n   */\n  static drop(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    const className = event.dataTransfer.getData('text'); // get the event data\n    const pt = Workspace.svgPoint(event.clientX, event.clientY);\n    Workspace.addComponent(className, pt.x, pt.y, 0, 0);\n  }\n\n  /**\n   * Key down event on workspace.\n   * @param event Keyboard Event\n   */\n  static keyDown(event: KeyboardEvent) {\n    if (event.shiftKey) {\n      if (Workspace.isWireSelected()) {\n        window.Selected.togglePerpendicularLine(true);\n      }\n    }\n  }\n\n  /**\n   * Key Press event on workspace.\n   * @param event Keyboard Event\n   */\n  static keyPress(event: KeyboardEvent) {\n  }\n  /**\n   * event Listener to perform Keyboard Shortcut operations\n   * @param event keyup Event\n   */\n  static keyUp(event: KeyboardEvent) {\n    if (window.isCodeEditorOpened) {\n      return;\n    }\n    if ((event.key === 'Delete' || event.key === 'Backspace')\n      && !(event['target']['localName'] === 'input' || event['target']['localName'] === 'textarea')) {\n      // Backspace or Delete\n      Workspace.DeleteComponent();\n    }\n    if (event.key === 'Escape') {\n      // terminate current wire connection if in progress\n      if (window.Selected instanceof Wire && !window.Selected.isConnected()) {\n        Workspace.DeleteComponent();\n      }\n    }\n    if (event.ctrlKey && (event.key === 'c' || event.key === 'C')) {\n      // Copy\n      Workspace.copyComponent();\n    }\n    if (event.ctrlKey && (event.key === 'v' || event.key === 'V')) {\n      // paste\n      Workspace.pasteComponent();\n    }\n    if (event.ctrlKey && (event.key === '+')) {\n      // CTRL + +\n      Workspace.zoomIn();\n    }\n    if (event.ctrlKey && (event.key === '-')) {\n      // CTRL + -\n      Workspace.zoomIn();\n    }\n    if (event.ctrlKey && (event.key === 'k' || event.key === 'K')) {\n      // TODO: Open Code Editor\n    }\n    if (event.key === 'F5') {\n      // TODO: Start Simulation\n    }\n    if (event.key === 'Shift') {\n      if (Workspace.isWireSelected()) {\n        window.Selected.togglePerpendicularLine(false);\n      }\n    }\n    if (event.ctrlKey && (event.key === 'z' || event.key === 'Z') && UndoUtils.enableButtonsBool) {\n      // CTRL + z\n      // Call Undo Function\n      UndoUtils.workspaceUndo();\n    }\n  }\n  /**\n   * Event Listener for zoom in/zoom out on workspace\n   * @param event MouseWheel Event\n   */\n  static mouseWheel(event: WheelEvent) {\n    event.preventDefault();\n    if (event.deltaY < 0) {\n      Workspace.zoomIn();\n    } else {\n      Workspace.zoomOut();\n    }\n  }\n  /**\n   * Event handler for paste.\n   * @param event Clipboard Event\n   */\n  static paste(event: ClipboardEvent) {\n  }\n  /**\n   * Function adds components by providing their keynames\n   * @param classString string\n   * @param x number\n   * @param y number\n   * @param offsetX  number\n   * @param offsetY number\n   */\n  static addComponent(classString: string, x: number, y: number, offsetX: number, offsetY: number) {\n    const myClass = Utils.components[classString].className;\n    const obj = new myClass(\n      window['canvas'],\n      x - offsetX,\n      y - offsetY\n    );\n    window['scope'][classString].push(obj);\n    // Push dump to Undo stack & Reset\n    UndoUtils.pushChangeToUndoAndReset({ keyName: obj.keyName, event: 'add', element: obj.save() });\n  }\n  /** Function updates the position of wires */\n  static updateWires() {\n    for (const z of window['scope']['wires']) {\n      z.update();\n    }\n  }\n  /**\n   * Function returns point translated according to the svg\n   * @param x number\n   * @param y number\n   */\n  static svgPoint(x, y) {\n    const pt = window['holder_svg'].createSVGPoint();\n    pt.x = x;\n    pt.y = y;\n    return pt.matrixTransform(window.canvas.canvas.getScreenCTM().inverse());\n  }\n  /**\n   * This function is required by deleteComponent() to recursively remove item\n   * @param obj any\n   */\n  static removeMeta(obj) {\n    for (const prop in obj) {\n      if (typeof obj[prop] === 'object') {\n        obj[prop] = null;\n      } else {\n        delete obj[prop];\n      }\n    }\n  }\n  /**\n   * Function saves the circuit Offline\n   * @param name string\n   * @param description string\n   * @param callback any\n   * @param id number\n   */\n  static SaveCircuit(name: string = '', description: string = '', callback: any = null, id: number = null) {\n    let toUpdate = false;\n    // Check if id is already present then enable Update\n    if (isNull(id)) {\n      id = Date.now();\n    } else {\n      toUpdate = true;\n    }\n    // Default Save object\n    const saveObj = {\n      id,\n      canvas: {\n        x: Workspace.translateX,\n        y: Workspace.translateY,\n        scale: Workspace.scale\n      },\n      project: {\n        name,\n        description,\n        created_at: Date.now(),\n        updated_at: Date.now()\n      }\n    };\n    // For each item in the scope\n    for (const key in window.scope) {\n      // if atleast one component is present\n      if (window.scope[key] && window.scope[key].length > 0) {\n        saveObj[key] = [];\n        // Add the component to the save object\n        for (const item of window.scope[key]) {\n          if (item.save) {\n            saveObj[key].push(item.save());\n          }\n        }\n      }\n    }\n    // Save the Thumbnail for the circuit\n    Download.ExportImage(ImageType.PNG).then(v => {\n      saveObj.project['image'] = v; // Add the base64 image\n      // console.log(saveObj);\n      // Save or Update Circuit Ofline\n      if (toUpdate) {\n        SaveOffline.Update(saveObj, callback);\n      } else {\n        SaveOffline.Save(saveObj, callback);\n      }\n    });\n\n  }\n\n  /**\n   * Function called to Load data from saved object\n   * @param data Saved Object\n   */\n  static Load(data) {\n    // Clear Project\n    this.ClearWorkspace();\n    // Show loading animation\n    window.showLoading();\n    // Load The translation and scaling values\n    Workspace.translateX = data.canvas.x;\n    Workspace.translateY = data.canvas.y;\n    Workspace.scale = data.canvas.scale;\n\n    // Update the translation and scaling\n    window.queue = 0;\n    const ele = (window['canvas'].canvas as HTMLElement);\n    ele.setAttribute('transform', `scale(\n      ${Workspace.scale},\n      ${Workspace.scale})\n      translate(${Workspace.translateX},\n      ${Workspace.translateY})`);\n\n    // For each component key in the data\n    for (const key in data) {\n      // Check if key is valid\n      if (!(key in data)) {\n        continue;\n      }\n      // if key is not related to circuit then continue\n      if (key !== 'id' && key !== 'canvas' && key !== 'project' && key !== 'wires') {\n        // Initialize an array\n        window['scope'][key] = [];\n\n        // Get the data for respective component\n        const components = data[key];\n\n        for (const comp of components) {\n          // Get class from keyname using the map\n          const myClass = Utils.components[key].className;\n          // Create Component Object from class\n          const obj = new myClass(\n            window['canvas'],\n            comp.x,\n            comp.y\n          );\n\n          window.queue += 1;\n          // Add to scope\n          window['scope'][key].push(obj);\n          // Load data for each object\n          if (obj.load) {\n            obj.load(comp);\n          }\n        }\n\n      }\n    }\n    // Wait until all components are drawn\n    const interval = setInterval(() => {\n      if (window.queue === 0) {\n        clearInterval(interval);\n        // start drawing wires with Id retain\n        Workspace.LoadWires(data.wires, true);\n        // Hide loading animation\n        window.hideLoading();\n      }\n    }, 100);\n\n  }\n  /** This function recreates the wire object */\n  static LoadWires(wires: any[], retainId = false, pushUndo = false) {\n    if (isNull(wires) || isUndefined(wires)) {\n      return;\n    }\n\n    for (const w of wires) {\n      const points = w.points;\n      let start: Point = null;\n      let end: Point = null;\n\n      // Use Linear search to find the start circuit node\n      for (const st of window.scope[w.start.keyName]) {\n        // console.log(st.id,w.start.id);\n        if (st.id === w.start.id) {\n          start = st.getNode(points[0][0], points[0][1], w.start.pid);\n          break;\n        }\n      }\n\n      // Use Linear Search to find the end circuit node\n      for (const en of window.scope[w.end.keyName]) {\n        if (en.id === w.end.id) {\n          const p = points[points.length - 1];\n          end = en.getNode(p[0], p[1], w.end.pid);\n          break;\n        }\n      }\n\n      // console.log([start, end]);\n      // if both nodes are present then connect those nodes\n      if (start && end) {\n        let tmp: any;\n        if (retainId) {\n          tmp = new Wire(window.canvas, start, w.id);\n        } else {\n          tmp = new Wire(window.canvas, start);\n        }\n        tmp.load(w);\n        start.connectedTo = tmp;\n        end.connectedTo = tmp;\n        tmp.connect(end, true, true, pushUndo);\n        window['scope']['wires'].push(tmp);\n        tmp.update();\n        if (start.connectCallback) {\n          start.connectCallback(start);\n        }\n        if (end.connectCallback) {\n          end.connectCallback(end);\n        }\n      } else {\n        console.log('Not able to recreate Wires');\n        // alert('something went wrong');\n      }\n    }\n    Workspace.circuitLoaded = true;\n    Workspace.circuitLoadStatus.emit(true);\n  }\n\n  /** Function to delete component fro Workspace */\n  static DeleteComponent(undoReset = true) {\n    // Save Dump of current Workspace\n    // Check if component is selected\n    if (window['Selected']) {\n      // is selected component is an arduini uno then show confirm message\n      if (window['Selected'] instanceof ArduinoUno) {\n        const ans = confirm('The Respective code will also be lost!');\n        if (!ans) {\n          return;\n        }\n      }\n\n      // get the component id\n      const uid = window.Selected.id;\n      const key = window.Selected.keyName;\n\n      if (!(window.Selected instanceof Wire && !window.Selected.isConnected())) {\n        const obj = { keyName: window.Selected.keyName, element: window.Selected.save(), event: 'delete' };\n        // Push dump to Undo stack & Reset if undoReset is true, else just push\n        if (undoReset) { UndoUtils.pushChangeToUndoAndReset(obj); } else { UndoUtils.pushChangeToUndo(obj); }\n      }\n\n      // If Current Selected item is a Wire which is not Connected from both end\n      if (key === 'wires') {\n        if (isNull(window.Selected.end)) {\n          // Remove and deselect\n          window.Selected.remove();\n          window.Selected = null;\n          window.isSelected = false;\n        }\n      }\n\n      // If BreadBoard remove draglistners too\n      if (key === 'BreadBoard') {\n        // Search in DragListeners & splice\n        for (const i in window['DragListeners']) {\n          if (window.DragListeners.hasOwnProperty(i)) {\n            const itrFn = window['DragListeners'][i];\n            if (itrFn.id === window['Selected'].id) {\n              window['DragListeners'].splice(i, 1);\n            }\n          }\n        }\n        // Search in DragStopListeners & splice\n        for (const i in window['DragStopListeners']) {\n          if (window.DragStopListeners.hasOwnProperty(i)) {\n            const itrFn = window['DragStopListeners'][i];\n            if (itrFn.id === window['Selected'].id) {\n              window['DragStopListeners'].splice(i, 1);\n            }\n          }\n        }\n      }\n\n      // get the component keyname\n      const items = window.scope[key];\n      // Use linear search find the element\n      for (let i = 0; i < items.length; ++i) {\n        if (items[i].id === uid) {\n          // remove from DOM\n          window.Selected.remove();\n          window.Selected = null;\n          window.isSelected = false;\n          // Remove from scope\n          const k = items.splice(i, 1);\n          // Remove data from it recursively\n          Workspace.removeMeta(k[0]);\n\n          if (key !== 'wires') {\n            let index = 0;\n            while (index < window.scope.wires.length) {\n              const wire = window.scope.wires[index];\n              if (isNull(wire.start) && isNull(wire.end)) {\n                window.scope.wires.splice(index, 1);\n                continue;\n              }\n              ++index;\n            }\n          }\n\n          break;\n        }\n      }\n      // Hide Property box\n      window.hideProperties();\n    } else {\n      window['showToast']('No Element Selected');\n    }\n  }\n\n  /** Function to copy component fro Workspace */\n  static copyComponent() {\n    if (window['Selected']) {\n      if (window['Selected'] instanceof Wire) {\n        window['showToast']('You Can\\'t Copy Wire');\n        return;\n      }\n      Workspace.copiedItem = window.Selected;\n    } else {\n      Workspace.copiedItem = null;\n    }\n  }\n\n  /** Function to paste component fro Workspace */\n  static pasteComponent() {\n    // Save Dump of current Workspace\n    // console.log(Workspace.copiedItem);\n    if (Workspace.copiedItem) {\n      const ele = document.getElementById('contextMenu');\n      let x = +ele.style.left.replace('px', '');\n      let y = +ele.style.top.replace('px', '');\n      // console.log([x, y]);\n      const key = Workspace.copiedItem.keyName;\n      if (x === 0 && y === 0) {\n        x = Workspace.copiedItem.x + 100;\n        y = Workspace.copiedItem.y + 100;\n      }\n      const pt = Workspace.svgPoint(x, y);\n      // Workspace.addComponent(Workspace.copiedItem, pt.x, pt.y, 0, 0);\n      const myClass = Utils.components[key].className;\n      const obj = new myClass(window['canvas'], pt.x, pt.y);\n      window['scope'][key].push(obj);\n      // obj.copy(Workspace.copiedItem)\n    }\n  }\n\n  /** Function called to clear output in console */\n  static ClearConsole() {\n    const clear = document.getElementById('msg');\n    let inside: any = clear.firstChild;\n    while (inside != null) {\n      if (inside.tagName === 'PRE') {\n        inside.innerText = '';\n        inside = inside.nextSibling;\n        continue;\n      }\n      const tmp = inside;\n      inside = inside.nextSibling;\n      clear.removeChild(tmp);\n    }\n  }\n\n  /** Function called to compile code in console */\n  static CompileCode(api: ApiService, callback: () => void) {\n    const toSend = {}; // Json Which needs to be Send for compilation\n    const nameMap = {}; // Create a Mapping id => Arduino\n\n    // Check if there is any Programmable Device\n    const isProgrammable = window.scope.ArduinoUno.length > 0;\n\n    if (!isProgrammable) {\n      window.printConsole('No Programmable Device Found', ConsoleType.INFO);\n      Workspace.startArduino();\n      callback();\n      return;\n    }\n\n    for (const arduino of window.scope.ArduinoUno) {\n      toSend[arduino.id] = arduino.code;\n      nameMap[arduino.id] = arduino;\n    }\n\n    window.printConsole('Compiling Source Code', ConsoleType.INFO);\n\n    if (window.progLang === 0) {\n      api.compileCodeINO(toSend).subscribe(v => {\n        const taskid = v.uuid; // Get Compilation id\n        const temp = setInterval(() => {\n          api.getHex(taskid).subscribe(hex => {\n            if (hex.state === 'SUCCESS' && !hex.details.error) {\n              clearInterval(temp);\n              let SUCCESS = true;\n              for (const k in hex.details) {\n                if (hex.details[k]) {\n                  const d = hex.details[k];\n                  window.printConsole('For Arduino ' + nameMap[k].name, ConsoleType.INFO);\n                  if (d.output && d.data) {\n                    window.printConsole(d.output, ConsoleType.OUTPUT);\n                    nameMap[k].hex = d.data;\n                  }\n                  if (d.error) {\n                    SUCCESS = false;\n                    window.printConsole(d.error, ConsoleType.ERROR);\n                  }\n                }\n              }\n              if (SUCCESS) {\n                Workspace.startArduino();\n              }\n              callback();\n            } else if (hex.state === 'FAILED' || hex.details.error) {\n              clearInterval(temp);\n              window.printConsole('Failed To Compile: Server Error', ConsoleType.ERROR);\n              callback();\n            }\n          });\n        }, 2000);\n      }, error => {\n        window.printConsole('Error While Compiling the Source Code.', ConsoleType.ERROR);\n        console.log(error);\n        callback();\n      });\n    } else if (window.progLang === 1) {\n      api.compileCodeInlineAssembly(toSend).subscribe(v => {\n        const taskid = v.uuid; // Get Compilation id\n        const temp = setInterval(() => {\n          api.getHex(taskid).subscribe(hex => {\n            if (hex.state === 'SUCCESS' && !hex.details.error) {\n              clearInterval(temp);\n              let SUCCESS = true;\n              for (const k in hex.details) {\n                if (hex.details[k]) {\n                  const d = hex.details[k];\n                  window.printConsole('For Arduino ' + nameMap[k].name, ConsoleType.INFO);\n                  if (d.output && d.data) {\n                    window.printConsole(d.output, ConsoleType.OUTPUT);\n                    nameMap[k].hex = d.data;\n                  }\n                  if (d.error) {\n                    SUCCESS = false;\n                    window.printConsole(d.error, ConsoleType.ERROR);\n                  }\n                }\n              }\n              if (SUCCESS) {\n                Workspace.startArduino();\n              }\n              callback();\n            } else if (hex.state === 'FAILED' || hex.details.error) {\n              clearInterval(temp);\n              window.printConsole('Failed To Compile: Server Error', ConsoleType.ERROR);\n              callback();\n            }\n          });\n        }, 2000);\n      }, error => {\n        window.printConsole('Error While Compiling the Source Code.', ConsoleType.ERROR);\n        console.log(error);\n        callback();\n      });\n    }\n  }\n  /**\n   * Start Simulation\n   */\n  static startArduino() {\n    Workspace.simulationStarted.emit(true);\n    // Assign id\n    let gid = 0;\n    for (const wire of window.scope.wires) {\n      if (wire.start) {\n        wire.start.gid = gid++;\n      }\n      if (wire.end) {\n        wire.end.gid = gid++;\n      }\n    }\n    // Sequence to be followed while calling initSimulation\n    const seqn = ['output', 'general', 'controllers', 'drivers', 'power', 'input', 'misc'];\n    // For each component call initsimulation function\n    for (const key of seqn) {\n      for (const items of Utils.componentBox[key]) {\n        for (const item of items) {\n          if (window.scope[item]) {\n            for (const ele of window.scope[item]) {\n              if (ele.initSimulation) {\n                ele.initSimulation();\n              }\n            }\n          }\n        }\n      }\n    }\n\n    // // Call init simulation\n    // for (const key in window.scope) {\n    //   if (window.scope[key] && key !== 'ArduinoUno') {\n    //     for (const ele of window.scope[key]) {\n    //       if (ele.initSimulation) {\n    //         ele.initSimulation();\n    //       }\n    //     }\n    //   }\n    // }\n\n    // for (const comp of window.scope.ArduinoUno) {\n    //   // comp.runner.execute();\n    //   // console.log('s')\n    //   comp.initSimulation();\n    // }\n\n    // Update the simulation status\n    // Workspace.GetNodeValues();\n    Workspace.simulating = true;\n  }\n  /**\n   * Function called when StopSimulation button is triggered\n   * @param callback Callback when simulation is stopped\n   */\n  static stopSimulation(callback: () => void) {\n    if (!Workspace.simulating) {\n      callback();\n      return;\n    }\n    // Remove id\n    for (const wire of window.scope.wires) {\n      if (wire.start) {\n        wire.start.value = -1;\n      }\n      if (wire.end) {\n        wire.end.value = -1;\n      }\n    }\n    // Call stop simulation\n    for (const key in window.scope) {\n      if (window.scope[key]) {\n        for (const ele of window.scope[key]) {\n          if (ele.closeSimulation) {\n            ele.closeSimulation();\n          }\n        }\n      }\n    }\n    // Update state and call callback\n    Workspace.simulating = false;\n    Workspace.simulationStopped.emit(true);\n    callback();\n  }\n  /**\n   * Function to clear the workspace\n   */\n  static ClearWorkspace() {\n    // Show Loading animation\n    window.showLoading();\n\n    // Remove each component fron the DOM\n    for (const key in window.scope) {\n      if (key in window.scope && window.scope[key].length > 0) {\n        for (const item of window.scope[key]) {\n          // window.Selected = item;\n          // this.DeleteComponent();\n          item.remove();\n          Workspace.removeMeta(item);\n        }\n        // Clear the scope\n        window.scope[key] = [];\n      }\n    }\n\n    window.Selected = null;\n    window.isSelected = false;\n    // Reinitialize variables\n    Workspace.initalizeGlobalVariables(window['canvas']);\n    // Hide Property box\n    window.hideProperties();\n    // Hide Loading animation\n    window.hideLoading();\n  }\n\n\n  /**\n   * Function generates a JSON object containing all details of the workspace and downloads it\n   * @param name string\n   * @param description string\n   */\n  static SaveJson(name: string = '', description: string = '') {\n\n    const id = Date.now();\n\n    // Default Save object\n    const saveObj = {\n      id,\n      canvas: {\n        x: Workspace.translateX,\n        y: Workspace.translateY,\n        scale: Workspace.scale\n      },\n      project: {\n        name,\n        description,\n        created_at: Date.now(),\n      }\n    };\n\n    // For each item in the scope\n    for (const key in window.scope) {\n      // if atleast one component is present\n      if (window.scope[key] && window.scope[key].length > 0) {\n        saveObj[key] = [];\n        // Add the component to the save object\n        for (const item of window.scope[key]) {\n          if (item.save) {\n            saveObj[key].push(item.save());\n          }\n        }\n      }\n    }\n    // Save the Thumbnail for the circuit\n    Download.ExportImage(ImageType.PNG).then(v => {\n      saveObj.project['image'] = v; // Add the base64 image\n      // Export JSON File & Download it\n      const filename = `${name}.json`;\n      const jsonStr = JSON.stringify(saveObj);\n      const element = document.createElement('a');\n      element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(jsonStr));\n      element.setAttribute('download', filename);\n\n      element.style.display = 'none';\n      document.body.appendChild(element);\n\n      element.click();\n\n      document.body.removeChild(element);\n    });\n    return true;\n\n  }\n\n  /**\n   * Function to return if workspace is empty or not\n   * @returns 'False' if workspace is not empty & 'True' if workspace is empty\n   */\n  static checkIfWorkspaceEmpty() {\n    for (const key in window.scope) {\n      if (window.scope[key].length > 0) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  // static GetNodeValues() { //waveForm, time) {\n  //   const pointD13 = window.scope[Utils.componentBox['controllers'][0][0]][0].nodes[2];\n  //   const interval = setInterval(() => {\n  //     console.log(pointD13.value);\n  //     // [5, undefined];\n  //     // if (Workspace.isChartDataFull(waveForm, 20)) {\n  //     //   Workspace.removeLastElementFromChartDataAndLabel(waveForm, time);\n  //     // }\n  //     // waveForm[0].data.push(window.scope[Utils.componentBox['controllers'][0][0]][0].nodes[2].value);\n  //     // time.push(\n  //     //   Workspace.getLabel()\n  //     // );\n  //     if(!Workspace.simulating) {\n  //       clearInterval(interval);\n  //     }\n  //   }, 1);\n  // }\n\n  // static getLabel(){\n  //   return new Date().getSeconds();\n  // }\n\n  // static removeLastElementFromChartDataAndLabel(waveForm: ChartDataSets[], time: Label[]): void {\n  //   waveForm[0].data = waveForm[0].data.slice(1);\n  //   time = time.slice(1);\n  // }\n\n  // static isChartDataFull(chartData: ChartDataSets[], limit: number): boolean {\n  //   return chartData[0].data.length >= limit;\n  // }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/drivers/L293D.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { BreadBoard } from '../General';\nimport { Point } from '../Point';\n\n/**\n * MotorDriver L293D class\n */\nexport class L293D extends CircuitElement {\n    /**\n     * Pin Name mapped to Pins\n     */\n    pinNamedMap: any = {};\n    /**\n     * Speed of Motor A in range of 0 to 5.\n     */\n    speedA = 5;\n    /**\n     * Speed of Motor B in range of 0 to 5\n     */\n    speedB = 5;\n    /**\n     * Previous values of the pins.\n     */\n    prevValues: any = {\n        IN1: -1,\n        IN2: -1,\n        IN3: -1,\n        IN4: -1\n    };\n    /**\n     * boolean to store EN1 value\n     */\n    enable1 = false;\n    /**\n     * boolean to store EN2 value\n     */\n    enable2 = false;\n    /**\n     * boolean for GND1\n     */\n    ground1 = false;\n    /**\n     * boolean for GND2\n     */\n    ground2 = false;\n\n    /**\n     * MotorDriver L293D constructor\n     * @param canvas Raphael Canvas (Paper)\n     * @param x  position x\n     * @param y  position y\n     */\n    constructor(public canvas: any, x: number, y: number) {\n        super('L293D', x, y, 'L293D.json', canvas);\n    }\n    /**\n     * Initialize Motor class.\n     */\n    init() {\n        // Add all nodes to pinNamedMap\n        for (const node of this.nodes) {\n            this.pinNamedMap[node.label] = node;\n        }\n        // Add value listner to VS pin\n        this.pinNamedMap['VS'].addValueListener(v => {\n            this.pinNamedMap['GND1'].setValue(v, this.pinNamedMap['GND1']);\n            if (v >= 5) {\n                this.pinNamedMap['GND2'].setValue(5, this.pinNamedMap['GND2']);\n            }\n            this.update();\n        });\n        // Add value listner to VSS pin\n        this.pinNamedMap['VSS'].addValueListener(v => {\n            this.pinNamedMap['GND3'].setValue(v, this.pinNamedMap['GND3']);\n            if (v >= 5) {\n                this.pinNamedMap['GND4'].setValue(5, this.pinNamedMap['GND4']);\n            }\n            this.update();\n        });\n        // Add value listner to IN1 pin\n        this.pinNamedMap['IN1'].addValueListener(v => {\n            if (v !== this.prevValues.IN1) {\n                this.prevValues.IN1 = v;\n                this.update();\n            }\n        });\n        // Add value listner to IN2 pin\n        this.pinNamedMap['IN2'].addValueListener(v => {\n            if (v !== this.prevValues.IN2) {\n                this.prevValues.IN2 = v;\n                this.update();\n            }\n        });\n        // Add value listner to IN3 pin\n        this.pinNamedMap['IN3'].addValueListener(v => {\n            if (v !== this.prevValues.IN3) {\n                this.prevValues.IN3 = v;\n                this.update();\n            }\n        });\n        // Add value listner to IN4 pin\n        this.pinNamedMap['IN4'].addValueListener(v => {\n            if (v !== this.prevValues.IN4) {\n                this.prevValues.IN4 = v;\n                this.update();\n            }\n        });\n        // Add value listner to EN2 pin\n        this.pinNamedMap['EN2'].addValueListener(v => {\n            if (v > 0) {\n                this.enable2 = true;\n            } else {\n                this.enable2 = false;\n            }\n        });\n    }\n    /**\n     * Simulation Logic For L293D Motor driver\n     */\n    update() {\n        // If EN2 is HIGH & ground is connected\n        if (this.enable2 && this.ground2) {\n            if (this.pinNamedMap['IN4'].value > 0) {\n                // TODO: set value of OUT4\n                this.pinNamedMap['OUT4'].setValue(this.pinNamedMap['VS'].value * (this.speedB / 5), this.pinNamedMap['OUT4']);\n            } else {\n                // TODO: set value of OUT4 to zero\n                this.pinNamedMap['OUT4'].setValue(0, this.pinNamedMap['OUT4']);\n            }\n            if (this.pinNamedMap['IN3'].value > 0) {\n                // TODO: set value of OUT3\n                this.pinNamedMap['OUT3'].setValue(this.pinNamedMap['VS'].value * (this.speedB / 5), this.pinNamedMap['OUT3']);\n            } else {\n                // TODO: set value of OUT3 and OUT4 to zero\n                this.pinNamedMap['OUT3'].setValue(0, this.pinNamedMap['OUT3']);\n                this.pinNamedMap['OUT4'].setValue(0, this.pinNamedMap['OUT4']);\n            }\n        } else {\n            // TODO: set value of OUT3 and OUT4 to zero\n            this.pinNamedMap['OUT4'].setValue(0, this.pinNamedMap['OUT4']);\n            this.pinNamedMap['OUT3'].setValue(0, this.pinNamedMap['OUT3']);\n        }\n        // If EN1 is HIGH & ground is connected\n        if (this.enable1 && this.ground1) {\n            if (this.pinNamedMap['IN1'].value > 0) {\n                // TODO: set value of OUT1\n                this.pinNamedMap['OUT1'].setValue(this.pinNamedMap['VS'].value * (this.speedB / 5), this.pinNamedMap['OUT1']);\n            } else {\n                // TODO: set value of OUT4 to zero\n                this.pinNamedMap['OUT1'].setValue(0, this.pinNamedMap['OUT1']);\n            }\n            if (this.pinNamedMap['IN2'].value > 0) {\n                // TODO: set value of OUT2\n                this.pinNamedMap['OUT2'].setValue(this.pinNamedMap['VS'].value * (this.speedB / 5), this.pinNamedMap['OUT2']);\n            } else {\n                // TODO: set value of OUT1 and OUT2 to zero\n                this.pinNamedMap['OUT1'].setValue(0, this.pinNamedMap['OUT1']);\n                this.pinNamedMap['OUT2'].setValue(0, this.pinNamedMap['OUT2']);\n            }\n        } else {\n            // TODO: set value of OUT3 and OUT4 to zero\n            this.pinNamedMap['OUT2'].setValue(0, this.pinNamedMap['OUT2']);\n            this.pinNamedMap['OUT1'].setValue(0, this.pinNamedMap['OUT1']);\n\n        }\n    }\n    /**\n     * Function provides component details\n     * @param keyName Unique Class name\n     * @param id Component id\n     * @param body body of property box\n     * @param title Component title\n     */\n    properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n        const body = document.createElement('div');\n        body.innerText = 'If you Don\\'t Connect The EN1 and EN2 Pins it automatically connects to the 5V suppy';\n        return {\n            keyName: this.keyName,\n            id: this.id,\n            body,\n            title: 'Motor Driver (L293D)'\n        };\n    }\n    /**\n     * Called on Start Simulation\n     */\n    initSimulation(): void {\n        // Determine if Enable2 is more than zero\n        if (this.pinNamedMap['EN2'].value > 0) {\n            // init 2nd side\n            this.enable2 = true;\n            // determine if GND pins are connected to GND of Arduino\n            const arduinoEnd4 = BreadBoard.getRecArduinov2(this.pinNamedMap['GND4'], 'GND4');\n            const arduinoEnd3 = BreadBoard.getRecArduinov2(this.pinNamedMap['GND3'], 'GND3');\n            if (arduinoEnd4 && arduinoEnd3) {\n                if (arduinoEnd4.parent.keyName === 'ArduinoUno' || arduinoEnd3.parent.keyName === 'ArduinoUno') {\n                    this.ground2 = true;\n                } else {\n                    // TODO: show toast\n                    console.error('GND is not connected');\n                    window['showToast']('GND is not connected properly!');\n                }\n            }\n        }\n        // Determine if Enable1 is more than zero\n        if (this.pinNamedMap['EN1'].value > 0) {\n            // init 1sr side\n            this.enable1 = true;\n            // determine if GND pins are connected to GND of Arduino\n            const arduinoEnd2 = BreadBoard.getRecArduinov2(this.pinNamedMap['GND2'], 'GND2');\n            const arduinoEnd1 = BreadBoard.getRecArduinov2(this.pinNamedMap['GND1'], 'GND1');\n            if (arduinoEnd2 && arduinoEnd1) {\n                if (arduinoEnd2.parent.keyName === 'ArduinoUno' || arduinoEnd1.parent.keyName === 'ArduinoUno') {\n                    this.ground1 = true;\n                } else {\n                    // TODO: show toast\n                    console.error('GND is not connected');\n                    window['showToast']('GND is not connected properly!');\n                }\n            }\n        }\n\n        // run simulation\n        this.update();\n\n    }\n    /**\n     * Called on Stop Simulation\n     */\n    closeSimulation(): void {\n        this.pinNamedMap['IN1'].value = -1;\n        this.pinNamedMap['IN2'].value = -1;\n        this.pinNamedMap['IN3'].value = -1;\n        this.pinNamedMap['IN4'].value = -1;\n        this.speedA = 5;\n        this.speedB = 5;\n        this.prevValues = {\n            IN1: -1,\n            IN2: -1,\n            IN3: -1,\n            IN4: -1\n        };\n        this.enable1 = false;\n        this.enable2 = false;\n        this.ground1 = false;\n        this.ground2 = false;\n    }\n}\n\n\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/inputs/Buttons.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { BreadBoard } from '../General';\nimport { Point } from '../Point';\n\n/**\n * Declare Raphael so that build don't throws error\n */\ndeclare var Raphael;\n\ndeclare var window;\n/**\n * Pushbutton Class\n */\nexport class PushButton extends CircuitElement {\n  /**\n   * Map of Pin name to the circuit node\n   */\n  pinNamedMap: any = {};\n  /**\n   * Object of terminals and their respective arduino pin\n   */\n  terminalParent = {};\n  parentList = new Set();\n  /**\n   * Set of Visited Nodes\n   */\n  visitedNodesv2 = new Set();\n  // /**\n  //  * Set of Visited Nodes\n  //  */\n  //  visitedNodesv2 = new Set();\n  /**\n   * pushbutton constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('PushButton', x, y, 'PushButton.json', canvas);\n  }\n  /** init is called when the component is complety drawn to the canvas */\n  init() {\n    // Create a mapping for node label to node\n    for (const node of this.nodes) {\n      this.pinNamedMap[node.label] = node;\n    }\n    // Add value Change Listener to Circuit nodes\n    this.pinNamedMap['Terminal 1a'].addValueListener((v) => {\n      if (v !== this.pinNamedMap['Terminal 1b'].value) {\n        this.pinNamedMap['Terminal 1b'].setValue(v, this.pinNamedMap['Terminal 1b']);\n      }\n    });\n    this.pinNamedMap['Terminal 1b'].addValueListener((v) => {\n      if (v !== this.pinNamedMap['Terminal 1a'].value) {\n        // console.log(v);\n        this.pinNamedMap['Terminal 1a'].setValue(v, this.pinNamedMap['Terminal 1a']);\n      }\n    });\n    this.pinNamedMap['Terminal 2a'].addValueListener((v) => {\n      this.pinNamedMap['Terminal 2b'].setValue(v, null);\n    });\n    this.pinNamedMap['Terminal 2b'].addValueListener((v) => {\n      this.pinNamedMap['Terminal 2a'].setValue(v, null);\n    });\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: 'PushButton',\n      id: this.id,\n      body,\n      title: 'Push Button'\n    };\n  }\n  /**\n   * Initialize Variable,callback and animation caller when start simulation is pressed\n   */\n  initSimulation(): void {\n    // Determine Arduino Connected ends for all terminals of push button\n    for (const i in this.pinNamedMap) {\n      if (this.pinNamedMap[i].connectedTo !== null) {\n        if (this.pinNamedMap[i].connectedTo.start.parent.keyName === 'ArduinoUno'\n          || this.pinNamedMap[i].connectedTo.end.parent.keyName === 'ArduinoUno') {\n          this.terminalParent[i] = BreadBoard.getRecArduinov2(this.pinNamedMap[i], i);\n        } else {\n          this.terminalParent[i] = BreadBoard.getRecArduinoBreadv2(this.pinNamedMap[i], i);\n        }\n      }\n    }\n    const Dports = new RegExp('^D([2-9]|[1][0-3])$');\n    const Aports = new RegExp('^A([0-5])$');\n    // console.log(this.pinNamedMap[''])\n    this.elements.unmousedown();\n    let iniValue = 0;\n    let iniPin = '';\n    let by = -1;\n    // create mousedown for the button\n    this.elements[9].mousedown(() => {\n      let val = -1;\n      let pullUp = false;\n      for (const i in this.terminalParent) {\n        // set value only if any pin have inputPullUpEnabled\n        if (this.terminalParent[i] !== undefined) {\n          pullUp = pullUp || this.terminalParent[i].pullUpEnabled;\n        }\n      }\n\n      for (const i in this.terminalParent) {\n        if (this.terminalParent[i] !== undefined) {\n          // set initial value to the pin which connects the digital pin on Arduino\n          if ((Dports.test(this.terminalParent[i].label) || Aports.test(this.terminalParent[i].label))\n            && this.pinNamedMap[i].value <= 0) {\n            iniValue = this.pinNamedMap[i].value;\n            iniPin = i;\n          }\n        }\n      }\n\n      if (this.pinNamedMap['Terminal 1a'].value > 0) {\n        val = this.pinNamedMap['Terminal 1a'].value;\n        // TODO: run for 1a\n        if (pullUp) {\n          iniValue = val;\n          // TODO: If pullUp enabled set val to zero\n          val = 0;\n        }\n        by = 0;\n        // set value to other pins\n        this.pinNamedMap['Terminal 2a'].setValue(val, null);\n        this.pinNamedMap['Terminal 2b'].setValue(val, null);\n      } else if (this.pinNamedMap['Terminal 1b'].value > 0) {\n        val = this.pinNamedMap['Terminal 1b'].value;\n        // TODO: run for 1b\n        if (pullUp) {\n          iniValue = val;\n          // TODO: If pullUp enabled set val to zero\n          val = 0;\n        }\n        by = 0;\n        // set value to other pins\n        this.pinNamedMap['Terminal 2a'].setValue(val, null);\n        this.pinNamedMap['Terminal 2b'].setValue(val, null);\n      } else if (this.pinNamedMap['Terminal 2a'].value > 0) {\n        val = this.pinNamedMap['Terminal 2a'].value;\n        // TODO: run for 2a\n        if (pullUp) {\n          iniValue = val;\n          // TODO: If pullUp enabled set val to zero\n          val = 0;\n        }\n        by = 1;\n        // set value to other pins\n        this.pinNamedMap['Terminal 1a'].setValue(val, null);\n        this.pinNamedMap['Terminal 1b'].setValue(val, null);\n      } else if (this.pinNamedMap['Terminal 2b'].value > 0) {\n        val = this.pinNamedMap['Terminal 2b'].value;\n        // TODO: run for 2b\n        if (pullUp) {\n          iniValue = val;\n          // TODO: If pullUp enabled set val to zero\n          val = 0;\n        }\n        by = 1;\n        // set value to other pins\n        this.pinNamedMap['Terminal 1a'].setValue(val, null);\n        this.pinNamedMap['Terminal 1b'].setValue(val, null);\n      }\n    });\n    // Set mouseup listener for the button\n    this.elements[9].mouseup(() => {\n      this.MouseUp(by, iniValue);\n\n      if (iniPin !== undefined && iniPin !== null) {\n        this.terminalParent[iniPin].setValue(-1, null);\n      }\n    });\n  }\n  /**\n   * Mouse Up Callback\n   * @param by Representing the node whose value > 0\n   * @param iniValue Initial value of the node before mousedown\n   */\n  MouseUp(by: number, iniValue: number) {\n    if (by === 0) {\n      this.pinNamedMap['Terminal 2a'].setValue(iniValue, null);\n      this.pinNamedMap['Terminal 2b'].\n        setValue(iniValue, null);\n    } else {\n      this.pinNamedMap['Terminal 1a'].setValue(iniValue, null);\n      this.pinNamedMap['Terminal 1b'].setValue(iniValue, null);\n    }\n  }\n  /** Function removes all  animations and callbacks  */\n  closeSimulation(): void {\n    this.elements.unmousedown();\n    this.elements.unmouseup();\n    this.elements.unmouseout();\n    this.setClickListener(null);\n    this.setDragListeners();\n  }\n}\n\n/**\n * Slideswitch Class\n */\nexport class SlideSwitch extends CircuitElement {\n  /**\n   * if true connected with terminal 1 else connected with terminal 2\n   */\n  private flag = true;\n  /**\n   * Slideswitch constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('SlideSwitch', x, y, 'SlideSwitch.json', canvas);\n  }\n  /**\n   * Initialize Slide Switch\n   */\n  init() {\n    this.nodes[1].addValueListener((v) => {\n      console.log(v);\n      if (this.flag) {\n        this.nodes[0].setValue(v, null);\n        this.nodes[2].setValue(-1, null);\n      } else {\n        this.nodes[0].setValue(-1, null);\n        this.nodes[2].setValue(v, null);\n      }\n    });\n  }\n  /** Animation caller during start simulation button pressed */\n  anim() {\n    let anim;\n    if (this.flag) {\n      anim = Raphael.animation({ transform: `t${this.tx + 15},${this.ty}` }, 500);\n    } else {\n      anim = Raphael.animation({ transform: `t${this.tx},${this.ty}` }, 500);\n    }\n    this.elements[1].animate(anim);\n    this.flag = !this.flag;\n    this.nodes[1].setValue(this.nodes[1].value, this.nodes[1]);\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'Slide Switch'\n    };\n  }\n  /**\n   * Called on Start Simulation.\n   */\n  initSimulation(): void {\n    this.elements.unmousedown();\n    this.elements.unclick();\n    this.elements.click(() => {\n      this.anim();\n    });\n    this.nodes[1].setValue(5, null);\n  }\n  /**\n   * Called on stop simulation.\n   */\n  closeSimulation(): void {\n    this.elements.unclick();\n    this.setDragListeners();\n    this.setClickListener(null);\n    const anim = Raphael.animation({ transform: `t${this.tx},${this.ty}` }, 500);\n    this.elements[1].animate(anim);\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/inputs/Collision.ts",
    "content": "/**\n * Position as a Vector\n */\nexport interface Vector {\n  /**\n   * X Position\n   */\n  x: number;\n  /**\n   * Y Positon\n   */\n  y: number;\n  // if require add Magnitude\n}\n/**\n * Orientation Between three points\n */\nexport enum Orienation {\n  COLINEAR,\n  CLOCKWISE,\n  COUNTER_CLOCKWISE\n}\n\n// https://www.geeksforgeeks.org/how-to-check-if-a-given-point-lies-inside-a-polygon/\n\n/** function detects collision of three collinear points  */\nexport class Collision {\n  /** Given three collinear points */\n  static inLine(p: Vector, q: Vector, r: Vector) {\n    // checks wether q lies on segment pr\n    if (q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) &&\n      q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y)) {\n      return true;\n    }\n    return false;\n  }\n  /** To find orientation of ordered triplet (p, q, r).  */\n  static orientation(p: Vector, q: Vector, r: Vector) {\n    const val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n    if (val === 0) {\n      return Orienation.COLINEAR;\n    }\n    return (val > 0) ? Orienation.CLOCKWISE : Orienation.COUNTER_CLOCKWISE;\n  }\n  /** Function returns true if two line segemnts intersects */\n  static isIntersecting(p1: Vector, q1: Vector, p2: Vector, q2: Vector) {\n    const o1 = Collision.orientation(p1, q1, p2);\n    const o2 = Collision.orientation(p1, q1, q2);\n    const o3 = Collision.orientation(p2, q2, p1);\n    const o4 = Collision.orientation(p2, q2, q1);\n    if (o1 !== o2 && o3 !== o4) {\n      return true;\n    }\n    // p1, q1 and p2 are colinear and p2 lies on segment p1q1\n    if (o1 === 0 && Collision.inLine(p1, p2, q1)) { return true; }\n\n    // p1, q1 and p2 are colinear and q2 lies on segment p1q1\n    if (o2 === 0 && Collision.inLine(p1, q2, q1)) { return true; }\n\n    // p2, q2 and p1 are colinear and p1 lies on segment p2q2\n    if (o3 === 0 && Collision.inLine(p2, p1, q2)) { return true; }\n\n    // p2, q2 and q1 are colinear and q1 lies on segment p2q2\n    if (o4 === 0 && Collision.inLine(p2, q1, q2)) { return true; }\n\n    return false; // Doesn't fall in any of the above cases\n  }\n  /** Function returns true if the point p lies inside polygon */\n  static isPointInsidePolygon(point: number[][], p: number[]) {\n    const extreme: Vector = {\n      x: 10000000,\n      y: p[1]\n    };\n    const n = point.length;\n    let count = 0;\n    let i = 0;\n    do {\n      const next = (i + 1) % n;\n      const a: Vector = { x: point[i][0], y: point[i][1] };\n      const b: Vector = { x: point[next][0], y: point[next][1] };\n      const c = { x: p[0], y: p[1] };\n      if (Collision.isIntersecting(a, b, c, extreme)) {\n        if (Collision.orientation(a, c, b) === Orienation.COLINEAR) {\n          return Collision.inLine(a, c, b);\n        }\n        count += 1;\n      }\n      i = next;\n    } while (i !== 0);\n    return (count % 2) !== 0;\n  }\n  /**\n   *  Function performes Euclidean Distance operation\n   * @param a coordinate a\n   * @param b coordinate b\n   */\n  static EuclideanDistance(a: Vector, b: Vector) {\n    return Math.sqrt(((a.x - b.x) * (a.x - b.x)) + ((a.y - b.y) * (a.y - b.y)));\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/inputs/GasSensor.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { Collision, Vector } from './Collision';\n\n/// TODO: Handle the digital pin\n/**\n * Class GasSensor MQ2\n */\nexport class MQ2 extends CircuitElement {\n  /**\n   * Line which is drawn while simulation.\n   */\n  line: any;\n  /**\n   * Gas Sensor Constructor\n   * @param canvas Raphael canvas\n   * @param x Position x\n   * @param y Position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('MQ2', x, y, 'MQ2.json', canvas);\n  }\n  /**\n   * Initialize Gas Sensor\n   */\n  init() {\n    this.elements[1].hide();\n    this.nodes[0].addValueListener((v) => {\n      this.nodes[1].setValue(v, null);\n    });\n  }\n  /**\n   * Function provides component details\n   * @param keyName  Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'Gas Sensor (MQ-2)'\n    };\n  }\n  /**\n   * Sets the analog value of the gas sensor based on the distance between tmp and cloud.\n   * @param tmp The center of the cloud\n   * @param Center The Center of the smoke detector\n   */\n  setValue(tmp: Vector, Center: Vector) {\n    const dist = Collision.EuclideanDistance(tmp, Center);\n    let v;\n    if (dist <= 189) {\n      v = ((189 - dist) / 189) * 5;\n    } else {\n      v = 0;\n    }\n    if (this.nodes[0].connectedTo && this.nodes[0].value >= 4.9) {\n      this.nodes[3].setValue(Math.round(v), null);\n    } else {\n      window['showToast']('Please Connect Wires Properly');\n    }\n  }\n  /**\n   * Initialize animation for the  gas sensor\n   */\n  initSimulation(): void {\n    this.elements[1].show();\n    this.elements.undrag();\n    let tmp = this.elements[1].attr();\n    this.elements[1].attr({\n      x: tmp.x + this.tx,\n      y: tmp.y + this.ty,\n      transform: 't0,0'\n    });\n\n    this.line = this.canvas.path(\n      `M${tmp.x + this.tx + 145 + 19},${tmp.y + this.ty + 145}L${\n      this.tx + this.x + 48\n      },${\n      this.ty + this.y + 50\n      }`\n    );\n\n    this.line.attr({\n      'stroke-dasharray': ['-.']\n    });\n\n    const Center: Vector = {\n      x: this.tx + this.x + 48,\n      y: this.ty + this.y + 50\n    };\n    // Add the drag listener to the cloud\n    this.elements[1].drag((dx, dy) => {\n      // Update Position\n      this.elements[1].attr({\n        x: tmp.x + dx,\n        y: tmp.y + dy\n      });\n      // Set the analog value\n      this.setValue({\n        x: tmp.x + dx + 164,\n        y: tmp.y + dy + 145\n      }, Center);\n      // Update the line\n      this.line.attr({\n        path: `M${Center.x},${Center.y},L${tmp.x + dx + 164},${tmp.y + dy + 145}`\n      });\n    }, () => {\n      tmp = this.elements[1].attr();\n    }, () => {\n    });\n    tmp = this.elements[1].attr();\n    this.setValue({\n      x: tmp.x + 164,\n      y: tmp.y + 145\n    }, Center);\n\n  }\n  /**\n   * Remove line and smoke\n   */\n  closeSimulation(): void {\n    this.elements[1].hide();\n    this.line.remove();\n    this.line = null;\n    this.elements[1].undrag();\n    this.setDragListeners();\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/inputs/PIRSensor.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { Collision } from './Collision';\nimport { isNull } from 'util';\n/**\n * PIR Sensor class\n */\nexport class PIRSensor extends CircuitElement {\n  /**\n   * Curve points of sensor\n   */\n  static curve: number[][];\n  /**\n   * points of hand polygon\n   */\n  static handPoints: number[][];\n  /**\n   *  The backgound range of the sensor\n   */\n  range: any;\n  /**\n   * backCurve(path) of sensor\n   */\n  backCurve: string;\n  /**\n   * hand is a Raphael Element\n   */\n  hand: any;\n  /**\n   * Map of pin name to the circuit node.\n   */\n  pinNameMap: any = {};\n  /**\n   * pushbutton constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('PIRSensor', x, y, 'PIRSensor.json', canvas);\n  }\n  /** init is called when the component is complety drawn to the canvas */\n  init() {\n    PIRSensor.curve = this.data.curve;\n    PIRSensor.handPoints = this.data.hand;\n    this.backCurve = this.data.backCurve;\n    this.data = null;\n    // Create a mapping for node label to node\n    for (const node of this.nodes) {\n      this.pinNameMap[node.label] = node;\n    }\n    this.elements[1].hide();\n    this.pinNameMap['VCC'].addValueListener((v) => {\n      this.pinNameMap['GND'].setValue(v, null);\n    });\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      body,\n      title: 'PIR Sensor',\n      id: this.id\n    };\n  }\n  /**\n   * Initialize Variable,callback and event caller when start simulation is pressed\n   */\n  initSimulation(): void {\n    this.elements.undrag();\n    this.elements.unmousedown();\n    this.range = this.canvas.path(this.backCurve);\n    this.range.attr({\n      fill: 'rgba(0,0,255,0.1)',\n      stroke: 'none'\n    });\n    this.elements[1].show(); // Show Hand\n    this.range.translate(this.x + this.tx + 99, this.y + this.ty + 80);\n    this.range.toBack();\n    const tmpCurve = [];\n    // Updates the points of the sensor ranging curve\n    for (const x of PIRSensor.curve) {\n      tmpCurve.push([x[0] + this.x + this.tx, x[1] + this.y + this.ty]);\n    }\n    // FOR: Visual of Curve\n    // console.log(this.curve.length)\n    // this.canvas.path(`M${tmpCurve[0][0]},${tmpCurve[0][1]}\n    //   L${tmpCurve[1][0]},${tmpCurve[1][1]}\n    //   L${tmpCurve[2][0]},${tmpCurve[2][1]}\n    //   L${tmpCurve[3][0]},${tmpCurve[3][1]},\n    //   L${tmpCurve[4][0]},${tmpCurve[4][1]},\n    //   L${tmpCurve[5][0]},${tmpCurve[5][1]}\n    //   z`);\n    // console.log(this.elements[1].transform())\n    const handIni = this.elements[1].transform();\n    let handTX = handIni[0][1];\n    let handTy = handIni[0][2];\n    let handFdx = 0;\n    let handFdy = 0;\n    let ans = false;\n    // let timeout = 0;\n    // let idk = null;\n    this.elements[1].drag((dx, dy) => {\n      handFdx = dx;\n      handFdy = dy;\n      this.elements[1].transform(`t${handTX + dx},${handTy + dy}`);\n      // let handPoints = [];\n      ans = false;\n      // to check collision between hand and affected region\n      for (const vec of PIRSensor.handPoints) {\n        // handPoints.push(\n        //   [vec[0] + this.x + hand_tx + dx, vec[1] + this.y + hand_ty + dy]\n        // )\n        ans = ans || Collision.isPointInsidePolygon(\n          tmpCurve,\n          [vec[0] + this.x + handTX + dx, vec[1] + this.y + handTy + dy]\n        );\n      }\n      // console.log(ans);\n      // if VCC pin of sensor is connected and has a potential of 5 volts\n      if (ans) {\n        if (this.pinNameMap['VCC'].value > 0) {\n          this.pinNameMap['SIGNAL'].setValue(5, null);\n          // if (!isNull(timeout)) {\n          // clearTimeout(timeout);\n          // } else {\n          // }\n        }\n      }\n\n      // if (idk) {\n      //   idk.remove();\n      // }\n      // idk = this.canvas.path(`M${handPoints[0][0]},${handPoints[0][1]}\n      // L${handPoints[1][0]},${handPoints[1][1]}\n      // L${handPoints[2][0]},${handPoints[2][1]}\n      // L${handPoints[3][0]},${handPoints[3][1]},\n      // L${handPoints[4][0]},${handPoints[4][1]},\n      // L${handPoints[5][0]},${handPoints[5][1]}z`);\n      // handPoints = null;\n    }, () => {\n      // console.log(hand_tx, hand_ty);\n    }, () => {\n      handTX += handFdx;\n      handTy += handFdy;\n      setTimeout(() => {\n        this.pinNameMap['SIGNAL'].setValue(0, null);\n      }, 1000);\n    });\n  }\n  /** Function removes all events and callbacks  */\n  closeSimulation(): void {\n    if (this.range) {\n      this.range.remove();\n    }\n    this.elements[1].undrag();\n    this.elements[1].hide();\n    this.setDragListeners();\n    this.setClickListener(null);\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/inputs/PhotoResistor.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { Slider } from './Slider';\n/**\n * Class Photoresistor\n */\nexport class PhotoResistor extends CircuitElement {\n  /**\n   * Slider to set the value of photo resistor\n   */\n  slide: Slider;\n  /**\n   * The Value of the photo resitor\n   */\n  valueText: any;\n  /**\n   * Maxmum value of 1000\n   */\n  maxVal = 1000;\n  /**\n   * Minmum value of 1000\n   */\n  minVal = 0;\n  /**\n   * RaphaelJs path for sun\n   */\n  sun;\n  /**\n   * RaphaelJs path for moon\n   */\n  moon;\n  /**\n   * svg path of sun\n   */\n  sunPath: string = null;\n  /**\n   * svg path of moon\n   */\n  moonPath: string = null;\n\n  /**\n   * Photoresistor Constructor\n   * @param canvas Raphael canvas\n   * @param x Position x\n   * @param y Position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('PhotoResistor', x, y, 'PhotoResistor.json', canvas);\n    // fetch sun and moon path from json file\n    fetch(`./assets/jsons/PhotoResistor.json`)\n      .then(v => v.json())\n      .then(obj => {\n        this.sunPath = obj.sliderIcons.sunPath;\n        this.moonPath = obj.sliderIcons.moonPath;\n      });\n  }\n  /**\n   * Function provides component details\n   * @param keyName  Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'Photo Resistor'\n    };\n  }\n  /**\n   * Returns a string on the basis of resistance\n   * @param r Resistance\n   */\n  getValue(r: number) {\n    return `${Math.round((r) * 100) / 100} lum`;\n  }\n  /**\n   * Initialize Variable and callback when start simulation is pressed\n   */\n  initSimulation(): void {\n    this.valueText = this.canvas.text(this.x + this.tx + 1, this.y + this.ty - 70, `${this.maxVal / 2} lum`);\n    this.valueText.attr({\n      'font-size': 15\n    });\n    // Draw Sun on slider\n    this.sun = this.canvas.path(this.sunPath);\n    this.sun.attr({ fill: '#000', stroke: 'none' });\n    this.sun.translate(this.x + this.tx + 70, this.y + this.ty - 55);\n    // Draw Moon on slider\n    this.moon = this.canvas.path(this.moonPath);\n    this.moon.attr({ fill: '#000', stroke: 'none' });\n    this.moon.transform(`s0.06 t${7.5 * (this.x + this.tx - 120)} ${1 * (this.y + this.ty - 860)}`);\n    // Slider ranging from minValue to maxValue\n    this.slide = new Slider(this.canvas, this.x + this.tx, this.y + this.ty - 10);\n    this.slide.setGradient('#69644b', '#ffd500');\n    const enable1 = this.nodes[1].value > this.nodes[0].value ? true : false;\n    // At starting set value to half of slider\n    this.changeVal(enable1, 0.5);\n    // Listen to value changes on slider\n    this.slide.setValueChangeListener((v) => {\n      // Change slider's ouput value\n      this.changeVal(enable1, v);\n\n    });\n  }\n\n  /**\n   * Call this function to change ouput value of photoresistor\n   * @param enable1 Pin to direct output on\n   * @param v value of slider, ranges from 0-1\n   */\n  changeVal(enable1, v) {\n    // calculate lumens according slider\n    const lum = (v) * this.maxVal;\n    // if enable1 is true\n    if (enable1) {\n      // calculate voltage value\n      const incoming = this.nodes[1].value;\n      // calculate output voltage\n      const val = (lum / this.maxVal) * incoming;\n      // set output voltage\n      this.nodes[0].setValue(val, null);\n      // update text\n      this.valueText.attr({\n        text: this.getValue(lum)\n      });\n\n    } else {\n      // calculate voltage value\n      const incoming = this.nodes[0].value;\n      // calculate output voltage\n      const val = (lum / this.maxVal) * incoming;\n      // set output voltage\n      this.nodes[1].setValue(val, null);\n      // update text\n      this.valueText.attr({\n        text: this.getValue(lum)\n      });\n\n    }\n  }\n\n  /** Function removes all  animations and callbacks  */\n  closeSimulation(): void {\n    this.valueText.remove();\n    this.slide.remove();\n    delete this.slide;\n    delete this.valueText;\n    this.sun.remove();\n    // delete this.sun;\n    this.moon.remove();\n    delete this.moon;\n    // this.slide = null;\n    this.valueText = null;\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/inputs/Potentiometer.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { BreadBoard } from '../General';\nimport { Vector } from './Collision';\nimport { Point } from '../Point';\nimport { LED } from '../outputs/Led';\n\n/**\n * Declare window so that custom created function don't throw error\n */\ndeclare var window;\n\n/**\n * Potentiometer Class\n */\nexport class Potentiometer extends CircuitElement {\n  /**\n   * Types of potentiometer name.\n   */\n  static variants: string[];\n  /**\n   * Types of potentiometer resistance\n   */\n  static variantsValue: number[];\n  /**\n   * Selected potentiometer type.\n   */\n  selectedIndex: number;\n  /**\n   * Arduino Pin connected to 0 of potentiometer\n   */\n  arduinoEndZero: any;\n  /**\n   * Arduino Pin connected to 2 of potentiometer\n   */\n  arduinoEndTwo: any;\n  /**\n   * Set to keep track of visited nodes\n   */\n  visitedNodesv2 = new Set();\n  /**\n   * Check the connection type\n   */\n  isRheostat: boolean = null;\n  /**\n   * Stores visited LEDs' ids\n   */\n  visitedLEDs = new Set();\n  /**\n   * Stores connected LEDs\n   */\n  connectedLEDs: LED[] = [];\n  /**\n   * Potentiometer constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('PotentioMeter', x, y, 'Potentiometer.json', canvas);\n  }\n  /** init is called when the component is complety drawn to the canvas */\n  init() {\n    Potentiometer.variants = this.data.variants;\n    Potentiometer.variantsValue = this.data.value;\n    this.data.value = [];\n    this.data.variants = [];\n    this.data = null;\n  }\n  /**\n   * Returns the client point respective to the svg\n   * @param x X positon\n   * @param y y position\n   */\n  svgPoint(x, y) {\n    const pt = window['holder_svg'].createSVGPoint();\n    pt.x = x;\n    pt.y = y;\n    return pt.matrixTransform(window.canvas.canvas.getScreenCTM().inverse());\n  }\n  /**\n   * Rotates the dial and sets the analog value\n   * @param center Center of the Potentiometer\n   * @param clientX Mouse X\n   * @param clientY Mouse Y\n   */\n  rotateDial(center: Vector, clientX: number, clientY: number) {\n    const point = this.svgPoint(clientX, clientY);\n    const difX = point.x - center.x;\n    const difY = point.y - center.y;\n    let ang = Math.atan2(difY, difX);\n    if (ang < 0) {\n      ang += 2 * Math.PI;\n    }\n    // if(line){\n    //   line.remove();\n    //   line = null;\n    // }\n    // const ex = center.x + 100*Math.cos(ang);\n    // const ey = center.y + 100*Math.sin(ang);\n    // line = this.canvas.path(`M${center.x},${center.y}L${ex},${ey}`)\n    ang *= (180 / Math.PI);\n    ang = (ang + 225) % 360;\n    if (ang > 268) {\n      ang = 268;\n    }\n    let to;\n    let intp = 0;\n    // console.log(ang / 268);\n    if (this.arduinoEndZero) {\n      to = Math.max(\n        this.nodes[0].value,\n        this.nodes[1].value\n      );\n      intp = (ang / 268) * to;\n    } else if (this.arduinoEndTwo) {\n      to = Math.max(\n        this.nodes[1].value,\n        this.nodes[2].value\n      );\n      intp = to - ((ang / 268) * to);\n    }\n    if (to < 0) {\n      window['showToast']('Potentiometer Not Connected');\n      return;\n    }\n    this.elements[1].transform(`r${ang}`);\n\n    this.nodes[1].setValue(intp, this.nodes[1]);\n  }\n  /**\n   * Rotates the dial and sets the analog value for Rheostat connection\n   * @param center Center of the Potentiometer\n   * @param clientX Mouse X\n   * @param clientY Mouse Y\n   */\n  rotateDialRheostat(center: Vector, clientX: number, clientY: number) {\n    const point = this.svgPoint(clientX, clientY);\n    const difX = point.x - center.x;\n    const difY = point.y - center.y;\n    const resistanceValue = Potentiometer.variantsValue[this.selectedIndex];\n\n    let ang = Math.atan2(difY, difX);\n    if (ang < 0) {\n      ang += 2 * Math.PI;\n    }\n    // if(line){\n    //   line.remove();\n    //   line = null;\n    // }\n    // const ex = center.x + 100*Math.cos(ang);\n    // const ey = center.y + 100*Math.sin(ang);\n    // line = this.canvas.path(`M${center.x},${center.y}L${ex},${ey}`)\n    ang *= (180 / Math.PI);\n    ang = (ang + 225) % 360;\n    if (ang > 268) {\n      ang = 268;\n    }\n    let to;\n    let calResistance = -1;\n    const minVoltage = 0;\n    const minLEDResistance = 100;\n    const maxLEDResitance = 466;\n    if (this.arduinoEndZero) {\n      to = Math.max(\n        this.nodes[0].value,\n        this.nodes[1].value\n      );\n      // intp = (ang / 268) * to;\n      calResistance = ((ang / 268) * resistanceValue);\n      this.sendResistance(calResistance);\n    } else if (this.arduinoEndTwo) {\n      to = Math.max(\n        this.nodes[1].value,\n        this.nodes[2].value\n      );\n      calResistance = resistanceValue - ((ang / 268) * resistanceValue);\n      this.sendResistance(calResistance);\n    }\n    if (to < 0) {\n      window['showToast']('Potentiometer Not Connected');\n      return;\n    }\n    this.elements[1].transform(`r${ang}`);\n    this.nodes[1].setValue(to, this.nodes[1]);\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    body.style.display = 'flex';\n    body.style.flexDirection = 'column';\n    const label = document.createElement('label');\n    label.innerText = 'Resistance';\n    const select = document.createElement('select');\n    let tmp = '';\n    for (const val of Potentiometer.variants) {\n      tmp += `<option>${val} &#8486;</option>`;\n    }\n    select.innerHTML = tmp;\n    select.selectedIndex = this.selectedIndex;\n    select.onchange = () => {\n      this.selectedIndex = select.selectedIndex;\n    };\n    body.append(label);\n    body.append(select);\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      title: 'Potentiometer',\n      body\n    };\n  }\n  /**\n   * Called on start simulation. Add Event listener.\n   */\n  initSimulation(): void {\n\n    if (!this.areNodesConnectedProperly()) {\n      window.showToast('Potentiometer not connected properly.');\n      return;\n    }\n    const attr = this.elements[1].attr();\n    const center = {\n      x: attr.x + attr.width / 2 + this.tx,\n      y: attr.y + attr.height / 2 + this.ty\n    };\n    this.elements[1].transform(`t0,0`);\n    this.elements[1].attr({\n      x: attr.x + this.tx,\n      y: attr.y + this.ty\n    });\n    this.elements.undrag();\n    this.elements.unmousedown();\n\n    if (!this.isRheostat) {\n      this.elements.drag((_, __, mX, mY) => {\n        this.rotateDial(center, mX, mY);\n      }, (mX, mY) => {\n        this.rotateDial(center, mX, mY);\n      },\n        (ev: MouseEvent) => {\n          this.rotateDial(center, ev.clientX, ev.clientY);\n        });\n    } else {\n      this.elements.drag((_, __, mX, mY) => {\n        this.rotateDialRheostat(center, mX, mY);\n      }, (mX, mY) => {\n        this.rotateDialRheostat(center, mX, mY);\n      },\n        (ev: MouseEvent) => {\n          this.rotateDialRheostat(center, ev.clientX, ev.clientY);\n        });\n    }\n\n    // Find out the LEDs in the circuit\n    this.getRecLED(this.nodes[0], 'Terminal 1');\n    this.getRecLED(this.nodes[1], 'WIPER');\n    this.getRecLED(this.nodes[2], 'Ternimal 2');\n\n    // Get Arduino Connected ends for terminal 1 & terminal 2\n    this.arduinoEndZero = this.getRecArduinov2(this.nodes[0], 'Terminal 1');\n    this.arduinoEndTwo = this.getRecArduinov2(this.nodes[2], 'Terminal 2');\n    if (this.arduinoEndZero) {\n      // TODO : If arduino is connected to Terminal 1 of potentiometer\n      // set WIPER value 0\n      this.nodes[1].setValue(0, this.nodes[1]);\n    } else if (this.arduinoEndTwo) {\n      // TODO : If arduino is connected to Terminal 2 of potentiometer\n      // set WIPER value as from Terminal 2\n      this.nodes[1].setValue(this.nodes[2].value, this.nodes[1]);\n    }\n  }\n  /**\n   * Save the Selected type in database\n   */\n  SaveData() {\n    return {\n      value: this.selectedIndex\n    };\n  }\n  /**\n   * Load the Selected type.\n   * @param data Saved Data\n   */\n  LoadData(data: any) {\n    if (data.data && data.data.value > 0) {\n      this.selectedIndex = data.data.value;\n    } else {\n      this.selectedIndex = 0;\n    }\n  }\n  /**\n   * Reset transformation add add event listeners.\n   */\n  closeSimulation(): void {\n    const attr = this.elements[1].attr();\n    this.elements[1].attr({\n      x: attr.x - this.tx,\n      y: attr.y - this.ty\n    });\n    this.elements[1].transform(`t${this.tx},${this.ty}`);\n    this.elements.undrag();\n    this.elements.unmousedown();\n    this.setClickListener(null);\n    this.setDragListeners();\n    this.isRheostat = null;\n    this.visitedLEDs.clear();\n    this.connectedLEDs = [];\n  }\n  /**\n   * Checks if nodes of Potentiometer are connected either as\n   * 1. Rheostat: Wiper + Left Pin (or) Wiper + Right Pin\n   * 2. Voltage divider: All pins\n   */\n  areNodesConnectedProperly() {\n    if (this.nodes[0].isConnected() && this.nodes[1].isConnected() && this.nodes[2].isConnected()) {\n      const leftNode = this.getRecArduinov2(this.nodes[0], 'Terminal 1');\n      const rightNode = this.getRecArduinov2(this.nodes[2], 'Terminal 2');\n      if (leftNode && rightNode) {\n        if (leftNode.label === 'GND' && rightNode.value > 0) {\n          this.isRheostat = false;\n          return true;\n        } else if (rightNode.label === 'GND' && leftNode.value > 0) {\n          this.isRheostat = false;\n          return true;\n        }\n      }\n    }\n\n    if (this.nodes[0].isConnected() && this.nodes[1].isConnected()) {\n      this.isRheostat = true;\n      return true;\n    } else if (this.nodes[1].isConnected() && this.nodes[2].isConnected()) {\n      this.isRheostat = true;\n      return true;\n    }\n    return false;\n  }\n  /**\n   * Function to transfer resistance to connected LEDs\n   * ToDo: Function is hardcoded\n   * ToDo: Make it work for other components\n   */\n  sendResistance(resistance: number) {\n    for (const led of this.connectedLEDs) {\n      led.setVariableResistance(resistance);\n    }\n  }\n  /**\n   * Return the node which is connected to arduino by recursively finding connected node\n   * @param node The Node which need to be checked\n   */\n  getRecArduinov2(node: Point, startedOn: string) {\n    try {\n      if (node.connectedTo.start.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to start node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.start;\n      } else if (node.connectedTo.end.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to end node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.end;\n      } else if (node.connectedTo.start.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.start.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.end.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'Battery9v' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to 9V Battery\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'CoinCell' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to Coin Cell\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'RelayModule') {\n        // TODO: Handle RelayModule\n        if (startedOn === 'POSITIVE') {\n          // If search was started on Positive node then return connected node of VCC in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[3], startedOn);\n        } else if (startedOn === 'NEGATIVE') {\n          // If search was started on Negative node then return connected node of GND in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[5], startedOn);\n        }\n      } else {\n        // TODO: If nothing matches\n        // IF/ELSE: Determine if start is to be used OR end for further recursion\n        if (node.connectedTo.end.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.end.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.end.parent.nodes[e].gid !== node.connectedTo.end.gid\n              && !this.visitedNodesv2.has(node.connectedTo.end.parent.nodes[e].gid) && node.connectedTo.end.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.end.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.end.parent.nodes[e], startedOn);\n            }\n          }\n        } else if (node.connectedTo.start.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.start.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.start.parent.nodes[e].gid !== node.connectedTo.start.gid\n              && !this.visitedNodesv2.has(node.connectedTo.start.parent.nodes[e].gid)\n              && node.connectedTo.start.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.start.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.start.parent.nodes[e], startedOn);\n            }\n          }\n        }\n\n      }\n    } catch (e) {\n      console.warn(e);\n      return false;\n    }\n\n  }\n\n  /**\n   * Recursive Function to handle BreadBoard\n   * @param node Node which is to be checked for BreadBoard\n   */\n  private getRecArduinoBreadv2(node: Point, startedOn: string) {\n    // IF/ELSE: Determine if start is to be used OR end for further recursion\n    if (node.connectedTo.end.gid !== node.gid) {\n      const bb = (node.connectedTo.end.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.end.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.end.label.substring(1, node.connectedTo.end.label.length)) {\n            const ascii = node.connectedTo.end.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    } else if (node.connectedTo.start.gid !== node.gid) {\n      const bb = (node.connectedTo.start.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.start.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.start.label.substring(1, node.connectedTo.start.label.length)) {\n            const ascii = node.connectedTo.start.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Return the node which is connected to arduino by recursively finding LEDs inside the circuit\n   * @param node The Node which need to be checked\n   */\n  getRecLED(node: Point, startedOn: string) {\n    try {\n      if (node.connectedTo.start.parent.keyName === 'LED') {\n        const led = (node.connectedTo.start.parent as LED);\n        if (!this.visitedLEDs.has(led.getID())) {\n          this.connectedLEDs.push(led);\n          this.visitedLEDs.add(led.getID());\n        }\n      } else if (node.connectedTo.end.parent.keyName === 'LED') {\n        const led = (node.connectedTo.end.parent as LED);\n        if (!this.visitedLEDs.has(led.getID())) {\n          this.connectedLEDs.push(led);\n          this.visitedLEDs.add(led.getID());\n        }\n      }\n      if (node.connectedTo.start.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to start node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.start;\n      } else if (node.connectedTo.end.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to end node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.end;\n      } else if (node.connectedTo.start.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.start.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecLEDBread(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.end.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecLEDBread(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'Battery9v' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to 9V Battery\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'CoinCell' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to Coin Cell\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'RelayModule') {\n        // TODO: Handle RelayModule\n        if (startedOn === 'POSITIVE') {\n          // If search was started on Positive node then return connected node of VCC in Relay\n          return this.getRecLED(node.connectedTo.end.parent.nodes[3], startedOn);\n        } else if (startedOn === 'NEGATIVE') {\n          // If search was started on Negative node then return connected node of GND in Relay\n          return this.getRecLED(node.connectedTo.end.parent.nodes[5], startedOn);\n        }\n      } else {\n        // TODO: If nothing matches\n        // IF/ELSE: Determine if start is to be used OR end for further recursion\n        if (node.connectedTo.end.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.end.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.end.parent.nodes[e].gid !== node.connectedTo.end.gid\n              && !this.visitedNodesv2.has(node.connectedTo.end.parent.nodes[e].gid) && node.connectedTo.end.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.end.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecLED(node.connectedTo.end.parent.nodes[e], startedOn);\n            }\n          }\n        } else if (node.connectedTo.start.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.start.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.start.parent.nodes[e].gid !== node.connectedTo.start.gid\n              && !this.visitedNodesv2.has(node.connectedTo.start.parent.nodes[e].gid)\n              && node.connectedTo.start.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.start.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecLED(node.connectedTo.start.parent.nodes[e], startedOn);\n            }\n          }\n        }\n      }\n    } catch (e) {\n      console.warn(e);\n      return false;\n    }\n  }\n\n  /**\n   * Recursive Function to handle BreadBoard\n   * @param node Node which is to be checked for BreadBoard\n   */\n  private getRecLEDBread(node: Point, startedOn: string) {\n    // IF/ELSE: Determine if start is to be used OR end for further recursion\n    if (node.connectedTo.end.gid !== node.gid) {\n      const bb = (node.connectedTo.end.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.end.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.end.label.substring(1, node.connectedTo.end.label.length)) {\n            const ascii = node.connectedTo.end.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecLED(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecLED(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecLED(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    } else if (node.connectedTo.start.gid !== node.gid) {\n      const bb = (node.connectedTo.start.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.start.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.start.label.substring(1, node.connectedTo.start.label.length)) {\n            const ascii = node.connectedTo.start.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecLED(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecLED(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecLED(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/inputs/Relay.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\n\n/**\n * Relay Module Class\n */\nexport class Relay extends CircuitElement {\n  /**\n   * Relay Constructor\n   * @param canvas Raphael canvas\n   * @param x Position x\n   * @param y Position y\n   */\n  constructor(public canvas: any, public x: number, y: number) {\n    super('RelayModule', x, y, 'Relay.json', canvas);\n  }\n  /**\n   * Initialize the relay module.\n   */\n  init() {\n    let iniValue = 0;\n    this.nodes[4].addValueListener((v) => {\n      this.nodes[5].setValue(v, null);\n    });\n    this.nodes[3].addValueListener((val) => {\n      if (val > 4.9 && val < 5.1) {\n        if (this.nodes[1].value > 0) {\n          iniValue = 2;\n          this.nodes[2].setValue(this.nodes[1].value, null);\n        } else if (this.nodes[2].value > 0) {\n          iniValue = 1;\n          this.nodes[1].setValue(this.nodes[2].value, null);\n        }\n      } else {\n        this.nodes[iniValue].setValue(-1, this.nodes[iniValue]);\n      }\n    });\n  }\n  /**\n   * Function provides component details\n   * @param keyName  Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      title: 'Relay Module',\n      body\n    };\n  }\n  /**\n   * Check connection,if not connected show toast.\n   */\n  initSimulation(): void {\n    // Check Connection\n    if (\n      !(this.nodes[1].connectedTo &&\n        this.nodes[2].connectedTo &&\n        this.nodes[3].connectedTo &&\n        this.nodes[4].connectedTo &&\n        this.nodes[5].connectedTo)\n    ) {\n      window['showToast']('Please Connect Relay Properly');\n    }\n  }\n  /**\n   * Called on Stop Simulation.\n   */\n  closeSimulation(): void {\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/inputs/Slider.ts",
    "content": "/**\n * Class for adding a Slider during simulation.\n * Used by temperature sensor and photo resistor\n */\nexport class Slider {\n  /**\n   * Value Of the Slider\n   */\n  value = 0;\n  /**\n   * Value Change Listener\n   */\n  private listener: (value: number) => void;\n  /**\n   * The Circle which slides around the bar\n   */\n  control: any;\n  /**\n   * Minimum X Value\n   */\n  minx: number;\n  /**\n   * Maximum X Value\n   */\n  maxx: number;\n  /**\n   * The Rectaungular path wehre control slides\n   */\n  rect: any;\n  /**\n   * Constructor For adding a Slider\n   * @param canvas Raphael Paper\n   * @param x The X position of Slider\n   * @param y The Y Position Of Slide\n   */\n  constructor(public canvas: any, public x: number, public y: number) {\n    // Draw the slider\n    this.rect = this.canvas.rect(this.x - 60, this.y - 40, 120, 20, 15);\n    this.minx = this.x - 60 + 6;\n    this.maxx = this.x + 60 - 6;\n    // Draw the control knob\n    this.control = this.canvas.circle(this.x, this.y - 30, 12)\n      .attr({\n        fill: '#000'\n      });\n\n    let tmp;\n    // On Dragging knob\n    this.control.drag((dx, _) => {\n      // Change only in x direction\n      const cx = Math.min(Math.max(tmp.cx + dx, this.minx), this.maxx);\n      this.control.attr({\n        cx\n      });\n      // Calculate value and call the listener\n      this.value = (cx - this.minx) / (this.maxx - this.minx);\n      if (this.listener) {\n        this.listener(this.value);\n      }\n    }, () => {\n      tmp = this.control.attr();\n    }, () => {\n    });\n  }\n  /**\n   * Set Gradient to the slider\n   * @param start Start Hex Color\n   * @param end End Hex Color\n   */\n  setGradient(start: string, end: string) {\n    this.rect.attr({\n      fill: `0-${start}-${end}`\n    });\n  }\n  /**\n   * Set value change Listener\n   * @param listener Value Change Listener\n   */\n  setValueChangeListener(listener: (value: number) => void) {\n    this.listener = listener;\n  }\n  /**\n   * Hide Slider\n   */\n  hide() {\n    this.control.hide();\n    this.rect.hide();\n  }\n  /**\n   * Show Slider\n   */\n  show() {\n    this.control.show();\n    this.rect.show();\n  }\n  /**\n   * Remove Slider From Dom\n   */\n  remove() {\n    this.control.remove();\n    this.rect.remove();\n    this.control = null;\n    this.rect = null;\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/inputs/TemperatureSensors.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { Point } from '../Point';\nimport { Slider } from './Slider';\n/**\n * Temperature sensor TMP36\n */\nexport class TMP36 extends CircuitElement {\n  /**\n   * Slider to change temperature\n   */\n  slide: Slider;\n  /**\n   * Raphael text element for showing value.\n   */\n  valueText: any;\n  /**\n   * Constructor for temperature sensor\n   * @param canvas Raphael Paper\n   * @param x X position\n   * @param y y Position\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('TMP36', x, y, 'TMP36.json', canvas);\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'Temperatur Sensor'\n    };\n  }\n  /** sets value for nodes */\n  setValue(val: number) {\n    if (\n      this.nodes[0].connectedTo && this.nodes[0].value >= 4.9 &&\n      this.nodes[2].connectedTo\n    ) {\n      this.nodes[1].setValue(val, null);\n    } else {\n      window['showToast']('Please Connect Wires Properly');\n    }\n  }\n  /**\n   * Initialize Variable and callback when start simulation is pressed\n   */\n  initSimulation(): void {\n    this.valueText = this.canvas.text(this.x + this.tx + 120, this.y + this.ty - 40, '42.38°C');\n    this.valueText.attr({\n      'font-size': 15\n    });\n    this.slide = new Slider(this.canvas, this.x + this.tx, this.y + this.ty - 10);\n    this.slide.setGradient('#03b5fc', '#fc6203');\n    this.slide.setValueChangeListener((v) => {\n      const tmp = v * 165 + -40; // Temperature\n      // this.nodes[1].setValue((tmp + 50) / 100, null);\n      // console.log([tmp, (tmp + 50) / 100]);\n      this.valueText.attr({\n        text: `${Math.round((tmp) * 100) / 100}°C`\n      });\n      this.setValue((tmp + 50) / 100);\n    });\n    this.setValue(0.925);\n  }\n\n  /** remove slider and text */\n  closeSimulation(): void {\n    this.valueText.remove();\n    this.slide.remove();\n    delete this.slide;\n    this.slide = null;\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/inputs/Thermistor.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { Slider } from './Slider';\nimport { Point } from '../Point';\nimport { BreadBoard } from '../General';\n\n\ndeclare var window;\n\n/**\n * Class Photoresistor\n */\nexport class Thermistor extends CircuitElement {\n  /**\n   * Slider to set the value of photo resistor\n   */\n  slide: Slider;\n  /**\n   * The Value of the photo resitor\n   */\n  valueText: any;\n  /**\n   * Maximum temprature of Thermistor\n   */\n  maxVal = 500;\n  /**\n   * Resistor Value Ohms\n   */\n  resistorVal = 1;\n  /**\n   * Set of Visited Nodes\n   */\n  visitedNodesv2 = new Set();\n  /**\n   * Beta Value for calculation of output voltage. see below for more info\n   * Values used for calculating beta\n   * |------------------------------|\n   * | Temprature  |   Resistance   |\n   * |------------------------------|\n   * |    273 K    |  32650.80 Ohms |\n   * |    298 K    |  10000 Ohms    |\n   * |------------------------------|\n   * Formula(for beta) : ß=ln(R1/R2)/((1/T1)-(1/T2))\n   */\n  beta = Math.log(32650.80 / 10000) / ((1 / 273) - (1 / 298));\n\n  /**\n   * Photoresistor Constructor\n   * @param canvas Raphael canvas\n   * @param x Position x\n   * @param y Position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('Thermistor', x, y, 'Thermistor.json', canvas);\n  }\n  /**\n   * Function provides component details\n   * @param keyName  Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'Thermistor'\n    };\n  }\n  /**\n   * Returns a string on the basis of resistance\n   * @param r Resistance\n   */\n  getValue(r: number) {\n    return `${Math.round(r)} C`;\n  }\n  /**\n   * Initialize Variable and callback when start simulation is pressed\n   */\n  initSimulation(): void {\n    // add text\n    this.valueText = this.canvas.text(this.x + this.tx + 120, this.y + this.ty - 40, `${this.maxVal / 2} C`);\n    this.valueText.attr({\n      'font-size': 15\n    });\n    // create & add slider\n    this.slide = new Slider(this.canvas, this.x + this.tx, this.y + this.ty - 10);\n    this.slide.setGradient('#69644b', '#ffd500');\n\n    // get value of resistor connected\n    const resistorEnd1 = this.getRecResistor(this.nodes[0], 'Terminal 1');\n    const resistorEnd2 = this.getRecResistor(this.nodes[1], 'Terminal 2');\n    if (resistorEnd1) {\n      // if resistor is connected to node[0] get value of resistor\n      this.resistorVal = resistorEnd1.parent.value;\n    } else if (resistorEnd2) {\n      // if resistor is connected to node[1] get value of resistor\n      this.resistorVal = resistorEnd2.parent.value;\n    }\n    // determine if incoming current is coming from node[0] or node[1]\n    const enable1 = this.nodes[1].value > this.nodes[0].value ? true : false;\n    // At starting set value to half of slider\n    this.changeVal(enable1, 0.5);\n    this.slide.setValueChangeListener((v) => {\n      // Change slider's ouput value\n      this.changeVal(enable1, v);\n    });\n\n  }\n  /** Function removes all  animations and callbacks  */\n  closeSimulation(): void {\n    this.valueText.remove();\n    this.slide.remove();\n    delete this.slide;\n    delete this.valueText;\n    this.slide = null;\n    this.valueText = null;\n    this.visitedNodesv2.clear();\n  }\n  /**\n   * Call this function to change ouput value of photoresistor\n   * @param enable1 Pin to direct output on\n   * @param v value of slider, ranges from 0-1\n   */\n  changeVal(enable1, v) {\n    // calculate temprature according slider\n    const temp = v * this.maxVal;\n    // calculate part of equation which is in power\n    const pow = this.beta * ((1 / (273 + temp)) - (1 / 298));\n    // calculate internal resistance of thermistor\n    const r = 10000 * Math.pow(2.718, pow);\n    // if enable1 is true\n    if (enable1) {\n      // calculate voltage value\n      const incoming = this.nodes[1].value;\n      // calculate output voltage\n      const Vout = (this.resistorVal / (this.resistorVal + r)) * incoming;\n      // set output voltage\n      this.nodes[0].setValue(Vout, null);\n      // update text\n      this.valueText.attr({\n        text: this.getValue(temp)\n      });\n    } else {\n      // calculate voltage value\n      const incoming = this.nodes[0].value;\n      // calculate output voltage\n      const Vout = (this.resistorVal / (this.resistorVal + r)) * incoming;\n      // set output voltage\n      this.nodes[1].setValue(Vout, null);\n      // update text\n      this.valueText.attr({\n        text: this.getValue(temp)\n      });\n\n    }\n  }\n\n  /**\n   * Returns node connected to Resistor\n   * @param node node to start search on\n   * @param startedOn label of node search started on\n   * @returns Resistor connected Node\n   */\n  getRecResistor(node: Point, startedOn: string) {\n    try {\n      if (node.connectedTo.start.parent.keyName === 'Resistor') {\n        // TODO: Return if L293D is connected to start node\n        return node.connectedTo.start;\n      } else if (node.connectedTo.end.parent.keyName === 'Resistor') {\n        // TODO: Return if L293D is connected to end node\n        return node.connectedTo.end;\n      } else if (node.connectedTo.start.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.start.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecBread(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.end.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecBread(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'Battery9v' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to 9V Battery\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'CoinCell' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to Coin Cell\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'RelayModule') {\n        // TODO: Handle RelayModule\n        if (startedOn === 'POSITIVE') {\n          // If search was started on Positive node then return connected node of VCC in Relay\n          return this.getRecResistor(node.connectedTo.end.parent.nodes[3], startedOn);\n        } else if (startedOn === 'NEGATIVE') {\n          // If search was started on Negative node then return connected node of GND in Relay\n          return this.getRecResistor(node.connectedTo.end.parent.nodes[5], startedOn);\n        }\n      } else {\n        // TODO: If nothing matches\n        // IF/ELSE: Determine if start is to be used OR end for further recursion\n        if (node.connectedTo.end.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.end.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.end.parent.nodes[e].gid !== node.connectedTo.end.gid\n              && !this.visitedNodesv2.has(node.connectedTo.end.parent.nodes[e].gid) && node.connectedTo.end.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.end.parent.nodes[e].gid);\n              // call back L293D Recursive Fn\n              return this.getRecResistor(node.connectedTo.end.parent.nodes[e], startedOn);\n            }\n          }\n        } else if (node.connectedTo.start.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.start.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.start.parent.nodes[e].gid !== node.connectedTo.start.gid\n              && !this.visitedNodesv2.has(node.connectedTo.start.parent.nodes[e].gid)\n              && node.connectedTo.start.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.start.parent.nodes[e].gid);\n              // call back L293D Recursive Fn\n              return this.getRecResistor(node.connectedTo.start.parent.nodes[e], startedOn);\n            }\n          }\n        }\n\n      }\n    } catch (e) {\n      console.warn(e);\n      return false;\n    }\n\n  }\n\n  /**\n   * Recursive Function to handle BreadBoard\n   * @param node Node which is to be checked for BreadBoard\n   */\n  getRecBread(node: Point, startedOn: string) {\n    // IF/ELSE: Determine if start is to be used OR end for further recursion\n    if (node.connectedTo.end.gid !== node.gid) {\n      const bb = (node.connectedTo.end.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.end.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.end.label.substring(1, node.connectedTo.end.label.length)) {\n            const ascii = node.connectedTo.end.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecResistor(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecResistor(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecResistor(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    } else if (node.connectedTo.start.gid !== node.gid) {\n      const bb = (node.connectedTo.start.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.start.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.start.label.substring(1, node.connectedTo.start.label.length)) {\n            const ascii = node.connectedTo.start.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecResistor(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecResistor(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecResistor(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    }\n\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/inputs/UltrasonicSensor.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { Collision } from './Collision';\nimport { Point } from '../Point';\nimport { ArduinoUno } from '../outputs/Arduino';\n\n/**\n * Ultrasonic Sensor class\n */\nexport class UltrasonicSensor extends CircuitElement {\n  /**\n   * Attributes for the line which is shown during simulation\n   */\n  static readonly linesAttr = {\n    'stroke-width': 4,\n    'stroke-dasharray': ['-.'],\n    'stroke-linecap': 'round',\n    'stroke-linejoin': 'round',\n    stroke: '#828282'\n  };\n  /**\n   * Map pin name to the circuit node\n   */\n  pinNamedMap: any = {};\n  /**\n   * The Control which is moved during simulation/\n   */\n  control: any;\n  /**\n   * The Arduino uno which is connected to ultrasonic sensor.\n   */\n  arduino: ArduinoUno;\n  /**\n   * The Micro event index in the queue.\n   */\n  microEventIndex: number;\n  /**\n   * The Transmit line.\n   */\n  Tline: any;\n  /**\n   * The Reciver Line.\n   */\n  Rline: any;\n  /**\n   * The Raphael Element for the text which shows distance.\n   */\n  valueText: any;\n  /**\n   * Ultrasonic constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, public x: number, y: number) {\n    super('UltrasonicSensor', x, y, 'UltrasonicSensor.json', canvas);\n  }\n\n  /** init is called when the component is complety drawn to the canvas */\n  init() {\n    // Create a mapping for node label to node\n    for (const x of this.nodes) {\n      this.pinNamedMap[x.label] = x;\n    }\n    // let timeout;\n    // Add value Change Listener to Circuit nodes\n    // console.log(this.pinNamedMap['TRIG']);\n    this.pinNamedMap['TRIG'].addValueListener((v) => {\n      // TODO: Handle On\n      // if(v > 0){\n      // if (this.arduino) {\n      // if(v > 0){\n      // clearTimeout(timeout);\n      // this.arduino.runner.getMicroEvent(this.microEventIndex).enable = true;\n      // }else{\n      // timeout = setTimeout(() => {console.log('c') }, 24);\n      // }\n      // clearTimeout(timeout);\n      // }\n      // }\n      // console.log(v);\n      // if (v >= 5) {\n      // this.pinNamedMap['ECHO'].setValue(v, null);\n      // } else {\n      // this.pinNamedMap['ECHO'].setValue(0, null);\n      // }\n    });\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      title: 'Ultrasonic Distance Sensor',\n      body\n    };\n  }\n\n\n  /**\n   * Initialize stuff for simulation\n   */\n  initSimulation(): void {\n    // Creating the text\n    this.valueText = this.canvas.text(this.x + this.tx + 253, this.ty + this.y, '16 CM').attr({\n      'font-size': 30\n    });\n\n    // Get the Pin which is connected to arduino\n    let pinName;\n    const trig = (this.pinNamedMap['ECHO'] as Point);\n    if (trig.connectedTo) {\n      if (trig.connectedTo.start.parent instanceof ArduinoUno) {\n        pinName = trig.connectedTo.start.label;\n        this.arduino = trig.connectedTo.start.parent;\n      } else if (trig.connectedTo.end.parent instanceof ArduinoUno) {\n        this.arduino = trig.connectedTo.end.parent;\n        pinName = trig.connectedTo.end.label;\n      } else {\n        console.log('TODO: Write Simulation logic for other components');\n      }\n    }\n\n    // Control Center -> CC\n    const CC = {\n      x: this.x + this.tx + 102.5,\n      y: this.y + this.ty - 30\n    };\n    const lineEndY = this.y + this.ty + 40;\n    const lineTEnd = this.tx + this.x + 48;\n    const lineREnd = this.tx + this.x + 152;\n    // Draw transmit,recived lines and the control circle\n    this.Tline = this.canvas.path(`M${CC.x},${CC.y}L${lineTEnd},${lineEndY}`).attr(UltrasonicSensor.linesAttr);\n    this.Rline = this.canvas.path(`M${CC.x},${CC.y}L${lineREnd},${lineEndY}`).attr(UltrasonicSensor.linesAttr);\n    this.control = this.canvas.circle(CC.x, CC.y, 15);\n    this.control.attr({ fill: '#000' });\n\n    // Adding a Drag listener to the control\n    let tmp;\n    this.control.drag((dx, dy) => {\n      CC.x = tmp.cx + dx;\n      CC.y = tmp.cy + dy;\n\n      // Update the lines and control\n      this.control.attr({ cx: CC.x, cy: CC.y });\n      this.Tline.attr({ path: `M${CC.x},${CC.y}L${lineTEnd},${lineEndY}` });\n      this.Rline.attr({ path: `M${CC.x},${CC.y},L${lineREnd},${lineEndY}` });\n\n      // check if control is in front of sensor if not show toast\n      if (CC.y > (this.y + this.ty)) {\n        this.valueText.attr({\n          text: 'Behind\\nThe\\nSensor'\n        });\n        if (this.arduino) {\n          this.arduino.runner.getMicroEvent(this.microEventIndex).period = 23200;\n        }\n        return;\n      }\n      // if arduino ic connected\n      if (this.arduino) {\n        // get the distance\n        let dist = Collision.EuclideanDistance({ x: CC.x, y: CC.y }, {\n          x: lineTEnd,\n          y: lineEndY\n        });\n        const dist2 = Collision.EuclideanDistance({ x: CC.x, y: CC.y }, {\n          x: lineREnd,\n          y: lineEndY\n        });\n        // take average diatance\n        dist = Math.floor((dist + dist2) / 35);\n        // Interpolate the distance\n        dist = dist * dist;\n        if (dist > 400 || dist < 4) {\n          this.valueText.attr({\n            text: `OUT\\nOF\\nRegion`\n          });\n        } else {\n          this.valueText.attr({\n            text: `${dist} CM`\n          });\n        }\n        dist = Math.max(4, Math.min(dist, 400));\n        dist = dist * 29 * 2;\n        // Update the period of the micro event\n        this.arduino.runner.getMicroEvent(this.microEventIndex).period = dist;\n      }\n    }, () => {\n      tmp = this.control.attr();\n    }, () => {\n    });\n    // Set the default value for micro event\n    if (this.arduino) {\n      const point = this.arduino.getPort(pinName);\n      this.microEventIndex = this.arduino.runner.addMicroEvent({\n        start: 0,\n        state: false,\n        period: 928,\n        pin: point.pin,\n        port: point.name,\n        enable: true\n      });\n    }\n  }\n  /**\n   * Reset stuff on stop of simulation\n   */\n  closeSimulation(): void {\n    this.valueText.remove();\n    this.Tline.remove();\n    this.Rline.remove();\n    this.control.remove();\n    this.valueText = null;\n    this.control = null;\n    this.Tline = null;\n    this.Rline = null;\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/outputs/Arduino.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { ArduinoRunner } from '../AVR8/Execute';\nimport { isUndefined, isNull } from 'util';\nimport { Point } from '../Point';\nimport { EventEmitter } from '@angular/core';\nimport { GraphDataService } from 'src/app/graph-data.service';\n\n/**\n * AVR8 global variable\n */\ndeclare var AVR8;\n\n/**\n * Arduino uno component class\n */\nexport class ArduinoUno extends CircuitElement {\n  /**\n   * Arduino name Prefix\n   */\n  static prefix = 'Arduino UNO R3 '; // TODO: fetch from json\n  /**\n   * Name of the Arduino\n   */\n  public name: string;\n  /**\n   * Code inside the arduino\n   */\n  public code = 'void setup(){\\n\\t\\n}\\n\\nvoid loop(){\\n\\t\\n}'; // TODO: fetch from json\n  /**\n   * For execution of code\n   */\n  public runner: ArduinoRunner;\n  /**\n   * The Compiled Hex\n   */\n  public hex: string;\n  /**\n   * Power LED of Arduino\n   */\n  public powerLed: any;\n  /**\n   * Built in LED of arduino\n   */\n  public builtinLED: any;\n  /**\n   * Pin Names Mapped to the respective Node\n   */\n  public pinNameMap: any = {};\n  /**\n   * Servo attached to an arduino\n   */\n  private servos: any[] = [];\n  flag = '00';\n  prevPortD = 0;\n  prevPortB = 0;\n  portFlag = '';\n  delayTime = new Date(); // Extra\n  /**\n   * Constructor for Arduino\n   * @param canvas Raphael Paper\n   * @param x X position\n   * @param y Y Position\n   */\n\n  constructor(public canvas: any, x: number, y: number) {\n    super('ArduinoUno', x, y, 'Arduino.json', canvas);\n    // Logic to Create Name of an  arduino\n    let start = window['scope']['ArduinoUno'].length + 1;\n    this.name = ArduinoUno.prefix + start;\n    while (window['ArduinoUno_name'][this.name]) {\n      ++start;\n      this.name = ArduinoUno.prefix + start;\n    }\n    window['ArduinoUno_name'][this.name] = this;\n  }\n  /**\n   * Initialize Arduino\n   */\n  init() {\n    // Create The mapping\n    for (const node of this.nodes) {\n      this.pinNameMap[node.label] = node;\n    }\n    // Add a Analog value change Listener to the circuit nodes\n    for (let i = 0; i <= 5; ++i) {\n      this.pinNameMap[`A${i}`].addValueListener((val) => {\n        if (isUndefined(this.runner) || isNull(this.runner)) {\n          setTimeout(() => {\n            this.runner.adc.setAnalogValue(i, Math.floor(204.6 * val));\n          }, 300);\n        } else {\n          this.runner.adc.setAnalogValue(i, Math.floor(204.6 * val));\n        }\n      });\n    }\n\n    // this.pinNameMap['D12'].addValueListener((v) => {\n    //   if (isUndefined(this.runner) || isNull(this.runner)) {\n    //     setTimeout(() => {\n    //       this.pinNameMap['D12'].setValue(v, this.pinNameMap['D12']);\n    //     }, 300);\n    //     return;\n    //   } else {\n    //     if (this.runner.portB.pinState(4) === AVR8.PinState.Input) {\n    //       this.runner.portB.setPin(4, v > 0 ? 1 : 0);\n    //     }\n    //   }\n    // });\n\n    // For Port B D5 - D13 add a input listener\n    for (let i = 0; i <= 5; ++i) {\n      this.pinNameMap[`D${i + 8}`].addValueListener((v) => {\n        // console.log([i, v]);\n        if (isUndefined(this.runner) || isNull(this.runner)) {\n          setTimeout(() => {\n            this.pinNameMap[`D${i + 8}`].setValue(1, this.pinNameMap[`D${i + 8}`]);\n          }, 300);\n          return;\n        }\n        // Update the value of register only if pin is input\n        if (this.runner.portB.pinState(i) === AVR8.PinState.Input) {\n          this.runner.portB.setPin(i, v > 0 ? 1 : 0);\n        } else if (this.runner.portB.pinState(i) === AVR8.PinState.InputPullUp) {\n          // Handle Input PullUp\n          this.runner.portB.setPin(i, v);\n        }\n      });\n    }\n    // Handle Input For Port D D2 - D7\n    for (let i = 2; i <= 7; ++i) {\n      this.pinNameMap[`D${i}`].addValueListener((v) => {\n        if (isUndefined(this.runner) || isNull(this.runner)) {\n          setTimeout(() => {\n            this.pinNameMap[`D${i}`].setValue(v, this.pinNameMap[`D${i}`]);\n          }, 300);\n          return;\n        }\n        // Update the value of register only if pin is input\n        if (this.runner.portD.pinState(i) === AVR8.PinState.Input) {\n          this.runner.portD.setPin(i, v > 0 ? 1 : 0);\n        } else if (this.runner.portD.pinState(i) === AVR8.PinState.InputPullUp) {\n          // Handle Input PullUp\n          this.runner.portD.setPin(i, v);\n        }\n      });\n    }\n  }\n  /**\n   * Data which needs to be saved inside the database\n   */\n  SaveData() {\n    return {\n      name: this.name,\n      code: this.code\n    };\n  }\n  /**\n   * Load Data which is fetched from data base\n   * @param data Data fetched from the database\n   */\n  LoadData(data: any) {\n    this.name = data.data.name;\n    this.code = data.data.code;\n  }\n  /**\n   * Property of an Arduino\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    const label = document.createElement('label');\n    label.innerText = 'Name';\n    const inp = document.createElement('input');\n    inp.value = this.name;\n    body.appendChild(label);\n    body.appendChild(inp);\n    inp.onkeyup = (ev: KeyboardEvent) => {\n      if (ev.key.length > 1) {\n        return;\n      }\n      if (window['ArduinoUno_name'][inp.value]) {\n        // TODO: SHow Toast\n        console.log('Name already Exist');\n        return;\n      }\n      delete window['ArduinoUno_name'][this.name];\n      this.name = inp.value;\n      window['ArduinoUno_name'][this.name] = this;\n    };\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      title: 'Arduino Uno',\n      body\n    };\n  }\n  /**\n   * Delete arduino name\n   */\n  delete() {\n    delete window['ArduinoUno_name'][this.name];\n  }\n\n  /**\n   * Initialize Stuff for simulation.\n   */\n  initSimulation(): void {\n    this.builtinLED = this.elements[1].glow({\n      color: '#ffff00'\n    });\n    this.builtinLED.hide();\n    this.powerLed = this.elements[2].glow({\n      color: '#00ff00'\n    });\n    const myOutput = document.createElement('pre');\n    if (isNull(this.hex) && isUndefined(this.hex)) {\n      return;\n    }\n    this.runner = new ArduinoRunner(this.hex);\n\n    this.runner.portB.addListener((value) => {\n      if (this.portFlag !== 'D' &&\n        (this.flag === '21' || this.flag === '41')\n      ) {\n        this.EmitValueChangeEvent(); // Reset flag = \"00\";\n        this.portFlag = 'B';\n      } else {\n        this.portFlag = '';\n      }\n      // if (this.flag === '00') this.flag = '21';\n      this.flag = '21';\n      this.prevPortB = value;\n      this.delayTime = new Date();\n\n      for (let i = 0; i <= 5; ++i) {\n        if (\n          this.runner.portB.pinState(i) !== AVR8.PinState.Input &&\n          this.runner.portB.pinState(i) !== AVR8.PinState.InputPullUp\n        ) {\n          this.pinNameMap[`D${i + 8}`].setValue(((value >> i) & 1) * 5.0, null);\n        }\n      }\n      if ((value >> 5) & 1) {\n        this.builtinLED.show();\n      } else {\n        this.builtinLED.hide();\n      }\n    });\n    this.runner.portC.addListener((value) => {\n      console.log(value);\n    });\n\n    this.runner.portD.addListener((value) => {\n      if (this.portFlag !== 'B' &&\n        (this.flag === '21' || this.flag === '41')\n      ) {\n        this.EmitValueChangeEvent(); // Reset flag = \"00\";\n        this.portFlag = 'D';\n      } else {\n        this.portFlag = '';\n      }\n      // if (this.flag === '00') this.flag = '41';\n      this.flag = '41';\n      this.prevPortD = value;\n      this.delayTime = new Date();\n      if (\n        this.runner.portD.pinState(0) !== AVR8.PinState.Input &&\n        this.runner.portD.pinState(0) !== AVR8.PinState.InputPullUp\n      ) {\n        this.pinNameMap[`RX0`].setValue((value & 1) * 5.0, null);\n      }\n\n      if (\n        this.runner.portD.pinState(1) !== AVR8.PinState.Input &&\n        this.runner.portD.pinState(1) !== AVR8.PinState.InputPullUp\n      ) {\n        this.pinNameMap[`TX0`].setValue(((value >> 1) & 1) * 5.0, null);\n      }\n\n      for (let i = 2; i <= 7; ++i) {\n        if (\n          this.runner.portD.pinState(i) !== AVR8.PinState.Input &&\n          this.runner.portD.pinState(i) !== AVR8.PinState.InputPullUp\n        ) {\n          this.pinNameMap[`D${i}`].setValue(((value >> i) & 1) * 5.0, null);\n        }\n      }\n    });\n\n    this.runner.usart.onByteTransmit = (value) => {\n      /// TODO: Show On Console\n      myOutput.textContent += String.fromCharCode(value);\n    };\n\n    document.getElementById('msg').append(myOutput);\n    this.pinNameMap['5V'].setValue(5, null);\n    this.pinNameMap['3.3V'].setValue(3.3, null);\n\n    if (this.servos.length > 0) {\n      for (const ser of this.servos) {\n        this.runner.addServo(ser.port, ser.pin, ser.call, ser.pwm);\n      }\n      this.servos = [];\n    }\n    this.runner.execute();\n\n    // Handle Input Pull Up on portB pins\n    for (let i = 0; i <= 5; ++i) {\n      // check if pin state is inputPullUp\n      if (this.runner.portB.pinState(i) === AVR8.PinState.InputPullUp) {\n        // set pullUpEnabled boolean to true\n        this.pinNameMap[`D${i + 8}`].pullUpEnabled = true;\n        // set pin value to 1 by default\n        this.runner.portB.setPin(i, 1);\n      }\n    }\n    // Handle Input Pull Up on portD pins\n    for (let i = 2; i <= 7; ++i) {\n      // check if pin state is inputPullUp\n      if (this.runner.portD.pinState(i) === AVR8.PinState.InputPullUp) {\n        // set pullUpEnabled boolean to true\n        this.pinNameMap[`D${i}`].pullUpEnabled = true;\n        // set pin value to 1 by default\n        this.runner.portD.setPin(i, 1);\n      }\n    }\n\n  }\n  /**\n   * Remove arduino runner on stop simulation.\n   */\n  closeSimulation(): void {\n    if (this.runner) {\n      this.runner.delete();\n      this.runner = null;\n    }\n    if (this.builtinLED) {\n      this.builtinLED.remove();\n      this.builtinLED = null;\n    }\n    if (this.powerLed) {\n      this.powerLed.remove();\n      this.powerLed = null;\n    }\n  }\n  /**\n   * Add Servo to the queue\n   * @param pin Circuit node where servo is connected\n   * @param callback Callback which needs to call on change in PWM\n   */\n  addServo(pin: Point, callback: (angle: number, prevAngle: number) => void) {\n    const tmp = this.getPort(pin.label);\n    this.servos.push({\n      port: tmp.name,\n      pin: tmp.pin,\n      call: callback\n    });\n  }\n  /**\n   * Add PWM to the queue\n   * @param pin Circuit node where pwm component is connected\n   * @param callback Callback on change in pwm (The Value needs to be divided by 100)\n   */\n  addPWM(pin: Point, callback: (volt: number, prev: number) => void) {\n    const tmp = this.getPort(pin.label);\n    if (this.runner) {\n      this.runner.addServo(\n        tmp.name,\n        tmp.pin,\n        callback,\n        true\n      );\n    } else {\n      this.servos.push({\n        port: tmp.name,\n        pin: tmp.pin,\n        call: callback,\n        pwm: true\n      });\n    }\n  }\n  /**\n   * Returns the port name and pin mumber\n   * @param pinName Circuit Node Name\n   */\n  getPort(pinName: string) {\n    const num = parseInt(pinName.substr(1), 10);\n    if (!isNaN(num)) {\n      if (num >= 0 && num <= 7) {\n        return { name: 'portD', pin: num };\n      } else if (num > 7 && num <= 13) {\n        return { name: 'portB', pin: num - 8 };\n      }\n    }\n  }\n\n\n  EmitValueChangeEvent() {\n    const value = (this.prevPortB << 8) | (this.prevPortD & 255);\n    GraphDataService.voltageChange.emit({\n      value,\n      time: this.delayTime,\n      arduino: { id: this.id, name: this.name },\n    });\n    this.flag = '00';\n    // this.portFlag = '';\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/outputs/Buzzer.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { Point } from '../Point';\nimport { ArduinoUno } from '../outputs/Arduino';\nimport { BreadBoard } from '../General';\n\n/**\n * Declare window so that custom created function don't throw error\n */\ndeclare var window;\n\n/**\n * Buzzer Class\n */\nexport class Buzzer extends CircuitElement {\n  /**\n   * Map pin name to the circuit node\n   */\n  pinNamedMap: any = {};\n  /**\n   * The oscillator for buzzer.\n   */\n  oscillator: any;\n  /**\n   * The Arduino uno which is connected to the Buzzer.\n   */\n  arduino: ArduinoUno;\n  /**\n   * Audio Context\n   */\n  audioCtx: AudioContext;\n  /**\n   * Toggle for wether buzzer is beeping or not.\n   */\n  sound = false;\n  /**\n   * Id for setInterval hook.\n   */\n  setIntervId: any;\n  /**\n   * Set to keep track of visited nodes\n   */\n  visitedNodesv2 = new Set();\n  /**\n   * Keep track of previous value\n   */\n  prev = -2;\n  /**\n   * Flag to check if logic function's recursion should be skipped\n   */\n  skipCheck = false;\n  /**\n   * If all nodes of element are connected or not\n   */\n  allNodesConnected = false;\n\n  /**\n   * pushbutton constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(private canvas: any, public x: number, public y: number) {\n    super('Buzzer', x, y, 'Buzzer.json', canvas);\n  }\n  /** init is called when the component is complety drawn to the canvas */\n  init() {\n    // console.log(this.nodes[0].label);\n    // console.log(this.nodes[1].label);\n    for (const x of this.nodes) {\n      this.pinNamedMap[x.label] = x;\n    }\n    this.nodes[0].addValueListener((v) => this.logic(v));\n    this.nodes[1].addValueListener((v) => this.logic(v));\n  }\n  /**\n   * Logic for beeping sound\n   * @param val The Value on the positive pin\n   */\n  logic(val: number) {\n    // TODO: Handle PWM\n    if (this.prev === val) {\n      this.skipCheck = true;\n    }\n\n    if (!this.allNodesConnected) {\n      const arduinoEnd: any = this.getRecArduinov2(this.pinNamedMap['POSITIVE'], 'POSITIVE');\n      const negativeEnd = this.getRecArduinov2(this.pinNamedMap['Negative'], 'Negative');\n      if (arduinoEnd && negativeEnd) {\n        if (negativeEnd.hasOwnProperty('label')) {\n          if (negativeEnd.label === 'GND' || (negativeEnd.value === 0 && arduinoEnd.value > 0)) {\n            this.allNodesConnected = true;\n          }\n        }\n      }\n    }\n\n    if (this.nodes[0].isConnected() && this.nodes[1].isConnected()) {\n      if (this.allNodesConnected) {\n        if (val === 5 || this.nodes[0].value === 5) {\n          if (this.oscillator && !this.sound) {\n            this.oscillator.connect(this.audioCtx.destination);\n            this.sound = true;\n          }\n        } else {\n          if (this.oscillator && this.sound) {\n            this.oscillator.disconnect(this.audioCtx.destination);\n            this.sound = false;\n          }\n        }\n        if (val >= 0 && !this.skipCheck) {\n          this.prev = val;\n          this.nodes[1].setValue(val, null);\n        } else {\n          this.skipCheck = false;\n          return;\n        }\n      }\n    } else {\n      // TODO: Show Toast\n      window.showToast('Buzzer is not Connected properly');\n    }\n  }\n  /**\n   * returns properties object\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties() {\n    const body = document.createElement('div');\n    return {\n      title: 'Buzzer',\n      keyName: this.keyName,\n      id: this.id,\n      body\n    };\n  }\n  /**\n   * Initialize Variable and callback when start simulation is pressed\n   */\n  initSimulation() {\n    this.allNodesConnected = false;\n    this.visitedNodesv2.clear();\n\n    const arduinoEnd: any = this.getRecArduinov2(this.pinNamedMap['POSITIVE'], 'POSITIVE');\n    const negativeEnd = this.getRecArduinov2(this.pinNamedMap['Negative'], 'Negative');\n\n    // make allNodesConnected boolean true if negative is connected to GND\n    if (negativeEnd) {\n      if (negativeEnd.hasOwnProperty('label')) {\n        if (negativeEnd.label === 'GND') {\n          this.allNodesConnected = true;\n        }\n      }\n    }\n    // Show error\n    if (!arduinoEnd || !negativeEnd) {\n      window.showToast('Buzzer is not Connected properly');\n      return;\n    }\n\n    if (arduinoEnd) {\n      if (arduinoEnd.connectedTo) {\n        this.arduino = arduinoEnd.parent;\n      }\n    }\n\n    const AudioContext = window.AudioContext || window.webkitAudioContext;\n    this.audioCtx = new AudioContext();\n    this.oscillator = this.audioCtx.createOscillator();\n    this.oscillator.type = 'square';\n    this.oscillator.frequency.value = 2300;\n    const prescaler = [8, 32, 64, 128, 256, 1024];\n    this.setIntervId = setInterval(() => {\n      try {\n        const tccr2b = this.arduino.runner.timer2.TCCRB;\n        const ocr2a = this.arduino.runner.timer2.ocrA;\n        if (ocr2a !== 0) {\n          this.oscillator.frequency.value = Math.round(16000000 / (2 * prescaler[tccr2b - 2] * (ocr2a + 1)));\n        }\n      } catch (error) {\n      }\n    }, 10);\n    this.oscillator.start();\n  }\n  /** Function removes all callbacks  */\n  closeSimulation() {\n    if (this.oscillator && this.sound) {\n      this.oscillator.disconnect(this.audioCtx.destination);\n      this.sound = false;\n    }\n    this.audioCtx = null;\n    this.oscillator = null;\n    this.arduino = null;\n    this.prev = -2;\n    this.skipCheck = false;\n    setTimeout(() => {\n      clearInterval(this.setIntervId);\n    }, 100);\n  }\n\n  /**\n   * Return the node which is connected to arduino by recursively finding connected node\n   * @param node The Node which need to be checked\n   */\n  getRecArduinov2(node: Point, startedOn: string) {\n    try {\n      if (node.connectedTo.start.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to start node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.start;\n      } else if (node.connectedTo.end.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to end node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.end;\n      } else if (node.connectedTo.start.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.start.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.end.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'Battery9v' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to 9V Battery\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'CoinCell' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to Coin Cell\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'RelayModule') {\n        // TODO: Handle RelayModule\n        if (startedOn === 'POSITIVE') {\n          // If search was started on Positive node then return connected node of VCC in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[3], startedOn);\n        } else if (startedOn === 'NEGATIVE') {\n          // If search was started on Negative node then return connected node of GND in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[5], startedOn);\n        }\n      } else {\n        // TODO: If nothing matches\n        // IF/ELSE: Determine if start is to be used OR end for further recursion\n        if (node.connectedTo.end.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.end.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.end.parent.nodes[e].gid !== node.connectedTo.end.gid\n              && !this.visitedNodesv2.has(node.connectedTo.end.parent.nodes[e].gid) && node.connectedTo.end.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.end.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.end.parent.nodes[e], startedOn);\n            }\n          }\n        } else if (node.connectedTo.start.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.start.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.start.parent.nodes[e].gid !== node.connectedTo.start.gid\n              && !this.visitedNodesv2.has(node.connectedTo.start.parent.nodes[e].gid)\n              && node.connectedTo.start.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.start.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.start.parent.nodes[e], startedOn);\n            }\n          }\n        }\n\n      }\n    } catch (e) {\n      console.warn(e);\n      return false;\n    }\n\n  }\n\n  /**\n   * Recursive Function to handle BreadBoard\n   * @param node Node which is to be checked for BreadBoard\n   */\n  private getRecArduinoBreadv2(node: Point, startedOn: string) {\n    // IF/ELSE: Determine if start is to be used OR end for further recursion\n    if (node.connectedTo.end.gid !== node.gid) {\n      const bb = (node.connectedTo.end.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.end.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.end.label.substring(1, node.connectedTo.end.label.length)) {\n            const ascii = node.connectedTo.end.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    } else if (node.connectedTo.start.gid !== node.gid) {\n      const bb = (node.connectedTo.start.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.start.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.start.label.substring(1, node.connectedTo.start.label.length)) {\n            const ascii = node.connectedTo.start.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    }\n\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/outputs/Display.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport {\n  DataDisplayState, DataProcessingMode, BitState,\n  Font8x5DisplayState, Font10x5DisplayState,\n  FourBitState, EightBitState,\n  WriteDataProcessingMode, ReadDataProcessingMode,\n  RegisterState, DataRegisterState, InstructionRegisterState,\n  ActiveAddress, RegisterType, DataMode,\n} from './LCD/LCDStates';\nimport { LCDCharacterPanel } from './LCD/LCDPanel';\nimport { DDRAM, CGROM, CGRAM, RAM } from './LCD/MemorySchema';\nimport { MathUtils } from '../MathUtils';\nimport { ArduinoUno } from './Arduino';\nimport { BoundingBox } from '../Geometry';\nimport { Point } from '../Point';\nimport { BreadBoard } from '../General';\n\n/**\n * LCD16X2 Class\n */\nexport class LCD16X2 extends CircuitElement {\n  /**\n   * The Connected Arduino\n   */\n  arduino: CircuitElement = null;\n\n  /**\n   * Variable to state if the LCD is connected properly or not.\n   */\n  connected = true;\n\n  /**\n   * Map of pin name to Circuit Node\n   */\n  pinNamedMap: any = {};\n\n  /**\n   * Previous value at the `E` node\n   */\n  previousEValue = 0;\n\n  /**\n   * Previous value at `V0` node\n   */\n  previousV0Value = 0;\n\n  isDisplayOn = false;\n\n  isCursorOn = false;\n\n  isCursorPositionCharBlinkOn = false;\n\n  autoCursorShift = 0;\n\n  autoDisplayShift = 0;\n\n  /**\n   * 2-D Array of 8-bit characters representing DDRAM of the LCD\n   */\n  ddRam: DDRAM;\n\n  /**\n   * 3-D array of character font:\n   * higher-bit -> lower-bit -> characterFont\n   */\n  cgRom: CGROM;\n\n  /**\n   * 64-byte CGRAM\n   */\n  cgRam: CGRAM;\n\n  /**\n   * Address of the DDRAM\n   */\n  ddRamAddress: number;\n\n  /**\n   * Address of the CGRAM\n   */\n  cgRamAddress: number;\n\n  /**\n   * Current Active address\n   */\n  activeAddress: ActiveAddress;\n\n  /**\n   * Map from character panel index to character panel\n   */\n  characterPanels: {[key: string]: LCDCharacterPanel} = {};\n\n  /**\n   * Data processing mode of LCD: Read/Write\n   */\n  dataProcessingMode: DataProcessingMode;\n\n  /**\n   * Write Data processing concrete object\n   */\n  writeDataMode: WriteDataProcessingMode;\n\n  /**\n   * Read Data processing concrete object\n   */\n  readDataMode: ReadDataProcessingMode;\n\n  /**\n   * Bit state of LCD: 4-bit/8-bit\n   */\n  bitState: BitState;\n\n  /**\n   * Concrete 4-bit state\n   */\n  fourBitState: FourBitState;\n\n  /**\n   * Concrete 8-bit state\n   */\n  eightBitState: EightBitState;\n\n  /**\n   * Data display state of LCD: Font 10x5 vs 10x8\n   */\n  dataDisplayState: DataDisplayState;\n\n  /**\n   * Concrete data display state for 8x5 fonts\n   */\n  font8x5DisplayState: Font8x5DisplayState;\n\n  /**\n   * Concrete data display state for 10x5 fonts\n   */\n  font10x5DisplayState: Font10x5DisplayState;\n\n  /**\n   * Register state of the LCD\n   */\n  registerState: RegisterState;\n\n  /**\n   * Data Register state's concrete class\n   */\n  dataRegisterState: DataRegisterState;\n\n  /**\n   * Instruction register state's concrete class\n   */\n  instructionRegisterState: InstructionRegisterState;\n\n  /**\n   * Start index (left-top) of the DDROM being displayed on the LCF\n   */\n  displayStartIndex: [number, number] = [0, 0];\n\n  /**\n   * End index (right-bottom) of the DDROM being displayed on the LCF\n   */\n  displayEndIndex: [number, number];\n\n  /**\n   * Busy flag of the lcd\n   */\n  busyFlag = false;\n\n  /**\n   * LCD16X2 constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('LCD16X2', x, y, 'LCD16X2.json', canvas);\n  }\n\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'LCD Display 16x2'\n    };\n  }\n\n  /**\n   * Returns the bounding box for the LCD\n   */\n  getBoundingBox(): BoundingBox {\n    const lcdImageElement = this.elements.items.find(el => el.type === 'image')[0];\n    const lcdBBox = lcdImageElement.getBBox();\n    lcdBBox.x += this.tx;\n    lcdBBox.y += this.ty;\n    return BoundingBox.loadFromRaphaelBbox(lcdBBox);\n  }\n\n  /**\n   * Turns on/off the display\n   * @param isDisplayOn true for switching on, false for off\n   */\n  setDisplayOn(isDisplayOn: boolean) {\n    this.isDisplayOn = isDisplayOn;\n  }\n\n  /**\n   * Turns on/off the cursor\n   * @param isCursorOn true for switching on, false for off\n   */\n  setCursorOn(isCursorOn: boolean) {\n    this.isCursorOn = isCursorOn;\n  }\n\n  /**\n   * Sets cursor blink on/off\n   * @param isCursorPositionCharBlinkOn true for switching on, false for off\n   */\n  setCursorPositionCharBlink(isCursorPositionCharBlinkOn: boolean) {\n    this.isCursorPositionCharBlinkOn = isCursorPositionCharBlinkOn;\n  }\n\n  /**\n   * Sets address of the DDRAM\n   * @param address new address for the DDRAM\n   */\n  setDdRamAddress(address): void {\n    this.ddRamAddress = address;\n  }\n\n  /**\n   * Gets the voltage input at VCC node\n   */\n  getVCC(): number {\n    return this.pinNamedMap['VCC'].value;\n  }\n\n  /**\n   * Gets the voltage input at GND node\n   */\n  getGND(): number {\n    return this.pinNamedMap['GND'].value;\n  }\n\n  /**\n   * Gets the voltage input at V0 node\n   */\n  getV0(): number {\n    return this.pinNamedMap['V0'].value;\n  }\n\n  /**\n   * Gets the current register type of the lcd\n   */\n  getRegisterType(): RegisterType {\n    return this.pinNamedMap['RS'].value & 1;\n  }\n\n  /**\n   * Gets the data mode of the lcd\n   */\n  getDataMode(): DataMode {\n    return this.pinNamedMap['RW'].value & 1;\n  }\n\n  /**\n   * Updates the registerState to sync it with the value at node 'RS'\n   */\n  private loadRegisterState(): void {\n    const registerType = this.getRegisterType();\n    this.registerState = registerType === RegisterType.Data ? this.dataRegisterState : this.instructionRegisterState;\n  }\n\n  /**\n   * Updates the dataProcessingMode to sync it with the value at node 'RW'\n   */\n  private loadDataMode(): void {\n    const dataMode = this.getDataMode();\n    this.dataProcessingMode = dataMode === DataMode.Read ? this.readDataMode : this.writeDataMode;\n  }\n\n  private setBusyFlag(value: boolean): void {\n    this.busyFlag = value;\n  }\n\n  /**\n   * Gets the active ram and its address\n   * An LCD can have either CGRAM or DDRAM active while reading/writing the data.\n   */\n  getActiveRamAndAddress(): [RAM, number] {\n    if (this.activeAddress === ActiveAddress.CGRAM) {\n      return [this.cgRam, this.cgRamAddress];\n    }\n    return [this.ddRam, this.ddRamAddress];\n  }\n\n  /**\n   * Gets the chacracter panel at the current DDRAM address\n   */\n  getCurrentCharacterPanel() {\n    return this.getCharacterPanel(this.ddRamAddress);\n  }\n\n  /**\n   * Moves the address of the CGRAM\n   * @param distance distance by which to move the address\n   */\n  moveCgRamAddress(distance: number) {\n    this.cgRamAddress += distance;\n  }\n\n  /**\n   * Moves cursor by one step in either left/right direction\n   * @param direction direction of the movement, 1 for right, -1 for left\n   */\n  moveCursor(direction: 1 | -1) {\n    let newDdRamAddress = this.ddRamAddress + direction;\n\n    // applying max value condition\n    newDdRamAddress = Math.min(0x67, newDdRamAddress);\n\n    // applying min value condition\n    newDdRamAddress = Math.max(0x00, newDdRamAddress);\n\n    // applying [0x27, 0x40] condition\n    if (newDdRamAddress > 0x27 && newDdRamAddress < 0x40) {\n      newDdRamAddress = direction > 0 ? 0x40 : 0x27;\n    }\n\n    this.setDdRamAddress(newDdRamAddress);\n  }\n\n  /**\n   * Checks if a character panel with displayIndex `index` is in sight of the LCD or not\n   * @param index index to check\n   */\n  private isInSight(index: [number, number]) {\n    return MathUtils.isPointBetween(index, this.displayStartIndex, this.displayEndIndex);\n  }\n\n  /**\n   * Shifts the display with `numSteps` steps\n   * @param numSteps number of steps to move the display with\n   */\n  private shiftDisplay(numSteps: number) {\n    const stepSize = this.getInterSpacingHorizontal();\n    for (const characterPanel of Object.values(this.characterPanels)) {\n      const oldColumnIndex = characterPanel.displayIndex[1];\n      const newColumnIndex = MathUtils.modulo(oldColumnIndex - numSteps, this.ddRam.N_COLUMN);\n      characterPanel.displayIndex[1] = newColumnIndex;\n\n      characterPanel.hidden  = !this.isInSight(characterPanel.displayIndex);\n      characterPanel.shift((newColumnIndex - oldColumnIndex) * stepSize);\n    }\n  }\n\n  /**\n   * Scrolls the display to one step left\n   */\n  scrollDisplayLeft() {\n    this.shiftDisplay(-1);\n  }\n\n  /**\n   * Scrolls the display to one step right\n   */\n  scrollDisplayRight() {\n    this.shiftDisplay(1);\n  }\n\n  /**\n   * Gets the character panel at the given ddram address\n   * @param address ddRam address\n   */\n  getCharacterPanel(address) {\n    // converting address to [i, j]\n    const index = this.ddRam.convertAddressToIndex(address);\n    return this.characterPanels[`${index[0]}:${index[1]}`];\n  }\n\n  /**\n   * Clears the display of the lcd\n   */\n  clearDisplay() {\n    Object.values(this.characterPanels).forEach((panel: LCDCharacterPanel) => panel.clear());\n  }\n\n  /**\n   * event listener for node 'V0\n   * @param newValue new value at node 'V0'\n   * @param prevValue previous value at node 'V0'\n   */\n  v0Listener(newValue, prevValue) {\n    if (prevValue !== newValue) {\n      let newContrast = newValue / 500 * 100;\n\n      // bounding the value between 0 and 100\n      newContrast = Math.min(100, newContrast);\n      newContrast = Math.max(0, newContrast);\n      Object.values(this.characterPanels).forEach(panel => panel.setContrast(newContrast));\n    }\n  }\n\n  /**\n   * Checks if power supply is enough\n   */\n  isPowerSupplyEnough() {\n    const vcc = this.getVCC();\n    if (vcc < 3.3 || vcc > 5) {\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * event listener for node `E`\n   * @param newValue new value at the node `E`\n   */\n  eSignalListener(newValue) {\n    if (!this.isPowerSupplyEnough()) {\n      console.log('Not enough power supply.');\n      return;\n    }\n\n    this.setBusyFlag(true);\n\n    const prevValue = this.previousEValue;\n\n    // identifying high-low pulse\n    if (prevValue > 0 && newValue === 0) {\n      this.loadRegisterState();\n      this.loadDataMode();\n      this.dataProcessingMode.processData();\n      this.refreshLCD();\n    }\n    this.previousEValue = newValue;\n    this.setBusyFlag(false);\n  }\n\n  /**\n   * Get set of panels which are in the view of the LCD\n   */\n  getDisplayablePanels(): Set<LCDCharacterPanel> {\n    const filteredPanels = Object.values(this.characterPanels)\n                                .filter(panel =>\n                                  MathUtils.isPointBetween(panel.displayIndex, this.displayStartIndex, this.displayEndIndex\n                                ));\n    return new Set(filteredPanels);\n  }\n\n  /**\n   * Refreshs LCD to take in account recent changes\n   */\n  refreshLCD() {\n    const displayablePanels = this.getDisplayablePanels();\n    for (const panel of Object.values(this.characterPanels)) {\n      const show = displayablePanels.has(panel);\n      const address = this.ddRam.convertIndexToAddress(panel.index);\n\n      // turning cursor on and off\n      panel.changeCursorDisplay(false);\n      panel.setBlinking(false);\n\n      if (this.isCursorOn) {\n        if (this.ddRamAddress === address) {\n          if (this.isCursorPositionCharBlinkOn) {\n            panel.setBlinking(true);\n          }\n          panel.changeCursorDisplay(true);\n        }\n      }\n\n      // refreshing canvas of all the pixels\n      panel.pixels.forEach(pixelRow => pixelRow.forEach(pixel => {\n        if (pixel.canvas) {\n          pixel.refresh();\n        } else {\n          pixel.canvas = this.DrawElement(this.canvas, [pixel.getCanvasRepr()])[0];\n          pixel.canvas.transform(`t${this.tx},${this.ty}`);\n          if (!show) {\n            pixel.hide();\n          }\n        }\n      }));\n    }\n  }\n\n  /**\n   * @param bitState new bit state\n   */\n  setBitState(bitState: BitState) {\n    this.bitState = bitState;\n  }\n\n  /**\n   * @param dataDisplayState new data display state\n   */\n  setDataDisplayState(dataDisplayState: DataDisplayState, numLines?: number) {\n    this.dataDisplayState = dataDisplayState;\n    if (numLines) {\n      this.dataDisplayState.setNLines(numLines);\n    }\n    this.createDdRam();\n    this.createCgRom();\n    this.generateCharacterPanels();\n  }\n\n  /**\n   * @param dataProcessingMode new data processing mode\n   */\n  setDataProcessingMode(dataProcessingMode: DataProcessingMode) {\n    this.dataProcessingMode = dataProcessingMode;\n  }\n\n  /**\n   * Returns the horizontal spacing between two consecutive character panels\n   */\n  getInterSpacingHorizontal() {\n    return (this.data.gridColumns * this.data.gridWidth) + this.data.interSpacing;\n  }\n\n  /**\n   * Returns the vertical spacing between two consecutive character panels\n   */\n  getInterSpacingVertical() {\n    return (this.data.gridRows * this.data.gridWidth) + (this.data.interSpacing * 1.5);\n  }\n\n  /**\n   * Resets the lcd by initializing all the variables\n   */\n  reset() {\n\n    this.isDisplayOn = false;\n    this.isCursorOn = false;\n    this.isCursorPositionCharBlinkOn = false;\n\n    // Initialising data display state\n    this.font8x5DisplayState = new Font8x5DisplayState(this, 2);\n    this.font10x5DisplayState = new Font10x5DisplayState(this, 1);\n    this.dataDisplayState = this.font8x5DisplayState;\n\n    // Initialising data processing state\n    this.readDataMode = new ReadDataProcessingMode(this);\n    this.writeDataMode = new WriteDataProcessingMode(this);\n    this.dataProcessingMode = this.readDataMode;\n\n    // Initialising bit mode state\n    this.fourBitState = new FourBitState(this);\n    this.eightBitState = new EightBitState(this);\n    this.bitState = this.eightBitState;\n\n    // Initialising register state\n    this.dataRegisterState = new DataRegisterState(this);\n    this.instructionRegisterState = new InstructionRegisterState(this);\n    this.registerState = this.instructionRegisterState;\n\n    // Setting display start and end indices\n    this.displayStartIndex = [0, 0];\n    this.displayEndIndex = [this.data.rows, this.data.columns];\n\n    // Initialising CGROM, DDRAM, and CGRAM\n    this.createCgRom();\n    this.createDdRam();\n    this.setDdRamAddress(0x00);\n    this.cgRam = new CGRAM();\n\n    this.clearDisplay();\n    this.setDisplayToHome();\n    this.refreshLCD();\n  }\n\n  /**\n   * Sets the display to home position\n   */\n  setDisplayToHome() {\n    // shifting panels to their original position\n    const panel00 = this.characterPanels['0:0'];\n    if (!panel00) {\n      return;\n    }\n\n    const offset = panel00.displayIndex[1] - panel00.index[1];\n    this.shiftDisplay(offset);\n  }\n\n  /**\n   * Generates the DDRAM for the LCD\n   */\n  createDdRam() {\n    this.ddRam = DDRAM.createDDRAMForLCD(this.dataDisplayState.getRows());\n  }\n\n  /**\n   * Generates the CGROM for the LCD\n   */\n  createCgRom() {\n    this.cgRom = new CGROM(this.dataDisplayState.getFontSize());\n  }\n\n  /**\n   * Generates character panels inside the lcd\n   */\n  generateCharacterPanels() {\n    this.destroyCharacterPanels();\n    const posX = this.data.startX;\n    const posY = this.data.startY;\n    // Getting the number of pixel/panel rows, columns from the active data display state\n    const gridRows = this.dataDisplayState.getPixelRows();\n    const gridColumns = this.dataDisplayState.getPixelColumns();\n    const rows = this.dataDisplayState.getRows();\n    const columns = this.dataDisplayState.getColumns();\n\n    for (let k = 0; k < this.ddRam.N_ROW; k++) { // Rows: 1\n      for (let l = 0; l < this.ddRam.N_COLUMN; l++) { // Columns: 16 (Characters)\n        const panelPosX = posX + l * this.getInterSpacingHorizontal();\n        const panelPosY = posY + k * this.getInterSpacingVertical();\n\n        const hidden = k >= rows || l >= columns;\n        const characterPanel = new LCDCharacterPanel([k, l], gridRows, gridColumns, panelPosX, panelPosY, this.x, this.y,\n                                                      this.data.gridHeight, this.data.gridWidth,\n                                                      this.data.barColor, this.data.barGlowColor, this.data.intraSpacing,\n                                                      [k, l], hidden, 100);\n        this.characterPanels[characterPanel.index.join(':')] = characterPanel;\n      }\n    } // Row ends\n  }\n\n  /**\n   * destroys all the character panels\n   */\n  destroyCharacterPanels() {\n    Object.values(this.characterPanels).forEach(panel => panel.destroy());\n  }\n\n  init() {\n    /**\n     * Draws lcd grid (16x2) each containing a block of 8 rows x 5 columns\n     */\n\n    // Resets the lcd's properties\n    this.reset();\n\n    // Refreshes the LCD\n    this.refreshLCD();\n\n    for (const node of this.nodes) {\n      this.pinNamedMap[node.label] = node;\n    }\n\n    // adding listeners to E listener\n    this.pinNamedMap['E'].addValueListener(this.eSignalListener.bind(this));\n    // this.pinNamedMap['V0'].addValueListener(this.v0Listener.bind(this));\n  }\n\n  /** Simulation Logic */\n  logic(_, node) {\n    // console.log(node.label, node.value);\n  }\n\n  /**\n   * Called on Start Simulation\n   */\n  initSimulation(): void {\n    // Generates the character panels\n    this.generateCharacterPanels();\n\n    // Get the V0 pin\n    let connectedPin: Point = null;\n    const v0Pin = this.nodes[2];\n\n    if (!v0Pin.connectedTo) {\n      window['showToast']('V0 pin of the LCD is not connected to power source.');\n      return;\n    }\n\n    const v0wire = v0Pin.connectedTo;\n    connectedPin = v0wire.start.parent === this ? v0wire.end : v0wire.start;\n\n    // finding the arduino connected to the LCD to start PWM\n    if (connectedPin.parent.keyName === 'ArduinoUno') {\n      this.arduino = connectedPin.parent;\n    } else if (connectedPin.parent.keyName === 'BreadBoard') {\n      const breadboard = connectedPin.parent as BreadBoard;\n\n      const connectedRow = connectedPin.label.charCodeAt(0);\n      const isConnectedRowInFirstBlock = connectedRow <= 101;\n\n      // checking for all the nodes with the same x-coordinate\n      for (const neighbor of breadboard.sameXNodes[connectedPin.x]) {\n        const neighborRow = neighbor.label.charCodeAt(0);\n        const isSameBlock = neighborRow <= 101 === isConnectedRowInFirstBlock;\n        if (neighbor.y !== connectedPin.y && isSameBlock) {\n          if (neighbor.connectedTo) {\n            let arduinoPin = null;\n\n            if (neighbor.connectedTo.start.parent.keyName === 'ArduinoUno') {\n              arduinoPin = neighbor.connectedTo.start;\n            } else if (neighbor.connectedTo.end.parent.keyName === 'ArduinoUno') {\n              arduinoPin = neighbor.connectedTo.end;\n            }\n\n            if (arduinoPin) {\n              this.arduino = arduinoPin.parent;\n              connectedPin = arduinoPin;\n              this.connected = true;\n              break;\n            }\n          }\n        }\n      }\n    }\n\n    // Add PWM event on arduino\n    (this.arduino as ArduinoUno).addPWM(connectedPin, this.v0Listener.bind(this));\n\n  }\n  /**\n   * Called on Stop Simulation\n   */\n  closeSimulation(): void {\n    // this.elements.remove();\n    this.arduino = null;\n    this.reset();\n    this.destroyCharacterPanels();\n  }\n}\n/**\n * SevenSegment Class\n */\nexport class SevenSegment extends CircuitElement {\n  /**\n   * The Seven Segment Bar Color\n   */\n  static barColor: string;\n  /**\n   * The Seven Segment Bar glow color\n   */\n  static barGlowColor: string;\n  /**\n   * The Bar mapping\n   */\n  static mapping: number[] = [];\n  /**\n   * Stores list of Raphael Glow elements\n   */\n  glows = [];\n  /**\n   * Map of Pin name to Circuit Node\n   */\n  pinNamedMap: any = {};\n  /**\n   * SevenSegment constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: any, y: any) {\n    super('SevenSegment', x, y, 'SevenSegment.json', canvas);\n  }\n  /** init is called when the component is completely drawn to the canvas */\n  init() {\n    if (SevenSegment.mapping.length === 0) {\n      SevenSegment.mapping = this.data.mapping;\n      SevenSegment.barColor = this.data.barColor;\n      SevenSegment.barGlowColor = this.data.barGlowColor;\n    }\n    for (const value of SevenSegment.mapping) {\n      this.elements[value].attr({ fill: SevenSegment.barColor });\n      this.glows.push(null);\n    }\n    // Remove From memory\n    this.data.mapping = null;\n    this.data.barColor = null;\n    this.data.barGlowColor = null;\n    this.data = null;\n    // let x = 0;\n    for (const node of this.nodes) {\n      // console.log([x++, node.label]);\n      if (node.label !== 'COMMON') {\n        this.pinNamedMap[node.label] = node;\n        node.addValueListener((v) => this.logic(v));\n      }\n    }\n  }\n  /** Simulation Logic */\n  logic(_) {\n    // console.log(k)\n    let byte = 0;\n    // create a mapping for node label to node\n    byte |= (this.pinNamedMap['a'].value > 0) ? 1 : 0;\n    byte |= (this.pinNamedMap['b'].value > 0) ? 2 : 0;\n    byte |= (this.pinNamedMap['C'].value > 0) ? 4 : 0;\n    byte |= (this.pinNamedMap['d'].value > 0) ? 8 : 0;\n    byte |= (this.pinNamedMap['e'].value > 0) ? 16 : 0;\n    byte |= (this.pinNamedMap['f'].value > 0) ? 32 : 0;\n    byte |= (this.pinNamedMap['g'].value > 0) ? 64 : 0;\n    byte |= (this.pinNamedMap['DP'].value > 0) ? 128 : 0;\n    this.animate(byte);\n  }\n  /** animation caller when start simulation is pressed */\n  animate(value: number) {\n    value = value & 0xFF;\n    for (let i = 0; i < 8; ++i) {\n      const x = this.elements[SevenSegment.mapping[i]];\n      if (this.glows[i]) {\n        this.glows[i].remove();\n        this.glows[i] = null;\n      }\n      if ((value >> i) & 1) {\n        x.attr({ fill: SevenSegment.barGlowColor });\n        this.glows[i] = x.glow({ color: SevenSegment.barGlowColor, width: 2 });\n      } else {\n        x.attr({ fill: SevenSegment.barColor });\n      }\n    }\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'Seven Segment Display'\n    };\n  }\n  /**\n   * Called on Start Simulation\n   */\n  initSimulation(): void {\n  }\n  /** Function removes all  animations */\n  closeSimulation(): void {\n    this.animate(0);\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/outputs/LCD/LCDPanel.spec.ts",
    "content": "// import { LCDPixel } from './LCDPanel';\n// import { LCD16X2 } from '../Display';\n\n// declare  var Raphael;\n\n// describe('LCDPanel', () => {\n//   let lcdPixel: LCDPixel;\n//   let lcd: LCD16X2;\n//   let canvas: any;\n\n//   beforeEach(() => {\n//     canvas = Raphael('holder', '100%', '100%');\n//     lcd = new LCD16X2(window['canvas'].set(), 300, 350);\n//     lcdPixel = new LCDPixel([5, 5], [6, 6], 100, 100, 300, 350, 5, 5, '#000', '#FFF');\n//   });\n\n//   it('shifting pixel by 2 and hiding it', () => {\n//     lcdPixel.shift(2, true);\n//     expect(lcdPixel.canvas.x).toBe(100 + 300 + 5);\n//     expect(lcdPixel.canvas.y).toBe(6);\n//     expect(this.posX).toBe(7);\n//     expect(lcdPixel.hidden).toBe(true);\n//   });\n\n//   it('shifting pixel by 2 and not hiding it', () => {\n//     lcdPixel.shift(2, false);\n//     expect(lcdPixel.canvas.x).toBe(400);\n//     expect(lcdPixel.canvas.y).toBe(6);\n//     expect(lcdPixel.hidden).toBe(false);\n//   });\n\n// });\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/outputs/LCD/LCDPanel.ts",
    "content": "import { LCDUtils } from './LCDUtils';\nimport chroma from 'chroma-js';\nimport LRU from 'lru-cache';\nimport { BoundingBox } from '../../Geometry';\n\nconst COLOR_SCALING_MAP = new LRU({\n  max: 5000,\n  length(n, key) { return n * 2 + key.length; },\n  dispose(key, n) { n.close(); },\n  maxAge: 1000 * 60 * 60\n});\n\n/**\n * LCDPixel: Class prototype for the pixels inside a LCD Character panel\n */\nexport class LCDPixel {\n  /**\n   * Index of the parent grid\n   */\n  parentIndex: [number, number];\n\n  /**\n   * Self-index inside the parent grid\n   */\n  index: [number, number];\n\n  /**\n   * x-coordinate of the pixel with respect to the lcd\n   */\n  posX: number;\n\n  /**\n   * y-coordinate of the pixel with respect to the lcd\n   */\n  posY: number;\n\n  /**\n   * width of the pixel\n   */\n  width: number;\n\n  /**\n   * height of the pixel\n   */\n  height: number;\n\n  /**\n   * color of the pixel when it is switched off\n   */\n  dimColor: string;\n\n  /**\n   * color of the pixel when it is switched on\n   */\n  glowColor: string;\n\n  /**\n   * switch status of the pixel: true when on, false when off\n   */\n  isOn: boolean;\n\n  /**\n   * brightness i.e., opacity of the pixel\n   */\n  brightness: number;\n\n  /**\n   * Raphael canvas component of the pixel\n   */\n  canvas: any;\n\n  /**\n   * Boolean flag to store if any changes are pending to be rendered.\n   * Pending changes are rendered upon calling the `refresh` method.\n   */\n  changesPending: boolean;\n\n  /**\n   * x-coordinate of the lcd of which the pixel is a part of\n   */\n  lcdX: number;\n\n  /**\n   * y-coordinate of the lcd of which the pixel is a part of\n   */\n  lcdY: number;\n\n  /**\n   * Show/hide status of the pixel\n   */\n  hidden: boolean;\n\n  /**\n   * Blink status of the pixel\n   * true when the pixel is hidden while blinking\n   * false when the pixel is shown while blinking\n   */\n  blinkHidden = false;\n\n  /**\n   * Contrast of the pixel\n   */\n  contrast = 100;\n\n  constructor(parentIndex: [number, number], index: [number, number], posX: number,\n              posY: number, lcdX: number, lcdY: number, width: number, height: number,\n              dimColor: string, glowColor: string) {\n    this.parentIndex = parentIndex;\n    this.index = index;\n    this.posX = posX;\n    this.posY = posY;\n    this.lcdX = lcdX;\n    this.lcdY = lcdY;\n    this.width = width;\n    this.height = height;\n    this.dimColor = dimColor;\n    this.glowColor = glowColor;\n    this.isOn = false;\n    this.brightness = 100;\n    this.canvas = null;\n    this.changesPending = false;\n    this.hidden = false;\n  }\n\n  /**\n   * @param value color value\n   */\n  fillColor(color) {\n    if (this.canvas) {\n      this.canvas.attr({\n        fill: color\n      });\n    }\n  }\n\n  setContrast(value) {\n    const currentColor = this.getColor();\n    this.contrast = value;\n    const newColor = this.getColor();\n    if (newColor !== currentColor) {\n      this.fillColor(newColor);\n    }\n  }\n\n  /**\n   * @param distance distance by which to shift horizontally\n   * @param hidden new state of the pixel\n   */\n  shift(distance, hidden) {\n    this.posX += distance;\n\n    // if canvas is not set yet, return\n    if (!this.canvas) {\n      return;\n    }\n\n    this.canvas.attr({\n      x: this.posX + this.lcdX\n    });\n\n    // if the state changes, then take it in effect\n    if (this.hidden !== hidden) {\n      if (hidden) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    }\n  }\n\n  /**\n   * Switch the pixel to on/off\n   * @param value true to switch on, false to switch off\n   */\n  switch(value) {\n    const prevValue = this.isOn;\n    this.isOn = parseInt(value, 2) && true;\n    if (prevValue !== this.isOn) {\n      this.changesPending = true;\n    }\n  }\n\n  destroy() {\n    if (this.canvas) {\n      this.canvas.remove();\n    }\n  }\n\n  /**\n   * get the raw color of the pixel\n   */\n  getRawColor() {\n    return this.isOn ? this.glowColor : this.dimColor;\n  }\n\n  /**\n   * gets contrast-adjust color\n   */\n  getColor(rawColor?: string) {\n    rawColor = rawColor || this.getRawColor();\n    let newColorScale = COLOR_SCALING_MAP.get(rawColor);\n\n    if (!newColorScale) {\n      newColorScale = chroma.scale([this.dimColor, rawColor]);\n      COLOR_SCALING_MAP.set(rawColor, newColorScale);\n    }\n\n    const newColor = newColorScale(this.contrast / 100).hex();\n    return newColor;\n  }\n\n  /**\n   * get the name of the pixel\n   */\n  getName() {\n    return `G:${this.parentIndex[0]}:${this.parentIndex[1]}:${this.index[0]}:${this.index[1]}`;\n  }\n\n  /**\n   * get the canvas representation of the pixel\n   */\n  getCanvasRepr() {\n    return {\n      name: this.getName(),\n      type: 'rectangle',\n      width: this.width,\n      height: this.height,\n      x: this.posX,\n      y: this.posY,\n      fill: this.getColor(),\n    };\n  }\n\n  /**\n   * shows the pixel\n   */\n  show() {\n    this.hidden = false;\n    this.canvas.show();\n  }\n\n  /**\n   * hides the pixel\n   */\n  hide() {\n    this.hidden = true;\n    this.canvas.hide();\n  }\n\n  /**\n   * turn on blinking\n   */\n  blinkOn() {\n    this.blinkHidden = true;\n    this.canvas.attr({\n      fill: this.getColor(this.glowColor)\n    });\n  }\n\n  /**\n   * turn off blinking\n   */\n  blinkOff() {\n    if (this.blinkHidden && this.canvas) {\n      this.canvas.attr({\n        fill: this.getColor()\n      });\n      this.blinkHidden = false;\n    }\n  }\n\n  /**\n   * Refreshes the pixel if changes are pending, else does nothing\n   */\n  refresh() {\n    if (this.changesPending && this.canvas) {\n      this.canvas.attr({\n        x: this.posX + this.lcdX,\n        y: this.posY + this.lcdY,\n        fill: this.getColor(),\n      });\n      this.changesPending = false;\n    }\n  }\n}\n\n\nexport class LCDCharacterPanel {\n  /**\n   * number of rows of children pixels\n   */\n  N_ROW: number;\n\n  /**\n   * number of columns of children pixels\n   */\n  N_COLUMN: number;\n\n  /**\n   * Position index of the character panel within the lcd\n   */\n  index: [number, number];\n\n  /**\n   * Array of the chldren pixels\n   */\n  pixels: LCDPixel[][];\n\n  /**\n   * x-coordinate of the character panel wrt to the lcd\n   */\n  posX: number;\n\n  /**\n   * y-coordinate of the character panel wrt to the lcd\n   */\n  posY: number;\n\n  /**\n   * x-coordinate of the lcd\n   */\n  lcdX: number;\n\n  /**\n   * y-coordinate of the lcd\n   */\n  lcdY: number;\n\n  /**\n   * width of the children pixels\n   */\n  pixelWidth: number;\n\n  /**\n   * height of the children pixels\n   */\n  pixelHeight: number;\n\n  /**\n   * color of the children pixels when they're turned off\n   */\n  barColor: string;\n\n  /**\n   * color of the children pixels when they're turned on\n   */\n  barGlowColor: string;\n\n  /**\n   * Horizontal/vertical spacing between the adjacent children pixels\n   */\n  intraSpacing: number;\n\n  /**\n   * Display index of the character panel on the lcd\n   */\n  displayIndex: [number, number];\n\n  /**\n   * Is the character panel out of view on the lcd\n   */\n  hidden: boolean;\n\n  /**\n   * variable to store the interval function during the blinking\n   */\n  blinkFunction: any;\n\n  /**\n   * does the panel contain the cursor?\n   */\n  containsCursor: boolean;\n\n  /**\n   * contrast of the lcd\n   */\n  contrast = 100;\n\n  /**\n   * Constructor\n   * @param index index of the character panel\n   * @param N_ROW number of rows of pixels\n   * @param N_COLUMN number of columns of pixels\n   * @param posX x-coordinate of the character panel wrt to the lcd\n   * @param posY y-coordinate of the character panel wrt to the lcd\n   * @param lcdX x-coordinate of the lcd\n   * @param lcdY y-coordinate of the lcd\n   * @param pixelWidth width of the child pixel\n   * @param pixelHeight height of the child pixel\n   * @param barColor color of the children pixels when they're off\n   * @param barGlowColor color of the children pixels when they're on\n   * @param intraSpacing Horizontal/vertical space between each adjacent pixel\n   * @param displayIndex Display index of the character panel\n   * @param hidden Is the character panel hidden?\n   * @param contrast contrast of the lcd\n   */\n  constructor(index: [number, number], N_ROW: number, N_COLUMN: number,\n              posX: number, posY: number, lcdX: number, lcdY: number,\n              pixelWidth: number, pixelHeight: number, barColor: string,\n              barGlowColor: string, intraSpacing: number,\n              displayIndex: [number, number], hidden: boolean, contrast: number) {\n    this.index = index;\n    this.N_ROW = N_ROW;\n    this.N_COLUMN = N_COLUMN;\n    this.posX = posX;\n    this.posY = posY;\n    this.lcdX = lcdX;\n    this.lcdY = lcdY;\n    this.pixelHeight = pixelHeight;\n    this.pixelWidth = pixelWidth;\n    this.barColor = barColor;\n    this.barGlowColor = barGlowColor;\n    this.intraSpacing = intraSpacing;\n    this.displayIndex = displayIndex;\n    this.hidden = hidden;\n    this.contrast = contrast;\n    this.initialiseLCDPixels();\n  }\n\n  /**\n   * changes the contrast of the character panel\n   * @param value contrast value between 0 and 100\n   */\n  setContrast(value) {\n    this.pixels.forEach(pixelRow => pixelRow.forEach(pixel => {\n      pixel.setContrast(value);\n    }));\n  }\n\n  /**\n   * Shifts the panel by distance `distance`\n   * @param distance distance by which to move the panel\n   */\n  shift(distance: number) {\n      this.posX += distance;\n      this.shiftPixels(distance);\n  }\n\n  getBoundingBox(): BoundingBox {\n    const width = (this.pixelWidth + this.intraSpacing) * this.N_ROW - this.intraSpacing;\n    const height = (this.pixelHeight + this.intraSpacing) * this.N_COLUMN - this.intraSpacing;\n    return new BoundingBox(this.posX, this.posY, width, height);\n  }\n\n  /**\n   * Shift the children pixels by distance `distance`\n   * @param distance distance by which to move the children pixels\n   */\n  private shiftPixels(distance: number) {\n    for (let i = 0; i < this.N_ROW; i++) {\n      for (let j = 0; j < this.N_COLUMN; j++) {\n        this.pixels[i][j].shift(distance, this.hidden);\n      }\n    }\n  }\n\n  /**\n   * Destroys the canvas of all the pixels inside the panel\n   */\n  destroy() {\n    this.pixels.forEach(pixelRow => pixelRow.forEach(pixel => pixel.destroy()));\n  }\n\n  /**\n   * Initialises all the contained pixels\n   */\n  initialiseLCDPixels() {\n    let tempRowsX: number;\n    let posX = this.posX;\n    let posY = this.posY;\n\n    this.pixels = [[]];\n    for (let i = 0; i < this.N_ROW; i++) {\n      tempRowsX = posX;\n      this.pixels[i] = [];\n      for (let j = 0; j < this.N_COLUMN; j++) {\n        this.pixels[i][j] = new LCDPixel(\n          this.index,\n          [i, j],\n          posX,\n          posY,\n          this.lcdX,\n          this.lcdY,\n          this.pixelWidth,\n          this.pixelHeight,\n          this.barColor,\n          this.barGlowColor\n        );\n        posX = posX + this.pixelWidth + this.intraSpacing;\n      }\n      posX = tempRowsX;\n      posY = posY + this.pixelHeight +  this.intraSpacing;\n    }\n  }\n\n  /**\n   * Clears the panel by turning off all the pixels\n   */\n  clear() {\n    this.changeCursorDisplay(false);\n    this.drawCharacter(LCDUtils.getBlankDisplayBytes());\n    this.pixels.forEach(pixelRow => pixelRow.forEach(pixel => pixel.refresh()));\n    clearInterval(this.blinkFunction);\n  }\n\n  /**\n   * Prints the bytes on the character panel\n   * @param characterDisplayBytes array of bytes to display on the panel\n   */\n  drawCharacter(characterDisplayBytes: number[][]) {\n    let byte = null;\n    for (let i = 0; i < this.N_ROW - 1; i++) {\n      for (let j = 0; j < this.N_COLUMN; j++) {\n        try {\n          byte = characterDisplayBytes[i][j];\n        } catch (e) {\n          // if byte is absent for some reason, switch the pixel off\n          byte = 0;\n        }\n        this.pixels[i][j].switch(byte);\n      }\n    }\n  }\n\n  /**\n   * Adds/remove the cursor display on the panel\n   * @param show true to add the cursor, false to remove it\n   */\n  changeCursorDisplay(show: boolean) {\n    if (this.containsCursor === show) {\n      return;\n    }\n    for (let j = 0; j < this.N_COLUMN; j++) {\n      this.pixels[this.N_ROW - 1][j].switch(show ? 1 : 0);\n    }\n    if (!show) {\n      clearInterval(this.blinkFunction);\n    }\n    this.containsCursor = show;\n  }\n\n  /**\n   * Starts blinking the panel\n   */\n  private blink() {\n    this.blinkFunction = setInterval(() => {\n      this.pixels.forEach(pixelRow => pixelRow.forEach(pixel => {\n        if (pixel.blinkHidden) {\n          pixel.blinkOff();\n        } else {\n          pixel.blinkOn();\n        }\n      }));\n    }, 600);\n  }\n\n  /**\n   * Turns on/off blinking on the panel\n   * @param value true to turn on, false to turn off\n   */\n  setBlinking(value: boolean) {\n    if (value) {\n      this.blink();\n    } else if (this.blinkFunction) {\n        clearInterval(this.blinkFunction);\n        this.blinkFunction = null;\n        this.pixels.forEach(pixelRow => pixelRow.forEach(pixel => pixel.blinkOff()));\n      }\n  }\n\n  /**\n   * Returns the Rafael canvas representation of the panel\n   */\n  getCanvasRepr(): any[] {\n    const canvasGrid = [];\n    for (const rowPixels of this.pixels) {\n      for (const pixel of rowPixels) {\n        canvasGrid.push(pixel.getCanvasRepr());\n      }\n    }\n    return canvasGrid;\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/outputs/LCD/LCDStates.ts",
    "content": "import { LCDCharacterPanel } from './LCDPanel';\nimport { LCD16X2 } from '../Display';\nimport { InstructionType, FontSize } from './LCDUtils';\n\nexport enum ActiveAddress {\n  CGRAM = 0, DDRAM = 1\n}\n\n/**\n * Register type enum for the LCD\n */\nexport enum RegisterType {\n  Instruction = 0, Data = 1\n}\n\n/**\n * DataMode type enum for the LCD\n */\nexport enum DataMode {\n  Write = 0, Read = 1\n}\n\n/**\n * Data processor interface\n */\nexport interface DataProcessingMode {\n    processData: () => void;\n}\n\n/**\n * Data processor for write mode\n */\nexport class WriteDataProcessingMode implements DataProcessingMode {\n  lcd: LCD16X2;\n\n  processData() {\n    this.lcd.registerState.processData();\n  }\n\n  constructor(lcd: LCD16X2) {\n    this.lcd = lcd;\n  }\n}\n\n/**\n * Data processor for read mode\n */\nexport class ReadDataProcessingMode implements DataProcessingMode {\n  lcd: LCD16X2;\n\n  processData() {\n    // if (this.lcd.getRegisterType() === RegisterType)\n    console.log('Read data processing.');\n  }\n\n  constructor(lcd: LCD16X2) {\n    this.lcd = lcd;\n  }\n}\n\n/**\n * Bit state interface\n */\nexport interface BitState {\n    /**\n     * returns [higherBits, lowerBits]\n     */\n    readData: () => [number, number];\n    writeData: () => void;\n    isWaitingForMoreData: () => boolean;\n}\n\n/**\n * 4-bit state\n */\nexport class FourBitState implements BitState {\n\n  constructor(lcd: LCD16X2) {\n    this.lcd = lcd;\n    this.waitingForData = false;\n  }\n\n  /**\n   * LCD object\n   */\n  lcd: LCD16X2;\n\n  /**\n   * is waiting for more data to come?\n   */\n  waitingForData: boolean;\n\n  /**\n   * temporary variable to store the higher bits read before the data-waiting state\n   */\n  higherBits = -1;\n\n  writeData: () => void;\n\n  /**\n   * Reads the data from the databuses\n   */\n  readData(): [number, number] {\n    let data = 0;\n\n    for (let i = 7; i >= 4; i--) {\n      data |= (this.lcd.pinNamedMap[`DB${i}`].value > 0 ? 1 : 0);\n      data = data << 1;\n    }\n    data = data >> 1;\n\n    if (this.waitingForData) {\n      // if the state was earlier waiting for more data,\n      // return the complete data now\n      this.waitingForData = false;\n      return [this.higherBits, data];\n    }\n\n    // if the state was not in data-waiting state,\n    // now since it has received first set of 4 bits\n    // move it to the waiting state and store the higher bits\n    this.higherBits = data;\n    this.waitingForData = true;\n    return [-1, -1];\n  }\n\n  /**\n   * Returns if the state is waiting for more data\n   */\n  isWaitingForMoreData() {\n    return this.waitingForData;\n  }\n}\n\n/**\n * 8-bit state\n */\nexport class EightBitState implements BitState {\n\n  constructor(lcd: LCD16X2) {\n    this.lcd = lcd;\n  }\n\n  /**\n   * LCD object\n   */\n  lcd: LCD16X2;\n\n  writeData: () => void;\n\n  /**\n   * Reads the data from the databuses\n   */\n  readData(): [number, number] {\n    let data = 0;\n\n    for (let i = 7; i >= 0; i--) {\n      data |= (this.lcd.pinNamedMap[`DB${i}`].value > 0 ? 1 : 0);\n      data = data << 1;\n    }\n    data = data >> 1;\n\n    // returns \"<DB7><DB6><DB5>...<DB0>\" parsed in binary format\n    return [(data >> 4) & 0b1111, data & 0b1111];\n  }\n\n  /**\n   * Returns if the state is waiting for more data\n   */\n  isWaitingForMoreData() {\n    // 8-bit mode never goes in to data-waiting mode,\n    // hence returning false\n    return false;\n  }\n}\n\n/**\n * Data display interface\n */\nexport interface DataDisplayState {\n  displayData: (characterDisplayBytes: number[][]) => void;\n  getFontSize: () => FontSize;\n  getPixelRows: () => number;\n  getPixelColumns: () => number;\n  getRows: () => number;\n  getColumns: () => number;\n  setNLines: (nLines: number) => void;\n}\n\n/**\n * Font8x5 display class\n */\nexport class Font8x5DisplayState implements DataDisplayState {\n  /**\n   * Map of character panel's name to the character panel\n   */\n  characterPanels: any = {};\n\n  /**\n   * LCD object\n   */\n  lcd: LCD16X2;\n\n  /**\n   * Number of lines in the lcd\n   */\n  nLines: number;\n\n  constructor(lcd: LCD16X2, nLines: number) {\n    this.lcd = lcd;\n    this.nLines = nLines;\n  }\n\n  // TODO: To implement the following 4 functions for different size LCDs\n  // Currently it's only for 16x2 LCD\n\n  /**\n   * Returns the number of pixels' rows inside the character panel\n   */\n  getPixelRows() {\n    return 8;\n  }\n  /**\n   * Returns the number of pixels' columns inside the character panel\n   */\n  getPixelColumns() {\n    return 5;\n  }\n\n  /**\n   * Returns the number of character panel's rows inside the lcd\n   */\n  getRows() {\n    return this.nLines;\n  }\n\n  /**\n   * Returns the number of character panel's columns inside the lcd\n   */\n  getColumns() {\n    return 16;\n  }\n\n  /**\n   * Sets the number of lines on the lcd\n   * @param nLines number of lines\n   */\n  setNLines(nLines: number) {\n    if (this.nLines !== nLines) {\n      this.nLines = nLines;\n    }\n  }\n\n  /**\n   * Returns font size of the state\n   */\n  getFontSize() {\n    return FontSize._8x5;\n  }\n\n  /**\n   * Displays the input data on the panel located at current ddram address of the lcd\n   * @param characterDisplayBytes array of bytes to be displayed on the current panel\n   */\n  displayData(characterDisplayBytes: number[][]) {\n    if (!this.lcd.isDisplayOn) {\n      return;\n    }\n\n    const currentPanel = this.lcd.getCurrentCharacterPanel();\n    currentPanel.drawCharacter(characterDisplayBytes);\n  }\n}\n\n/**\n * Font10x5 display class\n */\nexport class Font10x5DisplayState implements DataDisplayState {\n  /**\n   * Map of character panel's name to the character panel\n   */\n  characterPanels: any = {};\n\n  /**\n   * LCD object\n   */\n  lcd: LCD16X2;\n\n  /**\n   * Number of lines in the lcd\n   */\n  nLines: number;\n\n  constructor(lcd: LCD16X2, nLines: number) {\n    this.lcd = lcd;\n    this.nLines = nLines;\n  }\n\n  setNLines(nLines: number) {\n    if (this.nLines !== nLines) {\n      this.nLines = nLines;\n    }\n  }\n\n  // TODO: To implement the following 4 functions for different size LCDS\n  // Currently it's only for 16x2 LCD\n\n  /**\n   * Returns the number of pixels' rows inside the character panel\n   */\n  getPixelRows() {\n    return 10;\n  }\n  /**\n   * Returns the number of pixels' columns inside the character panel\n   */\n  getPixelColumns() {\n    return 5;\n  }\n\n  /**\n   * Returns the number of character panel's rows inside the lcd\n   */\n  getRows() {\n    return this.nLines;\n  }\n\n  /**\n   * Returns the number of character panel's columns inside the lcd\n   */\n  getColumns() {\n    return 16;\n  }\n\n  /**\n   * Returns font size of the state\n   */\n  getFontSize() {\n    return FontSize._10x5;\n  }\n\n  /**\n   * Displays the input data on the panel located at current ddram address of the lcd\n   * @param characterDisplayBytes array of bytes to be displayed on the current panel\n   */\n  displayData(characterDisplayBytes: number[][]) {\n    if (!this.lcd.isDisplayOn) {\n      return;\n    }\n\n    const currentPanel = this.lcd.getCurrentCharacterPanel();\n    currentPanel.drawCharacter(characterDisplayBytes);\n  }\n\n}\n\nexport interface RegisterState {\n  lcd: LCD16X2;\n  processData: () => void;\n}\n\nexport class DataRegisterState implements RegisterState {\n  lcd: LCD16X2;\n\n  constructor(lcd: LCD16X2) {\n    this.lcd = lcd;\n  }\n\n  processData() {\n    const [higherBits, lowerBits] = this.lcd.bitState.readData();\n    const waitingForData = this.lcd.bitState.isWaitingForMoreData();\n    if (waitingForData) {\n      return;\n    }\n    const characterBits = (higherBits << 4) | lowerBits;\n\n    const [activeRam, address] = this.lcd.getActiveRamAndAddress();\n    activeRam.write(address, characterBits);\n\n    if (this.lcd.activeAddress === ActiveAddress.DDRAM) {\n      let characterDisplayBytes = [];\n      // when writing to DDRAM\n      if (higherBits === 0) {\n        for (let i = 0; i < 8; i++) {\n          characterDisplayBytes.push(this.lcd.cgRam.read(0x40 + (lowerBits * 8) + i));\n        }\n      } else {\n        characterDisplayBytes = this.lcd.cgRom.readROM(higherBits, lowerBits);\n      }\n      this.lcd.dataDisplayState.displayData(characterDisplayBytes);\n\n      if (this.lcd.autoCursorShift) {\n        // move cursor to right\n        this.lcd.moveCursor(1);\n        if (this.lcd.autoDisplayShift) {\n          this.lcd.scrollDisplayRight();\n        }\n      } else {\n        // move cursor to left\n        this.lcd.moveCursor(-1);\n        if (this.lcd.autoDisplayShift) {\n          this.lcd.scrollDisplayLeft();\n        }\n      }\n    }\n\n    if (this.lcd.autoCursorShift) {\n      this.lcd.moveCgRamAddress(1);\n    } else {\n      this.lcd.moveCgRamAddress(-1);\n    }\n  }\n}\n\nexport class InstructionRegisterState implements RegisterState {\n  lcd: LCD16X2;\n\n  static getInstructionType(databus: number): InstructionType {\n    const dataBusBinary = Number(databus).toString(2);\n    let firstOnePositionFromLeft = -1;\n    for (let i = 0; i < dataBusBinary.length; i++) {\n        if (dataBusBinary[i] === '1') {\n            firstOnePositionFromLeft = i;\n            break;\n        }\n    }\n    const firstOnePositionFromRight = dataBusBinary.length - firstOnePositionFromLeft;\n    return firstOnePositionFromRight;\n  }\n\n  clearDisplay() {\n    this.lcd.clearDisplay();\n  }\n\n  setCursorHome() {\n    this.lcd.setDdRamAddress(0x00);\n    this.lcd.setDisplayToHome();\n  }\n\n  setEntryMode(data) {\n    // data: [0  0  0  0  0  1   I/D   S]\n    // Reading I/D\n    const iSlashD = (data >> 1) & 1;\n    if (iSlashD) {\n      this.lcd.autoCursorShift = 1;\n    } else {\n      this.lcd.autoCursorShift = -1;\n    }\n\n    // Reading S\n    const S = data & 1;\n    if (S) {\n      this.lcd.autoDisplayShift = 1;\n    }\n  }\n\n  displayOnOff(data) {\n    const displayOnOff = (data >> 2) & 1;\n    this.lcd.setDisplayOn(displayOnOff && true);\n\n    const cursorOnOff = (data >> 1) & 1;\n    this.lcd.setCursorOn(cursorOnOff && true);\n\n    const blinkCursorPositionCharacter = data & 1;\n    this.lcd.setCursorPositionCharBlink(blinkCursorPositionCharacter && true);\n  }\n\n  shiftCursorAndDisplay(data) {\n      // TODO: display shift\n      // data: [0   0   0   1  S/C R/L  *   * ]\n      const rSlashL = (data >> 2) & 1;\n      const sSlashC = (data >> 3) & 1;\n\n      if (!(rSlashL & 1)) {\n        this.lcd.moveCursor(-1);\n        if (sSlashC & 1) {\n          this.lcd.scrollDisplayLeft();\n        }\n      } else if (rSlashL & 1) {\n        this.lcd.moveCursor(1);\n        if (sSlashC & 1) {\n          this.lcd.scrollDisplayRight();\n        }\n      }\n  }\n\n  setFunction(data) {\n    // 0   0   0   0   1   DL  N   F   *   *\n    const dataLength = (data >> 4) & 1;\n    if (dataLength & 1) {\n      this.lcd.setBitState(this.lcd.eightBitState);\n    } else {\n      this.lcd.setBitState(this.lcd.fourBitState);\n    }\n\n    const numLines = (data >> 3) & 1;\n    const characterFont = (data >> 2) & 1;\n\n    if (numLines & 1) {\n      // N = 1 => 2 lines\n      this.lcd.setDataDisplayState(this.lcd.font8x5DisplayState, 2);\n    } else {\n      // N = 0 => 1 line\n      if (characterFont & 1) {\n        // F = 1 => 10x5\n        this.lcd.setDataDisplayState(this.lcd.font10x5DisplayState, 1);\n      } else {\n        // F = 0 => 8x5\n        this.lcd.setDataDisplayState(this.lcd.font8x5DisplayState, 1);\n      }\n    }\n  }\n\n  setCGRAMAddress(data) {\n    this.lcd.cgRamAddress = 0x40 + (data & 0x3F);\n    this.lcd.activeAddress = ActiveAddress.CGRAM;\n  }\n\n  setDDRAMAddress(data) {\n    this.lcd.setDdRamAddress(data & 0x7F);\n    this.lcd.activeAddress = ActiveAddress.DDRAM;\n  }\n\n  processData() {\n    const [higherBits, lowerBits] = this.lcd.bitState.readData();\n    const waitingForData = this.lcd.bitState.isWaitingForMoreData();\n    if (waitingForData) {\n      return;\n    }\n    // console.log('higher, lower bits:', higherBits.toString(2), lowerBits.toString(2));\n\n    const data = (higherBits << 4) | lowerBits;\n    const instructionType = InstructionRegisterState.getInstructionType(data);\n\n    // console.log('received instruction type: ', InstructionType[instructionType], data.toString(2));\n\n    const functionToCall = {\n      [InstructionType.ClearDisplay]: this.clearDisplay,\n      [InstructionType.CursorHome]: this.setCursorHome,\n      [InstructionType.EntryModeSet]: this.setEntryMode,\n      [InstructionType.DisplayOnOff]: this.displayOnOff,\n      [InstructionType.CursorDisplayShift]: this.shiftCursorAndDisplay,\n      [InstructionType.FunctionSet]: this.setFunction,\n      [InstructionType.SetCGRAMAddress]: this.setCGRAMAddress,\n      [InstructionType.SetDDRAMAddress]: this.setDDRAMAddress,\n    }[instructionType].bind(this);\n\n    functionToCall(data);\n  }\n\n  constructor(lcd: LCD16X2) {\n    this.lcd = lcd;\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/outputs/LCD/LCDUtils.ts",
    "content": "// import _ from 'lodash';\nimport _ from 'lodash-transpose';\n\n// https://mil.ufl.edu/3744/docs/lcdmanual/commands.html\n// https://github.com/basti79/LCD-fonts/blob/master/5x8_horizontal_MSB_2.h\nconst FontData5x8 = [\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x00\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x01\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x02\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x03\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x04\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x05\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x06\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x07\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x08\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x09\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x0a\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x0b\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x0c\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x0d\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x0e\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x0f\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x10\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x11\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x12\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x13\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x14\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x15\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x16\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x17\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x18\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x19\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x1a\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x1b\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x1c\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x1d\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x1e\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x1f\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x20\n  [0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x00 ], // 0x21\n  [0x0a, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x22\n  [0x0a, 0x0a, 0x1f, 0x0a, 0x1f, 0x0a, 0x0a, 0x00 ], // 0x23\n  [0x04, 0x0f, 0x14, 0x0e, 0x05, 0x1e, 0x04, 0x00 ], // 0x24\n  [0x18, 0x19, 0x02, 0x04, 0x08, 0x13, 0x03, 0x00 ], // 0x25\n  [0x0c, 0x12, 0x14, 0x08, 0x15, 0x12, 0x0d, 0x00 ], // 0x26\n  [0x0c, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x27\n  [0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x02, 0x00 ], // 0x28\n  [0x08, 0x04, 0x02, 0x02, 0x02, 0x04, 0x08, 0x00 ], // 0x29\n  [0x00, 0x0a, 0x04, 0x1f, 0x04, 0x0a, 0x00, 0x00 ], // 0x2a\n  [0x00, 0x04, 0x04, 0x1f, 0x04, 0x04, 0x00, 0x00 ], // 0x2b\n  [0x00, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x08, 0x00 ], // 0x2c\n  [0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00 ], // 0x2d\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00 ], // 0x2e\n  [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, 0x00 ], // 0x2f\n  [0x0e, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0e, 0x00 ], // 0x30\n  [0x04, 0x0c, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x00 ], // 0x31\n  [0x0e, 0x11, 0x01, 0x02, 0x04, 0x08, 0x1f, 0x00 ], // 0x32\n  [0x1f, 0x02, 0x04, 0x02, 0x01, 0x11, 0x0e, 0x00 ], // 0x33\n  [0x02, 0x06, 0x0a, 0x12, 0x1f, 0x02, 0x02, 0x00 ], // 0x34\n  [0x1f, 0x10, 0x1e, 0x01, 0x01, 0x11, 0x0e, 0x00 ], // 0x35\n  [0x06, 0x08, 0x10, 0x1e, 0x11, 0x11, 0x0e, 0x00 ], // 0x36\n  [0x1f, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08, 0x00 ], // 0x37\n  [0x0e, 0x11, 0x11, 0x0e, 0x11, 0x11, 0x0e, 0x00 ], // 0x38\n  [0x0e, 0x11, 0x11, 0x0f, 0x01, 0x02, 0x0c, 0x00 ], // 0x39\n  [0x00, 0x0c, 0x0c, 0x00, 0x0c, 0x0c, 0x00, 0x00 ], // 0x3a\n  [0x00, 0x0c, 0x0c, 0x00, 0x0c, 0x04, 0x08, 0x00 ], // 0x3b\n  [0x01, 0x02, 0x04, 0x08, 0x04, 0x02, 0x01, 0x00 ], // 0x3c\n  [0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00 ], // 0x3d\n  [0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x00 ], // 0x3e\n  [0x0e, 0x11, 0x01, 0x02, 0x04, 0x00, 0x04, 0x00 ], // 0x3f\n  [0x0e, 0x11, 0x01, 0x0d, 0x15, 0x15, 0x0e, 0x00 ], // 0x40\n  [0x0e, 0x11, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x00 ], // 0x41\n  [0x1e, 0x11, 0x11, 0x1e, 0x11, 0x11, 0x1e, 0x00 ], // 0x42\n  [0x0e, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0e, 0x00 ], // 0x43\n  [0x1c, 0x12, 0x11, 0x11, 0x11, 0x12, 0x1c, 0x00 ], // 0x44\n  [0x1f, 0x10, 0x10, 0x1e, 0x10, 0x10, 0x1f, 0x00 ], // 0x45\n  [0x1f, 0x10, 0x10, 0x1c, 0x10, 0x10, 0x10, 0x00 ], // 0x46\n  [0x0e, 0x11, 0x10, 0x10, 0x13, 0x11, 0x0e, 0x00 ], // 0x47\n  [0x11, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x11, 0x00 ], // 0x48\n  [0x0e, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x00 ], // 0x49\n  [0x07, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0c, 0x00 ], // 0x4a\n  [0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11, 0x00 ], // 0x4b\n  [0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00 ], // 0x4c\n  [0x11, 0x1b, 0x15, 0x11, 0x11, 0x11, 0x11, 0x00 ], // 0x4d\n  [0x11, 0x11, 0x19, 0x15, 0x13, 0x11, 0x11, 0x00 ], // 0x4e\n  [0x0e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00 ], // 0x4f\n  [0x1e, 0x11, 0x11, 0x1e, 0x10, 0x10, 0x10, 0x00 ], // 0x50\n  [0x0e, 0x11, 0x11, 0x11, 0x15, 0x12, 0x0d, 0x00 ], // 0x51\n  [0x1e, 0x11, 0x11, 0x1e, 0x14, 0x12, 0x11, 0x00 ], // 0x52\n  [0x0f, 0x10, 0x10, 0x0e, 0x01, 0x01, 0x1e, 0x00 ], // 0x53\n  [0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00 ], // 0x54\n  [0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00 ], // 0x55\n  [0x11, 0x11, 0x11, 0x11, 0x11, 0x0a, 0x04, 0x00 ], // 0x56\n  [0x11, 0x11, 0x11, 0x15, 0x15, 0x1b, 0x11, 0x00 ], // 0x57\n  [0x11, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x11, 0x00 ], // 0x58\n  [0x11, 0x11, 0x0a, 0x04, 0x04, 0x04, 0x04, 0x00 ], // 0x59\n  [0x1f, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1f, 0x00 ], // 0x5a\n  [0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x00 ], // 0x5b\n  [0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00 ], // 0x5c\n  [0x1c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x1c, 0x00 ], // 0x5d\n  [0x04, 0x0a, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x5e\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00 ], // 0x5f\n  [0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x60\n  [0x00, 0x00, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00 ], // 0x61\n  [0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x1e, 0x00 ], // 0x62\n  [0x00, 0x00, 0x0e, 0x10, 0x10, 0x11, 0x0e, 0x00 ], // 0x63\n  [0x01, 0x01, 0x0d, 0x13, 0x11, 0x11, 0x0f, 0x00 ], // 0x64\n  [0x00, 0x00, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00 ], // 0x65\n  [0x06, 0x09, 0x08, 0x1c, 0x08, 0x08, 0x08, 0x00 ], // 0x66\n  [0x00, 0x00, 0x0f, 0x11, 0x0f, 0x01, 0x06, 0x00 ], // 0x67\n  [0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00 ], // 0x68\n  [0x04, 0x00, 0x0c, 0x04, 0x04, 0x04, 0x0e, 0x00 ], // 0x69\n  [0x02, 0x00, 0x06, 0x02, 0x02, 0x12, 0x0c, 0x00 ], // 0x6a\n  [0x08, 0x08, 0x09, 0x0a, 0x0c, 0x0a, 0x09, 0x00 ], // 0x6b\n  [0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x00 ], // 0x6c\n  [0x00, 0x00, 0x1a, 0x15, 0x15, 0x11, 0x11, 0x00 ], // 0x6d\n  [0x00, 0x00, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00 ], // 0x6e\n  [0x00, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00 ], // 0x6f\n  [0x00, 0x00, 0x1e, 0x11, 0x1e, 0x10, 0x10, 0x00 ], // 0x70\n  [0x00, 0x00, 0x0d, 0x13, 0x0f, 0x01, 0x01, 0x00 ], // 0x71\n  [0x00, 0x00, 0x16, 0x19, 0x10, 0x10, 0x10, 0x00 ], // 0x72\n  [0x00, 0x00, 0x0e, 0x10, 0x0e, 0x01, 0x1e, 0x00 ], // 0x73\n  [0x08, 0x08, 0x1c, 0x08, 0x08, 0x09, 0x06, 0x00 ], // 0x74\n  [0x00, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0d, 0x00 ], // 0x75\n  [0x00, 0x00, 0x11, 0x11, 0x11, 0x0a, 0x04, 0x00 ], // 0x76\n  [0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0a, 0x00 ], // 0x77\n  [0x00, 0x00, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x00 ], // 0x78\n  [0x00, 0x00, 0x11, 0x11, 0x0f, 0x01, 0x0e, 0x00 ], // 0x79\n  [0x00, 0x00, 0x1f, 0x02, 0x04, 0x08, 0x1f, 0x00 ], // 0x7a\n  [0x02, 0x04, 0x04, 0x08, 0x04, 0x04, 0x02, 0x00 ], // 0x7b\n  [0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00 ], // 0x7c\n  [0x08, 0x04, 0x04, 0x02, 0x04, 0x04, 0x08, 0x00 ], // 0x7d\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x7e\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x7f\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x80\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x81\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x82\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x83\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x84\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x85\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x86\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x87\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x88\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x89\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x8a\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x8b\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x8c\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x8d\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x8e\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x8f\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x90\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x91\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x92\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x93\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x94\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x95\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x96\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x97\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x98\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x99\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x9a\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x9b\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x9c\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x9d\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x9e\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x9f\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa0\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa1\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa2\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa3\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa4\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa5\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa6\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa7\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa8\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa9\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xaa\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xab\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xac\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xad\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xae\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xaf\n  [0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb0\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb1\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb2\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb3\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb4\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb5\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb6\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb7\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb8\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb9\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xba\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xbb\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xbc\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xbd\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xbe\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xbf\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc0\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc1\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc2\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc3\n  [0x12, 0x0c, 0x12, 0x12, 0x1e, 0x12, 0x12, 0x00 ], // 0xc4\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc5\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc6\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc7\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc8\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc9\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xca\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xcb\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xcc\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xcd\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xce\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xcf\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd0\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd1\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd2\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd3\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd4\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd5\n  [0x11, 0x0e, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00 ], // 0xd6\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd7\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd8\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd9\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xda\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xdb\n  [0x11, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00 ], // 0xdc\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xdd\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xde\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xdf\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xe0\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xe1\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xe2\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xe3\n  [0x0a, 0x00, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00 ], // 0xe4\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xe5\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xe6\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xe7\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xe8\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xe9\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xea\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xeb\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xec\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xed\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xee\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xef\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf0\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf1\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf2\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf3\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf4\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf5\n  [0x00, 0x12, 0x0c, 0x12, 0x12, 0x12, 0x0c, 0x00 ], // 0xf6\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf7\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf8\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf9\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xfa\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xfb\n  [0x00, 0x12, 0x00, 0x12, 0x12, 0x12, 0x0c, 0x00 ], // 0xfc\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xfd\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xfe\n];\n\nconst FontData5x10 = [\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x00\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x01\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x02\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x03\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x04\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x05\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x06\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x07\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x08\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x09\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x0a\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x0b\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x0c\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x0d\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x0e\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x0f\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x10\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x11\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x12\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x13\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x14\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x15\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x16\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x17\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x18\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x19\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x1a\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x1b\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x1c\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x1d\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x1e\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x1f\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x20\n  [0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00 ], // 0x21\n  [0x0a, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x22\n  [0x0a, 0x0a, 0x1f, 0x0a, 0x1f, 0x0a, 0x0a, 0x00, 0x00, 0x00 ], // 0x23\n  [0x04, 0x0f, 0x14, 0x0e, 0x05, 0x1e, 0x04, 0x00, 0x00, 0x00 ], // 0x24\n  [0x18, 0x19, 0x02, 0x04, 0x08, 0x13, 0x03, 0x00, 0x00, 0x00 ], // 0x25\n  [0x0c, 0x12, 0x14, 0x08, 0x15, 0x12, 0x0d, 0x00, 0x00, 0x00 ], // 0x26\n  [0x0c, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x27\n  [0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x02, 0x00, 0x00, 0x00 ], // 0x28\n  [0x08, 0x04, 0x02, 0x02, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00 ], // 0x29\n  [0x00, 0x0a, 0x04, 0x1f, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00 ], // 0x2a\n  [0x00, 0x04, 0x04, 0x1f, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00 ], // 0x2b\n  [0x00, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x08, 0x00, 0x00, 0x00 ], // 0x2c\n  [0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x2d\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00 ], // 0x2e\n  [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00 ], // 0x2f\n  [0x0e, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0x30\n  [0x04, 0x0c, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x00, 0x00, 0x00 ], // 0x31\n  [0x0e, 0x11, 0x01, 0x02, 0x04, 0x08, 0x1f, 0x00, 0x00, 0x00 ], // 0x32\n  [0x1f, 0x02, 0x04, 0x02, 0x01, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0x33\n  [0x02, 0x06, 0x0a, 0x12, 0x1f, 0x02, 0x02, 0x00, 0x00, 0x00 ], // 0x34\n  [0x1f, 0x10, 0x1e, 0x01, 0x01, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0x35\n  [0x06, 0x08, 0x10, 0x1e, 0x11, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0x36\n  [0x1f, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00 ], // 0x37\n  [0x0e, 0x11, 0x11, 0x0e, 0x11, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0x38\n  [0x0e, 0x11, 0x11, 0x0f, 0x01, 0x02, 0x0c, 0x00, 0x00, 0x00 ], // 0x39\n  [0x00, 0x0c, 0x0c, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00 ], // 0x3a\n  [0x00, 0x0c, 0x0c, 0x00, 0x0c, 0x04, 0x08, 0x00, 0x00, 0x00 ], // 0x3b\n  [0x01, 0x02, 0x04, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00 ], // 0x3c\n  [0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x3d\n  [0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x00, 0x00, 0x00 ], // 0x3e\n  [0x0e, 0x11, 0x01, 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00 ], // 0x3f\n  [0x0e, 0x11, 0x01, 0x0d, 0x15, 0x15, 0x0e, 0x00, 0x00, 0x00 ], // 0x40\n  [0x0e, 0x11, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x00, 0x00, 0x00 ], // 0x41\n  [0x1e, 0x11, 0x11, 0x1e, 0x11, 0x11, 0x1e, 0x00, 0x00, 0x00 ], // 0x42\n  [0x0e, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0x43\n  [0x1c, 0x12, 0x11, 0x11, 0x11, 0x12, 0x1c, 0x00, 0x00, 0x00 ], // 0x44\n  [0x1f, 0x10, 0x10, 0x1e, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x00 ], // 0x45\n  [0x1f, 0x10, 0x10, 0x1c, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00 ], // 0x46\n  [0x0e, 0x11, 0x10, 0x10, 0x13, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0x47\n  [0x11, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00 ], // 0x48\n  [0x0e, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x00, 0x00, 0x00 ], // 0x49\n  [0x07, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0c, 0x00, 0x00, 0x00 ], // 0x4a\n  [0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11, 0x00, 0x00, 0x00 ], // 0x4b\n  [0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x00 ], // 0x4c\n  [0x11, 0x1b, 0x15, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00 ], // 0x4d\n  [0x11, 0x11, 0x19, 0x15, 0x13, 0x11, 0x11, 0x00, 0x00, 0x00 ], // 0x4e\n  [0x0e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0x4f\n  [0x1e, 0x11, 0x11, 0x1e, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00 ], // 0x50\n  [0x0e, 0x11, 0x11, 0x11, 0x15, 0x12, 0x0d, 0x00, 0x00, 0x00 ], // 0x51\n  [0x1e, 0x11, 0x11, 0x1e, 0x14, 0x12, 0x11, 0x00, 0x00, 0x00 ], // 0x52\n  [0x0f, 0x10, 0x10, 0x0e, 0x01, 0x01, 0x1e, 0x00, 0x00, 0x00 ], // 0x53\n  [0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00 ], // 0x54\n  [0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0x55\n  [0x11, 0x11, 0x11, 0x11, 0x11, 0x0a, 0x04, 0x00, 0x00, 0x00 ], // 0x56\n  [0x11, 0x11, 0x11, 0x15, 0x15, 0x1b, 0x11, 0x00, 0x00, 0x00 ], // 0x57\n  [0x11, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x11, 0x00, 0x00, 0x00 ], // 0x58\n  [0x11, 0x11, 0x0a, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00 ], // 0x59\n  [0x1f, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1f, 0x00, 0x00, 0x00 ], // 0x5a\n  [0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x00, 0x00, 0x00 ], // 0x5b\n  [0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00 ], // 0x5c\n  [0x1c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x1c, 0x00, 0x00, 0x00 ], // 0x5d\n  [0x04, 0x0a, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x5e\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00 ], // 0x5f\n  [0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x60\n  [0x00, 0x00, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00, 0x00, 0x00 ], // 0x61\n  [0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x1e, 0x00, 0x00, 0x00 ], // 0x62\n  [0x00, 0x00, 0x0e, 0x10, 0x10, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0x63\n  [0x01, 0x01, 0x0d, 0x13, 0x11, 0x11, 0x0f, 0x00, 0x00, 0x00 ], // 0x64\n  [0x00, 0x00, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00, 0x00, 0x00 ], // 0x65\n  [0x06, 0x09, 0x08, 0x1c, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00 ], // 0x66\n  [0x00, 0x00, 0x0f, 0x11, 0x0f, 0x01, 0x06, 0x00, 0x00, 0x00 ], // 0x67\n  [0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00 ], // 0x68\n  [0x04, 0x00, 0x0c, 0x04, 0x04, 0x04, 0x0e, 0x00, 0x00, 0x00 ], // 0x69\n  [0x02, 0x00, 0x06, 0x02, 0x02, 0x12, 0x0c, 0x00, 0x00, 0x00 ], // 0x6a\n  [0x08, 0x08, 0x09, 0x0a, 0x0c, 0x0a, 0x09, 0x00, 0x00, 0x00 ], // 0x6b\n  [0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x00, 0x00, 0x00 ], // 0x6c\n  [0x00, 0x00, 0x1a, 0x15, 0x15, 0x11, 0x11, 0x00, 0x00, 0x00 ], // 0x6d\n  [0x00, 0x00, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00 ], // 0x6e\n  [0x00, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0x6f\n  [0x00, 0x00, 0x1e, 0x11, 0x1e, 0x10, 0x10, 0x00, 0x00, 0x00 ], // 0x70\n  [0x00, 0x00, 0x0d, 0x13, 0x0f, 0x01, 0x01, 0x00, 0x00, 0x00 ], // 0x71\n  [0x00, 0x00, 0x16, 0x19, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00 ], // 0x72\n  [0x00, 0x00, 0x0e, 0x10, 0x0e, 0x01, 0x1e, 0x00, 0x00, 0x00 ], // 0x73\n  [0x08, 0x08, 0x1c, 0x08, 0x08, 0x09, 0x06, 0x00, 0x00, 0x00 ], // 0x74\n  [0x00, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0d, 0x00, 0x00, 0x00 ], // 0x75\n  [0x00, 0x00, 0x11, 0x11, 0x11, 0x0a, 0x04, 0x00, 0x00, 0x00 ], // 0x76\n  [0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0a, 0x00, 0x00, 0x00 ], // 0x77\n  [0x00, 0x00, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x00, 0x00, 0x00 ], // 0x78\n  [0x00, 0x00, 0x11, 0x11, 0x0f, 0x01, 0x0e, 0x00, 0x00, 0x00 ], // 0x79\n  [0x00, 0x00, 0x1f, 0x02, 0x04, 0x08, 0x1f, 0x00, 0x00, 0x00 ], // 0x7a\n  [0x02, 0x04, 0x04, 0x08, 0x04, 0x04, 0x02, 0x00, 0x00, 0x00 ], // 0x7b\n  [0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00 ], // 0x7c\n  [0x08, 0x04, 0x04, 0x02, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00 ], // 0x7d\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x7e\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x7f\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x80\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x81\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x82\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x83\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x84\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x85\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x86\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x87\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x88\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x89\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x8a\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x8b\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x8c\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x8d\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x8e\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x8f\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x90\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x91\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x92\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x93\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x94\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x95\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x96\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x97\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x98\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x99\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x9a\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x9b\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x9c\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x9d\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x9e\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0x9f\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa0\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa1\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa2\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa3\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa4\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa5\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa6\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa7\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa8\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xa9\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xaa\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xab\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xac\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xad\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xae\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xaf\n  [0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb0\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb1\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb2\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb3\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb4\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb5\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb6\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb7\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb8\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xb9\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xba\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xbb\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xbc\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xbd\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xbe\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xbf\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc0\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc1\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc2\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc3\n  [0x12, 0x0c, 0x12, 0x12, 0x1e, 0x12, 0x12, 0x00, 0x00, 0x00 ], // 0xc4\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc5\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc6\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc7\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc8\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xc9\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xca\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xcb\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xcc\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xcd\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xce\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xcf\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd0\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd1\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd2\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd3\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd4\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd5\n  [0x11, 0x0e, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0xd6\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd7\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd8\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xd9\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xda\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xdb\n  [0x11, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00, 0x00, 0x00 ], // 0xdc\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xdd\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xde\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xdf\n  [0x00, 0x00, 0x09, 0x15, 0x12, 0x12, 0x0D, 0x00, 0x00, 0x00 ], // 0xe0\n  [0x0A, 0x00, 0x0E, 0x01, 0x0F, 0x11, 0x0F, 0x00, 0x00, 0x00 ], // 0xe1\n  [0x00, 0x00, 0x0E, 0x11, 0x1E, 0x11, 0x1E, 0x10, 0x10, 0x10 ], // 0xe2\n  [0x00, 0x00, 0x0E, 0x10, 0x0C, 0x11, 0x0E, 0x00, 0x00, 0x00 ], // 0xe3\n  [0x00, 0x00, 0x11, 0x11, 0x11, 0x13, 0x1D, 0x10, 0x10, 0x10 ], // 0xe4\n  [0x00, 0x00, 0x0F, 0x14, 0x12, 0x11, 0x0E, 0x00, 0x00, 0x00 ], // 0xe5\n  [0x00, 0x00, 0x06, 0x09, 0x11, 0x11, 0x1E, 0x10, 0x10, 0x10 ], // 0xe6\n  [0x00, 0x00, 0x0F, 0x11, 0x11, 0x11, 0x0F, 0x01, 0x01, 0x00 ], // 0xe7\n  [0x00, 0x00, 0x07, 0x04, 0x04, 0x14, 0x08, 0x00, 0x00, 0x00 ], // 0xe8\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xe9\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xea\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xeb\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xec\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xed\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xee\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xef\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf0\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf1\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf2\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf3\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf4\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf5\n  [0x00, 0x12, 0x0c, 0x12, 0x12, 0x12, 0x0c, 0x00, 0x00, 0x00 ], // 0xf6\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf7\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf8\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xf9\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xfa\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xfb\n  [0x00, 0x12, 0x00, 0x12, 0x12, 0x12, 0x0c, 0x00, 0x00, 0x00 ], // 0xfc\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xfd\n  [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], // 0xfe\n];\n\nexport enum InstructionType {\n    ClearDisplay = 1,\n    CursorHome = 2,\n    EntryModeSet = 3,\n    DisplayOnOff = 4,\n    CursorDisplayShift = 5,\n    FunctionSet = 6,\n    SetCGRAMAddress = 7,\n    SetDDRAMAddress = 8,\n}\n\nexport enum FontSize {\n  _8x5,\n  _10x5\n}\n\nfunction hex2bin(hex, offset = 0) {\n  return ('00000000' + hex.toString(2)).substr(-8 + offset);\n}\n\nexport class LCDUtils {\n  static blankBytes: any = null;\n\n  static getDisplayBytes(character: number, fontSize: FontSize = FontSize._8x5): number[][] {\n    const hexReprArray = fontSize === FontSize._8x5 ? FontData5x8[character] : FontData5x10[character];\n    if (!hexReprArray) {\n      return LCDUtils.getBlankDisplayBytes();\n    }\n    return hexReprArray.map(LCDUtils.convertHexToBinaryArray);\n  }\n\n  static convertHexToBinaryArray(hex: number): number[] {\n    return hex2bin(hex, 3).split('').map(n => parseInt(n, 2) & 1);\n  }\n\n  static getBlankDisplayBytes(): number[][] {\n    if (!LCDUtils.blankBytes) {\n      LCDUtils.blankBytes = LCDUtils.getDisplayBytes(' '.charCodeAt(0));\n    }\n    return LCDUtils.blankBytes;\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/outputs/LCD/MemorySchema.ts",
    "content": "import _ from 'lodash-transpose';\nimport { LCDUtils, FontSize } from './LCDUtils';\n\n// https://www.8051projects.net/lcd-interfacing/basics.php\n\nexport interface RAM {\n    read(address: number): any;\n    write(address: number, data: any): void;\n}\n\n/**\n * DDRAM\n */\nexport class DDRAM implements RAM {\n    memory: any[];\n    N_ROW: number;\n    N_COLUMN: number;\n\n    constructor(N_ROW: number, N_COLUMN: number) {\n        this.memory = _.times(1 << 7, 0);\n        this.N_ROW = N_ROW;\n        this.N_COLUMN = N_COLUMN;\n    }\n\n    static createDDRAMForLCD(N_ROW) {\n        if (N_ROW === 1) {\n            return new DDRAM(1, 40);\n        } else if (N_ROW === 2) {\n            return new DDRAM(2, 40);\n        } else if (N_ROW === 4) {\n            return new DDRAM(4, 20);\n        }\n    }\n\n    convertIndexToAddress(index: [number, number]): number {\n        if (this.N_ROW === 1) {\n            return index[1];\n        }\n        if (this.N_ROW === 2) {\n            const address = index[0] * 0x40 + index[1];\n            return address;\n        }\n        // TODO: implement 4 rows\n    }\n\n    convertAddressToIndex(address: number): [number, number] {\n        if (this.N_ROW === 1) {\n            return [0, address];\n        }\n        if (this.N_ROW === 2) {\n            return [Math.floor(address / 0x40), address % 0x40];\n        }\n        // TODO: implement 4 rows\n    }\n\n    validateIndex(address: number) {\n        if (address < 0x00 || address >= 0x7F) {\n            throw Error('Invalid index.');\n        }\n    }\n\n    read(address: number): number {\n        this.validateIndex(address);\n        return this.memory[address];\n    }\n\n    readAtIndex(index: [number, number]): number {\n        const address = this.convertIndexToAddress(index);\n        return this.memory[address];\n    }\n\n    write(address: number, data: number) {\n        this.validateIndex(address);\n        this.memory[address] = data;\n    }\n}\n\n\n/**\n * CGROM\n */\nexport class CGROM {\n\n    memory: any[][];\n    fontSize: FontSize;\n    N_ROW = 16;\n    N_COLUMN = 16;\n\n    constructor(fontSize: FontSize) {\n        // fontSize: [8, 5] or [10, 5]\n        // TODO: implement 10x5\n        this.memory = [[]];\n        for (let character = 0; character < 0xFF; character++) {\n          const higherBits = (character >> 4) & 0b1111;\n          const lowerBits = (character) & 0b1111;\n          this.memory[higherBits] = this.memory[higherBits] || [];\n          this.memory[higherBits][lowerBits] = LCDUtils.getDisplayBytes(character, fontSize);\n        }\n    }\n\n    readROM(higherBit: number, lowerBit: number): number[][] {\n        return this.memory[higherBit][lowerBit];\n    }\n}\n\n/**\n * CGRAM class\n */\nexport class CGRAM implements RAM {\n    memory: {[key: number]: number} = {};\n\n    constructor() {}\n\n    validateAddress(address) {\n        if (address < 0x40 || address >= 0x80) {\n            return false;\n        }\n        return true;\n    }\n\n    read(address: number): number[] {\n        if (!this.validateAddress(address)) {\n            console.log('Invalid address provided to CGRAM while reading.');\n            return;\n        }\n        return LCDUtils.convertHexToBinaryArray(this.memory[address]);\n    }\n\n    write(address: number, data: number) {\n        if (!this.validateAddress(address)) {\n            console.log('Invalid address provided to CGRAM while writing.');\n            return;\n        }\n        this.memory[address] = data;\n    }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/outputs/Led.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { BreadBoard, Resistor } from '../General';\nimport { Point } from '../Point';\nimport { ArduinoUno } from './Arduino';\n/**\n * Declare window so that custom created function don't throw error\n */\ndeclare var window;\n/**\n * LED class\n */\nexport class LED extends CircuitElement {\n  /**\n   * Colors of LED\n   */\n  static colors: string[] = [];\n  /**\n   * color to be shown while glowing\n   */\n  static glowColors: string[] = [];\n  /**\n   * Name of Color of LED\n   */\n  static colorNames: string[] = [];\n  /**\n   * Internal resistance of LED in ohms\n   */\n  static internalResistance = 13;\n  /**\n   * Selectedindex wrt to color\n   */\n  selectedIndex = 0;\n  /**\n   * Voltage of PWM\n   */\n  voltage = 0;\n  /**\n   * PWM attached\n   */\n  pwmAttached = false;\n  /**\n   * Previous node value.\n   */\n  prev = -2;\n  /**\n   * Set to keep track of visited nodes\n   */\n  visitedNodesv2 = new Set();\n  /**\n   * Pin Name mapped to Pins\n   */\n  pinNamedMap: any = {};\n  /**\n   * If all nodes of element are connected or not\n   */\n  allNodesConnected = false;\n  /**\n   * Flag to check if logic function's recursion should be skipped\n   */\n  skipCheck = false;\n  /**\n   * Variable to store resistance of entire circuit\n   * Internal resistance of LED by default set to 13\n   */\n  resistance: number = LED.internalResistance;\n  /**\n   * Stores visited resistors\n   */\n  visitedResistors = new Set();\n  /**\n   * Stores variable resistance from Potentiometer\n   */\n  variableResistance = 0;\n  /**\n   * LED constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('LED', x, y, 'LED.json', canvas);\n  }\n  /** Saves data of selected color wrt its index */\n  SaveData() {\n    return {\n      color: this.selectedIndex\n    };\n  }\n  /**\n   * Function Called to Load data from saved object\n   * @param data Saved Object\n   */\n  LoadData(data: any) {\n    this.selectedIndex = data.data.color;\n  }\n  /** init is called when the component is complety drawn to the canvas */\n  init() {\n    if (LED.glowColors.length === 0) {\n      // LED\n      // console.log(this.data);\n      LED.colors = this.data.colors;\n      LED.colorNames = this.data.colorNames;\n      LED.glowColors = this.data.glowcolors;\n    }\n    this.data = null;\n    // Add value Change Listener to Circuit nodes\n    this.nodes[0].addValueListener((v) => this.logic(v));\n    this.nodes[1].addValueListener((v) => this.logic(v));\n    this.elements[0].attr({\n      fill: LED.colors[this.selectedIndex]\n    });\n  }\n  /**\n   * fills color in the led\n   * @param color color\n   */\n  fillColor(color) {\n    this.elements[3].attr({ fill: color });\n  }\n  /** Simulation Logic */\n  logic(val: number) {\n\n    if (this.prev === val) {\n      this.skipCheck = true;\n    }\n    let current = val / (this.resistance + this.variableResistance);\n    const pin0Current = (this.nodes[0].value / (this.resistance + this.variableResistance));\n\n    if (!this.allNodesConnected) {\n      const arduinoEnd: any = this.getRecArduinov2(this.pinNamedMap['POSITIVE'], 'POSITIVE');\n      const negativeEnd = this.getRecArduinov2(this.pinNamedMap['NEGATIVE'], 'NEGATIVE');\n      if (negativeEnd && arduinoEnd) {\n        if (negativeEnd.hasOwnProperty('label')) {\n          if (negativeEnd.label === 'GND' || (negativeEnd.value === 0 && arduinoEnd.value > 0)) {\n            this.allNodesConnected = true;\n          }\n        }\n      }\n    }\n    // TODO: Run if PWM is not attached\n    if (this.nodes[0].connectedTo && this.nodes[1].connectedTo) {\n      if (!this.pwmAttached && this.allNodesConnected) {\n        if (current > 0.03 || pin0Current > 0.03) {\n          window.showToast('LED has burst');\n          this.handleConnectionError();\n        } else if (current >= 0.02 || pin0Current >= 0.02) {\n          this.anim();\n        } else if ((current > 0.012 && current < 0.02) || (pin0Current > 0.012)) {\n          this.glowWithAlpha(current);\n        } else {\n          this.fillColor('none');\n        }\n\n        if (val >= 0 && !this.skipCheck) {\n          this.prev = val;\n          this.nodes[1].setValue(val, null);\n        } else {\n          this.skipCheck = false;\n          return;\n        }\n      } else if (this.pwmAttached && this.allNodesConnected) {\n        // TODO: Run if PWM is attached\n        current = this.voltage / this.resistance;\n        this.glowWithAlpha(current);\n\n      }\n    } else {\n      // TODO: Show Toast\n      this.handleConnectionError();\n      window.showToast('LED is not Connected properly');\n    }\n  }\n  /**\n   * create color and add alpha to color\n   */\n  glowWithAlpha(current: number) {\n\n    const minCurrent = 0.012;\n    const maxCurrent = 0.02;\n    const minOpacity = 2;\n    const maxOpacity = 9;\n\n    if (current < minCurrent) {\n      return;\n    }\n    const color = `r(0.5, 0.5)${LED.glowColors[this.selectedIndex]}`;\n    const split = color.split('-');\n    let genColor = 'none';\n\n    // Scalaing current values to range between 2-9\n    const alpha = (((current - minCurrent) / (maxCurrent - minCurrent)) * (maxOpacity - minOpacity)) + minOpacity;\n\n    genColor = `${split[0].substr(0, split[0].length - 2)}${alpha})-${split[1]}`;\n    this.elements[3].attr({ fill: genColor });\n  }\n  /**\n   * Handles connection error\n   */\n  handleConnectionError() {\n    this.fillColor('none');\n  }\n  /** animation caller when start simulation is pressed */\n  anim() {\n    this.fillColor(`r(0.5, 0.5)${LED.glowColors[this.selectedIndex]}`);\n  }\n  /**\n   * Get The Led Name\n   */\n  getName() {\n    // TODO: Change Accordingly to Color\n    return `LED Red`;\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    const select = document.createElement('select');\n    const label = document.createElement('label');\n    label.innerText = 'LED Color';\n    let tmp = '';\n    for (const name of LED.colorNames) {\n      tmp += `<option>${name}</option>`;\n    }\n    select.innerHTML = tmp;\n    select.selectedIndex = this.selectedIndex;\n    select.onchange = () => {\n      this.elements[0].attr({\n        fill: LED.colors[select.selectedIndex]\n      });\n      this.selectedIndex = select.selectedIndex;\n    };\n    body.append(label);\n    body.append(select);\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'LED'\n    };\n  }\n\n  /**\n   * Called when start simulation.\n   */\n  initSimulation(): void {\n    this.visitedNodesv2.clear();\n    // Reset allNodesConnected to false\n    this.allNodesConnected = false;\n    const pwmPins = [3, 5, 6, 9, 10, 11];\n    for (const node of this.nodes) {\n      this.pinNamedMap[node.label] = node;\n    }\n\n    // Getting resistance values from resistors in the circuit\n    this.getRecResistance(this.pinNamedMap['POSITIVE'], 'POSITIVE');\n    this.getRecResistance(this.pinNamedMap['NEGATIVE'], 'NEGATIVE');\n\n    // Determine if Positive terminal of LED is attached to Arduino\n    const arduinoEnd: any = this.getRecArduinov2(this.pinNamedMap['POSITIVE'], 'POSITIVE');\n    // Determine if Negative terminal of LED is attached to Arduino\n    const negativeEnd = this.getRecArduinov2(this.pinNamedMap['NEGATIVE'], 'NEGATIVE');\n\n    // make allNodesConnected boolean true if negative is connected to GND\n    if (negativeEnd) {\n      if (negativeEnd.hasOwnProperty('label')) {\n        if (negativeEnd.label === 'GND') {\n          this.allNodesConnected = true;\n        }\n      }\n    }\n    // Check if nodes of LED are connected\n    if (!negativeEnd || !arduinoEnd) {\n      // TODO: Show Toast\n      this.handleConnectionError();\n      window.showToast('LED is not Connected properly');\n    }\n\n    // do not run addPwm if arduino is not connected\n    if (!arduinoEnd) {\n      return;\n    }\n    // Only add pwm if connected to a pwm pin in arduino\n    if (arduinoEnd && pwmPins.indexOf(parseInt(arduinoEnd.label.substr(1), 10)) !== -1) {\n      const arduino = arduinoEnd.parent;\n      (arduino as ArduinoUno).addPWM(arduinoEnd, (v, p) => {\n        // Calculate voltage of pwm pin\n        this.voltage = v / 100;\n        // If voltage is greater than 6: make PWM attached false\n        if (this.voltage > 6 || this.voltage < 0) {\n          this.pwmAttached = false;\n        } else {\n          this.pwmAttached = true;\n        }\n      });\n    }\n\n  }\n  /** Function removes all the animations */\n  closeSimulation(): void {\n    this.prev = -2;\n    this.fillColor('none');\n    // reset PWM boolean & voltage = 0\n    this.pwmAttached = false;\n    this.voltage = 0;\n    this.resistance = LED.internalResistance;\n    this.visitedResistors.clear();\n    this.variableResistance = 0;\n  }\n  /**\n   * Returns ID\n   */\n  getID() {\n    return this.id;\n  }\n  /**\n   * Sets variable resitance\n   */\n  setVariableResistance(resistance: number) {\n    this.variableResistance = resistance;\n  }\n\n  /**\n   * Return the node which is connected to arduino by recursively finding connected node\n   * @param node The Node which need to be checked\n   */\n  getRecArduinov2(node: Point, startedOn: string) {\n    try {\n      if (node.connectedTo.start.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to start node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.start;\n      } else if (node.connectedTo.end.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to end node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.end;\n      } else if (node.connectedTo.start.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.start.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.end.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'Battery9v' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to 9V Battery\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'CoinCell' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to Coin Cell\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'RelayModule') {\n        // TODO: Handle RelayModule\n        if (startedOn === 'POSITIVE') {\n          // If search was started on Positive node then return connected node of VCC in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[3], startedOn);\n        } else if (startedOn === 'NEGATIVE') {\n          // If search was started on Negative node then return connected node of GND in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[5], startedOn);\n        }\n      } else {\n        // TODO: If nothing matches\n        // IF/ELSE: Determine if start is to be used OR end for further recursion\n        if (node.connectedTo.end.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.end.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.end.parent.nodes[e].gid !== node.connectedTo.end.gid\n              && !this.visitedNodesv2.has(node.connectedTo.end.parent.nodes[e].gid) && node.connectedTo.end.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.end.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.end.parent.nodes[e], startedOn);\n            }\n          }\n        } else if (node.connectedTo.start.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.start.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.start.parent.nodes[e].gid !== node.connectedTo.start.gid\n              && !this.visitedNodesv2.has(node.connectedTo.start.parent.nodes[e].gid)\n              && node.connectedTo.start.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.start.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.start.parent.nodes[e], startedOn);\n            }\n          }\n        }\n\n      }\n    } catch (e) {\n      console.warn(e);\n      return false;\n    }\n\n  }\n\n  /**\n   * Recursive Function to handle BreadBoard\n   * @param node Node which is to be checked for BreadBoard\n   */\n  private getRecArduinoBreadv2(node: Point, startedOn: string) {\n    // IF/ELSE: Determine if start is to be used OR end for further recursion\n    if (node.connectedTo.end.gid !== node.gid) {\n      const bb = (node.connectedTo.end.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.end.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.end.label.substring(1, node.connectedTo.end.label.length)) {\n            const ascii = node.connectedTo.end.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    } else if (node.connectedTo.start.gid !== node.gid) {\n      const bb = (node.connectedTo.start.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.start.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.start.label.substring(1, node.connectedTo.start.label.length)) {\n            const ascii = node.connectedTo.start.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    }\n\n  }\n  /**\n   * Return the node which is connected to arduino by recursively finding connected node\n   * @param node The Node which need to be checked\n   */\n  getRecResistance(node: Point, startedOn: string) {\n    try {\n      if (node.connectedTo.start.parent.keyName === 'Resistor') {\n        const resistorID = (node.connectedTo.start.parent as Resistor).getID();\n        if (!this.visitedResistors.has(resistorID)) {\n          this.resistance = this.resistance + (node.connectedTo.start.parent as Resistor).getResistance();\n          this.visitedResistors.add(resistorID);\n        }\n      } else if (node.connectedTo.end.parent.keyName === 'Resistor') {\n        const resistorID = (node.connectedTo.end.parent as Resistor).getID();\n        if (!this.visitedResistors.has(resistorID)) {\n          this.resistance = this.resistance + (node.connectedTo.end.parent as Resistor).getResistance();\n          this.visitedResistors.add(resistorID);\n        }\n      }\n      if (node.connectedTo.start.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to start node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.start;\n      } else if (node.connectedTo.end.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to end node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.end;\n      } else if (node.connectedTo.start.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.start.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecResistanceBread(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.end.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecResistanceBread(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'Battery9v' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to 9V Battery\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'CoinCell' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to Coin Cell\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'RelayModule') {\n        // TODO: Handle RelayModule\n        if (startedOn === 'POSITIVE') {\n          // If search was started on Positive node then return connected node of VCC in Relay\n          return this.getRecResistance(node.connectedTo.end.parent.nodes[3], startedOn);\n        } else if (startedOn === 'NEGATIVE') {\n          // If search was started on Negative node then return connected node of GND in Relay\n          return this.getRecResistance(node.connectedTo.end.parent.nodes[5], startedOn);\n        }\n      } else {\n        // TODO: If nothing matches\n        // IF/ELSE: Determine if start is to be used OR end for further recursion\n        if (node.connectedTo.end.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.end.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.end.parent.nodes[e].gid !== node.connectedTo.end.gid\n              && !this.visitedNodesv2.has(node.connectedTo.end.parent.nodes[e].gid) && node.connectedTo.end.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.end.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecResistance(node.connectedTo.end.parent.nodes[e], startedOn);\n            }\n          }\n        } else if (node.connectedTo.start.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.start.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.start.parent.nodes[e].gid !== node.connectedTo.start.gid\n              && !this.visitedNodesv2.has(node.connectedTo.start.parent.nodes[e].gid)\n              && node.connectedTo.start.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.start.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecResistance(node.connectedTo.start.parent.nodes[e], startedOn);\n            }\n          }\n        }\n      }\n    } catch (e) {\n      console.warn(e);\n      return false;\n    }\n  }\n\n  /**\n   * Recursive Function to handle BreadBoard\n   * @param node Node which is to be checked for BreadBoard\n   */\n  private getRecResistanceBread(node: Point, startedOn: string) {\n    // IF/ELSE: Determine if start is to be used OR end for further recursion\n    if (node.connectedTo.end.gid !== node.gid) {\n      const bb = (node.connectedTo.end.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.end.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.end.label.substring(1, node.connectedTo.end.label.length)) {\n            const ascii = node.connectedTo.end.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecResistance(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecResistance(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecResistance(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    } else if (node.connectedTo.start.gid !== node.gid) {\n      const bb = (node.connectedTo.start.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.start.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.start.label.substring(1, node.connectedTo.start.label.length)) {\n            const ascii = node.connectedTo.start.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecResistance(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecResistance(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecResistance(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n\n}\n\n/**\n * RGBLED class\n */\nexport class RGBLED extends CircuitElement {\n  /**\n   * Raphael Glow element\n   */\n  glow: any = null;\n  /**\n   * Set to keep track of visited nodes\n   */\n  visitedNodesv2 = new Set();\n  /**\n   * Check if RGB LED is properly connected\n   */\n  isProperlyConnected = false;\n  /**\n   * Connected pin of Cathode to Arduino\n   */\n  cathodePin = null;\n  /**\n   * RGBLED constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('RGBLED', x, y, 'RGBLED.json', canvas);\n  }\n  /**\n   * Initialize RGB LED\n   */\n  init() {\n    this.nodes[0].addValueListener((v) => this.logic(v));\n    this.nodes[2].addValueListener((v) => this.logic(v));\n    this.nodes[3].addValueListener((v) => this.logic(v));\n  }\n  /**\n   * Function for logic of value listener\n   */\n  logic(val: number) {\n    let negativeEnd = null;\n    if (!this.cathodePin) {\n      negativeEnd = this.getRecArduinov2(this.nodes[1], 'CATHODE');\n      this.cathodePin = negativeEnd;\n    }\n\n    if (this.cathodePin && !this.isProperlyConnected) {\n      if (this.cathodePin.label === 'GND' || this.cathodePin.value === 0) {\n        this.isProperlyConnected = true;\n      }\n    }\n\n    if (this.isProperlyConnected) {\n      this.nodes[1].setValue(val, this.nodes[0]);\n      this.anim();\n    }\n  }\n  /** animation caller when start simulation is pressed */\n  anim() {\n    if (this.glow) {\n      this.glow.remove();\n      this.glow = null;\n    }\n    // Simulation Logic\n    let R = (this.nodes[0].value > 0) ? 255 : 0;\n    let B = (this.nodes[2].value > 0) ? 255 : 0;\n    let G = (this.nodes[3].value > 0) ? 255 : 0;\n    if (R === 0 && G === 0 && B === 0) {\n      this.elements[1].attr({\n        fill: 'none'\n      });\n      return;\n    }\n    if (R === 255 && G === 255 && B === 255) {\n      R = G = B = 209;\n    }\n    this.elements[1].attr({\n      fill: `rgba(${R}, ${G}, ${B}, 0.8)`\n    });\n    this.glow = this.elements[1].glow({\n      color: `rgb(${R}, ${G}, ${B})`\n    });\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      title: 'RGB LED',\n      body\n    };\n  }\n  /**\n   * Removes glow\n   */\n  removeGlow() {\n    if (this.glow) {\n      this.glow.remove();\n      this.glow = null;\n    }\n  }\n  /**\n   * Handles connection error\n   */\n  handleConnectionError() {\n    this.removeGlow();\n  }\n  /**\n   * Called on start simulation\n   */\n  initSimulation(): void {\n    const negativeEnd = this.getRecArduinov2(this.nodes[1], 'CATHODE');\n    if (negativeEnd) {\n      this.cathodePin = negativeEnd;\n      if (negativeEnd.label === 'GND') {\n        this.isProperlyConnected = true;\n      }\n    }\n\n  }\n  /**\n   * Remove Glow and clear the filling\n   */\n  closeSimulation(): void {\n    this.removeGlow();\n    this.elements[1].attr({\n      fill: 'none'\n    });\n    this.isProperlyConnected = false;\n    this.cathodePin = null;\n  }\n  /**\n   * Return the node which is connected to arduino by recursively finding connected node\n   * @param node The Node which need to be checked\n   */\n  getRecArduinov2(node: Point, startedOn: string) {\n    try {\n      if (node.connectedTo.start.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to start node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.start;\n      } else if (node.connectedTo.end.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if arduino is connected to end node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.end;\n      } else if (node.connectedTo.start.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.start.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.end.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'Battery9v' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to 9V Battery\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'CoinCell' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to Coin Cell\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'RelayModule') {\n        // TODO: Handle RelayModule\n        if (startedOn === 'POSITIVE') {\n          // If search was started on Positive node then return connected node of VCC in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[3], startedOn);\n        } else if (startedOn === 'NEGATIVE') {\n          // If search was started on Negative node then return connected node of GND in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[5], startedOn);\n        }\n      } else {\n        // TODO: If nothing matches\n        // IF/ELSE: Determine if start is to be used OR end for further recursion\n        if (node.connectedTo.end.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.end.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.end.parent.nodes[e].gid !== node.connectedTo.end.gid\n              && !this.visitedNodesv2.has(node.connectedTo.end.parent.nodes[e].gid) && node.connectedTo.end.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.end.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.end.parent.nodes[e], startedOn);\n            }\n          }\n        } else if (node.connectedTo.start.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.start.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.start.parent.nodes[e].gid !== node.connectedTo.start.gid\n              && !this.visitedNodesv2.has(node.connectedTo.start.parent.nodes[e].gid)\n              && node.connectedTo.start.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.start.parent.nodes[e].gid);\n              // call back Arduino Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.start.parent.nodes[e], startedOn);\n            }\n          }\n        }\n      }\n    } catch (e) {\n      console.warn(e);\n      return false;\n    }\n  }\n  /**\n   * Recursive Function to handle BreadBoard\n   * @param node Node which is to be checked for BreadBoard\n   */\n  private getRecArduinoBreadv2(node: Point, startedOn: string) {\n    // IF/ELSE: Determine if start is to be used OR end for further recursion\n    if (node.connectedTo.end.gid !== node.gid) {\n      const bb = (node.connectedTo.end.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.end.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.end.label.substring(1, node.connectedTo.end.label.length)) {\n            const ascii = node.connectedTo.end.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    } else if (node.connectedTo.start.gid !== node.gid) {\n      const bb = (node.connectedTo.start.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.start.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.start.label.substring(1, node.connectedTo.start.label.length)) {\n            const ascii = node.connectedTo.start.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/Libs/outputs/Motors.ts",
    "content": "import { CircuitElement } from '../CircuitElement';\nimport { ArduinoUno } from './Arduino';\nimport { Point } from '../Point';\nimport { BreadBoard } from '../General';\n\n/**\n * Declare Raphael so that build don't throws error\n */\ndeclare var Raphael;\n\ndeclare var window;\n\n/**\n * Motor class\n */\nexport class Motor extends CircuitElement {\n  /**\n   * The Direction of motor +1 => Clockwise, -1 => Anticlockwise\n   */\n  private dirn = 1;\n  /**\n   * The Center X of the motor.\n   */\n  cx = 0;\n  /**\n   * Center Y of the motor.\n   */\n  cy = 0;\n  /**\n   * RPM of the motor.\n   */\n  rpm: any;\n  /**\n   * if PWM is attached\n   */\n  pwmAttached = false;\n  /**\n   * Voltage\n   */\n  voltage = -1;\n  /**\n   * Previous voltage\n   */\n  prevVoltage = -1;\n  /**\n   * set of Visited nodes\n   */\n  visitedNodesv2 = new Set();\n\n\n  /**\n   * Motor constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('Motor', x, y, 'Motor.json', canvas);\n  }\n\n  // 6v -> 9000rpm ->\n  /** init is called when the component is complety drawn to the canvas */\n  init() {\n    // Add value change Listener to circuit node\n    this.nodes[0].addValueListener((v, cby, par) => {\n      if (cby === this.nodes[1]) {\n        return;\n      }\n      // sets the value for node\n      this.nodes[1].setValue(v, this.nodes[0]);\n      this.dirn = -1;\n      if (v < 0) {\n        this.elements[1].stop();\n      } else if (v === 0) {\n        if (this.rpm && !this.pwmAttached) {\n          this.rpm.remove();\n          this.rpm = null;\n        }\n        this.elements[1].stop();\n      } else {\n        if (this.rpm && this.voltage !== this.prevVoltage) {\n          // TODO: remove animation\n          this.rpm.remove();\n          this.rpm = null;\n        }\n        // stop animation\n        this.elements[1].stop();\n        if (v === 0) {\n          return;\n        }\n        if (!this.pwmAttached) {\n          // TODO: create animation using v if pwm is not attached\n          if (this.rpm) {\n            // TODO: remove animation\n            this.rpm.remove();\n            this.rpm = null;\n          }\n          this.setAnimation(v, 'AntiClockwise');\n        } else {\n          // TODO: create animation using voltage if pwm is attached\n          if (this.voltage !== this.prevVoltage) {\n            this.setAnimation(this.voltage, 'AntiClockwise');\n            // update previous voltage variable\n            this.prevVoltage = this.voltage;\n          }\n        }\n      }\n    });\n    // Add value change Listener to circuit node\n    this.nodes[1].addValueListener((v, cby, par) => {\n      if (cby === this.nodes[0]) {\n        return;\n      }\n      // sets the value for node\n      this.nodes[0].setValue(v, this.nodes[1]);\n      if (v < 0) {\n        this.elements[1].stop();\n      } else if (v === 0) {\n        if (this.rpm && !this.pwmAttached) {\n          this.rpm.remove();\n          this.rpm = null;\n        }\n        this.elements[1].stop();\n      } else {\n        if (this.rpm && this.voltage !== this.prevVoltage) {\n          // TODO: remove animation\n          this.rpm.remove();\n          this.rpm = null;\n        }\n        // stop animation\n        this.elements[1].stop();\n        if (v === 0) {\n          return;\n        }\n        if (!this.pwmAttached) {\n          // TODO: create animation using v if pwm is not attached\n          if (this.rpm) {\n            // TODO: remove animation\n            this.rpm.remove();\n            this.rpm = null;\n          }\n          this.setAnimation(v, 'Clockwise');\n        } else {\n          // TODO: create animation using voltage if pwm is attached\n          if (this.voltage <= 0 && this.rpm) {\n            this.rpm.remove();\n            this.rpm = null;\n            // update previous voltage variable\n            this.prevVoltage = this.voltage;\n          }\n          if (this.voltage !== this.prevVoltage && this.voltage <= 6) {\n            this.setAnimation(this.voltage, 'Clockwise');\n            // update previous voltage variable\n            this.prevVoltage = this.voltage;\n          }\n        }\n      }\n    });\n  }\n\n  /**\n   * Use this function to rotate motor\n   * @param volt Voltage Supplied to motor\n   * @param direction Direction to rotate in\n   */\n  setAnimation(volt, direction) {\n    const anim = Raphael.animation({ transform: `r360` }, 400 / volt);\n    this.elements[1].animate(anim.repeat(Infinity));\n    this.rpm = this.canvas.text(this.x + this.tx, this.y + this.ty - 30, `${Math.floor(1500 * volt)}RPM\\n${direction}`);\n    this.rpm.attr({\n      'font-size': 15,\n    });\n  }\n\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'Motor'\n    };\n  }\n  /**\n   * Initialize Variable,callback and animation caller when start simulation is pressed\n   */\n  initSimulation(): void {\n    if (\n      this.nodes[1].connectedTo &&\n      (this.nodes[1].connectedTo.start &&\n        this.nodes[1].connectedTo.start.parent.keyName === 'ArduinoUno')\n      ||\n      (this.nodes[1].connectedTo.end &&\n        this.nodes[1].connectedTo.end.parent.keyName === 'ArduinoUno')\n    ) {\n      window['showToast']('The Motor Draws more current then Arduino could supply');\n    }\n    this.elements.undrag();\n    const ok = this.elements[1].attr();\n    this.cx = (ok.width / 2) + ok.x;\n    this.cy = (ok.height / 2) + ok.y;\n    this.elements[1].attr({\n      transform: '',\n      x: ok.x + this.tx,\n      y: ok.y + this.ty\n    });\n\n    // determine recursively if positive pin is connected to L293D driver\n    const posPin = this.getRecArduinov2(this.nodes[1], 'Positive');\n    // determine recursively if negative pin is connected to L293D driver\n    const negPin = this.getRecArduinov2(this.nodes[0], 'Negative');\n\n    // Arduino pins that support PWM\n    const pwmPins = [3, 5, 6, 9, 10, 11];\n\n    // if negPin or posPin are connected to L293D\n    if (negPin || posPin) {\n\n      let inArduino1;\n      let inArduino2;\n\n      // Clear visitedNodesv2 set\n      BreadBoard.visitedNodesv2.clear();\n      // determine if OUT pins are connected to Arduino or not to positive\n      if (posPin.label === 'OUT3') {\n        inArduino1 = BreadBoard.getRecArduinov2(posPin.parent.nodes[6], 'IN3');\n      } else if (posPin.label === 'OUT4') {\n        inArduino1 = BreadBoard.getRecArduinov2(posPin.parent.nodes[1], 'IN4');\n      } else if (posPin.label === 'OUT1') {\n        inArduino1 = BreadBoard.getRecArduinov2(posPin.parent.nodes[9], 'IN1');\n      } else if (posPin.label === 'OUT2') {\n        inArduino1 = BreadBoard.getRecArduinov2(posPin.parent.nodes[14], 'IN2');\n      }\n\n      // Clear visitedNodesv2 set\n      BreadBoard.visitedNodesv2.clear();\n      // determine if OUT pins are connected to Arduino or not to negative\n      if (negPin.label === 'OUT3') {\n        inArduino2 = BreadBoard.getRecArduinov2(negPin.parent.nodes[6], 'IN3');\n      } else if (negPin.label === 'OUT4') {\n        inArduino2 = BreadBoard.getRecArduinov2(negPin.parent.nodes[1], 'IN4');\n      } else if (negPin.label === 'OUT1') {\n        inArduino2 = BreadBoard.getRecArduinov2(posPin.parent.nodes[9], 'IN1');\n      } else if (negPin.label === 'OUT2') {\n        inArduino2 = BreadBoard.getRecArduinov2(posPin.parent.nodes[14], 'IN2');\n      }\n\n      if (inArduino1) {\n        // TODO: add PWM if PWM pin\n        if (inArduino1 && pwmPins.indexOf(parseInt(inArduino1.label.substr(1), 10)) !== -1) {\n          // TODO: add PWM if positive is PWM\n          this.addPwmArduino(inArduino1.parent, inArduino1);\n        }\n      }\n      if (inArduino2) {\n        // TODO: add PWM if PWM pin\n        if (inArduino2 && pwmPins.indexOf(parseInt(inArduino2.label.substr(1), 10)) !== -1) {\n          // TODO: add PWM if positive is PWM\n          this.addPwmArduino(inArduino2.parent, inArduino2);\n        }\n      }\n      // return to stop the function here\n      return;\n    }\n    // Prep PWM\n\n    const arduinoEnd: any = BreadBoard.getRecArduinov2(this.nodes[1], 'Positive');\n    const arduinoEndNegative: any = BreadBoard.getRecArduinov2(this.nodes[0], 'Negative');\n\n    // do not run addPwm if arduino is not connected\n    if (!arduinoEnd || !arduinoEndNegative) {\n      return;\n    }\n\n    // Only add pwm if connected to a pwm pin in arduino\n    if (arduinoEnd && pwmPins.indexOf(parseInt(arduinoEnd.label.substr(1), 10)) !== -1) {\n      // TODO: add PWM if positive is PWM\n      this.addPwmArduino(arduinoEnd.parent, arduinoEnd);\n    } else if (arduinoEndNegative && pwmPins.indexOf(parseInt(arduinoEndNegative.label.substr(1), 10)) !== -1) {\n      // TODO: add PWM if negative is PWM\n      this.addPwmArduino(arduinoEndNegative.parent, arduinoEndNegative);\n    } else {\n      this.pwmAttached = false;\n    }\n\n  }\n\n  /**\n   * Use this function to add PWM to any node of Arduino\n   * @param arduino Arduino instance\n   * @param end Node to be enabled with PWM\n   */\n  addPwmArduino(arduino, end) {\n    (arduino as ArduinoUno).addPWM(end, (v, p) => {\n      // Calculate voltage of pwm pin\n      this.voltage = v / 100;\n      // If voltage is greater than 6: make PWM attached false\n      if (this.voltage > 6 || this.voltage < 0) {\n        this.pwmAttached = false;\n        this.voltage = -1;\n      } else {\n        this.pwmAttached = true;\n      }\n\n    });\n  }\n\n  /** Function removes all  animations and callbacks  */\n  closeSimulation(): void {\n    this.elements[1].stop();\n    const ok = this.elements[1].attr();\n    this.elements[1].attr({\n      transform: `t${this.tx},${this.ty}`,\n      x: ok.x - this.tx,\n      y: ok.y - this.ty\n    });\n    if (this.rpm) {\n      this.rpm.remove();\n      this.rpm = null;\n    }\n    this.setDragListeners();\n\n    this.pwmAttached = false;\n    this.voltage = -1;\n    this.prevVoltage = -1;\n    this.visitedNodesv2.clear();\n  }\n\n  /**\n   * Returns node connected to L293D\n   * @param node node to start search on\n   * @param startedOn label of node search started on\n   * @returns L293D connected Node\n   */\n  getRecArduinov2(node: Point, startedOn: string) {\n    try {\n      if (node.connectedTo.start.parent.keyName === 'L293D') {\n        // TODO: Return if L293D is connected to start node\n        return node.connectedTo.start;\n      } else if (node.connectedTo.end.parent.keyName === 'L293D') {\n        // TODO: Return if L293D is connected to end node\n        return node.connectedTo.end;\n      } else if (node.connectedTo.start.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.start.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.end.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'Battery9v' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to 9V Battery\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'CoinCell' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to Coin Cell\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'RelayModule') {\n        // TODO: Handle RelayModule\n        if (startedOn === 'POSITIVE') {\n          // If search was started on Positive node then return connected node of VCC in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[3], startedOn);\n        } else if (startedOn === 'NEGATIVE') {\n          // If search was started on Negative node then return connected node of GND in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[5], startedOn);\n        }\n      } else {\n        // TODO: If nothing matches\n        // IF/ELSE: Determine if start is to be used OR end for further recursion\n        if (node.connectedTo.end.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.end.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.end.parent.nodes[e].gid !== node.connectedTo.end.gid\n              && !this.visitedNodesv2.has(node.connectedTo.end.parent.nodes[e].gid) && node.connectedTo.end.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.end.parent.nodes[e].gid);\n              // call back L293D Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.end.parent.nodes[e], startedOn);\n            }\n          }\n        } else if (node.connectedTo.start.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.start.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.start.parent.nodes[e].gid !== node.connectedTo.start.gid\n              && !this.visitedNodesv2.has(node.connectedTo.start.parent.nodes[e].gid)\n              && node.connectedTo.start.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.start.parent.nodes[e].gid);\n              // call back L293D Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.start.parent.nodes[e], startedOn);\n            }\n          }\n        }\n\n      }\n    } catch (e) {\n      console.warn(e);\n      return false;\n    }\n\n  }\n\n  /**\n   * Recursive Function to handle BreadBoard\n   * @param node Node which is to be checked for BreadBoard\n   */\n  getRecArduinoBreadv2(node: Point, startedOn: string) {\n    // IF/ELSE: Determine if start is to be used OR end for further recursion\n    if (node.connectedTo.end.gid !== node.gid) {\n      const bb = (node.connectedTo.end.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.end.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.end.label.substring(1, node.connectedTo.end.label.length)) {\n            const ascii = node.connectedTo.end.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    } else if (node.connectedTo.start.gid !== node.gid) {\n      const bb = (node.connectedTo.start.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.start.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.start.label.substring(1, node.connectedTo.start.label.length)) {\n            const ascii = node.connectedTo.start.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    }\n\n  }\n\n}\n\n/**\n * MotorDriver L298N class\n */\nexport class L298N extends CircuitElement {\n  /**\n   * Pin Name mapped to Pins\n   */\n  pinNamedMap: any = {};\n  /**\n   * Speed of Motor A in range of 0 to 5.\n   */\n  speedA = 5;\n  /**\n   * Speed of Motor B in range of 0 to 5\n   */\n  speedB = 5;\n  /**\n   * Previous values of the pins.\n   */\n  prevValues: any = {\n    IN1: -1,\n    IN2: -1,\n    IN3: -1,\n    IN4: -1\n  };\n\n  /**\n   * MotorDriver L298N constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('L298N', x, y, 'L298N.json', canvas);\n  }\n  /**\n   * Initialize motor class.\n   */\n  init() {\n    for (const node of this.nodes) {\n      this.pinNamedMap[node.label] = node;\n    }\n    this.pinNamedMap['V IN'].addValueListener(v => {\n      this.pinNamedMap['GND'].setValue(v, this.pinNamedMap['GND']);\n      if (v >= 5) {\n        this.pinNamedMap['5V IN'].setValue(5, this.pinNamedMap['5V IN']);\n      }\n      this.update();\n    });\n\n    this.pinNamedMap['IN1'].addValueListener(v => {\n      if (v !== this.prevValues.IN1) {\n        this.prevValues.IN1 = v;\n        this.update();\n      }\n    });\n    this.pinNamedMap['IN2'].addValueListener(v => {\n      if (v !== this.prevValues.IN2) {\n        this.prevValues.IN2 = v;\n        this.update();\n      }\n    });\n    this.pinNamedMap['IN3'].addValueListener(v => {\n      if (v !== this.prevValues.IN3) {\n        this.prevValues.IN3 = v;\n        this.update();\n      }\n    });\n    this.pinNamedMap['IN4'].addValueListener(v => {\n      if (v !== this.prevValues.IN4) {\n        this.prevValues.IN4 = v;\n        this.update();\n      }\n    });\n  }\n  /**\n   * Simulation Logic For L298N motor driver\n   */\n  update() {\n    setTimeout(() => {\n      if (this.pinNamedMap['IN1'].value > 0 && this.pinNamedMap['IN2'].value > 0) {\n        window['showToast']('Both IN1 and IN2 Pins are High!');\n        return;\n      }\n\n      if (this.pinNamedMap['IN3'].value > 0 && this.pinNamedMap['IN4'].value > 0) {\n        window['showToast']('Both IN3 and IN4 Pins are High!');\n        return;\n      }\n    }, 100);\n\n    if (this.pinNamedMap['IN1'].value > 0) {\n      this.pinNamedMap['Terminal 2'].setValue(\n        this.pinNamedMap['V IN'].value * (this.speedA / 5),\n        this.pinNamedMap['Terminal 2']\n      );\n    } else if (this.pinNamedMap['IN2'].value > 0) {\n      this.pinNamedMap['Terminal 1'].setValue(\n        this.pinNamedMap['V IN'].value * (this.speedA / 5),\n        this.pinNamedMap['Terminal 1']\n      );\n    } else {\n      this.pinNamedMap['Terminal 1'].setValue(\n        0,\n        this.pinNamedMap['Terminal 1']\n      );\n    }\n\n    if (this.pinNamedMap['IN3'].value > 0) {\n      this.pinNamedMap['Terminal 4'].setValue(\n        this.pinNamedMap['V IN'].value * (this.speedB / 5),\n        this.pinNamedMap['Terminal 4']\n      );\n    } else if (this.pinNamedMap['IN4'].value > 0) {\n      this.pinNamedMap['Terminal 3'].setValue(\n        this.pinNamedMap['V IN'].value * (this.speedB / 5),\n        this.pinNamedMap['Terminal 3']\n      );\n    } else {\n      this.pinNamedMap['Terminal 3'].setValue(\n        0,\n        this.pinNamedMap['Terminal 3']\n      );\n    }\n  }\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    body.innerText = 'If you Don\\'t Connect The ENA and ENB Pins it automatically connects to the 5V suppy';\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'Motor Driver (L298N)'\n    };\n  }\n  /**\n   * Return the node which is connected to arduino\n   * @param node The Node which need to be checked\n   */\n  private getArduino(node: Point) {\n    if (\n      node.connectedTo &&\n      node.connectedTo.start &&\n      node.connectedTo.start.parent.keyName === 'ArduinoUno'\n    ) {\n      return node.connectedTo.start;\n    }\n    if (\n      node.connectedTo &&\n      node.connectedTo.end &&\n      node.connectedTo.end.parent.keyName === 'ArduinoUno'\n    ) {\n      return node.connectedTo.end;\n    }\n    return null;\n  }\n  /**\n   * Called on Start Simulation\n   */\n  initSimulation(): void {\n    const arduinoEnd: any = this.getArduino(this.pinNamedMap['ENB']);\n    if (arduinoEnd) {\n      const arduino = arduinoEnd.parent;\n      (arduino as ArduinoUno).addPWM(arduinoEnd, (v, p) => {\n        this.speedA = v / 100;\n        this.update();\n      });\n    }\n\n    const arduinoEnd1: any = this.getArduino(this.pinNamedMap['ENA']);\n    if (arduinoEnd1) {\n      const arduino = arduinoEnd1.parent;\n      (arduino as ArduinoUno).addPWM(arduinoEnd1, (v, p) => {\n        this.speedB = v / 100;\n        this.update();\n      });\n    }\n\n  }\n  /**\n   * Called on Stop Simulation\n   */\n  closeSimulation(): void {\n    this.pinNamedMap['IN1'].value = -1;\n    this.pinNamedMap['IN2'].value = -1;\n    this.pinNamedMap['IN3'].value = -1;\n    this.pinNamedMap['IN4'].value = -1;\n    this.speedA = 5;\n    this.speedB = 5;\n    this.prevValues = {\n      IN1: -1,\n      IN2: -1,\n      IN3: -1,\n      IN4: -1\n    };\n  }\n}\n\n\n/**\n * Servo Motor class\n */\nexport class ServoMotor extends CircuitElement {\n\n  /**\n   * The Connected Arduino\n   */\n  arduino: ArduinoUno = null;\n  /**\n   * Set to keep track of visited nodes\n   */\n  visitedNodesv2 = new Set();\n  /**\n   * Pin Name mapped to Pins\n   */\n  pinNamedMap: any = {};\n  /**\n   * Flag to see if Servo is connected properly\n   */\n  connected = true;\n\n  /**\n   * Servo constructor\n   * @param canvas Raphael Canvas (Paper)\n   * @param x  position x\n   * @param y  position y\n   */\n  constructor(public canvas: any, x: number, y: number) {\n    super('ServoMotor', x, y, 'ServoMotor.json', canvas);\n  }\n  /**\n   * Initializ Servo Motor\n   */\n  init() {\n    // Initializing pinNamedMap\n    for (const node of this.nodes) {\n      this.pinNamedMap[node.label] = node;\n    }\n\n    this.nodes[1].addValueListener((v) => {\n      if (v < 4 || v > 6) {\n        window['showToast']('Low Voltage Applied');\n      }\n      this.nodes[0].setValue(v, this.nodes[1]);\n    });\n  }\n  /**\n   * Animate rotation of the shaft.\n   * @param angle The Angle of the shaft\n   * @param duration How much time it takes it to move\n   */\n  animate(angle: number, duration: number = 10) {\n    const anim = Raphael.animation({ transform: `r${angle}` }, duration);\n    this.elements[1].animate(anim);\n  }\n\n  /**\n   * Function provides component details\n   * @param keyName Unique Class name\n   * @param id Component id\n   * @param body body of property box\n   * @param title Component title\n   */\n  properties(): { keyName: string; id: number; body: HTMLElement; title: string; } {\n    const body = document.createElement('div');\n    return {\n      keyName: this.keyName,\n      id: this.id,\n      body,\n      title: 'Servo Motor'\n    };\n  }\n  /**\n   * Called on Start Simulation\n   */\n  initSimulation(): void {\n    // Check Connection\n    if (!this.areAllNodesConnected()) {\n      window['showToast']('Please Connect Servo Properly!');\n      this.connected = false;\n      return;\n    }\n\n    const gndPin = this.getRecArduinov2(this.pinNamedMap['GND'], 'GND');\n    const powerPin = this.getRecArduinov2(this.pinNamedMap['POWER'], 'POWER');\n    const signalPin = this.getRecArduinov2(this.pinNamedMap['Signal'], 'Signal');\n\n    // Checks if signal pin is connected to an Arduino\n    if (signalPin) {\n      this.arduino = signalPin.parent as ArduinoUno;\n    } else {\n      window['showToast']('Arduino not found.');\n      return;\n    }\n\n    if (powerPin && gndPin) {\n      if (gndPin.label !== 'GND' || powerPin.label !== '5V') {\n        this.connected = false;\n        return;\n      }\n    } else {\n      this.connected = false;\n      return;\n    }\n\n    this.elements.undrag();\n    const ok = this.elements[1].attr();\n    this.elements[1].attr({\n      transform: '',\n      x: ok.x + this.tx,\n      y: ok.y + this.ty\n    });\n\n    // Add a Servo event on arduino\n    this.arduino.addServo(signalPin, (angle, prev) => {\n      if (angle > 182) {\n        return;\n      }\n      const duration = Math.abs(angle - (prev > 0 ? prev : 0)) * 5;\n      this.animate(angle, duration);\n    });\n  }\n  /**\n   * Called on Stop Simulation\n   */\n  closeSimulation(): void {\n\n    if (!this.connected) {\n      this.connected = true;\n      return;\n    }\n    this.arduino = null;\n    this.elements[1].stop();\n    const ok = this.elements[1].attr();\n    this.elements[1].attr({\n      transform: `t${this.tx},${this.ty}`,\n      x: ok.x - this.tx,\n      y: ok.y - this.ty\n    });\n    this.setDragListeners();\n  }\n  /**\n   * Returns node connected to ArduinoUno\n   * @param node node to start search on\n   * @param startedOn label of node search started on\n   * @returns ArduinoUno connected Node\n   */\n  getRecArduinov2(node: Point, startedOn: string) {\n    try {\n      if (node.connectedTo.start.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if ArduinoUno is connected to start node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.start;\n      } else if (node.connectedTo.end.parent.keyName === 'ArduinoUno') {\n        // TODO: Return if ArduinoUno is connected to end node\n        this.visitedNodesv2.clear();\n        return node.connectedTo.end;\n      } else if (node.connectedTo.start.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.start.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'BreadBoard' && !this.visitedNodesv2.has(node.connectedTo.end.gid)) {\n        // TODO: Call recursive BreadBoard handler function if node is connected to Breadboard && visited nodes doesn't have node's gid\n        return this.getRecArduinoBreadv2(node, startedOn);\n      } else if (node.connectedTo.end.parent.keyName === 'Battery9v' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to 9V Battery\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'CoinCell' && window.scope.ArduinoUno.length === 0) {\n        // TODO: Return false if node's end is connected to Coin Cell\n        return false;\n      } else if (node.connectedTo.end.parent.keyName === 'RelayModule') {\n        // TODO: Handle RelayModule\n        if (startedOn === 'POSITIVE') {\n          // If search was started on Positive node then return connected node of VCC in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[3], startedOn);\n        } else if (startedOn === 'NEGATIVE') {\n          // If search was started on Negative node then return connected node of GND in Relay\n          return this.getRecArduinov2(node.connectedTo.end.parent.nodes[5], startedOn);\n        }\n      } else {\n        // TODO: If nothing matches\n        // IF/ELSE: Determine if start is to be used OR end for further recursion\n        if (node.connectedTo.end.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.end.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.end.parent.nodes[e].gid !== node.connectedTo.end.gid\n              && !this.visitedNodesv2.has(node.connectedTo.end.parent.nodes[e].gid) && node.connectedTo.end.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.end.parent.nodes[e].gid);\n              // call back L293D Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.end.parent.nodes[e], startedOn);\n            }\n          }\n        } else if (node.connectedTo.start.gid !== node.gid) {\n          // Loops through all nodes in parent\n          for (const e in node.connectedTo.start.parent.nodes) {\n            // IF: gid is different && gid not in visited node\n            if (node.connectedTo.start.parent.nodes[e].gid !== node.connectedTo.start.gid\n              && !this.visitedNodesv2.has(node.connectedTo.start.parent.nodes[e].gid)\n              && node.connectedTo.start.parent.nodes[e].isConnected()) {\n              // add gid in visited nodes\n              this.visitedNodesv2.add(node.connectedTo.start.parent.nodes[e].gid);\n              // call back L293D Recursive Fn\n              return this.getRecArduinov2(node.connectedTo.start.parent.nodes[e], startedOn);\n            }\n          }\n        }\n\n      }\n    } catch (e) {\n      console.warn(e);\n      return false;\n    }\n\n  }\n\n  /**\n   * Recursive Function to handle BreadBoard\n   * @param node Node which is to be checked for BreadBoard\n   */\n  getRecArduinoBreadv2(node: Point, startedOn: string) {\n    // IF/ELSE: Determine if start is to be used OR end for further recursion\n    if (node.connectedTo.end.gid !== node.gid) {\n      const bb = (node.connectedTo.end.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.end.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.end.label.substring(1, node.connectedTo.end.label.length)) {\n            const ascii = node.connectedTo.end.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    } else if (node.connectedTo.start.gid !== node.gid) {\n      const bb = (node.connectedTo.start.parent as BreadBoard);\n      // loop through joined nodes of breadboard\n      for (const e in bb.joined) {\n        if (bb.joined[e].gid !== node.connectedTo.start.gid) {\n          // Run only if substring matches\n          if (bb.joined[e].label.substring(1, bb.joined[e].label.length)\n            === node.connectedTo.start.label.substring(1, node.connectedTo.start.label.length)) {\n            const ascii = node.connectedTo.start.label.charCodeAt(0);\n            const currAscii = bb.joined[e].label.charCodeAt(0);\n            // add gid to VisitedNode\n            this.visitedNodesv2.add(bb.joined[e].gid);\n            // IF/ELSE: determine which part of breadboard is connected\n            if (ascii >= 97 && ascii <= 101) {\n              if (bb.joined[e].isConnected() && (currAscii >= 97 && currAscii <= 101)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else if (ascii >= 102 && ascii <= 106) {\n              if (bb.joined[e].isConnected() && (currAscii >= 102 && currAscii <= 106)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            } else {\n              if (bb.joined[e].isConnected() && (bb.joined[e].label === node.connectedTo.end.label)) {\n                return this.getRecArduinov2(bb.joined[e], startedOn);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Function to check if all nodes of component is connected\n   */\n  areAllNodesConnected(): boolean {\n    for (const node of this.nodes) {\n      if (!node.isConnected()) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/alert/alert-modal/alert-modal.component.css",
    "content": ".close-button{\n    margin: auto;\n}\n\n.content-message{\n    text-align: center;\n}"
  },
  {
    "path": "ArduinoFrontend/src/app/alert/alert-modal/alert-modal.component.html",
    "content": "<div class=\"content-message\" mat-dialog-content>\n  {{ data.message }}\n</div>\n<div mat-dialog-actions>\n    <button class=\"mat-raised-button close-button\"(click)=\"close()\">{{ data.buttonText || 'OK' }}</button>\n</div>\n"
  },
  {
    "path": "ArduinoFrontend/src/app/alert/alert-modal/alert-modal.component.spec.ts",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/alert/alert-modal/alert-modal.component.ts",
    "content": "import { Component, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';\n\n/**\n * Interface For Alert Dialog data\n * @param message Message to be shown in the alert box\n * @param buttonText Text to be shown on the confirmation button\n */\ninterface AlertDialogData {\n  message: string;\n  buttonText?: string;\n}\n\n/**\n * Class For Alert Modal Component\n */\n@Component({\n  selector: 'app-alert-modal',\n  templateUrl: './alert-modal.component.html',\n  styleUrls: ['./alert-modal.component.css']\n})\nexport class AlertModalComponent {\n  /**\n   * Constructor For Alert Modal\n   * @param dialogRef Material Dialog Reference\n   * @param data Data to be used in the alert box\n   */\n  constructor(public dialogRef: MatDialogRef<AlertModalComponent>, @Inject(MAT_DIALOG_DATA) public data: AlertDialogData) { }\n\n  close(): void {\n    // Close Dialog\n    this.dialogRef.close();\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/alert/alert-service/alert.service.spec.ts",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/alert/alert-service/alert.service.ts",
    "content": "import { Injectable } from '@angular/core';\nimport { AlertModalComponent } from '../alert-modal/alert-modal.component';\nimport { MatDialog } from '@angular/material';\nimport { ConfirmModalComponent } from '../confirm-modal/confirm-modal.component';\nimport { OptionModalComponent } from '../option-modal/option-modal.component';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AlertService {\n\n  private static dialog: MatDialog;\n\n  constructor(public dialog: MatDialog) {\n    AlertService.dialog = dialog;\n  }\n\n  static showAlert(message: string, buttonText: string = 'OK') {\n    const dialogRef = AlertService.dialog.open(AlertModalComponent, {\n      data: { message, buttonText }\n    });\n    dialogRef.afterClosed();\n  }\n\n  static showConfirm(message, yesFunction: () => any, noFunction?: () => any, yesButtonText: string = 'Yes', noButtonText: string = 'No') {\n    const dialogRef = AlertService.dialog.open(ConfirmModalComponent, {\n      data: {\n        message,\n        yesButtonText,\n        noButtonText,\n        yesFunction,\n        noFunction,\n      },\n    });\n    dialogRef.afterClosed().subscribe(value => {\n      if (value) {\n        yesFunction();\n      } else {\n        noFunction();\n      }\n    });\n  }\n\n  static showOptions(\n    message,\n    option1Function: () => any,\n    option2Function?: () => any,\n    cancelFunction?: () => any,\n    option1Text: string = 'Option 1',\n    option2Text: string = 'Option 2',\n    cancelButtonText: string = 'Cancel') {\n    const dialogRef = AlertService.dialog.open(OptionModalComponent, {\n      data: {\n        message,\n        option1Text,\n        option2Text,\n        cancelButtonText,\n        option1Function,\n        option2Function,\n        cancelFunction,\n      },\n    });\n    dialogRef.afterClosed().subscribe(value => {\n      if (value === 1) {\n        option1Function();\n      } else if (value === 2) {\n        option2Function();\n      } else {\n        cancelFunction();\n      }\n    });\n  }\n\n  static showCustom(component, data, subscriber) {\n    const dialogRef = AlertService.dialog.open(component, { data });\n    dialogRef.afterClosed().subscribe(subscriber);\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/alert/confirm-modal/confirm-modal.component.css",
    "content": ".confirm-buttons{\n    text-align: center;\n    display: block;\n}\n\n.response-button {\n    display: inline-block;\n}"
  },
  {
    "path": "ArduinoFrontend/src/app/alert/confirm-modal/confirm-modal.component.html",
    "content": "<div mat-dialog-content>\n  {{ data.message }}\n</div>\n<div class=\"confirm-buttons\" mat-dialog-actions>\n  <button class=\"response-button\" mat-button (click)=\"onDeny()\">{{ data.noButtonText }} </button>\n  <button class=\"response-button\" mat-raised-button color=\"primary\" (click)=\"onConfirm()\">{{ data.yesButtonText }}</button>\n  <button class=\"response-button\" *ngIf=\"data.cancelButtonText\" mat-raised-button color=\"secondary\" (click)=\"onCancel()\">{{ data.cancelButtonText }}</button>\n</div>\n"
  },
  {
    "path": "ArduinoFrontend/src/app/alert/confirm-modal/confirm-modal.component.spec.ts",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/alert/confirm-modal/confirm-modal.component.ts",
    "content": "import { Component, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';\n\n/**\n * Interface For Confirm Dialog data\n * @param message Message to be shown in the confirm box\n * @param yesButtonText Text to be shown on the confirmation button\n * @param noButtonText Text to be shown on the confirmation button\n * @param yesFunction Callback function after clicking yes\n * @param noFunction Callback function after clicking no\n */\ninterface ConfirmDialogData {\n  message: string;\n  yesButtonText?: string;\n  noButtonText?: string;\n  cancelButtonText?: string;\n  yesFunction: () => any;\n  noFunction?: () => any;\n  cancelFunction?: () => any;\n}\n\n/**\n * Class For Confirm Modal Component\n */\n@Component({\n  selector: 'app-confirm-modal',\n  templateUrl: './confirm-modal.component.html',\n  styleUrls: ['./confirm-modal.component.css']\n})\nexport class ConfirmModalComponent {\n  /**\n   * Constructor For Alert Modal\n   * @param dialogRef Material Dialog Reference\n   * @param data Data to be used in the alert box\n   */\n  constructor(public dialogRef: MatDialogRef<ConfirmModalComponent>, @Inject(MAT_DIALOG_DATA) public data: ConfirmDialogData) { }\n\n  onConfirm(): void {\n    // Close the dialog, return true\n    this.dialogRef.close(true);\n  }\n\n  onDeny(): void {\n    // Close the dialog, return false\n    this.dialogRef.close(false);\n  }\n\n  onCancel(): void {\n    // Close the dialog, return null\n    this.dialogRef.close(null);\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/alert/option-modal/option-modal.component.css",
    "content": ".option-buttons{\n    text-align: center;\n    display: block;\n}\n\n.response-button {\n    display: block;\n    width: 100%;\n    margin: 10px 0px !important;\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/alert/option-modal/option-modal.component.html",
    "content": "<div mat-dialog-content>\n  {{ data.message }}\n</div>\n<div class=\"option-buttons\" mat-dialog-actions>\n  <button class=\"response-button\" mat-raised-button color=\"primary\" (click)=\"onOption1()\">{{ data.option1Text }}</button>\n  <button class=\"response-button\" mat-raised-button color=\"primary\" (click)=\"onOption2()\">{{ data.option2Text }}</button>\n  <button class=\"response-button\" mat-raised-button color=\"warn\" (click)=\"onDismiss()\">{{ data.cancelButtonText }} </button>\n</div>\n"
  },
  {
    "path": "ArduinoFrontend/src/app/alert/option-modal/option-modal.component.ts",
    "content": "import { Component, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';\n\n/**\n * Interface For option Dialog data\n * @param message Message to be shown in the option box\n * @param option1Text Text to be shown for option1 button\n * @param option2Text Text to be shown for option2 button\n * @param cancelButtonText Text to be shown for cancelling\n * @param option1Function Callback function after selecting option1\n * @param option2Function Callback function after selecting option2\n */\ninterface OptionDialogData {\n  message: string;\n  option1Text?: string;\n  option2Text?: string;\n  cancelButtonText?: string;\n  option1Function: () => any;\n  option2Function?: () => any;\n  cancelFunction?: () => any;\n}\n\n/**\n * Class For Option Modal Component\n */\n@Component({\n  selector: 'app-option-modal',\n  templateUrl: './option-modal.component.html',\n  styleUrls: ['./option-modal.component.css']\n})\nexport class OptionModalComponent {\n  /**\n   * Constructor For Alert Modal\n   * @param dialogRef Material Dialog Reference\n   * @param data Data to be used in the alert box\n   */\n  constructor(public dialogRef: MatDialogRef<OptionModalComponent>, @Inject(MAT_DIALOG_DATA) public data: OptionDialogData) { }\n\n  onOption1(): void {\n    // Close the dialog, return 1\n    this.dialogRef.close(1);\n  }\n\n  onOption2(): void {\n    // Close the dialog, return 2\n    this.dialogRef.close(2);\n  }\n\n  onDismiss(): void {\n    // Close the dialog, return 0\n    this.dialogRef.close(0);\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/api.service.spec.ts",
    "content": "import { TestBed } from '@angular/core/testing';\n\nimport { ApiService } from './api.service';\nimport { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';\nimport { RouterTestingModule } from '@angular/router/testing';\n\ndescribe('ApiService', () => {\n  beforeEach(() => TestBed.configureTestingModule({\n    imports: [HttpClientTestingModule, RouterTestingModule]\n  }));\n\n  it('should be created', () => {\n    const service: ApiService = TestBed.get(ApiService);\n    expect(service).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "ArduinoFrontend/src/app/api.service.ts",
    "content": "import { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Observable, Subject } from 'rxjs';\nimport { environment } from '../environments/environment';\nimport { Login } from './Libs/Login';\nimport { ActivatedRoute } from '@angular/router';\n\n/**\n * Class For handlind API.\n */\n/**\n * Injectable\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class ApiService {\n  /**\n   * The API URL\n   */\n  url = environment.API_URL;\n  /**\n   * Constructor for api\n   * @param http For http request & response\n   */\n\n  isAuthenticated = new Subject<boolean>();\n\n  constructor(\n    private http: HttpClient,\n    public aroute: ActivatedRoute\n  ) {\n  }\n  /**\n   * Get Http Headers only for those API calls where token is not mandatory\n   * @param token Login Token\n   * @returns Http headers as per given parameter and environment\n   */\n  httpHeaders(token: string) {\n    if (environment.production) {\n      if (token) {\n        return new HttpHeaders({\n          'Content-Type': 'application/json',\n          Authorization: `Token ${token}`,\n          'Access-Control-Allow-Origin': '*',\n        });\n      } else {\n        return new HttpHeaders({\n          'Content-Type': 'application/json',\n          'Access-Control-Allow-Origin': '*',\n        });\n      }\n    } else {\n      if (token) {\n        return new HttpHeaders({\n          'Content-Type': 'application/json',\n          Authorization: `Token ${token}`,\n        });\n      } else {\n        return new HttpHeaders({\n          'Content-Type': 'application/json',\n        });\n      }\n    }\n  }\n  /**\n   * Save Project to Cloud\n   * @param data The Project data\n   * @param token Auth Token\n   */\n  saveProject(data: any, token: string) {\n    if (data.description === '') {\n      data.description = null;\n    }\n    return this.http.post(`${this.url}api/save`, data, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Save Project to Gallery\n   * @param data The Project gallery data\n   * @param token Auth Token\n   */\n  saveProjectToGallery(data: any, token: string) {\n    return this.http.post(`${this.url}api/save/gallery/` + data.save_id, data, {\n      headers: new HttpHeaders({\n        // 'Content-Type': 'application/json',\n        Authorization: `Token ${token}`,\n        // 'Access-Control-Allow-Origin': '*',\n      })\n    });\n  }\n  /**\n   * List all the project created by an user\n   * @param token Auth Token\n   */\n  listProject(token) {\n    return this.http.get(`${this.url}api/save/arduino/list`, {\n      headers: this.httpHeaders(token)\n    });\n  }\n  /**\n   * Read Project using id\n   * @param id Read Project ID\n   * @param branch Branch of Variation\n   * @param version Version of Variation\n   * @param token Auth Token\n   */\n  readProject(id: string, branch: string, version: string, token: string) {\n    let url = `${this.url}api/save/${id}`;\n    url += version ? `/${version}` : '';\n    url += branch ? `/${branch}` : '';\n    return this.http.get(url, {\n      headers: this.httpHeaders(token)\n    });\n  }\n  /**\n   * Find Project using Project name\n   * @param title Project name that needs to be searched\n   * @param token Auth Token\n   */\n  searchProject(title: string, token: string) {\n    const url = encodeURI(`${this.url}api/save/search?name__icontains=${title}&is_arduino=true`);\n    return this.http.get(url, {\n      headers: this.httpHeaders(token),\n    });\n  }\n  /**\n   * Update Project from the project id\n   * @param id Project id\n   * @param data Updated Project Data\n   * @param token Auth Token\n   */\n  updateProject(id: string, data: any, token: string) {\n    data.save_id = id;\n    return this.http.post(`${this.url}api/save`, data, {\n      headers: this.httpHeaders(token),\n    });\n  }\n  /**\n   * Delete Project From  Database\n   * @param id Project id\n   * @param token Auth Token\n   */\n  deleteProject(id, token): Observable<any> {\n    return this.http.delete(`${this.url}api/save/${id}`, {\n      headers: new HttpHeaders({\n        'Content-Type': 'application/json',\n        Authorization: `Token ${token}`,\n        // 'Access-Control-Allow-Origin': '*',\n      }),\n      observe: 'response',\n    });\n  }\n  /**\n   * Compiles INO code and returns the status and task id\n   * @param data The Code and id of arduino\n   */\n  compileCodeINO(data: any): Observable<any> {\n    return this.http.post(`${this.url}api/arduino/compileINO`, data);\n  }\n  /**\n   * Compiles IN code and returns the status and task id\n   * @param data The Code and id of arduino\n   */\n   compileCodeInlineAssembly(data: any): Observable<any> {\n    return this.http.post(`${this.url}api/arduino/compileInlineAssembly`, data);\n  }\n  /**\n   * Returns the hex of the compiled code\n   * @param taskId Compilation Task ID\n   */\n  getHex(taskId: string): Observable<any> {\n    return this.http.get(`${this.url}api/arduino/compile/status?task_id=${taskId}`);\n  }\n  /**\n   * returns the user name and email\n   * @param token Auth Token\n   */\n  userInfo(token: string): Observable<any> {\n    return this.http.get(`${this.url}api/auth/users/me`, {\n      headers: this.httpHeaders(token),\n    });\n  }\n  /**\n   * Enable/Disable Sharing a Project\n   * @param id Project id\n   * @param on Sharing State\n   * @param token Auth token\n   */\n  Sharing(id: string, branch: string, version: string, on: boolean, token: string) {\n    const state = on ? 'on' : 'off';\n    return this.http.post(`${this.url}api/save/${id}/sharing/${state}/${version}/${branch}`, {}, {\n      headers: this.httpHeaders(token)\n    });\n  }\n  /**\n   * Fetch Samples\n   */\n  fetchSamples(): Observable<any> {\n    // return this.http.get('./assets/samples/Samples.json');\n    return this.http.get(`${this.url}api/save/gallery?is_arduino=true`);\n  }\n\n  /**\n   * Fetchs single project  gallery to simulator\n   * @param id  unique id for gallery circuit\n   */\n  fetchSingleProjectToGallery(id: any) {\n    return this.http.get(`${this.url}api/save/gallery/` + id);\n  }\n\n  /**\n   * Deletes single project from gallery\n   * @param id Project id\n   * @param token  Auth Token\n   */\n  deleteProjectFromGallery(id: any, token: any) {\n    return this.http.delete(`${this.url}api/save/gallery/` + id, {\n      headers: new HttpHeaders({\n        Authorization: `Token ${token}`,\n      })\n    });\n  }\n\n  /**\n   * List all the variations with save id\n   * @param id Project id\n   * @param token Auth Token\n   */\n  listAllVersions(id, token): Observable<any> {\n    return this.http.get(`${this.url}api/save/versions/${id}`, {\n      headers: this.httpHeaders(token)\n    });\n  }\n\n  /**\n   * Delete specific branch\n   * @param id Project Id\n   * @param branch Branch of variation\n   * @param token Auth Token\n   */\n  deleteBranch(id, branch, token) {\n    return this.http.delete(`${this.url}api/save/versions/${id}/${branch}`, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Delete specifit variation\n   * @param id Project Id\n   * @param branch Branch of variation\n   * @param version Version of variation\n   * @param token Auth Token\n   */\n  deleteVariation(id, branch, version, token) {\n    return this.http.delete(`${this.url}api/save/versions/${version}/${id}/${branch}`, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Request to fetch LTI App details for id of the given circuit\n   * @param id save_id of the circuit\n   * @param token Auth Token\n   */\n  existLTIURL(id: string, token: string) {\n    return this.http.get(`${this.url}api/lti/exist/${id}`, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Request to fetch Arduino LTI App details for id of the given circuit\n   * @param id save_id of the circuit\n   * @param token Auth Token\n   */\n  ArduinoexistLTIURL(id: string, token: string) {\n    return this.http.get(`${this.url}api/lti/exist/arduino/${id}`, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Request to save LTI details at the backend\n   * @param token Auth Token\n   * @param data LTI Details containing ids of model and student circuits, consumer and secret keys\n   */\n  saveLTIDetails(token: string, data: any) {\n    return this.http.post(`${this.url}api/lti/build/`, data, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Request to save LTI details at the backend\n   * @param token Auth Token\n   * @param data LTI Details containing ids of model and student circuits, consumer and secret keys\n   */\n   saveArduinoLTIDetails(token: string, data: any) {\n    return this.http.post(`${this.url}api/lti/build/arduino`, data, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Resuest for view code\n   * @param id Arduino LTI session id\n   * @param token Auth Token\n   * @returns Boolean for student being able to see the code\n   */\n  viewArduinoCode(id, token): Observable<any> {\n    return this.http.get(`${this.url}api/lti/arduino/viewcode/${id}`, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Requests for deleting the LTI app\n   * @param id Model Circuit ID Number\n   * @param token Auth Token\n   */\n  removeLTIDetails(id: number, token: string) {\n    return this.http.delete(`${this.url}api/lti/delete/${id}`, {\n      headers: new HttpHeaders({\n        Authorization: `Token ${token}`,\n      })\n    });\n  }\n\n  /**\n   * Requests for deleting the Arduino LTI app\n   * @param id Model Circuit ID Number\n   * @param token Auth Token\n   */\n  removeArduinoLTIDetails(id: number, token: string) {\n    return this.http.delete(`${this.url}api/lti/arduino/delete/${id}`, {\n      headers: new HttpHeaders({\n        Authorization: `Token ${token}`,\n      })\n    });\n  }\n\n  /**\n   * Development Mode Login.\n   */\n  login() {\n    return new Promise((reslove, reject) => {\n      if (environment.production === false) {\n        this.aroute.queryParams.subscribe((paramData: any) => {\n          if (paramData.token != null) {\n            localStorage.setItem('esim_token', paramData.token);\n            this.isAuthenticated.next(true);\n            reslove(1);\n          } else if (Login.getToken()) {\n            this.isAuthenticated.next(true);\n            reslove(1);\n          }\n        });\n      } else {\n        reslove(0);\n      }\n    });\n  }\n\n  /**\n   * Request to update LTI details at the backend\n   * @param token Auth Token\n   * @param data LTI Details containing ids of model and student circuits, consumer and secret keys\n   */\n  updateLTIDetails(token: string, data: any) {\n    return this.http.post(`${this.url}api/lti/update/`, data, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Request to update LTI details for Arduino at the backend\n   * @param token Auth Token\n   * @param data LTI Details containing ids of model and student circuits, consumer and secret keys\n   */\n  updateArduinoLTIDetails(token: string, data: any) {\n    return this.http.post(`${this.url}api/lti/update_arduino/`, data, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Requests for creating submission for the circuit with given id\n   * @param token Auth Token\n   * @param data LTI data (contains save_id, lti_id, lti_nonce, lti_user_id)\n   */\n  submitCircuit(token: string, data: any) {\n    return this.http.post(`${this.url}api/lti/submit/`, data, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Requests for creating submission for the Arduino circuit with given id\n   * @param token Auth Token\n   * @param data LTI data (contains save_id, lti_id, lti_nonce, lti_user_id)\n   */\n  arduinoSubmitCircuit(token: string, data: any) {\n    return this.http.post(`${this.url}api/lti/arduino/submit/`, data, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Requests to retrieve all the submissions for given LTI App from backend\n   * @param id save_id of the circuit\n   * @param branch branch of the circuit\n   * @param version version of the circuit\n   * @param token Auth Token\n   */\n  getSubmissions(id: string, branch: string, version: string, token: string) {\n    return this.http.get(`${this.url}api/lti/submissions/${id}/${version}/${branch}`, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Requests to retrieve all the submissions for given Arduino LTI App from backend\n   * @param id save_id of the circuit\n   * @param branch branch of the circuit\n   * @param version version of the circuit\n   * @param token Auth Token\n   */\n  getArduinoSubmissions(id: string, branch: string, version: string, token: string) {\n    return this.http.get(`${this.url}api/lti/arduino/submissions/${id}/${version}/${branch}`, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Logout\n   */\n  logout(token): void {\n    console.log(token);\n    this.http.post(`${this.url}api/auth/token/logout/`, '', {\n      headers: new HttpHeaders({\n        Authorization: `Token ${token}`\n      })\n    }).subscribe(() => {\n      this.isAuthenticated.next(false);\n      Login.logout();\n    }, (e) => { console.log(e); });\n  }\n  /**\n   * Specific User Role.\n   * @param token Auth Token\n   */\n  getRole(token): Observable<any> {\n    return this.http.get(`${this.url}api/workflow/role/`, {\n      headers: new HttpHeaders({\n        // 'Content-Type': 'application/json',\n        Authorization: `Token ${token}`,\n        // 'Access-Control-Allow-Origin': '*',\n      })\n    });\n  }\n\n  storeSimulationData(id, token, data: object) {\n    return this.http.post(`${this.url}api/save/arduinodata/${id}`, data, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  /**\n   * Request for storing Arduino LTI Simulation data\n   * @param id Circuit ID\n   * @param lti_id Arduino LTI ID\n   * @param token Login Token\n   * @param data Simulation Data performed by the student\n   */\n  storeLTISimulationData(id, ltiId: number, token, data: object) {\n    return this.http.post(`${this.url}api/lti/save/arduinodata/${id}/${ltiId}`, data, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n\n  getSimulationData(id, version, branch, token: string): Observable<any> {\n    return this.http.get(`${this.url}api/save/arduinodata/${id}/${version}/${branch}`, {\n      headers: this.httpHeaders(token),\n    });\n  }\n\n  getLTISimulationData(id, ltiId): Observable<any> {\n    return this.http.get(`${this.url}api/lti/save/arduinodata/${id}/${ltiId}`);\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/app-routing.module.ts",
    "content": "import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nimport { SimulatorComponent } from './simulator/simulator.component';\nimport { FrontPageComponent } from './front-page/front-page.component';\nimport { GalleryComponent } from './gallery/gallery.component';\nimport { ViewProjectComponent } from './view-project/view-project.component';\nimport { LTIFormComponent } from './lti-form/lti-form.component';\nimport { SubmissionlistComponent } from './submissionlist/submissionlist.component';\n\nconst routes: Routes = [\n  { path: '', component: FrontPageComponent },\n  { path: 'project/:slug', component: ViewProjectComponent },\n  {\n    path: 'dashboard',\n    loadChildren: './dashboard/dashboard.module#DashboardModule'\n  },\n  { path: 'simulator', component: SimulatorComponent },\n  { path: 'lti', component: LTIFormComponent },\n  { path: 'submissions', component: SubmissionlistComponent },\n];\n\n@NgModule({\n  imports: [RouterModule.forRoot(routes)],\n  exports: [RouterModule]\n})\nexport class AppRoutingModule { }\n"
  },
  {
    "path": "ArduinoFrontend/src/app/app.component.css",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/app.component.html",
    "content": "<router-outlet></router-outlet>\n"
  },
  {
    "path": "ArduinoFrontend/src/app/app.component.spec.ts",
    "content": "import { TestBed, async } from '@angular/core/testing';\nimport { RouterTestingModule } from '@angular/router/testing';\nimport { AppComponent } from './app.component';\n\ndescribe('AppComponent', () => {\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({\n      imports: [\n        RouterTestingModule\n      ],\n      declarations: [\n        AppComponent\n      ],\n    }).compileComponents();\n  }));\n\n  it('should create the app', () => {\n    const fixture = TestBed.createComponent(AppComponent);\n    const app = fixture.debugElement.componentInstance;\n    expect(app).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "ArduinoFrontend/src/app/app.component.ts",
    "content": "import { Component, AfterViewInit } from '@angular/core';\n\n/**\n * The Main App Component\n */\n@Component({\n  selector: 'app-root',\n  templateUrl: './app.component.html',\n  styleUrls: ['./app.component.css']\n})\nexport class AppComponent implements AfterViewInit {\n  /**\n   * The Title of the app\n   */\n  title = 'Arduino On Cloud';\n  /**\n   * Called after everything is loaded\n   */\n  ngAfterViewInit() {\n    // Hide loading animation\n    document.getElementById('loadanim').style.display = 'none';\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/app.module.ts",
    "content": "import { BrowserModule } from '@angular/platform-browser';\nimport { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { AppRoutingModule } from './app-routing.module';\nimport { AppComponent } from './app.component';\nimport { DashboardComponent } from './dashboard/dashboard.component';\nimport { SimulatorComponent } from './simulator/simulator.component';\n// import { ClipboardModule } from '@angular/cdk/clipboard';\n\nimport { MonacoEditorModule, NgxMonacoEditorConfig } from 'ngx-monaco-editor';\nimport { CodeEditorComponent } from './code-editor/code-editor.component';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\n// import { PathLocationStrategy, LocationStrategy } from '@angular/common';\nimport { HashLocationStrategy, LocationStrategy } from '@angular/common';\nimport { ViewComponentInfoComponent } from './view-component-info/view-component-info.component';\nimport { HttpClientModule } from '@angular/common/http';\nimport { ExportfileComponent } from './exportfile/exportfile.component';\nimport { ComponentlistComponent } from './componentlist/componentlist.component';\nimport { FrontPageComponent } from './front-page/front-page.component';\nimport { GalleryComponent } from './gallery/gallery.component';\nimport { HeaderComponent } from './header/header.component';\nimport { ViewProjectComponent } from './view-project/view-project.component';\nimport { AlertModalComponent } from './alert/alert-modal/alert-modal.component';\nimport { ConfirmModalComponent } from './alert/confirm-modal/confirm-modal.component';\nimport { ExportJSONDialogComponent } from './export-jsondialog/export-jsondialog.component';\nimport { ExitConfirmDialogComponent } from './exit-confirm-dialog/exit-confirm-dialog.component';\nimport { SaveProjectDialogComponent } from './simulator/save-project-dialog/save-project-dialog.component';\nimport { OptionModalComponent } from './alert/option-modal/option-modal.component';\nimport { VersioningPanelComponent } from './versioning-panel/versioning-panel.component';\nimport { CreateVariationDialogComponent } from './versioning-panel/create-variation-dialog/create-variation-dialog.component';\nimport { SidePanelComponent } from './side-panel/side-panel.component';\nimport { MaterialModule } from './common/material.module';\nimport { DashboardModule } from './dashboard/dashboard.module';\nimport { SharedModule } from './common/SharedModule.module';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { LTIFormComponent } from './lti-form/lti-form.component';\nimport { SubmissionlistComponent } from './submissionlist/submissionlist.component';\nimport { ViewCodeComponent } from './lti-form/view-code/view-code.component';\nimport { GraphComponent } from './graph/graph.component';\nimport { GraphDataService } from './graph-data.service';\nimport { GraphlistComponent } from './graphlist/graphlist.component';\n\n/**\n * Monaco OnLoad Function\n */\nexport function onMonacoLoad() { }\n\n/**\n * Monaco editor config for loading js files\n */\nconst monacoConfig: NgxMonacoEditorConfig = {\n  baseUrl: './assets',\n  defaultOptions: { scrollBeyondLastLine: false },\n  onMonacoLoad\n};\n\n\n\n@NgModule({\n  declarations: [\n    AppComponent,\n    SimulatorComponent,\n    CodeEditorComponent,\n    ViewComponentInfoComponent,\n    ExportfileComponent,\n    ComponentlistComponent,\n    FrontPageComponent,\n    // GalleryComponent,\n    ViewProjectComponent,\n    // HeaderComponent,\n    AlertModalComponent,\n    ConfirmModalComponent,\n    OptionModalComponent,\n    ExportJSONDialogComponent,\n    ExitConfirmDialogComponent,\n    SaveProjectDialogComponent,\n    VersioningPanelComponent,\n    CreateVariationDialogComponent,\n    LTIFormComponent,\n    SubmissionlistComponent,\n    ViewCodeComponent,\n    GraphComponent,\n    GraphlistComponent,\n  ],\n  imports: [\n    BrowserModule,\n    AppRoutingModule,\n    FormsModule,\n    ReactiveFormsModule,\n    MonacoEditorModule.forRoot(monacoConfig),\n    BrowserAnimationsModule,\n    MaterialModule,\n    HttpClientModule,\n    SharedModule,   // shared module for Header component\n    DragDropModule,\n    ScrollingModule,\n  ],\n  // providers: [{provide: LocationStrategy, useClass: PathLocationStrategy}],\n  providers: [{ provide: LocationStrategy, useClass: HashLocationStrategy }, GraphDataService],\n  bootstrap: [AppComponent],\n  entryComponents: [\n    ViewComponentInfoComponent,\n    ExportfileComponent,\n    ComponentlistComponent,\n    AlertModalComponent,\n    ConfirmModalComponent,\n    OptionModalComponent,\n    ExportJSONDialogComponent,\n    ExitConfirmDialogComponent,\n    SaveProjectDialogComponent,\n    CreateVariationDialogComponent,\n  ],\n  schemas: [\n    CUSTOM_ELEMENTS_SCHEMA\n  ],\n  exports: [AppComponent]\n})\nexport class AppModule { }\n"
  },
  {
    "path": "ArduinoFrontend/src/app/code-editor/code-editor.component.css",
    "content": ".alert {\n    border-bottom: 1px solid;\n    border-top: 1px solid;\n    padding: 8px;\n    margin-bottom: 0px;\n    display: flex;\n}\n\n.include {\n    font-size: 12px;\n    line-height: 15px;\n    padding-right: 10px;\n    padding-left: 5px;\n}\n\n.name {\n    margin-left: 12px;\n    font-weight: 500;\n    width: 80px;\n    line-height: 34px;\n    font-size: 14px;\n}\n\n.description {\n    text-overflow: ellipsis;\n    overflow: hidden;\n    display: flex;\n    max-height: 36px;\n    line-height: 36px;\n    width: calc(100% - 220px);\n    font-size: 12px;\n    padding-left: 16px;\n}\n\n.icon {\n    position: relative;\n    width: 30px;\n    height: 30px;\n    margin-right: 3px;\n    margin-top: 3px;\n}"
  },
  {
    "path": "ArduinoFrontend/src/app/code-editor/code-editor.component.html",
    "content": "<div [style.width.px]=width [style.minHeight]=\"height+'vh'\" style=\"margin-top: 0px;\">\n\n  <div class=\" text text-center\" style=\"display:flex;height: 100vh; background-color: whitesmoke; font-size: 1.4em;\"\n    *ngIf=\"names.length == 0\">\n    <p style=\"margin:auto auto;\">No Programmable Component in this Circuit</p>\n  </div>\n\n  <div *ngIf=\"names.length>0\">\n    <div class=\"inline-block\"\n      style=\"display: flex; background-color:whitesmoke; justify-content: space-between;margin:auto;\">\n      <span style=\"flex:1 1 auto;\"></span>\n      <button class=\"btn btn-light btn-sm  mb-1 mt-2 mr-1 \" matTooltip=\"Download ino file\" style=\"font-size: 16px; max-height:30px;background: transparent;\"\n        (click)=\"DownloadCode()\"><i class=\"fa fa-download\"></i></button>\n      <button class=\"btn btn-light btn-sm mb-1 mt-2 mr-1 \" matTooltip=\"Include Library\" style=\"font-size:16px; max-height:30px;background: transparent;\"\n        (click)=\"openFolder()\"><i class=\"fas fa-box\"></i></button>\n      <form>\n        <div class=\"form-group mt-2 \" style=\"max-height: 20px; box-shadow: whitesmoke; \">\n          <select id=\"inputState\" class=\"form-control form-control-sm\" (change)=\"chooseArduino(chooseArduinoController)\"\n            #chooseArduinoController>\n            <option *ngFor=\"let name of names\">{{name}}</option>\n          </select>\n        </div>\n      </form>\n      <form>\n        <div class=\"form-group mt-2 \" style=\"max-height: 20px; box-shadow: whitesmoke; \">\n          <select id=\"inputState\" class=\"form-control form-control-sm\" (change)=\"chooseLanguage(chooseController)\"\n            #chooseController>\n            <option *ngFor=\"let name of lang\">{{name}}</option>\n          </select>\n        </div>\n      </form>\n    </div>\n\n    <div id=\"lib\"\n      style=\"display: none; flex-direction: column; z-index: 1000;position: absolute; overflow-y: scroll; overflow-x: hidden; height: 600vh;background-color: lightgray\">\n      <div class=\"alert alert-dark\" role=\"alert\" *ngFor=\"let record of records;let i = index\">\n        <button type=\"button\" class=\"btn btn-outline-primary btn-sm include\" (click)=\"Include(i)\">Include</button>\n        <div class=\"name\">{{record.name}}</div>\n        <div class=\"description\">{{record.Description}}</div>\n        <span style=\"flex:1 1 auto;\"></span>\n        <button class=\"btn btn-sm icon\"><a href={{record.url}} target=\"_blank\"><i\n              class=\"fas fa-external-link-alt\"></i></a></button>\n      </div>\n    </div>\n    <ngx-monaco-editor id=\"editor\" style=\"height: calc(100vh - 135px); display: block;\" [options]=\"editorOptions\" [(ngModel)]=\"code\"\n      (ngModelChange)=\"codeChanged()\" (onInit)=\"onInit($event)\">\n    </ngx-monaco-editor>\n  </div>\n\n</div>\n"
  },
  {
    "path": "ArduinoFrontend/src/app/code-editor/code-editor.component.spec.ts",
    "content": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { CodeEditorComponent } from './code-editor.component';\nimport { NO_ERRORS_SCHEMA } from '@angular/core';\n\ndescribe('CodeEditorComponent', () => {\n  let component: CodeEditorComponent;\n  let fixture: ComponentFixture<CodeEditorComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({\n      declarations: [ CodeEditorComponent ],\n      schemas: [NO_ERRORS_SCHEMA]\n    })\n    .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(CodeEditorComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "ArduinoFrontend/src/app/code-editor/code-editor.component.ts",
    "content": "import { Component, OnInit, Input } from '@angular/core';\nimport { ArduinoUno } from '../Libs/outputs/Arduino';\nimport { Download } from '../Libs/Download';\n\n/**\n * For Handling Time ie. Prevent moment error\n */\ndeclare var monaco;\ndeclare var window;\n\n/**\n * Code Editor Component\n */\n@Component({\n  selector: 'app-code-editor',\n  templateUrl: './code-editor.component.html',\n  styleUrls: ['./code-editor.component.css']\n})\nexport class CodeEditorComponent {\n  // TODO: Fetch records and Suggestion from api\n\n  /**\n   * Initialization variable for code editor\n   */\n  private init = false;\n  /**\n   * Monaco code editor options\n   */\n  editorOptions = {\n    theme: 'vs',\n    language: 'c'\n  };\n  /**\n   * Instance of Monaco editor\n   */\n  editor: any;\n  /**\n   * Libraries that are already present\n   */\n  records = [\n    {\n      include: 'EEPROM.h',\n      name: 'EEPROM',\n      Description: 'Reading and writing to permanent storage',\n      url: 'https://www.arduino.cc/en/Reference/EEPROM'\n    },\n    {\n      include: 'LiquidCrystal.h',\n      name: 'LiquidCrystal',\n      Description: 'Controlling liquid crystal displays (LCDs)',\n      url: 'https://www.arduino.cc/en/Reference/LiquidCrystal'\n    },\n    {\n      include: 'Servo.h',\n      name: 'Servo',\n      Description: 'Controlling Servo motor',\n      url: 'https://www.arduino.cc/en/Reference/Servo'\n    },\n    {\n      include: 'SoftwareSerial.h',\n      name: 'SoftwareSerial',\n      Description: 'Allow serial communication on other digital pins of the Arduino',\n      url: 'https://www.arduino.cc/en/Reference/SoftwareSerial'\n    },\n    {\n      include: 'Wire.h',\n      name: 'Wire',\n      Description: 'This library allows you to communicate with I2C / TWI devices',\n      url: 'https://www.arduino.cc/en/Reference/Wire'\n    },\n    {\n      include: 'SPI.h',\n      name: 'SPI',\n      Description: 'Communicating with devices using the Serial Peripheral Interface (SPI) Bus',\n      url: 'https://www.arduino.cc/en/Reference/SPI'\n    }\n  ];\n  /**\n   * Code inside the Monaco editor\n   */\n  code = '';\n  /**\n   * Names of Arduino\n   */\n  names: string[] = [];\n  /**\n   * List of Programming languages available\n   */\n  lang: string[] = ['Arduino .ino file', 'C inline assembly'];\n  /**\n   * Selected programming language\n   */\n  langIndex = 0;\n  /**\n   * Instance of Arduino uno for updating code\n   */\n  arduinos: ArduinoUno[] = [];\n  /**\n   * Selected Arduino Index\n   */\n  selectedIndex = 0;\n  /**\n   * Width of the Code editor\n   */\n  @Input() width = 500;\n  /**\n   * Height of the code editor in terms of VH\n   */\n  @Input() height = 80;\n  /**\n   * Code Visibility in LTI mode\n   */\n  @Input() codeView = true;\n  /**\n   * Reninitialize arduino names\n   */\n  @Input('reinit')\n  set reinit(value: boolean) {\n    // Set Global variable to tell that code editor is opened\n    window['isCodeEditorOpened'] = value;\n\n    if (value) {\n      // Clear names and instances\n      this.names = [];\n      this.arduinos = [];\n      // get Names and instances\n      for (const key in window['ArduinoUno_name']) {\n        if (window['ArduinoUno_name'][key]) {\n          this.names.push(key);\n          this.arduinos.push(window['ArduinoUno_name'][key]);\n        }\n      }\n      // reset selected  index\n      if (this.selectedIndex >= this.arduinos.length) {\n        this.selectedIndex = 0;\n      }\n      // select the code of respective arduino\n      if (this.arduinos.length > 0) {\n        this.code = this.arduinos[this.selectedIndex].code;\n      }\n      // show loading animation if code editor is nor initialized\n      if (this.names.length !== 0 && !this.init) {\n        window['showLoading']();\n      }\n    }\n  }\n  /**\n   * Download the code from code editor\n   */\n  DownloadCode() {\n    Download.DownloadText(this.names[this.selectedIndex] + '.ino',\n      [this.code],\n      {\n        type: 'text/ino;charset=utf-8;'\n      });\n  }\n  /**\n   * Include the header to the code\n   * @param i Index of the Library that needs to be included\n   */\n  Include(i) {\n    this.editor.executeEdits('code-editor', [{\n      identifier: { major: 1, minor: 1 },\n      range: new monaco.Range(1, 1, 1, 1),\n      text: '#include <' + this.records[i].include + '>\\n',\n      forceMoveMarkers: false\n    }]);\n    this.openFolder();\n  }\n  /**\n   * On Monaco code editor initialization\n   * @param editor Monaco Editor Instance\n   */\n  onInit(editor) {\n    this.init = true;\n    window['hideLoading']();\n    this.editor = editor;\n    monaco.languages.registerCompletionItemProvider('c', {\n      provideCompletionItems: () => {\n        return {\n          // If more function needs to add then add to the following array\n          // https://www.arduino.cc/en/Reference\n          suggestions: [\n            {\n              label: 'digitalRead', // Searching Parameter\n              kind: monaco.languages.CompletionItemKind.Function, // Type of Completion\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, // Insertion Rule\n              documentation: 'Read Digital Value', // The Documentation copied from arduino.cc\n              insertText: 'digitalRead(${1:PIN});', // The inserted text\n            },\n            {\n              label: 'digitalWrite',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Write a HIGH or a LOW value to a digital pin',\n\n              insertText: 'digitalWrite(${1:pin}, ${2:value});',\n            },\n            {\n              label: 'pinMode',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Configures the specified pin',\n              insertText: 'pinMode(${1:pin}, ${2:mode});',\n            },\n            {\n              label: 'analogRead',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Read Anolog Value',\n              insertText: 'analogRead(${1:pin});',\n            },\n            {\n              label: 'analogWrite',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Writes an analog value (PWM wave) to a pin.',\n              insertText: 'analogWrite(${1:pin}, ${2:value});',\n            },\n            {\n              label: 'analogReference',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Configures the reference voltage',\n              insertText: 'analogReference(${1:type});',\n            },\n            {\n              label: 'analogReadresolution',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Sets the size of analogRead value',\n              insertText: 'analogReadResolution(${1:bits});',\n            },\n            {\n              label: 'analogReadResolution',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Sets the size of analogRead value',\n              insertText: 'analogReadResolution(${1:bits});',\n            },\n            {\n              label: 'analogWriteResolution',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Sets the resolution of analogWrite value',\n              insertText: 'analogWriteResolution(${1:bits});',\n            },\n            {\n              label: 'noTone',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Stops the generation of a square wave',\n              insertText: 'noTone(${1:pin});',\n            },\n            {\n              label: 'pulseIn',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Reads a pulse',\n              insertText: 'pulseIn(${1:pin}, ${2:value});',\n            },\n            {\n              label: 'pulseIn',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Reads a pulse',\n              insertText: 'pulseIn(${1:pin}, ${2:value}, ${3:timeout});',\n            },\n            {\n              label: 'pulseInLong',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Reads a long pulse',\n              insertText: 'pulseInLong(${1:pin}, ${2:value});',\n            },\n            {\n              label: 'pulseInLong',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Reads a long pulse',\n              insertText: 'pulseInLong(${1:pin}, ${2:value}, ${3:timeout});',\n            },\n            {\n              label: 'ShiftIn',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Shifts in a byte of data one bit at a time',\n              insertText: 'shiftIn(${1:dataPin}, ${2:clockPin}, ${3:bitOrder});',\n            },\n            {\n              label: 'ShiftOut',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Shifts out a byte of data one bit at a time',\n              insertText: 'shiftOut(${1:dataPin}, ${2:clockPin}, ${3:bitOrder}, ${4:value});',\n            },\n            {\n              label: 'tone',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Generates a square wave of specified frequency',\n              insertText: 'tone(${1:pin}, ${2:frequency});',\n            },\n            {\n              label: 'tone',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Generates a square wave of specified frequency',\n              insertText: 'tone(${1:pin}, ${2:frequency}, ${3:duration});',\n            },\n            {\n              label: 'delay',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'amount of time(milliseconds)',\n              insertText: 'delay(${1:ms});',\n            },\n            {\n              label: 'delayMicroseconds',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'amount of time(microseconds)',\n              insertText: 'delayMicroseconds(${1:us});',\n            },\n            {\n              label: 'micros',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Returns the number of microseconds',\n              insertText: 'micros():',\n            },\n            {\n              label: 'millis',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Returns the number of milliseconds',\n              insertText: 'millis();',\n            },\n            {\n              label: 'abs',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Calculates the absolute value of a number',\n              insertText: 'abs(${1:x});',\n            },\n            {\n              label: 'constrain',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Constrains a number to be within a range',\n              insertText: 'constrain(${1:x}, ${2:a}, ${3:b});',\n            },\n            {\n              label: 'map',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Re-maps a number',\n              insertText: 'map(${1:value}, ${2:fromLow}, ${3:fromHigh}, ${4:toLow}, ${5:toHigh});',\n            },\n            {\n              label: 'max',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'maximum of two numbers',\n              insertText: 'max(${1:x}, ${2:y});',\n            },\n            {\n              label: 'min',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'mininmum of two numbers',\n              insertText: 'min(${1:x}, ${2:y});',\n            },\n            {\n              label: 'pow',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'value of a number raised to a power',\n              insertText: 'pow(${1:x}, ${2:y});',\n            },\n            {\n              label: 'sqr',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: ' square of a number',\n              insertText: 'sq(${1:x});',\n            },\n            {\n              label: 'sqrt',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'square root of a number',\n              insertText: 'sqrt(${1:x});',\n            },\n            {\n              label: 'cos',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'cosine of an angle (in radians)',\n              insertText: 'cos(${1:rad});',\n            },\n            {\n              label: 'sin',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'sine of an angle (in radians)',\n              insertText: 'sin(${1:rad});',\n            },\n            {\n              label: 'tan',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'tangent of an angle (in radians)',\n              insertText: 'tan(${1:rad});',\n            },\n            {\n              label: 'isAlpha',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Analyse if a char is alpha (that is a letter)',\n              insertText: 'isAlpha(${1:thisChar});',\n            },\n            {\n              label: 'isAlphaNumeric',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Analyse if a char is alphanumeric',\n              insertText: 'isAlphaNumeric(${1:thisChar});',\n            },\n            {\n              label: 'isAscii',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Analyse if a char is Ascii',\n              insertText: 'isAscii(${1:thisChar});',\n            },\n            {\n              label: 'isControl',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Analyse if a char is control character',\n              insertText: 'isControl(${1:thisChar);',\n            },\n            {\n              label: 'isDigit',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Analyse if a char is digit',\n              insertText: 'isDigit(${1:thisChar);',\n            },\n            {\n              label: 'isGraph',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Analyse if a char is printable with some content',\n              insertText: 'isGraph(${1:thisChar);',\n            },\n            {\n              label: 'isHexadecimalDigit',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Analyse if a char is printable with some content',\n              insertText: 'isHexadecimalDigit(${1:thisChar);',\n            },\n            {\n              label: 'isLowerCase',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Analyse if a char is lower case',\n              insertText: 'isLowerCase(${1:thisChar);',\n            },\n            {\n              label: 'isPrintable',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Analyse if a char is printable',\n              insertText: 'isPrintable(${1:thisChar);',\n            },\n            {\n              label: 'isSpace',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Analyse if a char is white space character',\n              insertText: 'isSpace(${1:thisChar);',\n            },\n            {\n              label: 'isUpperCase',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Analyse if a char is upper case',\n              insertText: 'isUpperCase(${1:thisChar);',\n            },\n            {\n              label: 'isWhiteSpace',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Analyse if a char is space character',\n              insertText: 'isWhitespace(${1:thisChar);',\n            },\n            {\n              label: 'random',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'generates pseudo-random numbers',\n              insertText: 'random(${1:max});',\n            },\n            {\n              label: 'random',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'generates pseudo-random numbers',\n              insertText: 'random(${1:min}, ${2:max});',\n            },\n            {\n              label: 'randomSeed',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'initializes the pseudo-random number generator',\n              insertText: 'randomSeed(${1:seed});',\n            },\n            {\n              label: 'bit',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Computes the values of specified bit',\n              insertText: 'bit(${1:n});',\n            },\n            {\n              label: 'bitClear',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Clears a bit of numeric variable',\n              insertText: 'bitClear(${1:x}, ${2:n});',\n            },\n            {\n              label: 'bitRead',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Reads a bit of a number',\n              insertText: 'bitRead(${1:x}, ${2:n});',\n            },\n            {\n              label: 'bitSet',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Sets a bit of a number variable',\n              insertText: 'bitSet(${1:x}, ${2:n});',\n            },\n            {\n              label: 'bitWrite',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Writes a bit of a numeric variable',\n              insertText: 'bitWrite(${1:x}, ${2:n}, ${3:b});',\n            },\n            {\n              label: 'highByte',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Extracts high-order byte of a word',\n              insertText: 'highByte(${1:x});',\n            },\n            {\n              label: 'lowByte',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Extracts low-order byte of a word',\n              insertText: 'lowByte(${1:x});',\n            },\n            {\n              label: 'attachInterrupt',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Digital Pins With Interrupts',\n              insertText: 'attachInterrupt(digitalPinToInterrupt(${1:pin}), ${2:ISR}, ${3:mode});',\n            },\n            {\n              label: 'attachInterrupt',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Digital Pins With Interrupts',\n              insertText: 'attachInterrupt(${1:interrupt}, ${2:ISR}, ${3:mode});',\n            },\n            {\n              label: 'attachInterrupt',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Digital Pins With Interrupts',\n              insertText: 'attachInterrupt(${1:pin}, ${2:ISR}, ${3:mode});',\n            },\n            {\n              label: 'Interrupts',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Re-enable Interrupts',\n              insertText: 'interrupts();',\n            },\n            {\n              label: 'noInterrupts',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Disables interrupts',\n              insertText: 'noInterrupts();',\n            },\n            {\n              label: 'if(Serial)',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Indicates if the specified Serial port is ready',\n              insertText: 'if (${1:Serial});',\n            },\n            {\n              label: 'Serial.available',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Get the numbers of bytes available',\n              insertText: 'Serial.available();',\n            },\n            {\n              label: 'Serial.availableForWrite',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Get the numbers of bytes available for writing',\n              insertText: 'Serial.availableForWrite();',\n            },\n            {\n              label: 'Serial.begin',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Sets the data rate in bits per second',\n              insertText: 'Serial.begin(${1:speed});',\n            },\n            {\n              label: 'Serial.begin',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Sets the data rate in bits per second',\n              insertText: 'Serial.begin(${1:speed}, ${2:config});',\n            },\n            {\n              label: 'Serial.end',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Disable serial communication',\n              insertText: 'Serial.end();',\n            },\n            {\n              label: 'Serial.find',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'finds data from the serial buffer',\n              insertText: 'Serial.find(${1:target});',\n            },\n            {\n              label: 'Serial.find',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'finds data from the serial buffer',\n              insertText: 'Serial.find(${1:target}, ${2:length});',\n            },\n            {\n              label: 'Serial.findUntil',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'finds data until terminated string is found',\n              insertText: 'Serial.findUntil(${1:target}, ${2:terminal});',\n            },\n            {\n              label: 'Serial.flush',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Waits for the transmission of outgoing serial data to complete',\n              insertText: 'Serial.flush();',\n            },\n            {\n              label: 'Serial.parseFloat',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'returns floating point number',\n              insertText: 'Serial.parseFloat();',\n            },\n            {\n              label: 'Serial.parseFloat',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'returns floating point number',\n              insertText: 'Serial.parseFloat(${1:lookahead});',\n            },\n            {\n              label: 'Serial.parseFloat',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'returns floating point number',\n              insertText: 'Serial.parseFloat(${1:lookahead}, ${1:ignore});',\n            },\n            {\n              label: 'Serial.parseInt',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'return integer number',\n              insertText: 'Serial.parseInt();',\n            },\n            {\n              label: 'Serial.parseInt',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'return integer number',\n              insertText: 'Serial.parseInt(${1:lookahead});',\n            },\n            {\n              label: 'Serial.parseInt',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'return integer number',\n              insertText: 'Serial.parseInt(${1:lookahead}, ${1:ignore});',\n            },\n            {\n              label: 'Serial.peek',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'returns the next byte',\n              insertText: 'Serial.peek();',\n            },\n            {\n              label: 'Serial.print',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'prints the data to serial data',\n              insertText: 'Serial.print(${1:val});',\n            },\n            {\n              label: 'Serial.print',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'prints the data to serial data',\n              insertText: 'Serial.print(${1:val}, ${2:format});',\n            },\n            {\n              label: 'Serial.println',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'prints the data to serial data to next line',\n              insertText: 'Serial.println(${1:val});',\n            },\n            {\n              label: 'Serial.println',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'prints the data to serial data to next line',\n              insertText: 'Serial.println(${1:val}, ${2:format});',\n            },\n            {\n              label: 'Serial.read',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Reads incoming serial data',\n              insertText: 'Serial.read();',\n            },\n            {\n              label: 'Serial.readBytes',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'returns the number of characters placed in the buffer',\n              insertText: 'Serial.readBytes(${1:buffer}, ${2:length});',\n            },\n            {\n              label: 'Serial.readBytesUntil',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: ' returns the number of characters read into the buffer',\n              insertText: 'Serial.readBytesUntil(${1:character}, ${2:buffer}, ${3:length});',\n            },\n            {\n              label: 'Serial.readString',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'read characters in string ',\n              insertText: 'Serial.readString();',\n            },\n            {\n              label: 'Serial.readStringUntil',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'read characters in string ',\n              insertText: 'Serial.readStringUntil(${1:terminator});',\n            },\n            {\n              label: 'Serial.setTimeout',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'sets the time to wait for serial data ',\n              insertText: 'Serial.setTimeout(${1:time});',\n            },\n            {\n              label: 'Serial.write',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Writes binary data to the serial port',\n              insertText: 'Serial.write(${1:val});',\n            },\n            {\n              label: 'Serial.write',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Writes binary data to the serial port',\n              insertText: 'Serial.write(${1:str});',\n            },\n            {\n              label: 'Stream.available',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Get the numbers of bytes available in stream',\n              insertText: 'stream.available();',\n            },\n            {\n              label: 'Stream.read',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'reads characters from an incoming stream',\n              insertText: 'stream.read();',\n            },\n            {\n              label: 'stream.find',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'finds data from the serial buffer',\n              insertText: 'stream.find(${1:target});',\n            },\n            {\n              label: 'stream.find',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'finds data from the serial buffer',\n              insertText: 'stream.find(${1:target}, ${2:length});',\n            },\n            {\n              label: 'stream.findUntil',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'finds data until terminated string is found',\n              insertText: 'stream.findUntil(${1:target}, ${2:terminal});',\n            },\n            {\n              label: 'stream.flush',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'clears the buffer',\n              insertText: 'stream.flush();',\n            },\n            {\n              label: 'stream.peek',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'Read byte from file without advancing to the next one',\n              insertText: 'stream.peek();',\n            },\n            {\n              label: 'stream.readBytes',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'read characters from a stream into buffer',\n              insertText: 'stream.readBytes(${1:buffer}, ${2:length);',\n            },\n            {\n              label: 'stream.readBytesUntil',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'read characters from a stream into buffer',\n              insertText: 'stream.readBytesUntil(${1:character}, ${2:buffer}, ${3:length});',\n            },\n            {\n              label: 'Stream.readString',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'read characters in string ',\n              insertText: 'stream.readString();',\n            },\n            {\n              label: 'stream.readStringUntil',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'read characters in string ',\n              insertText: 'stream.readStringUntil(${1:terminator});',\n            },\n            {\n              label: 'stream.setTimeout',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'sets the time to wait for serial data ',\n              insertText: 'stream.setTimeout(${1:time});',\n            },\n            {\n              label: 'stream.parseFloat',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'returns floating point number',\n              insertText: 'stream.parseFloat();',\n            },\n            {\n              label: 'stream.parseFloat',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'returns floating point number',\n              insertText: 'stream.parseFloat(${1:lookahead});',\n            },\n            {\n              label: 'stream.parseFloat',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'returns floating point number',\n              insertText: 'stream.parseFloat(${1:lookahead}, ${2:ignore});',\n            },\n            {\n              label: 'stream.parseInt',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'return integer number',\n              insertText: 'stream.parseInt();',\n            },\n            {\n              label: 'stream.parseInt',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'return integer number',\n              insertText: 'stream.parseInt(${1:lookahead});',\n            },\n            {\n              label: 'stream.parseInt',\n              kind: monaco.languages.CompletionItemKind.Function,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'return integer number',\n              insertText: 'stream.parseInt(${1:lookahead}, ${2:ignore});',\n            },\n            {\n              label: 'HIGH',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:HIGH}',\n            },\n            {\n              label: 'LOW',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:LOW}',\n            },\n            {\n              label: 'INPUT',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:INPUT}',\n            },\n            {\n              label: 'OUTPUT',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:OUTPUT}',\n            },\n            {\n              label: 'INPUT_PULLUP',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:INPUT_PULLUP}',\n            },\n            {\n              label: 'LED_BUILTIN',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:LED_BUILTIN}',\n            },\n            {\n              label: 'true',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:true}',\n            },\n            {\n              label: 'false',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:false}',\n            },\n            {\n              label: 'array',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:array}',\n            },\n            {\n              label: 'bool',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:bool}',\n            },\n            {\n              label: 'byte',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:byte}',\n            },\n            {\n              label: 'char',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:char}',\n            },\n            {\n              label: 'double',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:double}',\n            },\n            {\n              label: 'float',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:float}',\n            },\n            {\n              label: 'int',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:int}',\n            },\n            {\n              label: 'long',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:long}',\n            },\n            {\n              label: 'short',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:short}',\n            },\n            {\n              label: 'size_t',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:size_t}',\n            },\n            {\n              label: 'string',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:string}',\n            },\n            {\n              label: 'String()',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: 'String()',\n            },\n            {\n              label: 'unsigned char',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:unsigned char}',\n            },\n            {\n              label: 'unsigned long',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:unsigned long}',\n            },\n            {\n              label: 'void',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:void}',\n            },\n            {\n              label: 'word',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:word}',\n            },\n            {\n              label: 'const',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:const}',\n            },\n            {\n              label: 'scope',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:scope}',\n            },\n            {\n              label: 'static',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:static}',\n            },\n            {\n              label: 'volatile',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: '${1:volatile}',\n            },\n            {\n              label: 'break',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: 'break',\n            },\n            {\n              label: 'continue',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: 'continue',\n            },\n            {\n              label: 'else',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: 'else',\n            },\n            {\n              label: 'goto',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: 'goto',\n            },\n            {\n              label: 'if',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: 'if',\n            },\n            {\n              label: 'dowhile',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              insertText: [\n                'do {',\n                '\\t$0',\n                '} while(${1:condition});'\n              ].join('\\n'),\n              documentation: 'Do-while Statement',\n            },\n            {\n              label: 'while',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertText: [\n                'while(${1:condition}) {',\n                '\\t$0',\n                '}'\n              ].join('\\n'),\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'while Statement',\n            },\n            {\n              label: 'for',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertText: [\n                'for(${1:int} ${2:i};${3},${4}) {',\n                '\\t$0',\n                '}'\n              ].join('\\n'),\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'for Statement',\n            },\n            {\n              label: 'switchcase',\n              kind: monaco.languages.CompletionItemKind.Keyword,\n              insertText: [\n                'switch(${1:value}) {',\n                '\\tcase ${2:condition}',\n                '\\t\\t$0',\n                'break;',\n                '}'\n              ].join('\\n'),\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'switch Statement',\n            },\n            {\n              label: 'ifelse',\n              kind: monaco.languages.CompletionItemKind.Snippet,\n              insertText: [\n                'if (${1:condition}) {',\n                '\\t$0',\n                '} else {',\n                '\\t',\n                '}'\n              ].join('\\n'),\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              documentation: 'If-Else Statement'\n            }]\n        };\n      }\n    });\n  }\n  /**\n   * Constructor for code editor\n   */\n  constructor() { }\n  /**\n   * On code Change update the code in arduino\n   */\n  codeChanged() {\n    this.arduinos[this.selectedIndex].code = this.code;\n  }\n  /**\n   * Select the code for respective arduino. Event handler for Choosing arduino\n   * @param item HTML Select Element\n   */\n  chooseArduino(item: HTMLSelectElement) {\n    this.selectedIndex = item.selectedIndex;\n    this.code = this.arduinos[this.selectedIndex].code;\n  }\n  /**\n   * Event handler for Choosing the programming language.\n   */\n  chooseLanguage(item: HTMLSelectElement) {\n    this.langIndex = item.selectedIndex;\n    window['progLang'] =  this.langIndex;\n  }\n  /**\n   * Toggle Libraries Box\n   */\n  openFolder() {\n    const folder = document.getElementById('lib');\n\n    if (folder.style.display === 'none') {\n      folder.style.display = 'flex';\n    } else {\n      folder.style.display = 'none';\n    }\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/common/SharedModule.module.ts",
    "content": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HeaderComponent } from '../header/header.component';\nimport { RouterModule } from '@angular/router';\nimport { MaterialModule } from './material.module';\n\n@NgModule({\n    imports: [\n        CommonModule,\n        RouterModule,\n        MaterialModule\n    ],\n    declarations: [\n        HeaderComponent\n    ],\n    exports: [\n        HeaderComponent\n    ]\n})\nexport class SharedModule { }\n"
  },
  {
    "path": "ArduinoFrontend/src/app/common/material.module.ts",
    "content": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatBottomSheetModule } from '@angular/material/bottom-sheet';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatStepperModule } from '@angular/material/stepper';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatGridListModule } from '@angular/material/grid-list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatNativeDateModule, MatRippleModule } from '@angular/material/core';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTreeModule } from '@angular/material/tree';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\n\nconst material = [\n  MatAutocompleteModule,\n  MatBadgeModule,\n  MatBottomSheetModule,\n  MatButtonModule,\n  MatButtonToggleModule,\n  MatCardModule,\n  MatCheckboxModule,\n  MatChipsModule,\n  MatStepperModule,\n  MatDatepickerModule,\n  MatDialogModule,\n  // MatDialogRef,\n  MatDividerModule,\n  MatFormFieldModule,\n\n  MatExpansionModule,\n  MatGridListModule,\n  MatIconModule,\n  MatInputModule,\n  MatListModule,\n  MatMenuModule,\n  MatNativeDateModule,\n  MatPaginatorModule,\n  MatProgressBarModule,\n  MatProgressSpinnerModule,\n  MatRadioModule,\n  MatRippleModule,\n  MatSelectModule,\n  MatSidenavModule,\n  MatSliderModule,\n  MatSlideToggleModule,\n  MatSnackBarModule,\n  MatSortModule,\n  MatTableModule,\n  MatTabsModule,\n  MatToolbarModule,\n  MatTooltipModule,\n  MatTreeModule,\n];\n@NgModule({\n  declarations: [],\n  imports: [\n    CommonModule,\n    material,\n    ScrollingModule,\n  ],\n  exports: [material],\n  providers: [{ provide: MatDialogRef, useValue: {} },\n  { provide: MAT_DIALOG_DATA, useValue: [] }]\n})\nexport class MaterialModule { }\n"
  },
  {
    "path": "ArduinoFrontend/src/app/componentlist/componentlist.component.css",
    "content": "button:focus {\n    outline: none !important;\n}\n\ntable,\ntd {\n    border: 1px solid #c5cfd9;\n}\n\ntable {\n    border-collapse: separate;\n    border-spacing: 0;\n    width: 100%;\n    border: 1px solid #ddd;\n    border-width: thin;\n    margin-top: 10px;\n    margin-bottom: 20px;\n}\n\nth,\ntd {\n    text-align: left;\n    padding: 10px;\n}\n\ntr:nth-child(even) {\n    background-color: #f2f2f2;\n}\n\nth {\n    background-color: lightgrey;\n    font-weight: lighter;\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/componentlist/componentlist.component.html",
    "content": "<h1 mat-dialog-title style=\"margin:10px\">Component List</h1>\n<mat-divider></mat-divider>\n<div style=\"overflow-x:auto;\">\n\n  <p *ngIf=\"noComponets\">No Component are Present</p>\n\n  <table class=\"table\" *ngIf=\"!noComponets\">\n    <thead>\n      <th>Name</th>\n      <th>Quantity</th>\n      <th>Info</th>\n    </thead>\n    <tbody class=\"bg-white\">\n      <tr *ngFor=\"let item of data | keyvalue\">\n        <td>{{ item.key }}</td>\n        <td>{{ item.value.cnt }}</td>\n        <td>\n          <button mat-icon-button (click)=\"OpenInfo(item.value.key)\">\n            <mat-icon>info</mat-icon>\n          </button>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n</div>\n<mat-divider></mat-divider>\n<mat-dialog-actions>\n  <button color=\"primary\" mat-button (click)=\"DownloadCSV()\">Download CSV</button>\n  <button color=\"primary\" mat-button mat-dialog-close mat-dialog-close=\"true\">OK</button>\n</mat-dialog-actions>\n"
  },
  {
    "path": "ArduinoFrontend/src/app/componentlist/componentlist.component.spec.ts",
    "content": "\n"
  },
  {
    "path": "ArduinoFrontend/src/app/componentlist/componentlist.component.ts",
    "content": "import { Component, OnInit } from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material';\nimport { ViewComponentInfoComponent } from '../view-component-info/view-component-info.component';\n/**\n * Declare window so that custom created function don't throw error\n */\ndeclare var window;\n\n/**\n * Class for Component list (Table) Dialog\n */\n@Component({\n  selector: 'app-componentlist',\n  templateUrl: './componentlist.component.html',\n  styleUrls: ['./componentlist.component.css']\n})\nexport class ComponentlistComponent implements OnInit {\n  /**\n   * Data that needs to shown as table\n   */\n  data: any = {};\n  /**\n   * if No comonents are in the workspace\n   */\n  noComponets = true;\n  /**\n   * Constructor for Component List\n   * @param dialog Material Dialog\n   * @param dialogRef Material Dialog Reference\n   */\n  constructor(private dialog: MatDialog, public dialogRef: MatDialogRef<ComponentlistComponent>) { }\n  /**\n   * On Init Component List Dialog\n   */\n  ngOnInit() {\n    // For each item in the scope\n    for (const key in window.scope) {\n      // Check item is present and item contains at least one quantity\n      if (window.scope[key] && window.scope[key].length > 0) {\n        // For each item get Component name and increment its count\n        for (const item of window.scope[key]) {\n          if (item.getName) {\n            const name = item.getName();\n            this.noComponets = false;\n            if (this.data[name] && this.data[name].cnt > 0) {\n              this.data[name].cnt += 1;\n            } else {\n              this.data[name] = {\n                cnt: 1,\n                key: item.keyName\n              };\n            }\n          }\n        }\n\n      }\n    }\n  }\n  /**\n   * Shoe Information of a Component\n   * @param key The Compoment Key\n   */\n  OpenInfo(key: string) {\n    window.Selected = window.scope[key][0];\n    // Show view Info Dialog\n    const dialogRef = this.dialog.open(ViewComponentInfoComponent, {\n      width: '500px'\n    });\n    dialogRef.afterClosed().subscribe(result => {\n      window.Selected = null;\n    });\n  }\n  /**\n   * Export CSV from table\n   * @param filename Filename of the downloaded CSV\n   * @param data Data inside the csv\n   */\n  exportCSV(filename: string, data: string) {\n    const blob = new Blob(['\\ufeff' + data], {\n      type: 'text/csv;charset=utf-8;'\n    });\n    // Download Logic\n    const a = document.createElement('a');\n    a.href = URL.createObjectURL(blob);\n    a.target = '_blank';\n    a.setAttribute('download', `${filename}.csv`);\n    a.style.visibility = 'hidden';\n    document.body.append(a);\n    a.click();\n    document.body.removeChild(a);\n  }\n  /**\n   * Download CSV Button event handler\n   */\n  DownloadCSV() {\n    // if no components are present show a toast message\n    if (this.noComponets) {\n      window.showToast('No Components On Workspace');\n      return;\n    }\n    // CSV heading\n    let csv = `S.No,Name,Quantity\\n`;\n    let sno = 1;\n    // Convert table to csv format\n    for (const key in this.data) {\n      if (this.data[key]) {\n        csv += `${sno},${key},${this.data[key].cnt}\\n`;\n        ++sno;\n      }\n    }\n    this.exportCSV('download', csv);\n    // Close the Export Dialog\n    this.dialogRef.close();\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/dashboard/dashboard-routing.module.ts",
    "content": "import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { GalleryComponent } from '../gallery/gallery.component';\nimport { MainPageComponent } from '../main-page/main-page.component';\nimport { DashboardComponent } from './dashboard.component';\nimport { SimulatorComponent } from '../simulator/simulator.component';\n\n\nconst routes: Routes = [\n    {\n        path: '',\n        component: DashboardComponent,\n        children: [\n            {\n                path: '',\n                component: MainPageComponent\n\n            },\n            {\n                path: 'gallery',\n                component: GalleryComponent\n            },\n            {\n                path: 'mainpage/:id',\n                component: MainPageComponent\n            },\n            {\n                path: 'simulator',\n                redirectTo: '/simulator',\n                pathMatch: 'full'\n            }\n\n        ]\n    },\n    {\n        path: 'dashboard/simulator',\n        redirectTo: '/simulator',\n        pathMatch: 'full'\n    }\n];\n\n@NgModule({\n    imports: [RouterModule.forChild(routes)],\n    exports: [RouterModule]\n})\nexport class DashboardRoutingModule { }\n"
  },
  {
    "path": "ArduinoFrontend/src/app/dashboard/dashboard.component.css",
    "content": "\n.example-container {\n  min-height: 876px;\n  border: 1px solid rgba(0, 0, 0, 0.12);\n}\n\n.no-search {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  margin-top: 1rem;\n}\n.maincontent {\n  display: flex;\n  justify-content: center;\n  flex-direction: column;\n  align-items: center;\n}\n.circuitBtn {\n  width: 296px;\n}\n\nmat-chip {\n  max-width: 200px;\n  padding: 9px;\n  border-radius: 14px;\n  padding: 11px;\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/dashboard/dashboard.component.html",
    "content": "<app-header title=\"Dashboard\"></app-header>\n\n<div id=\"main\">\n  <!-- <mat-toolbar color=\"primary\" class=\"example-toolbar\">\n    <button mat-icon-button (click)=\"isExpanded = !isExpanded\"><mat-icon>menu</mat-icon></button>\n    <h1 class=\"example-app-name\">Nested Menus</h1>\n  </mat-toolbar> -->\n\n  <mat-sidenav-container class=\"example-container\" autosize>\n    <app-side-panel></app-side-panel>\n\n    <div class=\"example-sidenav-content\">\n      <router-outlet></router-outlet>\n    </div>\n  </mat-sidenav-container>\n\n  <!-- <div class=\"row\">\n    <div class=\"col-sm-5\" *ngIf=\"token\">\n      <div class=\"role-container\">\n        <div *ngFor=\"let role of groupRole\" style=\"padding: 1rem;border-bottom: 1px solid black;\">\n          {{role}}\n        </div>\n      </div>\n    </div>\n    <div class=\"col-sm-3\">\n      <h3\n        style=\"font-weight: 900; font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;margin: 1em;\">\n        Arduino\n        Circuits</h3>\n      <a type=\"button\" class=\"btn btn-primary mb-3 m-2\" [routerLink]=\"['/simulator']\">+ New\n        Circuit</a>\n      <label for=\"importFileBTN\" mat-icon-button class=\"btn btn-primary mb-3 m-2\">Import Circuit</label>\n      <input id=\"importFileBTN\" value=\"Import Ciruit\" accept=\".json\" #importFile type=\"file\"\n        (change)=\"ImportCircuit($event)\" hidden /><br />\n      <form class=\"form-inline\" (submit)=\"SearchCircuits(searchBox)\">\n        <div style=\"flex:1 1 auto;\">\n          <input type=\"text\" #searchBox class=\"form-control\" id=\"Search\" placeholder=\"Search\">\n        </div>\n        <button type=\"submit\" class=\"btn btn-primary\"><i class=\"fa fa-search\"></i></button>\n      </form>\n    </div>\n    <div class=\"col-sm-3\">\n    </div>\n  </div> -->\n  <!-- <mat-tab-group style=\"width: 100%;display: flex;\">\n    <mat-tab label=\"On Cloud\">\n      <div *ngIf=\"online && online.length === 0\" style=\"margin: 1em;\" [innerHtml]=\"onCloudMessage\"></div>\n      <div class=\"row\" style=\"margin: 1em;\">\n        <div class=\"col-md-3\" *ngFor=\"let item of online; let i = index\">\n          <div class=\"subbox\" (click)=\"openProject(i)\">\n            <div>\n              <div style=\"width: 100%;  background-color: #e8e8e8;\">\n                <img class=\"item-img\" style=\"border-radius: 5px;\" src={{item.base64_image}} alt=\"\">\n              </div>\n              <div style=\"box-sizing: border-box; padding: 15px;\">\n                <h4>{{item.name}}</h4>\n                <p style=\"word-break: break-all;\">\n                  {{ item.description | slice:0:57 }}\n                  {{ (item.description && item.description.length) > 60?'...':'' }}\n                </p>\n                {{ DateDiff(item,item.save_time) }}\n                <p>{{item.time}}</p>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </mat-tab>\n    <mat-tab label=\"Temporary Circuits\">\n      <div *ngIf=\"items.length == 0\" style=\"margin: 1em;\">No Offline Circuits Available &#9785;</div>\n      <div class=\"row\" style=\"margin: 1em;\">\n        <div class=\"col-md-3\" *ngFor=\"let item of items; let i = index\">\n          <div class=\"subbox\" (click)=\"openProject(i,true)\">\n            <div>\n              <div style=\"width: 100%;  background-color: #e8e8e8;\">\n                <img class=\"item-img\" style=\"border-radius: 5px;\" src={{item.base64_image}} alt=\"\">\n              </div>\n              <div style=\"box-sizing: border-box; padding: 15px;\">\n                <h4>{{item.name}}</h4>\n                <p>{{item.description}}</p>\n                {{ DateDiff(item,item.save_time) }}\n                <p>{{item.time}}</p>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </mat-tab>\n  </mat-tab-group> -->\n\n</div>\n\n"
  },
  {
    "path": "ArduinoFrontend/src/app/dashboard/dashboard.component.spec.ts",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/dashboard/dashboard.component.ts",
    "content": "import { Component, OnInit, Input, ViewChild } from '@angular/core';\n\n@Component({\n  selector: 'app-dashboard',\n  templateUrl: './dashboard.component.html',\n  styleUrls: ['./dashboard.component.css']\n})\nexport class DashboardComponent implements OnInit {\n\n  ngOnInit() {\n\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/dashboard/dashboard.module.ts",
    "content": "import { CommonModule, HashLocationStrategy, LocationStrategy } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FilterPipeModule } from 'ngx-filter-pipe';\nimport { MaterialModule } from '../common/material.module';\nimport { SharedModule } from '../common/SharedModule.module';\nimport { GalleryComponent } from '../gallery/gallery.component';\nimport { MainPageComponent } from '../main-page/main-page.component';\nimport { SidePanelComponent } from '../side-panel/side-panel.component';\nimport { DashboardRoutingModule } from './dashboard-routing.module';\nimport { DashboardComponent } from './dashboard.component';\n\n@NgModule({\n    declarations: [\n        DashboardComponent,\n        GalleryComponent,\n        MainPageComponent,\n        SidePanelComponent,\n    ],\n    imports: [\n        CommonModule,\n        FormsModule,\n        ReactiveFormsModule,\n        MaterialModule,\n        SharedModule,\n        HttpClientModule,\n        FilterPipeModule,\n        DashboardRoutingModule,\n    ],\n\n    exports: []\n})\n\nexport class DashboardModule { }\n"
  },
  {
    "path": "ArduinoFrontend/src/app/exit-confirm-dialog/exit-confirm-dialog.component.css",
    "content": ".action-div{\n    display: flex;\n    justify-content: space-around;\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/exit-confirm-dialog/exit-confirm-dialog.component.html",
    "content": "<h2 mat-dialog-title>Do you want to exit?</h2>\n<div mat-dialog-actions class=\"action-div\">\n  <button mat-raised-button color=\"warn\" (click)=\"yesClick()\">Yes</button>\n  <button mat-raised-button color=\"primary\" mat-dialog-close>No</button>\n</div>\n"
  },
  {
    "path": "ArduinoFrontend/src/app/exit-confirm-dialog/exit-confirm-dialog.component.spec.ts",
    "content": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\nimport { MatDialogModule, MatDialogRef } from '@angular/material';\n\nimport { ExitConfirmDialogComponent } from './exit-confirm-dialog.component';\n\ndescribe('ExitConfirmDialogComponent', () => {\n  let component: ExitConfirmDialogComponent;\n  let fixture: ComponentFixture<ExitConfirmDialogComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({\n      imports: [MatDialogModule],\n      declarations: [ExitConfirmDialogComponent],\n      providers: [\n        { provide: MatDialogRef, useValue: {} },\n      ]\n    })\n      .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(ExitConfirmDialogComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "ArduinoFrontend/src/app/exit-confirm-dialog/exit-confirm-dialog.component.ts",
    "content": "import { Component, OnInit } from '@angular/core';\nimport { MatDialogRef } from '@angular/material';\n\n@Component({\n  selector: 'app-exit-confirm-dialog',\n  templateUrl: './exit-confirm-dialog.component.html',\n  styleUrls: ['./exit-confirm-dialog.component.css']\n})\nexport class ExitConfirmDialogComponent implements OnInit {\n\n  constructor(public dialogRef: MatDialogRef<ExitConfirmDialogComponent>) { }\n\n  ngOnInit() {\n  }\n\n  // Function to handle if user want to exit\n  yesClick() {\n    this.dialogRef.close(true);\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/export-jsondialog/export-jsondialog.component.css",
    "content": ".full-width{\n    width: 100%;\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/export-jsondialog/export-jsondialog.component.html",
    "content": "<div mat-dialog-title>\n  Enter the name of File to be Saved\n</div>\n<mat-dialog-content>\n  <br>\n  <mat-form-field class=\"full-width\">\n    <mat-label>File Name</mat-label>\n    <input matInput [(ngModel)]=\"fileName\">\n  </mat-form-field>\n\n</mat-dialog-content>\n<mat-dialog-actions>\n\n  <button mat-raised-button (click)=\"saveProject()\" color=\"primary\">Download Project</button>\n  <button mat-raised-button mat-dialog-close color=\"warn\">Close</button>\n\n</mat-dialog-actions>\n"
  },
  {
    "path": "ArduinoFrontend/src/app/export-jsondialog/export-jsondialog.component.spec.ts",
    "content": "import { TestBed, async, ComponentFixture } from '@angular/core/testing';\nimport { FormsModule } from '@angular/forms';\nimport { MatDialogModule, MatDialogRef, MatFormFieldModule, MAT_DIALOG_DATA } from '@angular/material';\nimport { RouterTestingModule } from '@angular/router/testing';\nimport { Workspace } from '../Libs/Workspace';\nimport { ExportJSONDialogComponent } from './export-jsondialog.component';\n\n\n// class MockWorkspace extends Workspace {\n//     SaveJson() {\n//         return true;\n//     }\n// }\n\ndescribe('ExportJSONDialogComponent', () => {\n\n    let component: ExportJSONDialogComponent;\n    let fixture: ComponentFixture<ExportJSONDialogComponent>;\n\n    beforeEach(async () => {\n        TestBed.configureTestingModule({\n            imports: [\n                RouterTestingModule,\n                MatFormFieldModule,\n                FormsModule,\n                MatDialogModule,\n            ],\n            declarations: [\n                ExportJSONDialogComponent\n            ],\n            providers: [\n                { provide: MatDialogRef, useValue: {} },\n                { provide: Workspace, useValue: {} },\n                { provide: MAT_DIALOG_DATA, useValue: { description: 'this is a desc', title: 'title' } },\n            ]\n        }).compileComponents();\n    });\n\n    beforeEach(() => {\n        fixture = TestBed.createComponent(ExportJSONDialogComponent);\n        component = fixture.componentInstance;\n    });\n\n    it('should create the app', () => {\n        expect(component).toBeTruthy();\n    });\n\n    it('Value of fileName variable should be given string', () => {\n        expect(component.fileName).toBe('title');\n    });\n\n    it('Value of Description variable should be given string', () => {\n        expect(component.description).toBe('this is a desc');\n    });\n\n    it('should return truthy as workspace is empty', () => {\n        expect(Workspace.checkIfWorkspaceEmpty()).toBeTruthy();\n    });\n\n    it('should return falsey as workspace is not empty', () => {\n        component.ngOnInit();\n        window['scope'] = {\n            id: 1620892078891,\n            canvas: { x: 0, y: 0, scale: 1 },\n            project: {\n                name: 'Untitled',\n                description: '',\n                created_at: 1620892078891\n            },\n            Resistor: [{ x: 483, y: 209, tx: 68, ty: 100, id: 1620892071196, data: { value: 1000, tolerance: 10 } }]\n        };\n        expect(Workspace.checkIfWorkspaceEmpty()).toBeFalsy();\n    });\n\n    it('should return truthy after downloading json file', () => {\n        expect(Workspace.SaveJson()).toBeTruthy();\n    });\n});\n"
  },
  {
    "path": "ArduinoFrontend/src/app/export-jsondialog/export-jsondialog.component.ts",
    "content": "import { Component, Inject, OnInit } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';\nimport { Workspace } from '../Libs/Workspace';\n\n@Component({\n  selector: 'app-export-jsondialog',\n  templateUrl: './export-jsondialog.component.html',\n  styleUrls: ['./export-jsondialog.component.css']\n})\nexport class ExportJSONDialogComponent implements OnInit {\n\n  description: string;\n  fileName = '';\n\n  constructor(\n    public dialogRef: MatDialogRef<ExportJSONDialogComponent>,\n    @Inject(MAT_DIALOG_DATA) public data) {\n    this.description = data.description;\n    this.fileName = data.title;\n  }\n\n  ngOnInit() {\n  }\n\n  /**\n   * Save Project function, Calls Workspace.SaveJson with edited fileName and then closes project\n   */\n  saveProject() {\n    Workspace.SaveJson(this.fileName, this.description);\n    this.dialogRef.close();\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/exportfile/exportfile.component.css",
    "content": ".radio-group{\n    display: flex;\n    flex-direction: column;\n    margin-top: 5px;\n    margin-bottom: 55px; \n    height: 100px;\n\n}\n.radio-button{\n    margin-bottom: 0px;\n}"
  },
  {
    "path": "ArduinoFrontend/src/app/exportfile/exportfile.component.html",
    "content": "<h1 mat-dialog-title style=\"margin:2px\">Export as</h1>\n<mat-divider></mat-divider>\n<mat-radio-group class=\"radio-group\" aria-labelledby=\"radio-group\">\n  <!-- <mat-radio-button class=\"radio-button\" value=\"Schematic\">Schematic File</mat-radio-button> -->\n  <mat-radio-button class=\"radio-button\" value=\"SVG\" #svg>SVG</mat-radio-button>\n  <mat-radio-button class=\"radio-button\" value=\"png\" #png>PNG</mat-radio-button>\n  <mat-radio-button class=\"radio-button\" value=\"jpeg\" #jpg>JPEG</mat-radio-button>\n</mat-radio-group>\n<mat-divider></mat-divider>\n<mat-dialog-actions>\n  <button color=\"primary\" mat-button mat-dialog-close mat-dialog-close=\"true\" style=\"margin-left: auto;\">Cancel</button>\n  <button color=\"primary\" mat-button (click)=\"Export(svg,png,jpg)\">OK</button>\n</mat-dialog-actions>\n"
  },
  {
    "path": "ArduinoFrontend/src/app/exportfile/exportfile.component.spec.ts",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/exportfile/exportfile.component.ts",
    "content": "import { Component, OnInit } from '@angular/core';\nimport { Download, ImageType } from '../Libs/Download';\nimport { Title } from '@angular/platform-browser';\nimport { MatDialogRef } from '@angular/material';\n\n/**\n * Declare window so that custom created function don't throw error\n */\ndeclare var window;\n\n/**\n * Class For Export Dialog Component\n */\n@Component({\n  selector: 'app-exportfile',\n  templateUrl: './exportfile.component.html',\n  styleUrls: ['./exportfile.component.css']\n})\nexport class ExportfileComponent {\n  /**\n   * Constructor For Export Dialog\n   * @param title Project Title\n   * @param dialog Material Dialog Reference\n   */\n  constructor(private title: Title, private dialog: MatDialogRef<ExportfileComponent>) { }\n  /**\n   * Export Workspace to image\n   * @param svg SVG Radio element\n   * @param png PNG Radio element\n   * @param jpg JPG Radio element\n   */\n  Export(svg, png, jpg) {\n    // Show Loading animation\n    window.showLoading();\n    if (svg.checked) {\n      Download.ExportImage(ImageType.SVG)\n        .then(v => {\n          Download.DownloadText(this.title.getTitle() + '.svg', [v], {\n            type: 'data:image/svg+xml;charset=utf-8;'\n          });\n          window.hideLoading();\n        });\n    } else if (png.checked) {\n      Download.ExportImage(ImageType.PNG)\n        .then(v => {\n          Download.DownloadImage(v, this.title.getTitle(), ImageType.PNG);\n          window.hideLoading();\n        });\n    } else if (jpg.checked) {\n      Download.ExportImage(ImageType.JPG)\n        .then(v => {\n          Download.DownloadImage(v, this.title.getTitle(), ImageType.JPG);\n          window.hideLoading();\n        });\n    } else {\n      // Hide loading animation\n      window.hideLoading();\n    }\n    // Close Dialog\n    this.dialog.close();\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/front-page/front-page.component.css",
    "content": "#titlepage {\n    background-color: white;\n    position: relative;\n    color: black;\n    top: 80px;\n    width: 80%;\n    min-height: 58vh;\n    margin-left: 10%;\n    border-radius: 5px;\n    box-sizing: border-box;\n    justify-content: space-around;\n}\n\n.button {\n    --border-size: 2px;\n    margin-left: 5px;\n    padding: 1.5em 3em;\n    appearance: none;\n    border: 0;\n    background: transparent;\n    color: blue;\n    text-transform: uppercase;\n    letter-spacing: .25em;\n    outline: none;\n    cursor: pointer;\n    font-weight: bold;\n    border-radius: 0;\n    box-shadow: inset 0 0 0 var(--border-size) currentcolor;\n}\n\n.button:hover{\n  color: white;\n  background: blue;\n}\n\n@media screen and (max-width: 846px) {\n    #titlepage {\n        width: 100%;\n    }\n    #demo {\n        top: 10px;\n    }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/front-page/front-page.component.html",
    "content": "<app-header title=\"Arduino on Cloud\" color=\"cornflowerblue\" front=\"true\"></app-header>\n\n\n<div style=\"min-height: 90vh;display: flex;\">\n  <div class=\"row\" style=\"margin: auto auto; width: 100%;\">\n    <div class=\"col-md-6\">\n      <div style=\"margin: 10%;\">\n        <h1 style=\"margin: 10% auto\">Design Your circuits with Arduino On Cloud!</h1>\n        <button class=\"button\" [routerLink]=\"['/simulator']\">\n          Launch editor\n        </button>\n      </div>\n    </div>\n    <div class=\"col-md-6\" style=\"max-width: 100vw;\">\n      <div>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\"\n          viewBox=\"0 0 1169 650\" enable-background=\"new 0 0 1169 650\" xml:space=\"preserve\">\n          <g transform=\"translate(50,0)\">\n            <image x=\"670\" y=\"291\" width=\"495\" height=\"330\" preserveAspectRatio=\"none\"\n              xlink:href=\"assets/images/components/Breadboard.svg\" transform=\"matrix(1,0,0,1,-42,-84)\" />\n            <rect x=\"384\" y=\"382\" width=\"76\" height=\"113\" rx=\"3\" ry=\"3\" fill=\"#252626\"\n              transform=\"matrix(1,0,0,1,302,-54)\" />\n            <circle cx=\"446\" cy=\"473\" r=\"4\" fill=\"#b2b2b2\" transform=\"matrix(1,0,0,1,302,-54)\" />\n            <circle cx=\"391\" cy=\"393\" r=\"2\" fill=\"#505355\" transform=\"matrix(1,0,0,1,302,-54)\" />\n            <circle cx=\"406\" cy=\"393\" r=\"2\" fill=\"#505355\" transform=\"matrix(1,0,0,1,302,-54)\" />\n            <circle cx=\"421\" cy=\"393\" r=\"2\" fill=\"#505355\" transform=\"matrix(1,0,0,1,302,-54)\" />\n            <circle cx=\"436\" cy=\"393\" r=\"2\" fill=\"#505355\" transform=\"matrix(1,0,0,1,302,-54)\" />\n            <circle cx=\"452\" cy=\"393\" r=\"2\" fill=\"#505355\" transform=\"matrix(1,0,0,1,302,-54)\" />\n            <circle cx=\"391\" cy=\"484\" r=\"2\" fill=\"#505355\" transform=\"matrix(1,0,0,1,302,-54)\" />\n            <circle cx=\"406\" cy=\"484\" r=\"2\" fill=\"#505355\" transform=\"matrix(1,0,0,1,302,-54)\" />\n            <circle cx=\"421\" cy=\"484\" r=\"2\" fill=\"#505355\" transform=\"matrix(1,0,0,1,302,-54)\" />\n            <circle cx=\"436\" cy=\"484\" r=\"2\" fill=\"#505355\" transform=\"matrix(1,0,0,1,302,-54)\" />\n            <circle cx=\"452\" cy=\"484\" r=\"2\" fill=\"#505355\" transform=\"matrix(1,0,0,1,302,-54)\" />\n\n            <path class=\"f\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M710.1,350.6C710.1,350.6,706.9,353.3,706.9,353.3C706.9,353.3,702.3,379.7,702.3,379.7C702.3,379.7,705.3,383.3,705.3,383.3C705.3,383.3,709.8,379.5,709.8,379.5C709.8,379.5,714.1,355.3,714.1,355.3C714.1,355.3,710.1,350.6,710.1,350.6\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"2\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"f\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M710.1,350.6C710.1,350.6,706.9,353.3,706.9,353.3C706.9,353.3,702.3,379.7,702.3,379.7C702.3,379.7,705.3,383.3,705.3,383.3C705.3,383.3,709.8,379.5,709.8,379.5C709.8,379.5,714.1,355.3,714.1,355.3C714.1,355.3,710.1,350.6,710.1,350.6\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"4\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"f\" fill=\"#b2b2b2\" d=\"M408.1,404.6L404.9,407.3L400.3,433.7L403.3,437.3L407.8,433.5L412.1,409.3Z\"\n              transform=\"matrix(1,0,0,1,302,-54)\" />\n            <path class=\"g\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M738.2,380.9C738.2,380.9,711,380.9,711,380.9C711,380.9,706.4,384.7,706.4,384.7C706.4,384.7,709.4,388.3,709.4,388.3C709.4,388.3,737.1,388.3,737.1,388.3C737.1,388.3,741.4,384.7,741.4,384.7C741.4,384.7,738.2,380.9,738.2,380.9\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"2\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"g\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M738.2,380.9C738.2,380.9,711,380.9,711,380.9C711,380.9,706.4,384.7,706.4,384.7C706.4,384.7,709.4,388.3,709.4,388.3C709.4,388.3,737.1,388.3,737.1,388.3C737.1,388.3,741.4,384.7,741.4,384.7C741.4,384.7,738.2,380.9,738.2,380.9\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"4\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"g\" fill=\"#b2b2b2\" d=\"M436.2,434.9L409,434.9L404.4,438.7L407.4,442.3L435.1,442.3L439.4,438.7Z\"\n              transform=\"matrix(1,0,0,1,302,-54)\" />\n\n            <path class=\"e\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M705,385.9C705,385.9,700.5,389.6,700.5,389.6C700.5,389.6,696,415.1,696,415.1C696,415.1,696,415.1,696,415.1C696,415.1,695.9,415.7,695.9,415.7C695.9,415.7,698.5,418.9,698.5,418.9C698.5,418.9,703.6,414.6,703.6,414.6C703.6,414.6,708,389.5,708,389.5C708,389.5,705,385.9,705,385.9\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"2\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n\n            <path class=\"e\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M705,385.9C705,385.9,700.5,389.6,700.5,389.6C700.5,389.6,696,415.1,696,415.1C696,415.1,696,415.1,696,415.1C696,415.1,695.9,415.7,695.9,415.7C695.9,415.7,698.5,418.9,698.5,418.9C698.5,418.9,703.6,414.6,703.6,414.6C703.6,414.6,708,389.5,708,389.5C708,389.5,705,385.9,705,385.9\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"4\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"e\" fill=\"#b2b2b2\"\n              d=\"M403,439.9L398.5,443.6L394,469.1L394,469.1L393.9,469.7L396.5,472.9L401.6,468.6L406,443.5Z\"\n              transform=\"matrix(1,0,0,1,302,-54)\" />\n            <path class=\"d\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M733.6,422.5C733.6,422.5,736.4,420.1,736.4,420.1C736.4,420.1,732.2,415.1,732.2,415.1C732.2,415.1,705.9,415.1,705.9,415.1C705.9,415.1,699.7,420.3,699.7,420.3C699.7,420.3,701.5,422.5,701.5,422.5C701.5,422.5,733.6,422.5,733.6,422.5\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"2\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"d\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M733.6,422.5C733.6,422.5,736.4,420.1,736.4,420.1C736.4,420.1,732.2,415.1,732.2,415.1C732.2,415.1,705.9,415.1,705.9,415.1C705.9,415.1,699.7,420.3,699.7,420.3C699.7,420.3,701.5,422.5,701.5,422.5C701.5,422.5,733.6,422.5,733.6,422.5\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"4\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"d\" fill=\"#b2b2b2\" d=\"M431.6,476.5L434.4,474.1L430.2,469.1L403.9,469.1L397.7,474.3L399.5,476.5Z\"\n              transform=\"matrix(1,0,0,1,302,-54)\" />\n            <path class=\"c\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M740.2,417C740.2,417,745.1,389.2,745.1,389.2C745.1,389.2,742.6,386.1,742.6,386.1C742.6,386.1,737.4,390.5,737.4,390.5C737.4,390.5,733.3,413.5,733.3,413.5C733.3,413.5,737.9,419,737.9,419C737.9,419,740.2,417,740.2,417\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"2\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"c\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M740.2,417C740.2,417,745.1,389.2,745.1,389.2C745.1,389.2,742.6,386.1,742.6,386.1C742.6,386.1,737.4,390.5,737.4,390.5C737.4,390.5,733.3,413.5,733.3,413.5C733.3,413.5,737.9,419,737.9,419C737.9,419,740.2,417,740.2,417\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"4\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"c\" fill=\"#b2b2b2\" d=\"M438.2,471L443.1,443.2L440.6,440.1L435.4,444.5L431.3,467.5L435.9,473Z\"\n              transform=\"matrix(1,0,0,1,302,-54)\" />\n            <path class=\"b\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M746.7,380.4C746.7,380.4,751.7,352,751.7,352C751.7,352,750.5,350.6,750.5,350.6C750.5,350.6,743.4,356.5,743.4,356.5C743.4,356.5,739.4,379.4,739.4,379.4C739.4,379.4,742.8,383.5,742.8,383.5C742.8,383.5,746.7,380.4,746.7,380.4\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"2\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"b\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M746.7,380.4C746.7,380.4,751.7,352,751.7,352C751.7,352,750.5,350.6,750.5,350.6C750.5,350.6,743.4,356.5,743.4,356.5C743.4,356.5,739.4,379.4,739.4,379.4C739.4,379.4,742.8,383.5,742.8,383.5C742.8,383.5,746.7,380.4,746.7,380.4\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"4\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"b\" fill=\"#b2b2b2\" d=\"M444.7,434.4L449.7,406L448.5,404.6L441.4,410.5L437.4,433.4L440.8,437.5Z\"\n              transform=\"matrix(1,0,0,1,302,-54)\" />\n            <path class=\"a\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M714.6,346.9C714.6,346.9,711.6,349.4,711.6,349.4C711.6,349.4,715.6,354.3,715.6,354.3C715.6,354.3,743.2,354.3,743.2,354.3C743.2,354.3,749.3,349.2,749.3,349.2C749.3,349.2,747.4,346.9,747.4,346.9C747.4,346.9,714.6,346.9,714.6,346.9\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"2\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"a\" fill=\"none\" stroke=\"#ffa500\"\n              d=\"M714.6,346.9C714.6,346.9,711.6,349.4,711.6,349.4C711.6,349.4,715.6,354.3,715.6,354.3C715.6,354.3,743.2,354.3,743.2,354.3C743.2,354.3,749.3,349.2,749.3,349.2C749.3,349.2,747.4,346.9,747.4,346.9C747.4,346.9,714.6,346.9,714.6,346.9\"\n              stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke-width=\"4\" opacity=\"0\"\n              transform=\"matrix(1,0,0,1,0,0)\" style=\" stroke-linejoin: round; stroke-linecap: round; opacity: 0;\" />\n            <path class=\"a\" fill=\"#b2b2b2\" d=\"M412.6,400.9L409.6,403.4L413.6,408.3L441.2,408.3L447.3,403.2L445.4,400.9Z\"\n              transform=\"matrix(1,0,0,1,302,-54)\" />\n            <image x=\"317\" y=\"315\" width=\"456\" height=\"334\" preserveAspectRatio=\"none\"\n              xlink:href=\"assets/images/components/ArduinoUno.svg\" transform=\"matrix(1,0,0,1,-258,-137)\" />\n            <rect x=\"519\" y=\"396\" width=\"13\" height=\"7\" rx=\"0\" ry=\"0\" fill=\"#ffff00\" fill-opacity=\"0.38297873\"\n              transform=\"matrix(1,0,0,1,-258,-137)\" />\n            <rect x=\"697\" y=\"423\" width=\"13\" height=\"7\" rx=\"0\" ry=\"0\" fill=\"#00ff00\" fill-opacity=\"0.38297873\"\n              transform=\"matrix(1,0,0,1,-258,-137)\" />\n            <circle cx=\"355\" cy=\"518\" r=\"6\" fill=\"#000000\" stroke=\"#000000\" style=\" display: none;\" />\n            <path fill=\"none\" stroke=\"#000000\" d=\"M355,482L355,518L647,514\" stroke-linecap=\"round\"\n              stroke-linejoin=\"round\" stroke-width=\"4\" style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <path fill=\"none\" stroke=\"#000000\" d=\"M738,430L737,428.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n              stroke-width=\"4\" style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <path fill=\"none\" stroke=\"#000000\" d=\"M723,430L722,428.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n              stroke-width=\"4\" style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <path fill=\"none\" stroke=\"#000000\" d=\"M693,430L692,428.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n              stroke-width=\"4\" style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <path fill=\"none\" stroke=\"#000000\" d=\"M708,430L707,428.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n              stroke-width=\"4\" style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <path fill=\"none\" stroke=\"#000000\" d=\"M693,339L692,338.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n              stroke-width=\"4\" style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <path fill=\"none\" stroke=\"#000000\" d=\"M708,339L707,338.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n              stroke-width=\"4\" style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <path fill=\"none\" stroke=\"#000000\" d=\"M723,339L722,338.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n              stroke-width=\"4\" style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <path fill=\"none\" stroke=\"#000000\" d=\"M738,339L737,338.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n              stroke-width=\"4\" style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <path fill=\"none\" stroke=\"#000000\" d=\"M754,339L752,338.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n              stroke-width=\"4\" style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <circle cx=\"692.7500610351562\" cy=\"174.25001525878906\" r=\"6\" fill=\"#ff0000\" stroke=\"#ff0000\"\n              style=\" display: none;\" />\n            <circle cx=\"441.5000305175781\" cy=\"172.50001525878906\" r=\"6\" fill=\"#ff0000\" stroke=\"#ff0000\"\n              style=\" display: none;\" />\n            <path fill=\"none\" stroke=\"#ff0000\"\n              d=\"M692,278.5L692.7500610351562,174.25001525878906L441.5000305175781,172.50001525878906L441,208\"\n              stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\"\n              style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <circle cx=\"429.0000305175781\" cy=\"143.75001525878906\" r=\"6\" fill=\"#31c404\" stroke=\"#31c404\"\n              style=\" display: none;\" />\n            <circle cx=\"708.5000610351562\" cy=\"143.75001525878906\" r=\"6\" fill=\"#31c404\" stroke=\"#31c404\"\n              style=\" display: none;\" />\n            <path fill=\"none\" stroke=\"#31c404\"\n              d=\"M427,208L429.0000305175781,143.75001525878906L708.5000610351562,143.75001525878906L707,278.5\"\n              stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\"\n              style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <circle cx=\"416.5000305175781\" cy=\"111.25000762939453\" r=\"6\" fill=\"#2593fa\" stroke=\"#2593fa\"\n              style=\" display: none;\" />\n            <circle cx=\"736.0000610351562\" cy=\"113.25000762939453\" r=\"6\" fill=\"#2593fa\" stroke=\"#2593fa\"\n              style=\" display: none;\" />\n            <path fill=\"none\" stroke=\"#2593fa\"\n              d=\"M413,208L416.5000305175781,111.25000762939453L736.0000610351562,113.25000762939453L737,278.5\"\n              stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\"\n              style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <circle cx=\"751.2500610351562\" cy=\"76.75000762939453\" r=\"6\" fill=\"#31c404\" stroke=\"#31c404\"\n              style=\" display: none;\" />\n            <circle cx=\"402.5000305175781\" cy=\"71.00000762939453\" r=\"6\" fill=\"#31c404\" stroke=\"#31c404\"\n              style=\" display: none;\" />\n            <path fill=\"none\" stroke=\"#31c404\"\n              d=\"M752,278.5L751.2500610351562,76.75000762939453L402.5000305175781,71.00000762939453L399,208\"\n              stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\"\n              style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <path fill=\"none\" stroke=\"#2593fa\" d=\"M737,443.5L812,443.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n              stroke-width=\"4\" style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <circle cx=\"383.5000305175781\" cy=\"48.500003814697266\" r=\"6\" fill=\"#2593fa\" stroke=\"#2593fa\"\n              style=\" display: none;\" />\n            <circle cx=\"807.0000610351562\" cy=\"48.500003814697266\" r=\"6\" fill=\"#2593fa\" stroke=\"#2593fa\"\n              style=\" display: none;\" />\n            <path fill=\"none\" stroke=\"#2593fa\"\n              d=\"M385,208L383.5000305175781,48.500003814697266L807.0000610351562,48.500003814697266L812,278.5\"\n              stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\"\n              style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <circle cx=\"707.7500610351562\" cy=\"632.0000610351562\" r=\"6\" fill=\"#ff0000\" stroke=\"#ff0000\"\n              style=\" display: none;\" />\n            <circle cx=\"-43.49999237060547\" cy=\"643.2500610351562\" r=\"6\" fill=\"#ff0000\" stroke=\"#ff0000\"\n              style=\" display: none;\" />\n            <circle cx=\"-45.99999237060547\" cy=\"15.750003814697266\" r=\"6\" fill=\"#ff0000\" stroke=\"#ff0000\"\n              style=\" display: none;\" />\n            <circle cx=\"367.7500305175781\" cy=\"18.500003814697266\" r=\"6\" fill=\"#ff0000\" stroke=\"#ff0000\"\n              style=\" display: none;\" />\n            <path fill=\"none\" stroke=\"#ff0000\"\n              d=\"M707,458.5L707.7500610351562,632.0000610351562L-43.49999237060547,643.2500610351562L-45.99999237060547,15.750003814697266L367.7500305175781,18.500003814697266L371,208\"\n              stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\"\n              style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <circle cx=\"690.7500610351562\" cy=\"604.0000610351562\" r=\"6\" fill=\"#31c404\" stroke=\"#31c404\"\n              style=\" display: none;\" />\n            <circle cx=\"35.2500114440918\" cy=\"607.0000610351562\" r=\"6\" fill=\"#31c404\" stroke=\"#31c404\"\n              style=\" display: none;\" />\n            <circle cx=\"33.0000114440918\" cy=\"60.75000762939453\" r=\"6\" fill=\"#31c404\" stroke=\"#31c404\"\n              style=\" display: none;\" />\n            <circle cx=\"346.2500305175781\" cy=\"59.50000762939453\" r=\"6\" fill=\"#31c404\" stroke=\"#31c404\"\n              style=\" display: none;\" />\n            <path fill=\"none\" stroke=\"#31c404\"\n              d=\"M692,458.5L690.7500610351562,604.0000610351562L35.2500114440918,607.0000610351562L33.0000114440918,60.75000762939453L346.2500305175781,59.50000762939453L347,208\"\n              stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\"\n              style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n            <path fill=\"none\" stroke=\"#000000\" d=\"M722,458.5L740,514\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n              stroke-width=\"4\" style=\" stroke-linecap: round; stroke-linejoin: round;\" />\n          </g>\n        </svg>\n      </div>\n    </div>\n\n  </div>\n</div>\n"
  },
  {
    "path": "ArduinoFrontend/src/app/front-page/front-page.component.spec.ts",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/front-page/front-page.component.ts",
    "content": "import { Component, OnInit } from '@angular/core';\n\n/**\n * Class For Front page contains Seven Segment animation logic\n */\n@Component({\n  selector: 'app-front-page',\n  templateUrl: './front-page.component.html',\n  styleUrls: ['./front-page.component.css']\n})\nexport class FrontPageComponent implements OnInit {\n  /**\n   * Mapping For Seven Segment animation\n   */\n  readonly mapping = [\n    ['a', 'b', 'c', 'd', 'e', 'f'], // 0\n    ['b', 'c'], // 1\n    ['a', 'b', 'g', 'e', 'd'], // 2\n    ['a', 'b', 'g', 'c', 'd'], // 3\n    ['f', 'g', 'b', 'c'], // 4\n    ['a', 'f', 'g', 'c', 'd'], // 5\n    ['a', 'f', 'g', 'c', 'e', 'd'], // 6\n    ['a', 'b', 'c'], // 7\n    ['a', 'b', 'c', 'd', 'e', 'f', 'g'], // 8\n    ['a', 'b', 'f', 'g', 'c', 'd'], // 9\n    ['a', 'b', 'c', 'e', 'f', 'g'], // A\n    ['f', 'g', 'c', 'e', 'd'], // b\n    ['a', 'd', 'e', 'f'], // c\n    ['b', 'c', 'd', 'e', 'g'], // d\n    ['a', 'd', 'e', 'f', 'g'], // E\n    ['a', 'e', 'f', 'g'], // F\n    [] // all off\n  ];\n  /**\n   * Current Digit\n   */\n  digit = 0;\n  /**\n   * Constructor For Front page\n   */\n  constructor() { }\n  /**\n   * On Init Front page\n   */\n  ngOnInit() {\n    // Set animation Interval\n    setInterval(() => {\n      // TODO: For optimization glow only those bars which are changed\n      // Stop Glow in every bar of seven segment\n      for (const className of this.mapping[8]) {\n        const els = document.getElementsByClassName(className) as any;\n        if (els.length < 3) { continue; }\n        els[0].style.opacity = '0';\n        els[1].style.opacity = '0';\n        els[2].setAttribute('fill', '#b2b2b2');\n      }\n      // From mapping glow only required bar\n      for (const ClassName of this.mapping[this.digit]) {\n        const els = document.getElementsByClassName(ClassName) as any;\n        if (els.length < 3) { continue; }\n        els[0].style.opacity = '0.333';\n        els[1].style.opacity = '0.333';\n        els[2].setAttribute('fill', '#ffa500');\n      }\n      // Increment the Digit\n      ++this.digit;\n      // If digit is big reset the digit\n      if (this.digit >= 17) {\n        this.digit -= 17;\n      }\n    }, 1000);\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/gallery/gallery.component.css",
    "content": ".subbox {\n    box-sizing: border-box;\n    width: 95%;\n    height: auto;\n    background-color: white;\n    border-radius: 0.3125em;\n    margin-bottom: 15px;\n    box-shadow: 1px 1px 3px grey;\n    cursor: pointer;\n    margin-left: 2%;\n    justify-content: space-evenly;\n}\n\n.item-img {\n    min-height: 180px;\n    max-width: 100%;\n    max-height: 180px;\n}\n\n.subbox:hover {\n    box-shadow: 2px 2px 9px grey;\n}\n.footer{\n    display: flex;\n    justify-content: space-between;\n}"
  },
  {
    "path": "ArduinoFrontend/src/app/gallery/gallery.component.html",
    "content": "<!-- <app-header title=\"Gallery\"></app-header> -->\n<mat-sidenav-container class=\"example-container\" autosize>\n  <app-side-panel></app-side-panel>\n  <!--close header-->\n  <div id=\"main\" style=\"margin-left: 240px;\">\n    <!-- <h5 style=\"margin:1em;font-family: monospace;font-weight: 900;font-size: 30px\">Gallery</h5> -->\n    <mat-tab-group style=\"width: 100%;display: flex;\">\n      <mat-tab label=\"Experiments\">\n        <p *ngIf=\"samples.length === 0\">No Experiments Available</p>\n        <div class=\"row\" style=\"margin: 1em;\">\n          <div class=\"col-md-3\" *ngFor=\"let item of samples; let i = index\">\n            {{ DateTime(item) }}\n            <div class=\"subbox\">\n              <div>\n                <div [routerLink]=\"['/simulator']\" [queryParams]=\"{gallery:i,proId:item.save_id}\"\n                  style=\"width: 100%;  background-color: #e8e8e8;\">\n                  <img class=\"item-img\" style=\"border-radius: 5px;\" src=\"{{item.media}}\" alt=\"{{item.name}}\">\n                </div>\n                <div style=\"box-sizing: border-box; padding: 15px;\">\n                  <div class=\"footer\">\n                    <h5>{{item.name}}</h5>\n                    <mat-icon aria-hidden=\"false\" *ngIf=\"isStaff\" aria-label=\"Delete icon\" color=\"warn\"\n                      (click)=\"deleteProjectFromGallery(item.save_id,item.name)\">delete</mat-icon>\n                  </div>\n                  <!-- <p style=\"margin-bottom: 0;text-align: right;font-size: small;\">{{item.time}} By {{item.author}}</p> -->\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n      </mat-tab>\n      <mat-tab label=\"Recents\" style=\"font-weight: bold;\">\n        <p style=\"margin: 1em;\">No Published Circuit Available</p>\n      </mat-tab>\n    </mat-tab-group>\n\n  </div>\n</mat-sidenav-container>"
  },
  {
    "path": "ArduinoFrontend/src/app/gallery/gallery.component.spec.ts",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/gallery/gallery.component.ts",
    "content": "import { Component, OnInit } from '@angular/core';\nimport { ApiService } from '../api.service';\nimport { filter, map } from 'rxjs/operators';\nimport { Login } from '../Libs/Login';\nimport { AlertService } from '../alert/alert-service/alert.service';\nimport { environment } from 'src/environments/environment';\nimport { MatSnackBar } from '@angular/material';\n\n/**\n * For Handling Time ie. Prevent moment error\n */\ndeclare var moment;\n/**\n * Class For Galley Page (Component)\n */\n@Component({\n  selector: 'app-gallery',\n  templateUrl: './gallery.component.html',\n  styleUrls: ['./gallery.component.css']\n})\nexport class GalleryComponent implements OnInit {\n  /**\n   * Store Samples\n   */\n  samples: any[] = [];\n\n  /**\n   * Determines whether staff is\n   */\n  isStaff = false;\n\n  /**\n   * Gallery Page Constructor\n   * @param api API Service\n   */\n  constructor(\n    private api: ApiService,\n    private alertService: AlertService,\n    private snackbar: MatSnackBar,\n  ) { }\n\n  /**\n   * On Init Page\n   */\n  ngOnInit() {\n    this.api.login().then(() => {\n      const token = Login.getToken();\n      if (token) {\n        this.api.getRole(token).subscribe((result: any) => {\n          result.is_arduino_staff === true ? this.isStaff = true : this.isStaff = false;\n        });\n      }\n    }).catch(() => {\n\n    });\n    // Add Page Title\n    document.title = 'Gallery | Arduino On Cloud';\n    // Show Loading animation\n    window['showLoading']();\n    // Fetch Samples\n    this.api.fetchSamples().subscribe((samples: any[]) => {\n      samples.map(d => {\n        if (!environment.production) {\n          this.samples.push(Object.assign({}, d, { media: environment.IMG_URL + d.media }));\n        } else {\n          this.samples.push(d);\n        }\n      });\n\n      // Hide Loading Animation\n      window['hideLoading']();\n    }, err => {\n      // show error and hide animation\n      console.log(err);\n      window['hideLoading']();\n    });\n\n    // TODO: Fetch Published Circuit\n  }\n  /**\n   * Returns the time difference from now in a string\n   * @param item Gallery Card item\n   */\n  DateTime(item) {\n    item.time = moment(item.create_time).fromNow();\n  }\n\n  getUserInfo() {\n    // this.api.getRole(Login).subscribe()\n  }\n\n  /**\n   * Deletes project from gallery\n   * @param saveId component Id\n   * @param name name of the component\n   */\n  DeleteCircuit(saveId: any, name: any) {\n    this.api.deleteProjectFromGallery(saveId, Login.getToken()).subscribe((done) => {\n      this.samples = [];\n      this.ngOnInit();\n      this.snackbar.open('Circuit Deleted.', null, {\n        duration: 2000\n      });\n    }, (e) => {\n      console.log(e);\n    });\n  }\n  /**\n   * Delete the Project from Database\n   * @param id Project id\n   * @param name Project's name\n   */\n  deleteProjectFromGallery(id, name) {\n    // ASK for user confirmation\n    AlertService.showConfirm('Are You Sure You want to Delete Circuit', () => this.DeleteCircuit(id, name), () => { });\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/graph/graph.component.css",
    "content": ".graph-container {\n  max-width: fit-content;\n  min-width: 420px;\n  min-height: 180px;\n  padding: 15px;\n  border: 1px solid black;\n}\n/* \n  left: 50px;\n  display: block;\n  position: fixed;\n  z-index: 700;\n  background: #fff;\n  top: 120px;\n  box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.4);\n  border-radius: 5px;\n}\n\n.dragger {\n  cursor: move;\n}\n */\n.align-right {\n  float: right;\n}\n\n.chartWrapper {\n  position: relative;\n}\n\n.chartWrapper > canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  pointer-events:none;\n}\n\n.chartAreaWrapper {\n  width: 600px;\n  overflow-x: scroll;\n}"
  },
  {
    "path": "ArduinoFrontend/src/app/graph/graph.component.html",
    "content": "<div class=\"graph-container\">\n  <div>\n    <b>\n      Pin : {{ pinLabel }}\n    </b>\n    <button mat-icon-button color=\"warn\" (click)=\"clearGraph()\" class='align-right'>\n      <mat-icon>delete</mat-icon>\n    </button>\n  </div>\n  <canvas id=\"graph{{id}}\"></canvas>\n</div>"
  },
  {
    "path": "ArduinoFrontend/src/app/graph/graph.component.ts",
    "content": "import { Component, Directive, Input, OnInit, AfterViewInit, Output } from '@angular/core';\nimport { Chart } from 'chart.js';\nimport { GraphDataService } from '../graph-data.service';\nimport { Workspace } from '../Libs/Workspace';\nimport { EventEmitter } from '@angular/core';\n\n@Component({\n  selector: 'app-graph',\n  templateUrl: './graph.component.html',\n  styleUrls: ['./graph.component.css']\n})\nexport class GraphComponent implements OnInit, AfterViewInit {\n\n  data: number[];\n  xlabels: number[];\n  pinGraph: Chart;\n  chartConfig: any;\n  previousTime: Date;\n  @Input() id: string;\n  @Input() arduinoId: number;\n  @Input() arduinoName: string;\n  state: boolean;\n  nodes: string[];\n  ignored = false;\n  pinLabel = '';\n\n  constructor(private graphDataService: GraphDataService) {\n    this.data = [];\n    this.xlabels = [];\n    this.chartConfig = {};\n    this.previousTime = new Date();\n    this.nodes = [];\n  }\n\n  ngOnInit() {\n    this.pinLabel = `${this.arduinoName} - D${15 - parseInt(this.id, 10)}`;\n    Workspace.simulationStopped.subscribe(res => {\n      this.ignored = false;\n    });\n    Workspace.simulationStarted.subscribe(res => {\n      this.clearGraph();\n    });\n  }\n\n  ngAfterViewInit() {\n    const canvasElement = `graph${this.id}`;\n    this.configChart();\n    this.pinGraph = new Chart(document.getElementById(canvasElement) as HTMLCanvasElement, this.chartConfig);\n    GraphDataService.voltageChange.subscribe(res => {\n      if (this.arduinoId === res.arduino.id) {\n        const pinNumber = 15 - parseInt(this.id, 10);\n        this.pinGraph.data.datasets[0].label = res.label;\n        this.data.push((res.value >> pinNumber) & 1);\n        if (this.xlabels.length === 0) {\n          this.xlabels.push(new Date(res.time).getTime() - new Date(res.time).getTime());\n        } else {\n          this.xlabels.push(new Date(res.time).getTime() - new Date(this.previousTime).getTime());\n        }\n        this.previousTime = new Date(res.time);\n        // console.log(this.pinLabel, this.data);\n        // console.log(this.pinLabel, this.xlabels);\n        this.pinGraph.update();\n      }\n    });\n  }\n\n  clearGraph() {\n    this.data.splice(0, this.data.length);\n    this.xlabels.splice(0, this.xlabels.length);\n    this.pinGraph.update();\n  }\n\n  configChart() {\n    this.chartConfig = {\n      animationEnabled: true,\n      type: 'line',\n      data: {\n        labels: this.xlabels,\n        datasets: [{\n          label: 'PIN',\n          fill: false,\n          backgroundColor: 'rgb(0, 0, 0)',\n          borderColor: 'rgb(0, 0, 0)',\n          data: this.data,\n          steppedLine: true,\n        }],\n      },\n      options: {\n        legend: {\n          display: false\n        },\n        responsive: true,\n        scales: {\n          xAxes: [{\n            scaleLabel: {\n              display: false,\n              labelString: 'Time'\n            }, gridLines: {\n              display: false\n            },\n            ticks: {\n              display: false,\n            }\n          }],\n          yAxes: [{\n            scaleLabel: {\n              display: false,\n              labelString: 'States',\n            },\n            gridLines: {\n              display: false\n            },\n            ticks: {\n              beginAtZero: true,\n              min: 0,\n              stepSize: 1,\n              max: 2,\n              callback: (value, index) => {\n                return value > 1 ? '' : value;\n              },\n            }\n          }],\n        },\n      },\n    };\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/graph-data.service.ts",
    "content": "import { Injectable, EventEmitter } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class GraphDataService {\n\n  public static portDChange: EventEmitter<object> = new EventEmitter<object>();\n  public static portBChange: EventEmitter<object> = new EventEmitter<object>();\n  public static voltageChange: EventEmitter<object> = new EventEmitter<object>();\n\n  constructor() { }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/graphlist/graphlist.component.css",
    "content": ".graph-container {\n  left: calc(100vw - 460px);\n  display: block;\n  position: fixed;\n  max-width: fit-content;\n  min-width: 440px;\n  min-height: 700px;\n  z-index: 700;\n  background: #fff;\n  top: 320px;\n  box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.4);\n  padding: 15px;\n  border-radius: 5px;\n}\n\n.dragger {\n  cursor: move;\n}\n\n.align-right {\n  float: right;\n}\n\n.example-viewport {\n  height: 680px;\n  width: 420px;\n}\n\n.example-item {\n  height: 250px;\n}\n\n.alternate-simulation-text{\n  align-self: center;\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/graphlist/graphlist.component.html",
    "content": "<div class=\"graph-container\" cdkDrag cdkDragBoundary=\".cdk-overlay-container\">\n  <div class=\"p-1\">\n    <h4 style=\"display: inline;\">Waveforms</h4>\n    <button mat-icon-button color=\"primary\" class='dragger align-right' cdkDragHandle>\n      <i class='fas fa-arrows-alt'></i>\n    </button>\n    <button mat-raised-button color=\"primary\" class=\"align-right\" (click)=\"SaveData()\">SAVE</button>\n  </div>\n  <div *ngIf=\"!simulationStatus\" class=\"alternate-simulation-text\">\n    Start the simulation to visualize\n  </div>\n  <div>\n    <b>Number of Data Points: {{dataPoints}}</b>\n  </div>\n  <cdk-virtual-scroll-viewport itemSize=\"25\" minBufferPx=\"200\" maxBufferPx=\"400\" class=\"example-viewport\">\n    <div *ngFor=\"let node of nodes\" class=\"example-item\">\n      <app-graph #pinGraph [id]=\"node.point\" [arduinoId]=\"node.arduinoId\" \n      [arduinoName]=\"node.arduinoName\" [simStatus]=\"simulationStatus\"></app-graph>\n    </div>\n  </cdk-virtual-scroll-viewport>\n</div>"
  },
  {
    "path": "ArduinoFrontend/src/app/graphlist/graphlist.component.ts",
    "content": "import { Component, Input, OnInit, Output, QueryList, ViewChildren } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { EventEmitter } from '@angular/core';\nimport { AlertService } from '../alert/alert-service/alert.service';\nimport { ApiService } from '../api.service';\nimport { GraphComponent } from '../graph/graph.component';\nimport { Login } from '../Libs/Login';\nimport { Workspace } from '../Libs/Workspace';\nimport { SimulatorComponent } from '../simulator/simulator.component';\nimport { GraphDataService } from '../graph-data.service';\n\n@Component({\n  selector: 'app-graphlist',\n  templateUrl: './graphlist.component.html',\n  styleUrls: ['./graphlist.component.css']\n})\nexport class GraphlistComponent implements OnInit {\n\n  @Input() id: number;\n  @Input() saveId: any;\n  @Input() lti: boolean;\n  @Output() simDataSave: EventEmitter<boolean> = new EventEmitter();\n  @ViewChildren('pinGraph') graphList!: QueryList<GraphComponent>;\n  nodes: object[] = [];\n  arduinoList: object[] = [];\n  simulationStatus = false;\n  dataPoints = 0;\n  hexData: number[] = [];\n  initData = false;\n\n  constructor(\n    private router: Router,\n    private aroute: ActivatedRoute,\n    private api: ApiService) { }\n\n  readPins() {\n    console.log('Detecting changes');\n    this.nodes = [];\n    // Workspace.circuitLoadStatus.subscribe(_ => {\n    window['scope'].ArduinoUno.forEach(arduino => {\n      arduino.nodes.forEach(point => {\n        if (point.connectedTo && (point.id <= 13 && point.id >= 2)) {\n          this.nodes.push({point: point.id, arduinoId: arduino.id, arduinoName: arduino.name});\n        }\n      });\n    });\n    window['scope'].ArduinoUno.forEach(arduino => {\n      this.arduinoList.push({arduinoId: arduino.id, arduinoName: arduino.name});\n    });\n    // });\n  }\n\n  ngOnInit() {\n    Workspace.simulationStarted.subscribe(res => {\n      this.simulationStatus = res;\n      this.dataPoints = 0;\n      this.hexData = [];\n      this.hexData.push(0);\n      this.initData = false;\n    });\n    Workspace.simulationStopped.subscribe(res => {\n      this.simulationStatus = res;\n    });\n    this.readPins();\n    Workspace.circuitLoadStatus.subscribe(res => {\n      this.readPins();\n    });\n    document.addEventListener('changed', (r) => {\n      console.log('Detecting changes', r['detail']['ele']['element']);\n      const changeInfo = r['detail']['ele'];\n      if (changeInfo.keyName === 'wires') {\n        const wire = changeInfo['element'];\n        const SarduinoId = wire['start']['keyName'] === 'ArduinoUno' ? wire.start.id : undefined;\n        const EarduinoId = wire['end']['keyName'] === 'ArduinoUno' ? wire.end.id : undefined;\n        if (changeInfo.event === 'delete') {\n          this.nodes = this.nodes.filter(i => {\n            if (SarduinoId && i['arduinoId'] === SarduinoId) {\n              if (i['point'] === wire.start.pid) {\n                return false;\n              }\n            }\n            if (EarduinoId && i['arduinoId'] === EarduinoId) {\n              if (i['point'] === wire.end.pid) {\n                return false;\n              }\n            }\n            return true;\n          });\n          console.log(this.nodes);\n        } else if (changeInfo.event === 'add') {\n          const Sarduino = SarduinoId ? window['scope'].ArduinoUno.filter(arduino => arduino.id === wire.start.id)[0] : undefined;\n          const Earduino = EarduinoId ? window['scope'].ArduinoUno.filter(arduino => arduino.id === wire.end.id)[0] : undefined;\n          this.pushPoint(Sarduino, wire.start.pid);\n          this.pushPoint(Earduino, wire.end.pid);\n        }\n      }\n    });\n    GraphDataService.voltageChange.subscribe(res => {\n      if (res.value === 0) {\n        this.initData = true;\n      }\n      if (this.arduinoList[0]['arduinoId'] === res.arduino.id && this.hexData[this.hexData.length - 1] !== res.value) {\n        if (this.initData === true) {\n          this.hexData.push(res.value);\n          this.dataPoints++;\n        }\n      }\n    });\n  }\n\n  pushPoint(arduino, pointId) {\n    if (arduino) {\n      const point = arduino['nodes'][pointId];\n      if (point.connectedTo && (point.id <= 13 && point.id >= 2)) {\n        this.nodes.push({point: point.id, arduinoId: arduino.id, arduinoName: arduino.name});\n      }\n    }\n  }\n\n  SaveData() {\n    const pins = [];\n    const newData = {};\n    this.graphList.forEach(pinGraph => {\n      pins.push(pinGraph.pinLabel);\n    });\n    this.arduinoList.forEach(ard => {\n      newData[ard['arduinoId']] = {\n        pinConnected: pins,\n        hexVals: this.hexData,\n        length: this.dataPoints\n      };\n    });\n    const token = Login.getToken();\n    if (!this.lti) {\n      this.api.storeSimulationData(this.id, token, newData).subscribe(res => AlertService.showAlert('Record Saved Successfully')\n      , err => AlertService.showAlert(err));\n    } else {\n      let ltiID;\n      this.aroute.queryParams.subscribe(v => {\n        ltiID = v.lti_id;\n      });\n      this.api.storeLTISimulationData(this.id, ltiID, token, newData).subscribe(res => {\n        AlertService.showAlert('Record Saved Successfully');\n        this.simDataSave.emit(true);\n      }\n      , err => {\n        AlertService.showAlert(err);\n        this.simDataSave.emit(false);\n      });\n    }\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/header/header.component.css",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/header/header.component.html",
    "content": "<!-- As a heading -->\n<div style=\"background:whitesmoke;display: flex; height: 60px\">\n  <div class=\"head-title\" style=\"display: flex;\">\n    <a [routerLink]=\"['/']\">\n      <img src=\"./assets/icon.png\" style=\"height: 40px;display: none;margin-top:10px;margin-right: 1em;\"\n        class=\"d-md-block\" alt=\"AOC\">\n    </a>\n    <span [style.color]=\"color\" style=\"text-decoration: none;\">\n      {{title}}\n    </span>\n  </div>\n  <!--<div style=\"flex-basis: 200px; line-height: 60px; text-align: right; padding-right: 10px;font-size: 18px;\">Gallery\n  </div>-->\n  <div style=\"display: flex; padding: 10px;\">\n    <a mat-stroked-button [href]=\"window.location.protocol + '//' + window.location.hostname\"\n      style=\"margin-right: 10px;\">Home</a>\n    <a mat-stroked-button [routerLink]=\"['/dashboard']\" style=\"margin-right: 10px;\">Dashboard</a>\n    <a mat-stroked-button [routerLink]=\"['/dashboard/gallery']\" style=\"margin-right: 10px;\">Gallery</a>\n    <a mat-stroked-button [routerLink]=\"['/simulator']\" style=\"margin-right: 10px\">Editor</a>\n    <a mat-stroked-button (click)=\"Login()\" *ngIf=\"!username\">Login</a>\n  </div>\n  <div class=\"dropdown my-dropdown\" *ngIf=\"username\">\n    <div class=\"w3-dropdown-hover float-right\" style=\"padding-bottom:10px;margin-right: 1em;\">\n      <!--<div class=\"dropdown my-dropdown\" *ngIf=\"token\">\n    <div class=\"w3-dropdown-hover float-right p-2\" style=\"padding-bottom:10px;\">\n      <img src=\"./assets/images/login.svg\" width=\"30\" height=\"30\" class=\"d-inline-block align-center\" alt=\"Login Image\">\n      <div class=\"dropdown-content\">\n        <div>\n          <i class=\"fas fa-user\" style=\"margin-left: 5px;\"></i> {{username}}\n        </div>\n        <hr style=\"margin-top: 5px;margin-bottom: 0;\">\n        <div>\n          <a href=\"../../\"><i class=\"fa fa-home\" style=\"margin-left: 5px;\"></i> Home</a>\n        </div>\n        <div>\n          <a [routerLink]=\"['/simulator']\"><i class=\"fa fa-plus\" style=\"margin-left: 5px;\"></i> New</a>\n        </div>\n        <div class=\"list\">\n          <a [routerLink]=\"['/dashboard']\"><i class=\"fa fa-credit-card\" style=\"margin-left: 5px;\"></i> Dashboard</a>\n        </div>\n        <div>\n          <a [routerLink]=\"['/gallery']\"><i class=\"fa fa-th\" style=\"margin-left: 5px;\"></i> Gallery</a>\n        </div>\n        <hr style=\"margin-top: 5px;margin-bottom: 0;\">\n        <div (click)=\"Logout()\">\n          <i class=\"fas fa-sign-out-alt\" style=\"margin-left: 5px;\"></i> Logout\n        </div>\n      </div>\n    </div>\n  </div>-->\n      <div class=\"dropdown show mr-2\" *ngIf=\"token\" style=\"margin-top: 9px;\">\n        <!-- <img class=\"dropdown-toggle\" href=\"#\" role=\"button\" id=\"dropdownMenuLink\" data-toggle=\"dropdown\"\n          aria-haspopup=\"true\" aria-expanded=\"false\" src=\"./assets/images/login.svg\" width=\"30\" height=\"30\"\n          class=\"d-inline-block align-center\" alt=\"Login Image\"> -->\n        <div class=\"circles\" id=\"dropdownMenuLink\" data-toggle=\"dropdown\">\n          {{ username.charAt(0).toUpperCase() }}\n        </div>\n        <div class=\"dropdown-menu dropdown-menu-right\" style=\"background-color: whitesmoke;  color: black !important;\"\n          aria-labelledby=\"dropdownMenuLink\">\n          <a *ngIf=\"username\" class=\"dropdown-item\"><i class=\"fas fa-user mr-1\"></i> {{username}}</a>\n          <a *ngIf=\"username\" class=\"dropdown-item\" (click)=\"onChangePassword()\"><i class=\"fa fa-unlock-alt mr-1\"></i>\n            Change Password</a>\n          <div class=\"dropdown-divider\"></div>\n          <!-- <a class=\"dropdown-item\" href=\"../../\"><i class=\"fa fa-home mr-1\"></i> Home</a>\n          <a class=\"dropdown-item\" [routerLink]=\"['/simulator']\"><i class=\"fa fa-plus mr-1\"></i> New</a>\n          <a class=\"dropdown-item\" [routerLink]=\"['/dashboard']\"><i class=\"fa fa-credit-card mr-1\"></i> Dashboard</a>\n          <a class=\"dropdown-item\" [routerLink]=\"['/gallery']\"><i class=\"fa fa-th mr-1\"></i> Gallery</a> -->\n          <div class=\"dropdown-divider\"></div>\n          <a class=\"dropdown-item\" (click)=\"Logout()\"><i class=\"fas fa-sign-out-alt mr-1\"></i> Logout</a>\n        </div>\n      </div>\n    </div>"
  },
  {
    "path": "ArduinoFrontend/src/app/header/header.component.spec.ts",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/header/header.component.ts",
    "content": "import { Component, OnInit, Input, OnDestroy } from '@angular/core';\nimport { Login } from '../Libs/Login';\nimport { ApiService } from '../api.service';\nimport { environment } from 'src/environments/environment';\nimport { ActivatedRoute } from '@angular/router';\nimport { Subscription } from 'rxjs';\n\n/**\n * Class For Header Component (DO Eager Loading)\n */\n@Component({\n  selector: 'app-header',\n  templateUrl: './header.component.html',\n  styleUrls: ['./header.component.css']\n})\nexport class HeaderComponent implements OnInit, OnDestroy {\n  /**\n   * Login Token\n   */\n  token: string;\n  /**\n   * Username\n   */\n  username: string;\n  /**\n   * window\n   */\n  window: any;\n  /**\n   * Header Title\n   */\n  @Input() title: string;\n  /**\n   * Color of the title\n   */\n  @Input() color: string;\n  /**\n   * Is it a Front Page\n   */\n  @Input() front = false;\n\n  /**\n   * Name  of the user\n   */\n  name: string;\n  /**\n   * Constructor for Header\n   * @param api API Service\n   */\n\n  /**\n   * getting subscription of user;\n   */\n  subscription = new Subscription();\n  constructor(\n    private api: ApiService,\n    private aroute: ActivatedRoute) { }\n  /**\n   * On Init\n   */\n  ngOnInit() {\n    this.getUserInfo();\n    this.stateChangeUserInfo();\n    // Initializing window\n    this.window = window;\n  }\n  /**\n   * Redirect to login\n   */\n  Login() {\n    Login.redirectLogin(this.front);\n  }\n  /**\n   * Handle Logout\n   */\n  Logout() {\n    // Login.logout();\n    this.api.logout(this.token);\n  }\n  /**\n   * Getting User Information.\n   */\n  stateChangeUserInfo() {\n    // Get Login Token\n    this.subscription = this.api.isAuthenticated.subscribe((res: boolean) => {\n      if (res === true) {\n        this.getUserInfo();\n      } else {\n        this.username = undefined;\n      }\n    });\n  }\n\n  getUserInfo() {\n    this.token = Login.getToken();\n    // If token is available then get username\n    if (this.token) {\n      this.api.userInfo(this.token).subscribe((v) => {\n        this.username = v.username;\n        this.name = this.username;\n      }, (err) => {\n        // console.log(err.status)\n        console.log(err);\n        // if (err.status === 401) {\n        Login.logout();\n        // }\n      });\n    }\n  }\n  /**\n   * Determines whether change password on click\n   */\n  onChangePassword() {\n    // let isFront =false;\n    let redirectUri = window.location.href;\n    redirectUri = encodeURIComponent(redirectUri);\n    console.log(redirectUri);\n    // const url = `${window.location.protocol}\\\\\\\\${window.location.host}\\\\eda\\\\#\\\\login?url=${redirectUri}`;\n    const url = `${environment.CHANGED_PASSWORD_URL}${redirectUri}`;\n    window.open(url, '_self');\n  }\n  /**\n   * on destroy when page is dead then call\n   */\n  ngOnDestroy() {\n    // destroy  auth subject.\n    this.subscription.unsubscribe();\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/layout/ArduinoCanvasInterface.ts",
    "content": "import { Canvas, Point, Block, Path } from './Components';\nimport { CircuitElement } from '../Libs/CircuitElement';\nimport { Wire } from '../Libs/Wire';\nimport { Point as NodePoint } from '../Libs/Point';\nimport { Utils } from './PathUtils';\nimport _ from 'lodash';\nimport { AlertService } from '../alert/alert-service/alert.service';\nimport { BoundingBox } from '../Libs/Geometry';\nimport { UndoUtils } from '../Libs/UndoUtils';\n\n/**\n * Declare window so that custom created function don't throw error\n */\ndeclare var window;\n\nclass PathProblem {\n    source: Point;\n    destination: Point;\n    sourceBlock: Block;\n    destinationBlock: Block;\n    wire: Wire;\n\n    constructor(source, destination, sourceBlock, destinationBlock, wire) {\n        this.source = source;\n        this.destination = destination;\n        this.sourceBlock = sourceBlock;\n        this.destinationBlock = destinationBlock;\n        this.wire = wire;\n    }\n}\n\nexport class LayoutUtils {\n    /**\n     * total count of problemPaths while auto Layouting\n     */\n    static problemPathsCount = 0;\n    /**\n     * Solves auto layout problem for `Arduino on Cloud` circuits\n     */\n    static solveAutoLayout() {\n        const canvas = LayoutUtils.generateCanvas();\n\n        const [isInvalid, overlappingEl1, overlappingEl2] = Utils.isCanvasInvalid(canvas);\n        if (!isInvalid) {\n            LayoutUtils.continueSaveLayout(canvas);\n        } else {\n            AlertService.showConfirm(\n                `Bounding boxes of ${overlappingEl1.getName()} and ${overlappingEl2.getName()} are overlapping.\n                 Do you want to continue anyway?`,\n                () => LayoutUtils.continueSaveLayout(canvas)\n            );\n        }\n    }\n\n    /**\n     * Sub function of `solveAutoLayout`, to be triggered on continuation\n     * @param canvas canvas\n     */\n    private static continueSaveLayout(canvas: Canvas): void {\n        const problemPaths = LayoutUtils.getSourcesAndDestsToSolve();\n        this.problemPathsCount = problemPaths.length;\n        for (const path of problemPaths) {\n            const [solvedPath, msg] = Utils.getOptimalPath(path.source, path.destination, path.sourceBlock, path.destinationBlock, canvas);\n            if (!solvedPath) {\n                continue;\n            }\n            canvas.addElement(solvedPath);\n            LayoutUtils.updateWirePath(path.wire, solvedPath);\n            path.wire.update();\n        }\n    }\n\n    /**\n     * Converts the circuit to canvas structure\n     */\n    static generateCanvas(): Canvas {\n        const allElements = LayoutUtils.getAllCircuitElements().filter(el => !(el instanceof Wire));\n        let canvasElements = allElements.map(LayoutUtils.convertCircuitElementToBlock);\n\n        const allNodes = _.flatten(allElements.map(element => element.nodes));\n        canvasElements = canvasElements.concat(\n            allNodes.map(\n                (node: NodePoint) => LayoutUtils.convertBoundingBoxToBlock(\n                    node.getBoundingBox(), `${node.label} of ${node.parent.getName()}`, true\n                )\n            )\n        );\n\n        return new Canvas(canvasElements);\n    }\n\n    /**\n     * Updates the path of the wire\n     * @param wire wire object\n     * @param path new path to be assigned\n     */\n    static updateWirePath(wire: Wire, path: Path): void {\n        // Push dump to Undo stack & Reset\n        UndoUtils.pushChangeToUndoAndReset({ keyName: wire.keyName, element: wire.save(), event: 'layout', step: this.problemPathsCount });\n        let i = 1;\n        const allPoints = path.getAllPoints();\n        wire.removeAllMiddlePoints();\n        for (const point of allPoints.slice(1, allPoints.length - 1)) {\n            wire.addPoint(point.getX(), point.getY(), false, i++);\n        }\n    }\n\n    /**\n     * Converts any circuit element to Block object required for canvas\n     * @param element circuit element instance\n     */\n    static convertCircuitElementToBlock(element: CircuitElement): Block {\n        return LayoutUtils.convertBoundingBoxToBlock(element.getBoundingBox(), element.getName());\n    }\n\n    /**\n     * Converts bounding box to Block object\n     * @param boundingBox Bounding box\n     * @param name name of the element\n     * @param isChild contains parent?\n     */\n    static convertBoundingBoxToBlock(boundingBox: BoundingBox, name = 'Unnamed', isChild: boolean = false): Block {\n        const diagonalPoint1 = new Point(boundingBox.x, boundingBox.y);\n        const diagonalPoint2 = new Point(boundingBox.x + boundingBox.width, boundingBox.y + boundingBox.height);\n\n        return new Block(diagonalPoint1, diagonalPoint2, isChild, name);\n    }\n\n    /**\n     * Gets all the sources and destinations of all the wires on the canvas\n     */\n    static getSourcesAndDestsToSolve(): PathProblem[] {\n        const allWires = LayoutUtils.getAllWires();\n        const result: PathProblem[] = [];\n        for (const wire of allWires) {\n            const [src, dest] = LayoutUtils.getSourceAndDestinationForWire(wire);\n            const srcBlock = LayoutUtils.convertCircuitElementToBlock(wire.start.parent);\n            const destBlock = LayoutUtils.convertCircuitElementToBlock(wire.end.parent);\n            result.push(new PathProblem(src, dest, srcBlock, destBlock, wire));\n        }\n        return result;\n    }\n\n    /**\n     * Returns source and destination of a given wire\n     * @param wire wire instance\n     */\n    static getSourceAndDestinationForWire(wire: Wire): [Point, Point] {\n        const start = wire.points[0];\n        const source = new Point(start[0], start[1]);\n\n        const end = wire.points[wire.points.length - 1];\n        const dest = new Point(end[0], end[1]);\n\n        return [source, dest];\n    }\n\n    /**\n     * Converts a wire to a Path object\n     * @param wire wire instance\n     */\n    static convertWireToPath(wire: Wire): Path {\n        const points = wire.points.map(point => new Point(point[0], point[1]));\n        return new Path(points);\n    }\n\n    /**\n     * Returns list of all wires present in the circuit\n     */\n    static getAllWires(): Wire[] {\n        return Object.values(window.scope.wires);\n    }\n\n    /**\n     * Returns list of all circuit elements on the canvas\n     */\n    static getAllCircuitElements(): CircuitElement[] {\n        return _.flatten(Object.values(window.scope));\n    }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/layout/Components.ts",
    "content": "import _ from 'lodash';\n// const _ =  require('lodash');\n\nexport class MathHelper {\n    /**\n     * Checks if two numbers are close\n     * @param x number 1\n     * @param y number 2\n     * @param decimals number of decimals up to which equality is to be checked\n     */\n    static areNumbersClose(x: number, y: number, decimals: number = 8) {\n        if (isFinite(x) || isFinite(y)) {\n            return Math.abs(x - y) < (10 ** (-1 * decimals));\n        }\n        return true;\n    }\n\n    /**\n     * Computes n mod m\n     * @param n number n\n     * @param m number m\n     */\n    static modulo(n: number, m: number) {\n        return ((n % m) + m) % m;\n    }\n}\n\n/**\n * Orientation enum\n */\nexport enum Orientation {\n    North = 90, East = 0, South = 270, West = 180\n}\n\n/**\n * Abstract class for CanvasElement\n */\nexport abstract class CanvasElement {\n    abstract getName(): string;\n}\n\n/**\n * Vector class\n * x î + y j\n */\nexport class Vector {\n    /**\n     * magnitude in i direction\n     */\n    private x: number;\n\n    /**\n     * magnitude in j direction\n     */\n    private y: number;\n\n    constructor(x: number, y: number) {\n        this.x = x;\n        this.y = y;\n    }\n\n    /**\n     * Returns x component of the vector\n     */\n    getX(): number {\n        return this.x;\n    }\n\n    /**\n     * Returns y component of the vector\n     */\n    getY(): number {\n        return this.y;\n    }\n\n    /**\n     * Adds a vector\n     * @param vector vector to be added\n     */\n    add(vector: Vector) {\n        return new Vector(this.x + vector.x, this.y + vector.y);\n    }\n\n    /**\n     * Subtracts a vector\n     * @param vector vector to be subtracted\n     */\n    subtract(vector: Vector) {\n        return new Vector(this.x - vector.x, this.y - vector.y);\n    }\n\n    /**\n     * Multiplies with a scalar\n     * @param factor scalar number to be multiplied with the vector\n     */\n    multiply(factor: number): Vector {\n        return new Vector(this.x * factor, this.y * factor);\n    }\n\n    /**\n     * Computes dot product with another vector\n     * @param vector vector instance\n     */\n    dotProduct(vector: Vector): number {\n        return vector.getX() * this.x + vector.getY() * this.y;\n    }\n\n    /**\n     * Computes the slope of the vector\n     */\n    getSlope(): number {\n        return this.y / this.x;\n    }\n\n    /**\n     * Returns the closest orientation of the vector\n     */\n    getApproxOrientation(): Orientation {\n        const absRelativeSlope = Math.abs(this.getSlope());\n\n        if (absRelativeSlope >= 1) {\n            return this.y >= 0 ? Orientation.North : Orientation.South;\n        } else {\n            return this.x >= 0 ? Orientation.East : Orientation.West;\n        }\n    }\n\n    /**\n     * Returns Orientation of the vector if it's horizontal or vertical\n     */\n    getOrientation(): Orientation {\n        if (this.x === 0) {\n            return this.y > 0 ? Orientation.North : Orientation.South;\n        } else if (this.y === 0) {\n            return this.x > 0 ? Orientation.East : Orientation.West;\n        }\n        return null;\n    }\n}\n\n/**\n * Utilities methods for Orientation enum\n */\nexport class OrientationUtil {\n    public static getUnitVector(orientation: Orientation) {\n        switch (orientation) {\n            case Orientation.North:\n                return new Vector(0, 1);\n            case Orientation.South:\n                return new Vector(0, -1);\n            case Orientation.East:\n                return new Vector(1, 0);\n            case Orientation.West:\n                return new Vector(-1, 0);\n        }\n    }\n\n    /**\n     * Adds two orientations\n     * @param orientation1 orientation instance 1\n     * @param orientation2 orientation instance 2\n     */\n    public static addOrientations(orientation1: Orientation, orientation2: Orientation): Orientation {\n        return MathHelper.modulo(orientation1 + orientation2, 360);\n    }\n\n    /**\n     * Subtracts two orientations\n     * @param orientation1 orientation instance 1\n     * @param orientation2 orientation instance 2\n     */\n    public static subtractOrientations(orientation1: Orientation, orientation2: Orientation): Orientation {\n        return MathHelper.modulo(orientation1 - orientation2, 360);\n    }\n}\n\n/**\n * Cartesian-plane Point class\n */\nexport class Point {\n    /**\n     * x-coordinate of the point\n     */\n    private x: number;\n\n    /**\n     * y-coordinate of the point\n     */\n    private y: number;\n\n    constructor(x: number, y: number) {\n        this.x = x;\n        this.y = y;\n    }\n\n    /**\n     * Loads point from a vector instance\n     * @param vector vector instance\n     */\n    static loadFromVector(vector: Vector) {\n        return new Point(vector.getX(), vector.getY());\n    }\n\n    /**\n     * Returns string representation of the point\n     */\n    toString(): string {\n        return `(${this.x}, ${this.y})`;\n    }\n\n    /**\n     * Returns x-coordinate of the point\n     */\n    getX(): number {\n        return this.x;\n    }\n\n    /**\n     * Returns y-coordinate of the point\n     */\n    getY(): number {\n        return this.y;\n    }\n\n    /**\n     * Adds another point and returns the resultant vector\n     * @param point point to be added\n     */\n    add(point: Point) {\n        return this.getVector().add(point.getVector());\n    }\n\n    /**\n     * Subtracts another point and returns the resultant vector\n     * @param point point to be added\n     */\n    subtract(point: Point) {\n        return this.getVector().subtract(point.getVector());\n    }\n\n    /**\n     * Converts to an instance of Vector class\n     */\n    getVector(): Vector {\n        return new Vector(this.x, this.y);\n    }\n\n    /**\n     * Computes the distance from another point\n     * @param point another point\n     */\n    calculateDistance(point: Point) {\n        return Math.sqrt((this.x - point.x) ** 2 + (this.y - point.y) ** 2);\n    }\n\n    /**\n     * Checks if the point is equal to another point\n     * @param point another point\n     */\n    equals(point: Point) {\n        return (this.x === point.getX()) && (this.y === point.getY());\n    }\n}\n\n/**\n * Line class\n * (x)---------------(x)\n * point1           point2\n */\nexport class Line {\n    /**\n     * Point 1 of the line\n     */\n    private point1: Point;\n\n    /**\n     * Point 2 of the line\n     */\n    private point2: Point;\n\n    constructor(point1: Point, point2: Point) {\n        this.point1 = point1;\n        this.point2 = point2;\n    }\n\n    /**\n     * Returns string representation of the line\n     */\n    toString(): string {\n        return `${this.point1} --> ${this.point2}`;\n    }\n\n    /**\n     * Checks if the line superimposes with another line\n     * @param line another line\n     */\n    doesLineSuperimpose(line: Line): boolean {\n        const slope1 = this.getSlope();\n        const slope2 = line.getSlope();\n\n        if (MathHelper.areNumbersClose(slope1, slope2)) {\n            const isPoint1InLine2 = line.containsPoint(this.getPoint1());\n            const isPoint2InLine2 = line.containsPoint(this.getPoint2());\n            return isPoint1InLine2 || isPoint2InLine2;\n        }\n        return false;\n    }\n\n    /**\n     * Checks if the line intersects with another line\n     * @param line another line\n     */\n    doesLineIntersect(line: Line): [boolean, Point] {\n        // returns true iff the line from (a,b)->(c,d) intersects with (p,q)->(r,s)\n        const [a, b] = [this.point1.getX(), this.point1.getY()];\n        const [c, d] = [this.point2.getX(), this.point2.getY()];\n        const [p, q] = [line.getPoint1().getX(), line.getPoint1().getY()];\n        const [r, s] = [line.getPoint2().getX(), line.getPoint2().getY()];\n\n        const det = (c - a) * (s - q) - (r - p) * (d - b);\n        if (det === 0) {\n            return [false, null];\n        } else {\n            const lambda = ((s - q) * (r - a) + (p - r) * (s - b)) / det;\n            const gamma = ((b - d) * (r - a) + (c - a) * (s - b)) / det;\n            const isIntersect = (0 < lambda && lambda < 1) && (0 < gamma && gamma < 1);\n            let intersectionPoint = null;\n            if (isIntersect) {\n                intersectionPoint = Point.loadFromVector(this.point1.getVector().add(this.getVector().multiply(lambda)));\n            }\n            return [isIntersect, intersectionPoint];\n        }\n    }\n\n    /**\n     * Converts the line to a vector representation\n     */\n    getVector(): Vector {\n        return this.point2.subtract(this.point1);\n    }\n\n    /**\n     * Checks if the line is horizontal\n     */\n    isHorizontal(): boolean {\n        return this.getSlope() === 0;\n    }\n\n    /**\n     * Checks if the line is vertical\n     */\n    isVertical(): boolean {\n        return !isFinite(this.getSlope());\n    }\n\n    /**\n     * Returns the array of the two ends of the line\n     */\n    getEnds(): [Point, Point] {\n        return [this.getPoint1(), this.getPoint2()];\n    }\n\n    /**\n     * Returns point1 of the line\n     */\n    getPoint1(): Point {\n        return this.point1;\n    }\n\n    /**\n     * Returns point2 of the line\n     */\n    getPoint2(): Point {\n        return this.point2;\n    }\n\n    /**\n     * Computes the length of the line\n     */\n    getLength(): number {\n        return this.point1.calculateDistance(this.point2);\n    }\n\n    /**\n     * Computes the slope of the line\n     */\n    getSlope(): number {\n        const lineVector = this.point1.subtract(this.point2);\n        return lineVector.getSlope();\n    }\n\n    /**\n     * Checks if a point lies on the line\n     * @param p point instance\n     */\n    containsPoint(p: Point): boolean {\n        return MathHelper.areNumbersClose(this.point1.calculateDistance(p) + this.point2.calculateDistance(p), this.getLength());\n    }\n\n    /**\n     * Checks if the line equals another line\n     * @param line another line\n     */\n    equals(line: Line): boolean {\n        return (this.point1.equals(line.getPoint1()) && this.point2.equals(line.getPoint2())) ||\n        (this.point2.equals(line.getPoint1()) && this.point1.equals(line.getPoint2()));\n    }\n}\n\n\n/**\n * Path class\n * A path is made up of multiple line segments or multiple points\n */\nexport class Path extends CanvasElement {\n    /**\n     * Lines inside the path\n     */\n    private points: Point[] = [];\n\n    constructor(points: Point[] = []) {\n        super();\n        this.points = points;\n    }\n\n    /**\n     * Loads a single-line path from a Line object\n     * @param line line instance\n     */\n    static loadFromLine(line: Line): Path {\n        return new Path(line.getEnds());\n    }\n\n    /**\n     * Checks if the path superimposes with another path anywhere\n     * @param path another path\n     * Returns [does path superimposes?, line of the path (this) that superimposes, line of the another path that superimposes]\n     */\n    doesPathSuperimpose(path: Path): [boolean, Line, Line] {\n        const lineSegments = path.getAllLineSegments();\n        const thisLineSegments = this.getAllLineSegments();\n\n        // O(n**2) for now. TODO: O(n*logn)\n        for (const line1 of lineSegments) {\n            for (const line2 of thisLineSegments) {\n                if (line1.doesLineSuperimpose(line2)) {\n                    return [true, line1, line2];\n                }\n            }\n        }\n        return [false, null, null];\n    }\n\n    getName(): string {\n        return null;\n    }\n\n    /**\n     * Merges all the mergeable points in the path\n     */\n    private mergePoints(): void {\n        const allPoints = this.getAllPoints();\n        let prevPoint = allPoints[0];\n        const newPoints = [prevPoint];\n\n        for (const point of allPoints.slice(1)) {\n            if (!point.equals(prevPoint)) {\n                newPoints.push(point);\n            }\n            prevPoint = point;\n        }\n        this.points = newPoints;\n    }\n\n    /**\n     * Merges collinear points on the path\n     */\n    private mergeCollinearPoints(): void {\n        this.mergePoints();\n        const lineSegments = this.getAllLineSegments();\n        let prevLine = lineSegments[0];\n\n        const newPoints = [];\n        newPoints.push(prevLine.getPoint1());\n\n        // merging collinear points\n        let line = null;\n        for (line of lineSegments.slice(1)) {\n            const prevSlope = prevLine.getSlope();\n            prevLine = line;\n\n            const currSlope = line.getSlope();\n\n            if (MathHelper.areNumbersClose(currSlope, prevSlope)) {\n                continue;\n            }\n            if (!isFinite(prevSlope) && !isFinite(currSlope)) {\n                continue;\n            }\n            newPoints.push(line.getPoint1());\n        }\n        newPoints.push(line.getPoint2());\n        this.points = newPoints;\n    }\n\n    /**\n     * Detects and deletes all the cycles in the path\n     * @param i starting point index\n     */\n    private deleteCycles(i?) {\n        const lineSegments = this.getAllLineSegments();\n        // TODO: Make this O(nlogn) when. O(n**2) should work fine for ~100-length paths\n        for (i = (i || 0); i < lineSegments.length; i++) {\n            for (let j = i + 1; j < lineSegments.length; j++) {\n                const line1 = lineSegments[i];\n                const line2 = lineSegments[j];\n                const [intersect, pointX] = line1.doesLineIntersect(line2);\n                if (intersect) {\n                    this.points = [...this.points.slice(0, i + 1), pointX, ...this.points.slice(j + 1)];\n                    this.deleteCycles(i);\n                    return;\n                }\n                line1.doesLineSuperimpose(line2);\n            }\n        }\n    }\n\n    /**\n     * Simplifies the path by removing collinear points and cycles\n     */\n    simplify(): void {\n        this.mergeCollinearPoints();\n        this.deleteCycles();\n    }\n\n    /**\n     * Returns array of all line segments in the path\n     */\n    getAllLineSegments(): Line[] {\n        const result = [];\n        let prevPoint = this.points[0];\n        for (const point of this.points.slice(1)) {\n            result.push(new Line(prevPoint, point));\n            prevPoint = point;\n        }\n        return result;\n    }\n\n    /**\n     * Returns number of points in the path\n     */\n    getNumberOfPoints() {\n        return this.points.length;\n    }\n\n    /**\n     * Returns the orientation of the line made by points at two indices\n     * @param pointIndex1 point 1 index\n     * @param pointIndex2 point 2 index\n     */\n    private getLineSegmentOrientation(pointIndex1, pointIndex2) {\n        const point1 = this.getAllPoints()[pointIndex1];\n        const point2 = this.getAllPoints()[pointIndex2];\n\n        const vector = point2.subtract(point1);\n        return vector.getOrientation();\n    }\n\n    /**\n     * Returns the string representation of the path\n     */\n    toString(): string {\n        return this.points.map(p => p.toString()).join('\\n');\n    }\n\n    /**\n     * Checks if the path contains a point\n     * @param point point\n     */\n    containsPoint(point: Point): boolean {\n        for (const line of this.getAllLineSegments()) {\n            if (line.containsPoint(point)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Returns the orientation of the last vector in the path\n     */\n    getLastVectorOrientation(): Orientation {\n        const n = this.getNumberOfPoints();\n        if (n < 1) {\n            return null;\n        }\n        return this.getLineSegmentOrientation(n - 1, n - 2);\n    }\n\n    /**\n     * Returns the orientation of the last vector in the path\n     */\n    getFirstVectorOrientation(): Orientation {\n        const n = this.getNumberOfPoints();\n        if (n < 1) {\n            return null;\n        }\n        return this.getLineSegmentOrientation(0, 1);\n    }\n\n    /**\n     * Adds a path and return the instance of the new path\n     * @param path path to add\n     */\n    addPath(path: Path): Path {\n        return new Path([...this.getAllPoints(), ...path.getAllPoints()]);\n    }\n\n    /**\n     * Reverses the path and return a new instance\n     */\n    reverse(): Path {\n        return new Path(_.reverse(this.getAllPoints()));\n    }\n\n    /**\n     * Returns all the points\n     */\n    getAllPoints(): Point[] {\n        return [...this.points];\n    }\n\n    /**\n     * Adds a point to the path\n     * @param point: point to add to the path\n     */\n    addPoint(point: Point): void {\n        this.points.push(point);\n    }\n\n    /**\n     * Adds multiple points to the path\n     * @param point: point to add to the path\n     */\n    addPoints(points: Point[]): void {\n        this.points = this.points.concat(points);\n    }\n}\n\nexport class Block extends CanvasElement {\n    /**\n     * Point 1 -------------- Point 2\n     *         |            |\n     *         |            |\n     *         |            |\n     *         |            |\n     * Point 4 -------------- Point 3\n     */\n\n    /**\n     * diagonal 1 point 1\n     */\n    private point1: Point;\n\n    /**\n     * diagonal 1 point 2\n     */\n    private point3: Point;\n\n    /**\n     * diagonal 2 point 1\n     */\n    private point2: Point;\n\n    /**\n     * diagonal 2 point 2\n     */\n    private point4: Point;\n\n    private name: string;\n\n    private isChildBlock = false;\n\n    constructor(point1: Point, point3: Point, isChildBlock = false, name?) {\n        super();\n        this.point1 = point1;\n        this.point3 = point3;\n        this.isChildBlock = isChildBlock;\n        this.point2 = new Point(point3.getX(), point1.getY());\n        this.point4 = new Point(point1.getX(), point3.getY());\n        this.name = name;\n    }\n\n    getBoundary(): Path {\n        const allPoints = this.getAllVertices();\n        return new Path([...allPoints, allPoints[0]]);\n    }\n\n    isChild(): boolean {\n        return this.isChildBlock;\n    }\n\n    getName(): string {\n        return this.name;\n    }\n\n    /**\n     * checks if the point p is inside or on the block\n     * @param p point\n     */\n    containsPoint(p: Point): boolean {\n        const xMax = this.getMaxX();\n        const xMin = this.getMinX();\n        const yMax = this.getMaxY();\n        const yMin = this.getMinY();\n        return (p.getX() >= xMin) && (p.getX() <= xMax) && (p.getY() >= yMin) && (p.getY() <= yMax);\n    }\n\n    getAllVertices(): Point[] {\n        return [this.point1, this.point2, this.point3, this.point4];\n    }\n\n    getPoint1(): Point {\n        return this.point1;\n    }\n\n    getPoint2(): Point {\n        return this.point2;\n    }\n\n    getPoint3(): Point {\n        return this.point3;\n    }\n\n    getPoint4(): Point {\n        return this.point4;\n    }\n\n    getMinX(): number {\n        return Math.min(this.point1.getX(), this.point3.getX());\n    }\n\n    getMaxX(): number {\n        return Math.max(this.point1.getX(), this.point3.getX());\n    }\n\n    getMinY(): number {\n        return Math.min(this.point1.getY(), this.point3.getY());\n    }\n\n    getMaxY(): number {\n        return Math.max(this.point1.getY(), this.point3.getY());\n    }\n\n    /**\n     * Returns the tuple of other two diagonal points\n     */\n    getOtherTwoPoints(): [Point, Point] {\n        return [this.point2, this.point4];\n    }\n\n    /**\n     * Returns the two diagonal vector of the block\n     */\n    getDiagonals(): [Vector, Vector] {\n        return [this.point1.subtract(this.point3), this.point2.subtract(this.point4)];\n    }\n\n    /**\n     * Returns mid-point of the block\n     */\n    getCenter(): Point {\n        const midX = (this.point1.getX() + this.point3.getX()) / 2;\n        const midY = (this.point1.getY() + this.point3.getY()) / 2;\n        return new Point(midX, midY);\n    }\n\n    /**\n     * returns orientation of the point with respect to the block\n     * @param point: point\n     */\n    getRelativeOrientation(point: Point): Orientation {\n        const relativeVector = point.subtract(this.getCenter());\n        const absRelativeSlope = Math.abs(relativeVector.getSlope());\n        const boxDiagonalSlope = Math.abs(this.getDiagonals()[0].getSlope());\n\n        const relativeY = relativeVector.getY();\n        const relativeX = relativeVector.getX();\n\n        if (absRelativeSlope >= boxDiagonalSlope) {\n            return relativeY >= 0 ? Orientation.North : Orientation.South;\n        } else {\n            return relativeX >= 0 ? Orientation.East : Orientation.West;\n        }\n    }\n\n    /**\n     * Returns the unit vector of the relative orientation of the point wrt the Box\n     * @param point: point\n     */\n    getRelativeOrientationUnitVector(point: Point): Vector {\n        const relativeOrientation = this.getRelativeOrientation(point);\n        return OrientationUtil.getUnitVector(relativeOrientation);\n    }\n\n    /**\n     * Returns a point away from port of the block\n     * @param point port\n     * @param distance distance of the new point from port\n     */\n    getPointAwayFromPort(point: Point, distance: number, canvas?: Canvas): Point {\n        const unitVector = this.getRelativeOrientationUnitVector(point);\n        let resultantVector = point.getVector().add(unitVector.multiply(distance));\n        // TODO: get the distance directly by using the boundary of the block\n        while (this.containsPoint(Point.loadFromVector(resultantVector))) {\n            resultantVector = resultantVector.add(unitVector.multiply(distance));\n        }\n        return Point.loadFromVector(resultantVector);\n    }\n}\n\nexport class Canvas {\n    /**\n     * List of elements inside the canvas\n     */\n    private elements: CanvasElement[];\n\n    constructor(elements: CanvasElement[] = []) {\n        this.elements = elements;\n    }\n\n    addElement(element: CanvasElement): void {\n        this.elements.push(element);\n    }\n\n    removeElement(element: CanvasElement): void {\n        _.remove(this.elements, (el: CanvasElement) => el === element);\n    }\n\n    getElements(): CanvasElement[] {\n        return [...this.elements];\n    }\n\n    getBlocks(): Block[] {\n        return this.elements.filter(element => element instanceof Block).map(element => (element as Block));\n    }\n\n    getParentBlocks(): Block[] {\n        return this.elements.filter(element => (element instanceof Block) && (!(element as Block).isChild()))\n                            .map(element => (element as Block));\n    }\n\n    getPaths(): Path[] {\n        return this.elements.filter(element => element instanceof Path).map(element => (element as Path));\n    }\n}\n\n\nexport class CanvasUtils {\n    static doElementsIntersect(element1: CanvasElement, element2: CanvasElement): [boolean, Line, Line] {\n        if ((element1 instanceof Path) && (element2 instanceof Block)) {\n            return CanvasUtils.doesBlockAndPathIntersects(element1, element2);\n        } else if ((element1 instanceof Block) && (element2 instanceof Path)) {\n            return CanvasUtils.doesBlockAndPathIntersects(element2, element1);\n        } else if ((element1 instanceof Block) && (element2 instanceof Block)) {\n            // intersecting lines are returned as null null as doesn't hold true for 2 blocks\n            return CanvasUtils.doBlocksIntersect(element1, element2);\n        } else if ((element1 instanceof Path) && (element2 instanceof Path)) {\n            return element1.doesPathSuperimpose(element2);\n        }\n        return [false, null, null];\n    }\n\n    private static doesBlockAndPathIntersects(path: Path, block: Block): [boolean, Line, Line] {\n        const lineSegments = block.getBoundary().getAllLineSegments();\n        for (const line of path.getAllLineSegments()) {\n            for (const blockLine of lineSegments) {\n                if (line.doesLineIntersect(blockLine)[0]) {\n                    return [true, line, blockLine];\n                }\n            }\n        }\n        return [false, null, null];\n    }\n\n    private static doBlocksIntersect(block1: Block, block2: Block): [boolean, Line, Line] {\n        const [minAx, minAy, maxAx, maxAy] = [block1.getMinX(), block1.getMinY(), block1.getMaxX(), block1.getMaxY()];\n        const [minBx, minBy, maxBx, maxBy] = [block2.getMinX(), block2.getMinY(), block2.getMaxX(), block2.getMaxY()];\n\n        const aLeftOfB = maxAx < minBx;\n        const aRightOfB = minAx > maxBx;\n        const aAboveB = minAy > maxBy;\n        const aBelowB = maxAy < minBy;\n\n        const isIntersect = !(aLeftOfB || aRightOfB || aAboveB || aBelowB);\n        return [isIntersect, null, null];\n    }\n\n    static getBoundary(element: CanvasElement): Path {\n        if (element instanceof Block) {\n            return (element as Block).getBoundary();\n        } else if (element instanceof Path) {\n            return (element as Path);\n        }\n    }\n\n    static arePointsAligned(point1: Point, point2: Point): boolean {\n        return (point1.getX() === point2.getX()) || (point1.getY() === point2.getY());\n    }\n\n    static appendPaths(...paths: Path[]): Path {\n        const allPoints = _.flatten(paths.map(path => path.getAllPoints()));\n        return new Path(allPoints);\n    }\n\n    static getSubCanvasIntersectingCanvas(canvas: Canvas, block: Block): Canvas {\n        return new Canvas(canvas.getElements().filter(el => CanvasUtils.doElementsIntersect(el, block)));\n    }\n\n    static doesPointLieOnCanvaspath(canvas: Canvas, point: Point): boolean {\n        const allPaths = canvas.getPaths();\n        for (const path of allPaths) {\n            if (path.containsPoint(point)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    static getCompactPath(canvas: Canvas, path: Path): Path {\n        return null;\n    }\n\n}\n\nfunction test() {\n    const line1 = new Line(new Point(1, 1), new Point(4, 4));\n    console.log(line1.containsPoint(new Point(2, 2)));\n}\n\ntest();\n"
  },
  {
    "path": "ArduinoFrontend/src/app/layout/PathUtils.ts",
    "content": "import { Line, Point, Block, Canvas, Orientation, CanvasUtils, Path, MathHelper, CanvasElement, OrientationUtil } from './Components';\nimport _ from 'lodash';\n// const _ = require('lodash');\n\n// Minimum unit distance to use in resolving the paths\nconst DELTA_DISTANCE = 15;\n\n// Path priority map.\n// Moving in the same direction is the most prior while searching for the optimal path.\nconst PATH_PRIORITY = {\n    0: 0,\n    90: 1,\n    270: 2,\n    180: 3\n};\n\nexport class Utils {\n\n    /**\n     * Computes the optimal path between src and dest\n     * @param src source\n     * @param dest destination\n     * @param srcParentBlock parent block of the source point\n     * @param destParentBlock parent block of the destination point\n     * @param canvas canvas instance\n     */\n    static getOptimalPath(src: Point, dest: Point, srcParentBlock: Block, destParentBlock: Block, canvas: Canvas): [Path, string] {\n        const srcPoint = Utils.getPointAwayFromPort(src, srcParentBlock, canvas);\n        const destPoint = Utils.getPointAwayFromPort(dest, destParentBlock, canvas);\n\n        const srcOrientation = srcParentBlock.getRelativeOrientation(src);\n        const destOrientation = destParentBlock.getRelativeOrientation(dest);\n\n        const dpDict = {};\n\n        let middlePath = Utils.getOptimalPathRecursive(srcPoint, destPoint, srcOrientation, destOrientation, canvas, dpDict);\n        if (!middlePath) {\n            // try with destinatino as source.\n            middlePath = Utils.getOptimalPathRecursive(destPoint, srcPoint, destOrientation, srcOrientation, canvas, dpDict);\n            if (!middlePath) {\n                return [null, 'Optimal paths could not be found. Try adjusting some of the components.'];\n            }\n            middlePath = middlePath.reverse();\n        }\n        const result = new Path([src, ...middlePath.getAllPoints(), dest]);\n        result.simplify();\n        return [result, null];\n    }\n\n    /**\n     * Checks if there are any overlapping bounding boxes on the canvas\n     * Returns false if none found, else true and the two overlapping elements\n     * @param canvas: canvas\n     */\n    static isCanvasInvalid(canvas: Canvas): [boolean, CanvasElement, CanvasElement] {\n        const elements = canvas.getParentBlocks();\n        for (let i = 0; i < elements.length; i++) {\n            for (let j = i + 1; j < elements.length; j++) {\n                if (CanvasUtils.doElementsIntersect(elements[i], elements[j])[0]) {\n                    return [true, elements[i], elements[j]];\n                }\n            }\n        }\n        return [false, null, null];\n    }\n\n    /**\n     * Returns the direct path between src and dest if possible\n     *  src (x)---------------\n     *                       |\n     *                  dest(x)\n     *\n     *          `OR`\n     *\n     *  src (x)\n     *       |\n     *       ---------dest(x)\n     * depending on the alignment\n     * @param src source\n     * @param dest destination\n     */\n    private static getDirectPaths(src: Point, dest: Point): Path[] {\n        if (CanvasUtils.arePointsAligned(src, dest)) {\n            return [new Path([src, dest])];\n        }\n        const point1 = new Point(src.getX(), dest.getY());\n        const point2 = new Point(dest.getX(), src.getY());\n\n        return [new Path([src, point1, dest]), new Path([src, point2, dest])];\n    }\n\n    /**\n     * Checks if there's an obstacle between the source and destination 2-turn path\n     * Returns true/false with the line on the path which is facing obstacle and the element which is the blocker\n     * @param path path\n     * @param canvas canvas element\n     */\n    static checkObstacles(path: Path, canvas: Canvas): [boolean, Line, CanvasElement] {\n        for (const element of canvas.getElements()) {\n            const boundary = CanvasUtils.getBoundary(element);\n            const [isSuperImpose, superImposingLineOfPath, superImposingLineOfBoundary] = path.doesPathSuperimpose(boundary);\n            if (isSuperImpose) {\n                return [true, superImposingLineOfPath, element];\n            }\n            if (element instanceof Block) {\n                const [isIntersect, pathLine, blockLine] = CanvasUtils.doElementsIntersect(element, path);\n                if (isIntersect) {\n                    return [true, pathLine, element];\n                }\n            }\n        }\n\n        return [false, null, null];\n    }\n\n    /**\n     * Returns the possible intermediary horizontal/vertical lines between the source and destination\n     * @param point1 source\n     * @param point2 destination\n     * @param canvas canvas\n     * @param isHorizontal preferred alignment of the path wrt source\n     */\n    static getIntermediaryLines(point1: Point, point2: Point, canvas: Canvas, isHorizontal: boolean): [Line[], boolean] {\n        // TODO: refactor function for readability\n        const result = [];\n        const block = new Block(point1, point2);\n        const [minX, maxX, minY, maxY] = [block.getMinX(), block.getMaxX(), block.getMinY(), block.getMaxY()];\n        const subCanvas = CanvasUtils.getSubCanvasIntersectingCanvas(canvas, new Block(point1, point2));\n\n        const tryHorizontal = () => {\n            // console.log('Trying horizontal lines..');\n            const srcLine = new Path([point1, new Point(point1.getX(), point2.getY())]);\n            const destLine = new Path([point2, new Point(point2.getX(), point1.getY())]);\n            const tryYRange = (yMin: number, yMax: number) => {\n                for (const y of _.range(yMin, yMax, DELTA_DISTANCE)) {\n                    const line = new Line(new Point(minX, y), new Point(maxX, y));\n                    const pathToCheck  = Path.loadFromLine(line);\n\n                    const [isObstacle, obstacleLine, canvasEl] = Utils.checkObstacles(pathToCheck, subCanvas);\n\n                    if (!isObstacle) {\n                        result.push(line);\n                        continue;\n                    }\n\n                    if (canvasEl instanceof Block) {\n                        let [isIntersect, dummy1, dummy2] = CanvasUtils.doElementsIntersect(canvasEl, destLine);\n                        if (isIntersect) {\n                            result.splice(0, result.length);\n                            continue;\n                        }\n                        [isIntersect, dummy1, dummy2] = CanvasUtils.doElementsIntersect(canvasEl, srcLine);\n                        if (isIntersect) {\n                            break;\n                        }\n                    }\n                }\n            };\n            tryYRange(minY + DELTA_DISTANCE, maxY);\n            let trials = 1;\n            let [prevMin, prevMax] = [minY, maxY + DELTA_DISTANCE];\n            while (result.length === 0 && trials < 40) {\n                // console.log('Trying horizontal lines.. with trials, ', trials);\n                const currMin = prevMin - trials * DELTA_DISTANCE;\n                const currMax = prevMax + trials * DELTA_DISTANCE;\n                tryYRange(currMin, prevMin);\n                if (result.length > 0) {\n                    break;\n                }\n                tryYRange(prevMax, currMax);\n                [prevMin, prevMax] = [currMin, currMax];\n                trials++;\n            }\n        };\n\n        const tryVertical = () => {\n            const srcLine = new Path([point1, new Point(point2.getX(), point1.getY())]);\n            const destLine = new Path([point2, new Point(point1.getX(), point2.getY())]);\n            const tryXRange = (xMin: number, xMax: number) => {\n                for (const x of _.range(xMin, xMax, DELTA_DISTANCE)) {\n                    const line = new Line(new Point(x, minY), new Point(x, maxY));\n                    const pathToCheck  = Path.loadFromLine(line);\n                    const [isObstacle, obstacleLine, canvasEl] = Utils.checkObstacles(pathToCheck, subCanvas);\n\n                    if (!isObstacle) {\n                        result.push(line);\n                        continue;\n                    }\n\n                    if (canvasEl instanceof Block) {\n                        let [isIntersect, dummy1, dummy2] = CanvasUtils.doElementsIntersect(canvasEl, destLine);\n                        if (isIntersect) {\n                            result.splice(0, result.length);\n                            continue;\n                        }\n                        [isIntersect, dummy1, dummy2] = CanvasUtils.doElementsIntersect(canvasEl, srcLine);\n                        if (isIntersect) {\n                            break;\n                        }\n                    }\n                }\n            };\n\n            tryXRange(minX + DELTA_DISTANCE, maxX);\n            let trials = 1;\n            let [prevMin, prevMax] = [minX, maxX + DELTA_DISTANCE];\n            while (result.length === 0 && trials < 40) {\n                const currMin = prevMin - trials * DELTA_DISTANCE;\n                const currMax = prevMax + trials * DELTA_DISTANCE;\n                tryXRange(currMin, prevMin);\n                if (result.length > 0) {\n                    break;\n                }\n                tryXRange(prevMax, currMax);\n                [prevMin, prevMax] = [currMin, currMax];\n                trials++;\n            }\n        };\n\n        const trySequence = isHorizontal ? [tryHorizontal, tryVertical] : [tryVertical, tryHorizontal];\n\n        trySequence[0]();\n        if (result.length === 0) {\n            trySequence[1]();\n        }\n\n        return [result, isHorizontal];\n    }\n\n    /**\n     * chooses the line while optimizing for the elegant layout\n     * @param lineList list of lines\n     * @param isOrientationHorizontal orientation of the lines\n     */\n    static chooseLine(lineList: Line[], isOrientationHorizontal: boolean): Line {\n        // split into ranges\n        const getProperty = isOrientationHorizontal ? Point.prototype.getY : Point.prototype.getX;\n\n        const ranges: Line[][] = [];\n\n        let currLine: Line;\n        let currProperty: number;\n\n        let prevLine = lineList[0];\n        let prevProperty = getProperty.call(prevLine.getPoint1());\n        let row: Line[] = [];\n\n        for (let i = 1; i < lineList.length;) {\n            row = [prevLine];\n            while (i < lineList.length) {\n                currLine = lineList[i];\n                currProperty = getProperty.call(currLine.getPoint1());\n                prevLine = currLine;\n                i++;\n\n                if (MathHelper.areNumbersClose(currProperty, prevProperty + DELTA_DISTANCE)) {\n                    row.push(currLine);\n                    prevProperty = currProperty;\n                } else {\n                    ranges.push(row);\n                    prevProperty = currProperty;\n                    break;\n                }\n\n            }\n        }\n        ranges.push(row);\n\n        // choose the widest range\n        const widestRange = _.maxBy(ranges, range => range.length);\n        return widestRange[Math.floor(widestRange.length / 2)];\n    }\n\n    /**\n     * Calculates a point away from the parent block to start the path with\n     * @param point origin point\n     * @param parentBlock parent block of the point\n     * @param canvas canvas\n     */\n    static getPointAwayFromPort(point: Point, parentBlock: Block, canvas: Canvas): Point {\n        let result = parentBlock.getPointAwayFromPort(point, DELTA_DISTANCE);\n        while (CanvasUtils.doesPointLieOnCanvaspath(canvas, result)) {\n            result = parentBlock.getPointAwayFromPort(result, DELTA_DISTANCE);\n        }\n        return result;\n    }\n\n    /**\n     * Returns the optimal path recursively with specified maximum recursion depth\n     * @param src source point\n     * @param dest destination point\n     * @param srcOrientation orientation of the source point wrt its parent\n     * @param destOrientation orientation of  the destination point wrt its parent\n     * @param canvas canvas\n     * @param dpDict cached dictionary of paths calculated in previous recursions\n     * @param nRecursions max number of recursions allowed\n     */\n    private static getOptimalPathRecursive(src: Point, dest: Point, srcOrientation: Orientation,\n                                           destOrientation: Orientation, canvas: Canvas, dpDict: {[key: string]: Path} = {},\n                                           nRecursions: number = 10): Path {\n        // console.log(\"Recursion number: \", nRecursions);\n        const directPaths = Utils.getDirectPaths(src, dest);\n\n        // sorting possible direct paths based on orientation of source and destination\n        directPaths.sort((path1, path2) => {\n            const orientation1 = path1.getFirstVectorOrientation();\n            const orientation2 = path2.getFirstVectorOrientation();\n\n            const diff1 = MathHelper.modulo(orientation1 - srcOrientation, 360);\n            const diff2 = MathHelper.modulo(orientation2 - srcOrientation, 360);\n\n            return PATH_PRIORITY[diff1] > PATH_PRIORITY[diff2] ? 1 : -1;\n        });\n\n        let lineWithObstacle: Line;\n        let isObstacle: boolean;\n        let canvasEl: CanvasElement;\n\n        for (const path of directPaths) {\n            [isObstacle, lineWithObstacle, canvasEl] = Utils.checkObstacles(path, canvas);\n            if (!isObstacle) {\n                return path;\n            }\n        }\n\n        // no simple path found..\n        let isObstacleOnHorizontalAxis = lineWithObstacle.isHorizontal();\n        let lineList = [];\n        [lineList, isObstacleOnHorizontalAxis] = Utils.getIntermediaryLines(src, dest, canvas, isObstacleOnHorizontalAxis);\n\n        // if (lineList.length === 0) {\n        //     isObstacleOnHorizontalAxis = !isObstacleOnHorizontalAxis;\n        //     lineList = Utils.getIntermediaryLines(src, dest, canvas, isObstacleOnHorizontalAxis);\n        if (lineList.length === 0) {\n            return null;\n        }\n        // }\n        let resultPath: Path;\n\n        const chosenLine = Utils.chooseLine(lineList, isObstacleOnHorizontalAxis);\n        if (chosenLine) {\n            const [chosenPoint1, chosenPoint2] = chosenLine.getEnds();\n\n            /// TODO: refactor following statements\n            if (isObstacleOnHorizontalAxis) {\n                if (chosenPoint1.getX() === src.getX()) {\n                    resultPath = new Path([src, chosenPoint1, chosenPoint2, dest]);\n                } else if (chosenPoint2.getX() === src.getX()) {\n                    resultPath = new Path([src, chosenPoint2, chosenPoint1, dest]);\n                }\n            } else {\n                if (chosenPoint1.getY() === src.getY()) {\n                    resultPath = new Path([src, chosenPoint1, chosenPoint2, dest]);\n                } else if (chosenPoint2.getY() === src.getY()) {\n                    resultPath = new Path([src, chosenPoint2, chosenPoint1, dest]);\n                }\n            }\n\n            if (resultPath) {\n                const [areObstacles, obstaclePath, canvasEl1] = Utils.checkObstacles(resultPath, canvas);\n                if (!areObstacles) {\n                    return resultPath;\n                }\n            }\n        }\n\n        if (nRecursions < 0) {\n            // console.log('Max recursions reached.');\n            return;\n        }\n\n        const srcDestOrientation = dest.subtract(src).getApproxOrientation();\n        let directions: Orientation[];\n\n        const deltaOrientation = Math.abs(srcDestOrientation - srcOrientation);\n\n        if (deltaOrientation === 180) {\n            directions = [srcOrientation,\n                          OrientationUtil.addOrientations(srcDestOrientation, 90),\n                          OrientationUtil.subtractOrientations(srcDestOrientation, 90),\n                          srcDestOrientation];\n        } else if ([90, 270].includes(deltaOrientation)) {\n            directions = [srcOrientation,\n                          srcDestOrientation,\n                          OrientationUtil.addOrientations(srcDestOrientation, 180),\n                          OrientationUtil.addOrientations(srcOrientation, 180)];\n        } else {\n            directions = [\n                srcOrientation,\n                OrientationUtil.subtractOrientations(srcOrientation, 90),\n                OrientationUtil.addOrientations(srcOrientation, 90),\n                OrientationUtil.addOrientations(srcOrientation, 180),\n            ];\n        }\n        // directions = directions.filter(dir => dir !== srcOrientation);\n\n        for (const direction of directions) {\n            const step = OrientationUtil.getUnitVector(direction).multiply(1 * DELTA_DISTANCE);\n            const newSource = Point.loadFromVector(src.getVector().add(step));\n            resultPath = new Path([src, newSource]);\n            const [isInvalid, dummy1, dummy2] = Utils.checkObstacles(resultPath, canvas);\n            if (!isInvalid) {\n                const key = `${newSource}:${dest}`;\n                if (!dpDict.hasOwnProperty(key)) {\n                    dpDict[key] = Utils.getOptimalPathRecursive(newSource, dest, direction, destOrientation, canvas,\n                                                                  dpDict, nRecursions - 1);\n                }\n                const recursivePath = dpDict[key];\n                if (recursivePath) {\n                    return resultPath.addPath(recursivePath);\n                }\n            }\n            continue;\n        }\n    }\n}\n\n// function test() {\n//     const point1 = new Point(0, 0);\n//     let block1 = new Block(new Point(-20, 20), new Point(0, -20));\n\n//     const point2 = new Point(100, 100);\n//     let block2 = new Block(new Point(110, 100), new Point(90, 120));\n\n//     const canvas = new Canvas();\n//     canvas.addElement(block1);\n//     canvas.addElement(block2);\n\n//     // Test 1\n//     let path = Utils.getOptimalPath(point1, point2, block1, block2, canvas);\n//     // console.log(path);\n\n//     // Test 2\n//     canvas.removeElement(block2);\n//     block2 = new Block(new Point(100, 80), new Point(120, 120));\n//     canvas.addElement(block2);\n//     path = Utils.getOptimalPath(point1, point2, block1, block2, canvas);\n//     // console.log(path);\n\n//     // Test 3\n//     canvas.removeElement(block2);\n//     block2 = new Block(new Point(100, 80), new Point(120, 120));\n//     canvas.addElement(block2);\n//     path = Utils.getOptimalPath(point1, point2, block1, block2, canvas);\n//     // console.log(path);\n\n//     // Test 4\n//     canvas.removeElement(block2);\n//     block2 = new Block(new Point(90, 100), new Point(110, 80));\n//     canvas.addElement(block2);\n//     path = Utils.getOptimalPath(point1, point2, block1, block2, canvas);\n//     // console.log(path);\n\n//     // Test 5\n//     canvas.removeElement(block2);\n//     block2 = new Block(new Point(100, 120), new Point(80, 80));\n//     canvas.addElement(block2);\n//     path = Utils.getOptimalPath(point1, point2, block1, block2, canvas);\n//     // console.log(path);\n\n//     // Test 5\n//     canvas.removeElement(block1);\n//     block1 = new Block(new Point(0, 20), new Point(20, -20));\n//     canvas.addElement(block1);\n//     path = Utils.getOptimalPath(point1, point2, block1, block2, canvas);\n//     console.log(path);\n// }\n\n\n// function test2() {\n//     const point1 = new Point(168.53, 204);\n//     let block1 = new Block(new Point(157.53, 109), new Point(181.53, 209));\n\n//     const point2 = new Point(292, 331);\n//     let block2 = new Block(new Point(150, 309), new Point(645, 639));\n\n//     const canvas = new Canvas();\n//     canvas.addElement(block1);\n//     canvas.addElement(block2);\n\n//     // Test 1\n//     let path = Utils.getOptimalPath(point1, point2, block1, block2, canvas);\n//     console.log(path);\n// }\n\n// function test3() {\n//     const points = [\n//         new Point(0, 0),\n//         new Point(5, 0),\n//         new Point(5, 5),\n//         new Point(3, 5),\n//         new Point(3, -2)\n//     ];\n//     const path = new Path(points);\n//     console.log(path.toString());\n//     path.simplify();\n//     console.log(path.toString());\n// }\n\n// test3();\n"
  },
  {
    "path": "ArduinoFrontend/src/app/lti-form/lti-form.component.css",
    "content": "form {\n\tmargin: 30px;\n}\n\nmat-form-field {\n\twidth: 100%;\n}\n\n.code-weight {\n\tpadding-top: 25pt;\n}\n\n.form-buttons {\n\tpadding: 10px;\n}\n\n.form-buttons > button {\n\twidth: 200px;\n\tmargin: 5px;\n}\n\n.url-error-div {\n\tpadding: 20px;\n}\n\n#lti-url {\n\tresize: none;\n\twidth: 75%;\n\tpadding-left: 10px;\n\tpadding-bottom: 0px;\n}\n\n#copy-button {\n\tpadding: 0px;\n\tborder-width: 0px;\n\tmargin: 0px;\n}"
  },
  {
    "path": "ArduinoFrontend/src/app/lti-form/lti-form.component.html",
    "content": "<app-header title=\"Create LTI App\"></app-header>\n<h3 *ngIf=\"modelCircuit\" class=\"text-dark\"\n  style=\"text-align:center;\">LTI App for {{modelCircuit.name}}</h3>\n<div class=\"row mx-3\">\n  <div class=\"col-md-6\">\n  <div class=\"card bg-light mt-2\" *ngIf=\"modelCircuit\">\n    <div class=\"card-header\">\n      <h4 class=\"float-left\">Model Circuit/Simulation</h4>\n      <button class=\"float-right\" type=\"button\" mat-icon-button matTooltip=\"{{ modelCircuit.description }}\">\n        <h5><i class=\"fas fa-info-circle\"></i></h5>\n      </button>\n    </div>\n    <img class=\"img-fluid\" [attr.src]=\"modelCircuit.base64_image\" />\n    <ul class=\"list-group list-group-flush text-secondary\">\n      <li class=\"list-group-item\"><b>Branch:</b> {{ modelCircuit.branch }}</li>\n      <li class=\"list-group-item\"><b>Version:</b> {{ modelCircuit.version }}</li>\n    </ul>\n    <div class=\"card-footer\">\n      <p class=\"card-text\"><small class=\"text-muted\">Last Modified: {{ getFormattedDate(modelCircuit.save_time)\n          }}</small></p>\n    </div>\n  </div>\n  </div>\n  <div class=\"col-md-6\">\n  <div class=\"card bg-light mt-2\" *ngIf=\"studentCircuit\">\n    <div class=\"card-header\">\n      <h4 class=\"float-left\">Student Circuit/Simulation</h4>\n      <button class=\"float-right\" type=\"button\" mat-icon-button matTooltip=\"{{ modelCircuit.description }}\">\n        <h5><i class=\"fas fa-info-circle\"></i></h5>\n      </button>\n    </div>\n    <img class=\"card-img-top\" [attr.src]=\"studentCircuit.base64_image\" />\n    <ul class=\"list-group list-group-flush text-secondary\">\n      <li class=\"list-group-item\"><b>Branch:</b> {{ studentCircuit.branch }}</li>\n      <li class=\"list-group-item\"><b>Version:</b> {{ studentCircuit.version }}</li>\n      <!-- <li class=\"list-group-item\">\n        <mat-checkbox [(ngModel)]=\"viewCodeCheckBox\" (change)=\"toggleViewCode($event)\">\n          <b>Show Code</b>\n        </mat-checkbox>\n         <app-view-code *ngIf=\"studentCodeView\" [id]=\"studentCircuit.save_id\" [branch]=\"studentCircuit.branch\"\n          [version]=\"studentCircuit.version\"></app-view-code> \n      </li> -->\n    </ul>\n    <div class=\"card-footer\">\n      <p class=\"card-text\"><small class=\"text-muted\">Last Modified: {{ getFormattedDate(studentCircuit.save_time)\n          }}</small></p>\n    </div>\n  </div>\n</div>\n</div>\n<form [formGroup]=\"form\">\n  <div class=\"row\">\n    <div class=\"col-md-4\">\n      <mat-form-field>\n        <input formControlName=\"consumer_key\" matInput placeholder=\"Consumer Key\" required />\n        <mat-hint>Should not contain any spaces</mat-hint>\n        <mat-error *ngIf=\"form.controls['consumer_key'].errors?.required\">This field is mandatory</mat-error>\n        <mat-error *ngIf=\"form.controls['consumer_key'].errors?.minlength\">String should be atleast 2\n          characters long</mat-error>\n      </mat-form-field>\n      <mat-form-field>\n        <mat-select formControlName=\"initial_schematic\" matInput required placeholder=\"Students's Circuit/Simulation\"\n          [compareWith]=\"compareIds\" (selectionChange)=\"onStudentSelectChanges($event)\">\n          <mat-option>\n            None\n          </mat-option>\n          <ng-container *ngFor=\"let circuit of circuits\">\n            <mat-option [value]=\"circuit.id\">{{ circuit.name }} of variation {{ circuit.branch }} saved at {{\n              getFormattedDate(circuit.save_time) }}\n            </mat-option>\n          </ng-container>\n        </mat-select>\n        <mat-error>This field is mandatory</mat-error>\n      </mat-form-field>\n      <mat-form-field>\n        <mat-select formControlName=\"model_schematic\" matInput required placeholder=\"Teacher's Circuit/Simulation\"\n          [compareWith]=\"compareIds\" (selectionChange)=\"onModelCircuitChange($event)\">\n          <mat-option>\n            None\n          </mat-option>\n          <ng-container *ngFor=\"let ckt of circuits\">\n            <mat-option [value]=\"ckt.id\">{{ ckt.name }} of variation {{ ckt.branch }} saved at {{\n              getFormattedDate(ckt.save_time) }}\n            </mat-option>\n          </ng-container>\n        </mat-select>\n        <mat-error *ngIf=\"form.controls['model_schematic'].errors?.required\">This field is mandatory</mat-error>\n      </mat-form-field>\n    </div>\n    <div class=\"col-md-4\">\n      <mat-form-field>\n        <input autocomplete=\"false\" formControlName=\"secret_key\" matInput placeholder=\"Secret Key\"\n          [type]=\"hide ? 'password' : 'text'\" required>\n        <mat-icon matSuffix (click)=\"hide = !hide\">{{hide ? 'visibility_off' : 'visibility'}}</mat-icon>\n        <mat-error *ngIf=\"form.controls['secret_key'].errors?.required\">This field is mandatory</mat-error>\n        <mat-error *ngIf=\"form.controls['secret_key'].errors?.minlength\">String should be atleast 2 characters\n          long</mat-error>\n      </mat-form-field>\n      <mat-form-field>\n        <mat-select formControlName=\"test_case\" matInput placeholder=\"Test Case\"\n          [compareWith]=\"compareIds\" (selectionChange)=\"ontestCaseSelectChanges($event)\">\n          <mat-option>\n            None\n          </mat-option>\n          <ng-container *ngFor=\"let test_case of testCases; let i = index\">\n            <mat-option [value]=\"test_case.id\">Test Case {{i+1}} ({{test_case.length}} data points)</mat-option>\n          </ng-container>\n        </mat-select>   \n      </mat-form-field>\n      <mat-form-field>\n        <input type =\"number\" formControlName=\"con_weightage\" matInput placeholder=\"Connection Weightage (0-100%)\" required (input)=\"conCodeWeight($event)\"/>\n        <mat-error *ngIf=\"form.controls['con_weightage'].errors?.required\">This field is mandatory</mat-error>\n        <mat-error *ngIf=\"form.controls['con_weightage'].errors?.min || form.controls['con_weightage'].errors?.max\">\n          Value should be between 0 and 100</mat-error>\n      </mat-form-field>\n    </div>\n    <div class=\"col-md-4\">\n      <mat-form-field>\n        <input formControlName=\"score\" matInput placeholder=\"Score (0-1)\" required />\n        <mat-error *ngIf=\"form.controls['score'].errors?.required\">This field is mandatory</mat-error>\n        <mat-error *ngIf=\"form.controls['score'].errors?.min || form.controls['score'].errors?.max\">\n          Value should be between 0 and 1</mat-error>\n      </mat-form-field>\n      <div class=\"row\">\n        <div class=\"check-box-spacing col-sm-7\">\n          <mat-checkbox formControlName=\"scored\">\n            <b>Accept Submissions</b>\n          </mat-checkbox>\n        </div>\n        <div class=\"check-box-spacing col-md-4 col-sm-9\">\n          <mat-checkbox formControlName=\"viewCode\">\n            <b>Show Code</b>\n          </mat-checkbox>\n        </div>\n      </div>\n      <mat-form-field class=\"code-weight\">\n        <input formControlName=\"code_weightage\" matInput placeholder=\"Code Weightage (0-100%)\" readonly/>\n      </mat-form-field>\n    </div>\n  </div>\n  <div class=\"form-buttons\">\n    <button class=\"ml-5\" mat-raised-button color=\"primary\" type=\"submit\" (click)=\"onSubmit()\"\n      *ngIf=\"!details.configExists\" [disabled]=\"form.invalid\">SAVE</button>\n    <button class=\"ml-5\" mat-raised-button color=\"primary\" type=\"submit\" (click)=\"onUpdate()\"\n      *ngIf=\"details.configExists\" [disabled]=\"form.invalid\">UPDATE</button>\n    <button class=\"ml-5\" mat-raised-button color=\"warn\" type=\"button\" *ngIf=\"details.configExists\"\n      (click)=\"onDelete()\">DELETE</button>\n    <button class=\"ml-5\" mat-raised-button color=\"primary\" type=\"button\" [routerLink]=\"['/submissions']\"\n      [queryParams]=\"{id: modelCircuit.save_id, branch: modelCircuit.branch, version: modelCircuit.version, scored: details.scored, lti: lti}\"\n      *ngIf=\"details.configExists && details.scored\">SUBMISSIONS</button>\n    <button class=\"ml-5\" mat-raised-button color=\"primary\" type=\"button\" [routerLink]=\"['/dashboard']\">GO TO\n      DASHBOARD</button>\n  </div>\n</form>\n<div class=\"url-error-div\">\n  <div *ngIf=\"details.consumerError\" class=\"text-danger\">\n    <p>{{ details.consumerError }}</p>\n    <p *ngIf=\"!details.consumerError\"></p>\n  </div>\n  <div *ngIf=\"details.configExists\" class=\"input-group d-flex justify-content-center\">\n    <div class=\"input-group-prepend\">\n      <span class=\"input-group-text\">Config URL</span>\n    </div>\n    <textarea type=\"text\" id=\"lti-url\" rows=\"1\" aria-describedby=\"copy-button\">{{ configUrl }}</textarea>\n    <button type=\"button\" (click)=\"copyURL()\" id=\"copy-button\" [matTooltip]=\"copyTooltip ? 'Copied' : ''\">\n      <i class=\"fas fa-clipboard input-group-text\"></i>\n    </button>\n  </div>\n</div>"
  },
  {
    "path": "ArduinoFrontend/src/app/lti-form/lti-form.component.ts",
    "content": "import { Component, OnInit } from '@angular/core';\nimport { ApiService } from '../api.service';\nimport { AlertService } from '../alert/alert-service/alert.service';\nimport { Login } from '../Libs/Login';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { FormGroup, FormControl, Validators } from '@angular/forms';\nimport { environment } from 'src/environments/environment';\n\n/**\n * Interface to store relevant circuit data\n */\nexport interface Circuit {\n  id: number;\n  branch: string;\n  version: string;\n  lti: string;\n  image: string;\n  description: string;\n  save_id: string;\n}\n\n/**\n * Interface to store LTI Details\n */\nexport interface LTIDetails {\n  secret_key: string;\n  consumer_key: string;\n  config_url: string;\n  configExists: boolean;\n  consumerError: string;\n  score: number;\n  initial_schematic: number;\n  model_schematic: number;\n  test_case: string;\n  scored: boolean;\n  id: string;\n  sim_params: string[];\n  view_code: boolean;\n  con_weightage: number;\n  code_weightage: number;\n}\n\n/**\n * Class for LTI Form\n */\n@Component({\n  selector: 'app-lti-form',\n  templateUrl: './lti-form.component.html',\n  styleUrls: ['./lti-form.component.css']\n})\nexport class LTIFormComponent implements OnInit {\n\n  /**\n   * LTI Form Component Constructor\n   * @param api API service for api calls\n   * @param router Router to navigate\n   * @param aroute Activated Route\n   */\n  constructor(\n    public api: ApiService,\n    private router: Router,\n    private aroute: ActivatedRoute,\n  ) {\n  }\n\n  /**\n   * Toggles input type of secret key form-field\n   */\n  hide = true;\n  /**\n   * stores relevant data of model circuit chosen\n   */\n  modelCircuit: Circuit;\n  /**\n   * stores relevant data of student/initial circuit chosen\n   */\n  studentCircuit: Circuit;\n  /**\n   * circuit id of the circuit received from query parameters\n   */\n  circuitId: string = null;\n  /**\n   * branch of the circuit received from query parameters\n   */\n  branch = '';\n  /**\n   * version of the circuit received from query parameters\n   */\n  version = '';\n  /**\n   * LTI ID of the circuit received from query parameters\n   */\n  lti: string = null;\n  /**\n   * Show/Hide Tooltip\n   */\n  copyTooltip = false;\n  /**\n   * Stores all versions of the circuit\n   */\n  circuits: any[];\n  /**\n   * Stores all test cases applicable for the circuit\n   */\n  testCases: any[] = [];\n  /**\n   * Stores config url shown in text box\n   */\n  configUrl = '';\n  /**\n   * Status of view code checkbox\n   */\n  viewCodeCheckBox = false;\n  /**\n   * Stores LTI details recieved from backend and the LTI Form\n   */\n  details: LTIDetails = {\n    secret_key: '',\n    consumer_key: '',\n    config_url: '',\n    configExists: false,\n    consumerError: '',\n    score: 0,\n    initial_schematic: 0,\n    model_schematic: 0,\n    test_case: null,\n    scored: false,\n    id: '',\n    sim_params: [],\n    view_code: false,\n    con_weightage: 60,\n    code_weightage: 40\n  };\n\n  /**\n   * Defines LTI Form Controls and Validators\n   */\n  form: FormGroup = new FormGroup({\n    consumer_key: new FormControl('', [Validators.required, Validators.minLength(2)]),\n    secret_key: new FormControl('', [Validators.required, Validators.minLength(2)]),\n    score: new FormControl(0, [Validators.required, Validators.min(0), Validators.max(1)]),\n    con_weightage: new FormControl(60, [Validators.required, Validators.min(0), Validators.max(100)]),\n    code_weightage: new FormControl(40),\n    test_case: new FormControl(''),\n    initial_schematic: new FormControl(0, Validators.required),\n    model_schematic: new FormControl(0, Validators.required),\n    scored: new FormControl(true),\n    viewCode: new FormControl(false)\n  });\n\n  /**\n   * On Init Callback\n   */\n  ngOnInit() {\n    document.documentElement.style.overflow = 'auto';\n    document.title = 'LTI | Arduino on Cloud';\n    this.aroute.queryParams.subscribe(v => {\n      // if project id is present and no query parameter then redirect to dashboard\n      const token = Login.getToken();\n      if (Object.keys(v).length === 0 && this.circuitId || !token) {\n        setTimeout(() => this.router.navigate(['dashboard'])\n          , 100);\n        return;\n      }\n      this.circuitId = v.id;\n      this.branch = v.branch;\n      this.version = v.version;\n      this.lti = v.lti;\n      this.onClear();\n      if (this.lti) {\n        this.details.id = this.lti;\n        // Get details of the LTI App.\n        this.api.ArduinoexistLTIURL(this.circuitId, token).subscribe(res => {\n          // Switch to the branch and version of the existing LTI App\n          if (res['model_schematic'].branch !== this.branch || res['model_schematic'].version !== this.version) {\n            this.router.navigate(\n              [],\n              {\n                relativeTo: this.aroute,\n                queryParams: {\n                  id: this.circuitId,\n                  branch: res['model_schematic'].branch,\n                  version: res['model_schematic'].version,\n                  lti: this.lti,\n                },\n              });\n          }\n          this.modelCircuit = res['model_schematic'];\n          this.studentCircuit = res['initial_schematic'];\n          res['initial_schematic'] = this.studentCircuit.id;\n          res['model_schematic'] = this.modelCircuit.id;\n          if (!environment.production) {\n            this.modelCircuit['base64_image'] = environment.API_URL + this.modelCircuit['base64_image'];\n            this.studentCircuit['base64_image'] = environment.API_URL + this.studentCircuit['base64_image'];\n          }\n          this.setForm(res);\n          this.details = {\n            ...this.form.value,\n            model_schematic: res['model_schematic'],\n            config_url: res['config_url'],\n            consumerError: '',\n            configExists: true,\n            view_code: res['view_code']\n          };\n          this.getAllVersions();\n          this.getTestCases();\n          this.configUrl = this.details.config_url;\n        }, err => {\n          if (err.status === 404) {\n            this.details.configExists = false;\n          }\n          console.log(err);\n          this.getAllVersions();\n        });\n      } else {\n        this.details.configExists = false;\n        this.getAllVersions();\n        this.getTestCases();\n        this.form.get('con_weightage').setValue(this.details.con_weightage);\n        this.form.get('code_weightage').setValue(this.details.code_weightage);\n      }\n    });\n  }\n\n  /**\n   * Sets the form fields as set in the supplied object\n   * @param res Object with interface similar to form property\n   */\n  setForm(res: any) {\n    this.form.setValue({\n      consumer_key: res['consumer_key'],\n      secret_key: res['secret_key'],\n      score: parseFloat(res['score']),\n      // score: res['score'] ? 1 : 0,\n      initial_schematic: parseInt(res['initial_schematic'], 10),\n      model_schematic: parseInt(res['model_schematic'], 10),\n      test_case: res['test_case'],\n      scored: res['scored'],\n      con_weightage: res['con_weightage'],\n      code_weightage: 100 - res['con_weightage'],\n      viewCode: res['view_code']\n    });\n  }\n\n  gettestCaseSelectChange(value) {\n    this.details.test_case = value;\n  }\n\n  /**\n   * Called on changing option in select form field for test case\n   * @param event Event data on changing select form field for test case\n   */\n  ontestCaseSelectChanges(event) {\n    this.gettestCaseSelectChange(event.value);\n  }\n\n  getModelCircuitChange(value) {\n    this.modelCircuit = value ? this.circuits.filter(v => v.id === parseInt(value, 10))[0] : undefined;\n    this.getTestCases();\n  }\n\n  onModelCircuitChange(event) {\n    this.getModelCircuitChange(event.value);\n  }\n\n  /**\n   * Sets the student circuit of the LTI form\n   * @param value id of the circuit to be set as initial/student circuit\n   * @param callback function called after retrieving the intended circuit\n   */\n  getStudentSimulation(value) {\n    this.studentCircuit = value ? this.circuits.filter(v => v.id === parseInt(value, 10))[0] : undefined;\n  }\n\n  /**\n   * Called on changing option in select form field for student simulation\n   * @param event Event data on changing select form field for student simulation\n   */\n  onStudentSelectChanges(event) {\n    this.getStudentSimulation(event.value);\n  }\n\n\n  conCodeWeight(event) {\n    this.details.code_weightage = 100 - this.form.value.con_weightage;\n    this.form.get('code_weightage').setValue(100 - this.form.value.con_weightage);\n  }\n\n  /**\n   * Called on clicking Save button from LTI Form\n   */\n  onSubmit() {\n    if (this.form.valid) {\n      if (!this.details.scored) {\n        this.details.score = null;\n      }\n      this.details = {\n        ...this.details,\n        ...this.form.value,\n        scored: this.form.value.scored ? true : false,\n        view_code: this.form.value.viewCode ? true : false,\n        model_schematic: this.modelCircuit.id,\n        test_case: this.form.value.test_case ? this.form.value.test_case : null,\n        score: this.form.value.score,\n        con_weightage: this.form.value.con_weightage,\n        configExists: false,\n      };\n      const token = Login.getToken();\n      if (token) {\n        const data = { ...this.details };\n        delete data['configExists'];\n        delete data['config_url'];\n        delete data['consumerError'];\n        delete data['id'];\n        this.api.saveArduinoLTIDetails(token, data).subscribe(res => {\n          this.setForm(res);\n          this.details = {\n            ...this.form.value,\n            initial_schematic: res['initial_schematic'],\n            id: res['id'],\n            model_schematic: res['model_schematic'],\n            config_url: res['config_url'],\n            configExists: true,\n            consumerError: '',\n          };\n          this.lti = res['id'];\n          this.configUrl = this.details.config_url;\n          this.router.navigate(\n            [],\n            {\n              relativeTo: this.aroute,\n              queryParams: {\n                id: this.modelCircuit.save_id,\n                branch: this.modelCircuit.branch,\n                version: this.modelCircuit.version,\n                lti: this.lti,\n              },\n            });\n        }, err => {\n          console.log(err);\n          this.setConsumerError(err);\n          this.details.configExists = false;\n        });\n      }\n    }\n  }\n\n  /**\n   * Called on clicking Delete button from LTI Form\n   */\n  onDelete() {\n    const token = Login.getToken();\n    if (token) {\n      this.api.removeArduinoLTIDetails(this.details.model_schematic, token).subscribe(res => {\n        this.details = {\n          ...this.details,\n          secret_key: '',\n          consumer_key: '',\n          config_url: '',\n          configExists: false,\n          consumerError: '',\n          score: 0,\n          test_case: null,\n          sim_params: [],\n          scored: false,\n          id: '',\n          view_code: false,\n          con_weightage: 60,\n          code_weightage: 40,\n        };\n        this.studentCircuit = undefined;\n        this.circuits = [];\n        this.configUrl = this.details.config_url;\n        this.router.navigate(\n          [],\n          {\n            relativeTo: this.aroute,\n            queryParams: {\n              id: this.modelCircuit.save_id,\n              branch: this.modelCircuit.branch,\n              version: this.modelCircuit.version,\n            },\n          });\n      }, err => {\n        console.log(err);\n        this.setConsumerError(err);\n        this.details.configExists = true;\n      });\n    }\n  }\n\n  /**\n   * Called on clicking Update button from LTI Form\n   */\n  onUpdate() {\n    const token = Login.getToken();\n    if (!this.form.valid && !token) {\n      return;\n    }\n    this.details = {\n      ...this.details,\n      ...this.form.value,\n      id: this.lti,\n      configExists: this.details.configExists,\n      model_schematic: this.modelCircuit.id,\n      test_case: this.details.test_case,\n      score: this.form.value.score,\n      sim_params: [],\n      view_code: this.form.value.viewCode ? true : false,\n      con_weightage: this.details.con_weightage\n    };\n    if (!this.details.scored) {\n      this.details.score = null;\n    }\n    const data = { ...this.details };\n    delete data['configExists'];\n    delete data['config_url'];\n    delete data['consumerError'];\n    this.api.updateArduinoLTIDetails(token, data).subscribe(res => {\n      this.setForm(res);\n      this.details = {\n        ...this.details,\n        ...this.form.value,\n        id: res['id'] ? res['id'] : this.lti,\n        model_schematic: parseInt(res['model_schematic'], 10),\n        config_url: res['config_url'] ? res['config_url'] : this.details.config_url,\n        configExists: true,\n        consumerError: '',\n      };\n      AlertService.showAlert('Details Updated Succesfully');\n      this.lti = res['id'];\n      this.configUrl = this.details.config_url;\n      this.router.navigate(\n        [],\n        {\n          relativeTo: this.aroute,\n          queryParams: {\n            id: this.modelCircuit.save_id,\n            branch: this.modelCircuit.branch,\n            version: this.modelCircuit.version,\n            lti: this.lti,\n          },\n        });\n    }, err => {\n      console.log(err);\n      this.setConsumerError(err);\n    });\n  }\n\n  /**\n   * Called to reset LTI Form\n   */\n  onClear() {\n    this.form.reset();\n  }\n\n  /**\n   * Set errors received from backend\n   */\n  setConsumerError(err) {\n    this.details.consumerError = '';\n    if (err.error) {\n      Object.keys(err.error).forEach(key => {\n        this.details.consumerError += `${key}:  `;\n        if (err.error) {\n          for (const e of err.error[key]) {\n            this.details.consumerError += e + '\\n';\n          }\n        }\n      });\n    } else {\n      this.details.consumerError = err.message;\n    }\n  }\n\n  /**\n   * Copies URL from the text box\n   */\n  copyURL() {\n    const copyUrl: HTMLTextAreaElement = document.querySelector('#lti-url');\n    this.copyTooltip = true;\n    copyUrl.select();\n    copyUrl.setSelectionRange(0, 99999);\n    document.execCommand('copy');\n  }\n\n  /**\n   * Get all variations of the circuit\n   */\n  getAllVersions() {\n    // get Auth token\n    const token = Login.getToken();\n    if (token) {\n      this.api.listAllVersions(this.circuitId, token).subscribe((v) => {\n        this.circuits = v;\n        if (this.modelCircuit) {\n          this.modelCircuit = this.circuits.filter(c => c.id === this.modelCircuit.id)[0];\n        } else {\n          this.modelCircuit = this.circuits.filter(c => c.branch === this.branch && c.version === this.version)[0];\n        }\n        // Splice the model circuit from the retrieved ones if required.\n      });\n    } else {\n      // if no token is present then show this message\n      AlertService.showAlert('Please Login to Continue');\n    }\n  }\n\n  getTestCases() {\n    // get Auth token\n    const token = Login.getToken();\n    const temp = [];\n    if (token) {\n      if (this.modelCircuit) {\n        this.api.getSimulationData(this.modelCircuit.save_id, this.modelCircuit.version, this.modelCircuit.branch, token).subscribe((v) => {\n          for (const val of v) {\n            const data = JSON.parse(val.result.replaceAll('\\'', '\\\"'));\n            const key = (Object.keys(data));\n            temp.push({id: val.id, length: data[key[0]]['length']});\n          }\n          this.testCases = temp;\n        }, err => {\n          this.testCases = null;\n        });\n      } else {\n        this.api.getSimulationData(this.circuitId, this.version, this.branch, token).subscribe((v) => {\n          for (const val of v) {\n            const data = JSON.parse(val.result.replaceAll('\\'', '\\\"'));\n            const key = (Object.keys(data));\n            temp.push({id: val.id, length: data[key[0]]['length']});\n          }\n          this.testCases = temp;\n        }, err => {\n          this.testCases = null;\n        });\n      }\n    } else {\n      // if no token is present then show this message\n      AlertService.showAlert('Please Login to Continue');\n    }\n  }\n\n\n  /**\n   * Comparing the circuits using their id field\n   * @param id1 Id of circuit selected\n   * @param id2 Id of the circuits from mat-option\n   * @returns boolean value whether ids are same or not\n   */\n  compareIds(id1, id2) {\n    return id1 && id2 && id1 === id2;\n  }\n\n  /**\n   * Converts date string in appropriate format\n   * @param date Date string returned by backend\n   * @returns date string in human readable format\n   */\n  getFormattedDate(date: string) {\n    const dateObj = new Date(date);\n    let str = `${dateObj.getDate()}/${dateObj.getMonth()}/${dateObj.getFullYear()} `;\n    str += `${dateObj.getHours()}:${dateObj.getMinutes()}:${dateObj.getSeconds()}`;\n    return str;\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/lti-form/view-code/view-code.component.css",
    "content": "textarea {\n  width: 100%;\n  resize: none;\n  font-family: monospace;\n}"
  },
  {
    "path": "ArduinoFrontend/src/app/lti-form/view-code/view-code.component.html",
    "content": "<div #noCodeSection>\n  No arduino present in the circuit.\n</div>\n<div #codeSection>\n  <mat-select class=\"form-control\" (selectionChange)=\"setCode($event)\" placeholder=\"Select any arduino to view code\">\n    <ng-container *ngFor=\"let arduino of arduinos; let i=index;\">\n      <mat-option [value]=\"i\">{{ arduino.data.name }}</mat-option>\n    </ng-container>\n  </mat-select>\n  <textarea #codeArea rows=\"10\" readonly></textarea>\n</div>"
  },
  {
    "path": "ArduinoFrontend/src/app/lti-form/view-code/view-code.component.ts",
    "content": "import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';\nimport { ApiService } from 'src/app/api.service';\nimport { Login } from 'src/app/Libs/Login';\n\n/**\n * Class for Viewing Code in LTI Form Component\n */\n@Component({\n  selector: 'app-view-code',\n  templateUrl: './view-code.component.html',\n  styleUrls: ['./view-code.component.css']\n})\nexport class ViewCodeComponent implements OnInit {\n\n  /**\n   * View Code Component Constructor\n   * @param api API service for api calls\n   */\n  constructor(\n    private api: ApiService,\n  ) { }\n\n  /**\n   * Id of the circuit received from LTI-Form\n   */\n  @Input() id: string;\n  /**\n   * Branch of the circuit received from LTI-Form\n   */\n  @Input() branch: string;\n  /**\n   * Version of the circuit received from LTI-Form\n   */\n  @Input() version: string;\n  /**\n   * Reference to Textarea element in this component\n   */\n  @ViewChild('codeArea') textarea: ElementRef;\n  /**\n   * Reference to div element not containing code in this component\n   */\n  @ViewChild('noCodeSection') noCodeDiv: ElementRef;\n  /**\n   * Reference to div element containing code in this component\n   */\n  @ViewChild('codeSection') codeDiv: ElementRef;\n  /**\n   * List of code for every arduino of the circuit.\n   */\n  arduinos = [];\n\n  /**\n   * On Init Callback\n   */\n  ngOnInit() {\n    this.noCodeDiv.nativeElement.style.display = 'block';\n    this.codeDiv.nativeElement.style.display = 'none';\n    this.api.readProject(this.id, this.branch, this.version, Login.getToken()).subscribe(res => {\n      this.getCode(res['data_dump']);\n    }, err => {\n      console.log(err);\n    });\n  }\n\n  /**\n   * Parses the code for every arduino from circuit dump\n   * @param dataDump circuit dump\n   */\n  getCode(dataDump) {\n    const dump = JSON.parse(dataDump);\n    this.arduinos = dump['ArduinoUno'];\n    if (this.arduinos.length > 0) {\n      this.codeDiv.nativeElement.style.display = 'block';\n      this.noCodeDiv.nativeElement.style.display = 'none';\n    } else {\n      this.noCodeDiv.nativeElement.style.display = 'block';\n      this.codeDiv.nativeElement.style.display = 'none';\n    }\n  }\n\n  /**\n   * Changes textarea's value based on option selected.\n   * @param event Event data returned after changing option in select tag\n   */\n  setCode(event) {\n    this.textarea.nativeElement.value = this.arduinos[event.value].data.code;\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/main-page/main-page.component.css",
    "content": ".example-container {\n    min-height: 876px;\n    border: 1px solid rgba(0, 0, 0, 0.12);\n  }\n  \n  .no-search {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    margin-top: 1rem;\n  }\n  .maincontent {\n    display: flex;\n    justify-content: center;\n    flex-direction: column;\n    align-items: center;\n  }\n  .circuitBtn {\n    width: 296px;\n  }\n  \n  mat-chip {\n    max-width: 200px;\n    padding: 9px;\n    border-radius: 14px;\n    padding: 11px;\n  }\n  \n.card:hover {\n    background-color: #ddd;\n  }\n  \n  .subbox {\n    box-sizing: border-box;\n    width: 95%;\n    height: auto;\n    background-color: white;\n    border-radius: 0.3125em;\n    margin-bottom: 15px;\n    box-shadow: 1px 1px 3px grey;\n    cursor: pointer;\n    margin-left: 2%;\n    justify-content: space-evenly;\n  }\n  \n  .item-img {\n    min-height: 180px;\n    max-width: 100%;\n    max-height: 180px;\n  }\n  \n  .subbox:hover {\n    box-shadow: 2px 2px 9px grey;\n  }\n  \n  #openproject {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100vh;\n    background-color: rgba(0, 0, 0, 0.4);\n    overflow-y: scroll;\n  }\n  \n  #innerdialog {\n    background-color: white;\n    position: relative;\n    color: black;\n    margin: 1em 10% 1em 10%;\n    border-radius: 5px;\n    box-sizing: border-box;\n    min-width: 80%;\n  }\n  \n  button[type=\"submit\"] {\n    color: white;\n    border: none;\n    border-radius: 4px;\n    cursor: pointer;\n    float: left;\n    font-weight: bold;\n    border-top: 1px solid #007bff;\n    border-bottom: 1px solid #007bff;\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n    height: 100%;\n  }\n  \n  #Search {\n    width: 100%;\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  \n  .act-buttons {\n    max-width: 100%;\n  }\n  \n  .act-buttons button {\n    margin-left: 10px;\n    margin-bottom: 10px;\n  }\n  \n  .share-btns {\n    margin-top: 1.5em;\n    margin-bottom: 1em;\n    width: 100%;\n  }\n  \n  .share-btns button {\n    margin-left: 15px;\n  }\n  \n  .act-desc {\n    margin: 15px;\n    font-family: cursive;\n  }\n  \n  @media only screen and (max-width: 480px) {\n    .share-btns button {\n      margin-left: 5px;\n    }\n  }\n  /* .example-container {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n  } \n  */\n  "
  },
  {
    "path": "ArduinoFrontend/src/app/main-page/main-page.component.html",
    "content": "<div *ngIf=\"isCloudCircuit\" class=\"maincontent\">\n  <h3\n    style=\"font-weight: 900; font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;margin-top: 5rem;\">\n    Arduino\n    Circuits</h3>\n  <div>\n    <a type=\"button\" class=\"circuitBtn btn btn-primary mb-8 m-2\" [routerLink]=\"['../simulator']\"\n      routerLinkActive=\"router-link-active\">+ New\n      Circuit</a>\n    <label for=\"importFileBTN\" mat-icon-button class=\"circuitBtn btn btn-primary mb-8 m-2\">Import\n      Circuit</label>\n    <input id=\"importFileBTN\" value=\"Import Ciruit\" accept=\".json\" #importFile type=\"file\"\n      (change)=\"ImportCircuit($event)\" hidden /><br />\n  </div>\n    <div>\n      <input type=\"text\"  style=\"width: 570px;\" [(ngModel)]=\"circuitFilter.name\" name=\"search\"\n        class=\"form-control\"   placeholder=\"Search\">\n    </div>\n</div>\n\n<div class=\"row\" *ngIf=\"isCloudCircuit\" style=\"margin: 1em;margin-left: 240px;\">\n\n\n  <div *ngIf=\"(online | filterBy: circuitFilter).length === 0\" class=\"no-search\">\n    <div style=\"cursor: pointer;display: flex;\">\n      <p [innerHtml]=\"onCloudMessage\" style=\"margin-top:8px;margin-right: 12px;\">\n      </p>\n      <!-- <mat-chip color=\"warn\" (click)=\"readOnCloudItems()\" style=\"display: flex;\" selected>\n            Clear Search\n            <mat-icon style=\"cursor: pointer;margin-left: 12px;\" mat-list-icon>close</mat-icon>\n          </mat-chip> -->\n    </div>\n  </div>\n  <div class=\"col-md-4\" *ngFor=\"let item of getNormalCircuits() | filterBy:circuitFilter\">\n\n    <div class=\"subbox\" (click)=\"openProject(item.index)\">\n      <div>\n        <div style=\"width: 100%;  background-color: #e8e8e8;\">\n          <img class=\"item-img\" style=\"border-radius: 5px;\" src={{item.base64_image}} alt=\"\">\n        </div>\n        <div style=\"box-sizing: border-box; padding: 15px;\">\n          <h4>{{item.name}}</h4>\n          <p style=\"word-break: break-all;\">\n            {{ item.description | slice:0:57 }}\n            {{ (item.description && item.description.length) > 60?'...':'' }}\n          </p>\n          {{ DateDiff(item,item.save_time) }}\n          <p>{{item.time}}</p>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n<!-- Temporary Circuits -->\n<div *ngIf=\"isTempCircuit\">\n  <div *ngIf=\"items.length == 0\" style=\"margin: 1em;margin-left: 240px;\">No Offline Circuits Available &#9785;</div>\n  <div class=\"row\" style=\"margin: 1em;margin-left: 240px;\">\n    <div class=\"col-md-4\" *ngFor=\"let item of items; let i = index\">\n      <div class=\"subbox\" (click)=\"openProject(i,true)\">\n        <div>\n          <div style=\"width: 100%;  background-color: #e8e8e8;\">\n            <img class=\"item-img\" style=\"border-radius: 5px;\" src={{item.base64_image}} alt=\"\">\n          </div>\n          <div style=\"box-sizing: border-box; padding: 15px;\">\n            <h4>{{item.name}}</h4>\n            <p>{{item.description}}</p>\n            {{ DateDiff(item,item.save_time) }}\n            <p>{{item.time}}</p>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n<!-- LTI Apps -->\n<div *ngIf=\"isLTIApp\">\n  <div *ngIf=\"(getLTIApps() | filterBy:circuitFilter).length == 0\" style=\"margin: 1em;margin-left: 240px;\">No LTI Apps created &#9785;</div>\n  <div class=\"row\" style=\"margin: 1em;margin-left: 240px;\">\n    <div class=\"col-md-4\" *ngFor=\"let item of getLTIApps() | filterBy:circuitFilter\">\n      <div class=\"subbox\" (click)=\"openProject(item.index,false)\">\n        <div>\n          <div style=\"width: 100%;  background-color: #e8e8e8;\">\n            <img class=\"item-img\" style=\"border-radius: 5px;\" src={{item.base64_image}} alt=\"\">\n          </div>\n          <div style=\"box-sizing: border-box; padding: 15px;\">\n            <h4>{{item.name}}</h4>\n            <p>{{item.description}}</p>\n            {{ DateDiff(item,item.save_time) }}\n            <p>{{item.time}}</p>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n<!-- LTI Submissions -->\n<div *ngIf=\"isLTISub\">\n  <div *ngIf=\"(getLTISubmissions() | filterBy:circuitFilter).length == 0\" style=\"margin: 1em;margin-left: 240px;\">No LTI Submissions received &#9785;</div>\n  <div class=\"row\" style=\"margin: 1em;margin-left: 240px;\">\n    <div class=\"col-md-4\" *ngFor=\"let item of getLTISubmissions() | filterBy:circuitFilter\">\n      <div class=\"subbox\" (click)=\"openProject(item.index,false)\">\n        <div>\n          <div style=\"width: 100%;  background-color: #e8e8e8;\">\n            <img class=\"item-img\" style=\"border-radius: 5px;\" src={{item.base64_image}} alt=\"\">\n          </div>\n          <div style=\"box-sizing: border-box; padding: 15px;\">\n            <h4>{{item.name}}</h4>\n            <p>{{item.description}}</p>\n            {{ DateDiff(item,item.save_time) }}\n            <p>{{item.time}}</p>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n\n<!--open project-->\n<div id=\"openproject\" style=\"display: none;z-index: 1000;\">\n  <div id=\"innerdialog\" *ngIf=\"selected\">\n    <div class=\"p-2\" style=\"display: flex; line-height: 20px;max-width: 100%;\">\n      <h2 style=\"margin-left: 1%\">{{selected.name}}</h2>\n      <button *ngIf=\"selected.shared\" type=\"button\" class=\"btn btn-primary btn-sm\" style=\"margin-left: 1%;\"\n        (click)=\"DisableSharing(selected)\">Shared&nbsp;&nbsp;&#10006;</button>\n\n      <button *ngIf=\"selected.lti_id\" type=\"button\" class=\"btn btn-primary btn-sm\" style=\"margin-left: 1%;\"\n        (click)=\"DeleteLTI(selected)\">LTI&nbsp;&nbsp;&#10006;</button>\n      <button class=\"ml-auto\"\n        style=\"position: relative; padding-top: 10px;background-color: transparent; border: none;font-size: 2.2em;font-weight: 400;\"\n        (click)=\"closeProject()\"> &#10006;</button>\n    </div>\n    <hr>\n    <div class=\"row\">\n      <div class=\"col-md-7\" style=\"left: 30px;\">\n        <div style=\"display: flex;\">\n          <img style=\"max-width: 100%;margin: auto auto; align-items: center;\" src={{selected.base64_image}} alt=\"\">\n        </div>\n      </div>\n      <div class=\"col-md-5 data-body\" style=\"padding-left: 30px;\">\n        <h4 style=\"font-family: cursive;font-weight: bold;\">Description</h4>\n        <p>{{selected.description}}</p>\n\n        <div class=\"row act-buttons\">\n          <button mat-raised-button color=\"primary\" class=\"col-md-3\" [routerLink]=\"['/simulator']\"\n            [queryParams]=\"{id: selected.save_id,offline: selected.offline,version:selected.version,branch:selected.branch}\">\n            Edit Circuit</button>\n          <button mat-raised-button color=\"warn\" class=\"col-md-3\"\n            (click)=\"DeleteCircuit(selected.save_id,selected.offline,selected.index)\">Delete Circuit</button>\n          <button mat-raised-button class=\"col-md-3\" style=\"background-color: #26b12d;color: white;\" *ngIf=\"!isProd\">\n            Publish circuit</button>\n          <button mat-raised-button color=\"primary\" class=\"col-md-3\"\n            (click)=\"ExportCircuit(selected, selected.offline)\">Export Circuit</button>\n          <button mat-raised-button color=\"primary\" class=\"col-md-3\" *ngIf=\"!selected.offline\" \n            [routerLink]=\"['/lti']\" [queryParams]=\"{id:selected.save_id,branch:selected.branch,version:selected.version,lti:selected.lti_id}\">\n            <span *ngIf=\"selected.lti_id\">Update LTI App</span>\n            <span *ngIf=\"!selected.lti_id\">Create LTI App</span>\n          </button>\n        </div>\n\n        <div class=\"act-desc\">\n          <h6>Author name: You</h6>\n          <!-- <h6 style=\"margin-left: 15px;font-family: cursive\">Forked By:</h6> -->\n          {{ ExpandDate(selected) }}\n          <h6>Created At: {{selected.create}}</h6>\n          <h6>Edited At: {{selected.edit}}</h6>\n          <!-- <h6 style=\"margin-left: 15px;font-family: cursive\">Reviewed At:</h6> -->\n        </div>\n\n        <div *ngIf=\"!selected.offline\">\n          <div class=\"share-btns\">\n            <button mat-mini-fab color=\"primary\" matTooltip=\"Share it on Facebook\" (click)=\"ShareCircuit(selected,0)\"><i\n                class=\"fab fa-facebook-f\" style=\"color:white; font-size: medium;\"></i>\n            </button>\n            <button mat-mini-fab style=\"background-color: #0080FF;\" matTooltip=\"Share it on Linked In\"\n              (click)=\"ShareCircuit(selected,1)\">\n              <i class=\"fab fa-linkedin-in\" style=\"font-size: x-large; color: white;\"></i>\n            </button>\n            <button mat-mini-fab style=\"background-color: #ff4500;\" matTooltip=\"Share it on Reddit\"\n              (click)=\"ShareCircuit(selected,2)\">\n              <i class='fab fa-reddit-alien' style='font-size:24px;color: white;'></i>\n            </button>\n\n            <button mat-mini-fab style=\"background-color: black;\" matTooltip=\"Share it with Mail\"\n              (click)=\"ShareCircuit(selected,3)\">\n              <i class=\"fa fa-envelope\" style=\"font-size: medium;\"></i>\n            </button>\n            <button mat-mini-fab style=\"background-color: black;\" matTooltip=\"Copy Sharing URL\"\n              (click)=\"ShareCircuit(selected,4)\">\n              <i class=\"fa fa-share-alt\" style=\"font-size: medium; color: white\"></i>\n            </button>\n          </div>\n\n        </div>\n\n      </div>\n      <!--Comments\n    <hr>\n    <div style=\"height: 185px; width: 100%;\">\n      <div style=\"position: relative;left: 3%; top: 5px; width: 97%; height: 170px\">\n        <h3 style=\"padding-left: 10px;font-weight: bolder; font-size: 22px;font-family: monospace\">Comments</h3>\n        <form class=\"form-group\">\n          <textarea class=\"form-control\" id=\"exampleFormControlTextarea1\" rows=\"3\" style=\"width: 97%;\"></textarea>\n        </form>\n        <button mat-raised-button disabled>Post Comment</button>\n      </div>\n    </div>\n  -->\n    </div>\n    <div *ngIf=\"!selected.offline\" style=\"display:flex; flex-direction: column; padding: 20px; padding-bottom: 50px;\">\n      <p *ngIf=\"selected.shared\">\n        Url for Sharing :\n      </p>\n      <textarea id=\"sharing-url\" *ngIf=\"selected.shared\" rows=\"1\" width=\"100%\" style=\"resize:none;\"\n        readonly>{{getUrl(selected)}}</textarea>\n    </div>\n  </div>\n</div>\n<!--/open project-->"
  },
  {
    "path": "ArduinoFrontend/src/app/main-page/main-page.component.spec.ts",
    "content": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\nimport { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';\nimport { MainPageComponent } from './main-page.component';\nimport { RouterTestingModule } from '@angular/router/testing';\nimport { MaterialModule } from '../common/material.module';\nimport { FormsModule } from '@angular/forms';\nimport { FilterPipeModule } from 'ngx-filter-pipe';\ndescribe('MainPageComponent', () => {\n  let component: MainPageComponent;\n  let fixture: ComponentFixture<MainPageComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({\n      imports: [RouterTestingModule, HttpClientTestingModule, MaterialModule, FormsModule, FilterPipeModule],\n      declarations: [MainPageComponent]\n    })\n      .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(MainPageComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "ArduinoFrontend/src/app/main-page/main-page.component.ts",
    "content": "import { HttpErrorResponse } from '@angular/common/http';\nimport { Component, OnInit, ViewChild } from '@angular/core';\nimport { MatSidenav, MatSnackBar } from '@angular/material';\nimport { Title } from '@angular/platform-browser';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { environment } from 'src/environments/environment';\nimport { AlertService } from '../alert/alert-service/alert.service';\nimport { ApiService } from '../api.service';\nimport { Login } from '../Libs/Login';\nimport { SaveOffline } from '../Libs/SaveOffiline';\nimport { SaveOnline } from '../Libs/SaveOnline';\n\n/**\n * For Handling Time ie. Prevent moment error\n */\ndeclare var moment;\n\n/**\n * Class for Dashboard page\n */\n@Component({\n  selector: 'app-main-page',\n  templateUrl: './main-page.component.html',\n  styleUrls: ['./main-page.component.css']\n})\nexport class MainPageComponent implements OnInit {\n\n  /**\n   * List of Offline Circuits\n   */\n  items: any[] = [];\n  /**\n   * Selected Circuit required for popup\n   */\n  selected: any = {};\n  /**\n   * List of Online Circuits\n   */\n  online: any[] = [];\n\n  /**\n   * List of Search circuit name\n   */\n  circuitFilter: any = { name: '' };\n\n  /**\n   * Message shown to user if something happens while fetching online circuits\n   */\n  onCloudMessage = 'No Online Circuits Available  &#9785;';\n  /**\n   * Variable to tell if it is production build\n   */\n  isProd = environment.production;\n  /**\n   * Close Project Properties dialog\n   */\n\n  /**\n   * Group role of dashboard component\n   */\n  groupRole = [];\n\n  /**\n   * Token\n   */\n  token;\n\n  /**\n   * visible cloud circuit\n   */\n  isCloudCircuit = true;\n  /**\n   * visible temp circuit\n   */\n  isTempCircuit = false;\n  /**\n   * show LTI App circuit tab or not\n   */\n  isLTIApp = false;\n  /**\n   * show LTI Submissions circuit tab or not\n   */\n  isLTISub = false;\n\n\n  /**\n   * Username  of register user.\n   */\n  username = '';\n  /**\n   * Search text of search box\n   */\n  // searchText = '';\n\n  // configuration for side nav.\n  @ViewChild('sidenav') sidenav: MatSidenav;\n  isExpanded = true;\n  showSubmenu = false;\n  isShowing = false;\n  showSubSubMenu = false;\n  /**\n   * Determines whether cloud side menu click\n   */\n  onCloudClick() {\n    this.isTempCircuit = false;\n    this.isCloudCircuit = true;\n    this.isLTIApp = false;\n    this.isLTISub = false;\n  }\n  /**\n   * Determines whether temp circuit click\n   */\n  onTempCircuitClick() {\n    this.isTempCircuit = true;\n    this.isCloudCircuit = false;\n    this.isLTIApp = false;\n    this.isLTISub = false;\n  }\n  /**\n   * Determines whether LTI App click\n   */\n  onLTIAppsClick() {\n    this.isTempCircuit = false;\n    this.isCloudCircuit = false;\n    this.isLTIApp = true;\n    this.isLTISub = false;\n  }\n  /**\n   * Determines whether temp circuit click\n   */\n  onLTISubmissionsClick() {\n    this.isTempCircuit = false;\n    this.isCloudCircuit = false;\n    this.isLTIApp = false;\n    this.isLTISub = true;\n  }\n\n  getInitials(nameString, i) {\n    const fullName = nameString.split(' ');\n    const initials = fullName.shift().charAt(0) + fullName.pop().charAt(0);\n    return initials.toUpperCase();\n  }\n\n  closeProject() {\n    document.documentElement.style.overflow = 'auto';\n    const closeProject = document.getElementById('openproject');\n    closeProject.style.display = 'none';\n  }\n  /**\n   * Open Project in the simulator\n   * @param id Project Id\n   * @param offline Is Offline circuit boolean\n   */\n  openProject(id, offline = false) {\n    // Select the clicked item\n    if (offline) {\n      this.selected = this.items[id];\n    } else {\n      this.selected = this.online[id];\n    }\n    this.selected.index = id;\n    // Show Project Properties Dialog\n    document.documentElement.style.overflow = 'hidden';\n    const openProject = document.getElementById('openproject');\n    openProject.style.display = 'block';\n  }\n  /**\n   * Constructor for Dashboard page\n   * @param api API Service\n   * @param snackbar Material Snackbar\n   * @param title Document Title\n   */\n  constructor(\n    private api: ApiService,\n    private snackbar: MatSnackBar,\n    private title: Title,\n    private alertService: AlertService,\n    private router: Router,\n    private aroute: ActivatedRoute\n  ) {\n    this.title.setTitle('Dashboard | Arduino On Cloud');\n  }\n  /**\n   * On Init Dashboard Page\n   */\n  ngOnInit() {\n    // In Angular  Development Mode.\n    this.api.login().then(() => {\n      this.token = Login.getToken();\n      this.userInfo(this.token);\n      this.readRoles(this.token);\n      this.readTempItems();\n      this.readOnCloudItems();\n    });\n    this.checkUrl();\n  }\n\n  /**\n   * Checks url if the user click on other tabs\n   */\n  checkUrl() {\n    this.aroute.params.subscribe((params: any) => {\n      if (params.id === 'temp') {\n        this.isTempCircuit = true;\n        this.isCloudCircuit = false;\n        this.isLTIApp = false;\n        this.isLTISub = false;\n      } else if (params.id === 'ltiapp') {\n        this.onLTIAppsClick();\n      } else if (params.id === 'ltisub') {\n        this.onLTISubmissionsClick();\n      } else {\n        this.isTempCircuit = false;\n        this.isCloudCircuit = true;\n        this.isLTIApp = false;\n        this.isLTISub = false;\n      }\n    });\n  }\n  /**\n   * Getting User Information.\n   */\n  userInfo(token) {\n\n    // If token is available then get username\n    if (token) {\n      this.api.userInfo(token).subscribe((v) => {\n        this.username = v.username;\n      }, (err) => {\n        // console.log(err.status)\n        console.log(err);\n        // if (err.status === 401) {\n        Login.logout();\n        // }\n      });\n    }\n  }\n  /**\n   * Reads roles\n   */\n  readRoles(token: string) {\n    this.api.getRole(token).subscribe((result: any) => {\n      this.groupRole = result.group;\n    }, (e) => {\n      console.log(e);\n    });\n  }\n\n  /**\n   * Read the online saved circuits.\n   */\n  readOnCloudItems() {\n    // this.searchText = '';\n    // Get Login token\n    const token = Login.getToken();\n    // if token is present get the list of project created by a user\n    if (token) {\n      this.api.listProject(token).subscribe((val: any[]) => {\n        this.online = this.filterOnlineProjects(val);\n        this.online.forEach((circuit, index) => {\n          circuit.index = index;\n        });\n      }, err => console.log(err));\n    } else {\n      // if no token is present then show this message\n      this.onCloudMessage = 'Please Login to See Circuit';\n    }\n  }\n\n  /**\n   * Filter projects: Pick only 1 variation of a project\n   * @param val All projects in cloud\n   * @returns filtered list of projects\n   */\n  filterOnlineProjects(val) {\n    const projects = [];\n    const added = [];\n    for (const e in val) {\n      if (!added.includes(val[e].save_id)) {\n        added.push(val[e].save_id);\n        projects.push(val[e]);\n      }\n    }\n    return projects;\n  }\n\n  /**\n   * Read the Database for temporarily saved circuits.\n   */\n  readTempItems() {\n    // Read All Offline Project\n    SaveOffline.ReadALL((v: any[]) => {\n      // Map Offline Project to standard card item\n      this.items = v.map(item => {\n        return {\n          name: item.project.name,\n          description: item.project.description,\n          create_time: item.project.created_at,\n          save_time: item.project.updated_at,\n          base64_image: item.project.image,\n          save_id: item.id,\n          offline: true\n        };\n      });\n    });\n  }\n\n  /**\n   * Function to call when user confirms the ciruit deletion\n   * @param id Project id\n   * @param offline Is Offline Circuit\n   * @param index Project's index in their list\n   */\n  private deleteCircuitConfirm(id, offline, index) {\n    // Show loading animation\n    window['showLoading']();\n\n    // if project is offline delete from indexDB\n    if (offline) {\n      SaveOffline.Delete(id, () => {\n        this.items.splice(index, 1);\n        this.closeProject();\n        AlertService.showAlert('Done Deleting');\n        window['hideLoading']();\n      });\n    } else {\n      // Delete Project from cloud\n      const token = Login.getToken();\n      this.api.deleteProject(id, token).subscribe((out) => {\n        if (out.status === 204 || out.done) {\n          // Remove From the list\n          this.online.splice(index, 1);\n        } else {\n          AlertService.showAlert('Something went wrong');\n        }\n        this.closeProject();\n        window['hideLoading']();\n      }, err => {\n        AlertService.showAlert('Something went wrong');\n        window['hideLoading']();\n        console.log(err);\n      });\n    }\n  }\n\n  /**\n   * Delete the Project from Database\n   * @param id Project id\n   * @param offline Is Offline Circuit\n   * @param index Project's index in their list\n   */\n  DeleteCircuit(id, offline, index) {\n    // ASK for user confirmation\n    AlertService.showConfirm('Are You Sure You want to Delete Circuit', () => this.deleteCircuitConfirm(id, offline, index));\n  }\n\n  /**\n   * Disanle Project Sharing\n   * @param item Project Card Object\n   */\n  DisableSharing(item: any) {\n    const token = Login.getToken();\n    this.EnableSharing(item, token, (v) => {\n      item.shared = v.shared;\n      AlertService.showAlert('Sharing Disabled!');\n    }, false);\n  }\n  /**\n   * Returns a time difference from now in a string\n   * @param item Project card Object\n   * @param time Project time (create/update)\n   */\n  DateDiff(item: any, time) {\n    item.time = moment(time).fromNow();\n  }\n  /**\n   * Returns complete date in meaningfull format\n   * @param item Project Card Object\n   */\n  ExpandDate(item) {\n    item.create = moment(item.create_time).format('LLLL');\n    item.edit = moment(item.save_time).format('LLLL');\n  }\n\n  /**\n   * Copy respective url to clipboard for sharing\n   * @param url URL that need to be copy\n   */\n  CopyUrlToClipBoard(url) {\n    // Select the html textarea element and put url inside it\n    const tmpEl: HTMLTextAreaElement = document.querySelector('#sharing-url');\n    tmpEl.value = url;\n    // Focus and Select the element\n    tmpEl.focus();\n    tmpEl.select();\n    // exec copy command\n    const done = document.execCommand('copy');\n    // if not able to copy show alert with url else show user a snackbar\n    if (!done) {\n      AlertService.showAlert('Not able to Copy ' + tmpEl.value);\n    } else {\n      this.snackbar.open('Copied', null, {\n        duration: 2000\n      });\n    }\n  }\n  /**\n   * Project to enable or disable sharing (default enable)\n   * @param id Project id\n   * @param token Auth Token\n   * @param callback Callback when done\n   * @param enable Enable/Disable sharing\n   */\n  EnableSharing(circuit, token, callback: any, enable: boolean = true) {\n    this.api.Sharing(circuit.save_id, circuit.branch, circuit.version, enable, token).subscribe((v) => {\n      callback(v);\n    }, err => {\n      if (err.status === 401) {\n        console.log('You are not the Owner');\n        return;\n      }\n      console.log(err);\n    });\n  }\n  /**\n   * Share Project button click event handler\n   * @param selected Selected Project Card Object\n   * @param index Type of Sharing\n   */\n  ShareCircuit(selected, index) {\n    /**\n     * index\n     * 0 -> FB\n     * 1 -> LinkedIN\n     * 2 -> Reddit\n     * 3 -> Mail\n     * 4 -> copy url\n     */\n\n    // Get token if logged in\n    const token = Login.getToken();\n    if (!token) {\n      AlertService.showAlert('Please Login');\n      return;\n    }\n\n\n    this.snackbar.open('Anyone With The Link Can View and Simulate Project But cannot edit.', 'Close', {\n      duration: 10000\n    });\n    // Create a Slug\n    let slug = `${selected.save_id.replace(/-/g, '_')}-${selected.branch.replace(/-/g, '_')}-${selected.version.replace(/-/g, '_')}`;\n    slug += `-${selected.name.substr(0, 50).replace(/ +/g, '-')}`;\n    // redirect to share url\n    let shareURL = `${window.location.protocol}\\\\\\\\${window.location.host}/arduino/#/project/${slug}`;\n    const copyUrl = shareURL;\n    // encode url for redirect\n    shareURL = encodeURIComponent(shareURL);\n    // Sharing title\n    const sharingName = encodeURIComponent(`${selected.name} | Arduino On Cloud`);\n\n    if (index < 3) {\n      // Map of sharing url of each website\n      const map = [\n        `https://www.facebook.com/sharer/sharer.php?u=${shareURL}`,\n        `https://www.linkedin.com/sharing/share-offsite/?url=${shareURL}`,\n        `http://www.reddit.com/submit?url=${shareURL}&title=${sharingName}`\n      ];\n      // if project is already shared then open link\n      if (selected.shared) {\n        window.open(map[index], '_blank');\n      } else {\n        // otherwise enable sharing and open the link in new tab\n        this.EnableSharing(selected, token, (v) => {\n          selected.shared = v.shared;\n          if (selected.shared) {\n            window.open(map[index], '_blank');\n          } else {\n            AlertService.showAlert('Not Able to Share Circuit');\n          }\n        });\n      }\n    } else if (index === 3) {\n      // Send email\n      const description = encodeURI(`${selected.description}\\n\\n\\n\\n\\nVisit `);\n      const back = `subject=${sharingName}&body=${description}${shareURL}`;\n      if (selected.shared) {\n        window.open(`mailto:?${back}`, '_blank');\n      } else {\n        this.EnableSharing(selected, token, (v) => {\n          selected.shared = v.shared;\n          if (selected.shared) {\n            window.open(`mailto:?${back}`, '_blank');\n          } else {\n            AlertService.showAlert('Not Able to Share Circuit');\n          }\n        });\n      }\n    } else if (index === 4) {\n      // Copy sharing url to clipboard if sharing is on\n      if (selected.shared) {\n        this.CopyUrlToClipBoard(copyUrl);\n      } else {\n        // other wise enable share and copy the url\n        this.EnableSharing(selected, token, (v) => {\n          selected.shared = v.shared;\n          if (selected.shared) {\n            this.CopyUrlToClipBoard(copyUrl);\n          } else {\n            AlertService.showAlert('Not Able to Share Circuit');\n          }\n        });\n      }\n    }\n  }\n\n  /**\n   * Import the circuit in json format\n   * @param event Context of event\n   */\n  ImportCircuit(event) {\n    const file: File = event.target.files[0];\n    let fileData;\n\n    if (file) {\n      const reader = new FileReader();\n      reader.readAsText(file);\n\n      reader.onload = async () => {\n        fileData = reader.result;\n        fileData = await JSON.parse(fileData);\n        this.SaveCircuit(fileData);\n        document.getElementById('importFileBTN')['value'] = null;\n      };\n    }\n  }\n\n  /**\n   * Export the circuit in json format\n   * @param selected selected Project\n   * @param offline Is Offline Circuit\n   */\n  ExportCircuit(selected, offline) {\n    let id = selected.save_id;\n    if (offline) {\n      if (typeof id !== 'number') {\n        id = Date.now();\n      }\n      SaveOffline.Read(id, this.DownloadFile);\n    } else {\n      const token = Login.getToken();\n      if (!token) {\n        AlertService.showAlert('Please Login');\n        return;\n      }\n      this.api.readProject(id, selected.branch, selected.version, token).subscribe(\n        data => {\n          // Converting data to required format\n          const obj = JSON.parse(data['data_dump']);\n          const project = {\n            name: data['name'],\n            description: data['description'],\n            image: data['base64_image'],\n            created_at: data['create_time'],\n          };\n          obj['id'] = id;\n          obj['project'] = project;\n          // Getting image data from image url\n          const image = document.createElement('img');\n          image.setAttribute('src', project.image);\n          image.setAttribute('visibility', 'hidden');\n          image.onload = () => {\n            const canvas = document.createElement('canvas');\n            canvas.width = image.width;\n            canvas.height = image.height;\n            canvas.getContext('2d').drawImage(image, 0, 0, image.width, image.height);\n            obj.project.image = canvas.toDataURL();\n            this.DownloadFile(obj);\n            image.parentElement.removeChild(image);\n            canvas.parentElement.removeChild(canvas);\n          };\n        },\n        (err: HttpErrorResponse) => {\n          if (err.status === 401) {\n            AlertService.showAlert('You are Not Authorized to download this circuit');\n            window.open('../../../', '_self');\n            return;\n          }\n          AlertService.showAlert('Something Went Wrong');\n          console.log(err);\n        }\n      );\n    }\n  }\n\n  /**\n   * Creates virtual DOM element to download the content\n   * @param data Data in JSON format with meta details like id, project info\n   */\n  DownloadFile(data) {\n    const filename = (data.project.name ? data.project.name : 'Undefined') + '.json';\n    const fileJSON = JSON.stringify(data);\n    const element = document.createElement('a');\n    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(fileJSON));\n    element.setAttribute('download', filename);\n    element.style.display = 'none';\n    document.body.appendChild(element);\n    element.click();\n    document.body.removeChild(element);\n  }\n\n  /**\n   * Save the circuit in the database\n   * @param fileData JSON Object of the circuit\n   */\n  SaveCircuit(fileData) {\n    AlertService.showOptions('Where do you want to save it?', () => {\n      if (!(Login.getToken())) {\n        AlertService.showAlert('Please login! Before Login Save the Project Temporary.');\n        return;\n      }\n      // If project id is uuid (online circuit) then accordingly save or update\n      SaveOnline.SaveFromDashboard(fileData, this.api, (_) => {\n        this.readOnCloudItems();\n      }, SaveOnline.isUUID(fileData.id));\n    },\n      () => {\n        if (!(fileData.id) || typeof fileData.id !== 'number') {\n          fileData.id = Date.now();\n          SaveOffline.Save(fileData, (_) => {\n            this.readTempItems();\n          });\n        } else {\n          SaveOffline.Read(fileData.id, (data) => {\n            if (data) {\n              SaveOffline.Update(fileData, (_) => {\n                this.readTempItems();\n              });\n            } else {\n              SaveOffline.Save(fileData, (_) => {\n                this.readTempItems();\n              });\n            }\n          });\n        }\n      },\n      () => { }, 'On the Cloud', 'Temporarily in the browser', 'Cancel');\n  }\n\n  /**\n   * Get Url for sharing circuits\n   * @param circuit Object containing data of the circuit opened\n   * @returns url string for sharing circuits\n   */\n  getUrl(circuit) {\n    let slug = `${circuit.save_id.replace(/-/g, '_')}-${circuit.branch.replace(/-/g, '_')}-${circuit.version.replace(/-/g, '_')}`;\n    slug += `-${circuit.name.substr(0, 50).replace(/ +/g, '-')}`;\n    // redirect to share url\n    return `${window.location.protocol}\\\\\\\\${window.location.host}/arduino/#/project/${slug}`;\n  }\n\n  /**\n   * Deletes the LTI App created for the selected circuit.\n   * @param selected Data of the circuit selected from dashboard\n   */\n  DeleteLTI(selected) {\n    const token = Login.getToken();\n    if (token) {\n      AlertService.showConfirm('Are You Sure You want to Delete LTI App', () => {\n        this.api.removeLTIDetails(selected.id, token).subscribe(_ => {\n          selected.lti_id = null;\n          AlertService.showAlert('Deleted LTI App successfully');\n          this.readOnCloudItems();\n        }, err => {\n          AlertService.showAlert('Something went wrong');\n          console.log(err);\n        });\n      });\n    }\n  }\n\n  /**\n   * Filter Circuits if they don't have LTI App or are not submissions\n   * @returns Filtered array of circuits containing lti_id = null and is_submission = false\n   */\n  getNormalCircuits() {\n    return this.online.filter(i => !i.lti_id && !i.is_submission );\n  }\n\n  /**\n   * Filter Circuits if they have LTI App\n   * @returns Filtered array of circuits containing lti_id\n   */\n  getLTIApps() {\n    return this.online.filter(circuit => circuit.lti_id);\n  }\n\n  /**\n   * Filter Circuits if they are LTI Submissions\n   * @returns Filtered array of circuits containing is_submission\n   */\n  getLTISubmissions() {\n    return this.online.filter(circuit => circuit.is_submission);\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/side-panel/side-panel.component.css",
    "content": ".example-sidenav {\n    min-width: 200px;\n    user-select: none;\n}\n.full-width {\n    width: 100%;\n}\n.menu-button {\n    transition: 300ms ease-in-out;\n    transform: rotate(0deg);\n}\n.menu-button.rotated {\n    transform: rotate(180deg);\n}\n.submenu {\n    display: none;\n    overflow-y: hidden;\n    transition: transform 300ms ease;\n    transform: scaleY(0);\n    transform-origin: top;\n    padding-left: 30px;\n}\n.submenu.expanded {\n    display: block;\n    transform: scaleY(1);\n}\n.custom-menu {\n    margin-right: 1.3rem;\n    margin-left: 8px;\n}\n\n"
  },
  {
    "path": "ArduinoFrontend/src/app/side-panel/side-panel.component.html",
    "content": "<mat-sidenav #sidenav class=\"example-sidenav\" mode=\"side\" opened=\"true\">\n  <mat-nav-list>\n    <mat-list-item *ngIf=\"username\" (click)=\"showSubmenu = !showSubmenu\" class=\"parent\">\n      <!-- <mat-icon mat-list-icon>admin</mat-icon> -->\n      <div>\n        <div class=\"circles\">\n          {{ username.charAt(0).toUpperCase() }}\n        </div>\n      </div>\n      <span class=\"full-width\">{{username}}</span>\n      <mat-icon class=\"menu-button\" [ngClass]=\"{'rotated' : showSubmenu}\" *ngIf=\"isExpanded || isShowing\">\n        expand_more</mat-icon>\n    </mat-list-item>\n    <div class=\"submenu\" [ngClass]=\"{'expanded' : showSubmenu}\" *ngIf=\"isShowing || isExpanded\">\n      <a mat-list-item *ngFor=\"let role of groupRole\">{{role}}</a>\n    </div>\n    <mat-list-item class=\"parent\" [routerLink]=\"['/dashboard']\">\n      <span>On Cloud</span>\n      <mat-icon class=\"custom-menu\" mat-list-icon>cloud</mat-icon>\n    </mat-list-item>\n    <mat-list-item class=\"parent\" [routerLink]=\"['/dashboard/mainpage','temp']\">\n      <span>Temporary Circuits</span>\n      <mat-icon class=\"custom-menu\" mat-list-icon>open_in_browser</mat-icon>\n    </mat-list-item>\n    <mat-list-item class=\"parent\" [routerLink]=\"['/dashboard/mainpage','ltiapp']\">\n      <span>LTI Apps</span>\n      <mat-icon class=\"custom-menu\" mat-list-icon>open_in_browser</mat-icon>\n    </mat-list-item>\n    <mat-list-item class=\"parent\" [routerLink]=\"['/dashboard/mainpage','ltisub']\">\n      <span>LTI Submissions</span>\n      <mat-icon class=\"custom-menu\" mat-list-icon>open_in_browser</mat-icon>\n    </mat-list-item>\n    <!-- <mat-list-item class=\"parent\" [routerLink]=\"['/dashboard/gallery']\" >\n      <span>Gallery</span>\n      <mat-icon class=\"custom-menu\" mat-list-icon>collections</mat-icon>\n    </mat-list-item> -->\n  </mat-nav-list>\n</mat-sidenav>"
  },
  {
    "path": "ArduinoFrontend/src/app/side-panel/side-panel.component.spec.ts",
    "content": "import { HttpClientTestingModule } from '@angular/common/http/testing';\nimport { async, ComponentFixture, TestBed } from '@angular/core/testing';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterTestingModule } from '@angular/router/testing';\nimport { MaterialModule } from '../common/material.module';\n\nimport { SidePanelComponent } from './side-panel.component';\n\ndescribe('SidePanelComponent', () => {\n  let component: SidePanelComponent;\n  let fixture: ComponentFixture<SidePanelComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({\n      imports: [RouterTestingModule, HttpClientTestingModule, MaterialModule, BrowserAnimationsModule],\n      declarations: [SidePanelComponent],\n    })\n      .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(SidePanelComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "ArduinoFrontend/src/app/side-panel/side-panel.component.ts",
    "content": "import { Route } from '@angular/compiler/src/core';\nimport { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core';\nimport { MatSidenav } from '@angular/material';\nimport { Router } from '@angular/router';\nimport { ApiService } from '../api.service';\nimport { Login } from '../Libs/Login';\n\n@Component({\n  selector: 'app-side-panel',\n  templateUrl: './side-panel.component.html',\n  styleUrls: ['./side-panel.component.css']\n})\nexport class SidePanelComponent implements OnInit {\n  /**\n   * Username  of register user.\n   */\n  username = '';\n  /**\n   * Group role of dashboard component\n   */\n  groupRole = [];\n  /**\n   * Token\n   */\n  token;\n  // configuration for side nav.\n  @ViewChild('sidenav') sidenav: MatSidenav;\n  isExpanded = true;\n  showSubmenu = false;\n  isShowing = false;\n  showSubSubMenu = false;\n\n  constructor(\n    public api: ApiService,\n    public router: Router\n  ) { }\n\n  ngOnInit() {\n    // In Angular  Development Mode.\n    this.api.login().then(() => {\n      this.token = Login.getToken();\n      this.userInfo(this.token);\n      this.readRoles(this.token);\n    });\n  }\n\n  /**\n   * Getting User Information.\n   */\n  userInfo(token) {\n\n    // If token is available then get username\n    if (token) {\n      this.api.userInfo(token).subscribe((v) => {\n        this.username = v.username;\n      }, (err) => {\n        // console.log(err.status)\n        console.log(err);\n        // if (err.status === 401) {\n        Login.logout();\n        // }\n      });\n    }\n  }\n  /**\n   * Reads roles\n   */\n  readRoles(token: string) {\n    this.api.getRole(token).subscribe((result: any) => {\n      this.groupRole = result.group;\n    }, (e) => {\n      console.log(e);\n    });\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/simulator/save-project-dialog/save-project-dialog.component.html",
    "content": "<div mat-dialog-content>\n  Project name\n  <form style=\"min-width: 300px;\">\n    <mat-form-field style=\"width: 100%;\">\n      <input matInput [value]=\"projectTitle\" (input)=\"onChange($event)\" class=\"text-dark\">\n    </mat-form-field>\n  </form>\n</div>\n<div class=\"confirm-buttons\" mat-dialog-actions>\n  <button class=\"response-button\" color=\"success\" mat-button (click)=\"onSave()\">Save temporary</button>\n  <button class=\"response-button\" color=\"primary\" mat-button (click)=\"onCancel()\">Cancel</button>\n</div>\n"
  },
  {
    "path": "ArduinoFrontend/src/app/simulator/save-project-dialog/save-project-dialog.component.spec.ts",
    "content": "import { async, ComponentFixture, TestBed } from '@angular/core/testing';\n\nimport { SaveProjectDialogComponent } from './save-project-dialog.component';\nimport { MatFormFieldModule, MatTooltipModule, MatInputModule } from '@angular/material';\nimport { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { FormsModule } from '@angular/forms';\nimport { RouterTestingModule } from '@angular/router/testing';\nimport { HttpClientModule } from '@angular/common/http';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\n\ndescribe('SaveProjectDialogComponent', () => {\n  let component: SaveProjectDialogComponent;\n  let fixture: ComponentFixture<SaveProjectDialogComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({\n      imports: [\n          RouterTestingModule,\n          MatFormFieldModule,\n          MatTooltipModule,\n          MatInputModule,\n          FormsModule,\n          MatDialogModule,\n          HttpClientModule,\n          BrowserAnimationsModule\n      ],\n      declarations: [ SaveProjectDialogComponent ],\n      providers: [\n        // workaround: why I can't inject MatDialogRef in the unit test?\n        {\n          provide: MatDialogRef,\n          useValue: {\n            close: (dialogResult: any) => { }\n          }\n        },\n        { provide: MAT_DIALOG_DATA, useValue: [] },\n      ]\n    })\n    .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(SaveProjectDialogComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "ArduinoFrontend/src/app/simulator/save-project-dialog/save-project-dialog.component.ts",
    "content": "import { Component, Inject } from '@angular/core';\nimport { MAT_DIALOG_DATA } from '@angular/material';\nimport { MatDialogRef } from '@angular/material/dialog';\n\ninterface DialogData {\n  onChangeProjectTitle: any;\n  projectTitle: string;\n}\n\n/**\n * Class For Confirm Modal Component\n */\n@Component({\n  selector: 'app-save-project-dialog',\n  templateUrl: './save-project-dialog.component.html',\n})\nexport class SaveProjectDialogComponent {\n  projectTitle: string;\n  onChangeProjectTitle: any;\n\n  /**\n   * Constructor For Save Project Modal\n   * @param dialogRef Material Dialog Reference\n   * @param data Data to be used in the alert box\n   */\n  constructor(public dialogRef: MatDialogRef<SaveProjectDialogComponent>, @Inject(MAT_DIALOG_DATA) public data: DialogData) {\n    this.projectTitle = data.projectTitle || '';\n    this.onChangeProjectTitle = data.onChangeProjectTitle;\n  }\n\n  onChange(e): void {\n    this.projectTitle = this.onChangeProjectTitle(e);\n  }\n\n  onSave(): void {\n    this.dialogRef.close(true);\n  }\n\n  onCancel(): void {\n    this.dialogRef.close(false);\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/simulator/simulator.component.css",
    "content": ".pipe {\n  color: #999;\n  margin: 0px 12px;\n  font-size: 33px;\n}\n\n.mynode:hover {\n  fill: #f00 !important;\n  stroke: black !important;\n  fill-opacity: 1 !important;\n  stroke-opacity: 1 !important;\n}\n\n.mynode {\n  fill: #f00 !important;\n  stroke: black !important;\n  stroke-width: 2;\n  fill-opacity: 0 !important;\n  stroke-opacity: 0 !important;\n}\n\n.mynode.highlight {\n  fill: #f00 !important;\n  stroke: black !important;\n  fill-opacity: 1 !important;\n  stroke-opacity: 1 !important;\n}\n.mynode.outline {\n  fill: #90EE90 !important;\n  stroke: black !important;\n  fill-opacity: 0.8  !important;\n  stroke-opacity: 0.5 !important;\n  \n}\n\n.mynode.solder-highlight {\n  fill: #111 !important;\n  stroke: black !important;\n  fill-opacity: 1 !important;\n  stroke-opacity: 1 !important;\n}\n\n.grabbing {\n  cursor: grabbing !important;\n  cursor: -moz-grabbing !important;\n  cursor: -webkit-grabbing !important;\n}\n\n.component-card {\n  max-width: 32%;\n  display: flex;\n  flex-direction: column;\n  padding: 10px;\n  cursor: pointer;\n  text-align: center;\n}\n\n.component-card:hover {\n  background-color: #eee;\n}\n\n.component-card img {\n  object-fit: contain;\n  max-width: 100%;\n  max-height: 50px;\n  width: auto;\n  height: auto;\n  display: block;\n}\n\n.component-card label {\n  margin: 0 auto 0 auto;\n}\n\n.component-row {\n  display: flex;\n  justify-content: space-between;\n  width: 100%;\n  margin-bottom: 10px;\n}\n\n#bubblebox {\n  top: 120px;\n  position: fixed;\n  background: #000;\n  padding: 10px;\n  color: #fff;\n  border-radius: 0.4em;\n  z-index: 100;\n  display: none;\n}\n\n#bubblebox:after {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 50%;\n  width: 0;\n  height: 0;\n  border: 10px solid transparent;\n  border-bottom-color: #000;\n  border-top: 0;\n  margin-left: -10px;\n  margin-top: -10px;\n}\n\n#propertybox {\n  display: block;\n  position: fixed;\n  width: 220px;\n  min-height: 50px;\n  z-index: 600;\n  background: #fff;\n  top: 110px;\n  box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.4);\n  padding: 15px;\n  border-radius: 5px;\n  left: calc(100vw - 230px);\n}\n\n* {\n  user-select: none;\n}\n\n.collapse-card {\n  background-color: transparent;\n}\n\n.card-header:hover {\n  background-color: #fff;\n}\n\n.collapse-div {\n  display: block;\n  max-height: 0px;\n  overflow: hidden;\n  transition: max-height 0.5s ease-in-out;\n}\n\n.show-div {\n  max-height: 1000vh;\n  transition: max-height 0.5s ease-in-out;\n}\n\n#holder {\n  cursor: pointer;\n  overflow: hidden;\n  width: 100%;\n  height: calc(100vh - 101px);\n  background-color: white;\n  padding-left: 0.525px;\n}\n\n#sidebar-wrapper {\n  overflow-y: scroll;\n  height: calc(100vh - 101px);\n  width: 400px;\n  margin-left: -15rem;\n  -webkit-transition: margin 0.25s ease-out;\n  -moz-transition: margin 0.25s ease-out;\n  -o-transition: margin 0.25s ease-out;\n  transition: margin 0.25s ease-out;\n}\n\n.code-editor {\n  position: fixed;\n  top: 100px;\n  left: -600px;\n  width: 500px;\n  transition: left 0.5s ease-in-out;\n}\n\n.show-code-editor {\n  left: 0;\n}\n\n.lightblue {\n  background-color: lightskyblue;\n}\n\n.lightgreen {\n  background-color: lightgreen;\n}\n\n#project-title {\n  color: black !important;\n  background-color: transparent;\n  border: none;\n}\n\n#project-title:focus {\n  background-color: #fff !important;\n}\n\n#secondary-header {\n  display: flex;\n  background-color: whitesmoke;\n  justify-content: space-between;\n  height: auto;\n  padding-top: 10px;\n  flex-wrap: wrap;\n}\n\n#secondary-header > button {\n  font-size: smaller;\n  /* margin-left: 10px; */\n  margin: 1px 0px 0px 5px;\n  background-color: #fff;\n  align-items: center;\n  background: transparent;\n}\n\n.btn-fst i {\n  font-size: 25px;\n  margin-right: 10px;\n}\n\n#sidebar-wrapper .sidebar-heading {\n  padding: 0.9rem 1.28rem;\n  font-size: 1.7rem;\n}\n\n#sidebar-wrapper .list-group {\n  width: 21.5rem;\n  font-size: 20px;\n  padding-left: 5px;\n}\n\n#page-content-wrapper {\n  min-width: 100vw;\n}\n\n#wrapper.toggled #sidebar-wrapper {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  #sidebar-wrapper {\n    margin-left: 0;\n  }\n  #page-content-wrapper {\n    min-width: 0;\n    width: 100%;\n  }\n  #wrapper.toggled #sidebar-wrapper {\n    margin-left: -15rem;\n  }\n}\n\n/*context-menu*/\n\nhtml,\nbody {\n  height: 100%;\n}\n\n.context-menu {\n  width: 160px;\n  height: 140px;\n  box-shadow: 0 0 5px 0 #ccc;\n  position: absolute;\n  display: none;\n  background-color: white;\n}\n\n.context-menu ul {\n  list-style: none;\n  /*show no bullets*/\n  padding: 5px 0px 5px 0px;\n}\n\n.context-menu ul li {\n  padding: 10px 5px 10px 5px;\n  border-left: 4px solid transparent;\n  cursor: pointer;\n  z-index: 5000 !important;\n  overflow: visible !important;\n}\n\n.context-menu ul li:hover {\n  background-color: rgb(245, 207, 161);\n  border-left: 4px solid #666;\n}\n\n#ToastMessage {\n  top: 100px;\n  left: 1230px;\n  z-index: 1000;\n  position: fixed;\n  width: 300px;\n  height: auto;\n  box-shadow: 0 0 20px 0 #ccc;\n  border-radius: 5px;\n  background-color: black;\n  display: none;\n}\n\n.toast {\n  text-align: left;\n}\n\n.toast-body {\n  padding: 15px 15px 15px 15px;\n  margin-top: 5px;\n  font-family: Arial, Helvetica, sans-serif;\n}\n\n#console {\n  position: fixed;\n  width: calc(100% - 500px);\n  height: 30%;\n  z-index: 1000;\n  background: #fff;\n  right: 0;\n  bottom: 0;\n  justify-content: space-between;\n  background-color: black;\n  animation: mymove 0.2s;\n  animation-iteration-count: 1s;\n}\n\n#console > .body {\n  display: flex;\n  flex-direction: column;\n  height: calc(100% - 40px);\n}\n\n#console > .head {\n  display: flex;\n  background-color: white;\n  position: relative;\n  width: 100%;\n  border: 1px solid #000;\n  max-height: 40px;\n}\n\n#msg {\n  padding: 1em;\n  flex-grow: 1;\n  overflow-y: auto;\n  overflow-x: hidden;\n  text-overflow: ellipsis;\n  white-space: pre-wrap;\n  word-wrap: break-word;\n  position: relative;\n  display: flex;\n  color: #fff;\n  flex-direction: column;\n}\n\n#msg label {\n  margin-bottom: 0 !important;\n}\n\n#msg pre {\n  color: #fff !important;\n  overflow: initial;\n}\n\n.navbar-brand:focus {\n  outline: 0;\n}\n\n@keyframes mymove {\n  from {\n    bottom: 0px;\n  }\n  to {\n    top: 500px;\n  }\n}\n\n#innerdialog {\n  background-color: white;\n  position: absolute;\n  color: black;\n  top: 170px;\n  width: 25%;\n  min-height: 170px;\n  margin-left: 35%;\n  border-radius: 5px;\n  box-sizing: border-box;\n  display: block;\n  z-index: 1001;\n}\n\n#opendialog {\n  position: absolute;\n  top: 0px;\n  left: 0px;\n  width: 100%;\n  min-height: 150%;\n  background-color: rgba(0, 0, 0, 0.4);\n}\n.navBarItem{\n  margin-right: 10px !important;\n  margin-top: 4px !important;\n}"
  },
  {
    "path": "ArduinoFrontend/src/app/simulator/simulator.component.html",
    "content": "<!-- As a heading -->\n<nav class=\"navbar navbar-expand-lg navbar-light text-white\" style=\"background-color: whitesmoke;height: 50px;\">\n  <a class=\"navbar-brand\" (click)=\"exitProject()\">\n    <img src=\"./assets/icon.png\" style=\"height: 40px;display: none;margin-top:10px;margin-right: 1em;\" class=\"d-block\"\n      alt=\"AOC\">\n  </a>\n  <!-- <span class=\"navbar-brand mb-0 font-weight-bold text-dark h1\" routerLink=\"/\">Simulator</span> -->\n  <form class=\"form-inline\" style=\"min-width: 300px;\">\n    <mat-form-field style=\"width: 100%;\">\n      <input matInput [value]=\"projectTitle\" (focusout)=\"onFocusOut($event)\" class=\"text-dark\">\n    </mat-form-field>\n    <!-- <input class=\"form-control mr-sm-2 text-dark\" type=\"text\" value={{projectTitle}} aria-label=\"text\"\n      id=\"project-title\" > -->\n  </form>\n  <div class=\"collapse navbar-collapse\">\n    <ul class=\"navbar-nav mr-auto\">\n      <!-- <li id=\"projectid\" class=\"nav-item dropdown text-white\"> -->\n      <!-- <a class=\"nav-link dropdown-toggle text-dark\" href=\"#\" id=\"navbarDropdown\" role=\"button\" data-toggle=\"dropdown\" -->\n      <!-- aria-haspopup=\"true\" aria-expanded=\"false\"> -->\n      <!-- Project -->\n      <!-- </a> -->\n      <!-- <div class=\"dropdown-menu\" aria-labelledby=\"navbarDropdown\" style=\"z-index: 1001;background-color: #b8b8b8;\"> -->\n      <!-- <a class=\"dropdown-item text-dark\" [routerLink]=\"['/simulator']\" target=\"_blank\">New Project</a> -->\n      <!-- <a class=\"dropdown-item text-dark\" (click)=\"openProject()\">Clear Project</a> -->\n      <!-- <a class=\"dropdown-item text-dark\" (click)=\"SaveProject()\">Save</a> -->\n      <!-- <a class=\"dropdown-item text-dark\" (click)=\"SaveProjectOff()\">Save Temporary</a> -->\n      <!-- </div> -->\n      <!-- </li> -->\n      <!-- <li class=\"nav-item\"> -->\n      <!-- <a class=\"nav-link text-dark\" id=\"navbarDropdown\" role=\"button\" (click)=\"openDailog()\"> -->\n      <!-- Export -->\n      <!-- </a> -->\n      <!-- <button mat-button class=\"text-dark m-auto\" >\n          Export\n        </button> -->\n      <!-- </li> -->\n      <!-- <li class=\"nav-item dropdown text-white\">\n        <a class=\"nav-link dropdown-toggle text-dark\" id=\"navbarDropdown\" role=\"button\" data-toggle=\"dropdown\"\n          aria-haspopup=\"true\" aria-expanded=\"false\">\n          View\n        </a>\n        <div class=\"dropdown-menu\" style=\"background-color: #b8b8b8\" aria-labelledby=\"navbarDropdown\">\n          <a class=\"dropdown-item text-dark\" role=\"button\" (click)=\"openview()\">Component List</a>\n        </div>\n      </li> -->\n    </ul>\n\n    <div class=\"navbar-nav ml-auto\" *ngIf=\"ltiId || ltiNonce || ltiUserId\">\n      <span style=\"color: #808080; margin-right: 10px;\">Last saved: {{ getFormattedDate(saveTime) }}</span>\n      <b style=\"color: #ff0000;\">ASSIGNMENT</b>\n    </div>\n    <div class=\"navbar-nav ml-auto\" *ngIf=\"!ltiId && !ltiNonce && !ltiUserId\">\n      <a mat-raised-button\n        (click)=\"HandleRouter(RouteToFunction(window.location.protocol + '//' + window.location.hostname, true))\"\n        class=\"navBarItem\">Home</a>\n      <a mat-raised-button (click)=\"HandleRouter(RouteToFunction('/dashboard'))\" class=\"navBarItem\">Dashboard</a>\n      <a mat-raised-button (click)=\"HandleRouter(RouteToFunction('/dashboard/gallery'))\" class=\"navBarItem\">Gallery</a>\n      <a mat-raised-button (click)=\"HandleRouter(RouteToSimulator.bind(this))\" class=\"navBarItem\">Editor</a>\n      <a mat-raised-button *ngIf=\"!token\" (click)=\"HandleRouter(Login)\">Login</a>\n      <div class=\"dropdown show\" style=\"margin-left: 10px;margin-top:4px;\" *ngIf=\"token\">\n        <!-- <img class=\"dropdown-toggle\" href=\"#\" role=\"button\" id=\"dropdownMenuLink\" data-toggle=\"dropdown\"\n          aria-haspopup=\"true\" aria-expanded=\"false\" src=\"./assets/images/login.svg\" width=\"30\" height=\"30\"\n          class=\"d-inline-block align-center\" alt=\"Login Image\"> -->\n        <div class=\"circles\" id=\"dropdownMenuLink\" data-toggle=\"dropdown\">\n          {{ username.charAt(0).toUpperCase() }}\n        </div>\n        <div class=\"dropdown-menu dropdown-menu-right\" style=\"background-color: whitesmoke;\"\n          aria-labelledby=\"dropdownMenuLink\">\n          <a *ngIf=\"username\" class=\"dropdown-item\"><i class=\"fas fa-user mr-1\"></i> {{username}}</a>\n          <div class=\"dropdown-divider\"></div>\n          <div class=\"dropdown-divider\"></div>\n          <a class=\"dropdown-item\" (click)=\"Logout()\"><i class=\"fas fa-sign-out-alt mr-1\"></i> Logout</a>\n        </div>\n      </div>\n    </div>\n\n    <!-- <div class=\"navbar-nav ml-auto\" *ngIf=\"token\"> -->\n    <!--<div class=\"dropdown my-dropdown\" *ngIf=\"token\">\n        <div class=\"w3-dropdown-hover\">\n          <img src=\"./assets/images/login.svg\" width=\"30\" height=\"30\" class=\"d-inline-block align-center\"\n            alt=\"Login Image\">\n          <div class=\"dropdown-content\" style=\"color: #000;z-index: 1001;\">\n            <div *ngIf=\"username\">\n              <i class=\"fas fa-user\" style=\"margin-left: 5px;\"></i> {{username}}\n            </div>\n            <hr style=\"margin-top: 5px;margin-bottom: 0;\">\n            <div>\n              <a href=\"../../\"><i class=\"fa fa-home\" style=\"margin-left: 5px;\"></i> Home</a>\n            </div>\n            <div>\n              <a [routerLink]=\"['/simulator']\"><i class=\"fa fa-plus\" style=\"margin-left: 5px;\"></i> New</a>\n            </div>\n            <div class=\"list\">\n              <a [routerLink]=\"['/dashboard']\"><i class=\"fa fa-credit-card\" style=\"margin-left: 5px;\"></i> Dashboard</a>\n            </div>\n            <div>\n              <a [routerLink]=\"['/gallery']\"><i class=\"fa fa-th\" style=\"margin-left: 5px;\"></i> Gallery</a>\n            </div>\n            <hr style=\"margin-top: 5px;margin-bottom: 0;\">\n            <div (click)=\"Logout()\">\n              <i class=\"fas fa-sign-out-alt\" style=\"margin-left: 5px;\"></i> Logout\n            </div>\n          </div>\n        </div>\n      </div>-->\n    <!-- </div> -->\n\n\n  </div>\n</nav>\n\n\n<!-- start of icon block -->\n<div id=\"secondary-header\">\n  <!-- <button mat-raised-button class=\"ml-2 mb-1 mt-1 mr-1 btn-fst\" (click)=\"toggleCodeEditor(codeDiv)\"\n    [style.background-color]=\"toggle ? 'white' : 'lightblue'\">\n    <i class='far fa-file-code'></i>Code</button> -->\n\n  <!-- <button mat-raised-button id=\"simulate\" class=\"mb-1 mt-1 btn-fst\" [disabled]=\"disabled\" (click)=\"StartSimulation()\"\n    [style.background-color]=\"stoggle ? 'white' : 'lightgreen'\">\n    <i [ngClass]=\"stoggle ? 'fas fa-play-circle' : 'fas fa-pause-circle'\"></i>\n    {{ stoggle ? 'Start Simulation' : 'Stop Simulation' }}\n  </button> -->\n\n\n\n  <button mat-icon-button matTooltip=\"Code\" (click)=\"toggleCodeEditor(codeDiv)\"\n    [style.background-color]=\"toggle ? 'transparent' : 'lightblue'\">\n    <i style=\"font-size: 20px;color: black;\" class=\"far fa-file-code\"></i>\n  </button>\n\n\n  <button mat-icon-button [matTooltip]=\"stoggle ? 'Start Simulation' : 'Stop Simulation'\" [disabled]=\"disabled\"\n    (click)=\"StartSimulation()\" [style.background-color]=\"stoggle ? 'transparent' : 'lightgreen'\">\n    <i style=\"font-size: 20px;color: black;\" [ngClass]=\"stoggle ? 'fas fa-play-circle' : 'fas fa-pause-circle'\"></i>\n  </button>\n\n  <!--simulation loading svg-->\n  <div id=\"simload\" style=\"display:none;height:20%;padding: 10px;\">\n    <img src=\"./assets/images/Spin.svg\" width=\"30\" height=\"30\">\n  </div>\n  <!--/simulation loading svg-->\n\n  <span class=\"pipe\">|</span>\n\n  <button mat-icon-button matTooltip=\"Undo\" (click)=\"undoChange()\" [disabled]=\"enableButton('undo')\">\n    <mat-icon style=\"font-size: 20px;color: black;\">undo</mat-icon>\n  </button>\n\n  <button mat-icon-button matTooltip=\"Redo\" (click)=\"redoChange()\" [disabled]=\"enableButton('redo')\">\n    <!-- <i style=\"font-size: 20px;color: black;\" class=\"fa fa-repeat\"></i> -->\n    <mat-icon style=\"font-size: 20px;color: black;\">redo</mat-icon>\n  </button>\n\n  <!-- Import export -->\n  <span class=\"pipe\">|</span>\n  <button mat-icon-button matTooltip=\"Download JSON file\" (click)=\"exportJson()\" id=\"importBtn\">\n    <i style=\"font-size: 20px;color: black;\" class=\"fa fa-download\" id=\"download_icon\"></i>\n  </button>\n\n  <button mat-icon-button matTooltip=\"Import JSON file\">\n    <label style=\"font-size: 20px;color: black; cursor: pointer; width: 100%;\" class=\"fa fa-upload\">\n      <input type=\"file\" style=\"display: none;\" #jsonFile id=\"jsonFile\" (change)=\"importJson(jsonFile.files[0])\">\n    </label>\n  </button>\n  <span class=\"pipe\">|</span>\n  <!-- Import export -->\n\n  <a href=\"../#/simulator\" target=\"_blank\">\n    <button mat-icon-button matTooltip=\"New Project\">\n      <i style=\"font-size: 20px;color: black;\" class='fas fa-folder-open'></i>\n    </button>\n  </a>\n\n\n  <button mat-icon-button matTooltip=\"Clear Project\" (click)=\"openProject()\">\n    <i style=\"font-size: 20px;color: black;\" class=\"fa fa-times-circle\"></i>\n  </button>\n  <span class=\"pipe\">|</span>\n  <button mat-icon-button matTooltip=\"Save Project\" (click)=\"SaveProject()\">\n    <i style=\"font-size: 20px;color: black;\" class=\"fa fa-cloud\"></i>\n  </button>\n  <button mat-icon-button matTooltip=\"Save Temporary\" (click)=\"SaveProjectOff()\">\n    <i style=\"font-size: 20px;color: black;\" class=\"fa fa-save\"></i>\n  </button>\n  <span class=\"pipe\">|</span>\n  <button mat-icon-button matTooltip=\"Export File\" (click)=\"openDailog()\">\n    <i style=\"font-size: 20px;color: black;\" class=\"fa fa-file-export\"></i>\n  </button>\n  <button mat-icon-button matTooltip=\"View Component List\" (click)=\"openview()\">\n    <i style=\"font-size: 20px;color: black;\" class=\"fa fa-list-alt\"></i>\n  </button>\n  <span class=\"pipe\">|</span>\n\n  <button mat-icon-button matTooltip=\"Delete\" (click)=\"delete()\"><i style=\"font-size: 20px;color: black;\"\n      class=\"fa fa-trash\"></i></button>\n\n  <button mat-icon-button matTooltip=\"Zoom in\" (click)=\"zoom(0)\"><i style=\"font-size: 20px;color: black;\"\n      class=\"fa fa-search-plus\"></i></button>\n\n  <button mat-icon-button matTooltip=\"Zoom out\" (click)=\"zoom(1)\"><i style=\"font-size: 20px;color: black;\"\n      class=\"fa fa-search-minus\"></i></button>\n\n  <span class=\"pipe\">|</span>\n  <button mat-icon-button matTooltip=\"See waveform\" (click)=\"showGraph()\"><i style=\"font-size: 20px;color: black;\"\n      class=\"fas fa-chart-line\"></i></button>\n\n  <button mat-icon-button matTooltip=\"Auto-arrange wires\" (click)=\"autoLayout()\">\n    <i style=\"font-size: 20px;color: black;\"\n      [ngClass]=\"{'fa fa-magic': !isAutoLayoutInProgress, 'fas fa-spinner fa-spin': isAutoLayoutInProgress}\"></i></button>\n\n  <button *ngIf=\"isStaff\" mat-icon-button matTooltip=\"Add to Gallery\"\n    style=\"margin-right: 30px;align-items: center;background: transparent;\" (click)=\"addToGallery()\">\n    <mat-icon aria-hidden=\"false\" style=\"font-size: 28px;color: black;\" aria-label=\"Example Add to gallery icon\">\n      add_photo_alternate</mat-icon>\n  </button>\n\n  <span class=\"pipe\" *ngIf=\"submitButtonVisibility\">|</span>\n\n  <mat-form-field *ngIf=\"submitButtonVisibility\">\n    <mat-select matInput [(ngModel)]=\"toBeCompared\" placeholder=\"See Previous Runs\"\n      (selectionChange)=\"onSelectionChanges($event)\">\n      <!-- [compareWith]=\"compareIds\" > -->\n      <mat-option>\n        None\n      </mat-option>\n      <ng-container *ngFor=\"let sim of simData;\">\n        <mat-option [value]=\"sim.id\">Graph Result - {{ sim.length }} data points</mat-option>\n      </ng-container>\n    </mat-select>\n  </mat-form-field>\n  <span class=\"pipe\"></span>\n  <button mat-raised-button color=\"primary\" style=\"margin: 10px 0px;\" *ngIf=\"submitButtonVisibility\"\n    (click)=\"SaveLTISubmission()\">\n    <i style=\"color: #000;\" class=\"fas fa-paper-plane\"></i>\n    <span style=\"color: #000;\">\n      Submit\n    </span>\n  </button>\n  <!-- Condition to dislay the Submit button is yet to be added -->\n  <!-- <button class=\"btn btn-light btn-sm  mb-1 mt-1 bg-white\" style=\"font-size:20px\"><i class=\"fa fa-reply\"></i></button>\n\n  <button class=\"btn btn-light btn-sm  mb-1 mt-1 bg-white\" style=\"font-size:20px\"><i class=\"fa fa-share\"></i></button>\n\n  <button class=\"btn btn-light btn-sm  mb-1 mt-1 bg-white\" style=\"font-size:20px\"><i class=\"fa fa-link fa-rotate-45\"\n      style=\"font-size:20px\"></i></button> -->\n  <span style=\"flex:1 1 auto;\"></span>\n\n</div>\n<!-- end of icon block -->\n\n\n<div class=\"code-editor\" style=\"z-index: 1000;\" #codeDiv>\n  <app-code-editor width=\"500\" height=\"100\" [reinit]=\"openCodeEditor\"></app-code-editor>\n</div>\n\n\n\n<div class=\"d-flex\" id=\"wrapper\">\n  <!-- Sidebar -->\n  <div class=\"border-right\" id=\"sidebar-wrapper\" style=\"background-color:white;\">\n    <h4 class=\"text-center text-primary mt-2\">Circuit Components</h4>\n\n    <div>\n      <div class=\"card-header border border-dark font-weight-bold text-dark\" (click)=\"Collapse(generalItems)\">\n        General\n      </div>\n\n      <div class=\"collapse-div\" #generalItems>\n        <div class=\"component-row\" *ngFor=\"let row of componentsBox.general\">\n          <div class=\"component-card\" (dblclick)=\"componentdbClick(item)\" *ngFor=\"let item of row\" draggable=\"true\"\n            (dragstart)=\"dragStart($event,item)\">\n            <img src={{components[item].image}} alt=\"{{components[item].name}}\">\n            <label style=\"font-size: smaller;\">{{components[item].name}}</label>\n          </div>\n        </div>\n\n      </div>\n    </div>\n\n    <div>\n\n      <div class=\"card-header border border-dark font-weight-bold text-dark\" (click)=\"Collapse(itemsController)\">\n        Controllers\n      </div>\n\n      <div class=\"collapse-div\" #itemsController>\n        <div class=\"component-row\" *ngFor=\"let row of componentsBox.controllers\">\n          <div class=\"component-card\" (dblclick)=\"componentdbClick(item)\" *ngFor=\"let item of row\" draggable=\"true\"\n            (dragstart)=\"dragStart($event,item)\">\n            <img src={{components[item].image}} alt=\"{{components[item].name}}\">\n            <label style=\"font-size: smaller;\">{{components[item].name}}</label>\n          </div>\n        </div>\n\n      </div>\n    </div>\n\n    <div>\n\n      <div class=\"card-header border border-dark font-weight-bold text-dark\" (click)=\"Collapse(outputDiv)\">\n        Output\n      </div>\n\n      <div class=\"collapse-div\" #outputDiv>\n        <div class=\"component-row\" *ngFor=\"let row of componentsBox.output\">\n          <div class=\"component-card\" (dblclick)=\"componentdbClick(item)\" *ngFor=\"let item of row\" draggable=\"true\"\n            (dragstart)=\"dragStart($event,item)\">\n            <img src={{components[item].image}} alt=\"{{components[item].name}}\" style=\"margin: auto;\">\n            <label style=\"font-size: smaller;\">{{components[item].name}}</label>\n          </div>\n          <!-- <div class=\"component-card\">\n            <img src=\"./assets/images/components/Buzzer.png\" alt=\"Buzzer\">\n            <label>Buzzer</label>\n          </div>\n          <div class=\"component-card\">\n            <img src=\"./assets/images/components/Buzzer.png\" alt=\"Buzzer\">\n            <label>Buzzer</label>\n          </div> -->\n        </div>\n\n      </div>\n    </div>\n\n    <div>\n\n      <div class=\"card-header border border-dark font-weight-bold text-dark\" (click)=\"Collapse(inputDiv)\">\n        Input\n      </div>\n\n      <div class=\"collapse-div\" #inputDiv>\n        <div class=\"component-row\" *ngFor=\"let row of componentsBox.input\">\n          <div class=\"component-card\" (dblclick)=\"componentdbClick(item)\" *ngFor=\"let item of row\" draggable=\"true\"\n            (dragstart)=\"dragStart($event,item)\">\n            <img src={{components[item].image}} alt=\"{{components[item].name}}\" style=\"margin: auto;\">\n            <label style=\"font-size: smaller;\">{{components[item].name}}</label>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div>\n\n      <div class=\"card-header border border-dark font-weight-bold text-dark\" (click)=\"Collapse(sourceDiv)\">\n        Sources\n      </div>\n      <div class=\"collapse-div\" #sourceDiv>\n        <div class=\"component-row\" *ngFor=\"let row of componentsBox.power\">\n          <div class=\"component-card\" (dblclick)=\"componentdbClick(item)\" *ngFor=\"let item of row\" draggable=\"true\"\n            (dragstart)=\"dragStart($event,item)\">\n            <img src={{components[item].image}} alt=\"{{components[item].name}}\">\n            <label>{{components[item].name}}</label>\n          </div>\n        </div>\n\n      </div>\n\n\n      <div class=\"card-header border border-dark font-weight-bold text-dark\" (click)=\"Collapse(driverDiv)\">\n        Drivers\n      </div>\n\n      <div class=\"collapse-div\" #driverDiv>\n        <div class=\"component-row\" *ngFor=\"let row of componentsBox.drivers\">\n          <div class=\"component-card\" (dblclick)=\"componentdbClick(item)\" *ngFor=\"let item of row\" draggable=\"true\"\n            (dragstart)=\"dragStart($event,item)\">\n            <img src={{components[item].image}} alt=\"{{components[item].name}}\">\n            <label style=\"font-size: smaller;\">{{components[item].name}}</label>\n          </div>\n        </div>\n\n      </div>\n\n      <div class=\"card-header border border-dark font-weight-bold text-dark\" (click)=\"Collapse(miscDiv)\">\n        Miscellaneous\n      </div>\n\n      <div class=\"collapse-div\" #miscDiv>\n        <div class=\"component-row\" *ngFor=\"let row of componentsBox.misc\">\n          <div class=\"component-card\" (dblclick)=\"componentdbClick(item)\" *ngFor=\"let item of row\" draggable=\"true\"\n            (dragstart)=\"dragStart($event,item)\">\n            <img src={{components[item].image}} alt=\"{{components[item].name}}\">\n            <label style=\"font-size: smaller;\">{{components[item].name}}</label>\n          </div>\n        </div>\n\n      </div>\n    </div>\n\n    <app-versioning-panel *ngIf=\"!submitButtonVisibility\" [lti]=\"submitButtonVisibility\"\n    (createNewBranch)=\"createNewBranch($event)\"></app-versioning-panel>\n\n  </div>\n\n  <!-- /#sidebar-wrapper -->\n\n  <!-- Page Content -->\n  <div id=\"page-content-wrapper\">\n    <div id=\"holder\"></div>\n  </div>\n</div>\n<!-- /#page-content-wrapper -->\n\n\n<div id=\"propertybox\" (mousedown)=\"propertyMouseDown($event)\">\n  <div style=\"display: flex;justify-content: space-between;\">\n    <h6 class=\"title\">Project Info</h6>\n    <span style=\"flex:1 1 auto;\"></span>\n    <i class='fas fa-arrows-alt' (mousedown)=\"startPropertyDrag()\" style=\"cursor: move;\"></i>\n  </div>\n  <div class=\"body\" style=\"display: flex;flex-direction: column;\"></div>\n  <div *ngIf=\"showProperty\">\n    <mat-form-field>\n      <mat-label>Project Title</mat-label>\n      <input matInput [(ngModel)]=\"projectTitle\">\n    </mat-form-field>\n    <mat-form-field class=\"example-full-width\">\n      <mat-label>Description</mat-label>\n      <textarea matInput [(ngModel)]=\"description\"></textarea>\n    </mat-form-field>\n  </div>\n  <div *ngIf=\"!showProperty\" style=\"display: flex;margin-top: 10px;\">\n    <button mat-raised-button color=\"primary\" style=\"margin-left: auto;\" (click)=\"openInfo()\">View Info</button>\n  </div>\n</div>\n\n\n<div id=\"bubblebox\"></div>\n<!--context menu-->\n\n<div id=\"contextMenu\" class=\"context-menu\">\n  <ul>\n    <li (click)=\"copy()\">\n      <h6><i class=\"fas fa-copy mr-2\"></i> Copy</h6>\n    </li>\n    <li (click)=\"paste()\">\n      <h6><i class=\"fas fa-paste mr-2\"></i> Paste</h6>\n    </li>\n    <li (click)=\"delete()\">\n      <h6><i class=\"fas fa-trash-alt mr-2\"></i> Delete</h6>\n    </li>\n  </ul>\n</div>\n<!--/context menu-->\n<!--toast message-->\n<div id=\"ToastMessage\" class=\"toast text-white\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n  <div class=\"toast-body\"></div>\n</div>\n<!--/toast message-->\n<!--console ui-->\n<div id=\"console\" style=\"display: none;\">\n  <div class=\"head\">\n    <button class=\"btn\" style=\"background-color: white;\" (click)=\"minimizeConsole()\"><i\n        [ngClass]=\"atoggle ?'fas fa-angle-up' : 'fas fa-angle-down'\"></i></button>\n    <button class=\"btn\" style=\"background:transparent\" (click)=\"expandConsole()\"><i\n        [ngClass]=\"toggle1 ? 'fas fa-compress-alt' : 'fas fa-expand-alt'\"></i></button>\n  </div>\n  <div class=\"body\">\n    <div id=\"msg\"></div>\n    <div>\n      <form style=\"display: flex;\">\n        <select>\n          <option>300</option>\n          <option>600</option>\n          <option>1200</option>\n          <option>2400</option>\n          <option>4800</option>\n          <option selected>9600</option>\n          <option>14400</option>\n          <option>19200</option>\n          <option>28800</option>\n          <option>31250</option>\n          <option>38400</option>\n          <option>57600</option>\n          <option>115200</option>\n        </select>\n        <input type=\"text\" style=\"flex:1;\" #sin>\n        <button mat-raised-button style=\"margin-right: 1px;margin-left: 1px;\"\n          (click)=\"PrintToConsole(sin)\">Send</button>\n        <button mat-raised-button style=\"margin-right: 1px;\" (click)=\"clearConsole()\">Clear</button>\n      </form>\n    </div>\n  </div>\n</div>\n<!--/console ui-->\n<div id=\"opendialog\" style=\"display: none;z-index: 1000;\">\n  <div id=\"innerdialog\">\n    <div id=\"top\" style=\"background-color: transparent; width: 100%; height: 120px;border-radius: 5px;\">\n      <p style=\"text-align: center;padding-top: 35px;\">Are you sure you want to clear the project?</p>\n    </div>\n    <div class=\"modal-footer\" style=\"background-color: transparent;\">\n      <button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\" (click)=\"closeProject()\">NO</button>\n      <button type=\"button\" class=\"btn btn-primary\" (click)=\"ClearProject()\">YES</button>\n    </div>\n  </div>\n</div>\n<app-graphlist #graph (simDataSave)=\"callGetSimRecord($event)\" (updateSimulationDataList)=\"getSimulations()\" \n  [id]=\"id\" [lti]=\"submitButtonVisibility\" [saveId]=\"projectId\"  *ngIf=\"graphToggle && isLoaded()\"></app-graphlist>"
  },
  {
    "path": "ArduinoFrontend/src/app/simulator/simulator.component.spec.ts",
    "content": "import { HttpClientModule } from '@angular/common/http';\nimport { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\nimport { TestBed, async, ComponentFixture } from '@angular/core/testing';\nimport { FormsModule } from '@angular/forms';\nimport { MatDialogModule, MatFormFieldModule, MatIconModule, MatTooltipModule } from '@angular/material';\nimport { RouterTestingModule } from '@angular/router/testing';\nimport { MonacoEditorModule, NgxMonacoEditorConfig } from 'ngx-monaco-editor';\nimport { type } from 'os';\nimport { CodeEditorComponent } from '../code-editor/code-editor.component';\nimport { SimulatorComponent } from './simulator.component';\n\nconst monacoConfig: NgxMonacoEditorConfig = {\n    baseUrl: './assets',\n    defaultOptions: { scrollBeyondLastLine: false },\n    onMonacoLoad\n};\n\nexport function onMonacoLoad() { }\n\ndescribe('SimulatorComponent', () => {\n\n    let component: SimulatorComponent;\n    let fixture: ComponentFixture<SimulatorComponent>;\n\n    beforeEach(async () => {\n        TestBed.configureTestingModule({\n            imports: [\n                RouterTestingModule,\n                MatFormFieldModule,\n                MatTooltipModule,\n                FormsModule,\n                MonacoEditorModule.forRoot(monacoConfig),\n                MatDialogModule,\n                HttpClientModule,\n            ],\n            declarations: [\n                SimulatorComponent,\n                CodeEditorComponent,\n            ],\n            schemas: [CUSTOM_ELEMENTS_SCHEMA]\n        }).compileComponents();\n    });\n\n    beforeEach(() => {\n        fixture = TestBed.createComponent(SimulatorComponent);\n        component = fixture.componentInstance;\n    });\n\n    it('should create the app', () => {\n        expect(component).toBeTruthy();\n    });\n\n});\n"
  },
  {
    "path": "ArduinoFrontend/src/app/simulator/simulator.component.ts",
    "content": "import { Component, OnInit, Injector, ViewEncapsulation, OnDestroy, EventEmitter } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Workspace, ConsoleType } from '../Libs/Workspace';\nimport { Utils } from '../Libs/Utils';\nimport { MatDialog } from '@angular/material';\nimport { ViewComponentInfoComponent } from '../view-component-info/view-component-info.component';\nimport { ExportfileComponent } from '../exportfile/exportfile.component';\nimport { ComponentlistComponent } from '../componentlist/componentlist.component';\nimport { Title } from '@angular/platform-browser';\nimport { SaveOffline } from '../Libs/SaveOffiline';\nimport { ApiService } from '../api.service';\nimport { Login } from '../Libs/Login';\nimport { SaveOnline } from '../Libs/SaveOnline';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { environment } from 'src/environments/environment';\nimport { AlertService } from '../alert/alert-service/alert.service';\nimport { LayoutUtils } from '../layout/ArduinoCanvasInterface';\nimport { ExportJSONDialogComponent } from '../export-jsondialog/export-jsondialog.component';\nimport { UndoUtils } from '../Libs/UndoUtils';\nimport { ExitConfirmDialogComponent } from '../exit-confirm-dialog/exit-confirm-dialog.component';\nimport { SaveProjectDialogComponent } from './save-project-dialog/save-project-dialog.component';\nimport { sample } from 'rxjs/operators';\n/**\n * Declare Raphael so that build don't throws error\n */\ndeclare var Raphael;\n\n/**\n * Class For Simulator Page (Component)\n */\n@Component({\n  selector: 'app-simulator',\n  templateUrl: './simulator.component.html',\n  styleUrls: ['./simulator.component.css'],\n  encapsulation: ViewEncapsulation.None\n})\nexport class SimulatorComponent implements OnInit, OnDestroy {\n  /**\n   * Raphael Paper\n   */\n  canvas: any;\n  /**\n   * Stores the id of project\n   */\n  projectId: any = null;\n  /**\n   *  Stores the title of project\n   */\n  projectTitle = 'Untitled';\n  /**\n   * Stores the description of project\n   */\n  description = '';\n  /**\n   * Toggle for Property Box\n   */\n  showProperty = true;\n  /**\n   * Component Box Object\n   */\n  componentsBox = Utils.componentBox;\n  /**\n   * String to Component map\n   */\n  components = Utils.components;\n  /**\n   * stores the initial status of code editor (Open/Closed)\n   */\n  openCodeEditor = false;\n  /**\n   * Stores toggle status for code editor\n   */\n  toggle = true;\n  /**\n   * Stores toggle status for simulation button\n   */\n  stoggle = true;\n  /**\n   * Simulation button toggle for disabling\n   */\n  disabled = false;\n  /**\n   * Stores the toggle status for expanding Virtual console\n   */\n  toggle1 = false;\n  /**\n   * stores the toggle status for closing/opening Virtual console\n   */\n  atoggle = false;\n  /**\n   * Login Token\n   */\n  token: string;\n  /**\n   * Username\n   */\n  username = '';\n  /**\n   * window\n   */\n  window: any;\n  /**\n   * Is autolayout in progress?\n   */\n  isAutoLayoutInProgress = false;\n  /**\n   * Circuit's primary key\n   */\n  id: number;\n  /**\n   * Student simulation records\n   */\n  simData: any[] = [];\n  /**\n   * Select the simulation to be submitted\n   */\n  simSelected: any = null;\n  /**\n   * View or not to view graph\n   */\n  graphToggle = false;\n  /**\n   * Hide/Show submit button\n   */\n  submitButtonVisibility = false;\n  /**\n   * LTI ID of LTI App (if simulator is opened on LMS)\n   */\n  ltiId = '';\n  /**\n   * LTI Nonce of LTI App (if simulator is opened on LMS)\n   */\n  ltiNonce = '';\n  /**\n   * LTI User ID of LTI App (if simulator is opened on LMS)\n   */\n  ltiUserId = '';\n  /**\n   * Currently loaded circuit's branch\n   */\n  branch: string;\n  /**\n   * Currently loaded circuit's version\n   */\n  version: string;\n  /**\n   * Currently loaded circuit's save time\n   */\n  saveTime: Date;\n  /**\n   * Determines whether staff is\n   */\n  isStaff = false;\n  /**\n   * Simulator Component constructor\n   * @param aroute Activated Route\n   * @param dialog Material Dialog\n   * @param injector App Injector\n   * @param title Document Title\n   * @param router Router to navigate\n   * @param api API service for api calls\n   */\n  constructor(\n    private aroute: ActivatedRoute,\n    public dialog: MatDialog,\n    private injector: Injector,\n    private title: Title,\n    private router: Router,\n    private api: ApiService,\n    private alertService: AlertService,\n  ) {\n    // Initialize Global Variables\n    Workspace.initializeGlobalFunctions();\n  }\n  /** Function dynamically creates an SVG tag */\n  makeSVGg() {\n    const el = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n    // Set Default Scale and Translation\n    el.setAttribute('transform', 'scale(1,1)translate(0,0)');\n    return el;\n  }\n  /**\n   * On Destroy Callback\n   */\n  ngOnDestroy() {\n    // If production remove save before close popup\n    if (environment.production) {\n      window.removeEventListener('beforeunload', Workspace.BeforeUnload);\n    }\n    // Make Redo & Undo Stack empty\n    UndoUtils.redo = [];\n    UndoUtils.undo = [];\n  }\n  /**\n   * On Init Callback\n   */\n  ngOnInit() {\n    // Get User Token\n    this.api.login().then(() => {\n      // if token is valid get User name\n      this.token = Login.getToken();\n      if (this.token) {\n        this.api.getRole(this.token).subscribe((result: any) => {\n          result.is_arduino_staff === true ? this.isStaff = true : this.isStaff = false;\n        });\n        this.api.userInfo(this.token).subscribe((tmp) => {\n          this.username = tmp.username;\n        }, err => {\n          if (err.status === 401) {\n            // Unauthorized clear token\n            Login.logout();\n          }\n          this.token = null;\n          console.log(err);\n        });\n      }\n    });\n    this.projectId = null;\n\n    // Detect change in url Query parameters\n    this.aroute.queryParams.subscribe(v => {\n\n      // if project id is present and no query parameter then redirect to dashoard\n      if (Object.keys(v).length === 0 && this.projectId) {\n        setTimeout(() => this.router.navigate(['dashboard'])\n          , 100);\n        return;\n      }\n      // if gallery query parameter is present\n      if (v.gallery) {\n        this.OpenGallery(v.gallery, v.proId);\n        return;\n      }\n      // if id is present and it is ofline\n      if (v.id && v.offline === 'true') {\n        // if project id is present then project is read from offline\n        this.projectId = parseInt(v.id, 10);\n        if (this.projectId) {\n          SaveOffline.Read(this.projectId, (data) => {\n            this.LoadProject(data);\n          });\n        }\n      } else if (v.id && v.lti_id && v.lti_nonce && v.lti_user_id) {\n        this.projectId = v.id;\n        this.ltiId = v.lti_id;\n        this.ltiNonce = v.lti_nonce;\n        this.ltiUserId = v.lti_user_id;\n        this.branch = v.branch;\n        this.version = v.version;\n        this.submitButtonVisibility = true;\n        this.LoadOnlineProject(v.id, 'false');\n        this.getSimRecord();\n        this.showCode(v.lti_id);\n      } else if (v.id) {\n        this.projectId = v.id;\n        this.LoadOnlineProject(v.id, v.offline);\n        this.submitButtonVisibility = false;\n      }\n    });\n\n\n    // Make a svg g tag\n    const gtag = this.makeSVGg();\n    // Create Canvas\n    this.canvas = Raphael('holder', '100%', '100%');\n    // insert g tag\n    document.querySelector('#holder > svg').appendChild(gtag);\n    this.canvas.canvas = gtag; // Change the reference\n\n    // Initialize clobal variables\n    Workspace.initalizeGlobalVariables(this.canvas);\n\n    /**\n     * Initialize Event Listeners -> Workspace.ts File Contains all the event listeners\n     */\n    const holder = document.getElementById('holder');\n    holder.addEventListener('click', Workspace.click, true);\n    holder.addEventListener('mousedown', Workspace.mouseDown, true);\n    holder.addEventListener('mousemove', Workspace.mouseMove, true);\n    holder.addEventListener('mouseup', Workspace.mouseUp, true);\n    holder.addEventListener('contextmenu', Workspace.contextMenu, true);\n    holder.addEventListener('copy', Workspace.copy, true);\n    holder.addEventListener('cut', Workspace.cut, true);\n    holder.addEventListener('dblclick', Workspace.doubleClick, true);\n    holder.addEventListener('dragleave', Workspace.dragLeave, true);\n    holder.addEventListener('dragover', Workspace.dragOver, true);\n    holder.addEventListener('drop', Workspace.drop, true);\n    holder.addEventListener('wheel', Workspace.mouseWheel, true);\n    holder.addEventListener('paste', Workspace.paste, true);\n    document.body.addEventListener('mousemove', Workspace.bodyMouseMove);\n    document.body.addEventListener('mouseup', Workspace.bodyMouseUp);\n    document.body.addEventListener('keydown', Workspace.keyDown, true);\n    document.body.addEventListener('keypress', Workspace.keyPress, true);\n    document.body.addEventListener('keyup', Workspace.keyUp, true);\n\n    if (environment.production) {\n      // Global function for displaying alert msg during closing and reloading page\n      window.addEventListener('beforeunload', Workspace.BeforeUnload);\n    }\n\n    // Initialize Property Box\n    Workspace.initProperty(v => {\n      this.showProperty = v;\n    });\n\n    // Initializing window\n    this.window = window;\n  }\n  isLoaded() {\n    return Workspace.circuitLoaded || window['scope'].ArduinoUno.length > 0;\n  }\n  /**\n   * Enable Move on Property Box\n   */\n  startPropertyDrag() {\n    window['property_box'].start = true;\n  }\n  /**\n   * Handle Mouse down on Property Box\n   * @param event Mouse Event\n   */\n  propertyMouseDown(event: MouseEvent) {\n    const bbox = (window['property_box'].element as HTMLElement).getBoundingClientRect();\n    window['property_box'].x = event.clientX - bbox.left;\n    window['property_box'].y = event.clientY - bbox.top;\n  }\n\n  /**\n   * Hide/Show Categories Component\n   * @param block Clicked Element\n   */\n  Collapse(block: HTMLElement) {\n    const collapsedDivs = Array.from(document.getElementsByClassName('show-div'));\n\n    for (const item of collapsedDivs) {\n      if (block !== item) {\n        item.classList.remove('show-div');\n      }\n    }\n\n    block.classList.toggle('show-div');\n  }\n\n  getSimRecSelectChange(value) {\n    this.simSelected = value;\n  }\n\n  /**\n   * Get the simulation result selected\n   */\n   onSelectionChanges(event) {\n    this.getSimRecSelectChange(event.value);\n  }\n\n  /**\n   * Function to check for viewing code or not in lti\n   */\n  showCode(ltiID) {\n    const token = Login.getToken();\n    this.api.viewArduinoCode(ltiID, token).subscribe((v) => {\n      if (!v['view']) {\n        for (const key in window['ArduinoUno_name']) {\n          if (window['ArduinoUno_name'][key]) {\n            window['ArduinoUno_name'][key].code = '';\n          }\n        }\n      }\n    });\n  }\n\n  /** Function called when Start Simulation button is triggered */\n  StartSimulation() {\n    this.disabled = true;\n    if (!this.graphToggle) {\n      this.graphToggle = !this.graphToggle;\n    }\n    // Clears Output in Console\n    Workspace.ClearConsole();\n    // prints the output in console\n    window['printConsole']('Starting Simulation', ConsoleType.INFO);\n\n    this.stoggle = !this.stoggle;\n    const sim = document.getElementById('console');\n\n    // Show Loading Animation\n    document.getElementById('simload').style.display = 'block';\n\n    // if status is Stop simulation then console is opened\n    if (!this.stoggle) {\n      // Compile code and show loading animation\n      sim.style.display = 'block';\n      Workspace.CompileCode(this.api, () => {\n        this.disabled = false;\n        document.getElementById('simload').style.display = 'none';\n      });\n    } else {\n      // Hide loading animation\n      sim.style.display = 'none';\n      Workspace.stopSimulation(() => {\n        this.disabled = false;\n        document.getElementById('simload').style.display = 'none';\n      });\n    }\n  }\n  /** Function called to hide simulation loading svg */\n  hidesimload() {\n    const simload = document.getElementById('simload');\n    simload.style.display = 'none';\n  }\n  /**\n   * Hide/Show (toggle) Code Editor\n   * @param elem Code Editor Parent Div\n   */\n  toggleCodeEditor(elem: HTMLElement) {\n    elem.classList.toggle('show-code-editor');\n    this.toggle = !this.toggle;\n    this.openCodeEditor = !this.openCodeEditor;\n  }\n  /** Function called to Minimize Virtual console */\n  minimizeConsole() {\n    const Console = document.getElementById('console');\n    const close = document.querySelector('#console > .body');\n    if (this.toggle1) {\n      this.toggle1 = !this.toggle1;\n    }\n    this.atoggle = !this.atoggle;\n    if (this.atoggle) {\n      (close as HTMLElement).style.display = 'none';\n      Console.style.height = 'auto';\n    } else {\n      (close as HTMLElement).style.display = 'flex';\n      Console.style.height = '30%';\n    }\n  }\n  /** function called to Expand Virtual Console */\n  expandConsole() {\n    const Console = document.getElementById('console');\n    if (this.atoggle) {\n      const close = document.querySelector('#console > .body');\n      (close as HTMLElement).style.display = 'flex';\n      this.atoggle = !this.atoggle;\n    }\n    this.toggle1 = !this.toggle1;\n    if (this.toggle1) {\n      Console.style.height = 'calc(100% - 110px)';\n    } else {\n      Console.style.height = '30%';\n    }\n  }\n  /**\n   * Clear Virtual Console\n   */\n  clearConsole() {\n    Workspace.ClearConsole();\n  }\n  /**\n   * Send Serial data to arduino\n   * @param sin Serial Input Html Element\n   */\n  PrintToConsole(sin: HTMLInputElement) {\n    if (sin.value) {\n      const tmp = sin.value;\n      for (const ard of window['scope']['ArduinoUno']) {\n        if (ard.runner) {\n          ard.runner.serialInput(tmp);\n        }\n      }\n    }\n    sin.value = ''; // Clear input\n  }\n\n  /**\n   * Project Title input focus out callback\n   * @param evt Event\n   */\n  onFocusOut(evt) {\n    // check if textbox is empty if it is change title back to Untitled\n    const el = evt.target;\n    if (el.value === '') {\n      el.value = 'Untitled';\n    }\n    this.projectTitle = el.value;\n    return this.projectTitle;\n  }\n  /**\n   * Function invoked when dbclick is performed on a component inside ComponentList\n   * @param key string\n   */\n  componentdbClick(key: string) {\n    Workspace.addComponent(key, 100, 100, 0, 0);\n  }\n  /**\n   * Event is fired when the user starts dragging an component or text selection.\n   * @param event DragEvent\n   * @param key string\n   */\n  dragStart(event: DragEvent, key: string) {\n    // Save Dump of current Workspace\n    event.dataTransfer.dropEffect = 'copyMove';\n    event.dataTransfer.setData('text', key);\n  }\n  /**\n   * Function calls zoomIn/Out() mentioned in Workspace.ts\n   * @param x number\n   */\n  zoom(x: number) {\n    if (x === 0) {\n      Workspace.zoomIn();\n    } else {\n      Workspace.zoomOut();\n    }\n  }\n\n  autoLayout() {\n    // this.isAutoLayoutInProgress = true;\n    LayoutUtils.solveAutoLayout();\n    // this.isAutoLayoutInProgress = false;\n  }\n\n  /** Functions opens Info Dailog Box on selecting the component */\n  openInfo() {\n    const dialogRef = this.dialog.open(ViewComponentInfoComponent, {\n      width: '500px'\n    });\n    dialogRef.afterClosed();\n  }\n  /** Function opens Dailog Box on selecting Export option */\n  openDailog() {\n    const exportref = this.dialog.open(ExportfileComponent);\n    exportref.afterClosed();\n  }\n  /** Function opens Component List Dailog box on selecting view option */\n  openview() {\n    const viewref = this.dialog.open(ComponentlistComponent, {\n      width: '600px'\n    });\n    viewref.afterClosed();\n  }\n  /** Function deletes the component */\n  delete() {\n    Workspace.DeleteComponent();\n    Workspace.hideContextMenu();\n  }\n  /** Function pastes the component */\n  paste() {\n    Workspace.pasteComponent();\n    Workspace.hideContextMenu();\n  }\n  /** Function copy the component */\n  copy() {\n    Workspace.copyComponent();\n    Workspace.hideContextMenu();\n  }\n  /** Function saves or updates the project Online */\n  SaveProject() {\n    // if Not logged in show message\n    if (!(Login.getToken())) {\n      AlertService.showAlert('Please login! Before Login Save the Project Temporary.');\n      return;\n    }\n    // if projet id is uuid (online circuit)\n    if (SaveOnline.isUUID(this.projectId) && this.ltiId === '') {\n      this.aroute.queryParams.subscribe(params => {\n        const branch = params.branch;\n        const versionId = params.version;\n        const newVersionId = this.getRandomString(20);\n        // Update Project to DB\n        SaveOnline.Save(this.projectTitle, this.description, this.api, branch, newVersionId, (out) => {\n          AlertService.showAlert('Updated');\n          if (out['duplicate']) {\n            // TODO: if duplicate, refresh the route with same versionId and same branch\n            this.router.navigateByUrl('/', { skipLocationChange: true }).then(() => {\n              // add new query parameters\n              this.router.navigate(\n                ['/simulator'],\n                {\n                  relativeTo: this.aroute,\n                  queryParams: {\n                    id: out.save_id,\n                    online: true,\n                    offline: null,\n                    gallery: null,\n                    version: versionId,\n                    branch\n                  },\n                  queryParamsHandling: 'merge'\n                }\n              );\n            });\n\n            return;\n          }\n          // If project is not duplicate refresh route with newVersion Id and same branch\n          this.router.navigateByUrl('/', { skipLocationChange: true }).then(() => {\n            // add new query parameters\n            this.router.navigate(\n              ['/simulator'],\n              {\n                relativeTo: this.aroute,\n                queryParams: {\n                  id: out.save_id,\n                  online: true,\n                  offline: null,\n                  gallery: null,\n                  version: newVersionId,\n                  branch\n                },\n                queryParamsHandling: 'merge'\n              }\n            );\n          });\n        }, this.projectId);\n      });\n    } else {\n      // TODO: Save a new project within master branch\n      const branch = 'master';\n      const versionId = this.getRandomString(20);\n      // Save Project and show alert\n      SaveOnline.Save(this.projectTitle, this.description, this.api, branch, versionId, (out) => {\n        AlertService.showAlert('Saved');\n        // add new query parameters\n        this.router.navigate(\n          [],\n          {\n            relativeTo: this.aroute,\n            queryParams: {\n              id: out.save_id,\n              online: true,\n              offline: null,\n              gallery: null,\n              version: versionId,\n              branch\n            },\n            queryParamsHandling: 'merge'\n          }\n        );\n      });\n    }\n  }\n  /** Function saves or updates the project offline */\n  SaveProjectOff(callback = null) {\n    // if Project is UUID\n    if (SaveOnline.isUUID(this.projectId)) {\n      AlertService.showAlert('Project is already Online!');\n      return;\n    }\n    // Save circuit if id is not presenr\n    if (this.projectId) {\n      Workspace.SaveCircuit(this.projectTitle, this.description, callback, this.projectId);\n    } else {\n      // save circuit and add query parameters\n      Workspace.SaveCircuit(this.projectTitle, this.description, (v) => {\n        this.router.navigate(\n          [],\n          {\n            relativeTo: this.aroute,\n            queryParams: {\n              id: v.id,\n              offline: true,\n              gallery: null\n            },\n            queryParamsHandling: 'merge'\n          }\n        );\n        if (callback) {\n          callback();\n        }\n      });\n    }\n  }\n\n  /**\n   * Function save the gallery\n   */\n  addToGallery() {\n    SaveOnline.staffSaveGallery(this.projectTitle, this.description, this.api, (out) => {\n      // this.router.navigate(['/gallery'])\n    });\n\n  }\n  /** Function clear variables in the Workspace */\n  ClearProject() {\n    Workspace.ClearWorkspace();\n    this.closeProject();\n  }\n  /**\n   * Fetches project from cloud\n   * @param id Project id\n   * @param offline A check whether circuit is offline or shared in absence of token\n   */\n  LoadOnlineProject(id, offline) {\n    const token = Login.getToken();\n    if (!token && offline !== 'false') {\n      AlertService.showAlert('Please Login');\n      return;\n    }\n    this.aroute.queryParams.subscribe(params => {\n      // read branch from queryParams\n      const branch = params.branch;\n      // read version from queryParams\n      const version = params.version;\n      // read project from DB\n      this.api.readProject(id, branch, version, token).subscribe((data: any) => {\n        this.id = data.id;\n        this.projectTitle = data.name;\n        this.description = data.description;\n        this.saveTime = data.save_time;\n        this.title.setTitle(this.projectTitle + ' | Arduino On Cloud');\n        Workspace.Load(JSON.parse(data.data_dump));\n      });\n    }, (err: HttpErrorResponse) => {\n      if (err.status === 401) {\n        AlertService.showAlert('You are Not Authorized to view this circuit');\n        window.open('../../../', '_self');\n        return;\n      }\n      AlertService.showAlert('Something Went Wrong');\n      console.log(err);\n    });\n  }\n\n  /**\n   * Function called after reading data from offline\n   * @param data any\n   */\n  LoadProject(data: any) {\n    this.projectTitle = data.project.name;\n    this.description = data.project.description;\n    this.title.setTitle(this.projectTitle + ' | Arduino On Cloud');\n    Workspace.Load(data);\n  }\n  /**\n   * Close Clear message Dialog\n   */\n  closeProject() {\n    const closeProject = document.getElementById('opendialog');\n    closeProject.style.display = 'none';\n  }\n  /**\n   * Open clear project dialog\n   */\n  openProject() {\n    const openProject = document.getElementById('opendialog');\n    openProject.style.display = 'block';\n  }\n  /**\n   * Redirect to Login\n   */\n  Login() {\n    Login.redirectLogin();\n  }\n  /**\n   * Logout and clear token\n   */\n  Logout() {\n    // Login.logout();\n    this.api.logout(Login.getToken());\n  }\n  RouteToSimulator() {\n    this.window.location = '../#/simulator';\n    this.window.location.reload();\n  }\n  /**\n   * @param routeLink route link\n   * @param isAbsolute is the link absolute? [pass false if relatives]\n   */\n  RouteToFunction(routeLink, isAbsolute = false) {\n    return () => {\n      if (isAbsolute) {\n        this.window.location = routeLink;\n      } else {\n        this.router.navigateByUrl(routeLink);\n      }\n    };\n  }\n  /**\n   * Handles routeLinks\n   */\n  HandleRouter(callback) {\n    AlertService.showOptions(\n      'Save changes to the untitled circuit? Your changes will be lost if you do not save it.',\n      () => {\n        AlertService.showCustom(\n          SaveProjectDialogComponent,\n          {\n            onChangeProjectTitle: (e) => {\n              this.projectTitle = e.target.value || '';\n              return this.projectTitle;\n            },\n            projectTitle: this.projectTitle,\n          },\n          (value) => {\n            if (value) {\n              this.SaveProjectOff(() => {\n                callback();\n              });\n            }\n          }\n        );\n      },\n      () => {\n        callback();\n      },\n      () => { },\n      'Save',\n      'Don\\'t save',\n      'Cancel'\n    );\n  }\n  /**\n   * Open Gallery Project\n   * @param index Gallery item index\n   * @param id Component Id\n   */\n  OpenGallery(index: string, id: any) {\n    // Show Loading animation\n    window['showLoading']();\n    // Get Position\n    const i = parseInt(index, 10);\n    // if it is a valid number then proceed\n    if (!isNaN(i)) {\n      // Fetch all samples\n      this.api.fetchSingleProjectToGallery(id).subscribe((out: any) => {\n        if (out) {\n          // set project title\n          this.projectTitle = out.name;\n          this.title.setTitle(this.projectTitle + ' | Arduino On Cloud');\n          // Set project description\n          this.description = out.description;\n          // Load the project\n          Workspace.Load(JSON.parse(out.data_dump));\n        } else {\n          AlertService.showAlert('No Item Found');\n        }\n        window['hideLoading']();\n      }, err => {\n        console.log(err);\n        AlertService.showAlert('Failed to load From gallery!');\n        window['hideLoading']();\n      });\n    } else {\n      window['hideLoading']();\n    }\n  }\n\n  // Export to a JSON File\n  exportJson() {\n\n    // Check if workspace is empty or not\n    if (Workspace.checkIfWorkspaceEmpty()) {\n      AlertService.showAlert('You have nothing to save!'); // Throw Alert if Workspace is empty\n    } else {\n      // Open File rename dialog\n      const viewref = this.dialog.open(ExportJSONDialogComponent, {\n        width: '600px',\n        data: { description: this.description, title: this.projectTitle }\n      });\n      viewref.afterClosed();\n    }\n  }\n\n  // Import from jSON file\n  importJson(file) {\n    // Read File\n    const fileReader = new FileReader();\n    fileReader.readAsText(file, 'UTF-8');\n    fileReader.onload = (event: Event) => {\n      const data = fileReader.result;\n      // Load the data object and change into workspace\n      this.LoadProject(JSON.parse(data as string));\n    };\n  }\n\n  // Function to Exit Project & go back to mainScreen\n  exitProject() {\n    if (Workspace.checkIfWorkspaceEmpty()) {\n      this.router.navigate(['/']);\n    } else {\n      this.dialog.open(ExitConfirmDialogComponent).afterClosed().subscribe(res => {\n        if (res) {\n          this.router.navigate(['/']);\n        }\n      });\n    }\n  }\n\n  /**\n   * Function to enable/disable undo/redo button depending upon undostack\n   * @param type button type\n   * @returns boolean\n   */\n  enableButton(type) {\n    if (!UndoUtils.enableButtonsBool) {\n      return true;\n    }\n    if (type === 'undo') {\n      return UndoUtils.undo.length <= 0;\n    } else if (type === 'redo') {\n      return UndoUtils.redo.length <= 0;\n    }\n  }\n\n  /**\n   * Undo Operation\n   */\n  undoChange() {\n    UndoUtils.workspaceUndo();\n  }\n  /**\n   * Redo Operation\n   */\n  redoChange() {\n    UndoUtils.workspaceRedo();\n  }\n  /**\n   * Create a new branch for project\n   * @param obj Object containing branch and version\n   */\n  createNewBranch(obj) {\n    const branch = obj.branch;\n    const versionId = obj.version;\n    // Save Project and show alert\n    SaveOnline.Save(this.projectTitle, this.description, this.api, branch, versionId, (out) => {\n      AlertService.showAlert('Created new branch');\n      this.router.navigateByUrl('/', { skipLocationChange: true }).then(() => {\n        // add new query parameters\n        this.router.navigate(\n          ['/simulator'],\n          {\n            relativeTo: this.aroute,\n            queryParams: {\n              id: out.save_id,\n              online: true,\n              offline: null,\n              gallery: null,\n              version: versionId,\n              branch\n            },\n            queryParamsHandling: 'merge'\n          }\n        );\n      });\n    }, this.projectId);\n  }\n\n  /**\n   * Generate and return a random string\n   * @param length Length of random string\n   * @returns random string\n   */\n  getRandomString(length) {\n    let result = '';\n    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n    const charactersLength = characters.length;\n    for (let i = 0; i < length; i++) {\n      result += characters.charAt(Math.floor(Math.random() *\n        charactersLength));\n    }\n    return result;\n  }\n\n  showGraph() {\n    this.graphToggle = !this.graphToggle;\n  }\n\n  /**\n   * Saves the circuit and saves it as a submission for given LTI details\n   */\n  SaveLTISubmission() {\n    const token = Login.getToken();\n    this.branch = this.branch ? this.branch : 'master';\n    this.version = this.getRandomString(20);\n    SaveOnline.Save(this.projectTitle, this.description, this.api, this.branch, this.version, (out) => {\n      this.projectId = out.save_id;\n      const data = {\n        schematic: this.projectId,\n        ltisession: {\n          id: this.ltiId,\n          user_id: this.ltiUserId,\n          oauth_nonce: this.ltiNonce,\n        },\n        student_simulation: this.simSelected,\n      };\n      this.api.arduinoSubmitCircuit(token, data).subscribe(res => {\n        AlertService.showAlert(res['message']);\n        // add new query parameters\n        this.router.navigate(\n          [],\n          {\n            relativeTo: this.aroute,\n            queryParams: {\n              id: out.save_id,\n              lti_id: this.ltiId,\n              lti_user_id: this.ltiUserId,\n              lti_nonce: this.ltiNonce,\n              branch: this.branch,\n              version: this.version,\n              online: true,\n              offline: false,\n              gallery: null\n            },\n            queryParamsHandling: 'merge'\n          });\n        return;\n      }, err => {\n        AlertService.showAlert(err['error']['error']);\n        console.log(err);\n      });\n    });\n  }\n\n  /**\n   * Returns date in human readable format\n   * @param date Date string\n   * @returns string with formatted date\n   */\n  getFormattedDate(date: string) {\n    const dateObj = new Date(date);\n    let str = `${dateObj.getDate()}/${dateObj.getMonth()}/${dateObj.getFullYear()} `;\n    str += `${dateObj.getHours()}:${dateObj.getMinutes()}:${dateObj.getSeconds()}`;\n    return str;\n  }\n\n  callGetSimRecord($event) {\n    if ($event) {\n      this.getSimRecord();\n    }\n  }\n\n  /**\n   * Return the list of student simulation records\n   */\n  getSimRecord() {\n    const temp = [];\n    this.api.getLTISimulationData(this.id, this.ltiId).subscribe((v) => {\n      for (const val of v) {\n        const data = JSON.parse(val.result.replaceAll('\\'', '\\\"'));\n        const key = (Object.keys(data));\n        temp.push({id: val.id, length: data[key[0]]['length']});\n      }\n      this.simData = temp;\n    });\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/submissionlist/submissionlist.component.css",
    "content": "table {\n  width: 100%;\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/submissionlist/submissionlist.component.html",
    "content": "<app-header title=\"Submissions\"></app-header>\n\n<h3 style=\"font-weight: 900; font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif; margin: 1em;\">\n  Submissions\n</h3>\n\n<div class=\"m-3\">\n  <button mat-raised-button color=\"primary\" type=\"button\" routerLink=\"/lti\"\n    [queryParams]=\"{id: id, branch: branch, version: version, lti: lti}\">RETURN TO LTI APP</button>\n  <mat-form-field style=\"float: right;\">\n    <input matInput placeholder=\"Search the user\" (keyup)=\"searchNFilter($event.target.value)\" />\n  </mat-form-field>\n</div>\n\n<div class=\"mat-elevation-z8\">\n  <table mat-table [dataSource]=\"submissions\" matSort>\n    <ng-container matColumnDef=\"user\">\n      <th mat-header-cell *matHeaderCellDef mat-sort-header>User</th>\n      <td mat-cell *matCellDef=\"let submission\">{{ submission['user'] }}</td>\n    </ng-container>\n\n    <ng-container matColumnDef=\"user_id\">\n      <th mat-header-cell *matHeaderCellDef mat-sort-header>User ID in LMS</th>\n      <td mat-cell *matCellDef=\"let submission\">{{ submission['user_id'] }}</td>\n    </ng-container>\n\n    <ng-container matColumnDef=\"save_time\">\n      <th mat-header-cell *matHeaderCellDef mat-sort-header>Submitted On</th>\n      <td mat-cell *matCellDef=\"let submission\">{{ getFormattedDate(submission['save_time']) }}</td>\n    </ng-container>\n\n    <ng-container matColumnDef=\"lis_outcome_service_url\">\n      <th mat-header-cell *matHeaderCellDef mat-sort-header>Submitted From</th>\n      <td mat-cell *matCellDef=\"let submission\">{{ submission['lis_outcome_service_url'] }}</td>\n    </ng-container>\n\n    <ng-container matColumnDef=\"score\">\n      <th mat-header-cell *matHeaderCellDef mat-sort-header>Score</th>\n      <td mat-cell *matCellDef=\"let submission\">{{ submission['score'] }}</td>\n    </ng-container>\n\n    <ng-container matColumnDef=\"run\">\n      <th mat-header-cell *matHeaderCellDef>Submissions</th>\n      <td mat-cell *matCellDef=\"let submission\">\n        <button mat-raised-button color=\"primary\" [routerLink]=\"['/simulator']\"\n          [queryParams]=\"{id: submission.id, offline: false, branch: submission.branch, version: submission.version}\">\n          OPEN SUBMISSION\n        </button>\n      </td>\n    </ng-container>\n\n    <tr mat-header-row *matHeaderRowDef=\"columnNames\"></tr>\n    <tr mat-row *matRowDef=\"let row; columns: columnNames\"></tr>\n\n    <tr mat-row *matNoDataRow>\n      <td mat-cell colspan=\"6\">\n        <span *ngIf=\"searchString.length !== 0\">\n          No data matching the filter \"{{submissions.filter}}\"\n        </span>\n        <span *ngIf=\"searchString.length === 0\">\n          No data found\n        </span>\n      </td>\n    </tr>\n  </table>\n  <mat-paginator [pageSizeOptions]=\"[20, 100, 500]\" showFirstLastButtons></mat-paginator>\n</div>"
  },
  {
    "path": "ArduinoFrontend/src/app/submissionlist/submissionlist.component.ts",
    "content": "import { Component, OnInit, ViewChild } from '@angular/core';\nimport { MatPaginator, MatSort, MatTableDataSource } from '@angular/material';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { ApiService } from '../api.service';\nimport { Login } from '../Libs/Login';\n\nexport interface Submission {\n  id: string;\n  branch: string;\n  version: string;\n  lis_outcome_service_url: string;\n  user: string;\n  user_id: string;\n  save_time: Date;\n  score: number;\n}\n\n/**\n * Class for Submission List\n */\n@Component({\n  selector: 'app-submissionlist',\n  templateUrl: './submissionlist.component.html',\n  styleUrls: ['./submissionlist.component.css']\n})\nexport class SubmissionlistComponent implements OnInit {\n\n  /**\n   * Data source/list of submissions shown on the mat table\n   */\n  submissions = new MatTableDataSource<Submission>([]);\n  /**\n   * Ordered list representing column names in table headers\n   */\n  columnNames: string[];\n  /**\n   * Id of the circuit received from query parameters\n   */\n  id: string;\n  /**\n   * Branch of the circuit received from query parameters\n   */\n  branch: string;\n  /**\n   * Version of the circuit received from query parameters\n   */\n  version: string;\n  /**\n   * LTI Id of the circuit received from query parameters\n   * Used in return button above the table\n   */\n  lti: string;\n  /**\n   * a state keeping track of value in search box.\n   */\n  searchString: string;\n  /**\n   * for adding mat sort functionality to mat table\n   */\n  @ViewChild(MatSort) sort: MatSort;\n  /**\n   * for adding mat paginator functionality to mat table\n   */\n  @ViewChild(MatPaginator) paginator: MatPaginator;\n\n  /**\n   * Submission List Component Constructor\n   * @param router Router to navigate\n   * @param aroute Activated Route\n   * @param api API service for api calls\n   */\n  constructor(\n    private router: Router,\n    private aroute: ActivatedRoute,\n    private api: ApiService,\n  ) { }\n\n  /**\n   * On Init Callback\n   */\n  ngOnInit() {\n    document.title = 'Submissions | Arduino on Cloud';\n    this.columnNames = ['user', 'user_id', 'save_time', 'lis_outcome_service_url', 'score', 'run', ];\n    this.submissions.data.splice(0, this.submissions.data.length);\n    this.aroute.queryParams.subscribe(v => {\n      const token = Login.getToken();\n      if (!v.id || !v.branch || !v.version || !token) {\n        setTimeout(() => this.router.navigate(['dashboard'])\n          , 100);\n        return;\n      }\n      this.id = v.id;\n      this.branch = v.branch;\n      this.version = v.version;\n      this.lti = v.lti;\n      if (v.scored) {\n        this.PopulateSubmissions();\n      }\n    });\n  }\n\n  /**\n   * Sets up the table accessing functions for the mat table\n   */\n  setUpTable() {\n    this.submissions.filterPredicate = (data, filter) =>\n      data.user.toLocaleLowerCase().includes(filter) || data.user_id.toLocaleLowerCase().includes(filter);\n    this.submissions.paginator = this.paginator;\n    this.submissions.sort = this.sort;\n    // this.submissions.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0);\n    this.submissions.sortingDataAccessor = (item, property) => {\n      switch (property) {\n        case 'save_time': {\n          const newDate = new Date(item.save_time);\n          return newDate;\n        }\n        default: {\n          return item[property];\n        }\n      }\n    };\n  }\n\n  /**\n   * Function that executes on modifying value in the search box\n   * @param searchString String entered as input by user\n   */\n  searchNFilter(searchString: string) {\n    this.submissions.filter = searchString.trim().toLocaleLowerCase();\n    if (this.submissions.paginator) {\n      this.submissions.paginator.firstPage();\n    }\n  }\n\n  /**\n   * Retrieves submissions from backend\n   */\n  PopulateSubmissions() {\n    const token = Login.getToken();\n    this.api.getArduinoSubmissions(this.id, this.branch, this.version, token).subscribe(res => {\n      for (let i = 0; i < res['length']; i++) {\n        this.submissions.data.push({\n          user: res[i]['student'] ? res[i]['student']['username'] : 'Anonymous User',\n          user_id: res[i]['ltisession']['user_id'],\n          save_time: res[i]['schematic']['save_time'],\n          score: res[i]['score'],\n          id: res[i]['schematic']['save_id'],\n          branch: res[i]['schematic']['branch'],\n          version: res[i]['schematic']['version'],\n          lis_outcome_service_url: this.getHostFromUrl(res[i]['ltisession']['lis_outcome_service_url']),\n        });\n      }\n      this.setUpTable();\n    }, err => {\n      console.log(err);\n      this.setUpTable();\n    });\n  }\n\n  /**\n   * Converts date string in appropriate format\n   * @param date Date string returned by backend\n   * @returns date string in human readable format\n   */\n  getFormattedDate(date: string) {\n    const dateObj = new Date(date);\n    let str = `${dateObj.getDate()}/${dateObj.getMonth()}/${dateObj.getFullYear()} `;\n    str += `${dateObj.getHours()}:${dateObj.getMinutes()}:${dateObj.getSeconds()}`;\n    return str;\n  }\n\n  getHostFromUrl(url: string) {\n    return url ? (url.search('://') === -1 ? url.split('://')[0] : url.split('://')[1]).split('/')[0] : 'None';\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/versioning-panel/create-variation-dialog/create-variation-dialog.component.css",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/versioning-panel/create-variation-dialog/create-variation-dialog.component.html",
    "content": "<h2 mat-dialog-title>Create New Variation</h2>\n<div mat-dialog-content>\n\n  <mat-form-field>\n    <mat-label>Variation Name</mat-label>\n    <input matInput type=\"text\" [formControl]=\"variationName\">\n    <mat-error *ngIf=\"variationName.errors?.required\">This field is mandatory</mat-error>\n    <mat-error *ngIf=\"variationName.errors?.minlength\">String should not be empty</mat-error>\n    <mat-error *ngIf=\"variationName.errors?.maxlength\">String should not exceed 20 characters</mat-error>\n  </mat-form-field>\n\n</div>\n<div>\n  <button mat-raised-button (click)=\"createVariation()\" color=\"primary\" [disabled]=\"variationName.invalid\">CREATE VARIATION</button>\n</div>"
  },
  {
    "path": "ArduinoFrontend/src/app/versioning-panel/create-variation-dialog/create-variation-dialog.component.ts",
    "content": "import { Component, OnInit } from '@angular/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { MatDialogRef } from '@angular/material';\n\n@Component({\n  selector: 'app-create-variation-dialog',\n  templateUrl: './create-variation-dialog.component.html',\n  styleUrls: ['./create-variation-dialog.component.css']\n})\nexport class CreateVariationDialogComponent implements OnInit {\n\n  /**\n   * FormControl for variation name\n   */\n  variationName = new FormControl('', [Validators.required, Validators.maxLength(20), Validators.minLength(1)]);\n\n  /**\n   * CreateVariation Dialog Component Constructor\n   * @param dialogRef CreateVariationDialog's Reference\n   */\n  constructor(\n    private dialogRef: MatDialogRef<CreateVariationDialogComponent>\n  ) { }\n\n  /**\n   * On Init Callback\n   */\n  ngOnInit() {\n  }\n\n  /**\n   * Close dialog with variationName as observable\n   */\n  createVariation() {\n    this.dialogRef.close(this.variationName.value);\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/versioning-panel/versioning-panel.component.css",
    "content": ".var-selected {\n    background-color: #dddddd;\n}\n.version-list {\n    padding: 6px 24px;\n    cursor: pointer;\n    transition: 0.3s;\n}\n.version-list p {\n    margin: 0;\n}\n.version-list:hover {\n    background-color: #f0f0f0;\n}\n.menu {\n    padding: 4px 12px;\n}\n.menu p {\n    margin: 0;\n    font-size: 1rem;\n    font-family: \"Roboto\", \"Helvetica\", \"Arial\", sans-serif;\n    font-weight: 400;\n    line-height: 1.5;\n    letter-spacing: 0.00938em;\n}\n#msg_text {\n    margin: 12px;\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/versioning-panel/versioning-panel.component.html",
    "content": "<br>\n<div>\n\n  <div style=\"display: flex; justify-content: space-between; margin: 0 12px;\">\n    <h4 style=\"text-align:center; text-align:left;\">History</h4>\n    <mat-icon style=\"cursor:pointer;\" (click)=\"createBranch()\">create_new_folder</mat-icon>\n  </div>\n\n  <!-- message text to show -->\n  <p id=\"msg_text\" style=\"display:none;\"></p>\n\n  <mat-accordion>\n\n    <mat-expansion-panel *ngFor=\"let branch of branches;let i = index\" hideToggle [expanded]=\"step === i\"\n      (opened)=\"setStep(i)\" class=\"version-panel-class\">\n      <mat-expansion-panel-header>\n        <mat-panel-title>\n          Variation {{branches.length-i}}: {{branch.name}}\n        </mat-panel-title>\n        <!-- delete branch button -->\n        <mat-icon [matMenuTriggerFor]=\"deleteMenu\" #deleteMenuTrigger=\"matMenuTrigger\" (click)=\"delete('branch',branch)\"\n          *ngIf=\"branchName != branch.name\">delete</mat-icon>\n      </mat-expansion-panel-header>\n      <div *ngFor=\"let version of branch.versions\" style=\"display:flex;\" (click)=\"switchVersion(version,$event)\"\n        [ngClass]=\"{'var-selected':(version.version==versionId && branchName == version.branch)}\" class=\"version-list\">\n        <p>{{version.name}} <br> {{version.formated_save_time}}</p>\n        <span style=\"flex: 1;\"></span>\n        <!-- delete variation button -->\n        <mat-icon *ngIf=\"version.version!=versionId || branchName != version.branch\" [matMenuTriggerFor]=\"deleteMenu\"\n          #deleteMenuTrigger=\"matMenuTrigger\" (click)=\"delete('version',version)\" id=\"{{version.version}}\">\n          delete_outline</mat-icon>\n      </div>\n    </mat-expansion-panel>\n\n  </mat-accordion>\n\n</div>\n\n<!-- Delete Confirmation Menu -->\n<mat-menu #deleteMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\n  <div class=\"menu\">\n    <p><b>{{bannerMsg}}</b></p>\n    <button mat-raised-button (click)=\"confirmDelete()\">Confirm</button>\n  </div>\n</mat-menu>"
  },
  {
    "path": "ArduinoFrontend/src/app/versioning-panel/versioning-panel.component.ts",
    "content": "import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport { MatAccordion, MatDialog, MatMenuTrigger } from '@angular/material';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { ApiService } from '../api.service';\nimport { Login } from '../Libs/Login';\nimport { CreateVariationDialogComponent } from './create-variation-dialog/create-variation-dialog.component';\n\nexport class DeleteObj {\n  type: string;\n  data: any;\n}\n@Component({\n  selector: 'app-versioning-panel',\n  templateUrl: './versioning-panel.component.html',\n  styleUrls: ['./versioning-panel.component.css']\n})\nexport class VersioningPanelComponent implements OnInit {\n\n  @Input() lti: boolean;\n  @Output() createNewBranch = new EventEmitter();\n  @ViewChild(MatAccordion) accordion: MatAccordion;\n  @ViewChild('deleteMenuTrigger') deleteMenuTrigger: MatMenuTrigger;\n  /**\n   * List of branches and their version\n   */\n  branches = [];\n  /**\n   * Step for mat-accordian\n   */\n  step = 0;\n  /**\n   * Id of active variation\n   */\n  id: string;\n  /**\n   * Versoin Id of active variation\n   */\n  versionId: string;\n  /**\n   * Branch name of active variation\n   */\n  branchName: string;\n  /**\n   * Message to show on confirmation menu\n   */\n  bannerMsg = 'Are you sure you want to delete this version?';\n  /**\n   * Object for saving details of variation to be deleted\n   */\n  toDeleteObj: DeleteObj;\n\n  /**\n   * VersioningPanel Component Constructor\n   * @param dialog Material Dialog\n   * @param api API service for api calls\n   * @param aroute Activated Route\n   * @param router Router to navigate\n   */\n  constructor(\n    private dialog: MatDialog,\n    private api: ApiService,\n    private aroute: ActivatedRoute,\n    private router: Router,\n  ) { }\n\n  /**\n   * On Init Callback\n   */\n  ngOnInit() {\n    const msg = document.getElementById('msg_text');\n    // make branch list empty\n    this.branches = [];\n    // set step to 0\n    this.step = 0;\n    if (!this.lti) {\n      this.aroute.queryParams.subscribe(params => {\n        this.id = params.id;\n        if (params.version && params.branch) {\n          // TODO: If version and branch is available in queryParams, fetch respective versions of it\n          msg.style.display = 'none';\n          this.versionId = params.version;\n          this.branchName = params.branch;\n          this.getAllVersions();\n        } else {\n          // TODO: If version and branch is not available in queryParams, show message on frontend\n          msg.innerHTML = 'No variation available';\n          msg.style.display = 'unset';\n        }\n      });\n    }\n  }\n\n  /**\n   * Get all variation of project\n   */\n  getAllVersions() {\n    // get Auth token\n    const token = Login.getToken();\n    this.api.listAllVersions(this.id, token).subscribe((v) => {\n      // Push variations into list, within their respective branches\n      for (const e in v) {\n        if (v.hasOwnProperty(e)) {\n          const dateObj = new Date(v[e].save_time);\n          v[e].formated_save_time = `${dateObj.getDate()}/${dateObj.getMonth()}/${dateObj.getFullYear()}\n        ${dateObj.getHours()}:${dateObj.getMinutes()}`;\n          // found flag to false\n          let found = false;\n\n          // check if branch already available\n          for (const i in this.branches) {\n            if (this.branches[i].name === v[e].branch) {\n              this.branches[i].versions.push(v[e]);\n              // set found flag to false\n              found = true;\n            }\n          }\n          if (found) {\n            continue;\n          } else {\n            // add a new branch\n            const obj = { name: v[e].branch, versions: [v[e]] };\n            this.branches.push(obj);\n          }\n        }\n      }\n\n      // Sort versions in branch\n      for (const e in this.branches) {\n        if (this.branches.hasOwnProperty(e)) {\n          this.branches[e].versions.sort((a, b) => {\n            const date1 = new Date(a.save_time);\n            const date2 = new Date(b.save_time);\n            if (date1 > date2) {\n              return -1;\n            } else if (date1 < date2) {\n              return 1;\n            } else {\n              return 0;\n            }\n          });\n        }\n      }\n\n      // Sort branches\n      this.branches.sort((a, b) => {\n        const branch1Last = new Date(a.versions[a.versions.length - 1].save_time);\n        const branch2Last = new Date(b.versions[b.versions.length - 1].save_time);\n        if (branch1Last < branch2Last) {\n          return 1;\n        } else if (branch1Last > branch2Last) {\n          return -1;\n        } else {\n          return 0;\n        }\n      });\n\n      // determine current variation, and set value of step\n      for (let i = 0; i < this.branches.length; i++) {\n        for (const x in this.branches[i].versions) {\n          if (this.versionId === this.branches[i].versions[x].version && this.branchName === this.branches[i].name) {\n            this.step = i;\n          }\n        }\n      }\n\n    });\n  }\n\n  /**\n   * Create a new branch\n   */\n  createBranch() {\n    // open CreateVariationDialogComponent dialog\n    this.dialog.open(CreateVariationDialogComponent).afterClosed().subscribe((branch: any) => {\n      if (branch) {\n        // Emit createBranch\n        this.createNewBranch.emit({ branch, version: this.versionId });\n      }\n    });\n  }\n  /**\n   * Delete specific Variation\n   * @param variation Variation's Object\n   */\n  deleteVariation(variation) {\n    this.api.deleteVariation(variation.save_id, variation.branch, variation.version, Login.getToken()).subscribe((result) => {\n      this.ngOnInit();\n    });\n  }\n  /**\n   * Delete specific Branch\n   * @param branch Branch's Object\n   */\n  deleteBranch(branch) {\n    this.api.deleteBranch(branch.versions[0].save_id, branch.name, Login.getToken()).subscribe((result) => {\n      this.ngOnInit();\n    });\n  }\n  /**\n   * Change to clicked variation\n   * @param variation Variation clicked\n   * @param event Event\n   */\n  switchVersion(variation, event: Event) {\n    if (event.target !== document.getElementById(variation.version)) {\n      this.router.navigateByUrl('/', { skipLocationChange: true }).then(() =>\n        this.router.navigate(['/simulator'], {\n          queryParams: { id: variation.save_id, version: variation.version, branch: variation.branch }\n        })\n      );\n    }\n  }\n  /**\n   * Change value of step\n   * @param index Index clicked\n   */\n  setStep(index) {\n    this.step = index;\n  }\n  /**\n   * Open confirmation menu\n   * @param type Branch/Version\n   * @param data metadata about element\n   */\n  delete(type, data) {\n    this.toDeleteObj = { type, data };\n    // if branch, set message accordingly\n    type === 'branch' ? this.bannerMsg = 'Are you sure you want to delete this Variation?'\n      : this.bannerMsg = 'Are you sure you want to delete this version?';\n    // open confirmation menu\n    this.deleteMenuTrigger.openMenu();\n  }\n  /**\n   * Confirm Delete event\n   */\n  confirmDelete() {\n    if (this.toDeleteObj.type === 'branch') {\n      this.deleteBranch(this.toDeleteObj.data);\n    } else if (this.toDeleteObj.type === 'version') {\n      this.deleteVariation(this.toDeleteObj.data);\n    }\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/view-component-info/view-component-info.component.css",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/view-component-info/view-component-info.component.html",
    "content": "<h1 mat-dialog-title>{{data.name}}</h1>\n<div mat-dialog-content>\n  <img src={{data.image}} alt={{data.name}} style=\"max-width: 100%;\">\n  {{data.description}}\n  <p style=\"margin:0;\" id=\"dynamic-content\"></p>\n  <br>\n  <a mat-raised-button href=\"{{data.Datasheet}}\" target=\"_blank\" style=\"color: royalblue;\"\n    *ngIf=\"data.Datasheet\">Datasheet</a>\n  <h5 style=\"margin-top: 30px;\">Specification</h5>\n\n  <table mat-table [dataSource]=\"tableData\" class=\"mat-elevation-z8\"\n    style=\"width: 100%;margin-top: 8px;margin-bottom: 30px;\">\n    <ng-container [matColumnDef]=\"column\" *ngFor=\"let column of columns\">\n      <th mat-header-cell *matHeaderCellDef> {{column}} </th>\n      <td mat-cell *matCellDef=\"let element\"> {{element[column]}} </td>\n    </ng-container>\n    <tr mat-header-row *matHeaderRowDef=\"columns\"></tr>\n    <tr mat-row *matRowDef=\"let row; columns: columns;\"></tr>\n  </table>\n\n</div>\n<div mat-dialog-actions>\n  <button mat-button cdkFocusInitial (click)=\"close()\">Ok</button>\n</div>"
  },
  {
    "path": "ArduinoFrontend/src/app/view-component-info/view-component-info.component.spec.ts",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/view-component-info/view-component-info.component.ts",
    "content": "import { Component, OnInit } from '@angular/core';\nimport { MatDialogRef } from '@angular/material';\n\n/**\n * Class for View Info Dialog Component\n */\n@Component({\n  selector: 'app-view-component-info',\n  templateUrl: './view-component-info.component.html',\n  styleUrls: ['./view-component-info.component.css']\n})\nexport class ViewComponentInfoComponent implements OnInit {\n  /**\n   * Data That need to show in table\n   */\n  tableData = [];\n  /**\n   * Data including decription and image\n   */\n  data: any = {};\n  /**\n   * Column Names\n   */\n  readonly columns = ['Name', 'Value'];\n  /**\n   * Variable to specify if there is no data\n   */\n  noData = false;\n\n  /**\n   * View Project Info Dialog Component\n   * @param dialogRef Material Dialog Reference\n   */\n  constructor(public dialogRef: MatDialogRef<ViewComponentInfoComponent>) { }\n\n  /**\n   * On Init Function\n   */\n  ngOnInit() {\n    // Get the Selected Item\n    const item = window['Selected'];\n\n    if (item) {\n      // get the info\n      this.data = item.info;\n      // Create the table array\n      for (const propName in this.data.properties) {\n        if (this.data.properties[propName]) {\n          this.tableData.push({\n            Name: propName,\n            Value: this.data.properties[propName]\n          });\n        }\n      }\n      // Data is present\n      this.noData = false;\n\n      if (this.data.innerHTMLContent) {\n        document.getElementById('dynamic-content').innerHTML = this.data.innerHTMLContent;\n      }\n\n    } else {\n      // No Data is Present\n      this.noData = true;\n    }\n  }\n  /**\n   * Close View Component info dialog\n   */\n  close() {\n    this.dialogRef.close();\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/view-project/view-project.component.css",
    "content": ".data-body div {\n  font-weight: bold;\n}\n.data-body label {\n  font-weight: normal;\n}\n.data-body button {\n  margin: 15px 15px 15px 0;\n}\n.data-body button i {\n  color: white;\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/app/view-project/view-project.component.html",
    "content": "<app-header title=\"Arduino on Cloud\" color=\"cornflowerblue\"></app-header>\n\n<div style=\"overflow: hidden;max-width:100vw;\">\n  <div class=\"row\" *ngIf=\"data\" style=\"margin-top: 1em;\">\n    <div class=\"col-md-1\"></div>\n    <div class=\"col-md-10\">\n      <h2 style=\"margin-left: 1em;\">{{data.name}}</h2>\n      <hr>\n      <div class=\"row\">\n        <div class=\"col-md-7\">\n          <div style=\"display: flex;\">\n            <img style=\"max-width: 100%;margin: auto auto;\" src=\"{{data.base64_image}}\" alt=\"{{data.name}}\">\n          </div>\n        </div>\n        <div class=\"col-md-5 data-body\" style=\"padding-left: 30px;\">\n          <h3 style=\"font-family: cursive;\">Description</h3>\n          <p>{{data.description}}</p>\n          <button mat-raised-button color=\"primary\" [routerLink]=\"['/simulator']\"\n            [queryParams]=\"{id: data.save_id,version: data.version,branch: data.branch,offline: false}\">\n            Run Simulation</button>\n          <div style=\"margin-top: 100px;\"></div>\n          <div>Author Name: <label>{{data.owner}}</label></div>\n          <div>Created At: <label>{{data.save_time}}</label></div>\n          <div>Edited At: <label>{{data.create_time}}</label></div>\n\n          <a href=\"https://www.facebook.com/sharer/sharer.php?u={{shareURL}}\" target=\"_blank\">\n            <button mat-mini-fab color=\"primary\" matTooltip=\"Share it on Facebook\">\n              <i class=\"fab fa-facebook-f\" style=\"font-size: medium;\"></i>\n            </button>\n          </a>\n\n          <a href=\"https://www.linkedin.com/sharing/share-offsite/?url={{shareURL}}\" target=\"_blank\">\n            <button mat-mini-fab style=\"background-color: #0080FF;\" matTooltip=\"Share it on Linked In\">\n              <i class=\"fab fa-linkedin-in\" style=\"font-size: x-large;\"></i>\n            </button>\n          </a>\n\n          <a href=\"http://www.reddit.com/submit?url={{shareURL}}&title={{shareName}}\" target=\"_blank\">\n            <button mat-mini-fab style=\"background-color: #ff4500;\" matTooltip=\"Share it on Reddit\">\n              <i class='fab fa-reddit-alien' style='font-size:24px;'></i>\n            </button>\n          </a>\n          <a href=\"mailto:?subject={{shareName}}&body={{shareURL}}\" target=\"_blank\">\n            <button mat-mini-fab style=\"background-color: black;\" matTooltip=\"Share it with Mail\">\n              <i class=\"fa fa-envelope\" style=\"font-size: medium;\"></i>\n            </button>\n          </a>\n          <button mat-mini-fab style=\"background-color: black;\" matTooltip=\"Copy Sharing URL\">\n            <i class=\"fa fa-share-alt\" style=\"font-size: medium;\"></i>\n          </button>\n\n        </div>\n      </div>\n    </div>\n    <div class=\"col-md-1\"></div>\n  </div>\n</div>\n"
  },
  {
    "path": "ArduinoFrontend/src/app/view-project/view-project.component.spec.ts",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/app/view-project/view-project.component.ts",
    "content": "import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { ApiService } from '../api.service';\nimport { SaveOnline } from '../Libs/SaveOnline';\nimport { Login } from '../Libs/Login';\nimport { Title, Meta } from '@angular/platform-browser';\n/**\n * For Handling Time ie. Prevent moment error\n */\ndeclare var moment;\n\n/**\n * Class For Project Page(Component) Used in sharing.\n */\n@Component({\n  selector: 'app-view-project',\n  templateUrl: './view-project.component.html',\n  styleUrls: ['./view-project.component.css']\n})\nexport class ViewProjectComponent implements OnInit {\n  /**\n   * View Project Page\n   * @param aroute For Url\n   * @param api API Service\n   * @param title Document Title\n   * @param meta Meta Tag handler\n   */\n  constructor(\n    private aroute: ActivatedRoute,\n    private api: ApiService,\n    private title: Title,\n    private meta: Meta) { }\n  /**\n   * Data Of the Project\n   */\n  data: any;\n  /**\n   * Sharing Url\n   */\n  shareURL: string;\n  /**\n   * Sharing Title Name\n   */\n  shareName: string;\n  /**\n   * Redirect to 404 Page\n   */\n  private redirect() {\n    window.open('../../../404', '_self');\n  }\n\n  /**\n   * Set Meta Tags For SEO\n   * @param data Project Data\n   */\n  setMetaTags(data: any) {\n    // Create Description\n    const description = `${data.name}.${data.description}.By ${data.owner} at ${data.create_time}`;\n    // Update Description meta tag\n    this.meta.updateTag({ name: 'description', content: description });\n    // Type of Webpage\n    this.meta.removeTag('property=\"og:type\"');\n    this.meta.addTag({\n      property: 'og:type',\n      content: 'Electronic Simulation'\n    });\n    // Title of page\n    this.meta.removeTag('property=\"og:title\"');\n    this.meta.addTag({\n      property: 'og:title',\n      content: data.name\n    });\n    // Desription of page\n    this.meta.removeTag('property=\"og:description\"');\n    this.meta.addTag({\n      property: 'og:description',\n      content: description\n    });\n    // Image of the Circuit\n    this.meta.removeTag('property=\"og:image\"');\n    this.meta.addTag({\n      property: 'og:image',\n      content: data.base64_image\n    });\n    // Actual URL of Circuit\n    this.meta.removeTag('property=\"og:url\"');\n    this.meta.addTag({\n      property: 'og:url',\n      content: window.location.href\n    });\n    // Site name meta tag\n    this.meta.removeTag('property=\"og:site_name\"');\n    this.meta.addTag({\n      property: 'og:site_name',\n      content: 'Arduino On Cloud'\n    });\n  }\n  /**\n   * On Init Method\n   */\n  ngOnInit() {\n    window['showLoading'](); // Show Loading animation\n\n    // Get Token if not present then redirect to login\n    let token = Login.getToken();\n    token = token ? token : null;\n    // Sharing url\n    token = token ? token : null;\n    this.shareURL = window.location.href;\n\n    this.aroute.paramMap.subscribe((v: any) => {\n      console.log(v);\n      // From Slug find project id\n      const slug: string = v.params.slug;\n      const pos = slug ? slug.indexOf('-') : -1;\n      let [ id, branch, version, ] = slug.split('-', 3);\n      let name = slug.split('-').splice(3).join('-');\n      // if project id is found\n      if (id && version && branch) {\n        id = id.replace(/_/g, '-');\n        version = version.replace(/_/g, '-');\n        branch = branch.replace(/_/g, '-');\n        name = name.replace(/-/g, ' ');\n        // Check if project id is uuid\n        if (SaveOnline.isUUID(id)) {\n          this.api.readProject(id, branch, version, token).subscribe((output: any) => {\n            this.shareName = `${output.name} | Arduino On Cloud`; // Set the sharing name\n            // Set the page title\n            this.title.setTitle(this.shareName);\n            // Show Date in more meaningfull format\n            output.save_time = moment(output.save_time).format('LLLL');\n            output.create_time = moment(output.create_time).format('LLLL');\n            // Set meta tags\n            this.setMetaTags(output);\n            // set the project data\n            this.data = output;\n            // Hide Loading animation\n            window['hideLoading']();\n          }, err => {\n            if (err.status === 401) {\n              // if unauthorized then redirect to 404\n              this.redirect();\n            }\n            console.log(err);\n          });\n        } else {\n          // if project id is not valid return to 404\n          this.redirect();\n        }\n      } else {\n        // if Project id not found redirect to 404\n        this.redirect();\n      }\n    });\n  }\n\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/.gitkeep",
    "content": ""
  },
  {
    "path": "ArduinoFrontend/src/assets/404page.html",
    "content": "<div style=\"text-align: center;margin-top: 20%;\">\n    <h1>Oops!</h1>\n    <h1>404 Not Found</h1>\n    <h5>Sorry, an error has occured, Requested page not found!</h5>\n</div>"
  },
  {
    "path": "ArduinoFrontend/src/assets/avr8js/index.js",
    "content": "parcelRequire = (function (e, r, t, n) {\n  var i,\n    o = \"function\" == typeof parcelRequire && parcelRequire,\n    u = \"function\" == typeof require && require;\n  function f(t, n) {\n    if (!r[t]) {\n      if (!e[t]) {\n        var i = \"function\" == typeof parcelRequire && parcelRequire;\n        if (!n && i) return i(t, !0);\n        if (o) return o(t, !0);\n        if (u && \"string\" == typeof t) return u(t);\n        var c = new Error(\"Cannot find module '\" + t + \"'\");\n        throw ((c.code = \"MODULE_NOT_FOUND\"), c);\n      }\n      (p.resolve = function (r) {\n        return e[t][1][r] || r;\n      }),\n        (p.cache = {});\n      var l = (r[t] = new f.Module(t));\n      e[t][0].call(l.exports, p, l, l.exports, this);\n    }\n    return r[t].exports;\n    function p(e) {\n      return f(p.resolve(e));\n    }\n  }\n  (f.isParcelRequire = !0),\n    (f.Module = function (e) {\n      (this.id = e), (this.bundle = f), (this.exports = {});\n    }),\n    (f.modules = e),\n    (f.cache = r),\n    (f.parent = o),\n    (f.register = function (r, t) {\n      e[r] = [\n        function (e, r) {\n          r.exports = t;\n        },\n        {},\n      ];\n    });\n  for (var c = 0; c < t.length; c++)\n    try {\n      f(t[c]);\n    } catch (e) {\n      i || (i = e);\n    }\n  if (t.length) {\n    var l = f(t[t.length - 1]);\n    \"object\" == typeof exports && \"undefined\" != typeof module\n      ? (module.exports = l)\n      : \"function\" == typeof define && define.amd\n      ? define(function () {\n          return l;\n        })\n      : n && (this[n] = l);\n  }\n  if (((parcelRequire = f), i)) throw i;\n  return f;\n})(\n  {\n    MkOI: [\n      function (require, module, exports) {\n        \"use strict\";\n        Object.defineProperty(exports, \"__esModule\", { value: !0 }),\n          (exports.CPU = void 0);\n        const t = 256;\n        class s {\n          constructor(s, e = 8192) {\n            (this.progMem = s),\n              (this.sramBytes = e),\n              (this.data = new Uint8Array(this.sramBytes + t)),\n              (this.data16 = new Uint16Array(this.data.buffer)),\n              (this.dataView = new DataView(this.data.buffer)),\n              (this.progBytes = new Uint8Array(this.progMem.buffer)),\n              (this.readHooks = []),\n              (this.writeHooks = []),\n              (this.pc22Bits = this.progBytes.length > 131072),\n              (this.gpioTimerHooks = []),\n              (this.pc = 0),\n              (this.cycles = 0),\n              this.reset();\n          }\n          reset() {\n            this.data.fill(0), (this.SP = this.data.length - 1);\n          }\n          readData(t) {\n            return t >= 32 && this.readHooks[t]\n              ? this.readHooks[t](t)\n              : this.data[t];\n          }\n          writeData(t, s) {\n            const e = this.writeHooks[t];\n            (e && e(s, this.data[t], t)) || (this.data[t] = s);\n          }\n          get SP() {\n            return this.dataView.getUint16(93, !0);\n          }\n          set SP(t) {\n            this.dataView.setUint16(93, t, !0);\n          }\n          get SREG() {\n            return this.data[95];\n          }\n          get interruptsEnabled() {\n            return !!(128 & this.SREG);\n          }\n        }\n        exports.CPU = s;\n      },\n      {},\n    ],\n    deE9: [\n      function (require, module, exports) {\n        \"use strict\";\n        function a(a) {\n          return (\n            36864 == (65039 & a) ||\n            37376 == (65039 & a) ||\n            37902 == (65038 & a) ||\n            37900 == (65038 & a)\n          );\n        }\n        function t(t) {\n          const e = t.progMem[t.pc];\n          if (7168 == (64512 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = t.data[(15 & e) | ((512 & e) >> 5)],\n              i = a + d + (1 & t.data[95]),\n              s = 255 & i;\n            t.data[(496 & e) >> 4] = s;\n            let c = 192 & t.data[95];\n            (c |= s ? 0 : 2),\n              (c |= 128 & s ? 4 : 0),\n              (c |= (s ^ d) & (a ^ s) & 128 ? 8 : 0),\n              (c |= ((c >> 2) & 1) ^ ((c >> 3) & 1) ? 16 : 0),\n              (c |= 256 & i ? 1 : 0),\n              (c |= 1 & ((a & d) | (d & ~s) | (~s & a)) ? 32 : 0),\n              (t.data[95] = c);\n          } else if (3072 == (64512 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = t.data[(15 & e) | ((512 & e) >> 5)],\n              i = (a + d) & 255;\n            t.data[(496 & e) >> 4] = i;\n            let s = 192 & t.data[95];\n            (s |= i ? 0 : 2),\n              (s |= 128 & i ? 4 : 0),\n              (s |= (i ^ d) & (i ^ a) & 128 ? 8 : 0),\n              (s |= ((s >> 2) & 1) ^ ((s >> 3) & 1) ? 16 : 0),\n              (s |= (a + d) & 256 ? 1 : 0),\n              (s |= 1 & ((a & d) | (d & ~i) | (~i & a)) ? 32 : 0),\n              (t.data[95] = s);\n          } else if (38400 == (65280 & e)) {\n            const a = 2 * ((48 & e) >> 4) + 24,\n              d = t.dataView.getUint16(a, !0),\n              i = (d + ((15 & e) | ((192 & e) >> 2))) & 65535;\n            t.dataView.setUint16(a, i, !0);\n            let s = 224 & t.data[95];\n            (s |= i ? 0 : 2),\n              (s |= 32768 & i ? 4 : 0),\n              (s |= ~d & i & 32768 ? 8 : 0),\n              (s |= ((s >> 2) & 1) ^ ((s >> 3) & 1) ? 16 : 0),\n              (s |= ~i & d & 32768 ? 1 : 0),\n              (t.data[95] = s),\n              t.cycles++;\n          } else if (8192 == (64512 & e)) {\n            const a =\n              t.data[(496 & e) >> 4] & t.data[(15 & e) | ((512 & e) >> 5)];\n            t.data[(496 & e) >> 4] = a;\n            let d = 225 & t.data[95];\n            (d |= a ? 0 : 2),\n              (d |= 128 & a ? 4 : 0),\n              (d |= ((d >> 2) & 1) ^ ((d >> 3) & 1) ? 16 : 0),\n              (t.data[95] = d);\n          } else if (28672 == (61440 & e)) {\n            const a =\n              t.data[16 + ((240 & e) >> 4)] & ((15 & e) | ((3840 & e) >> 4));\n            t.data[16 + ((240 & e) >> 4)] = a;\n            let d = 225 & t.data[95];\n            (d |= a ? 0 : 2),\n              (d |= 128 & a ? 4 : 0),\n              (d |= ((d >> 2) & 1) ^ ((d >> 3) & 1) ? 16 : 0),\n              (t.data[95] = d);\n          } else if (37893 == (65039 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = (a >>> 1) | (128 & a);\n            t.data[(496 & e) >> 4] = d;\n            let i = 224 & t.data[95];\n            (i |= d ? 0 : 2),\n              (i |= 128 & d ? 4 : 0),\n              (i |= 1 & a),\n              (i |= ((i >> 2) & 1) ^ (1 & i) ? 8 : 0),\n              (i |= ((i >> 2) & 1) ^ ((i >> 3) & 1) ? 16 : 0),\n              (t.data[95] = i);\n          } else if (38024 == (65423 & e))\n            t.data[95] &= ~(1 << ((112 & e) >> 4));\n          else if (63488 == (65032 & e)) {\n            const a = 7 & e,\n              d = (496 & e) >> 4;\n            t.data[d] =\n              (~(1 << a) & t.data[d]) | (((t.data[95] >> 6) & 1) << a);\n          } else if (62464 == (64512 & e))\n            t.data[95] & (1 << (7 & e)) ||\n              ((t.pc = t.pc + (((504 & e) >> 3) - (512 & e ? 64 : 0))),\n              t.cycles++);\n          else if (61440 == (64512 & e))\n            t.data[95] & (1 << (7 & e)) &&\n              ((t.pc = t.pc + (((504 & e) >> 3) - (512 & e ? 64 : 0))),\n              t.cycles++);\n          else if (37896 == (65423 & e)) t.data[95] |= 1 << ((112 & e) >> 4);\n          else if (64e3 == (65032 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = 7 & e;\n            t.data[95] = (191 & t.data[95]) | ((a >> d) & 1 ? 64 : 0);\n          } else if (37902 == (65038 & e)) {\n            const a = t.progMem[t.pc + 1] | ((1 & e) << 16) | ((496 & e) << 13),\n              d = t.pc + 2,\n              i = t.dataView.getUint16(93, !0),\n              { pc22Bits: s } = t;\n            (t.data[i] = 255 & d),\n              (t.data[i - 1] = (d >> 8) & 255),\n              s && (t.data[i - 2] = (d >> 16) & 255),\n              t.dataView.setUint16(93, i - (s ? 3 : 2), !0),\n              (t.pc = a - 1),\n              (t.cycles += s ? 4 : 3);\n          } else if (38912 == (65280 & e)) {\n            const a = 248 & e,\n              d = 7 & e,\n              i = t.readData(32 + (a >> 3));\n            t.writeData(32 + (a >> 3), i & ~(1 << d));\n          } else if (37888 == (65039 & e)) {\n            const a = (496 & e) >> 4,\n              d = 255 - t.data[a];\n            t.data[a] = d;\n            let i = (225 & t.data[95]) | 1;\n            (i |= d ? 0 : 2),\n              (i |= 128 & d ? 4 : 0),\n              (i |= ((i >> 2) & 1) ^ ((i >> 3) & 1) ? 16 : 0),\n              (t.data[95] = i);\n          } else if (5120 == (64512 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = t.data[(15 & e) | ((512 & e) >> 5)],\n              i = a - d;\n            let s = 192 & t.data[95];\n            (s |= i ? 0 : 2),\n              (s |= 128 & i ? 4 : 0),\n              (s |= 0 != ((a ^ d) & (a ^ i) & 128) ? 8 : 0),\n              (s |= ((s >> 2) & 1) ^ ((s >> 3) & 1) ? 16 : 0),\n              (s |= d > a ? 1 : 0),\n              (s |= 1 & ((~a & d) | (d & i) | (i & ~a)) ? 32 : 0),\n              (t.data[95] = s);\n          } else if (1024 == (64512 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = t.data[(15 & e) | ((512 & e) >> 5)];\n            let i = t.data[95];\n            const s = a - d - (1 & i);\n            (i =\n              (192 & i) |\n              (!s && (i >> 1) & 1 ? 2 : 0) |\n              (d + (1 & i) > a ? 1 : 0)),\n              (i |= 128 & s ? 4 : 0),\n              (i |= (a ^ d) & (a ^ s) & 128 ? 8 : 0),\n              (i |= ((i >> 2) & 1) ^ ((i >> 3) & 1) ? 16 : 0),\n              (i |= 1 & ((~a & d) | (d & s) | (s & ~a)) ? 32 : 0),\n              (t.data[95] = i);\n          } else if (12288 == (61440 & e)) {\n            const a = t.data[16 + ((240 & e) >> 4)],\n              d = (15 & e) | ((3840 & e) >> 4),\n              i = a - d;\n            let s = 192 & t.data[95];\n            (s |= i ? 0 : 2),\n              (s |= 128 & i ? 4 : 0),\n              (s |= (a ^ d) & (a ^ i) & 128 ? 8 : 0),\n              (s |= ((s >> 2) & 1) ^ ((s >> 3) & 1) ? 16 : 0),\n              (s |= d > a ? 1 : 0),\n              (s |= 1 & ((~a & d) | (d & i) | (i & ~a)) ? 32 : 0),\n              (t.data[95] = s);\n          } else if (4096 == (64512 & e)) {\n            if (\n              t.data[(496 & e) >> 4] === t.data[(15 & e) | ((512 & e) >> 5)]\n            ) {\n              const e = a(t.progMem[t.pc + 1]) ? 2 : 1;\n              (t.pc += e), (t.cycles += e);\n            }\n          } else if (37898 == (65039 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = a - 1;\n            t.data[(496 & e) >> 4] = d;\n            let i = 225 & t.data[95];\n            (i |= d ? 0 : 2),\n              (i |= 128 & d ? 4 : 0),\n              (i |= 128 === a ? 8 : 0),\n              (i |= ((i >> 2) & 1) ^ ((i >> 3) & 1) ? 16 : 0),\n              (t.data[95] = i);\n          } else if (38169 === e) {\n            const a = t.pc + 1,\n              e = t.dataView.getUint16(93, !0),\n              d = t.data[60];\n            (t.data[e] = 255 & a),\n              (t.data[e - 1] = (a >> 8) & 255),\n              t.dataView.setUint16(93, e - 2, !0),\n              (t.pc = ((d << 16) | t.dataView.getUint16(30, !0)) - 1),\n              (t.cycles += 3);\n          } else if (37913 === e) {\n            const a = t.data[60];\n            (t.pc = ((a << 16) | t.dataView.getUint16(30, !0)) - 1), t.cycles++;\n          } else if (38360 === e) {\n            const a = t.data[59];\n            (t.data[0] = t.progBytes[(a << 16) | t.dataView.getUint16(30, !0)]),\n              (t.cycles += 2);\n          } else if (36870 == (65039 & e)) {\n            const a = t.data[59];\n            (t.data[(496 & e) >> 4] =\n              t.progBytes[(a << 16) | t.dataView.getUint16(30, !0)]),\n              (t.cycles += 2);\n          } else if (36871 == (65039 & e)) {\n            const a = t.data[59],\n              d = t.dataView.getUint16(30, !0);\n            (t.data[(496 & e) >> 4] = t.progBytes[(a << 16) | d]),\n              t.dataView.setUint16(30, d + 1, !0),\n              65535 === d &&\n                (t.data[59] = (a + 1) % (t.progBytes.length >> 16)),\n              (t.cycles += 2);\n          } else if (9216 == (64512 & e)) {\n            const a =\n              t.data[(496 & e) >> 4] ^ t.data[(15 & e) | ((512 & e) >> 5)];\n            t.data[(496 & e) >> 4] = a;\n            let d = 225 & t.data[95];\n            (d |= a ? 0 : 2),\n              (d |= 128 & a ? 4 : 0),\n              (d |= ((d >> 2) & 1) ^ ((d >> 3) & 1) ? 16 : 0),\n              (t.data[95] = d);\n          } else if (776 == (65416 & e)) {\n            const a = t.data[16 + ((112 & e) >> 4)],\n              d = t.data[16 + (7 & e)],\n              i = (a * d) << 1;\n            t.dataView.setUint16(0, i, !0),\n              (t.data[95] =\n                (252 & t.data[95]) |\n                (65535 & i ? 0 : 2) |\n                ((a * d) & 32768 ? 1 : 0)),\n              t.cycles++;\n          } else if (896 == (65416 & e)) {\n            const a = t.dataView.getInt8(16 + ((112 & e) >> 4)),\n              d = t.dataView.getInt8(16 + (7 & e)),\n              i = (a * d) << 1;\n            t.dataView.setInt16(0, i, !0),\n              (t.data[95] =\n                (252 & t.data[95]) |\n                (65535 & i ? 0 : 2) |\n                ((a * d) & 32768 ? 1 : 0)),\n              t.cycles++;\n          } else if (904 == (65416 & e)) {\n            const a = t.dataView.getInt8(16 + ((112 & e) >> 4)),\n              d = t.data[16 + (7 & e)],\n              i = (a * d) << 1;\n            t.dataView.setInt16(0, i, !0),\n              (t.data[95] =\n                (252 & t.data[95]) |\n                (65535 & i ? 2 : 0) |\n                ((a * d) & 32768 ? 1 : 0)),\n              t.cycles++;\n          } else if (38153 === e) {\n            const a = t.pc + 1,\n              e = t.dataView.getUint16(93, !0),\n              { pc22Bits: d } = t;\n            (t.data[e] = 255 & a),\n              (t.data[e - 1] = (a >> 8) & 255),\n              d && (t.data[e - 2] = (a >> 16) & 255),\n              t.dataView.setUint16(93, e - (d ? 3 : 2), !0),\n              (t.pc = t.dataView.getUint16(30, !0) - 1),\n              (t.cycles += d ? 3 : 2);\n          } else if (37897 === e)\n            (t.pc = t.dataView.getUint16(30, !0) - 1), t.cycles++;\n          else if (45056 == (63488 & e)) {\n            const a = t.readData(32 + ((15 & e) | ((1536 & e) >> 5)));\n            t.data[(496 & e) >> 4] = a;\n          } else if (37891 == (65039 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = (a + 1) & 255;\n            t.data[(496 & e) >> 4] = d;\n            let i = 225 & t.data[95];\n            (i |= d ? 0 : 2),\n              (i |= 128 & d ? 4 : 0),\n              (i |= 127 === a ? 8 : 0),\n              (i |= ((i >> 2) & 1) ^ ((i >> 3) & 1) ? 16 : 0),\n              (t.data[95] = i);\n          } else if (37900 == (65038 & e))\n            (t.pc =\n              (t.progMem[t.pc + 1] | ((1 & e) << 16) | ((496 & e) << 13)) - 1),\n              (t.cycles += 2);\n          else if (37382 == (65039 & e)) {\n            const a = (496 & e) >> 4,\n              d = t.data[a],\n              i = t.readData(t.dataView.getUint16(30, !0));\n            t.writeData(t.dataView.getUint16(30, !0), i & (255 - d)),\n              (t.data[a] = i);\n          } else if (37381 == (65039 & e)) {\n            const a = (496 & e) >> 4,\n              d = t.data[a],\n              i = t.readData(t.dataView.getUint16(30, !0));\n            t.writeData(t.dataView.getUint16(30, !0), i | d), (t.data[a] = i);\n          } else if (37383 == (65039 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = t.readData(t.dataView.getUint16(30, !0));\n            t.writeData(t.dataView.getUint16(30, !0), a ^ d),\n              (t.data[(496 & e) >> 4] = d);\n          } else if (57344 == (61440 & e))\n            t.data[16 + ((240 & e) >> 4)] = (15 & e) | ((3840 & e) >> 4);\n          else if (36864 == (65039 & e)) {\n            t.cycles++;\n            const a = t.readData(t.progMem[t.pc + 1]);\n            (t.data[(496 & e) >> 4] = a), t.pc++;\n          } else if (36876 == (65039 & e))\n            t.cycles++,\n              (t.data[(496 & e) >> 4] = t.readData(\n                t.dataView.getUint16(26, !0)\n              ));\n          else if (36877 == (65039 & e)) {\n            const a = t.dataView.getUint16(26, !0);\n            t.cycles++,\n              (t.data[(496 & e) >> 4] = t.readData(a)),\n              t.dataView.setUint16(26, a + 1, !0);\n          } else if (36878 == (65039 & e)) {\n            const a = t.dataView.getUint16(26, !0) - 1;\n            t.dataView.setUint16(26, a, !0),\n              t.cycles++,\n              (t.data[(496 & e) >> 4] = t.readData(a));\n          } else if (32776 == (65039 & e))\n            t.cycles++,\n              (t.data[(496 & e) >> 4] = t.readData(\n                t.dataView.getUint16(28, !0)\n              ));\n          else if (36873 == (65039 & e)) {\n            const a = t.dataView.getUint16(28, !0);\n            t.cycles++,\n              (t.data[(496 & e) >> 4] = t.readData(a)),\n              t.dataView.setUint16(28, a + 1, !0);\n          } else if (36874 == (65039 & e)) {\n            const a = t.dataView.getUint16(28, !0) - 1;\n            t.dataView.setUint16(28, a, !0),\n              t.cycles++,\n              (t.data[(496 & e) >> 4] = t.readData(a));\n          } else if (\n            32776 == (53768 & e) &&\n            (7 & e) | ((3072 & e) >> 7) | ((8192 & e) >> 8)\n          )\n            t.cycles++,\n              (t.data[(496 & e) >> 4] = t.readData(\n                t.dataView.getUint16(28, !0) +\n                  ((7 & e) | ((3072 & e) >> 7) | ((8192 & e) >> 8))\n              ));\n          else if (32768 == (65039 & e))\n            t.cycles++,\n              (t.data[(496 & e) >> 4] = t.readData(\n                t.dataView.getUint16(30, !0)\n              ));\n          else if (36865 == (65039 & e)) {\n            const a = t.dataView.getUint16(30, !0);\n            t.cycles++,\n              (t.data[(496 & e) >> 4] = t.readData(a)),\n              t.dataView.setUint16(30, a + 1, !0);\n          } else if (36866 == (65039 & e)) {\n            const a = t.dataView.getUint16(30, !0) - 1;\n            t.dataView.setUint16(30, a, !0),\n              t.cycles++,\n              (t.data[(496 & e) >> 4] = t.readData(a));\n          } else if (\n            32768 == (53768 & e) &&\n            (7 & e) | ((3072 & e) >> 7) | ((8192 & e) >> 8)\n          )\n            t.cycles++,\n              (t.data[(496 & e) >> 4] = t.readData(\n                t.dataView.getUint16(30, !0) +\n                  ((7 & e) | ((3072 & e) >> 7) | ((8192 & e) >> 8))\n              ));\n          else if (38344 === e)\n            (t.data[0] = t.progBytes[t.dataView.getUint16(30, !0)]),\n              (t.cycles += 2);\n          else if (36868 == (65039 & e))\n            (t.data[(496 & e) >> 4] =\n              t.progBytes[t.dataView.getUint16(30, !0)]),\n              (t.cycles += 2);\n          else if (36869 == (65039 & e)) {\n            const a = t.dataView.getUint16(30, !0);\n            (t.data[(496 & e) >> 4] = t.progBytes[a]),\n              t.dataView.setUint16(30, a + 1, !0),\n              (t.cycles += 2);\n          } else if (37894 == (65039 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = a >>> 1;\n            t.data[(496 & e) >> 4] = d;\n            let i = 224 & t.data[95];\n            (i |= d ? 0 : 2),\n              (i |= 1 & a),\n              (i |= ((i >> 2) & 1) ^ (1 & i) ? 8 : 0),\n              (i |= ((i >> 2) & 1) ^ ((i >> 3) & 1) ? 16 : 0),\n              (t.data[95] = i);\n          } else if (11264 == (64512 & e))\n            t.data[(496 & e) >> 4] = t.data[(15 & e) | ((512 & e) >> 5)];\n          else if (256 == (65280 & e)) {\n            const a = 2 * (15 & e),\n              d = 2 * ((240 & e) >> 4);\n            (t.data[d] = t.data[a]), (t.data[d + 1] = t.data[a + 1]);\n          } else if (39936 == (64512 & e)) {\n            const a =\n              t.data[(496 & e) >> 4] * t.data[(15 & e) | ((512 & e) >> 5)];\n            t.dataView.setUint16(0, a, !0),\n              (t.data[95] =\n                (252 & t.data[95]) | (65535 & a ? 0 : 2) | (32768 & a ? 1 : 0)),\n              t.cycles++;\n          } else if (512 == (65280 & e)) {\n            const a =\n              t.dataView.getInt8(16 + ((240 & e) >> 4)) *\n              t.dataView.getInt8(16 + (15 & e));\n            t.dataView.setInt16(0, a, !0),\n              (t.data[95] =\n                (252 & t.data[95]) | (65535 & a ? 0 : 2) | (32768 & a ? 1 : 0)),\n              t.cycles++;\n          } else if (768 == (65416 & e)) {\n            const a =\n              t.dataView.getInt8(16 + ((112 & e) >> 4)) * t.data[16 + (7 & e)];\n            t.dataView.setInt16(0, a, !0),\n              (t.data[95] =\n                (252 & t.data[95]) | (65535 & a ? 0 : 2) | (32768 & a ? 1 : 0)),\n              t.cycles++;\n          } else if (37889 == (65039 & e)) {\n            const a = (496 & e) >> 4,\n              d = t.data[a],\n              i = 0 - d;\n            t.data[a] = i;\n            let s = 192 & t.data[95];\n            (s |= i ? 0 : 2),\n              (s |= 128 & i ? 4 : 0),\n              (s |= 128 === i ? 8 : 0),\n              (s |= ((s >> 2) & 1) ^ ((s >> 3) & 1) ? 16 : 0),\n              (s |= i ? 1 : 0),\n              (s |= 1 & (i | d) ? 32 : 0),\n              (t.data[95] = s);\n          } else if (0 === e);\n          else if (10240 == (64512 & e)) {\n            const a =\n              t.data[(496 & e) >> 4] | t.data[(15 & e) | ((512 & e) >> 5)];\n            t.data[(496 & e) >> 4] = a;\n            let d = 225 & t.data[95];\n            (d |= a ? 0 : 2),\n              (d |= 128 & a ? 4 : 0),\n              (d |= ((d >> 2) & 1) ^ ((d >> 3) & 1) ? 16 : 0),\n              (t.data[95] = d);\n          } else if (24576 == (61440 & e)) {\n            const a =\n              t.data[16 + ((240 & e) >> 4)] | (15 & e) | ((3840 & e) >> 4);\n            t.data[16 + ((240 & e) >> 4)] = a;\n            let d = 225 & t.data[95];\n            (d |= a ? 0 : 2),\n              (d |= 128 & a ? 4 : 0),\n              (d |= ((d >> 2) & 1) ^ ((d >> 3) & 1) ? 16 : 0),\n              (t.data[95] = d);\n          } else if (47104 == (63488 & e))\n            t.writeData(\n              32 + ((15 & e) | ((1536 & e) >> 5)),\n              t.data[(496 & e) >> 4]\n            );\n          else if (36879 == (65039 & e)) {\n            const a = t.dataView.getUint16(93, !0) + 1;\n            t.dataView.setUint16(93, a, !0),\n              (t.data[(496 & e) >> 4] = t.data[a]),\n              t.cycles++;\n          } else if (37391 == (65039 & e)) {\n            const a = t.dataView.getUint16(93, !0);\n            (t.data[a] = t.data[(496 & e) >> 4]),\n              t.dataView.setUint16(93, a - 1, !0),\n              t.cycles++;\n          } else if (53248 == (61440 & e)) {\n            const a = (2047 & e) - (2048 & e ? 2048 : 0),\n              d = t.pc + 1,\n              i = t.dataView.getUint16(93, !0),\n              { pc22Bits: s } = t;\n            (t.data[i] = 255 & d),\n              (t.data[i - 1] = (d >> 8) & 255),\n              s && (t.data[i - 2] = (d >> 16) & 255),\n              t.dataView.setUint16(93, i - (s ? 3 : 2), !0),\n              (t.pc += a),\n              (t.cycles += s ? 3 : 2);\n          } else if (38152 === e) {\n            const { pc22Bits: a } = t,\n              e = t.dataView.getUint16(93, !0) + (a ? 3 : 2);\n            t.dataView.setUint16(93, e, !0),\n              (t.pc = (t.data[e - 1] << 8) + t.data[e] - 1),\n              a && (t.pc |= t.data[e - 2] << 16),\n              (t.cycles += a ? 4 : 3);\n          } else if (38168 === e) {\n            const { pc22Bits: a } = t,\n              e = t.dataView.getUint16(93, !0) + (a ? 3 : 2);\n            t.dataView.setUint16(93, e, !0),\n              (t.pc = (t.data[e - 1] << 8) + t.data[e] - 1),\n              a && (t.pc |= t.data[e - 2] << 16),\n              (t.cycles += a ? 4 : 3),\n              (t.data[95] |= 128);\n          } else if (49152 == (61440 & e))\n            (t.pc = t.pc + ((2047 & e) - (2048 & e ? 2048 : 0))), t.cycles++;\n          else if (37895 == (65039 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = (a >>> 1) | ((1 & t.data[95]) << 7);\n            t.data[(496 & e) >> 4] = d;\n            let i = 224 & t.data[95];\n            (i |= d ? 0 : 2),\n              (i |= 128 & d ? 4 : 0),\n              (i |= 1 & a ? 1 : 0),\n              (i |= ((i >> 2) & 1) ^ (1 & i) ? 8 : 0),\n              (i |= ((i >> 2) & 1) ^ ((i >> 3) & 1) ? 16 : 0),\n              (t.data[95] = i);\n          } else if (2048 == (64512 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = t.data[(15 & e) | ((512 & e) >> 5)];\n            let i = t.data[95];\n            const s = a - d - (1 & i);\n            (t.data[(496 & e) >> 4] = s),\n              (i =\n                (192 & i) |\n                (!s && (i >> 1) & 1 ? 2 : 0) |\n                (d + (1 & i) > a ? 1 : 0)),\n              (i |= 128 & s ? 4 : 0),\n              (i |= (a ^ d) & (a ^ s) & 128 ? 8 : 0),\n              (i |= ((i >> 2) & 1) ^ ((i >> 3) & 1) ? 16 : 0),\n              (i |= 1 & ((~a & d) | (d & s) | (s & ~a)) ? 32 : 0),\n              (t.data[95] = i);\n          } else if (16384 == (61440 & e)) {\n            const a = t.data[16 + ((240 & e) >> 4)],\n              d = (15 & e) | ((3840 & e) >> 4);\n            let i = t.data[95];\n            const s = a - d - (1 & i);\n            (t.data[16 + ((240 & e) >> 4)] = s),\n              (i =\n                (192 & i) |\n                (!s && (i >> 1) & 1 ? 2 : 0) |\n                (d + (1 & i) > a ? 1 : 0)),\n              (i |= 128 & s ? 4 : 0),\n              (i |= (a ^ d) & (a ^ s) & 128 ? 8 : 0),\n              (i |= ((i >> 2) & 1) ^ ((i >> 3) & 1) ? 16 : 0),\n              (i |= 1 & ((~a & d) | (d & s) | (s & ~a)) ? 32 : 0),\n              (t.data[95] = i);\n          } else if (39424 == (65280 & e)) {\n            const a = 32 + ((248 & e) >> 3);\n            t.writeData(a, t.readData(a) | (1 << (7 & e))), t.cycles++;\n          } else if (39168 == (65280 & e)) {\n            if (!(t.readData(32 + ((248 & e) >> 3)) & (1 << (7 & e)))) {\n              const e = a(t.progMem[t.pc + 1]) ? 2 : 1;\n              (t.cycles += e), (t.pc += e);\n            }\n          } else if (39680 == (65280 & e)) {\n            if (t.readData(32 + ((248 & e) >> 3)) & (1 << (7 & e))) {\n              const e = a(t.progMem[t.pc + 1]) ? 2 : 1;\n              (t.cycles += e), (t.pc += e);\n            }\n          } else if (38656 == (65280 & e)) {\n            const a = 2 * ((48 & e) >> 4) + 24,\n              d = t.dataView.getUint16(a, !0),\n              i = (15 & e) | ((192 & e) >> 2),\n              s = d - i;\n            t.dataView.setUint16(a, s, !0);\n            let c = 192 & t.data[95];\n            (c |= s ? 0 : 2),\n              (c |= 32768 & s ? 4 : 0),\n              (c |= d & ~s & 32768 ? 8 : 0),\n              (c |= ((c >> 2) & 1) ^ ((c >> 3) & 1) ? 16 : 0),\n              (c |= i > d ? 1 : 0),\n              (c |= 1 & ((~d & i) | (i & s) | (s & ~d)) ? 32 : 0),\n              (t.data[95] = c),\n              t.cycles++;\n          } else if (64512 == (65032 & e)) {\n            if (!(t.data[(496 & e) >> 4] & (1 << (7 & e)))) {\n              const e = a(t.progMem[t.pc + 1]) ? 2 : 1;\n              (t.cycles += e), (t.pc += e);\n            }\n          } else if (65024 == (65032 & e)) {\n            if (t.data[(496 & e) >> 4] & (1 << (7 & e))) {\n              const e = a(t.progMem[t.pc + 1]) ? 2 : 1;\n              (t.cycles += e), (t.pc += e);\n            }\n          } else if (38280 === e);\n          else if (38376 === e);\n          else if (38392 === e);\n          else if (37376 == (65039 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = t.progMem[t.pc + 1];\n            t.writeData(d, a), t.pc++, t.cycles++;\n          } else if (37388 == (65039 & e))\n            t.writeData(t.dataView.getUint16(26, !0), t.data[(496 & e) >> 4]),\n              t.cycles++;\n          else if (37389 == (65039 & e)) {\n            const a = t.dataView.getUint16(26, !0);\n            t.writeData(a, t.data[(496 & e) >> 4]),\n              t.dataView.setUint16(26, a + 1, !0),\n              t.cycles++;\n          } else if (37390 == (65039 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = t.dataView.getUint16(26, !0) - 1;\n            t.dataView.setUint16(26, d, !0), t.writeData(d, a), t.cycles++;\n          } else if (33288 == (65039 & e))\n            t.writeData(t.dataView.getUint16(28, !0), t.data[(496 & e) >> 4]),\n              t.cycles++;\n          else if (37385 == (65039 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = t.dataView.getUint16(28, !0);\n            t.writeData(d, a), t.dataView.setUint16(28, d + 1, !0), t.cycles++;\n          } else if (37386 == (65039 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = t.dataView.getUint16(28, !0) - 1;\n            t.dataView.setUint16(28, d, !0), t.writeData(d, a), t.cycles++;\n          } else if (\n            33288 == (53768 & e) &&\n            (7 & e) | ((3072 & e) >> 7) | ((8192 & e) >> 8)\n          )\n            t.writeData(\n              t.dataView.getUint16(28, !0) +\n                ((7 & e) | ((3072 & e) >> 7) | ((8192 & e) >> 8)),\n              t.data[(496 & e) >> 4]\n            ),\n              t.cycles++;\n          else if (33280 == (65039 & e))\n            t.writeData(t.dataView.getUint16(30, !0), t.data[(496 & e) >> 4]),\n              t.cycles++;\n          else if (37377 == (65039 & e)) {\n            const a = t.dataView.getUint16(30, !0);\n            t.writeData(a, t.data[(496 & e) >> 4]),\n              t.dataView.setUint16(30, a + 1, !0),\n              t.cycles++;\n          } else if (37378 == (65039 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = t.dataView.getUint16(30, !0) - 1;\n            t.dataView.setUint16(30, d, !0), t.writeData(d, a), t.cycles++;\n          } else if (\n            33280 == (53768 & e) &&\n            (7 & e) | ((3072 & e) >> 7) | ((8192 & e) >> 8)\n          )\n            t.writeData(\n              t.dataView.getUint16(30, !0) +\n                ((7 & e) | ((3072 & e) >> 7) | ((8192 & e) >> 8)),\n              t.data[(496 & e) >> 4]\n            ),\n              t.cycles++;\n          else if (6144 == (64512 & e)) {\n            const a = t.data[(496 & e) >> 4],\n              d = t.data[(15 & e) | ((512 & e) >> 5)],\n              i = a - d;\n            t.data[(496 & e) >> 4] = i;\n            let s = 192 & t.data[95];\n            (s |= i ? 0 : 2),\n              (s |= 128 & i ? 4 : 0),\n              (s |= (a ^ d) & (a ^ i) & 128 ? 8 : 0),\n              (s |= ((s >> 2) & 1) ^ ((s >> 3) & 1) ? 16 : 0),\n              (s |= d > a ? 1 : 0),\n              (s |= 1 & ((~a & d) | (d & i) | (i & ~a)) ? 32 : 0),\n              (t.data[95] = s);\n          } else if (20480 == (61440 & e)) {\n            const a = t.data[16 + ((240 & e) >> 4)],\n              d = (15 & e) | ((3840 & e) >> 4),\n              i = a - d;\n            t.data[16 + ((240 & e) >> 4)] = i;\n            let s = 192 & t.data[95];\n            (s |= i ? 0 : 2),\n              (s |= 128 & i ? 4 : 0),\n              (s |= (a ^ d) & (a ^ i) & 128 ? 8 : 0),\n              (s |= ((s >> 2) & 1) ^ ((s >> 3) & 1) ? 16 : 0),\n              (s |= d > a ? 1 : 0),\n              (s |= 1 & ((~a & d) | (d & i) | (i & ~a)) ? 32 : 0),\n              (t.data[95] = s);\n          } else if (37890 == (65039 & e)) {\n            const a = (496 & e) >> 4,\n              d = t.data[a];\n            t.data[a] = ((15 & d) << 4) | ((240 & d) >>> 4);\n          } else if (38312 === e);\n          else if (37380 == (65039 & e)) {\n            const a = (496 & e) >> 4,\n              d = t.data[a],\n              i = t.data[t.dataView.getUint16(30, !0)];\n            (t.data[t.dataView.getUint16(30, !0)] = d), (t.data[a] = i);\n          }\n          (t.pc = (t.pc + 1) % t.progMem.length), t.cycles++;\n        }\n        Object.defineProperty(exports, \"__esModule\", { value: !0 }),\n          (exports.avrInstruction = t);\n      },\n      {},\n    ],\n    x6vY: [\n      function (require, module, exports) {\n        \"use strict\";\n        function t(t, e) {\n          const a = t.dataView.getUint16(93, !0);\n          (t.data[a] = 255 & t.pc),\n            (t.data[a - 1] = (t.pc >> 8) & 255),\n            t.dataView.setUint16(93, a - 2, !0),\n            (t.data[95] &= 127),\n            (t.cycles += 2),\n            (t.pc = e);\n        }\n        Object.defineProperty(exports, \"__esModule\", { value: !0 }),\n          (exports.avrInterrupt = t);\n      },\n      {},\n    ],\n    lglE: [\n      function (require, module, exports) {\n        \"use strict\";\n        Object.defineProperty(exports, \"__esModule\", { value: !0 }),\n          (exports.AVRIOPort =\n            exports.PinOverrideMode =\n            exports.PinState =\n            exports.portLConfig =\n            exports.portKConfig =\n            exports.portJConfig =\n            exports.portHConfig =\n            exports.portGConfig =\n            exports.portFConfig =\n            exports.portEConfig =\n            exports.portDConfig =\n            exports.portCConfig =\n            exports.portBConfig =\n            exports.portAConfig =\n              void 0);\n        const t = { PIN: 32, DDR: 33, PORT: 34 };\n        exports.portAConfig = t;\n        const o = { PIN: 35, DDR: 36, PORT: 37 };\n        exports.portBConfig = o;\n        const e = { PIN: 38, DDR: 39, PORT: 40 };\n        exports.portCConfig = e;\n        const i = { PIN: 41, DDR: 42, PORT: 43 };\n        exports.portDConfig = i;\n        const s = { PIN: 44, DDR: 45, PORT: 46 };\n        exports.portEConfig = s;\n        const r = { PIN: 47, DDR: 48, PORT: 49 };\n        exports.portFConfig = r;\n        const n = { PIN: 50, DDR: 51, PORT: 52 };\n        exports.portGConfig = n;\n        const p = { PIN: 256, DDR: 257, PORT: 258 };\n        exports.portHConfig = p;\n        const a = { PIN: 259, DDR: 260, PORT: 261 };\n        exports.portJConfig = a;\n        const P = { PIN: 262, DDR: 263, PORT: 264 };\n        exports.portKConfig = P;\n        const h = { PIN: 265, DDR: 266, PORT: 267 };\n        var l, d;\n        (exports.portLConfig = h),\n          (exports.PinState = l),\n          (function (t) {\n            (t[(t.Low = 0)] = \"Low\"),\n              (t[(t.High = 1)] = \"High\"),\n              (t[(t.Input = 2)] = \"Input\"),\n              (t[(t.InputPullUp = 3)] = \"InputPullUp\");\n          })(l || (exports.PinState = l = {})),\n          (exports.PinOverrideMode = d),\n          (function (t) {\n            (t[(t.None = 0)] = \"None\"),\n              (t[(t.Enable = 1)] = \"Enable\"),\n              (t[(t.Set = 2)] = \"Set\"),\n              (t[(t.Clear = 3)] = \"Clear\"),\n              (t[(t.Toggle = 4)] = \"Toggle\");\n          })(d || (exports.PinOverrideMode = d = {}));\n        class R {\n          constructor(t, o) {\n            (this.cpu = t),\n              (this.portConfig = o),\n              (this.listeners = []),\n              (this.pinValue = 0),\n              (this.overrideMask = 255),\n              (this.lastValue = 0),\n              (this.lastDdr = 0),\n              (t.writeHooks[o.DDR] = (e) => {\n                const i = t.data[o.PORT];\n                return (\n                  (t.data[o.DDR] = e),\n                  this.updatePinRegister(i, e),\n                  this.writeGpio(i, e),\n                  !0\n                );\n              }),\n              (t.writeHooks[o.PORT] = (e) => {\n                const i = t.data[o.DDR];\n                return (\n                  (t.data[o.PORT] = e),\n                  this.updatePinRegister(e, i),\n                  this.writeGpio(e, i),\n                  !0\n                );\n              }),\n              (t.writeHooks[o.PIN] = (e) => {\n                const i = t.data[o.PORT],\n                  s = t.data[o.DDR],\n                  r = i ^ e;\n                return (\n                  (t.data[o.PORT] = r),\n                  (t.data[o.PIN] = (t.data[o.PIN] & ~s) | (r & s)),\n                  this.writeGpio(r, s),\n                  !0\n                );\n              }),\n              (t.gpioTimerHooks[o.PORT] = (e, i) => {\n                const s = 1 << e;\n                if (i == d.None) this.overrideMask |= s;\n                else\n                  switch (((this.overrideMask &= ~s), i)) {\n                    case d.Enable:\n                      (this.overrideValue &= ~s),\n                        (this.overrideValue |= t.data[o.PORT] & s);\n                      break;\n                    case d.Set:\n                      this.overrideValue |= s;\n                      break;\n                    case d.Clear:\n                      this.overrideValue &= ~s;\n                      break;\n                    case d.Toggle:\n                      this.overrideValue ^= s;\n                  }\n                this.writeGpio(t.data[o.PORT], t.data[o.DDR]);\n              });\n          }\n          addListener(t) {\n            this.listeners.push(t);\n          }\n          removeListener(t) {\n            this.listeners = this.listeners.filter((o) => o !== t);\n          }\n          pinState(t) {\n            const o = this.cpu.data[this.portConfig.DDR],\n              e = this.cpu.data[this.portConfig.PORT],\n              i = 1 << t;\n            return o & i\n              ? this.lastValue & i\n                ? l.High\n                : l.Low\n              : e & i\n              ? l.InputPullUp\n              : l.Input;\n          }\n          setPin(t, o) {\n            const e = 1 << t;\n            (this.pinValue &= ~e),\n              o && (this.pinValue |= e),\n              this.updatePinRegister(\n                this.cpu.data[this.portConfig.PORT],\n                this.cpu.data[this.portConfig.DDR]\n              );\n          }\n          updatePinRegister(t, o) {\n            this.cpu.data[this.portConfig.PIN] = (this.pinValue & ~o) | (t & o);\n          }\n          writeGpio(t, o) {\n            const e = ((t & this.overrideMask) | this.overrideValue) & o,\n              i = this.lastValue;\n            if (e !== i || o !== this.lastDdr) {\n              (this.lastValue = e), (this.lastDdr = o);\n              for (const t of this.listeners) t(e, i);\n            }\n          }\n        }\n        exports.AVRIOPort = R;\n      },\n      {},\n    ],\n    nPWZ: [\n      function (require, module, exports) {\n        \"use strict\";\n        Object.defineProperty(exports, \"__esModule\", { value: !0 }),\n          (exports.AVRTimer =\n            exports.timer2Config =\n            exports.timer1Config =\n            exports.timer0Config =\n              void 0);\n        var t = require(\"../cpu/interrupt\"),\n          e = require(\"./gpio\");\n        const i = { 0: 0, 1: 1, 2: 8, 3: 64, 4: 256, 5: 1024, 6: 0, 7: 0 },\n          o = 1,\n          s = 2,\n          r = 4,\n          c = 1,\n          p = 2,\n          h = 4,\n          n = {\n            bits: 8,\n            captureInterrupt: 0,\n            compAInterrupt: 28,\n            compBInterrupt: 30,\n            ovfInterrupt: 32,\n            TIFR: 53,\n            OCRA: 71,\n            OCRB: 72,\n            ICR: 0,\n            TCNT: 70,\n            TCCRA: 68,\n            TCCRB: 69,\n            TCCRC: 0,\n            TIMSK: 110,\n            dividers: i,\n            compPortA: e.portDConfig.PORT,\n            compPinA: 6,\n            compPortB: e.portDConfig.PORT,\n            compPinB: 5,\n          };\n        exports.timer0Config = n;\n        const a = {\n          bits: 16,\n          captureInterrupt: 20,\n          compAInterrupt: 22,\n          compBInterrupt: 24,\n          ovfInterrupt: 26,\n          TIFR: 54,\n          OCRA: 136,\n          OCRB: 138,\n          ICR: 134,\n          TCNT: 132,\n          TCCRA: 128,\n          TCCRB: 129,\n          TCCRC: 130,\n          TIMSK: 111,\n          dividers: i,\n          compPortA: e.portBConfig.PORT,\n          compPinA: 1,\n          compPortB: e.portBConfig.PORT,\n          compPinB: 2,\n        };\n        exports.timer1Config = a;\n        const C = {\n          bits: 8,\n          captureInterrupt: 0,\n          compAInterrupt: 14,\n          compBInterrupt: 16,\n          ovfInterrupt: 18,\n          TIFR: 55,\n          OCRA: 179,\n          OCRB: 180,\n          ICR: 0,\n          TCNT: 178,\n          TCCRA: 176,\n          TCCRB: 177,\n          TCCRC: 0,\n          TIMSK: 112,\n          dividers: { 0: 0, 1: 1, 2: 8, 3: 32, 4: 64, 5: 128, 6: 256, 7: 1024 },\n          compPortA: e.portBConfig.PORT,\n          compPinA: 3,\n          compPortB: e.portDConfig.PORT,\n          compPinB: 3,\n        };\n        var m, u, d;\n        (exports.timer2Config = C),\n          (function (t) {\n            (t[(t.Normal = 0)] = \"Normal\"),\n              (t[(t.PWMPhaseCorrect = 1)] = \"PWMPhaseCorrect\"),\n              (t[(t.CTC = 2)] = \"CTC\"),\n              (t[(t.FastPWM = 3)] = \"FastPWM\"),\n              (t[(t.PWMPhaseFrequencyCorrect = 4)] =\n                \"PWMPhaseFrequencyCorrect\"),\n              (t[(t.Reserved = 5)] = \"Reserved\");\n          })(m || (m = {})),\n          (function (t) {\n            (t[(t.Max = 0)] = \"Max\"),\n              (t[(t.Top = 1)] = \"Top\"),\n              (t[(t.Bottom = 2)] = \"Bottom\");\n          })(u || (u = {})),\n          (function (t) {\n            (t[(t.Immediate = 0)] = \"Immediate\"),\n              (t[(t.Top = 1)] = \"Top\"),\n              (t[(t.Bottom = 2)] = \"Bottom\");\n          })(d || (d = {}));\n        const T = 1,\n          P = 2,\n          B = [\n            [m.Normal, 255, d.Immediate, u.Max],\n            [m.PWMPhaseCorrect, 255, d.Top, u.Bottom],\n            [m.CTC, T, d.Immediate, u.Max],\n            [m.FastPWM, 255, d.Bottom, u.Max],\n            [m.Reserved, 255, d.Immediate, u.Max],\n            [m.PWMPhaseCorrect, T, d.Top, u.Bottom],\n            [m.Reserved, 255, d.Immediate, u.Max],\n            [m.FastPWM, T, d.Bottom, u.Top],\n          ],\n          M = [\n            [m.Normal, 65535, d.Immediate, u.Max],\n            [m.PWMPhaseCorrect, 255, d.Top, u.Bottom],\n            [m.PWMPhaseCorrect, 511, d.Top, u.Bottom],\n            [m.PWMPhaseCorrect, 1023, d.Top, u.Bottom],\n            [m.CTC, T, d.Immediate, u.Max],\n            [m.FastPWM, 255, d.Bottom, u.Top],\n            [m.FastPWM, 511, d.Bottom, u.Top],\n            [m.FastPWM, 1023, d.Bottom, u.Top],\n            [m.PWMPhaseFrequencyCorrect, P, d.Bottom, u.Bottom],\n            [m.PWMPhaseFrequencyCorrect, T, d.Bottom, u.Bottom],\n            [m.PWMPhaseCorrect, P, d.Top, u.Bottom],\n            [m.PWMPhaseCorrect, T, d.Top, u.Bottom],\n            [m.CTC, P, d.Immediate, u.Max],\n            [m.Reserved, 65535, d.Immediate, u.Max],\n            [m.FastPWM, P, d.Bottom, u.Top],\n            [m.FastPWM, T, d.Bottom, u.Top],\n          ];\n        function R(t) {\n          switch (t) {\n            case 1:\n              return e.PinOverrideMode.Toggle;\n            case 2:\n              return e.PinOverrideMode.Clear;\n            case 3:\n              return e.PinOverrideMode.Set;\n            default:\n              return e.PinOverrideMode.Enable;\n          }\n        }\n        class g {\n          constructor(t, i) {\n            if (\n              ((this.cpu = t),\n              (this.config = i),\n              (this.lastCycle = 0),\n              (this.ocrA = 0),\n              (this.ocrB = 0),\n              (this.icr = 0),\n              (this.tcnt = 0),\n              (this.tcntUpdated = !1),\n              (this.countingUp = !0),\n              (this.highByteTemp = 0),\n              this.updateWGMConfig(),\n              (this.cpu.readHooks[i.TCNT] = (t) => (\n                this.tick(),\n                16 === this.config.bits &&\n                  (this.cpu.data[t + 1] = this.tcnt >> 8),\n                (this.cpu.data[t] = 255 & this.tcnt)\n              )),\n              (this.cpu.writeHooks[i.TCNT] = (t) => {\n                (this.tcnt = (this.highByteTemp << 8) | t),\n                  (this.tcntUpdated = !0),\n                  this.timerUpdated();\n              }),\n              (this.cpu.writeHooks[i.OCRA] = (t) => {\n                this.ocrA = (this.highByteTemp << 8) | t;\n              }),\n              (this.cpu.writeHooks[i.OCRB] = (t) => {\n                this.ocrB = (this.highByteTemp << 8) | t;\n              }),\n              (this.cpu.writeHooks[i.ICR] = (t) => {\n                this.icr = (this.highByteTemp << 8) | t;\n              }),\n              16 === this.config.bits)\n            ) {\n              const t = (t) => {\n                this.highByteTemp = t;\n              };\n              (this.cpu.writeHooks[i.TCNT + 1] = t),\n                (this.cpu.writeHooks[i.OCRA + 1] = t),\n                (this.cpu.writeHooks[i.OCRB + 1] = t),\n                (this.cpu.writeHooks[i.ICR + 1] = t);\n            }\n            (t.writeHooks[i.TCCRA] = (t) => (\n              (this.cpu.data[i.TCCRA] = t),\n              (this.compA = (t >> 6) & 3),\n              this.updateCompA(\n                this.compA ? e.PinOverrideMode.Enable : e.PinOverrideMode.None\n              ),\n              (this.compB = (t >> 4) & 3),\n              this.updateCompB(\n                this.compB ? e.PinOverrideMode.Enable : e.PinOverrideMode.None\n              ),\n              this.updateWGMConfig(),\n              !0\n            )),\n              (t.writeHooks[i.TCCRB] = (t) => (\n                (this.cpu.data[i.TCCRB] = t), this.updateWGMConfig(), !0\n              ));\n          }\n          reset() {\n            (this.lastCycle = 0), (this.ocrA = 0), (this.ocrB = 0);\n          }\n          get TIFR() {\n            return this.cpu.data[this.config.TIFR];\n          }\n          set TIFR(t) {\n            this.cpu.data[this.config.TIFR] = t;\n          }\n          get TCCRA() {\n            return this.cpu.data[this.config.TCCRA];\n          }\n          get TCCRB() {\n            return this.cpu.data[this.config.TCCRB];\n          }\n          get TIMSK() {\n            return this.cpu.data[this.config.TIMSK];\n          }\n          get CS() {\n            return 7 & this.TCCRB;\n          }\n          get WGM() {\n            const t = 16 === this.config.bits ? 24 : 8;\n            return ((this.TCCRB & t) >> 1) | (3 & this.TCCRA);\n          }\n          get TOP() {\n            switch (this.topValue) {\n              case T:\n                return this.ocrA;\n              case P:\n                return this.icr;\n              default:\n                return this.topValue;\n            }\n          }\n          updateWGMConfig() {\n            const t = 16 === this.config.bits ? M : B,\n              [e, i] = t[this.WGM];\n            (this.timerMode = e), (this.topValue = i);\n          }\n          tick() {\n            const e = this.config.dividers[this.CS],\n              i = this.cpu.cycles - this.lastCycle;\n            if (e && i >= e) {\n              const t = Math.floor(i / e);\n              this.lastCycle += t * e;\n              const s = this.tcnt,\n                { timerMode: r } = this,\n                c =\n                  r === m.PWMPhaseCorrect || r === m.PWMPhaseFrequencyCorrect\n                    ? this.phasePwmCount(s, t)\n                    : (s + t) % (this.TOP + 1);\n              this.tcntUpdated || ((this.tcnt = c), this.timerUpdated()),\n                (r === m.Normal || r === m.FastPWM) &&\n                  s > c &&\n                  (this.TIFR |= o);\n            }\n            if (((this.tcntUpdated = !1), this.cpu.interruptsEnabled)) {\n              const { TIFR: e, TIMSK: i } = this;\n              e & o &&\n                i & c &&\n                ((0, t.avrInterrupt)(this.cpu, this.config.ovfInterrupt),\n                (this.TIFR &= ~o)),\n                e & s &&\n                  i & p &&\n                  ((0, t.avrInterrupt)(this.cpu, this.config.compAInterrupt),\n                  (this.TIFR &= ~s)),\n                e & r &&\n                  i & h &&\n                  ((0, t.avrInterrupt)(this.cpu, this.config.compBInterrupt),\n                  (this.TIFR &= ~r));\n            }\n          }\n          phasePwmCount(t, e) {\n            for (; e > 0; )\n              this.countingUp\n                ? ++t !== this.TOP || this.tcntUpdated || (this.countingUp = !1)\n                : --t ||\n                  this.tcntUpdated ||\n                  ((this.countingUp = !0), (this.TIFR |= o)),\n                e--;\n            return t;\n          }\n          timerUpdated() {\n            const t = this.tcnt;\n            this.ocrA &&\n              t === this.ocrA &&\n              ((this.TIFR |= s),\n              this.timerMode === m.CTC && ((this.tcnt = 0), (this.TIFR |= o)),\n              this.compA && this.updateCompPin(this.compA, \"A\")),\n              this.ocrB &&\n                t === this.ocrB &&\n                ((this.TIFR |= r),\n                this.compB && this.updateCompPin(this.compB, \"B\"));\n          }\n          updateCompPin(t, i) {\n            let o = e.PinOverrideMode.None;\n            const s = 3 === t,\n              r = this.countingUp === s;\n            switch (this.timerMode) {\n              case m.Normal:\n              case m.CTC:\n              case m.FastPWM:\n                o = R(t);\n                break;\n              case m.PWMPhaseCorrect:\n              case m.PWMPhaseFrequencyCorrect:\n                o = r ? e.PinOverrideMode.Set : e.PinOverrideMode.Clear;\n            }\n            o !== e.PinOverrideMode.None &&\n              (\"A\" === i ? this.updateCompA(o) : this.updateCompB(o));\n          }\n          updateCompA(t) {\n            const { compPortA: e, compPinA: i } = this.config,\n              o = this.cpu.gpioTimerHooks[e];\n            o && o(i, t, e);\n          }\n          updateCompB(t) {\n            const { compPortB: e, compPinB: i } = this.config,\n              o = this.cpu.gpioTimerHooks[e];\n            o && o(i, t, e);\n          }\n        }\n        exports.AVRTimer = g;\n      },\n      { \"../cpu/interrupt\": \"x6vY\", \"./gpio\": \"lglE\" },\n    ],\n    ZpWN: [\n      function (require, module, exports) {\n        \"use strict\";\n        Object.defineProperty(exports, \"__esModule\", { value: !0 }),\n          (exports.AVRUSART = exports.usart0Config = void 0);\n        var t = require(\"../cpu/interrupt\");\n        const i = {\n          rxCompleteInterrupt: 36,\n          dataRegisterEmptyInterrupt: 38,\n          txCompleteInterrupt: 40,\n          UCSRA: 192,\n          UCSRB: 193,\n          UCSRC: 194,\n          UBRRL: 196,\n          UBRRH: 197,\n          UDR: 198,\n        };\n        exports.usart0Config = i;\n        const s = 128,\n          r = 64,\n          e = 32,\n          n = 16,\n          a = 8,\n          u = 4,\n          c = 2,\n          h = 1,\n          o = 128,\n          p = 64,\n          R = 32,\n          f = 16,\n          C = 8,\n          U = 4,\n          d = 2,\n          g = 1,\n          S = 128,\n          l = 64,\n          A = 32,\n          B = 16,\n          m = 8,\n          x = 4,\n          I = 2,\n          T = 1;\n        class H {\n          constructor(t, i, s) {\n            (this.cpu = t),\n              (this.config = i),\n              (this.freqMHz = s),\n              (this.onByteTransmit = null),\n              (this.onLineTransmit = null),\n              (this.lineBuffer = \"\"),\n              (this.cpu.writeHooks[i.UCSRA] = (t) => (\n                (this.cpu.data[i.UCSRA] = t | e | r), !0\n              )),\n              (this.cpu.writeHooks[i.UCSRB] = (t, s) => {\n                t & C && !(s & C) && (this.cpu.data[i.UCSRA] |= e);\n              }),\n              (this.cpu.writeHooks[i.UDR] = (t) => {\n                if (\n                  (this.onByteTransmit && this.onByteTransmit(t),\n                  this.onLineTransmit)\n                ) {\n                  const i = String.fromCharCode(t);\n                  \"\\n\" === i\n                    ? (this.onLineTransmit(this.lineBuffer),\n                      (this.lineBuffer = \"\"))\n                    : (this.lineBuffer += i);\n                }\n                this.cpu.data[i.UCSRA] |= e | r;\n              });\n          }\n          tick() {\n            if (this.cpu.interruptsEnabled) {\n              const i = this.cpu.data[this.config.UCSRA],\n                n = this.cpu.data[this.config.UCSRB];\n              i & e &&\n                n & R &&\n                ((0, t.avrInterrupt)(\n                  this.cpu,\n                  this.config.dataRegisterEmptyInterrupt\n                ),\n                (this.cpu.data[this.config.UCSRA] &= ~e)),\n                n & r &&\n                  n & p &&\n                  ((0, t.avrInterrupt)(\n                    this.cpu,\n                    this.config.txCompleteInterrupt\n                  ),\n                  (this.cpu.data[this.config.UCSRA] &= ~r)),\n                n & s &&\n                  i & o &&\n                  ((0, t.avrInterrupt)(\n                    this.cpu,\n                    this.config.rxCompleteInterrupt\n                  ),\n                  (this.cpu.data[this.config.UCSRA] &= ~s));\n            }\n          }\n          get baudRate() {\n            const t =\n                (this.cpu.data[this.config.UBRRH] << 8) |\n                this.cpu.data[this.config.UBRRL],\n              i = this.cpu.data[this.config.UCSRA] & c ? 8 : 16;\n            return Math.floor(this.freqMHz / (i * (1 + t)));\n          }\n          get bitsPerChar() {\n            switch (\n              ((this.cpu.data[this.config.UCSRA] & (x | I)) >> 1) |\n              (this.cpu.data[this.config.UCSRB] & U)\n            ) {\n              case 0:\n                return 5;\n              case 1:\n                return 6;\n              case 2:\n                return 7;\n              case 3:\n                return 8;\n              default:\n              case 7:\n                return 9;\n            }\n          }\n        }\n        exports.AVRUSART = H;\n      },\n      { \"../cpu/interrupt\": \"x6vY\" },\n    ],\n    dpkw: [\n      function (require, module, exports) {\n        \"use strict\";\n        Object.defineProperty(exports, \"__esModule\", { value: !0 }),\n          (exports.AVRTWI =\n            exports.NoopTWIEventHandler =\n            exports.twiConfig =\n              void 0);\n        var t = require(\"../cpu/interrupt\");\n        const e = 128,\n          s = 64,\n          i = 32,\n          a = 16,\n          c = 8,\n          r = 4,\n          n = 1,\n          o = 248,\n          h = 2,\n          u = 1,\n          p = 3,\n          d = 254,\n          l = 1,\n          T = 0,\n          W = 248,\n          f = 8,\n          R = 16,\n          S = 24,\n          w = 32,\n          g = 40,\n          v = 48,\n          x = 56,\n          C = 64,\n          H = 72,\n          m = 80,\n          I = 88,\n          k = {\n            twiInterrupt: 48,\n            TWBR: 184,\n            TWSR: 185,\n            TWAR: 186,\n            TWDR: 187,\n            TWCR: 188,\n            TWAMR: 189,\n          };\n        exports.twiConfig = k;\n        class y {\n          constructor(t) {\n            this.twi = t;\n          }\n          start() {\n            this.twi.completeStart();\n          }\n          stop() {\n            this.twi.completeStop();\n          }\n          connectToSlave() {\n            this.twi.completeConnect(!1);\n          }\n          writeByte() {\n            this.twi.completeWrite(!1);\n          }\n          readByte() {\n            this.twi.completeRead(255);\n          }\n        }\n        exports.NoopTWIEventHandler = y;\n        class B {\n          constructor(t, c, n) {\n            (this.cpu = t),\n              (this.config = c),\n              (this.freqMHz = n),\n              (this.eventHandler = new y(this)),\n              (this.nextTick = null),\n              this.updateStatus(W),\n              (this.cpu.writeHooks[c.TWCR] = (t) => {\n                const n = t & e;\n                n && (t &= ~e);\n                const { status: o } = this;\n                if (n && t & r) {\n                  const e = this.cpu.data[this.config.TWDR];\n                  return (\n                    (this.nextTick = () => {\n                      if (t & i) this.eventHandler.start(o !== W);\n                      else if (t & a) this.eventHandler.stop();\n                      else if (o === f)\n                        this.eventHandler.connectToSlave(e >> 1, !(1 & e));\n                      else if (o === S || o === g)\n                        this.eventHandler.writeByte(e);\n                      else if (o === C || o === m) {\n                        const e = !!(t & s);\n                        this.eventHandler.readByte(e);\n                      }\n                    }),\n                    (this.cpu.data[c.TWCR] = t),\n                    !0\n                  );\n                }\n              });\n          }\n          tick() {\n            if (\n              (this.nextTick && (this.nextTick(), (this.nextTick = null)),\n              this.cpu.interruptsEnabled)\n            ) {\n              const { TWCR: s, twiInterrupt: i } = this.config;\n              this.cpu.data[s] & n &&\n                this.cpu.data[s] & e &&\n                ((0, t.avrInterrupt)(this.cpu, i), (this.cpu.data[s] &= ~e));\n            }\n          }\n          get prescaler() {\n            switch (this.cpu.data[this.config.TWSR] & p) {\n              case 0:\n                return 1;\n              case 1:\n                return 4;\n              case 2:\n                return 16;\n              case 3:\n                return 64;\n            }\n            throw new Error(\"Invalid prescaler value!\");\n          }\n          get sclFrequency() {\n            return (\n              this.freqMHz /\n              (16 + 2 * this.cpu.data[this.config.TWBR] * this.prescaler)\n            );\n          }\n          completeStart() {\n            this.updateStatus(this.status === W ? f : R);\n          }\n          completeStop() {\n            (this.cpu.data[this.config.TWCR] &= ~a), this.updateStatus(W);\n          }\n          completeConnect(t) {\n            1 & this.cpu.data[this.config.TWDR]\n              ? this.updateStatus(t ? C : H)\n              : this.updateStatus(t ? S : w);\n          }\n          completeWrite(t) {\n            this.updateStatus(t ? g : v);\n          }\n          completeRead(t) {\n            const e = !!(this.cpu.data[this.config.TWCR] & s);\n            (this.cpu.data[this.config.TWDR] = t), this.updateStatus(e ? m : I);\n          }\n          get status() {\n            return this.cpu.data[this.config.TWSR] & o;\n          }\n          updateStatus(t) {\n            const { TWCR: s, TWSR: i } = this.config;\n            (this.cpu.data[i] = (this.cpu.data[i] & ~o) | t),\n              (this.cpu.data[s] |= e);\n          }\n        }\n        exports.AVRTWI = B;\n      },\n      { \"../cpu/interrupt\": \"x6vY\" },\n    ],\n    jrrw: [\n      function (require, module, exports) {\n        \"use strict\";\n        Object.defineProperty(exports, \"__esModule\", { value: !0 }),\n          (exports.ADC = void 0);\n        class t {\n          constructor(t) {\n            (this.cpu = t),\n              (this.analogvalues = {}),\n              (this.ADMUX = 124),\n              (this.ADCSRA = 122),\n              (this.ADCH = 121),\n              (this.ADCL = 120),\n              (t.writeHooks[this.ADCSRA] = (t) => {\n                if (64 & t) {\n                  let s = this.cpu.data[this.ADMUX];\n                  const a =\n                    (s &= 15) in this.analogvalues\n                      ? this.analogvalues[s]\n                      : Math.floor(1024 * Math.random());\n                  return (\n                    (this.cpu.data[this.ADCL] = 255 & a),\n                    (this.cpu.data[this.ADCH] = (a >> 8) & 3),\n                    (this.cpu.data[this.ADCSRA] = -65 & t),\n                    !0\n                  );\n                }\n              });\n          }\n          setAnalogValue(t, s) {\n            this.analogvalues[15 & t] = 1023 & s;\n          }\n        }\n        exports.ADC = t;\n      },\n      {},\n    ],\n    QCba: [\n      function (require, module, exports) {\n        \"use strict\";\n        Object.defineProperty(exports, \"__esModule\", { value: !0 });\n        var e = {\n          CPU: !0,\n          ICPU: !0,\n          CPUMemoryHook: !0,\n          CPUMemoryHooks: !0,\n          avrInstruction: !0,\n          avrInterrupt: !0,\n          AVRTimer: !0,\n          timer0Config: !0,\n          timer1Config: !0,\n          timer2Config: !0,\n          AVRIOPort: !0,\n          GPIOListener: !0,\n          AVRPortConfig: !0,\n          portAConfig: !0,\n          portBConfig: !0,\n          portCConfig: !0,\n          portDConfig: !0,\n          portEConfig: !0,\n          portFConfig: !0,\n          portGConfig: !0,\n          portHConfig: !0,\n          portJConfig: !0,\n          portKConfig: !0,\n          portLConfig: !0,\n          PinState: !0,\n          AVRUSART: !0,\n          usart0Config: !0,\n        };\n        Object.defineProperty(exports, \"CPU\", {\n          enumerable: !0,\n          get: function () {\n            return r.CPU;\n          },\n        }),\n          Object.defineProperty(exports, \"ICPU\", {\n            enumerable: !0,\n            get: function () {\n              return r.ICPU;\n            },\n          }),\n          Object.defineProperty(exports, \"CPUMemoryHook\", {\n            enumerable: !0,\n            get: function () {\n              return r.CPUMemoryHook;\n            },\n          }),\n          Object.defineProperty(exports, \"CPUMemoryHooks\", {\n            enumerable: !0,\n            get: function () {\n              return r.CPUMemoryHooks;\n            },\n          }),\n          Object.defineProperty(exports, \"avrInstruction\", {\n            enumerable: !0,\n            get: function () {\n              return t.avrInstruction;\n            },\n          }),\n          Object.defineProperty(exports, \"avrInterrupt\", {\n            enumerable: !0,\n            get: function () {\n              return n.avrInterrupt;\n            },\n          }),\n          Object.defineProperty(exports, \"AVRTimer\", {\n            enumerable: !0,\n            get: function () {\n              return o.AVRTimer;\n            },\n          }),\n          Object.defineProperty(exports, \"timer0Config\", {\n            enumerable: !0,\n            get: function () {\n              return o.timer0Config;\n            },\n          }),\n          Object.defineProperty(exports, \"timer1Config\", {\n            enumerable: !0,\n            get: function () {\n              return o.timer1Config;\n            },\n          }),\n          Object.defineProperty(exports, \"timer2Config\", {\n            enumerable: !0,\n            get: function () {\n              return o.timer2Config;\n            },\n          }),\n          Object.defineProperty(exports, \"AVRIOPort\", {\n            enumerable: !0,\n            get: function () {\n              return i.AVRIOPort;\n            },\n          }),\n          Object.defineProperty(exports, \"GPIOListener\", {\n            enumerable: !0,\n            get: function () {\n              return i.GPIOListener;\n            },\n          }),\n          Object.defineProperty(exports, \"AVRPortConfig\", {\n            enumerable: !0,\n            get: function () {\n              return i.AVRPortConfig;\n            },\n          }),\n          Object.defineProperty(exports, \"portAConfig\", {\n            enumerable: !0,\n            get: function () {\n              return i.portAConfig;\n            },\n          }),\n          Object.defineProperty(exports, \"portBConfig\", {\n            enumerable: !0,\n            get: function () {\n              return i.portBConfig;\n            },\n          }),\n          Object.defineProperty(exports, \"portCConfig\", {\n            enumerable: !0,\n            get: function () {\n              return i.portCConfig;\n            },\n          }),\n          Object.defineProperty(exports, \"portDConfig\", {\n            enumerable: !0,\n            get: function () {\n              return i.portDConfig;\n            },\n          }),\n          Object.defineProperty(exports, \"portEConfig\", {\n            enumerable: !0,\n            get: function () {\n              return i.portEConfig;\n            },\n          }),\n          Object.defineProperty(exports, \"portFConfig\", {\n            enumerable: !0,\n            get: function () {\n              return i.portFConfig;\n            },\n          }),\n          Object.defineProperty(exports, \"portGConfig\", {\n            enumerable: !0,\n            get: function () {\n              return i.portGConfig;\n            },\n          }),\n          Object.defineProperty(exports, \"portHConfig\", {\n            enumerable: !0,\n            get: function () {\n              return i.portHConfig;\n            },\n          }),\n          Object.defineProperty(exports, \"portJConfig\", {\n            enumerable: !0,\n            get: function () {\n              return i.portJConfig;\n            },\n          }),\n          Object.defineProperty(exports, \"portKConfig\", {\n            enumerable: !0,\n            get: function () {\n              return i.portKConfig;\n            },\n          }),\n          Object.defineProperty(exports, \"portLConfig\", {\n            enumerable: !0,\n            get: function () {\n              return i.portLConfig;\n            },\n          }),\n          Object.defineProperty(exports, \"PinState\", {\n            enumerable: !0,\n            get: function () {\n              return i.PinState;\n            },\n          }),\n          Object.defineProperty(exports, \"AVRUSART\", {\n            enumerable: !0,\n            get: function () {\n              return u.AVRUSART;\n            },\n          }),\n          Object.defineProperty(exports, \"usart0Config\", {\n            enumerable: !0,\n            get: function () {\n              return u.usart0Config;\n            },\n          });\n        var r = require(\"./cpu/cpu\"),\n          t = require(\"./cpu/instruction\"),\n          n = require(\"./cpu/interrupt\"),\n          o = require(\"./peripherals/timer\"),\n          i = require(\"./peripherals/gpio\"),\n          u = require(\"./peripherals/usart\"),\n          p = require(\"./peripherals/twi\");\n        Object.keys(p).forEach(function (r) {\n          \"default\" !== r &&\n            \"__esModule\" !== r &&\n            (Object.prototype.hasOwnProperty.call(e, r) ||\n              Object.defineProperty(exports, r, {\n                enumerable: !0,\n                get: function () {\n                  return p[r];\n                },\n              }));\n        });\n        var f = require(\"./peripherals/adc\");\n        Object.keys(f).forEach(function (r) {\n          \"default\" !== r &&\n            \"__esModule\" !== r &&\n            (Object.prototype.hasOwnProperty.call(e, r) ||\n              Object.defineProperty(exports, r, {\n                enumerable: !0,\n                get: function () {\n                  return f[r];\n                },\n              }));\n        });\n      },\n      {\n        \"./cpu/cpu\": \"MkOI\",\n        \"./cpu/instruction\": \"deE9\",\n        \"./cpu/interrupt\": \"x6vY\",\n        \"./peripherals/timer\": \"nPWZ\",\n        \"./peripherals/gpio\": \"lglE\",\n        \"./peripherals/usart\": \"ZpWN\",\n        \"./peripherals/twi\": \"dpkw\",\n        \"./peripherals/adc\": \"jrrw\",\n      },\n    ],\n  },\n  {},\n  [\"QCba\"],\n  \"AVR8\"\n);\n//# sourceMappingURL=/index.js.map\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/canvg/index.babel.js",
    "content": "import requestAnimationFrame from 'raf';\nimport RGBColor from 'rgbcolor';\nimport { canvasRGBA } from 'stackblur-canvas';\n\n/**\n * HTML-safe compress white-spaces.\n * @param str - String to compress.\n */\nfunction compressSpaces(str) {\n    return str.replace(/(?!\\u3000)\\s+/gm, ' ');\n}\n/**\n * HTML-safe left trim.\n * @param str - String to trim.\n */\nfunction trimLeft(str) {\n    return str.replace(/^[\\n \\t]+/, '');\n}\n/**\n * HTML-safe right trim.\n * @param str - String to trim.\n */\nfunction trimRight(str) {\n    return str.replace(/[\\n \\t]+$/, '');\n}\n/**\n * String to numbers array.\n * @param str - Numbers string.\n */\nfunction toNumbers(str) {\n    const matches = (str || '').match(/-?(\\d+(?:\\.\\d*(?:[eE][+-]?\\d+)?)?|\\.\\d+)(?=\\D|$)/gm) || [];\n    return matches.map(parseFloat);\n}\n// Microsoft Edge fix\nconst allUppercase = /^[A-Z-]+$/;\n/**\n * Normalize attribute name.\n * @param name - Attribute name.\n */\nfunction normalizeAttributeName(name) {\n    if (allUppercase.test(name)) {\n        return name.toLowerCase();\n    }\n    return name;\n}\n/**\n * Parse external URL.\n * @param url - CSS url string.\n */\nfunction parseExternalUrl(url) {\n    //                                   single quotes [2]\n    //                                   v           double quotes [3]\n    //                                   v           v        no quotes [4]\n    //                                   v           v        v\n    const urlMatch = url.match(/url\\(('([^']+)'|\"([^\"]+)\"|([^'\"\\)]+))\\)/) || [];\n    return urlMatch[2] || urlMatch[3] || urlMatch[4];\n}\n\n// slightly modified version of https://github.com/keeganstreet/specificity/blob/master/specificity.js\nconst attributeRegex = /(\\[[^\\]]+\\])/g;\nconst idRegex = /(#[^\\s\\+>~\\.\\[:]+)/g;\nconst classRegex = /(\\.[^\\s\\+>~\\.\\[:]+)/g;\nconst pseudoElementRegex = /(::[^\\s\\+>~\\.\\[:]+|:first-line|:first-letter|:before|:after)/gi;\nconst pseudoClassWithBracketsRegex = /(:[\\w-]+\\([^\\)]*\\))/gi;\nconst pseudoClassRegex = /(:[^\\s\\+>~\\.\\[:]+)/g;\nconst elementRegex = /([^\\s\\+>~\\.\\[:]+)/g;\nfunction findSelectorMatch(selector, regex) {\n    const matches = selector.match(regex);\n    if (!matches) {\n        return [\n            selector,\n            0\n        ];\n    }\n    return [\n        selector.replace(regex, ' '),\n        matches.length\n    ];\n}\n/**\n * Measure selector specificity.\n * @param selector - Selector to measure.\n */\nfunction getSelectorSpecificity(selector) {\n    const specificity = [0, 0, 0];\n    let currentSelector = selector\n        .replace(/:not\\(([^\\)]*)\\)/g, '     $1 ')\n        .replace(/{[\\s\\S]*/gm, ' ');\n    let delta = 0;\n    [currentSelector, delta] = findSelectorMatch(currentSelector, attributeRegex);\n    specificity[1] += delta;\n    [currentSelector, delta] = findSelectorMatch(currentSelector, idRegex);\n    specificity[0] += delta;\n    [currentSelector, delta] = findSelectorMatch(currentSelector, classRegex);\n    specificity[1] += delta;\n    [currentSelector, delta] = findSelectorMatch(currentSelector, pseudoElementRegex);\n    specificity[2] += delta;\n    [currentSelector, delta] = findSelectorMatch(currentSelector, pseudoClassWithBracketsRegex);\n    specificity[1] += delta;\n    [currentSelector, delta] = findSelectorMatch(currentSelector, pseudoClassRegex);\n    specificity[1] += delta;\n    currentSelector = currentSelector\n        .replace(/[\\*\\s\\+>~]/g, ' ')\n        .replace(/[#\\.]/g, ' ');\n    [currentSelector, delta] = findSelectorMatch(currentSelector, elementRegex); // lgtm [js/useless-assignment-to-local]\n    specificity[2] += delta;\n    return specificity.join('');\n}\n\nconst PSEUDO_ZERO = .00000001;\n/**\n * Vector magnitude.\n */\nfunction vectorMagnitude(v) {\n    return Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2));\n}\n/**\n * Ratio between two vectors.\n */\nfunction vectorsRatio(u, v) {\n    return (u[0] * v[0] + u[1] * v[1]) / (vectorMagnitude(u) * vectorMagnitude(v));\n}\n/**\n * Angle between two vectors.\n */\nfunction vectorsAngle(u, v) {\n    return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vectorsRatio(u, v));\n}\nfunction CB1(t) {\n    return t * t * t;\n}\nfunction CB2(t) {\n    return 3 * t * t * (1 - t);\n}\nfunction CB3(t) {\n    return 3 * t * (1 - t) * (1 - t);\n}\nfunction CB4(t) {\n    return (1 - t) * (1 - t) * (1 - t);\n}\nfunction QB1(t) {\n    return t * t;\n}\nfunction QB2(t) {\n    return 2 * t * (1 - t);\n}\nfunction QB3(t) {\n    return (1 - t) * (1 - t);\n}\n\nclass Property {\n    constructor(document, name, value) {\n        this.document = document;\n        this.name = name;\n        this.value = value;\n    }\n    static empty(document) {\n        return new Property(document, 'EMPTY', '');\n    }\n    hasValue() {\n        const { value } = this;\n        return value !== null\n            && value !== ''\n            && value !== 0\n            && typeof value !== 'undefined';\n    }\n    isString(regexp) {\n        const { value } = this;\n        const result = typeof value === 'string';\n        if (!result || !regexp) {\n            return result;\n        }\n        return regexp.test(value);\n    }\n    isUrlDefinition() {\n        return this.isString(/^url\\(/);\n    }\n    isPixels() {\n        if (!this.hasValue()) {\n            return false;\n        }\n        const asString = this.getString();\n        switch (true) {\n            case /px$/.test(asString):\n            case /^[0-9]+$/.test(asString):\n                return true;\n            default:\n                return false;\n        }\n    }\n    setValue(value) {\n        this.value = value;\n        return this;\n    }\n    getValue(def) {\n        if (typeof def === 'undefined' || this.hasValue()) {\n            return this.value;\n        }\n        return def;\n    }\n    getNumber(def) {\n        if (!this.hasValue()) {\n            if (typeof def === 'undefined') {\n                return 0;\n            }\n            return parseFloat(def);\n        }\n        const { value } = this;\n        let n = parseFloat(value);\n        if (this.isString(/%$/)) {\n            n = n / 100.0;\n        }\n        return n;\n    }\n    getString(def) {\n        if (typeof def === 'undefined' || this.hasValue()) {\n            return typeof this.value === 'undefined'\n                ? ''\n                : String(this.value);\n        }\n        return String(def);\n    }\n    getDpi() {\n        return 96.0; // TODO: compute?\n    }\n    getRem() {\n        return this.document.rootEmSize;\n    }\n    getEm() {\n        return this.document.emSize;\n    }\n    getUnits() {\n        return this.getString().replace(/[0-9\\.\\-]/g, '');\n    }\n    getPixels(axisOrIsFontSize, processPercent = false) {\n        if (!this.hasValue()) {\n            return 0;\n        }\n        const [axis, isFontSize] = typeof axisOrIsFontSize === 'boolean'\n            ? [undefined, axisOrIsFontSize]\n            : [axisOrIsFontSize];\n        const { viewPort } = this.document.screen;\n        switch (true) {\n            case this.isString(/vmin$/):\n                return this.getNumber()\n                    / 100.0\n                    * Math.min(viewPort.computeSize('x'), viewPort.computeSize('y'));\n            case this.isString(/vmax$/):\n                return this.getNumber()\n                    / 100.0\n                    * Math.max(viewPort.computeSize('x'), viewPort.computeSize('y'));\n            case this.isString(/vw$/):\n                return this.getNumber()\n                    / 100.0\n                    * viewPort.computeSize('x');\n            case this.isString(/vh$/):\n                return this.getNumber()\n                    / 100.0\n                    * viewPort.computeSize('y');\n            case this.isString(/rem$/):\n                return this.getNumber() * this.getRem( /* viewPort */);\n            case this.isString(/em$/):\n                return this.getNumber() * this.getEm( /* viewPort */);\n            case this.isString(/ex$/):\n                return this.getNumber() * this.getEm( /* viewPort */) / 2.0;\n            case this.isString(/px$/):\n                return this.getNumber();\n            case this.isString(/pt$/):\n                return this.getNumber() * this.getDpi( /* viewPort */) * (1.0 / 72.0);\n            case this.isString(/pc$/):\n                return this.getNumber() * 15;\n            case this.isString(/cm$/):\n                return this.getNumber() * this.getDpi( /* viewPort */) / 2.54;\n            case this.isString(/mm$/):\n                return this.getNumber() * this.getDpi( /* viewPort */) / 25.4;\n            case this.isString(/in$/):\n                return this.getNumber() * this.getDpi( /* viewPort */);\n            case this.isString(/%$/) && isFontSize:\n                return this.getNumber() * this.getEm( /* viewPort */);\n            case this.isString(/%$/):\n                return this.getNumber() * viewPort.computeSize(axis);\n            default: {\n                const n = this.getNumber();\n                if (processPercent && n < 1.0) {\n                    return n * viewPort.computeSize(axis);\n                }\n                return n;\n            }\n        }\n    }\n    getMilliseconds() {\n        if (!this.hasValue()) {\n            return 0;\n        }\n        if (this.isString(/ms$/)) {\n            return this.getNumber();\n        }\n        return this.getNumber() * 1000;\n    }\n    getRadians() {\n        if (!this.hasValue()) {\n            return 0;\n        }\n        switch (true) {\n            case this.isString(/deg$/):\n                return this.getNumber() * (Math.PI / 180.0);\n            case this.isString(/grad$/):\n                return this.getNumber() * (Math.PI / 200.0);\n            case this.isString(/rad$/):\n                return this.getNumber();\n            default:\n                return this.getNumber() * (Math.PI / 180.0);\n        }\n    }\n    getDefinition() {\n        const asString = this.getString();\n        let name = asString.match(/#([^\\)'\"]+)/);\n        if (name) {\n            name = name[1];\n        }\n        if (!name) {\n            name = asString;\n        }\n        return this.document.definitions[name];\n    }\n    getFillStyleDefinition(element, opacity) {\n        let def = this.getDefinition();\n        if (!def) {\n            return null;\n        }\n        // gradient\n        if (typeof def.createGradient === 'function') {\n            return def.createGradient(this.document.ctx, element, opacity);\n        }\n        // pattern\n        if (typeof def.createPattern === 'function') {\n            if (def.getHrefAttribute().hasValue()) {\n                const patternTransform = def.getAttribute('patternTransform');\n                def = def.getHrefAttribute().getDefinition();\n                if (patternTransform.hasValue()) {\n                    def.getAttribute('patternTransform', true).setValue(patternTransform.value);\n                }\n            }\n            return def.createPattern(this.document.ctx, element, opacity);\n        }\n        return null;\n    }\n    getTextBaseline() {\n        if (!this.hasValue()) {\n            return null;\n        }\n        return Property.textBaselineMapping[this.getString()];\n    }\n    addOpacity(opacity) {\n        let { value } = this;\n        const len = value.length;\n        let commas = 0;\n        // Simulate old RGBColor version, which can't parse rgba.\n        for (let i = 0; i < len; i++) {\n            if (value[i] === ',') {\n                commas++;\n            }\n            if (commas === 3) {\n                break;\n            }\n        }\n        if (opacity.hasValue() && this.isString() && commas !== 3) {\n            const color = new RGBColor(value);\n            if (color.ok) {\n                value = `rgba(${color.r}, ${color.g}, ${color.b}, ${opacity.getNumber()})`;\n            }\n        }\n        return new Property(this.document, this.name, value);\n    }\n}\nProperty.textBaselineMapping = {\n    'baseline': 'alphabetic',\n    'before-edge': 'top',\n    'text-before-edge': 'top',\n    'middle': 'middle',\n    'central': 'middle',\n    'after-edge': 'bottom',\n    'text-after-edge': 'bottom',\n    'ideographic': 'ideographic',\n    'alphabetic': 'alphabetic',\n    'hanging': 'hanging',\n    'mathematical': 'alphabetic'\n};\n\nclass ViewPort {\n    constructor() {\n        this.viewPorts = [];\n    }\n    clear() {\n        this.viewPorts = [];\n    }\n    setCurrent(width, height) {\n        this.viewPorts.push({\n            width,\n            height\n        });\n    }\n    removeCurrent() {\n        this.viewPorts.pop();\n    }\n    getCurrent() {\n        const { viewPorts } = this;\n        return viewPorts[viewPorts.length - 1];\n    }\n    get width() {\n        return this.getCurrent().width;\n    }\n    get height() {\n        return this.getCurrent().height;\n    }\n    computeSize(d) {\n        if (typeof d === 'number') {\n            return d;\n        }\n        if (d === 'x') {\n            return this.width;\n        }\n        if (d === 'y') {\n            return this.height;\n        }\n        return Math.sqrt(Math.pow(this.width, 2) + Math.pow(this.height, 2)) / Math.sqrt(2);\n    }\n}\n\nclass Point {\n    constructor(x, y) {\n        this.x = x;\n        this.y = y;\n    }\n    static parse(point, defaultValue = 0) {\n        const [x = defaultValue, y = x] = toNumbers(point);\n        return new Point(x, y);\n    }\n    static parsePath(path) {\n        const points = toNumbers(path);\n        const len = points.length;\n        const pathPoints = [];\n        for (let i = 0; i < len; i += 2) {\n            pathPoints.push(new Point(points[i], points[i + 1]));\n        }\n        return pathPoints;\n    }\n    angleTo(point) {\n        return Math.atan2(point.y - this.y, point.x - this.x);\n    }\n    applyTransform(transform) {\n        const { x, y } = this;\n        const xp = x * transform[0] + y * transform[2] + transform[4];\n        const yp = x * transform[1] + y * transform[3] + transform[5];\n        this.x = xp;\n        this.y = yp;\n    }\n}\n\nclass Mouse {\n    constructor(screen) {\n        this.screen = screen;\n        this.working = false;\n        this.events = [];\n        this.eventElements = [];\n        this.onClick = this.onClick.bind(this);\n        this.onMouseMove = this.onMouseMove.bind(this);\n    }\n    isWorking() {\n        return this.working;\n    }\n    start() {\n        if (this.working) {\n            return;\n        }\n        const { screen, onClick, onMouseMove } = this;\n        const canvas = screen.ctx.canvas;\n        canvas.onclick = onClick;\n        canvas.onmousemove = onMouseMove;\n        this.working = true;\n    }\n    stop() {\n        if (!this.working) {\n            return;\n        }\n        const canvas = this.screen.ctx.canvas;\n        this.working = false;\n        canvas.onclick = null;\n        canvas.onmousemove = null;\n    }\n    hasEvents() {\n        return this.working && this.events.length > 0;\n    }\n    runEvents() {\n        if (!this.working) {\n            return;\n        }\n        const { screen: document, events, eventElements } = this;\n        const { style } = document.ctx.canvas;\n        if (style) {\n            style.cursor = '';\n        }\n        events.forEach(({ run }, i) => {\n            let element = eventElements[i];\n            while (element) {\n                run(element);\n                element = element.parent;\n            }\n        });\n        // done running, clear\n        this.events = [];\n        this.eventElements = [];\n    }\n    checkPath(element, ctx) {\n        if (!this.working || !ctx) {\n            return;\n        }\n        const { events, eventElements } = this;\n        events.forEach(({ x, y }, i) => {\n            if (!eventElements[i] && ctx.isPointInPath && ctx.isPointInPath(x, y)) {\n                eventElements[i] = element;\n            }\n        });\n    }\n    checkBoundingBox(element, boundingBox) {\n        if (!this.working || !boundingBox) {\n            return;\n        }\n        const { events, eventElements } = this;\n        events.forEach(({ x, y }, i) => {\n            if (!eventElements[i] && boundingBox.isPointInBox(x, y)) {\n                eventElements[i] = element;\n            }\n        });\n    }\n    mapXY(x, y) {\n        const { window, ctx } = this.screen;\n        const point = new Point(x, y);\n        let element = ctx.canvas;\n        while (element) {\n            point.x -= element.offsetLeft;\n            point.y -= element.offsetTop;\n            element = element.offsetParent;\n        }\n        if (window.scrollX) {\n            point.x += window.scrollX;\n        }\n        if (window.scrollY) {\n            point.y += window.scrollY;\n        }\n        return point;\n    }\n    onClick(evt) {\n        const { x, y } = this.mapXY((evt || event).clientX, (evt || event).clientY);\n        this.events.push({\n            type: 'onclick',\n            x,\n            y,\n            run(event) {\n                if (event.onClick) {\n                    event.onClick();\n                }\n            }\n        });\n    }\n    onMouseMove(evt) {\n        const { x, y } = this.mapXY((evt || event).clientX, (evt || event).clientY);\n        this.events.push({\n            type: 'onmousemove',\n            x,\n            y,\n            run(event) {\n                if (event.onMouseMove) {\n                    event.onMouseMove();\n                }\n            }\n        });\n    }\n}\n\nconst defaultWindow = typeof window !== 'undefined'\n    ? window\n    : null;\nconst defaultFetch = typeof fetch !== 'undefined'\n    ? fetch.bind(window)\n    : null;\nclass Screen {\n    constructor(ctx, { fetch = defaultFetch, window = defaultWindow } = {}) {\n        this.ctx = ctx;\n        this.FRAMERATE = 30;\n        this.MAX_VIRTUAL_PIXELS = 30000;\n        this.CLIENT_WIDTH = 800;\n        this.CLIENT_HEIGHT = 600;\n        this.viewPort = new ViewPort();\n        this.mouse = new Mouse(this);\n        this.animations = [];\n        this.waits = [];\n        this.frameDuration = 0;\n        this.isReadyLock = false;\n        this.isFirstRender = true;\n        this.intervalId = null;\n        this.window = window;\n        this.fetch = fetch;\n    }\n    wait(checker) {\n        this.waits.push(checker);\n    }\n    ready() {\n        if (!this.readyPromise) {\n            return Promise.resolve();\n        }\n        return this.readyPromise;\n    }\n    isReady() {\n        if (this.isReadyLock) {\n            return true;\n        }\n        const isReadyLock = this.waits.every(_ => _());\n        if (isReadyLock) {\n            this.waits = [];\n            if (this.resolveReady) {\n                this.resolveReady();\n            }\n        }\n        this.isReadyLock = isReadyLock;\n        return isReadyLock;\n    }\n    setDefaults(ctx) {\n        // initial values and defaults\n        ctx.strokeStyle = 'rgba(0,0,0,0)';\n        ctx.lineCap = 'butt';\n        ctx.lineJoin = 'miter';\n        ctx.miterLimit = 4;\n    }\n    setViewBox({ document, ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX = 0, minY = 0, refX, refY, clip = false, clipX = 0, clipY = 0 }) {\n        // aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute\n        const cleanAspectRatio = compressSpaces(aspectRatio).replace(/^defer\\s/, ''); // ignore defer\n        const [aspectRatioAlign, aspectRatioMeetOrSlice] = cleanAspectRatio.split(' ');\n        const align = aspectRatioAlign || 'xMidYMid';\n        const meetOrSlice = aspectRatioMeetOrSlice || 'meet';\n        // calculate scale\n        const scaleX = width / desiredWidth;\n        const scaleY = height / desiredHeight;\n        const scaleMin = Math.min(scaleX, scaleY);\n        const scaleMax = Math.max(scaleX, scaleY);\n        let finalDesiredWidth = desiredWidth;\n        let finalDesiredHeight = desiredHeight;\n        if (meetOrSlice === 'meet') {\n            finalDesiredWidth *= scaleMin;\n            finalDesiredHeight *= scaleMin;\n        }\n        if (meetOrSlice === 'slice') {\n            finalDesiredWidth *= scaleMax;\n            finalDesiredHeight *= scaleMax;\n        }\n        const refXProp = new Property(document, 'refX', refX);\n        const refYProp = new Property(document, 'refY', refY);\n        const hasRefs = refXProp.hasValue() && refYProp.hasValue();\n        if (hasRefs) {\n            ctx.translate(-scaleMin * refXProp.getPixels('x'), -scaleMin * refYProp.getPixels('y'));\n        }\n        if (clip) {\n            const scaledClipX = scaleMin * clipX;\n            const scaledClipY = scaleMin * clipY;\n            ctx.beginPath();\n            ctx.moveTo(scaledClipX, scaledClipY);\n            ctx.lineTo(width, scaledClipY);\n            ctx.lineTo(width, height);\n            ctx.lineTo(scaledClipX, height);\n            ctx.closePath();\n            ctx.clip();\n        }\n        if (!hasRefs) {\n            const isMeetMinY = meetOrSlice === 'meet' && scaleMin === scaleY;\n            const isSliceMaxY = meetOrSlice === 'slice' && scaleMax === scaleY;\n            const isMeetMinX = meetOrSlice === 'meet' && scaleMin === scaleX;\n            const isSliceMaxX = meetOrSlice === 'slice' && scaleMax === scaleX;\n            if (/^xMid/.test(align) && (isMeetMinY || isSliceMaxY)) {\n                ctx.translate(width / 2.0 - finalDesiredWidth / 2.0, 0);\n            }\n            if (/YMid$/.test(align) && (isMeetMinX || isSliceMaxX)) {\n                ctx.translate(0, height / 2.0 - finalDesiredHeight / 2.0);\n            }\n            if (/^xMax/.test(align) && (isMeetMinY || isSliceMaxY)) {\n                ctx.translate(width - finalDesiredWidth, 0);\n            }\n            if (/YMax$/.test(align) && (isMeetMinX || isSliceMaxX)) {\n                ctx.translate(0, height - finalDesiredHeight);\n            }\n        }\n        // scale\n        switch (true) {\n            case align === 'none':\n                ctx.scale(scaleX, scaleY);\n                break;\n            case meetOrSlice === 'meet':\n                ctx.scale(scaleMin, scaleMin);\n                break;\n            case meetOrSlice === 'slice':\n                ctx.scale(scaleMax, scaleMax);\n                break;\n        }\n        // translate\n        ctx.translate(-minX, -minY);\n    }\n    start(element, { enableRedraw = false, ignoreMouse = false, ignoreAnimation = false, ignoreDimensions = false, ignoreClear = false, forceRedraw, scaleWidth, scaleHeight, offsetX, offsetY } = {}) {\n        const { FRAMERATE, mouse } = this;\n        const frameDuration = 1000 / FRAMERATE;\n        this.frameDuration = frameDuration;\n        this.readyPromise = new Promise((resolve) => {\n            this.resolveReady = resolve;\n        });\n        if (this.isReady()) {\n            this.render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY);\n        }\n        if (!enableRedraw) {\n            return;\n        }\n        let now = Date.now();\n        let then = now;\n        let delta = 0;\n        const tick = () => {\n            now = Date.now();\n            delta = now - then;\n            if (delta >= frameDuration) {\n                then = now - (delta % frameDuration);\n                if (this.shouldUpdate(ignoreAnimation, forceRedraw)) {\n                    this.render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY);\n                    mouse.runEvents();\n                }\n            }\n            this.intervalId = requestAnimationFrame(tick);\n        };\n        if (!ignoreMouse) {\n            mouse.start();\n        }\n        this.intervalId = requestAnimationFrame(tick);\n    }\n    stop() {\n        if (this.intervalId) {\n            requestAnimationFrame.cancel(this.intervalId);\n            this.intervalId = null;\n        }\n        this.mouse.stop();\n    }\n    shouldUpdate(ignoreAnimation, forceRedraw) {\n        // need update from animations?\n        if (!ignoreAnimation) {\n            const { frameDuration } = this;\n            const shouldUpdate = this.animations.reduce((shouldUpdate, animation) => animation.update(frameDuration) || shouldUpdate, false);\n            if (shouldUpdate) {\n                return true;\n            }\n        }\n        // need update from redraw?\n        if (typeof forceRedraw === 'function' && forceRedraw()) {\n            return true;\n        }\n        if (!this.isReadyLock && this.isReady()) {\n            return true;\n        }\n        // need update from mouse events?\n        if (this.mouse.hasEvents()) {\n            return true;\n        }\n        return false;\n    }\n    render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY) {\n        const { CLIENT_WIDTH, CLIENT_HEIGHT, viewPort, ctx, isFirstRender } = this;\n        const canvas = ctx.canvas;\n        viewPort.clear();\n        if (canvas.width && canvas.height) {\n            viewPort.setCurrent(canvas.width, canvas.height);\n        }\n        else {\n            viewPort.setCurrent(CLIENT_WIDTH, CLIENT_HEIGHT);\n        }\n        const widthStyle = element.getStyle('width');\n        const heightStyle = element.getStyle('height');\n        if (!ignoreDimensions && (isFirstRender\n            || typeof scaleWidth !== 'number' && typeof scaleHeight !== 'number')) {\n            // set canvas size\n            if (widthStyle.hasValue()) {\n                canvas.width = widthStyle.getPixels('x');\n                if (canvas.style) {\n                    canvas.style.width = `${canvas.width}px`;\n                }\n            }\n            if (heightStyle.hasValue()) {\n                canvas.height = heightStyle.getPixels('y');\n                if (canvas.style) {\n                    canvas.style.height = `${canvas.height}px`;\n                }\n            }\n        }\n        let cWidth = canvas.clientWidth || canvas.width;\n        let cHeight = canvas.clientHeight || canvas.height;\n        if (ignoreDimensions && widthStyle.hasValue() && heightStyle.hasValue()) {\n            cWidth = widthStyle.getPixels('x');\n            cHeight = heightStyle.getPixels('y');\n        }\n        viewPort.setCurrent(cWidth, cHeight);\n        if (typeof offsetX === 'number') {\n            element.getAttribute('x', true).setValue(offsetX);\n        }\n        if (typeof offsetY === 'number') {\n            element.getAttribute('y', true).setValue(offsetY);\n        }\n        if (typeof scaleWidth === 'number'\n            || typeof scaleHeight === 'number') {\n            const viewBox = toNumbers(element.getAttribute('viewBox').getString());\n            let xRatio = 0;\n            let yRatio = 0;\n            if (typeof scaleWidth === 'number') {\n                const widthAttr = element.getAttribute('width');\n                if (widthAttr.hasValue()) {\n                    xRatio = widthAttr.getPixels('x') / scaleWidth;\n                }\n                else if (!isNaN(viewBox[2])) {\n                    xRatio = viewBox[2] / scaleWidth;\n                }\n            }\n            if (typeof scaleHeight === 'number') {\n                const heightAttr = element.getAttribute('height');\n                if (heightAttr.hasValue()) {\n                    yRatio = heightAttr.getPixels('y') / scaleHeight;\n                }\n                else if (!isNaN(viewBox[3])) {\n                    yRatio = viewBox[3] / scaleHeight;\n                }\n            }\n            if (!xRatio) {\n                xRatio = yRatio;\n            }\n            if (!yRatio) {\n                yRatio = xRatio;\n            }\n            element.getAttribute('width', true).setValue(scaleWidth);\n            element.getAttribute('height', true).setValue(scaleHeight);\n            const transformStyle = element.getStyle('transform', true, true);\n            transformStyle.setValue(`${transformStyle.getString()} scale(${1.0 / xRatio}, ${1.0 / yRatio})`);\n        }\n        // clear and render\n        if (!ignoreClear) {\n            ctx.clearRect(0, 0, cWidth, cHeight);\n        }\n        element.render(ctx);\n        if (isFirstRender) {\n            this.isFirstRender = false;\n        }\n    }\n}\nScreen.defaultWindow = defaultWindow;\nScreen.defaultFetch = defaultFetch;\n\nconst { defaultFetch: defaultFetch$1 } = Screen;\nconst DefaultDOMParser = typeof DOMParser !== 'undefined'\n    ? DOMParser\n    : null;\nclass Parser {\n    // private readonly options: any;\n    constructor({ fetch = defaultFetch$1, DOMParser = DefaultDOMParser\n    // ...options\n     } = {}) {\n        this.fetch = fetch;\n        this.DOMParser = DOMParser;\n        // this.options = options;\n    }\n    async parse(resource) {\n        if (/^</.test(resource)) {\n            return this.parseFromString(resource);\n        }\n        return this.load(resource);\n    }\n    parseFromString(xml) {\n        try {\n            const parser = new this.DOMParser();\n            return parser.parseFromString(xml, 'image/svg+xml');\n        }\n        catch (err) {\n            const parser = new this.DOMParser();\n            return parser.parseFromString(xml, 'text/xml');\n        }\n    }\n    async load(url) {\n        const response = await this.fetch(url);\n        const xml = await response.text();\n        return this.parseFromString(xml);\n    }\n}\n\nclass Element {\n    constructor(document, node, captureTextNodes = false) {\n        this.document = document;\n        this.node = node;\n        this.captureTextNodes = captureTextNodes;\n        this.attributes = {};\n        this.styles = {};\n        this.stylesSpecificity = {};\n        this.animationFrozen = false;\n        this.animationFrozenValue = '';\n        this.parent = null;\n        this.children = [];\n        if (!node || node.nodeType !== 1) { // ELEMENT_NODE\n            return;\n        }\n        // add attributes\n        Array.from(node.attributes).forEach((attribute) => {\n            const nodeName = normalizeAttributeName(attribute.nodeName);\n            this.attributes[nodeName] = new Property(document, nodeName, attribute.value);\n        });\n        this.addStylesFromStyleDefinition();\n        // add inline styles\n        if (this.getAttribute('style').hasValue()) {\n            const styles = this.getAttribute('style')\n                .getString()\n                .split(';')\n                .map(_ => _.trim());\n            styles.forEach((style) => {\n                if (!style) {\n                    return;\n                }\n                const [name, value] = style.split(':');\n                this.styles[name] = new Property(document, name.trim(), value.trim());\n            });\n        }\n        const { definitions } = document;\n        const id = this.getAttribute('id');\n        // add id\n        if (id.hasValue()) {\n            if (!definitions[id.getValue()]) {\n                definitions[id.getValue()] = this;\n            }\n        }\n        Array.from(node.childNodes).forEach((childNode) => {\n            if (childNode.nodeType === 1) {\n                this.addChild(childNode); // ELEMENT_NODE\n            }\n            else if (captureTextNodes && (childNode.nodeType === 3\n                || childNode.nodeType === 4)) {\n                const textNode = document.createTextNode(childNode);\n                if (textNode.getText().length > 0) {\n                    this.addChild(textNode); // TEXT_NODE\n                }\n            }\n        });\n    }\n    getAttribute(name, createIfNotExists = false) {\n        const attr = this.attributes[name];\n        if (!attr && createIfNotExists) {\n            const attr = new Property(this.document, name, '');\n            this.attributes[name] = attr;\n            return attr;\n        }\n        return attr || Property.empty(this.document);\n    }\n    getHrefAttribute() {\n        for (const key in this.attributes) {\n            if (key === 'href' || /:href$/.test(key)) {\n                return this.attributes[key];\n            }\n        }\n        return Property.empty(this.document);\n    }\n    getStyle(name, createIfNotExists = false, skipAncestors = false) {\n        const style = this.styles[name];\n        if (style) {\n            return style;\n        }\n        const attr = this.getAttribute(name);\n        if (attr && attr.hasValue()) {\n            this.styles[name] = attr; // move up to me to cache\n            return attr;\n        }\n        if (!skipAncestors) {\n            const { parent } = this;\n            if (parent) {\n                const parentStyle = parent.getStyle(name);\n                if (parentStyle && parentStyle.hasValue()) {\n                    return parentStyle;\n                }\n            }\n        }\n        if (createIfNotExists) {\n            const style = new Property(this.document, name, '');\n            this.styles[name] = style;\n            return style;\n        }\n        return style || Property.empty(this.document);\n    }\n    render(ctx) {\n        // don't render display=none\n        // don't render visibility=hidden\n        if (this.getStyle('display').getString() === 'none'\n            || this.getStyle('visibility').getString() === 'hidden') {\n            return;\n        }\n        ctx.save();\n        if (this.getStyle('mask').hasValue()) { // mask\n            const mask = this.getStyle('mask').getDefinition();\n            if (mask) {\n                mask.apply(ctx, this);\n            }\n        }\n        else if (this.getStyle('filter').getValue('none') !== 'none') { // filter\n            const filter = this.getStyle('filter').getDefinition();\n            if (filter) {\n                filter.apply(ctx, this);\n            }\n        }\n        else {\n            this.setContext(ctx);\n            this.renderChildren(ctx);\n            this.clearContext(ctx);\n        }\n        ctx.restore();\n    }\n    setContext(_) { }\n    clearContext(_) { }\n    renderChildren(ctx) {\n        this.children.forEach((child) => {\n            child.render(ctx);\n        });\n    }\n    addChild(childNode) {\n        const child = childNode instanceof Element\n            ? childNode\n            : this.document.createElement(childNode);\n        child.parent = this;\n        if (!Element.ignoreChildTypes.includes(child.type)) {\n            this.children.push(child);\n        }\n    }\n    matchesSelector(selector) {\n        const { node } = this;\n        if (typeof node.matches === 'function') {\n            return node.matches(selector);\n        }\n        const styleClasses = node.getAttribute('class');\n        if (!styleClasses || styleClasses === '') {\n            return false;\n        }\n        return styleClasses.split(' ').some((styleClass) => {\n            if (`.${styleClass}` === selector) {\n                return true;\n            }\n        });\n    }\n    addStylesFromStyleDefinition() {\n        const { styles, stylesSpecificity } = this.document;\n        for (const selector in styles) {\n            if (selector[0] !== '@' && this.matchesSelector(selector)) {\n                const style = styles[selector];\n                const specificity = stylesSpecificity[selector];\n                if (style) {\n                    for (const name in style) {\n                        let existingSpecificity = this.stylesSpecificity[name];\n                        if (typeof existingSpecificity === 'undefined') {\n                            existingSpecificity = '000';\n                        }\n                        if (specificity >= existingSpecificity) {\n                            this.styles[name] = style[name];\n                            this.stylesSpecificity[name] = specificity;\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\nElement.ignoreChildTypes = [\n    'title'\n];\n\nclass UnknownElement extends Element {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        // tslint:disable-next-line: no-console\n        console.warn(`Element ${node.nodeName} not yet implemented.`);\n    }\n}\n\nfunction wrapFontFamily(fontFamily) {\n    const trimmed = fontFamily.trim();\n    return /^('|\")/.test(trimmed)\n        ? trimmed\n        : `\"${trimmed}\"`;\n}\nfunction prepareFontFamily(fontFamily) {\n    return typeof process === 'undefined'\n        ? fontFamily\n        : fontFamily\n            .trim()\n            .split(',')\n            .map(wrapFontFamily)\n            .join(',');\n}\nclass Font {\n    constructor(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) {\n        const inheritFont = inherit\n            ? typeof inherit === 'string'\n                ? Font.parse(inherit)\n                : inherit\n            : {};\n        this.fontFamily = fontFamily || inheritFont.fontFamily;\n        this.fontSize = fontSize || inheritFont.fontSize;\n        this.fontStyle = fontStyle || inheritFont.fontStyle;\n        this.fontWeight = fontWeight || inheritFont.fontWeight;\n        this.fontVariant = fontVariant || inheritFont.fontVariant;\n    }\n    static parse(font = '', inherit) {\n        let fontStyle = '';\n        let fontVariant = '';\n        let fontWeight = '';\n        let fontSize = '';\n        let fontFamily = '';\n        const parts = compressSpaces(font).trim().split(' ');\n        const set = {\n            fontSize: false,\n            fontStyle: false,\n            fontWeight: false,\n            fontVariant: false\n        };\n        parts.forEach((part) => {\n            switch (true) {\n                case !set.fontStyle && Font.styles.includes(part):\n                    if (part !== 'inherit') {\n                        fontStyle = part;\n                    }\n                    set.fontStyle = true;\n                    break;\n                case !set.fontVariant && Font.variants.includes(part):\n                    if (part !== 'inherit') {\n                        fontVariant = part;\n                    }\n                    set.fontStyle = true;\n                    set.fontVariant = true;\n                    break;\n                case !set.fontWeight && Font.weights.includes(part):\n                    if (part !== 'inherit') {\n                        fontWeight = part;\n                    }\n                    set.fontStyle = true;\n                    set.fontVariant = true;\n                    set.fontWeight = true;\n                    break;\n                case !set.fontSize:\n                    if (part !== 'inherit') {\n                        [fontSize] = part.split('/');\n                    }\n                    set.fontStyle = true;\n                    set.fontVariant = true;\n                    set.fontWeight = true;\n                    set.fontSize = true;\n                    break;\n                default:\n                    if (part !== 'inherit') {\n                        fontFamily += part;\n                    }\n            }\n        });\n        return new Font(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit);\n    }\n    toString() {\n        return [\n            this.fontStyle,\n            this.fontVariant,\n            this.fontWeight,\n            this.fontSize,\n            // Wrap fontFamily only on nodejs and only for canvas.ctx\n            prepareFontFamily(this.fontFamily)\n        ].join(' ');\n    }\n}\nFont.styles = 'normal|italic|oblique|inherit';\nFont.variants = 'normal|small-caps|inherit';\nFont.weights = 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit';\n\nclass BoundingBox {\n    constructor(x1 = Number.NaN, y1 = Number.NaN, x2 = Number.NaN, y2 = Number.NaN) {\n        this.x1 = x1;\n        this.y1 = y1;\n        this.x2 = x2;\n        this.y2 = y2;\n        this.addPoint(x1, y1);\n        this.addPoint(x2, y2);\n    }\n    get x() {\n        return this.x1;\n    }\n    get y() {\n        return this.y1;\n    }\n    get width() {\n        return this.x2 - this.x1;\n    }\n    get height() {\n        return this.y2 - this.y1;\n    }\n    addPoint(x, y) {\n        if (typeof x !== 'undefined') {\n            if (isNaN(this.x1) || isNaN(this.x2)) {\n                this.x1 = x;\n                this.x2 = x;\n            }\n            if (x < this.x1) {\n                this.x1 = x;\n            }\n            if (x > this.x2) {\n                this.x2 = x;\n            }\n        }\n        if (typeof y !== 'undefined') {\n            if (isNaN(this.y1) || isNaN(this.y2)) {\n                this.y1 = y;\n                this.y2 = y;\n            }\n            if (y < this.y1) {\n                this.y1 = y;\n            }\n            if (y > this.y2) {\n                this.y2 = y;\n            }\n        }\n    }\n    addX(x) {\n        this.addPoint(x, null);\n    }\n    addY(y) {\n        this.addPoint(null, y);\n    }\n    addBoundingBox({ x1, y1, x2, y2 }) {\n        this.addPoint(x1, y1);\n        this.addPoint(x2, y2);\n    }\n    sumCubic(t, p0, p1, p2, p3) {\n        return (Math.pow(1 - t, 3) * p0\n            + 3 * Math.pow(1 - t, 2) * t * p1\n            + 3 * (1 - t) * Math.pow(t, 2) * p2\n            + Math.pow(t, 3) * p3);\n    }\n    bezierCurveAdd(forX, p0, p1, p2, p3) {\n        const b = 6 * p0 - 12 * p1 + 6 * p2;\n        const a = -3 * p0 + 9 * p1 - 9 * p2 + 3 * p3;\n        const c = 3 * p1 - 3 * p0;\n        if (a === 0) {\n            if (b === 0) {\n                return;\n            }\n            const t = -c / b;\n            if (0 < t && t < 1) {\n                if (forX) {\n                    this.addX(this.sumCubic(t, p0, p1, p2, p3));\n                }\n                else {\n                    this.addY(this.sumCubic(t, p0, p1, p2, p3));\n                }\n            }\n            return;\n        }\n        const b2ac = Math.pow(b, 2) - 4 * c * a;\n        if (b2ac < 0) {\n            return;\n        }\n        const t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n        if (0 < t1 && t1 < 1) {\n            if (forX) {\n                this.addX(this.sumCubic(t1, p0, p1, p2, p3));\n            }\n            else {\n                this.addY(this.sumCubic(t1, p0, p1, p2, p3));\n            }\n        }\n        const t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n        if (0 < t2 && t2 < 1) {\n            if (forX) {\n                this.addX(this.sumCubic(t2, p0, p1, p2, p3));\n            }\n            else {\n                this.addY(this.sumCubic(t2, p0, p1, p2, p3));\n            }\n        }\n    }\n    // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n    addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n        this.addPoint(p0x, p0y);\n        this.addPoint(p3x, p3y);\n        this.bezierCurveAdd(true, p0x, p1x, p2x, p3x);\n        this.bezierCurveAdd(false, p0y, p1y, p2y, p3y);\n    }\n    addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n        const cp1x = p0x + 2 / 3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)\n        const cp1y = p0y + 2 / 3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)\n        const cp2x = cp1x + 1 / 3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)\n        const cp2y = cp1y + 1 / 3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)\n        this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y);\n    }\n    isPointInBox(x, y) {\n        const { x1, y1, x2, y2 } = this;\n        return (x1 <= x\n            && x <= x2\n            && y1 <= y\n            && y <= y2);\n    }\n}\n\nclass Translate {\n    constructor(_, point) {\n        this.type = 'translate';\n        this.point = null;\n        this.point = Point.parse(point);\n    }\n    apply(ctx) {\n        const { x, y } = this.point;\n        ctx.translate(x || 0.0, y || 0.0);\n    }\n    unapply(ctx) {\n        const { x, y } = this.point;\n        ctx.translate(-1.0 * x || 0.0, -1.0 * y || 0.0);\n    }\n    applyToPoint(point) {\n        const { x, y } = this.point;\n        point.applyTransform([\n            1,\n            0,\n            0,\n            1,\n            x || 0.0,\n            y || 0.0\n        ]);\n    }\n}\n\nclass Rotate {\n    constructor(document, rotate, transformOrigin = []) {\n        this.type = 'rotate';\n        this.angle = null;\n        this.cx = 0;\n        this.cy = 0;\n        const numbers = toNumbers(rotate);\n        this.angle = new Property(document, 'angle', numbers[0]);\n        this.cx = (numbers[1] || 0) + (transformOrigin[0] || 0);\n        this.cy = (numbers[2] || 0) + (transformOrigin[1] || 0);\n    }\n    apply(ctx) {\n        const { cx, cy, angle } = this;\n        ctx.translate(cx, cy);\n        ctx.rotate(angle.getRadians());\n        ctx.translate(-cx, -cy);\n    }\n    unapply(ctx) {\n        const { cx, cy, angle } = this;\n        ctx.translate(cx, cy);\n        ctx.rotate(-1.0 * angle.getRadians());\n        ctx.translate(-cx, -cy);\n    }\n    applyToPoint(point) {\n        const { cx, cy, angle } = this;\n        const rad = angle.getRadians();\n        // tslint:disable-next-line: no-console\n        // console.warn('Unknown action:', (this as any).p, this);\n        // ?\n        point.applyTransform([\n            1,\n            0,\n            0,\n            1,\n            cx || 0.0,\n            cy || 0.0 // this.p.y\n        ]);\n        point.applyTransform([\n            Math.cos(rad),\n            Math.sin(rad),\n            -Math.sin(rad),\n            Math.cos(rad),\n            0,\n            0\n        ]);\n        point.applyTransform([\n            1,\n            0,\n            0,\n            1,\n            -cx || 0.0,\n            -cy || 0.0 // -this.p.y\n        ]);\n    }\n}\n\nclass Scale {\n    constructor(_, scale) {\n        this.type = 'scale';\n        this.scale = null;\n        const scaleSize = Point.parse(scale, 1);\n        // Workaround for node-canvas\n        if (scaleSize.x === 0\n            || scaleSize.y === 0) {\n            scaleSize.x = PSEUDO_ZERO;\n            scaleSize.y = PSEUDO_ZERO;\n        }\n        this.scale = scaleSize;\n    }\n    apply(ctx) {\n        const { x, y } = this.scale;\n        ctx.scale(x, y || x);\n    }\n    unapply(ctx) {\n        const { x, y } = this.scale;\n        ctx.scale(1.0 / x, 1.0 / y || x);\n    }\n    applyToPoint(point) {\n        const { x, y } = this.scale;\n        point.applyTransform([\n            x || 0.0,\n            0,\n            0,\n            y || 0.0,\n            0,\n            0\n        ]);\n    }\n}\n\nclass Matrix {\n    constructor(_, matrix) {\n        this.type = 'matrix';\n        this.matrix = [];\n        this.matrix = toNumbers(matrix);\n    }\n    apply(ctx) {\n        const { matrix } = this;\n        ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);\n    }\n    unapply(ctx) {\n        const { matrix } = this;\n        const a = matrix[0];\n        const b = matrix[2];\n        const c = matrix[4];\n        const d = matrix[1];\n        const e = matrix[3];\n        const f = matrix[5];\n        const g = 0.0;\n        const h = 0.0;\n        const i = 1.0;\n        const det = 1 / (a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g));\n        ctx.transform(det * (e * i - f * h), det * (f * g - d * i), det * (c * h - b * i), det * (a * i - c * g), det * (b * f - c * e), det * (c * d - a * f));\n    }\n    applyToPoint(point) {\n        point.applyTransform(this.matrix);\n    }\n}\n\nclass Skew extends Matrix {\n    constructor(document, skew) {\n        super(document, skew);\n        this.type = 'skew';\n        this.angle = null;\n        this.angle = new Property(document, 'angle', skew);\n    }\n}\n\nclass SkewX extends Skew {\n    constructor(document, skew) {\n        super(document, skew);\n        this.type = 'skewX';\n        this.matrix = [\n            1,\n            0,\n            Math.tan(this.angle.getRadians()),\n            1,\n            0,\n            0\n        ];\n    }\n}\n\nclass SkewY extends Skew {\n    constructor(document, skew) {\n        super(document, skew);\n        this.type = 'skewY';\n        this.matrix = [\n            1,\n            Math.tan(this.angle.getRadians()),\n            0,\n            1,\n            0,\n            0\n        ];\n    }\n}\n\nfunction parseTransforms(transform) {\n    return compressSpaces(transform)\n        .trim()\n        .replace(/\\)([a-zA-Z])/g, ') $1')\n        .replace(/\\)(\\s?,\\s?)/g, ') ')\n        .split(/\\s(?=[a-z])/);\n}\nfunction parseTransform(transform) {\n    const [type, value] = transform.split('(');\n    return [\n        type.trim(),\n        value.trim().replace(')', '')\n    ];\n}\nclass Transform {\n    constructor(document, transform, transformOrigin) {\n        this.document = document;\n        this.transforms = [];\n        const data = parseTransforms(transform);\n        const originCoords = transformOrigin\n            ? toNumbers(transformOrigin)\n            : [];\n        data.forEach((transform) => {\n            if (transform === 'none') {\n                return;\n            }\n            const [type, value] = parseTransform(transform);\n            const TransformType = Transform.transformTypes[type];\n            if (typeof TransformType !== 'undefined') {\n                this.transforms.push(new TransformType(this.document, value, originCoords));\n            }\n        });\n    }\n    static fromElement(document, element) {\n        const transformStyle = element.getStyle('transform', false, true);\n        const transformOriginStyle = element.getStyle('transform-origin', false, true);\n        if (transformStyle.hasValue()) {\n            return new Transform(document, transformStyle.getString(), transformOriginStyle.getString());\n        }\n        return null;\n    }\n    apply(ctx) {\n        const { transforms } = this;\n        const len = transforms.length;\n        for (let i = 0; i < len; i++) {\n            transforms[i].apply(ctx);\n        }\n    }\n    unapply(ctx) {\n        const { transforms } = this;\n        const len = transforms.length;\n        for (let i = len - 1; i >= 0; i--) {\n            transforms[i].unapply(ctx);\n        }\n    }\n    // TODO: applyToPoint unused ... remove?\n    applyToPoint(point) {\n        const { transforms } = this;\n        const len = transforms.length;\n        for (let i = 0; i < len; i++) {\n            transforms[i].applyToPoint(point);\n        }\n    }\n}\nTransform.transformTypes = {\n    translate: Translate,\n    rotate: Rotate,\n    scale: Scale,\n    matrix: Matrix,\n    skewX: SkewX,\n    skewY: SkewY\n};\n\nclass RenderedElement extends Element {\n    constructor() {\n        super(...arguments);\n        this.modifiedEmSizeStack = false;\n    }\n    calculateOpacity() {\n        let opacity = 1.0;\n        // tslint:disable-next-line: no-this-assignment\n        let element = this;\n        while (element) {\n            const opacityStyle = element.getStyle('opacity', false, true); // no ancestors on style call\n            if (opacityStyle.hasValue()) {\n                opacity *= opacityStyle.getNumber();\n            }\n            element = element.parent;\n        }\n        return opacity;\n    }\n    setContext(ctx, fromMeasure = false) {\n        if (!fromMeasure) { // causes stack overflow when measuring text with gradients\n            // fill\n            const fillStyleProp = this.getStyle('fill');\n            const fillOpacityStyleProp = this.getStyle('fill-opacity');\n            const strokeStyleProp = this.getStyle('stroke');\n            const strokeOpacityProp = this.getStyle('stroke-opacity');\n            if (fillStyleProp.isUrlDefinition()) {\n                const fillStyle = fillStyleProp.getFillStyleDefinition(this, fillOpacityStyleProp);\n                if (fillStyle) {\n                    ctx.fillStyle = fillStyle;\n                }\n            }\n            else if (fillStyleProp.hasValue()) {\n                if (fillStyleProp.getString() === 'currentColor') {\n                    fillStyleProp.setValue(this.getStyle('color').getValue());\n                }\n                const fillStyle = fillStyleProp.getString();\n                if (fillStyle !== 'inherit') {\n                    ctx.fillStyle = fillStyle === 'none'\n                        ? 'rgba(0,0,0,0)'\n                        : fillStyle;\n                }\n            }\n            if (fillOpacityStyleProp.hasValue()) {\n                const fillStyle = new Property(this.document, 'fill', ctx.fillStyle)\n                    .addOpacity(fillOpacityStyleProp)\n                    .getString();\n                ctx.fillStyle = fillStyle;\n            }\n            // stroke\n            if (strokeStyleProp.isUrlDefinition()) {\n                const strokeStyle = strokeStyleProp.getFillStyleDefinition(this, strokeOpacityProp);\n                if (strokeStyle) {\n                    ctx.strokeStyle = strokeStyle;\n                }\n            }\n            else if (strokeStyleProp.hasValue()) {\n                if (strokeStyleProp.getString() === 'currentColor') {\n                    strokeStyleProp.setValue(this.getStyle('color').getValue());\n                }\n                const strokeStyle = strokeStyleProp.getString();\n                if (strokeStyle !== 'inherit') {\n                    ctx.strokeStyle = strokeStyle === 'none'\n                        ? 'rgba(0,0,0,0)'\n                        : strokeStyle;\n                }\n            }\n            if (strokeOpacityProp.hasValue()) {\n                const strokeStyle = new Property(this.document, 'stroke', ctx.strokeStyle)\n                    .addOpacity(strokeOpacityProp)\n                    .getString();\n                ctx.strokeStyle = strokeStyle;\n            }\n            const strokeWidthStyleProp = this.getStyle('stroke-width');\n            if (strokeWidthStyleProp.hasValue()) {\n                const newLineWidth = strokeWidthStyleProp.getPixels();\n                ctx.lineWidth = !newLineWidth\n                    ? PSEUDO_ZERO // browsers don't respect 0 (or node-canvas? :-)\n                    : newLineWidth;\n            }\n            const strokeLinecapStyleProp = this.getStyle('stroke-linecap');\n            const strokeLinejoinStyleProp = this.getStyle('stroke-linejoin');\n            const strokeMiterlimitProp = this.getStyle('stroke-miterlimit');\n            const pointOrderStyleProp = this.getStyle('paint-order');\n            const strokeDasharrayStyleProp = this.getStyle('stroke-dasharray');\n            const strokeDashoffsetProp = this.getStyle('stroke-dashoffset');\n            if (strokeLinecapStyleProp.hasValue()) {\n                ctx.lineCap = strokeLinecapStyleProp.getString();\n            }\n            if (strokeLinejoinStyleProp.hasValue()) {\n                ctx.lineJoin = strokeLinejoinStyleProp.getString();\n            }\n            if (strokeMiterlimitProp.hasValue()) {\n                ctx.miterLimit = strokeMiterlimitProp.getNumber();\n            }\n            if (pointOrderStyleProp.hasValue()) {\n                // ?\n                ctx.paintOrder = pointOrderStyleProp.getValue();\n            }\n            if (strokeDasharrayStyleProp.hasValue() && strokeDasharrayStyleProp.getString() !== 'none') {\n                const gaps = toNumbers(strokeDasharrayStyleProp.getString());\n                if (typeof ctx.setLineDash !== 'undefined') {\n                    ctx.setLineDash(gaps);\n                }\n                else if (typeof ctx.webkitLineDash !== 'undefined') {\n                    ctx.webkitLineDash = gaps;\n                }\n                else if (typeof ctx.mozDash !== 'undefined' && !(gaps.length === 1 && gaps[0] === 0)) {\n                    ctx.mozDash = gaps;\n                }\n                const offset = strokeDashoffsetProp.getPixels();\n                if (typeof ctx.lineDashOffset !== 'undefined') {\n                    ctx.lineDashOffset = offset;\n                }\n                else if (typeof ctx.webkitLineDashOffset !== 'undefined') {\n                    ctx.webkitLineDashOffset = offset;\n                }\n                else if (typeof ctx.mozDashOffset !== 'undefined') {\n                    ctx.mozDashOffset = offset;\n                }\n            }\n        }\n        // font\n        this.modifiedEmSizeStack = false;\n        if (typeof ctx.font !== 'undefined') {\n            const fontStyleProp = this.getStyle('font');\n            const fontStyleStyleProp = this.getStyle('font-style');\n            const fontVariantStyleProp = this.getStyle('font-variant');\n            const fontWeightStyleProp = this.getStyle('font-weight');\n            const fontSizeStyleProp = this.getStyle('font-size');\n            const fontFamilyStyleProp = this.getStyle('font-family');\n            const font = new Font(fontStyleStyleProp.getString(), fontVariantStyleProp.getString(), fontWeightStyleProp.getString(), fontSizeStyleProp.hasValue()\n                ? `${fontSizeStyleProp.getPixels(true)}px`\n                : '', fontFamilyStyleProp.getString(), Font.parse(fontStyleProp.getString(), ctx.font));\n            fontStyleStyleProp.setValue(font.fontStyle);\n            fontVariantStyleProp.setValue(font.fontVariant);\n            fontWeightStyleProp.setValue(font.fontWeight);\n            fontSizeStyleProp.setValue(font.fontSize);\n            fontFamilyStyleProp.setValue(font.fontFamily);\n            ctx.font = font.toString();\n            if (fontSizeStyleProp.isPixels()) {\n                this.document.emSize = fontSizeStyleProp.getPixels();\n                this.modifiedEmSizeStack = true;\n            }\n        }\n        // transform\n        const transform = Transform.fromElement(this.document, this);\n        if (transform) {\n            transform.apply(ctx);\n        }\n        // clip\n        const clipPathStyleProp = this.getStyle('clip-path', false, true);\n        if (clipPathStyleProp.hasValue()) {\n            const clip = clipPathStyleProp.getDefinition();\n            if (clip) {\n                clip.apply(ctx);\n            }\n        }\n        // opacity\n        ctx.globalAlpha = this.calculateOpacity();\n    }\n    clearContext(ctx) {\n        super.clearContext(ctx);\n        if (this.modifiedEmSizeStack) {\n            this.document.popEmSize();\n        }\n    }\n}\n\nclass TextElement extends RenderedElement {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, new.target === TextElement\n            ? true\n            : captureTextNodes);\n        this.type = 'text';\n        this.x = 0;\n        this.y = 0;\n        this.measureCache = -1;\n    }\n    setContext(ctx, fromMeasure = false) {\n        super.setContext(ctx, fromMeasure);\n        const textBaseline = this.getStyle('dominant-baseline').getTextBaseline()\n            || this.getStyle('alignment-baseline').getTextBaseline();\n        if (textBaseline) {\n            ctx.textBaseline = textBaseline;\n        }\n    }\n    initializeCoordinates(ctx) {\n        this.x = this.getAttribute('x').getPixels('x');\n        this.y = this.getAttribute('y').getPixels('y');\n        const dxAttr = this.getAttribute('dx');\n        const dyAttr = this.getAttribute('dy');\n        if (dxAttr.hasValue()) {\n            this.x += dxAttr.getPixels('x');\n        }\n        if (dyAttr.hasValue()) {\n            this.y += dyAttr.getPixels('y');\n        }\n        this.x += this.getAnchorDelta(ctx, this, 0);\n    }\n    getBoundingBox(ctx) {\n        if (this.type !== 'text') {\n            return this.getTElementBoundingBox(ctx);\n        }\n        this.initializeCoordinates(ctx);\n        let boundingBox = null;\n        this.children.forEach((_, i) => {\n            const childBoundingBox = this.getChildBoundingBox(ctx, this, this, i);\n            if (!boundingBox) {\n                boundingBox = childBoundingBox;\n            }\n            else {\n                boundingBox.addBoundingBox(childBoundingBox);\n            }\n        });\n        return boundingBox;\n    }\n    getFontSize() {\n        const { document, parent } = this;\n        const inheritFontSize = Font.parse(document.ctx.font).fontSize;\n        const fontSize = parent.getStyle('font-size').getNumber(inheritFontSize);\n        return fontSize;\n    }\n    getTElementBoundingBox(ctx) {\n        const fontSize = this.getFontSize();\n        return new BoundingBox(this.x, this.y - fontSize, this.x + this.measureText(ctx), this.y);\n    }\n    getGlyph(font, text, i) {\n        const char = text[i];\n        let glyph = null;\n        if (font.isArabic) {\n            const len = text.length;\n            const prevChar = text[i - 1];\n            const nextChar = text[i + 1];\n            let arabicForm = 'isolated';\n            if ((i === 0 || prevChar === ' ') && i < len - 2 && nextChar !== ' ') {\n                arabicForm = 'terminal';\n            }\n            if (i > 0 && prevChar !== ' ' && i < len - 2 && nextChar !== ' ') {\n                arabicForm = 'medial';\n            }\n            if (i > 0 && prevChar !== ' ' && (i === len - 1 || nextChar === ' ')) {\n                arabicForm = 'initial';\n            }\n            if (typeof font.glyphs[char] !== 'undefined') {\n                glyph = font.glyphs[char][arabicForm];\n                if (!glyph && font.glyphs[char].type === 'glyph') {\n                    glyph = font.glyphs[char];\n                }\n            }\n        }\n        else {\n            glyph = font.glyphs[char];\n        }\n        if (!glyph) {\n            glyph = font.missingGlyph;\n        }\n        return glyph;\n    }\n    getText() {\n        return '';\n    }\n    getTextFromNode(node) {\n        const textNode = node || this.node;\n        const childNodes = Array.from(textNode.parentNode.childNodes);\n        const index = childNodes.indexOf(textNode);\n        const lastIndex = childNodes.length - 1;\n        let text = compressSpaces(textNode.value\n            || textNode.text\n            || textNode.textContent\n            || '');\n        if (index === 0) {\n            text = trimLeft(text);\n        }\n        else if (index === lastIndex) {\n            text = trimRight(text);\n        }\n        return text;\n    }\n    renderChildren(ctx) {\n        if (this.type !== 'text') {\n            this.renderTElementChildren(ctx);\n            return;\n        }\n        this.initializeCoordinates(ctx);\n        this.children.forEach((_, i) => {\n            this.renderChild(ctx, this, this, i);\n        });\n        const { mouse } = this.document.screen;\n        // Do not calc bounding box if mouse is not working.\n        if (mouse.isWorking()) {\n            mouse.checkBoundingBox(this, this.getBoundingBox(ctx));\n        }\n    }\n    renderTElementChildren(ctx) {\n        const { document, parent } = this;\n        const renderText = this.getText();\n        const customFont = parent.getStyle('font-family').getDefinition();\n        if (customFont) {\n            const { unitsPerEm } = customFont.fontFace;\n            const ctxFont = Font.parse(document.ctx.font);\n            const fontSize = parent.getStyle('font-size').getNumber(ctxFont.fontSize);\n            const fontStyle = parent.getStyle('font-style').getString(ctxFont.fontStyle);\n            const scale = fontSize / unitsPerEm;\n            const text = customFont.isRTL\n                ? renderText.split('').reverse().join('')\n                : renderText;\n            const dx = toNumbers(parent.getAttribute('dx').getString());\n            const len = text.length;\n            for (let i = 0; i < len; i++) {\n                const glyph = this.getGlyph(customFont, text, i);\n                ctx.translate(this.x, this.y);\n                ctx.scale(scale, -scale);\n                const lw = ctx.lineWidth;\n                ctx.lineWidth = ctx.lineWidth * unitsPerEm / fontSize;\n                if (fontStyle === 'italic') {\n                    ctx.transform(1, 0, .4, 1, 0, 0);\n                }\n                glyph.render(ctx);\n                if (fontStyle === 'italic') {\n                    ctx.transform(1, 0, -.4, 1, 0, 0);\n                }\n                ctx.lineWidth = lw;\n                ctx.scale(1 / scale, -1 / scale);\n                ctx.translate(-this.x, -this.y);\n                this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / unitsPerEm;\n                if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) {\n                    this.x += dx[i];\n                }\n            }\n            return;\n        }\n        const { x, y } = this;\n        if (ctx.paintOrder === 'stroke') {\n            if (ctx.strokeStyle) {\n                ctx.strokeText(renderText, x, y);\n            }\n            if (ctx.fillStyle) {\n                ctx.fillText(renderText, x, y);\n            }\n        }\n        else {\n            if (ctx.fillStyle) {\n                ctx.fillText(renderText, x, y);\n            }\n            if (ctx.strokeStyle) {\n                ctx.strokeText(renderText, x, y);\n            }\n        }\n    }\n    getAnchorDelta(ctx, parent, startI) {\n        const textAnchor = this.getStyle('text-anchor').getString('start');\n        if (textAnchor !== 'start') {\n            const { children } = parent;\n            const len = children.length;\n            let child = null;\n            let width = 0;\n            for (let i = startI; i < len; i++) {\n                child = children[i];\n                if (i > startI && child.getAttribute('x').hasValue()\n                    || child.getAttribute('text-anchor').hasValue()) {\n                    break; // new group\n                }\n                width += child.measureTextRecursive(ctx);\n            }\n            return -1 * (textAnchor === 'end' ? width : width / 2.0);\n        }\n        return 0;\n    }\n    adjustChildCoordinates(ctx, textParent, parent, i) {\n        const child = parent.children[i];\n        if (typeof child.measureText !== 'function') {\n            return child;\n        }\n        const xAttr = child.getAttribute('x');\n        const yAttr = child.getAttribute('y');\n        const dxAttr = child.getAttribute('dx');\n        const dyAttr = child.getAttribute('dy');\n        const textAnchor = child.getAttribute('text-anchor').getString('start');\n        if (i === 0 && child.type !== 'textNode') {\n            if (!xAttr.hasValue()) {\n                xAttr.setValue(textParent.getAttribute('x').getValue('0'));\n            }\n            if (!yAttr.hasValue()) {\n                yAttr.setValue(textParent.getAttribute('y').getValue('0'));\n            }\n            if (!dxAttr.hasValue()) {\n                dxAttr.setValue(textParent.getAttribute('dx').getValue('0'));\n            }\n            if (!dyAttr.hasValue()) {\n                dyAttr.setValue(textParent.getAttribute('dy').getValue('0'));\n            }\n        }\n        if (xAttr.hasValue()) {\n            child.x = xAttr.getPixels('x') + textParent.getAnchorDelta(ctx, parent, i);\n            if (textAnchor !== 'start') {\n                const width = child.measureTextRecursive(ctx);\n                child.x += -1 * (textAnchor === 'end' ? width : width / 2.0);\n            }\n            if (dxAttr.hasValue()) {\n                child.x += dxAttr.getPixels('x');\n            }\n        }\n        else {\n            if (textAnchor !== 'start') {\n                const width = child.measureTextRecursive(ctx);\n                textParent.x += -1 * (textAnchor === 'end' ? width : width / 2.0);\n            }\n            if (dxAttr.hasValue()) {\n                textParent.x += dxAttr.getPixels('x');\n            }\n            child.x = textParent.x;\n        }\n        textParent.x = child.x + child.measureText(ctx);\n        if (yAttr.hasValue()) {\n            child.y = yAttr.getPixels('y');\n            if (dyAttr.hasValue()) {\n                child.y += dyAttr.getPixels('y');\n            }\n        }\n        else {\n            if (dyAttr.hasValue()) {\n                textParent.y += dyAttr.getPixels('y');\n            }\n            child.y = textParent.y;\n        }\n        textParent.y = child.y;\n        return child;\n    }\n    getChildBoundingBox(ctx, textParent, parent, i) {\n        const child = this.adjustChildCoordinates(ctx, textParent, parent, i);\n        const boundingBox = child.getBoundingBox(ctx);\n        child.children.forEach((_, i) => {\n            const childBoundingBox = textParent.getChildBoundingBox(ctx, textParent, child, i);\n            boundingBox.addBoundingBox(childBoundingBox);\n        });\n        return boundingBox;\n    }\n    renderChild(ctx, textParent, parent, i) {\n        const child = this.adjustChildCoordinates(ctx, textParent, parent, i);\n        child.render(ctx);\n        child.children.forEach((_, i) => {\n            textParent.renderChild(ctx, textParent, child, i);\n        });\n    }\n    measureTextRecursive(ctx) {\n        const width = this.children.reduce((width, child) => width + child.measureTextRecursive(ctx), this.measureText(ctx));\n        return width;\n    }\n    measureText(ctx) {\n        const { measureCache } = this;\n        if (~measureCache) {\n            return measureCache;\n        }\n        const renderText = this.getText();\n        const measure = this.measureTargetText(ctx, renderText);\n        this.measureCache = measure;\n        return measure;\n    }\n    measureTargetText(ctx, targetText) {\n        if (!targetText.length) {\n            return 0;\n        }\n        const { parent } = this;\n        const customFont = parent.getStyle('font-family').getDefinition();\n        if (customFont) {\n            const fontSize = this.getFontSize();\n            const text = customFont.isRTL\n                ? targetText.split('').reverse().join('')\n                : targetText;\n            const dx = toNumbers(parent.getAttribute('dx').getString());\n            const len = text.length;\n            let measure = 0;\n            for (let i = 0; i < len; i++) {\n                const glyph = this.getGlyph(customFont, text, i);\n                measure += (glyph.horizAdvX || customFont.horizAdvX)\n                    * fontSize\n                    / customFont.fontFace.unitsPerEm;\n                if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) {\n                    measure += dx[i];\n                }\n            }\n            return measure;\n        }\n        if (!ctx.measureText) {\n            return targetText.length * 10;\n        }\n        ctx.save();\n        this.setContext(ctx, true);\n        const { width: measure } = ctx.measureText(targetText);\n        ctx.restore();\n        return measure;\n    }\n}\n\nclass TSpanElement extends TextElement {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, new.target === TSpanElement\n            ? true\n            : captureTextNodes);\n        this.type = 'tspan';\n        // if this node has children, then they own the text\n        this.text = this.children.length > 0\n            ? ''\n            : this.getTextFromNode();\n    }\n    getText() {\n        return this.text;\n    }\n}\n\nclass TextNode extends TSpanElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'textNode';\n    }\n}\n\nfunction preparePath(path) {\n    const d = path\n        .replace(/,/gm, ' ') // get rid of all commas\n        // As the end of a match can also be the start of the next match, we need to run this replace twice.\n        .replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm, '$1 $2') // suffix commands with spaces\n        .replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm, '$1 $2') // suffix commands with spaces\n        .replace(/([^\\s])([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // prefix commands with spaces\n        .replace(/([0-9])([+\\-])/gm, '$1 $2') // separate digits on +- signs\n        // Again, we need to run this twice to find all occurances\n        .replace(/(\\.[0-9]*)(\\.)/gm, '$1 $2') // separate digits when they start with a comma\n        .replace(/(\\.[0-9]*)(\\.)/gm, '$1 $2') // separate digits when they start with a comma\n        .replace(/([Aa](\\s+[0-9]+){3})\\s+([01])\\s*([01])/gm, '$1 $3 $4 '); // shorthand elliptical arc path syntax\n    return compressSpaces(d).trim();\n}\nclass PathParser {\n    constructor(path) {\n        this.control = null;\n        this.start = null;\n        this.current = null;\n        this.command = '';\n        this.tokens = [];\n        this.i = -1;\n        this.previousCommand = '';\n        this.points = [];\n        this.angles = [];\n        this.tokens = preparePath(path).split(' ');\n    }\n    reset() {\n        this.i = -1;\n        this.command = '';\n        this.previousCommand = '';\n        this.start = new Point(0, 0);\n        this.control = new Point(0, 0);\n        this.current = new Point(0, 0);\n        this.points = [];\n        this.angles = [];\n    }\n    isEnd() {\n        const { i, tokens } = this;\n        return i >= tokens.length - 1;\n    }\n    isCommandOrEnd() {\n        if (this.isEnd()) {\n            return true;\n        }\n        const { i, tokens } = this;\n        return /^[A-Za-z]$/.test(tokens[i + 1]);\n    }\n    isRelativeCommand() {\n        switch (this.command) {\n            case 'm':\n            case 'l':\n            case 'h':\n            case 'v':\n            case 'c':\n            case 's':\n            case 'q':\n            case 't':\n            case 'a':\n            case 'z':\n                return true;\n            default:\n                return false;\n        }\n    }\n    getToken() {\n        this.i++;\n        return this.tokens[this.i];\n    }\n    getScalar() {\n        return parseFloat(this.getToken());\n    }\n    nextCommand() {\n        this.previousCommand = this.command;\n        this.command = this.getToken();\n    }\n    getPoint() {\n        const point = new Point(this.getScalar(), this.getScalar());\n        return this.makeAbsolute(point);\n    }\n    getAsControlPoint() {\n        const point = this.getPoint();\n        this.control = point;\n        return point;\n    }\n    getAsCurrentPoint() {\n        const point = this.getPoint();\n        this.current = point;\n        return point;\n    }\n    getReflectedControlPoint() {\n        const previousCommand = this.previousCommand.toLowerCase();\n        if (previousCommand !== 'c'\n            && previousCommand !== 's'\n            && previousCommand !== 'q'\n            && previousCommand !== 't') {\n            return this.current;\n        }\n        // reflect point\n        const { current: { x: cx, y: cy }, control: { x: ox, y: oy } } = this;\n        const point = new Point(2 * cx - ox, 2 * cy - oy);\n        return point;\n    }\n    makeAbsolute(point) {\n        if (this.isRelativeCommand()) {\n            const { x, y } = this.current;\n            point.x += x;\n            point.y += y;\n        }\n        return point;\n    }\n    addMarker(point, from, priorTo) {\n        const { points, angles } = this;\n        // if the last angle isn't filled in because we didn't have this point yet ...\n        if (priorTo && angles.length > 0 && !angles[angles.length - 1]) {\n            angles[angles.length - 1] = points[points.length - 1].angleTo(priorTo);\n        }\n        this.addMarkerAngle(point, from ? from.angleTo(point) : null);\n    }\n    addMarkerAngle(point, angle) {\n        this.points.push(point);\n        this.angles.push(angle);\n    }\n    getMarkerPoints() {\n        return this.points;\n    }\n    getMarkerAngles() {\n        const { angles } = this;\n        const len = angles.length;\n        for (let i = 0; i < len; i++) {\n            if (!angles[i]) {\n                for (let j = i + 1; j < len; j++) {\n                    if (angles[j]) {\n                        angles[i] = angles[j];\n                        break;\n                    }\n                }\n            }\n        }\n        return angles;\n    }\n}\n\nclass PathElement extends RenderedElement {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'path';\n        this.pathParser = null;\n        this.pathParser = new PathParser(this.getAttribute('d').getString());\n    }\n    path(ctx) {\n        const { pathParser } = this;\n        const boundingBox = new BoundingBox();\n        pathParser.reset();\n        if (ctx) {\n            ctx.beginPath();\n        }\n        while (!pathParser.isEnd()) {\n            pathParser.nextCommand();\n            switch (pathParser.command) {\n                case 'M':\n                case 'm':\n                    this.pathM(ctx, boundingBox);\n                    break;\n                case 'L':\n                case 'l':\n                    this.pathL(ctx, boundingBox);\n                    break;\n                case 'H':\n                case 'h':\n                    this.pathH(ctx, boundingBox);\n                    break;\n                case 'V':\n                case 'v':\n                    this.pathV(ctx, boundingBox);\n                    break;\n                case 'C':\n                case 'c':\n                    this.pathC(ctx, boundingBox);\n                    break;\n                case 'S':\n                case 's':\n                    this.pathS(ctx, boundingBox);\n                    break;\n                case 'Q':\n                case 'q':\n                    this.pathQ(ctx, boundingBox);\n                    break;\n                case 'T':\n                case 't':\n                    this.pathT(ctx, boundingBox);\n                    break;\n                case 'A':\n                case 'a':\n                    this.pathA(ctx, boundingBox);\n                    break;\n                case 'Z':\n                case 'z':\n                    this.pathZ(ctx, boundingBox);\n                    break;\n            }\n        }\n        return boundingBox;\n    }\n    getBoundingBox(_) {\n        return this.path();\n    }\n    getMarkers() {\n        const { pathParser } = this;\n        const points = pathParser.getMarkerPoints();\n        const angles = pathParser.getMarkerAngles();\n        const markers = points.map((point, i) => [\n            point,\n            angles[i]\n        ]);\n        return markers;\n    }\n    renderChildren(ctx) {\n        this.path(ctx);\n        this.document.screen.mouse.checkPath(this, ctx);\n        const fillRuleStyleProp = this.getStyle('fill-rule');\n        if (ctx.fillStyle !== '') {\n            if (fillRuleStyleProp.getString('inherit') !== 'inherit') {\n                ctx.fill(fillRuleStyleProp.getString());\n            }\n            else {\n                ctx.fill();\n            }\n        }\n        if (ctx.strokeStyle !== '') {\n            ctx.stroke();\n        }\n        const markers = this.getMarkers();\n        if (markers) {\n            const markersLastIndex = markers.length - 1;\n            const markerStartStyleProp = this.getStyle('marker-start');\n            const markerMidStyleProp = this.getStyle('marker-mid');\n            const markerEndStyleProp = this.getStyle('marker-end');\n            if (markerStartStyleProp.isUrlDefinition()) {\n                const marker = markerStartStyleProp.getDefinition();\n                const [point, angle] = markers[0];\n                marker.render(ctx, point, angle);\n            }\n            if (markerMidStyleProp.isUrlDefinition()) {\n                const marker = markerMidStyleProp.getDefinition();\n                for (let i = 1; i < markersLastIndex; i++) {\n                    const [point, angle] = markers[i];\n                    marker.render(ctx, point, angle);\n                }\n            }\n            if (markerEndStyleProp.isUrlDefinition()) {\n                const marker = markerEndStyleProp.getDefinition();\n                const [point, angle] = markers[markersLastIndex];\n                marker.render(ctx, point, angle);\n            }\n        }\n    }\n    pathM(ctx, boundingBox) {\n        const { pathParser } = this;\n        const point = pathParser.getAsCurrentPoint();\n        const { x, y } = point;\n        pathParser.addMarker(point);\n        boundingBox.addPoint(x, y);\n        if (ctx) {\n            ctx.moveTo(x, y);\n        }\n        pathParser.start = pathParser.current;\n        while (!pathParser.isCommandOrEnd()) {\n            const point = pathParser.getAsCurrentPoint();\n            const { x, y } = point;\n            pathParser.addMarker(point, pathParser.start);\n            boundingBox.addPoint(x, y);\n            if (ctx) {\n                ctx.lineTo(x, y);\n            }\n        }\n    }\n    pathL(ctx, boundingBox) {\n        const { pathParser } = this;\n        while (!pathParser.isCommandOrEnd()) {\n            const { current } = pathParser;\n            const point = pathParser.getAsCurrentPoint();\n            const { x, y } = point;\n            pathParser.addMarker(point, current);\n            boundingBox.addPoint(x, y);\n            if (ctx) {\n                ctx.lineTo(x, y);\n            }\n        }\n    }\n    pathH(ctx, boundingBox) {\n        const { pathParser } = this;\n        while (!pathParser.isCommandOrEnd()) {\n            const { current } = pathParser;\n            const point = new Point((pathParser.isRelativeCommand()\n                ? current.x\n                : 0)\n                + pathParser.getScalar(), current.y);\n            pathParser.addMarker(point, current);\n            pathParser.current = point;\n            boundingBox.addPoint(point.x, point.y);\n            if (ctx) {\n                ctx.lineTo(point.x, point.y);\n            }\n        }\n    }\n    pathV(ctx, boundingBox) {\n        const { pathParser } = this;\n        while (!pathParser.isCommandOrEnd()) {\n            const { current } = pathParser;\n            const point = new Point(current.x, (pathParser.isRelativeCommand()\n                ? current.y\n                : 0)\n                + pathParser.getScalar());\n            pathParser.addMarker(point, current);\n            pathParser.current = point;\n            boundingBox.addPoint(point.x, point.y);\n            if (ctx) {\n                ctx.lineTo(point.x, point.y);\n            }\n        }\n    }\n    pathC(ctx, boundingBox) {\n        const { pathParser } = this;\n        while (!pathParser.isCommandOrEnd()) {\n            const { current } = pathParser;\n            const point = pathParser.getPoint();\n            const controlPoint = pathParser.getAsControlPoint();\n            const currentPoint = pathParser.getAsCurrentPoint();\n            pathParser.addMarker(currentPoint, controlPoint, point);\n            boundingBox.addBezierCurve(current.x, current.y, point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n            if (ctx) {\n                ctx.bezierCurveTo(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n            }\n        }\n    }\n    pathS(ctx, boundingBox) {\n        const { pathParser } = this;\n        while (!pathParser.isCommandOrEnd()) {\n            const { current } = pathParser;\n            const point = pathParser.getReflectedControlPoint();\n            const controlPoint = pathParser.getAsControlPoint();\n            const currentPoint = pathParser.getAsCurrentPoint();\n            pathParser.addMarker(currentPoint, controlPoint, point);\n            boundingBox.addBezierCurve(current.x, current.y, point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n            if (ctx) {\n                ctx.bezierCurveTo(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n            }\n        }\n    }\n    pathQ(ctx, boundingBox) {\n        const { pathParser } = this;\n        while (!pathParser.isCommandOrEnd()) {\n            const { current } = pathParser;\n            const controlPoint = pathParser.getAsControlPoint();\n            const currentPoint = pathParser.getAsCurrentPoint();\n            pathParser.addMarker(currentPoint, controlPoint, controlPoint);\n            boundingBox.addQuadraticCurve(current.x, current.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n            if (ctx) {\n                ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n            }\n        }\n    }\n    pathT(ctx, boundingBox) {\n        const { pathParser } = this;\n        while (!pathParser.isCommandOrEnd()) {\n            const { current } = pathParser;\n            const controlPoint = pathParser.getReflectedControlPoint();\n            pathParser.control = controlPoint;\n            const currentPoint = pathParser.getAsCurrentPoint();\n            pathParser.addMarker(currentPoint, controlPoint, controlPoint);\n            boundingBox.addQuadraticCurve(current.x, current.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n            if (ctx) {\n                ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n            }\n        }\n    }\n    pathA(ctx, boundingBox) {\n        const { pathParser } = this;\n        while (!pathParser.isCommandOrEnd()) {\n            const { current } = pathParser;\n            let rx = pathParser.getScalar();\n            let ry = pathParser.getScalar();\n            const xAxisRotation = pathParser.getScalar() * (Math.PI / 180.0);\n            const largeArcFlag = pathParser.getScalar();\n            const sweepFlag = pathParser.getScalar();\n            const currentPoint = pathParser.getAsCurrentPoint();\n            // Conversion from endpoint to center parameterization\n            // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n            // x1', y1'\n            const currp = new Point(Math.cos(xAxisRotation) * (current.x - currentPoint.x) / 2.0\n                + Math.sin(xAxisRotation) * (current.y - currentPoint.y) / 2.0, -Math.sin(xAxisRotation) * (current.x - currentPoint.x) / 2.0\n                + Math.cos(xAxisRotation) * (current.y - currentPoint.y) / 2.0);\n            // adjust radii\n            const l = Math.pow(currp.x, 2) / Math.pow(rx, 2) + Math.pow(currp.y, 2) / Math.pow(ry, 2);\n            if (l > 1) {\n                rx *= Math.sqrt(l);\n                ry *= Math.sqrt(l);\n            }\n            // cx', cy'\n            let s = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt(((Math.pow(rx, 2) * Math.pow(ry, 2))\n                - (Math.pow(rx, 2) * Math.pow(currp.y, 2))\n                - (Math.pow(ry, 2) * Math.pow(currp.x, 2))) / (Math.pow(rx, 2) * Math.pow(currp.y, 2)\n                + Math.pow(ry, 2) * Math.pow(currp.x, 2)));\n            if (isNaN(s)) {\n                s = 0;\n            }\n            const cpp = new Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);\n            // cx, cy\n            const centp = new Point((current.x + currentPoint.x) / 2.0\n                + Math.cos(xAxisRotation) * cpp.x\n                - Math.sin(xAxisRotation) * cpp.y, (current.y + currentPoint.y) / 2.0\n                + Math.sin(xAxisRotation) * cpp.x\n                + Math.cos(xAxisRotation) * cpp.y);\n            // initial angle\n            const a1 = vectorsAngle([1, 0], [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]);\n            // angle delta\n            const u = [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry];\n            const v = [(-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry];\n            let ad = vectorsAngle(u, v);\n            if (vectorsRatio(u, v) <= -1) {\n                ad = Math.PI;\n            }\n            if (vectorsRatio(u, v) >= 1) {\n                ad = 0;\n            }\n            // for markers\n            const dir = 1 - sweepFlag ? 1.0 : -1.0;\n            const ah = a1 + dir * (ad / 2.0);\n            const halfWay = new Point(centp.x + rx * Math.cos(ah), centp.y + ry * Math.sin(ah));\n            pathParser.addMarkerAngle(halfWay, ah - dir * Math.PI / 2);\n            pathParser.addMarkerAngle(currentPoint, ah - dir * Math.PI);\n            boundingBox.addPoint(currentPoint.x, currentPoint.y); // TODO: this is too naive, make it better\n            if (ctx && !isNaN(a1) && !isNaN(ad)) {\n                const r = rx > ry ? rx : ry;\n                const sx = rx > ry ? 1 : rx / ry;\n                const sy = rx > ry ? ry / rx : 1;\n                ctx.translate(centp.x, centp.y);\n                ctx.rotate(xAxisRotation);\n                ctx.scale(sx, sy);\n                ctx.arc(0, 0, r, a1, a1 + ad, Boolean(1 - sweepFlag));\n                ctx.scale(1 / sx, 1 / sy);\n                ctx.rotate(-xAxisRotation);\n                ctx.translate(-centp.x, -centp.y);\n            }\n        }\n    }\n    pathZ(ctx, boundingBox) {\n        const { pathParser } = this;\n        if (ctx) {\n            // only close path if it is not a straight line\n            if (boundingBox.x1 !== boundingBox.x2\n                && boundingBox.y1 !== boundingBox.y2) {\n                ctx.closePath();\n            }\n        }\n        pathParser.current = pathParser.start;\n    }\n}\n\nclass SVGElement extends RenderedElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'svg';\n        this.root = false;\n    }\n    clearContext(ctx) {\n        super.clearContext(ctx);\n        this.document.screen.viewPort.removeCurrent();\n    }\n    setContext(ctx) {\n        const { document } = this;\n        const { screen, window } = document;\n        const canvas = ctx.canvas;\n        screen.setDefaults(ctx);\n        if (canvas.style\n            && typeof ctx.font !== 'undefined'\n            && window\n            && typeof window.getComputedStyle !== 'undefined') {\n            ctx.font = window.getComputedStyle(canvas).getPropertyValue('font');\n            const fontSizeProp = new Property(document, 'fontSize', Font.parse(ctx.font).fontSize);\n            if (fontSizeProp.hasValue()) {\n                document.rootEmSize = fontSizeProp.getPixels('y');\n                document.emSize = document.rootEmSize;\n            }\n        }\n        super.setContext(ctx);\n        // create new view port\n        if (!this.getAttribute('x').hasValue()) {\n            this.getAttribute('x', true).setValue(0);\n        }\n        if (!this.getAttribute('y').hasValue()) {\n            this.getAttribute('y', true).setValue(0);\n        }\n        ctx.translate(this.getAttribute('x').getPixels('x'), this.getAttribute('y').getPixels('y'));\n        let { width, height } = screen.viewPort;\n        if (!this.getAttribute('width').hasValue()) {\n            this.getAttribute('width', true).setValue('100%');\n        }\n        if (!this.getAttribute('height').hasValue()) {\n            this.getAttribute('height', true).setValue('100%');\n        }\n        const refXAttr = this.getAttribute('refX');\n        const refYAttr = this.getAttribute('refY');\n        const viewBoxAttr = this.getAttribute('viewBox');\n        const viewBox = viewBoxAttr.hasValue()\n            ? toNumbers(viewBoxAttr.getString())\n            : null;\n        const clip = !this.root\n            && this.getAttribute('overflow').getValue('hidden') !== 'visible';\n        let minX = 0;\n        let minY = 0;\n        let clipX = 0;\n        let clipY = 0;\n        if (viewBox) {\n            minX = viewBox[0];\n            minY = viewBox[1];\n        }\n        if (!this.root) {\n            width = this.getAttribute('width').getPixels('x');\n            height = this.getAttribute('height').getPixels('y');\n            if (this.type === 'marker') {\n                clipX = minX;\n                clipY = minY;\n                minX = 0;\n                minY = 0;\n            }\n        }\n        screen.viewPort.setCurrent(width, height);\n        if (viewBox) {\n            width = viewBox[2];\n            height = viewBox[3];\n        }\n        document.setViewBox({\n            ctx,\n            aspectRatio: this.getAttribute('preserveAspectRatio').getString(),\n            width: screen.viewPort.width,\n            desiredWidth: width,\n            height: screen.viewPort.height,\n            desiredHeight: height,\n            minX,\n            minY,\n            refX: refXAttr.getValue(),\n            refY: refYAttr.getValue(),\n            clip,\n            clipX,\n            clipY\n        });\n        if (viewBox) {\n            screen.viewPort.removeCurrent();\n            screen.viewPort.setCurrent(width, height);\n        }\n    }\n    /**\n     * Resize SVG to fit in given size.\n     * @param width\n     * @param height\n     * @param preserveAspectRatio\n     */\n    resize(width, height = width, preserveAspectRatio = false) {\n        const widthAttr = this.getAttribute('width', true);\n        const heightAttr = this.getAttribute('height', true);\n        const viewBoxAttr = this.getAttribute('viewBox');\n        const styleAttr = this.getAttribute('style');\n        const originWidth = widthAttr.getNumber(0);\n        const originHeight = heightAttr.getNumber(0);\n        if (preserveAspectRatio) {\n            if (typeof preserveAspectRatio === 'string') {\n                this.getAttribute('preserveAspectRatio', true).setValue(preserveAspectRatio);\n            }\n            else {\n                const preserveAspectRatioAttr = this.getAttribute('preserveAspectRatio');\n                if (preserveAspectRatioAttr.hasValue()) {\n                    preserveAspectRatioAttr.setValue(preserveAspectRatioAttr.getString().replace(/^\\s*(\\S.*\\S)\\s*$/, '$1'));\n                }\n            }\n        }\n        widthAttr.setValue(width);\n        heightAttr.setValue(height);\n        if (!viewBoxAttr.hasValue()) {\n            viewBoxAttr.setValue(`0 0 ${originWidth || width} ${originHeight || height}`);\n        }\n        if (styleAttr.hasValue()) {\n            const widthStyle = this.getStyle('width');\n            const heightStyle = this.getStyle('height');\n            if (widthStyle.hasValue()) {\n                widthStyle.setValue(`${width}px`);\n            }\n            if (heightStyle.hasValue()) {\n                heightStyle.setValue(`${height}px`);\n            }\n        }\n    }\n}\n\nclass RectElement extends PathElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'rect';\n    }\n    path(ctx) {\n        const x = this.getAttribute('x').getPixels('x');\n        const y = this.getAttribute('y').getPixels('y');\n        const width = this.getAttribute('width').getPixels('x');\n        const height = this.getAttribute('height').getPixels('y');\n        const rxAttr = this.getAttribute('rx');\n        const ryAttr = this.getAttribute('ry');\n        let rx = rxAttr.getPixels('x');\n        let ry = ryAttr.getPixels('y');\n        if (rxAttr.hasValue() && !ryAttr.hasValue()) {\n            ry = rx;\n        }\n        if (ryAttr.hasValue() && !rxAttr.hasValue()) {\n            rx = ry;\n        }\n        rx = Math.min(rx, width / 2.0);\n        ry = Math.min(ry, height / 2.0);\n        if (ctx) {\n            const KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\n            ctx.beginPath(); // always start the path so we don't fill prior paths\n            if (height > 0 && width > 0) {\n                ctx.moveTo(x + rx, y);\n                ctx.lineTo(x + width - rx, y);\n                ctx.bezierCurveTo(x + width - rx + (KAPPA * rx), y, x + width, y + ry - (KAPPA * ry), x + width, y + ry);\n                ctx.lineTo(x + width, y + height - ry);\n                ctx.bezierCurveTo(x + width, y + height - ry + (KAPPA * ry), x + width - rx + (KAPPA * rx), y + height, x + width - rx, y + height);\n                ctx.lineTo(x + rx, y + height);\n                ctx.bezierCurveTo(x + rx - (KAPPA * rx), y + height, x, y + height - ry + (KAPPA * ry), x, y + height - ry);\n                ctx.lineTo(x, y + ry);\n                ctx.bezierCurveTo(x, y + ry - (KAPPA * ry), x + rx - (KAPPA * rx), y, x + rx, y);\n                ctx.closePath();\n            }\n        }\n        return new BoundingBox(x, y, x + width, y + height);\n    }\n    getMarkers() {\n        return null;\n    }\n}\n\nclass CircleElement extends PathElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'circle';\n    }\n    path(ctx) {\n        const cx = this.getAttribute('cx').getPixels('x');\n        const cy = this.getAttribute('cy').getPixels('y');\n        const r = this.getAttribute('r').getPixels();\n        if (ctx && r > 0) {\n            ctx.beginPath();\n            ctx.arc(cx, cy, r, 0, Math.PI * 2, false);\n            ctx.closePath();\n        }\n        return new BoundingBox(cx - r, cy - r, cx + r, cy + r);\n    }\n    getMarkers() {\n        return null;\n    }\n}\n\nclass EllipseElement extends PathElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'ellipse';\n    }\n    path(ctx) {\n        const KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\n        const rx = this.getAttribute('rx').getPixels('x');\n        const ry = this.getAttribute('ry').getPixels('y');\n        const cx = this.getAttribute('cx').getPixels('x');\n        const cy = this.getAttribute('cy').getPixels('y');\n        if (ctx) {\n            ctx.beginPath();\n            ctx.moveTo(cx + rx, cy);\n            ctx.bezierCurveTo(cx + rx, cy + (KAPPA * ry), cx + (KAPPA * rx), cy + ry, cx, cy + ry);\n            ctx.bezierCurveTo(cx - (KAPPA * rx), cy + ry, cx - rx, cy + (KAPPA * ry), cx - rx, cy);\n            ctx.bezierCurveTo(cx - rx, cy - (KAPPA * ry), cx - (KAPPA * rx), cy - ry, cx, cy - ry);\n            ctx.bezierCurveTo(cx + (KAPPA * rx), cy - ry, cx + rx, cy - (KAPPA * ry), cx + rx, cy);\n            ctx.closePath();\n        }\n        return new BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);\n    }\n    getMarkers() {\n        return null;\n    }\n}\n\nclass LineElement extends PathElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'line';\n    }\n    getPoints() {\n        return [\n            new Point(this.getAttribute('x1').getPixels('x'), this.getAttribute('y1').getPixels('y')),\n            new Point(this.getAttribute('x2').getPixels('x'), this.getAttribute('y2').getPixels('y'))\n        ];\n    }\n    path(ctx) {\n        const [{ x: x0, y: y0 }, { x: x1, y: y1 }] = this.getPoints();\n        if (ctx) {\n            ctx.beginPath();\n            ctx.moveTo(x0, y0);\n            ctx.lineTo(x1, y1);\n        }\n        return new BoundingBox(x0, y0, x1, y1);\n    }\n    getMarkers() {\n        const [p0, p1] = this.getPoints();\n        const a = p0.angleTo(p1);\n        return [\n            [p0, a],\n            [p1, a]\n        ];\n    }\n}\n\nclass PolylineElement extends PathElement {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'polyline';\n        this.points = [];\n        this.points = Point.parsePath(this.getAttribute('points').getString());\n    }\n    path(ctx) {\n        const { points } = this;\n        const [{ x: x0, y: y0 }] = points;\n        const boundingBox = new BoundingBox(x0, y0);\n        if (ctx) {\n            ctx.beginPath();\n            ctx.moveTo(x0, y0);\n        }\n        points.forEach(({ x, y }) => {\n            boundingBox.addPoint(x, y);\n            if (ctx) {\n                ctx.lineTo(x, y);\n            }\n        });\n        return boundingBox;\n    }\n    getMarkers() {\n        const { points } = this;\n        const lastIndex = points.length - 1;\n        const markers = [];\n        points.forEach((point, i) => {\n            if (i === lastIndex) {\n                return;\n            }\n            markers.push([\n                point,\n                point.angleTo(points[i + 1])\n            ]);\n        });\n        if (markers.length > 0) {\n            markers.push([\n                points[points.length - 1],\n                markers[markers.length - 1][1]\n            ]);\n        }\n        return markers;\n    }\n}\n\nclass PolygonElement extends PolylineElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'polygon';\n    }\n    path(ctx) {\n        const boundingBox = super.path(ctx);\n        const [{ x, y }] = this.points;\n        if (ctx) {\n            ctx.lineTo(x, y);\n            ctx.closePath();\n        }\n        return boundingBox;\n    }\n}\n\nclass PatternElement extends Element {\n    constructor() {\n        super(...arguments);\n        this.type = 'pattern';\n    }\n    createPattern(ctx, _, parentOpacityProp) {\n        const width = this.getAttribute('width').getPixels('x', true);\n        const height = this.getAttribute('height').getPixels('y', true);\n        // render me using a temporary svg element\n        const patternSvg = new SVGElement(this.document, null);\n        patternSvg.attributes.viewBox = new Property(this.document, 'viewBox', this.getAttribute('viewBox').getValue());\n        patternSvg.attributes.width = new Property(this.document, 'width', `${width}px`);\n        patternSvg.attributes.height = new Property(this.document, 'height', `${height}px`);\n        patternSvg.attributes.transform = new Property(this.document, 'transform', this.getAttribute('patternTransform').getValue());\n        patternSvg.children = this.children;\n        const patternCanvas = this.document.createCanvas(width, height);\n        const patternCtx = patternCanvas.getContext('2d');\n        const xAttr = this.getAttribute('x');\n        const yAttr = this.getAttribute('y');\n        if (xAttr.hasValue() && yAttr.hasValue()) {\n            patternCtx.translate(xAttr.getPixels('x', true), yAttr.getPixels('y', true));\n        }\n        if (parentOpacityProp.hasValue()) {\n            this.styles['fill-opacity'] = parentOpacityProp;\n        }\n        else {\n            Reflect.deleteProperty(this.styles, 'fill-opacity');\n        }\n        // render 3x3 grid so when we transform there's no white space on edges\n        for (let x = -1; x <= 1; x++) {\n            for (let y = -1; y <= 1; y++) {\n                patternCtx.save();\n                patternSvg.attributes.x = new Property(this.document, 'x', x * patternCanvas.width);\n                patternSvg.attributes.y = new Property(this.document, 'y', y * patternCanvas.height);\n                patternSvg.render(patternCtx);\n                patternCtx.restore();\n            }\n        }\n        const pattern = ctx.createPattern(patternCanvas, 'repeat');\n        return pattern;\n    }\n}\n\nclass MarkerElement extends Element {\n    constructor() {\n        super(...arguments);\n        this.type = 'marker';\n    }\n    render(ctx, point, angle) {\n        if (!point) {\n            return;\n        }\n        const { x, y } = point;\n        const orient = this.getAttribute('orient').getValue('auto');\n        const markerUnits = this.getAttribute('markerUnits').getValue('strokeWidth');\n        ctx.translate(x, y);\n        if (orient === 'auto') {\n            ctx.rotate(angle);\n        }\n        if (markerUnits === 'strokeWidth') {\n            ctx.scale(ctx.lineWidth, ctx.lineWidth);\n        }\n        ctx.save();\n        // render me using a temporary svg element\n        const markerSvg = new SVGElement(this.document, null);\n        markerSvg.type = this.type;\n        markerSvg.attributes.viewBox = new Property(this.document, 'viewBox', this.getAttribute('viewBox').getValue());\n        markerSvg.attributes.refX = new Property(this.document, 'refX', this.getAttribute('refX').getValue());\n        markerSvg.attributes.refY = new Property(this.document, 'refY', this.getAttribute('refY').getValue());\n        markerSvg.attributes.width = new Property(this.document, 'width', this.getAttribute('markerWidth').getValue());\n        markerSvg.attributes.height = new Property(this.document, 'height', this.getAttribute('markerHeight').getValue());\n        markerSvg.attributes.overflow = new Property(this.document, 'overflow', this.getAttribute('overflow').getValue());\n        markerSvg.attributes.fill = new Property(this.document, 'fill', this.getAttribute('fill').getValue('black'));\n        markerSvg.attributes.stroke = new Property(this.document, 'stroke', this.getAttribute('stroke').getValue('none'));\n        markerSvg.children = this.children;\n        markerSvg.render(ctx);\n        ctx.restore();\n        if (markerUnits === 'strokeWidth') {\n            ctx.scale(1 / ctx.lineWidth, 1 / ctx.lineWidth);\n        }\n        if (orient === 'auto') {\n            ctx.rotate(-angle);\n        }\n        ctx.translate(-x, -y);\n    }\n}\n\nclass DefsElement extends Element {\n    constructor() {\n        super(...arguments);\n        this.type = 'defs';\n    }\n    render() {\n        // NOOP\n    }\n}\n\nclass GElement extends RenderedElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'g';\n    }\n    getBoundingBox(ctx) {\n        const boundingBox = new BoundingBox();\n        this.children.forEach((child) => {\n            boundingBox.addBoundingBox(child.getBoundingBox(ctx));\n        });\n        return boundingBox;\n    }\n}\n\nclass GradientElement extends Element {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.attributesToInherit = [\n            'gradientUnits'\n        ];\n        this.stops = [];\n        const { stops, children } = this;\n        children.forEach((child) => {\n            if (child.type === 'stop') {\n                stops.push(child);\n            }\n        });\n    }\n    getGradientUnits() {\n        return this.getAttribute('gradientUnits').getString('objectBoundingBox');\n    }\n    createGradient(ctx, element, parentOpacityProp) {\n        // tslint:disable-next-line: no-this-assignment\n        let stopsContainer = this;\n        if (this.getHrefAttribute().hasValue()) {\n            stopsContainer = this.getHrefAttribute().getDefinition();\n            this.inheritStopContainer(stopsContainer);\n        }\n        const { stops } = stopsContainer;\n        const gradient = this.getGradient(ctx, element);\n        if (!gradient) {\n            return this.addParentOpacity(parentOpacityProp, stops[stops.length - 1].color);\n        }\n        stops.forEach((stop) => {\n            gradient.addColorStop(stop.offset, this.addParentOpacity(parentOpacityProp, stop.color));\n        });\n        if (this.getAttribute('gradientTransform').hasValue()) {\n            // render as transformed pattern on temporary canvas\n            const { document } = this;\n            const { MAX_VIRTUAL_PIXELS, viewPort } = document.screen;\n            const [rootView] = viewPort.viewPorts;\n            const rect = new RectElement(document, null);\n            rect.attributes.x = new Property(document, 'x', -MAX_VIRTUAL_PIXELS / 3.0);\n            rect.attributes.y = new Property(document, 'y', -MAX_VIRTUAL_PIXELS / 3.0);\n            rect.attributes.width = new Property(document, 'width', MAX_VIRTUAL_PIXELS);\n            rect.attributes.height = new Property(document, 'height', MAX_VIRTUAL_PIXELS);\n            const group = new GElement(document, null);\n            group.attributes.transform = new Property(document, 'transform', this.getAttribute('gradientTransform').getValue());\n            group.children = [rect];\n            const patternSvg = new SVGElement(document, null);\n            patternSvg.attributes.x = new Property(document, 'x', 0);\n            patternSvg.attributes.y = new Property(document, 'y', 0);\n            patternSvg.attributes.width = new Property(document, 'width', rootView.width);\n            patternSvg.attributes.height = new Property(document, 'height', rootView.height);\n            patternSvg.children = [group];\n            const patternCanvas = document.createCanvas(rootView.width, rootView.height);\n            const patternCtx = patternCanvas.getContext('2d');\n            patternCtx.fillStyle = gradient;\n            patternSvg.render(patternCtx);\n            return patternCtx.createPattern(patternCanvas, 'no-repeat');\n        }\n        return gradient;\n    }\n    inheritStopContainer(stopsContainer) {\n        this.attributesToInherit.forEach((attributeToInherit) => {\n            if (!this.getAttribute(attributeToInherit).hasValue()\n                && stopsContainer.getAttribute(attributeToInherit).hasValue()) {\n                this.getAttribute(attributeToInherit, true)\n                    .setValue(stopsContainer.getAttribute(attributeToInherit).getValue());\n            }\n        });\n    }\n    addParentOpacity(parentOpacityProp, color) {\n        if (parentOpacityProp.hasValue()) {\n            const colorProp = new Property(this.document, 'color', color);\n            return colorProp.addOpacity(parentOpacityProp).getString();\n        }\n        return color;\n    }\n}\n\nclass LinearGradientElement extends GradientElement {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'linearGradient';\n        this.attributesToInherit.push('x1', 'y1', 'x2', 'y2');\n    }\n    getGradient(ctx, element) {\n        const boundingBox = this.getGradientUnits() === 'objectBoundingBox'\n            ? element.getBoundingBox(ctx)\n            : null;\n        if (!this.getAttribute('x1').hasValue()\n            && !this.getAttribute('y1').hasValue()\n            && !this.getAttribute('x2').hasValue()\n            && !this.getAttribute('y2').hasValue()) {\n            this.getAttribute('x1', true).setValue(0);\n            this.getAttribute('y1', true).setValue(0);\n            this.getAttribute('x2', true).setValue(1);\n            this.getAttribute('y2', true).setValue(0);\n        }\n        const x1 = this.getGradientUnits() === 'objectBoundingBox'\n            ? boundingBox.x + boundingBox.width * this.getAttribute('x1').getNumber()\n            : this.getAttribute('x1').getPixels('x');\n        const y1 = this.getGradientUnits() === 'objectBoundingBox'\n            ? boundingBox.y + boundingBox.height * this.getAttribute('y1').getNumber()\n            : this.getAttribute('y1').getPixels('y');\n        const x2 = this.getGradientUnits() === 'objectBoundingBox'\n            ? boundingBox.x + boundingBox.width * this.getAttribute('x2').getNumber()\n            : this.getAttribute('x2').getPixels('x');\n        const y2 = this.getGradientUnits() === 'objectBoundingBox'\n            ? boundingBox.y + boundingBox.height * this.getAttribute('y2').getNumber()\n            : this.getAttribute('y2').getPixels('y');\n        if (x1 === x2 && y1 === y2) {\n            return null;\n        }\n        return ctx.createLinearGradient(x1, y1, x2, y2);\n    }\n}\n\nclass RadialGradientElement extends GradientElement {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'radialGradient';\n        this.attributesToInherit.push('cx', 'cy', 'r', 'fx', 'fy', 'fr');\n    }\n    getGradient(ctx, element) {\n        const boundingBox = element.getBoundingBox(ctx);\n        if (!this.getAttribute('cx').hasValue()) {\n            this.getAttribute('cx', true).setValue('50%');\n        }\n        if (!this.getAttribute('cy').hasValue()) {\n            this.getAttribute('cy', true).setValue('50%');\n        }\n        if (!this.getAttribute('r').hasValue()) {\n            this.getAttribute('r', true).setValue('50%');\n        }\n        const cx = this.getGradientUnits() === 'objectBoundingBox'\n            ? boundingBox.x + boundingBox.width * this.getAttribute('cx').getNumber()\n            : this.getAttribute('cx').getPixels('x');\n        const cy = this.getGradientUnits() === 'objectBoundingBox'\n            ? boundingBox.y + boundingBox.height * this.getAttribute('cy').getNumber()\n            : this.getAttribute('cy').getPixels('y');\n        let fx = cx;\n        let fy = cy;\n        if (this.getAttribute('fx').hasValue()) {\n            fx = this.getGradientUnits() === 'objectBoundingBox'\n                ? boundingBox.x + boundingBox.width * this.getAttribute('fx').getNumber()\n                : this.getAttribute('fx').getPixels('x');\n        }\n        if (this.getAttribute('fy').hasValue()) {\n            fy = this.getGradientUnits() === 'objectBoundingBox'\n                ? boundingBox.y + boundingBox.height * this.getAttribute('fy').getNumber()\n                : this.getAttribute('fy').getPixels('y');\n        }\n        const r = this.getGradientUnits() === 'objectBoundingBox'\n            ? (boundingBox.width + boundingBox.height) / 2.0 * this.getAttribute('r').getNumber()\n            : this.getAttribute('r').getPixels();\n        const fr = this.getAttribute('fr').getPixels();\n        return ctx.createRadialGradient(fx, fy, fr, cx, cy, r);\n    }\n}\n\nclass StopElement extends Element {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'stop';\n        const offset = Math.max(0, Math.min(1, this.getAttribute('offset').getNumber()));\n        const stopOpacity = this.getStyle('stop-opacity');\n        let stopColor = this.getStyle('stop-color', true);\n        if (stopColor.getString() === '') {\n            stopColor.setValue('#000');\n        }\n        if (stopOpacity.hasValue()) {\n            stopColor = stopColor.addOpacity(stopOpacity);\n        }\n        this.offset = offset;\n        this.color = stopColor.getString();\n    }\n}\n\nclass AnimateElement extends Element {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'animate';\n        this.duration = 0;\n        this.initialValue = null;\n        this.initialUnits = '';\n        this.removed = false;\n        this.frozen = false;\n        document.screen.animations.push(this);\n        this.begin = this.getAttribute('begin').getMilliseconds();\n        this.maxDuration = this.begin + this.getAttribute('dur').getMilliseconds();\n        this.from = this.getAttribute('from');\n        this.to = this.getAttribute('to');\n        this.values = this.getAttribute('values');\n        if (this.values.hasValue()) {\n            this.values.setValue(this.values.getString().split(';'));\n        }\n    }\n    getProperty() {\n        const attributeType = this.getAttribute('attributeType').getString();\n        const attributeName = this.getAttribute('attributeName').getString();\n        if (attributeType === 'CSS') {\n            return this.parent.getStyle(attributeName, true);\n        }\n        return this.parent.getAttribute(attributeName, true);\n    }\n    calcValue() {\n        const { initialUnits } = this;\n        const { progress, from, to } = this.getProgress();\n        // tween value linearly\n        let newValue = from.getNumber() + (to.getNumber() - from.getNumber()) * progress;\n        if (initialUnits === '%') {\n            newValue *= 100.0; // numValue() returns 0-1 whereas properties are 0-100\n        }\n        return `${newValue}${initialUnits}`;\n    }\n    update(delta) {\n        const { parent } = this;\n        const prop = this.getProperty();\n        // set initial value\n        if (!this.initialValue) {\n            this.initialValue = prop.getString();\n            this.initialUnits = prop.getUnits();\n        }\n        // if we're past the end time\n        if (this.duration > this.maxDuration) {\n            const fill = this.getAttribute('fill').getString('remove');\n            // loop for indefinitely repeating animations\n            if (this.getAttribute('repeatCount').getString() === 'indefinite'\n                || this.getAttribute('repeatDur').getString() === 'indefinite') {\n                this.duration = 0;\n            }\n            else if (fill === 'freeze' && !this.frozen) {\n                this.frozen = true;\n                parent.animationFrozen = true;\n                parent.animationFrozenValue = prop.getString();\n            }\n            else if (fill === 'remove' && !this.removed) {\n                this.removed = true;\n                prop.setValue(parent.animationFrozen\n                    ? parent.animationFrozenValue\n                    : this.initialValue);\n                return true;\n            }\n            return false;\n        }\n        this.duration += delta;\n        // if we're past the begin time\n        let updated = false;\n        if (this.begin < this.duration) {\n            let newValue = this.calcValue(); // tween\n            const typeAttr = this.getAttribute('type');\n            if (typeAttr.hasValue()) {\n                // for transform, etc.\n                const type = typeAttr.getString();\n                newValue = `${type}(${newValue})`;\n            }\n            prop.setValue(newValue);\n            updated = true;\n        }\n        return updated;\n    }\n    getProgress() {\n        const { document, values } = this;\n        const result = {\n            progress: (this.duration - this.begin) / (this.maxDuration - this.begin)\n        };\n        if (values.hasValue()) {\n            const p = result.progress * (values.getValue().length - 1);\n            const lb = Math.floor(p);\n            const ub = Math.ceil(p);\n            result.from = new Property(document, 'from', parseFloat(values.getValue()[lb]));\n            result.to = new Property(document, 'to', parseFloat(values.getValue()[ub]));\n            result.progress = (p - lb) / (ub - lb);\n        }\n        else {\n            result.from = this.from;\n            result.to = this.to;\n        }\n        return result;\n    }\n}\n\nclass AnimateColorElement extends AnimateElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'animateColor';\n    }\n    calcValue() {\n        const { progress, from, to } = this.getProgress();\n        const colorFrom = new RGBColor(from.getString());\n        const colorTo = new RGBColor(to.getString());\n        if (colorFrom.ok && colorTo.ok) {\n            // tween color linearly\n            const r = colorFrom.r + (colorTo.r - colorFrom.r) * progress;\n            const g = colorFrom.g + (colorTo.g - colorFrom.g) * progress;\n            const b = colorFrom.b + (colorTo.b - colorFrom.b) * progress;\n            // ? alpha\n            return `rgb(${parseInt(r, 10)}, ${parseInt(g, 10)}, ${parseInt(b, 10)})`;\n        }\n        return this.getAttribute('from').getString();\n    }\n}\n\nclass AnimateTransformElement extends AnimateElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'animateTransform';\n    }\n    calcValue() {\n        const { progress, from, to } = this.getProgress();\n        // tween value linearly\n        const transformFrom = toNumbers(from.getString());\n        const transformTo = toNumbers(to.getString());\n        const newValue = transformFrom.map((from, i) => {\n            const to = transformTo[i];\n            return from + (to - from) * progress;\n        }).join(' ');\n        return newValue;\n    }\n}\n\nclass FontElement extends Element {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'font';\n        this.glyphs = {};\n        this.horizAdvX = this.getAttribute('horiz-adv-x').getNumber();\n        const { definitions } = document;\n        const { children } = this;\n        for (const child of children) {\n            switch (child.type) {\n                case 'font-face': {\n                    this.fontFace = child;\n                    const fontFamilyStyle = child.getStyle('font-family');\n                    if (fontFamilyStyle.hasValue()) {\n                        definitions[fontFamilyStyle.getString()] = this;\n                    }\n                    break;\n                }\n                case 'missing-glyph':\n                    this.missingGlyph = child;\n                    break;\n                case 'glyph': {\n                    const glyph = child;\n                    if (glyph.arabicForm) {\n                        this.isRTL = true;\n                        this.isArabic = true;\n                        if (typeof this.glyphs[glyph.unicode] === 'undefined') {\n                            this.glyphs[glyph.unicode] = {};\n                        }\n                        this.glyphs[glyph.unicode][glyph.arabicForm] = glyph;\n                    }\n                    else {\n                        this.glyphs[glyph.unicode] = glyph;\n                    }\n                    break;\n                }\n            }\n        }\n    }\n    render() {\n        // NO RENDER\n    }\n}\n\nclass FontFaceElement extends Element {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'font-face';\n        this.ascent = this.getAttribute('ascent').getNumber();\n        this.descent = this.getAttribute('descent').getNumber();\n        this.unitsPerEm = this.getAttribute('units-per-em').getNumber();\n    }\n}\n\nclass MissingGlyphElement extends PathElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'missing-glyph';\n        this.horizAdvX = 0;\n    }\n}\n\nclass GlyphElement extends PathElement {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'glyph';\n        this.horizAdvX = this.getAttribute('horiz-adv-x').getNumber();\n        this.unicode = this.getAttribute('unicode').getString();\n        this.arabicForm = this.getAttribute('arabic-form').getString();\n    }\n}\n\nclass TRefElement extends TextElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'tref';\n    }\n    getText() {\n        const element = this.getHrefAttribute().getDefinition();\n        if (element) {\n            const firstChild = element.children[0];\n            if (firstChild) {\n                return firstChild.getText();\n            }\n        }\n        return '';\n    }\n}\n\nclass AElement extends TextElement {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'a';\n        const { childNodes } = node;\n        const firstChild = childNodes[0];\n        const hasText = childNodes.length > 0\n            && Array.from(childNodes).every(node => node.nodeType === 3);\n        this.hasText = hasText;\n        this.text = hasText\n            ? this.getTextFromNode(firstChild)\n            : '';\n    }\n    getText() {\n        return this.text;\n    }\n    renderChildren(ctx) {\n        if (this.hasText) {\n            // render as text element\n            super.renderChildren(ctx);\n            const { document, x, y } = this;\n            const { mouse } = document.screen;\n            const fontSize = new Property(document, 'fontSize', Font.parse(document.ctx.font).fontSize);\n            // Do not calc bounding box if mouse is not working.\n            if (mouse.isWorking()) {\n                mouse.checkBoundingBox(this, new BoundingBox(x, y - fontSize.getPixels('y'), x + this.measureText(ctx), y));\n            }\n        }\n        else if (this.children.length > 0) {\n            // render as temporary group\n            const g = new GElement(this.document, null);\n            g.children = this.children;\n            g.parent = this;\n            g.render(ctx);\n        }\n    }\n    onClick() {\n        const { window } = this.document;\n        if (window) {\n            window.open(this.getHrefAttribute().getString());\n        }\n    }\n    onMouseMove() {\n        const ctx = this.document.ctx;\n        ctx.canvas.style.cursor = 'pointer';\n    }\n}\n\nclass TextPathElement extends TextElement {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'textPath';\n        this.textWidth = 0;\n        this.textHeight = 0;\n        this.pathLength = -1;\n        this.glyphInfo = null;\n        this.letterSpacingCache = [];\n        this.measuresCache = new Map([['', 0]]);\n        const pathElement = this.getHrefAttribute().getDefinition();\n        this.text = this.getTextFromNode();\n        this.dataArray = this.parsePathData(pathElement);\n    }\n    getText() {\n        return this.text;\n    }\n    path(ctx) {\n        const { dataArray } = this;\n        if (ctx) {\n            ctx.beginPath();\n        }\n        dataArray.forEach(({ command, points }) => {\n            switch (command) {\n                case 'L':\n                    if (ctx) {\n                        ctx.lineTo(points[0], points[1]);\n                    }\n                    break;\n                case 'M':\n                    if (ctx) {\n                        ctx.moveTo(points[0], points[1]);\n                    }\n                    break;\n                case 'C':\n                    if (ctx) {\n                        ctx.bezierCurveTo(points[0], points[1], points[2], points[3], points[4], points[5]);\n                    }\n                    break;\n                case 'Q':\n                    if (ctx) {\n                        ctx.quadraticCurveTo(points[0], points[1], points[2], points[3]);\n                    }\n                    break;\n                case 'A': {\n                    const cx = points[0];\n                    const cy = points[1];\n                    const rx = points[2];\n                    const ry = points[3];\n                    const theta = points[4];\n                    const dTheta = points[5];\n                    const psi = points[6];\n                    const fs = points[7];\n                    const r = (rx > ry) ? rx : ry;\n                    const scaleX = (rx > ry) ? 1 : rx / ry;\n                    const scaleY = (rx > ry) ? ry / rx : 1;\n                    if (ctx) {\n                        ctx.translate(cx, cy);\n                        ctx.rotate(psi);\n                        ctx.scale(scaleX, scaleY);\n                        ctx.arc(0, 0, r, theta, theta + dTheta, Boolean(1 - fs));\n                        ctx.scale(1 / scaleX, 1 / scaleY);\n                        ctx.rotate(-psi);\n                        ctx.translate(-cx, -cy);\n                    }\n                    break;\n                }\n                case 'z':\n                    if (ctx) {\n                        ctx.closePath();\n                    }\n                    break;\n            }\n        });\n    }\n    renderChildren(ctx) {\n        this.setTextData(ctx);\n        ctx.save();\n        const textDecoration = this.parent.getStyle('text-decoration').getString();\n        const fontSize = this.getFontSize();\n        const { glyphInfo } = this;\n        const fill = ctx.fillStyle;\n        if (textDecoration === 'underline') {\n            ctx.beginPath();\n        }\n        glyphInfo.forEach((glyph, i) => {\n            const { p0, p1, text: partialText } = glyph;\n            ctx.save();\n            ctx.translate(p0.x, p0.y);\n            ctx.rotate(glyphInfo[i].rotation);\n            if (ctx.fillStyle) {\n                ctx.fillText(partialText, 0, 0);\n            }\n            if (ctx.strokeStyle) {\n                ctx.strokeText(partialText, 0, 0);\n            }\n            ctx.restore();\n            if (textDecoration === 'underline') {\n                if (i === 0) {\n                    ctx.moveTo(p0.x, p0.y + fontSize / 8);\n                }\n                ctx.lineTo(p1.x, p1.y + fontSize / 5);\n            }\n            //// To assist with debugging visually, uncomment following\n            //\n            // ctx.beginPath();\n            // if (i % 2)\n            // \tctx.strokeStyle = 'red';\n            // else\n            // \tctx.strokeStyle = 'green';\n            // ctx.moveTo(p0.x, p0.y);\n            // ctx.lineTo(p1.x, p1.y);\n            // ctx.stroke();\n            // ctx.closePath();\n        });\n        if (textDecoration === 'underline') {\n            ctx.lineWidth = fontSize / 20;\n            ctx.strokeStyle = fill;\n            ctx.stroke();\n            ctx.closePath();\n        }\n        ctx.restore();\n    }\n    getLetterSpacingAt(idx = 0) {\n        return this.letterSpacingCache[idx] || 0;\n    }\n    findSegmentToFitChar(ctx, anchor, textFullWidth, fullPathWidth, spacesNumber, inputOffset, c, charI) {\n        let offset = inputOffset;\n        let glyphWidth = this.measureText(ctx, c);\n        if (c === ' '\n            && anchor === 'justify'\n            && textFullWidth < fullPathWidth) {\n            glyphWidth += (fullPathWidth - textFullWidth) / spacesNumber;\n        }\n        if (charI > -1) {\n            offset += this.getLetterSpacingAt(charI);\n        }\n        const splineStep = this.textHeight / 20;\n        const segment = {\n            p0: this.getEquidistantPointOnPath(offset, splineStep),\n            p1: this.getEquidistantPointOnPath(offset + glyphWidth, splineStep)\n        };\n        offset += glyphWidth;\n        return {\n            offset,\n            segment\n        };\n    }\n    measureText(ctx, text) {\n        const { measuresCache } = this;\n        const targetText = text || this.getText();\n        if (measuresCache.has(targetText)) {\n            return measuresCache.get(targetText);\n        }\n        const measure = this.measureTargetText(ctx, targetText);\n        measuresCache.set(targetText, measure);\n        return measure;\n    }\n    // This method supposes what all custom fonts already loaded.\n    // If some font will be loaded after this method call, <textPath> will not be rendered correctly.\n    // You need to call this method manually to update glyphs cache.\n    setTextData(ctx) {\n        if (this.glyphInfo) {\n            return;\n        }\n        const renderText = this.getText();\n        const chars = renderText.split('');\n        const spacesNumber = renderText.split(' ').length - 1;\n        const dx = toNumbers(this.parent.getAttribute('dx').getString('0'));\n        const anchor = this.parent.getStyle('text-anchor').getString('start');\n        const thisSpacing = this.getStyle('letter-spacing');\n        const parentSpacing = this.parent.getStyle('letter-spacing');\n        let letterSpacing = 0;\n        if (!thisSpacing.hasValue()\n            || thisSpacing.getValue() === 'inherit') {\n            letterSpacing = parentSpacing.getPixels();\n        }\n        else if (thisSpacing.hasValue()) {\n            if (thisSpacing.getValue() !== 'initial'\n                && thisSpacing.getValue() !== 'unset') {\n                letterSpacing = thisSpacing.getPixels();\n            }\n        }\n        // fill letter-spacing cache\n        const letterSpacingCache = [];\n        const textLen = renderText.length;\n        this.letterSpacingCache = letterSpacingCache;\n        for (let i = 0; i < textLen; i++) {\n            letterSpacingCache.push(typeof dx[i] !== 'undefined'\n                ? dx[i]\n                : letterSpacing);\n        }\n        const dxSum = letterSpacingCache.reduce((acc, cur) => acc + cur || 0, 0);\n        this.textWidth = this.measureText(ctx);\n        this.textHeight = this.getFontSize();\n        const textFullWidth = Math.max(this.textWidth + dxSum, 0);\n        this.glyphInfo = [];\n        const fullPathWidth = this.getPathLength();\n        const startOffset = this.getStyle('startOffset').getNumber(0) * fullPathWidth;\n        let offset = 0;\n        if (anchor === 'middle'\n            || anchor === 'center') {\n            offset = -textFullWidth / 2;\n        }\n        if (anchor === 'end'\n            || anchor === 'right') {\n            offset = -textFullWidth;\n        }\n        offset += startOffset;\n        chars.forEach((char, i) => {\n            // Find such segment what distance between p0 and p1 is approx. width of glyph\n            const { offset: nextOffset, segment } = this.findSegmentToFitChar(ctx, anchor, textFullWidth, fullPathWidth, spacesNumber, offset, char, i);\n            offset = nextOffset;\n            if (!segment.p0 || !segment.p1) {\n                return;\n            }\n            const width = this.getLineLength(segment.p0.x, segment.p0.y, segment.p1.x, segment.p1.y);\n            // Note: Since glyphs are rendered one at a time, any kerning pair data built into the font will not be used.\n            // Can foresee having a rough pair table built in that the developer can override as needed.\n            // Or use \"dx\" attribute of the <text> node as a naive replacement\n            const kern = 0;\n            // placeholder for future implementation\n            const midpoint = this.getPointOnLine(kern + width / 2.0, segment.p0.x, segment.p0.y, segment.p1.x, segment.p1.y);\n            const rotation = Math.atan2((segment.p1.y - segment.p0.y), (segment.p1.x - segment.p0.x));\n            this.glyphInfo.push({\n                transposeX: midpoint.x,\n                transposeY: midpoint.y,\n                text: chars[i],\n                p0: segment.p0,\n                p1: segment.p1,\n                rotation\n            });\n        });\n    }\n    parsePathData(path) {\n        this.pathLength = -1; // reset path length\n        if (!path) {\n            return [];\n        }\n        const pathCommands = [];\n        const pathParser = path.pathParser;\n        pathParser.reset();\n        // convert l, H, h, V, and v to L\n        while (!pathParser.isEnd()) {\n            const { current } = pathParser;\n            const startX = current ? current.x : 0;\n            const startY = current ? current.y : 0;\n            let cmd = '';\n            let points = [];\n            pathParser.nextCommand();\n            const upperCommand = pathParser.command.toUpperCase();\n            switch (pathParser.command) {\n                case 'M':\n                case 'm':\n                    cmd = this.pathM(pathParser, points);\n                    break;\n                case 'L':\n                case 'l':\n                    cmd = this.pathL(pathParser, points);\n                    break;\n                case 'H':\n                case 'h':\n                    cmd = this.pathH(pathParser, points);\n                    break;\n                case 'V':\n                case 'v':\n                    cmd = this.pathV(pathParser, points);\n                    break;\n                case 'C':\n                case 'c':\n                    this.pathC(pathParser, points);\n                    break;\n                case 'S':\n                case 's':\n                    cmd = this.pathS(pathParser, points);\n                    break;\n                case 'Q':\n                case 'q':\n                    this.pathQ(pathParser, points);\n                    break;\n                case 'T':\n                case 't':\n                    cmd = this.pathT(pathParser, points);\n                    break;\n                case 'A':\n                case 'a':\n                    points = this.pathA(pathParser);\n                    break;\n                case 'Z':\n                case 'z':\n                    pathParser.current = pathParser.start;\n                    break;\n            }\n            if (upperCommand !== 'Z') {\n                pathCommands.push({\n                    command: cmd || upperCommand,\n                    points,\n                    start: {\n                        x: startX,\n                        y: startY\n                    },\n                    pathLength: this.calcLength(startX, startY, cmd || upperCommand, points)\n                });\n            }\n            else {\n                pathCommands.push({\n                    command: 'z',\n                    points: [],\n                    pathLength: 0\n                });\n            }\n        }\n        return pathCommands;\n    }\n    pathM(pathParser, points) {\n        const p = pathParser.getAsCurrentPoint();\n        // pathParser.addMarker(p);\n        points.push(p.x, p.y);\n        pathParser.start = pathParser.current;\n        while (!pathParser.isCommandOrEnd()) {\n            const p = pathParser.getAsCurrentPoint();\n            points.push(p.x, p.y);\n            return 'L';\n        }\n    }\n    pathL(pathParser, points) {\n        while (!pathParser.isCommandOrEnd()) {\n            const p = pathParser.getAsCurrentPoint();\n            points.push(p.x, p.y);\n        }\n        return 'L';\n    }\n    pathH(pathParser, points) {\n        while (!pathParser.isCommandOrEnd()) {\n            const { current } = pathParser;\n            const point = new Point((pathParser.isRelativeCommand()\n                ? current.x\n                : 0) + pathParser.getScalar(), current.y);\n            points.push(point.x, point.y);\n            pathParser.current = point;\n        }\n        return 'L';\n    }\n    pathV(pathParser, points) {\n        while (!pathParser.isCommandOrEnd()) {\n            const { current } = pathParser;\n            const point = new Point(current.x, (pathParser.isRelativeCommand()\n                ? current.y\n                : 0) + pathParser.getScalar());\n            points.push(point.x, point.y);\n            pathParser.current = point;\n        }\n        return 'L';\n    }\n    pathC(pathParser, points) {\n        while (!pathParser.isCommandOrEnd()) {\n            const point = pathParser.getPoint();\n            const controlPoint = pathParser.getAsControlPoint();\n            const currentPoint = pathParser.getAsCurrentPoint();\n            points.push(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n        }\n    }\n    pathS(pathParser, points) {\n        while (!pathParser.isCommandOrEnd()) {\n            const point = pathParser.getReflectedControlPoint();\n            const controlPoint = pathParser.getAsControlPoint();\n            const currentPoint = pathParser.getAsCurrentPoint();\n            points.push(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n        }\n        return 'C';\n    }\n    pathQ(pathParser, points) {\n        while (!pathParser.isCommandOrEnd()) {\n            const controlPoint = pathParser.getAsControlPoint();\n            const currentPoint = pathParser.getAsCurrentPoint();\n            points.push(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n        }\n    }\n    pathT(pathParser, points) {\n        while (!pathParser.isCommandOrEnd()) {\n            const controlPoint = pathParser.getReflectedControlPoint();\n            pathParser.control = controlPoint;\n            const currentPoint = pathParser.getAsCurrentPoint();\n            points.push(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n        }\n        return 'Q';\n    }\n    pathA(pathParser) {\n        while (!pathParser.isCommandOrEnd()) {\n            const { current } = pathParser; // x1, y1\n            let rx = pathParser.getScalar();\n            let ry = pathParser.getScalar();\n            const xAxisRotation = pathParser.getScalar() * (Math.PI / 180.0); // φ\n            const largeArcFlag = pathParser.getScalar(); //  fA\n            const sweepFlag = pathParser.getScalar(); //  fS\n            const currentPoint = pathParser.getAsCurrentPoint(); // x2, y2\n            // Conversion from endpoint to center parameterization\n            // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n            // x1', y1'\n            const currp = new Point(Math.cos(xAxisRotation) * (current.x - currentPoint.x) / 2.0\n                + Math.sin(xAxisRotation) * (current.y - currentPoint.y) / 2.0, -Math.sin(xAxisRotation) * (current.x - currentPoint.x) / 2.0\n                + Math.cos(xAxisRotation) * (current.y - currentPoint.y) / 2.0);\n            // adjust radii\n            const l = (Math.pow(currp.x, 2) / Math.pow(rx, 2)\n                + Math.pow(currp.y, 2) / Math.pow(ry, 2));\n            if (l > 1) {\n                rx *= Math.sqrt(l);\n                ry *= Math.sqrt(l);\n            }\n            // cx', cy'\n            let s = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt(((Math.pow(rx, 2) * Math.pow(ry, 2))\n                - (Math.pow(rx, 2) * Math.pow(currp.y, 2))\n                - (Math.pow(ry, 2) * Math.pow(currp.x, 2))) / (Math.pow(rx, 2) * Math.pow(currp.y, 2)\n                + Math.pow(ry, 2) * Math.pow(currp.x, 2)));\n            if (isNaN(s)) {\n                s = 0;\n            }\n            const cpp = new Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);\n            // cx, cy\n            const centp = new Point((current.x + currentPoint.x) / 2.0\n                + Math.cos(xAxisRotation) * cpp.x\n                - Math.sin(xAxisRotation) * cpp.y, (current.y + currentPoint.y) / 2.0\n                + Math.sin(xAxisRotation) * cpp.x\n                + Math.cos(xAxisRotation) * cpp.y);\n            // initial angle\n            const a1 = vectorsAngle([1, 0], [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]); // θ1\n            // angle delta\n            const u = [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry];\n            const v = [(-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry];\n            let ad = vectorsAngle(u, v); // Δθ\n            if (vectorsRatio(u, v) <= -1) {\n                ad = Math.PI;\n            }\n            if (vectorsRatio(u, v) >= 1) {\n                ad = 0;\n            }\n            if (sweepFlag === 0 && ad > 0) {\n                ad = ad - 2 * Math.PI;\n            }\n            if (sweepFlag === 1 && ad < 0) {\n                ad = ad + 2 * Math.PI;\n            }\n            return [\n                centp.x,\n                centp.y,\n                rx,\n                ry,\n                a1,\n                ad,\n                xAxisRotation,\n                sweepFlag\n            ];\n        }\n    }\n    calcLength(x, y, cmd, points) {\n        let len = 0;\n        let p1 = null;\n        let p2 = null;\n        let t = 0;\n        switch (cmd) {\n            case 'L':\n                return this.getLineLength(x, y, points[0], points[1]);\n            case 'C':\n                // Approximates by breaking curve into 100 line segments\n                len = 0.0;\n                p1 = this.getPointOnCubicBezier(0, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);\n                for (t = 0.01; t <= 1; t += 0.01) {\n                    p2 = this.getPointOnCubicBezier(t, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);\n                    len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n                    p1 = p2;\n                }\n                return len;\n            case 'Q':\n                // Approximates by breaking curve into 100 line segments\n                len = 0.0;\n                p1 = this.getPointOnQuadraticBezier(0, x, y, points[0], points[1], points[2], points[3]);\n                for (t = 0.01; t <= 1; t += 0.01) {\n                    p2 = this.getPointOnQuadraticBezier(t, x, y, points[0], points[1], points[2], points[3]);\n                    len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n                    p1 = p2;\n                }\n                return len;\n            case 'A':\n                // Approximates by breaking curve into line segments\n                len = 0.0;\n                const start = points[4];\n                // 4 = theta\n                const dTheta = points[5];\n                // 5 = dTheta\n                const end = points[4] + dTheta;\n                let inc = Math.PI / 180.0;\n                // 1 degree resolution\n                if (Math.abs(start - end) < inc) {\n                    inc = Math.abs(start - end);\n                }\n                // Note: for purpose of calculating arc length, not going to worry about rotating X-axis by angle psi\n                p1 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], start, 0);\n                if (dTheta < 0) { // clockwise\n                    for (t = start - inc; t > end; t -= inc) {\n                        p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);\n                        len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n                        p1 = p2;\n                    }\n                }\n                else { // counter-clockwise\n                    for (t = start + inc; t < end; t += inc) {\n                        p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);\n                        len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n                        p1 = p2;\n                    }\n                }\n                p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], end, 0);\n                len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n                return len;\n        }\n        return 0;\n    }\n    getPointOnLine(dist, P1x, P1y, P2x, P2y, fromX = P1x, fromY = P1y) {\n        const m = (P2y - P1y) / ((P2x - P1x) + PSEUDO_ZERO);\n        let run = Math.sqrt(dist * dist / (1 + m * m));\n        if (P2x < P1x) {\n            run *= -1;\n        }\n        let rise = m * run;\n        let pt = null;\n        if (P2x === P1x) { // vertical line\n            pt = {\n                x: fromX,\n                y: fromY + rise\n            };\n        }\n        else if ((fromY - P1y) / ((fromX - P1x) + PSEUDO_ZERO) === m) {\n            pt = {\n                x: fromX + run,\n                y: fromY + rise\n            };\n        }\n        else {\n            let ix = 0;\n            let iy = 0;\n            const len = this.getLineLength(P1x, P1y, P2x, P2y);\n            if (len < PSEUDO_ZERO) {\n                return null;\n            }\n            let u = (((fromX - P1x) * (P2x - P1x))\n                + ((fromY - P1y) * (P2y - P1y)));\n            u = u / (len * len);\n            ix = P1x + u * (P2x - P1x);\n            iy = P1y + u * (P2y - P1y);\n            const pRise = this.getLineLength(fromX, fromY, ix, iy);\n            const pRun = Math.sqrt(dist * dist - pRise * pRise);\n            run = Math.sqrt(pRun * pRun / (1 + m * m));\n            if (P2x < P1x) {\n                run *= -1;\n            }\n            rise = m * run;\n            pt = {\n                x: ix + run,\n                y: iy + rise\n            };\n        }\n        return pt;\n    }\n    getPointOnPath(distance) {\n        const fullLen = this.getPathLength();\n        let cumulativePathLength = 0;\n        let p = null;\n        if (distance < -0.00005\n            || distance - 0.00005 > fullLen) {\n            return null;\n        }\n        const { dataArray } = this;\n        for (const pathCmd of dataArray) {\n            if (pathCmd\n                && (pathCmd.pathLength < 0.00005\n                    || cumulativePathLength + pathCmd.pathLength + 0.00005 < distance)) {\n                cumulativePathLength += pathCmd.pathLength;\n                continue;\n            }\n            const delta = distance - cumulativePathLength;\n            let currentT = 0;\n            switch (pathCmd.command) {\n                case 'L':\n                    p = this.getPointOnLine(delta, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.start.x, pathCmd.start.y);\n                    break;\n                case 'A':\n                    const start = pathCmd.points[4];\n                    // 4 = theta\n                    const dTheta = pathCmd.points[5];\n                    // 5 = dTheta\n                    const end = pathCmd.points[4] + dTheta;\n                    currentT = start + delta / pathCmd.pathLength * dTheta;\n                    if (dTheta < 0 && currentT < end\n                        || dTheta >= 0 && currentT > end) {\n                        break;\n                    }\n                    p = this.getPointOnEllipticalArc(pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3], currentT, pathCmd.points[6]);\n                    break;\n                case 'C':\n                    currentT = delta / pathCmd.pathLength;\n                    if (currentT > 1) {\n                        currentT = 1;\n                    }\n                    p = this.getPointOnCubicBezier(currentT, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3], pathCmd.points[4], pathCmd.points[5]);\n                    break;\n                case 'Q':\n                    currentT = delta / pathCmd.pathLength;\n                    if (currentT > 1) {\n                        currentT = 1;\n                    }\n                    p = this.getPointOnQuadraticBezier(currentT, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3]);\n                    break;\n            }\n            if (p) {\n                return p;\n            }\n            break;\n        }\n        return null;\n    }\n    getLineLength(x1, y1, x2, y2) {\n        return Math.sqrt((x2 - x1) * (x2 - x1)\n            + (y2 - y1) * (y2 - y1));\n    }\n    getPathLength() {\n        if (this.pathLength === -1) {\n            this.pathLength = this.dataArray.reduce((length, command) => (command.pathLength > 0\n                ? length + command.pathLength\n                : length), 0);\n        }\n        return this.pathLength;\n    }\n    getPointOnCubicBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y, P4x, P4y) {\n        const x = P4x * CB1(pct) + P3x * CB2(pct) + P2x * CB3(pct) + P1x * CB4(pct);\n        const y = P4y * CB1(pct) + P3y * CB2(pct) + P2y * CB3(pct) + P1y * CB4(pct);\n        return {\n            x,\n            y\n        };\n    }\n    getPointOnQuadraticBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y) {\n        const x = P3x * QB1(pct) + P2x * QB2(pct) + P1x * QB3(pct);\n        const y = P3y * QB1(pct) + P2y * QB2(pct) + P1y * QB3(pct);\n        return {\n            x,\n            y\n        };\n    }\n    getPointOnEllipticalArc(cx, cy, rx, ry, theta, psi) {\n        const cosPsi = Math.cos(psi);\n        const sinPsi = Math.sin(psi);\n        const pt = {\n            x: rx * Math.cos(theta),\n            y: ry * Math.sin(theta)\n        };\n        return {\n            x: cx + (pt.x * cosPsi - pt.y * sinPsi),\n            y: cy + (pt.x * sinPsi + pt.y * cosPsi)\n        };\n    }\n    // TODO need some optimisations. possibly build cache only for curved segments?\n    buildEquidistantCache(inputStep, inputPrecision) {\n        const fullLen = this.getPathLength();\n        const precision = inputPrecision || 0.25; // accuracy vs performance\n        const step = inputStep || fullLen / 100;\n        if (!this.equidistantCache\n            || this.equidistantCache.step !== step\n            || this.equidistantCache.precision !== precision) {\n            // Prepare cache\n            this.equidistantCache = {\n                step,\n                precision,\n                points: []\n            };\n            // Calculate points\n            let s = 0;\n            for (let l = 0; l <= fullLen; l += precision) {\n                const p0 = this.getPointOnPath(l);\n                const p1 = this.getPointOnPath(l + precision);\n                if (!p0 || !p1) {\n                    continue;\n                }\n                s += this.getLineLength(p0.x, p0.y, p1.x, p1.y);\n                if (s >= step) {\n                    this.equidistantCache.points.push({\n                        x: p0.x,\n                        y: p0.y,\n                        distance: l\n                    });\n                    s -= step;\n                }\n            }\n        }\n    }\n    getEquidistantPointOnPath(targetDistance, step, precision) {\n        this.buildEquidistantCache(step, precision);\n        if (targetDistance < 0\n            || targetDistance - this.getPathLength() > 0.00005) {\n            return null;\n        }\n        const idx = Math.round(targetDistance\n            / this.getPathLength()\n            * (this.equidistantCache.points.length - 1));\n        return this.equidistantCache.points[idx] || null;\n    }\n}\n\nclass ImageElement extends RenderedElement {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'image';\n        this.loaded = false;\n        const href = this.getHrefAttribute().getString();\n        if (!href) {\n            return;\n        }\n        const isSvg = /\\.svg$/.test(href);\n        document.images.push(this);\n        if (!isSvg) {\n            this.loadImage(href);\n        }\n        else {\n            this.loadSvg(href);\n        }\n        this.isSvg = isSvg;\n    }\n    async loadImage(href) {\n        try {\n            const image = await this.document.createImage(href);\n            this.image = image;\n        }\n        catch (err) {\n            // tslint:disable-next-line: no-console\n            console.error(`ERROR: image \"${href}\" not found`, err);\n        }\n        this.loaded = true;\n    }\n    async loadSvg(href) {\n        try {\n            const response = await this.document.fetch(href);\n            const svg = await response.text();\n            this.image = svg;\n        }\n        catch (err) {\n            // tslint:disable-next-line: no-console\n            console.error(`ERROR: image \"${href}\" not found`, err);\n        }\n        this.loaded = true;\n    }\n    renderChildren(ctx) {\n        const { document } = this;\n        const x = this.getAttribute('x').getPixels('x');\n        const y = this.getAttribute('y').getPixels('y');\n        const width = this.getAttribute('width').getPixels('x');\n        const height = this.getAttribute('height').getPixels('y');\n        if (!width || !height) {\n            return;\n        }\n        ctx.save();\n        if (this.isSvg) {\n            document.canvg.forkString(ctx, this.image, {\n                ignoreMouse: true,\n                ignoreAnimation: true,\n                ignoreDimensions: true,\n                ignoreClear: true,\n                offsetX: x,\n                offsetY: y,\n                scaleWidth: width,\n                scaleHeight: height\n            }).render();\n        }\n        else {\n            const image = this.image;\n            ctx.translate(x, y);\n            document.setViewBox({\n                ctx,\n                aspectRatio: this.getAttribute('preserveAspectRatio').getString(),\n                width,\n                desiredWidth: image.width,\n                height,\n                desiredHeight: image.height\n            });\n            if (this.loaded) {\n                if (typeof image.complete === 'undefined' || image.complete) {\n                    ctx.drawImage(image, 0, 0);\n                }\n            }\n        }\n        ctx.restore();\n    }\n    getBoundingBox() {\n        const x = this.getAttribute('x').getPixels('x');\n        const y = this.getAttribute('y').getPixels('y');\n        const width = this.getAttribute('width').getPixels('x');\n        const height = this.getAttribute('height').getPixels('y');\n        return new BoundingBox(x, y, x + width, y + height);\n    }\n}\n\nclass SymbolElement extends RenderedElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'symbol';\n    }\n    render(_) {\n        // NO RENDER\n    }\n}\n\nclass SVGFontLoader {\n    constructor(document) {\n        this.document = document;\n        this.loaded = false;\n        document.fonts.push(this);\n    }\n    async load(fontFamily, url) {\n        try {\n            const { document } = this;\n            const svgDocument = await document.canvg.parser.load(url);\n            const fonts = svgDocument.getElementsByTagName('font');\n            Array.from(fonts).forEach((fontNode) => {\n                const font = document.createElement(fontNode);\n                document.definitions[fontFamily] = font;\n            });\n        }\n        catch (err) {\n            // tslint:disable-next-line: no-console\n            console.error(`ERROR: font \"${url}\" not found`, err);\n        }\n        this.loaded = true;\n    }\n}\n\nclass StyleElement extends Element {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'style';\n        const css = compressSpaces(Array.from(node.childNodes)\n            .map((_) => _.data)\n            .join('')\n            .replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*\\/]|[\\r\\n])))*\\*+\\/)|(^[\\s]*\\/\\/.*)/gm, '') // remove comments;\n        );\n        const cssDefs = css.split('}');\n        cssDefs.forEach((_) => {\n            const def = _.trim();\n            if (!def) {\n                return;\n            }\n            const cssParts = def.split('{');\n            const cssClasses = cssParts[0].split(',');\n            const cssProps = cssParts[1].split(';');\n            cssClasses.forEach((_) => {\n                const cssClass = _.trim();\n                if (!cssClass) {\n                    return;\n                }\n                const props = document.styles[cssClass] || {};\n                cssProps.forEach((cssProp) => {\n                    const prop = cssProp.indexOf(':');\n                    const name = cssProp.substr(0, prop).trim();\n                    const value = cssProp.substr(prop + 1, cssProp.length - prop).trim();\n                    if (name && value) {\n                        props[name] = new Property(document, name, value);\n                    }\n                });\n                document.styles[cssClass] = props;\n                document.stylesSpecificity[cssClass] = getSelectorSpecificity(cssClass);\n                if (cssClass === '@font-face') { //  && !nodeEnv\n                    const fontFamily = props['font-family'].getString().replace(/\"|'/g, '');\n                    const srcs = props.src.getString().split(',');\n                    srcs.forEach((src) => {\n                        if (src.indexOf('format(\"svg\")') > 0) {\n                            const url = parseExternalUrl(src);\n                            if (url) {\n                                new SVGFontLoader(document).load(fontFamily, url);\n                            }\n                        }\n                    });\n                }\n            });\n        });\n    }\n}\nStyleElement.parseExternalUrl = parseExternalUrl;\n\nclass UseElement extends RenderedElement {\n    constructor() {\n        super(...arguments);\n        this.type = 'use';\n    }\n    setContext(ctx) {\n        super.setContext(ctx);\n        const xAttr = this.getAttribute('x');\n        const yAttr = this.getAttribute('y');\n        if (xAttr.hasValue()) {\n            ctx.translate(xAttr.getPixels('x'), 0);\n        }\n        if (yAttr.hasValue()) {\n            ctx.translate(0, yAttr.getPixels('y'));\n        }\n    }\n    path(ctx) {\n        const { element } = this;\n        if (element) {\n            element.path(ctx);\n        }\n    }\n    renderChildren(ctx) {\n        const { document, element } = this;\n        if (element) {\n            let tempSvg = element;\n            if (element.type === 'symbol') {\n                // render me using a temporary svg element in symbol cases (http://www.w3.org/TR/SVG/struct.html#UseElement)\n                tempSvg = new SVGElement(document, null);\n                tempSvg.attributes.viewBox = new Property(document, 'viewBox', element.getAttribute('viewBox').getString());\n                tempSvg.attributes.preserveAspectRatio = new Property(document, 'preserveAspectRatio', element.getAttribute('preserveAspectRatio').getString());\n                tempSvg.attributes.overflow = new Property(document, 'overflow', element.getAttribute('overflow').getString());\n                tempSvg.children = element.children;\n            }\n            if (tempSvg.type === 'svg') {\n                const widthAttr = this.getAttribute('width');\n                const heightAttr = this.getAttribute('height');\n                // if symbol or svg, inherit width/height from me\n                if (widthAttr.hasValue()) {\n                    tempSvg.attributes.width = new Property(document, 'width', this.getAttribute('width').getString());\n                }\n                if (heightAttr.hasValue()) {\n                    tempSvg.attributes.height = new Property(document, 'height', heightAttr.getString());\n                }\n            }\n            const oldParent = tempSvg.parent;\n            tempSvg.parent = null;\n            tempSvg.render(ctx);\n            tempSvg.parent = oldParent;\n        }\n    }\n    getBoundingBox(ctx) {\n        const { element } = this;\n        if (element) {\n            return element.getBoundingBox(ctx);\n        }\n        return null;\n    }\n    elementTransform() {\n        const { document, element } = this;\n        return Transform.fromElement(document, element);\n    }\n    get element() {\n        if (!this._element) {\n            this._element = this.getHrefAttribute().getDefinition();\n        }\n        return this._element;\n    }\n}\n\nfunction imGet(img, x, y, width, _, rgba) {\n    return img[y * width * 4 + x * 4 + rgba];\n}\nfunction imSet(img, x, y, width, _, rgba, val) {\n    img[y * width * 4 + x * 4 + rgba] = val;\n}\nfunction m(matrix, i, v) {\n    const mi = matrix[i];\n    return mi * (mi < 0 ? v - 255 : v);\n}\nfunction c(a, m1, m2, m3) {\n    return m1 + Math.cos(a) * m2 + Math.sin(a) * m3;\n}\nclass FeColorMatrixElement extends Element {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'feColorMatrix';\n        let matrix = toNumbers(this.getAttribute('values').getString());\n        switch (this.getAttribute('type').getString('matrix')) { // http://www.w3.org/TR/SVG/filters.html#feColorMatrixElement\n            case 'saturate': {\n                const s = matrix[0];\n                matrix = [\n                    0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s, 0, 0,\n                    0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s, 0, 0,\n                    0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s, 0, 0,\n                    0, 0, 0, 1, 0,\n                    0, 0, 0, 0, 1\n                ];\n                break;\n            }\n            case 'hueRotate': {\n                const a = matrix[0] * Math.PI / 180.0;\n                matrix = [\n                    c(a, 0.213, 0.787, -0.213), c(a, 0.715, -0.715, -0.715), c(a, 0.072, -0.072, 0.928), 0, 0,\n                    c(a, 0.213, -0.213, 0.143), c(a, 0.715, 0.285, 0.140), c(a, 0.072, -0.072, -0.283), 0, 0,\n                    c(a, 0.213, -0.213, -0.787), c(a, 0.715, -0.715, 0.715), c(a, 0.072, 0.928, 0.072), 0, 0,\n                    0, 0, 0, 1, 0,\n                    0, 0, 0, 0, 1\n                ];\n                break;\n            }\n            case 'luminanceToAlpha':\n                matrix = [\n                    0, 0, 0, 0, 0,\n                    0, 0, 0, 0, 0,\n                    0, 0, 0, 0, 0,\n                    0.2125, 0.7154, 0.0721, 0, 0,\n                    0, 0, 0, 0, 1\n                ];\n                break;\n        }\n        this.matrix = matrix;\n        this.includeOpacity = this.getAttribute('includeOpacity').hasValue();\n    }\n    apply(ctx, _, __, width, height) {\n        // assuming x==0 && y==0 for now\n        const { includeOpacity, matrix } = this;\n        const srcData = ctx.getImageData(0, 0, width, height);\n        for (let y = 0; y < height; y++) {\n            for (let x = 0; x < width; x++) {\n                const r = imGet(srcData.data, x, y, width, height, 0);\n                const g = imGet(srcData.data, x, y, width, height, 1);\n                const b = imGet(srcData.data, x, y, width, height, 2);\n                const a = imGet(srcData.data, x, y, width, height, 3);\n                let nr = m(matrix, 0, r) + m(matrix, 1, g) + m(matrix, 2, b) + m(matrix, 3, a) + m(matrix, 4, 1);\n                let ng = m(matrix, 5, r) + m(matrix, 6, g) + m(matrix, 7, b) + m(matrix, 8, a) + m(matrix, 9, 1);\n                let nb = m(matrix, 10, r) + m(matrix, 11, g) + m(matrix, 12, b) + m(matrix, 13, a) + m(matrix, 14, 1);\n                let na = m(matrix, 15, r) + m(matrix, 16, g) + m(matrix, 17, b) + m(matrix, 18, a) + m(matrix, 19, 1);\n                if (includeOpacity) {\n                    nr = ng = nb = 0;\n                    na *= a / 255;\n                }\n                imSet(srcData.data, x, y, width, height, 0, nr);\n                imSet(srcData.data, x, y, width, height, 1, ng);\n                imSet(srcData.data, x, y, width, height, 2, nb);\n                imSet(srcData.data, x, y, width, height, 3, na);\n            }\n        }\n        ctx.clearRect(0, 0, width, height);\n        ctx.putImageData(srcData, 0, 0);\n    }\n}\n\nclass MaskElement extends Element {\n    constructor() {\n        super(...arguments);\n        this.type = 'mask';\n    }\n    apply(ctx, element) {\n        const { document } = this;\n        // render as temp svg\n        let x = this.getAttribute('x').getPixels('x');\n        let y = this.getAttribute('y').getPixels('y');\n        let width = this.getAttribute('width').getPixels('x');\n        let height = this.getAttribute('height').getPixels('y');\n        if (!width && !height) {\n            const boundingBox = new BoundingBox();\n            this.children.forEach((child) => {\n                boundingBox.addBoundingBox(child.getBoundingBox(ctx));\n            });\n            x = Math.floor(boundingBox.x1);\n            y = Math.floor(boundingBox.y1);\n            width = Math.floor(boundingBox.width);\n            height = Math.floor(boundingBox.height);\n        }\n        // temporarily remove mask to avoid recursion\n        const mask = element.getStyle('mask').getString();\n        element.getStyle('mask').setValue('');\n        const cMask = document.createCanvas(x + width, y + height);\n        const maskCtx = cMask.getContext('2d');\n        document.screen.setDefaults(maskCtx);\n        this.renderChildren(maskCtx);\n        // convert mask to alpha with a fake node\n        // TODO: refactor out apply from feColorMatrix\n        const cm = new FeColorMatrixElement(document, {\n            nodeType: 1,\n            childNodes: [],\n            attributes: [\n                { nodeName: 'type', value: 'luminanceToAlpha' },\n                { nodeName: 'includeOpacity', value: 'true' }\n            ]\n        });\n        cm.apply(maskCtx, 0, 0, x + width, y + height);\n        const c = document.createCanvas(x + width, y + height);\n        const tempCtx = c.getContext('2d');\n        document.screen.setDefaults(tempCtx);\n        element.render(tempCtx);\n        tempCtx.globalCompositeOperation = 'destination-in';\n        tempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');\n        tempCtx.fillRect(0, 0, x + width, y + height);\n        ctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');\n        ctx.fillRect(0, 0, x + width, y + height);\n        // reassign mask\n        element.getStyle('mask').setValue(mask);\n    }\n    render(_) {\n        // NO RENDER\n    }\n}\n\nconst noop = () => { };\nclass ClipPathElement extends Element {\n    constructor() {\n        super(...arguments);\n        this.type = 'clipPath';\n    }\n    apply(ctx) {\n        const { document } = this;\n        const contextProto = Reflect.getPrototypeOf(ctx);\n        const { beginPath, closePath } = ctx;\n        if (contextProto) {\n            contextProto.beginPath = noop;\n            contextProto.closePath = noop;\n        }\n        Reflect.apply(beginPath, ctx, []);\n        this.children.forEach((child) => {\n            if (typeof child.path === 'undefined') {\n                return;\n            }\n            let transform = typeof child.elementTransform !== 'undefined'\n                ? child.elementTransform()\n                : null; // handle <use />\n            if (!transform) {\n                transform = Transform.fromElement(document, child);\n            }\n            if (transform) {\n                transform.apply(ctx);\n            }\n            child.path(ctx);\n            if (contextProto) {\n                contextProto.closePath = closePath;\n            }\n            if (transform) {\n                transform.unapply(ctx);\n            }\n        });\n        Reflect.apply(closePath, ctx, []);\n        ctx.clip();\n        if (contextProto) {\n            contextProto.beginPath = beginPath;\n            contextProto.closePath = closePath;\n        }\n    }\n    render(_) {\n        // NO RENDER\n    }\n}\n\nclass FilterElement extends Element {\n    constructor() {\n        super(...arguments);\n        this.type = 'filter';\n    }\n    apply(ctx, element) {\n        // render as temp svg\n        const { document } = this;\n        const boundingBox = element.getBoundingBox(ctx);\n        const x = Math.floor(boundingBox.x1);\n        const y = Math.floor(boundingBox.y1);\n        const width = Math.floor(boundingBox.width);\n        const height = Math.floor(boundingBox.height);\n        // temporarily remove filter to avoid recursion\n        const filter = element.getStyle('filter').getString();\n        element.getStyle('filter').setValue('');\n        let px = 0;\n        let py = 0;\n        this.children.forEach((child) => {\n            const efd = child.extraFilterDistance || 0;\n            px = Math.max(px, efd);\n            py = Math.max(py, efd);\n        });\n        const tmpCanvas = document.createCanvas(width + 2 * px, height + 2 * py);\n        const tmpCtx = tmpCanvas.getContext('2d');\n        document.screen.setDefaults(tmpCtx);\n        tmpCtx.translate(-x + px, -y + py);\n        element.render(tmpCtx);\n        // apply filters\n        this.children.forEach((child) => {\n            if (typeof child.apply === 'function') {\n                child.apply(tmpCtx, 0, 0, width + 2 * px, height + 2 * py);\n            }\n        });\n        // render on me\n        ctx.drawImage(tmpCanvas, 0, 0, width + 2 * px, height + 2 * py, x - px, y - py, width + 2 * px, height + 2 * py);\n        // reassign filter\n        element.getStyle('filter', true).setValue(filter);\n    }\n    render(_) {\n        // NO RENDER\n    }\n}\n\nclass FeDropShadowElement extends Element {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'feDropShadow';\n        this.addStylesFromStyleDefinition();\n    }\n    apply(_, __, ___, ____, _____) {\n        // TODO: implement\n    }\n}\n\nclass FeMorphologyElement extends Element {\n    constructor() {\n        super(...arguments);\n        this.type = 'feMorphology';\n    }\n    apply(_, __, ___, ____, _____) {\n        // TODO: implement\n    }\n}\n\nclass FeCompositeElement extends Element {\n    constructor() {\n        super(...arguments);\n        this.type = 'feComposite';\n    }\n    apply(_, __, ___, ____, _____) {\n        // TODO: implement\n    }\n}\n\nclass FeGaussianBlurElement extends Element {\n    constructor(document, node, captureTextNodes) {\n        super(document, node, captureTextNodes);\n        this.type = 'feGaussianBlur';\n        this.blurRadius = Math.floor(this.getAttribute('stdDeviation').getNumber());\n        this.extraFilterDistance = this.blurRadius;\n    }\n    apply(ctx, x, y, width, height) {\n        const { document, blurRadius } = this;\n        const body = document.window\n            ? document.window.document.body\n            : null;\n        const canvas = ctx.canvas;\n        // StackBlur requires canvas be on document\n        canvas.id = document.getUniqueId();\n        if (body) {\n            canvas.style.display = 'none';\n            body.appendChild(canvas);\n        }\n        canvasRGBA(canvas, x, y, width, height, blurRadius);\n        if (body) {\n            body.removeChild(canvas);\n        }\n    }\n}\n\nclass TitleElement extends Element {\n    constructor() {\n        super(...arguments);\n        this.type = 'title';\n    }\n}\n\nclass DescElement extends Element {\n    constructor() {\n        super(...arguments);\n        this.type = 'desc';\n    }\n}\n\nvar elementTypes = {\n    'svg': SVGElement,\n    'rect': RectElement,\n    'circle': CircleElement,\n    'ellipse': EllipseElement,\n    'line': LineElement,\n    'polyline': PolylineElement,\n    'polygon': PolygonElement,\n    'path': PathElement,\n    'pattern': PatternElement,\n    'marker': MarkerElement,\n    'defs': DefsElement,\n    'linearGradient': LinearGradientElement,\n    'radialGradient': RadialGradientElement,\n    'stop': StopElement,\n    'animate': AnimateElement,\n    'animateColor': AnimateColorElement,\n    'animateTransform': AnimateTransformElement,\n    'font': FontElement,\n    'font-face': FontFaceElement,\n    'missing-glyph': MissingGlyphElement,\n    'glyph': GlyphElement,\n    'text': TextElement,\n    'tspan': TSpanElement,\n    'tref': TRefElement,\n    'a': AElement,\n    'textPath': TextPathElement,\n    'image': ImageElement,\n    'g': GElement,\n    'symbol': SymbolElement,\n    'style': StyleElement,\n    'use': UseElement,\n    'mask': MaskElement,\n    'clipPath': ClipPathElement,\n    'filter': FilterElement,\n    'feDropShadow': FeDropShadowElement,\n    'feMorphology': FeMorphologyElement,\n    'feComposite': FeCompositeElement,\n    'feColorMatrix': FeColorMatrixElement,\n    'feGaussianBlur': FeGaussianBlurElement,\n    'title': TitleElement,\n    'desc': DescElement\n};\n\nfunction createCanvas(width, height) {\n    const canvas = document.createElement('canvas');\n    canvas.width = width;\n    canvas.height = height;\n    return canvas;\n}\nasync function createImage(src) {\n    const image = document.createElement('img');\n    // image.crossOrigin = 'Anonymous';\n    return new Promise((resolve, reject) => {\n        image.onload = () => {\n            resolve(image);\n        };\n        image.onerror = () => {\n            reject();\n        };\n        image.src = src;\n    });\n}\nclass Document {\n    constructor(canvg, { rootEmSize = 12, emSize = 12, createCanvas = Document.createCanvas, createImage = Document.createImage } = {}) {\n        this.canvg = canvg;\n        this.definitions = {};\n        this.styles = {};\n        this.stylesSpecificity = {};\n        this.images = [];\n        this.fonts = [];\n        this.emSizeStack = [];\n        this.uniqueId = 0;\n        this.screen = canvg.screen;\n        this.rootEmSize = rootEmSize;\n        this.emSize = emSize;\n        this.createCanvas = createCanvas;\n        this.createImage = createImage;\n        this.screen.wait(this.isImagesLoaded.bind(this));\n        this.screen.wait(this.isFontsLoaded.bind(this));\n    }\n    get window() {\n        return this.screen.window;\n    }\n    get fetch() {\n        return this.screen.fetch;\n    }\n    get ctx() {\n        return this.screen.ctx;\n    }\n    get emSize() {\n        const { emSizeStack } = this;\n        return emSizeStack[emSizeStack.length - 1];\n    }\n    set emSize(value) {\n        const { emSizeStack } = this;\n        emSizeStack.push(value);\n    }\n    popEmSize() {\n        const { emSizeStack } = this;\n        emSizeStack.pop();\n    }\n    getUniqueId() {\n        return `canvg${++this.uniqueId}`;\n    }\n    isImagesLoaded() {\n        return this.images.every(_ => _.loaded);\n    }\n    isFontsLoaded() {\n        return this.fonts.every(_ => _.loaded);\n    }\n    createDocumentElement(document) {\n        const documentElement = this.createElement(document.documentElement);\n        documentElement.root = true;\n        documentElement.addStylesFromStyleDefinition();\n        this.documentElement = documentElement;\n        return documentElement;\n    }\n    createElement(node) {\n        const elementType = node.nodeName.replace(/^[^:]+:/, '');\n        const ElementType = Document.elementTypes[elementType];\n        if (typeof ElementType !== 'undefined') {\n            return new ElementType(this, node);\n        }\n        return new UnknownElement(this, node);\n    }\n    createTextNode(node) {\n        return new TextNode(this, node);\n    }\n    setViewBox(config) {\n        this.screen.setViewBox({\n            document: this,\n            ...config\n        });\n    }\n}\nDocument.createCanvas = createCanvas;\nDocument.createImage = createImage;\nDocument.elementTypes = elementTypes;\n\n/**\n * SVG renderer on canvas.\n */\nclass Canvg {\n    /**\n     * Main constructor.\n     * @param ctx - Rendering context.\n     * @param svg - SVG Document.\n     * @param options - Rendering options.\n     */\n    constructor(ctx, svg, options = {}) {\n        this.parser = new Parser(options);\n        this.screen = new Screen(ctx, options);\n        this.options = options;\n        const document = new Document(this, options);\n        const documentElement = document.createDocumentElement(svg);\n        this.document = document;\n        this.documentElement = documentElement;\n    }\n    /**\n     * Create Canvg isntance from SVG source string or URL.\n     * @param ctx - Rendering context.\n     * @param svg - SVG source string or URL.\n     * @param options - Rendering options.\n     */\n    static async from(ctx, svg, options = {}) {\n        const parser = new Parser(options);\n        const svgDocument = await parser.parse(svg);\n        return new Canvg(ctx, svgDocument, options);\n    }\n    /**\n     * Create Canvg isntance from SVG source string.\n     * @param ctx - Rendering context.\n     * @param svg - SVG source string.\n     * @param options - Rendering options.\n     */\n    static fromString(ctx, svg, options = {}) {\n        const parser = new Parser(options);\n        const svgDocument = parser.parseFromString(svg);\n        return new Canvg(ctx, svgDocument, options);\n    }\n    /**\n     * Create new Canvg instance with inherited options.\n     * @param ctx - Rendering context.\n     * @param svg - SVG source string or URL.\n     * @param options - Rendering options.\n     */\n    fork(ctx, svg, options = {}) {\n        return Canvg.from(ctx, svg, {\n            ...this.options,\n            ...options\n        });\n    }\n    /**\n     * Create new Canvg instance with inherited options.\n     * @param ctx - Rendering context.\n     * @param svg - SVG source string.\n     * @param options - Rendering options.\n     */\n    forkString(ctx, svg, options = {}) {\n        return Canvg.fromString(ctx, svg, {\n            ...this.options,\n            ...options\n        });\n    }\n    /**\n     * Document is ready promise.\n     */\n    ready() {\n        return this.screen.ready();\n    }\n    /**\n     * Document is ready value.\n     */\n    isReady() {\n        return this.screen.isReady();\n    }\n    /**\n     * Render only first frame, ignoring animations and mouse.\n     * @param options - Rendering options.\n     */\n    async render(options = {}) {\n        this.start({\n            enableRedraw: true,\n            ignoreAnimation: true,\n            ignoreMouse: true,\n            ...options\n        });\n        await this.ready();\n        this.stop();\n    }\n    /**\n     * Start rendering.\n     * @param options - Render options.\n     */\n    start(options = {}) {\n        const { documentElement, screen, options: baseOptions } = this;\n        screen.start(documentElement, {\n            enableRedraw: true,\n            ...baseOptions,\n            ...options\n        });\n    }\n    /**\n     * Stop rendering.\n     */\n    stop() {\n        this.screen.stop();\n    }\n    /**\n     * Resize SVG to fit in given size.\n     * @param width\n     * @param height\n     * @param preserveAspectRatio\n     */\n    resize(width, height = width, preserveAspectRatio = false) {\n        this.documentElement.resize(width, height, preserveAspectRatio);\n    }\n}\n\n/**\n * Options preset for `OffscreenCanvas`.\n */\nfunction offscreen() {\n    return {\n        window: null,\n        ignoreAnimation: true,\n        ignoreMouse: true,\n        createCanvas(width, height) {\n            return new OffscreenCanvas(width, height);\n        },\n        async createImage(url) {\n            const response = await fetch(url);\n            const blob = await response.blob();\n            const img = await createImageBitmap(blob);\n            return img;\n        }\n    };\n}\n\n/**\n * Options preset for `node-canvas`.\n * @param config - Preset requirements.\n * @param config.DOMParser - XML/HTML parser from string into DOM Document.\n * @param config.canvas - `node-canvas` exports.\n * @param config.fetch - WHATWG-compatible `fetch` function.\n */\nfunction node({ DOMParser, canvas, fetch }) {\n    return {\n        window: null,\n        ignoreAnimation: true,\n        ignoreMouse: true,\n        DOMParser,\n        fetch,\n        createCanvas: canvas.createCanvas,\n        createImage: canvas.loadImage\n    };\n}\n\n\n\nvar index = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\toffscreen: offscreen,\n\tnode: node\n});\n\nexport default Canvg;\nexport { AElement, AnimateColorElement, AnimateElement, AnimateTransformElement, BoundingBox, CB1, CB2, CB3, CB4, Canvg, CircleElement, ClipPathElement, DefsElement, DescElement, Document, Element, EllipseElement, FeColorMatrixElement, FeCompositeElement, FeDropShadowElement, FeGaussianBlurElement, FeMorphologyElement, FilterElement, Font, FontElement, FontFaceElement, GElement, GlyphElement, GradientElement, ImageElement, LineElement, LinearGradientElement, MarkerElement, MaskElement, Matrix, MissingGlyphElement, Mouse, PSEUDO_ZERO, Parser, PathElement, PathParser, PatternElement, Point, PolygonElement, PolylineElement, Property, QB1, QB2, QB3, RadialGradientElement, RectElement, RenderedElement, Rotate, SVGElement, SVGFontLoader, Scale, Screen, Skew, SkewX, SkewY, StopElement, StyleElement, SymbolElement, TRefElement, TSpanElement, TextElement, TextPathElement, TitleElement, Transform, Translate, UnknownElement, UseElement, ViewPort, compressSpaces, getSelectorSpecificity, normalizeAttributeName, parseExternalUrl, index as presets, toNumbers, trimLeft, trimRight, vectorMagnitude, vectorsAngle, vectorsRatio };\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguYmFiZWwuanMiLCJzb3VyY2VzIjpbXSwic291cmNlc0NvbnRlbnQiOltdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/canvg/index.es.js",
    "content": "import 'core-js/modules/es.array.map';\nimport 'core-js/modules/es.regexp.exec';\nimport 'core-js/modules/es.string.match';\nimport 'core-js/modules/es.string.replace';\nimport 'core-js/modules/es.array.join';\nimport _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport 'core-js/modules/es.symbol';\nimport 'core-js/modules/es.array.filter';\nimport 'core-js/modules/es.array.for-each';\nimport 'core-js/modules/es.object.get-own-property-descriptor';\nimport 'core-js/modules/es.object.get-own-property-descriptors';\nimport 'core-js/modules/es.object.keys';\nimport 'core-js/modules/web.dom-collections.for-each';\nimport _regeneratorRuntime from '@babel/runtime/regenerator';\nimport _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _classCallCheck from '@babel/runtime/helpers/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/createClass';\nimport 'core-js/modules/es.array.concat';\nimport 'core-js/modules/es.array.every';\nimport 'core-js/modules/es.array.reduce';\nimport 'core-js/modules/es.object.to-string';\nimport 'core-js/modules/es.promise';\nimport 'core-js/modules/es.string.split';\nimport requestAnimationFrame from 'raf';\nimport 'core-js/modules/es.function.name';\nimport RGBColor from 'rgbcolor';\nimport 'core-js/modules/es.reflect.construct';\nimport 'core-js/modules/es.regexp.to-string';\nimport _inherits from '@babel/runtime/helpers/inherits';\nimport _possibleConstructorReturn from '@babel/runtime/helpers/possibleConstructorReturn';\nimport _getPrototypeOf from '@babel/runtime/helpers/getPrototypeOf';\nimport 'core-js/modules/es.array.from';\nimport 'core-js/modules/es.array.includes';\nimport 'core-js/modules/es.array.some';\nimport 'core-js/modules/es.string.includes';\nimport 'core-js/modules/es.string.iterator';\nimport 'core-js/modules/es.string.trim';\nimport 'core-js/modules/es.array.index-of';\nimport 'core-js/modules/es.array.reverse';\nimport _get from '@babel/runtime/helpers/get';\nimport 'core-js/modules/es.number.constructor';\nimport 'core-js/modules/es.array.fill';\nimport 'core-js/modules/es.reflect.delete-property';\nimport _assertThisInitialized from '@babel/runtime/helpers/assertThisInitialized';\nimport 'core-js/modules/es.array.iterator';\nimport 'core-js/modules/web.dom-collections.iterator';\nimport 'core-js/modules/es.symbol.description';\nimport 'core-js/modules/es.symbol.iterator';\nimport 'core-js/modules/es.array.slice';\nimport 'core-js/modules/es.map';\nimport 'core-js/modules/es.reflect.apply';\nimport 'core-js/modules/es.reflect.get-prototype-of';\nimport { canvasRGBA } from 'stackblur-canvas';\n\n/**\n * HTML-safe compress white-spaces.\n * @param str - String to compress.\n */\nfunction compressSpaces(str) {\n  return str.replace(/(?!\\u3000)\\s+/gm, ' ');\n}\n/**\n * HTML-safe left trim.\n * @param str - String to trim.\n */\n\nfunction trimLeft(str) {\n  return str.replace(/^[\\n \\t]+/, '');\n}\n/**\n * HTML-safe right trim.\n * @param str - String to trim.\n */\n\nfunction trimRight(str) {\n  return str.replace(/[\\n \\t]+$/, '');\n}\n/**\n * String to numbers array.\n * @param str - Numbers string.\n */\n\nfunction toNumbers(str) {\n  var matches = (str || '').match(/-?(\\d+(?:\\.\\d*(?:[eE][+-]?\\d+)?)?|\\.\\d+)(?=\\D|$)/gm) || [];\n  return matches.map(parseFloat);\n} // Microsoft Edge fix\n\nvar allUppercase = /^[A-Z-]+$/;\n/**\n * Normalize attribute name.\n * @param name - Attribute name.\n */\n\nfunction normalizeAttributeName(name) {\n  if (allUppercase.test(name)) {\n    return name.toLowerCase();\n  }\n\n  return name;\n}\n/**\n * Parse external URL.\n * @param url - CSS url string.\n */\n\nfunction parseExternalUrl(url) {\n  //                                   single quotes [2]\n  //                                   v           double quotes [3]\n  //                                   v           v        no quotes [4]\n  //                                   v           v        v\n  var urlMatch = url.match(/url\\(('([^']+)'|\"([^\"]+)\"|([^'\"\\)]+))\\)/) || [];\n  return urlMatch[2] || urlMatch[3] || urlMatch[4];\n}\n\n// slightly modified version of https://github.com/keeganstreet/specificity/blob/master/specificity.js\nvar attributeRegex = /(\\[[^\\]]+\\])/g;\nvar idRegex = /(#[^\\s\\+>~\\.\\[:]+)/g;\nvar classRegex = /(\\.[^\\s\\+>~\\.\\[:]+)/g;\nvar pseudoElementRegex = /(::[^\\s\\+>~\\.\\[:]+|:first-line|:first-letter|:before|:after)/gi;\nvar pseudoClassWithBracketsRegex = /(:[\\w-]+\\([^\\)]*\\))/gi;\nvar pseudoClassRegex = /(:[^\\s\\+>~\\.\\[:]+)/g;\nvar elementRegex = /([^\\s\\+>~\\.\\[:]+)/g;\n\nfunction findSelectorMatch(selector, regex) {\n  var matches = selector.match(regex);\n\n  if (!matches) {\n    return [selector, 0];\n  }\n\n  return [selector.replace(regex, ' '), matches.length];\n}\n/**\n * Measure selector specificity.\n * @param selector - Selector to measure.\n */\n\n\nfunction getSelectorSpecificity(selector) {\n  var specificity = [0, 0, 0];\n  var currentSelector = selector.replace(/:not\\(([^\\)]*)\\)/g, '     $1 ').replace(/{[\\s\\S]*/gm, ' ');\n  var delta = 0;\n\n  var _findSelectorMatch = findSelectorMatch(currentSelector, attributeRegex);\n\n  var _findSelectorMatch2 = _slicedToArray(_findSelectorMatch, 2);\n\n  currentSelector = _findSelectorMatch2[0];\n  delta = _findSelectorMatch2[1];\n  specificity[1] += delta;\n\n  var _findSelectorMatch3 = findSelectorMatch(currentSelector, idRegex);\n\n  var _findSelectorMatch4 = _slicedToArray(_findSelectorMatch3, 2);\n\n  currentSelector = _findSelectorMatch4[0];\n  delta = _findSelectorMatch4[1];\n  specificity[0] += delta;\n\n  var _findSelectorMatch5 = findSelectorMatch(currentSelector, classRegex);\n\n  var _findSelectorMatch6 = _slicedToArray(_findSelectorMatch5, 2);\n\n  currentSelector = _findSelectorMatch6[0];\n  delta = _findSelectorMatch6[1];\n  specificity[1] += delta;\n\n  var _findSelectorMatch7 = findSelectorMatch(currentSelector, pseudoElementRegex);\n\n  var _findSelectorMatch8 = _slicedToArray(_findSelectorMatch7, 2);\n\n  currentSelector = _findSelectorMatch8[0];\n  delta = _findSelectorMatch8[1];\n  specificity[2] += delta;\n\n  var _findSelectorMatch9 = findSelectorMatch(currentSelector, pseudoClassWithBracketsRegex);\n\n  var _findSelectorMatch10 = _slicedToArray(_findSelectorMatch9, 2);\n\n  currentSelector = _findSelectorMatch10[0];\n  delta = _findSelectorMatch10[1];\n  specificity[1] += delta;\n\n  var _findSelectorMatch11 = findSelectorMatch(currentSelector, pseudoClassRegex);\n\n  var _findSelectorMatch12 = _slicedToArray(_findSelectorMatch11, 2);\n\n  currentSelector = _findSelectorMatch12[0];\n  delta = _findSelectorMatch12[1];\n  specificity[1] += delta;\n  currentSelector = currentSelector.replace(/[\\*\\s\\+>~]/g, ' ').replace(/[#\\.]/g, ' ');\n\n  var _findSelectorMatch13 = findSelectorMatch(currentSelector, elementRegex);\n\n  var _findSelectorMatch14 = _slicedToArray(_findSelectorMatch13, 2);\n\n  currentSelector = _findSelectorMatch14[0];\n  delta = _findSelectorMatch14[1];\n  // lgtm [js/useless-assignment-to-local]\n  specificity[2] += delta;\n  return specificity.join('');\n}\n\nvar PSEUDO_ZERO = .00000001;\n/**\n * Vector magnitude.\n */\n\nfunction vectorMagnitude(v) {\n  return Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2));\n}\n/**\n * Ratio between two vectors.\n */\n\nfunction vectorsRatio(u, v) {\n  return (u[0] * v[0] + u[1] * v[1]) / (vectorMagnitude(u) * vectorMagnitude(v));\n}\n/**\n * Angle between two vectors.\n */\n\nfunction vectorsAngle(u, v) {\n  return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vectorsRatio(u, v));\n}\nfunction CB1(t) {\n  return t * t * t;\n}\nfunction CB2(t) {\n  return 3 * t * t * (1 - t);\n}\nfunction CB3(t) {\n  return 3 * t * (1 - t) * (1 - t);\n}\nfunction CB4(t) {\n  return (1 - t) * (1 - t) * (1 - t);\n}\nfunction QB1(t) {\n  return t * t;\n}\nfunction QB2(t) {\n  return 2 * t * (1 - t);\n}\nfunction QB3(t) {\n  return (1 - t) * (1 - t);\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar runtime_1 = createCommonjsModule(function (module) {\n  /**\n   * Copyright (c) 2014-present, Facebook, Inc.\n   *\n   * This source code is licensed under the MIT license found in the\n   * LICENSE file in the root directory of this source tree.\n   */\n  var runtime = function (exports) {\n\n    var Op = Object.prototype;\n    var hasOwn = Op.hasOwnProperty;\n    var undefined$1; // More compressible than void 0.\n\n    var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n    var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n    var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n    var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n    function wrap(innerFn, outerFn, self, tryLocsList) {\n      // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n      var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n      var generator = Object.create(protoGenerator.prototype);\n      var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,\n      // .throw, and .return methods.\n\n      generator._invoke = makeInvokeMethod(innerFn, self, context);\n      return generator;\n    }\n\n    exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion\n    // record like context.tryEntries[i].completion. This interface could\n    // have been (and was previously) designed to take a closure to be\n    // invoked without arguments, but in all the cases we care about we\n    // already have an existing method we want to call, so there's no need\n    // to create a new function object. We can even get away with assuming\n    // the method takes exactly one argument, since that happens to be true\n    // in every case, so we don't have to touch the arguments object. The\n    // only additional allocation required is the completion record, which\n    // has a stable shape and so hopefully should be cheap to allocate.\n\n    function tryCatch(fn, obj, arg) {\n      try {\n        return {\n          type: \"normal\",\n          arg: fn.call(obj, arg)\n        };\n      } catch (err) {\n        return {\n          type: \"throw\",\n          arg: err\n        };\n      }\n    }\n\n    var GenStateSuspendedStart = \"suspendedStart\";\n    var GenStateSuspendedYield = \"suspendedYield\";\n    var GenStateExecuting = \"executing\";\n    var GenStateCompleted = \"completed\"; // Returning this object from the innerFn has the same effect as\n    // breaking out of the dispatch switch statement.\n\n    var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and\n    // .constructor.prototype properties for functions that return Generator\n    // objects. For full spec compliance, you may wish to configure your\n    // minifier not to mangle the names of these two functions.\n\n    function Generator() {}\n\n    function GeneratorFunction() {}\n\n    function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that\n    // don't natively support it.\n\n\n    var IteratorPrototype = {};\n\n    IteratorPrototype[iteratorSymbol] = function () {\n      return this;\n    };\n\n    var getProto = Object.getPrototypeOf;\n    var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n\n    if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n      // This environment has a native %IteratorPrototype%; use it instead\n      // of the polyfill.\n      IteratorPrototype = NativeIteratorPrototype;\n    }\n\n    var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n    GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n    GeneratorFunctionPrototype.constructor = GeneratorFunction;\n    GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = \"GeneratorFunction\"; // Helper for defining the .next, .throw, and .return methods of the\n    // Iterator interface in terms of a single ._invoke method.\n\n    function defineIteratorMethods(prototype) {\n      [\"next\", \"throw\", \"return\"].forEach(function (method) {\n        prototype[method] = function (arg) {\n          return this._invoke(method, arg);\n        };\n      });\n    }\n\n    exports.isGeneratorFunction = function (genFun) {\n      var ctor = typeof genFun === \"function\" && genFun.constructor;\n      return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can\n      // do is to check its .name property.\n      (ctor.displayName || ctor.name) === \"GeneratorFunction\" : false;\n    };\n\n    exports.mark = function (genFun) {\n      if (Object.setPrototypeOf) {\n        Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n      } else {\n        genFun.__proto__ = GeneratorFunctionPrototype;\n\n        if (!(toStringTagSymbol in genFun)) {\n          genFun[toStringTagSymbol] = \"GeneratorFunction\";\n        }\n      }\n\n      genFun.prototype = Object.create(Gp);\n      return genFun;\n    }; // Within the body of any async function, `await x` is transformed to\n    // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n    // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n    // meant to be awaited.\n\n\n    exports.awrap = function (arg) {\n      return {\n        __await: arg\n      };\n    };\n\n    function AsyncIterator(generator, PromiseImpl) {\n      function invoke(method, arg, resolve, reject) {\n        var record = tryCatch(generator[method], generator, arg);\n\n        if (record.type === \"throw\") {\n          reject(record.arg);\n        } else {\n          var result = record.arg;\n          var value = result.value;\n\n          if (value && typeof value === \"object\" && hasOwn.call(value, \"__await\")) {\n            return PromiseImpl.resolve(value.__await).then(function (value) {\n              invoke(\"next\", value, resolve, reject);\n            }, function (err) {\n              invoke(\"throw\", err, resolve, reject);\n            });\n          }\n\n          return PromiseImpl.resolve(value).then(function (unwrapped) {\n            // When a yielded Promise is resolved, its final value becomes\n            // the .value of the Promise<{value,done}> result for the\n            // current iteration.\n            result.value = unwrapped;\n            resolve(result);\n          }, function (error) {\n            // If a rejected Promise was yielded, throw the rejection back\n            // into the async generator function so it can be handled there.\n            return invoke(\"throw\", error, resolve, reject);\n          });\n        }\n      }\n\n      var previousPromise;\n\n      function enqueue(method, arg) {\n        function callInvokeWithMethodAndArg() {\n          return new PromiseImpl(function (resolve, reject) {\n            invoke(method, arg, resolve, reject);\n          });\n        }\n\n        return previousPromise = // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later\n        // invocations of the iterator.\n        callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n      } // Define the unified helper method that is used to implement .next,\n      // .throw, and .return (see defineIteratorMethods).\n\n\n      this._invoke = enqueue;\n    }\n\n    defineIteratorMethods(AsyncIterator.prototype);\n\n    AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n      return this;\n    };\n\n    exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of\n    // AsyncIterator objects; they just return a Promise for the value of\n    // the final result produced by the iterator.\n\n    exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n      if (PromiseImpl === void 0) PromiseImpl = Promise;\n      var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n      return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function (result) {\n        return result.done ? result.value : iter.next();\n      });\n    };\n\n    function makeInvokeMethod(innerFn, self, context) {\n      var state = GenStateSuspendedStart;\n      return function invoke(method, arg) {\n        if (state === GenStateExecuting) {\n          throw new Error(\"Generator is already running\");\n        }\n\n        if (state === GenStateCompleted) {\n          if (method === \"throw\") {\n            throw arg;\n          } // Be forgiving, per 25.3.3.3.3 of the spec:\n          // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n\n\n          return doneResult();\n        }\n\n        context.method = method;\n        context.arg = arg;\n\n        while (true) {\n          var delegate = context.delegate;\n\n          if (delegate) {\n            var delegateResult = maybeInvokeDelegate(delegate, context);\n\n            if (delegateResult) {\n              if (delegateResult === ContinueSentinel) continue;\n              return delegateResult;\n            }\n          }\n\n          if (context.method === \"next\") {\n            // Setting context._sent for legacy support of Babel's\n            // function.sent implementation.\n            context.sent = context._sent = context.arg;\n          } else if (context.method === \"throw\") {\n            if (state === GenStateSuspendedStart) {\n              state = GenStateCompleted;\n              throw context.arg;\n            }\n\n            context.dispatchException(context.arg);\n          } else if (context.method === \"return\") {\n            context.abrupt(\"return\", context.arg);\n          }\n\n          state = GenStateExecuting;\n          var record = tryCatch(innerFn, self, context);\n\n          if (record.type === \"normal\") {\n            // If an exception is thrown from innerFn, we leave state ===\n            // GenStateExecuting and loop back for another invocation.\n            state = context.done ? GenStateCompleted : GenStateSuspendedYield;\n\n            if (record.arg === ContinueSentinel) {\n              continue;\n            }\n\n            return {\n              value: record.arg,\n              done: context.done\n            };\n          } else if (record.type === \"throw\") {\n            state = GenStateCompleted; // Dispatch the exception by looping back around to the\n            // context.dispatchException(context.arg) call above.\n\n            context.method = \"throw\";\n            context.arg = record.arg;\n          }\n        }\n      };\n    } // Call delegate.iterator[context.method](context.arg) and handle the\n    // result, either by returning a { value, done } result from the\n    // delegate iterator, or by modifying context.method and context.arg,\n    // setting context.delegate to null, and returning the ContinueSentinel.\n\n\n    function maybeInvokeDelegate(delegate, context) {\n      var method = delegate.iterator[context.method];\n\n      if (method === undefined$1) {\n        // A .throw or .return when the delegate iterator has no .throw\n        // method always terminates the yield* loop.\n        context.delegate = null;\n\n        if (context.method === \"throw\") {\n          // Note: [\"return\"] must be used for ES3 parsing compatibility.\n          if (delegate.iterator[\"return\"]) {\n            // If the delegate iterator has a return method, give it a\n            // chance to clean up.\n            context.method = \"return\";\n            context.arg = undefined$1;\n            maybeInvokeDelegate(delegate, context);\n\n            if (context.method === \"throw\") {\n              // If maybeInvokeDelegate(context) changed context.method from\n              // \"return\" to \"throw\", let that override the TypeError below.\n              return ContinueSentinel;\n            }\n          }\n\n          context.method = \"throw\";\n          context.arg = new TypeError(\"The iterator does not provide a 'throw' method\");\n        }\n\n        return ContinueSentinel;\n      }\n\n      var record = tryCatch(method, delegate.iterator, context.arg);\n\n      if (record.type === \"throw\") {\n        context.method = \"throw\";\n        context.arg = record.arg;\n        context.delegate = null;\n        return ContinueSentinel;\n      }\n\n      var info = record.arg;\n\n      if (!info) {\n        context.method = \"throw\";\n        context.arg = new TypeError(\"iterator result is not an object\");\n        context.delegate = null;\n        return ContinueSentinel;\n      }\n\n      if (info.done) {\n        // Assign the result of the finished delegate to the temporary\n        // variable specified by delegate.resultName (see delegateYield).\n        context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).\n\n        context.next = delegate.nextLoc; // If context.method was \"throw\" but the delegate handled the\n        // exception, let the outer generator proceed normally. If\n        // context.method was \"next\", forget context.arg since it has been\n        // \"consumed\" by the delegate iterator. If context.method was\n        // \"return\", allow the original .return call to continue in the\n        // outer generator.\n\n        if (context.method !== \"return\") {\n          context.method = \"next\";\n          context.arg = undefined$1;\n        }\n      } else {\n        // Re-yield the result returned by the delegate method.\n        return info;\n      } // The delegate iterator is finished, so forget it and continue with\n      // the outer generator.\n\n\n      context.delegate = null;\n      return ContinueSentinel;\n    } // Define Generator.prototype.{next,throw,return} in terms of the\n    // unified ._invoke helper method.\n\n\n    defineIteratorMethods(Gp);\n    Gp[toStringTagSymbol] = \"Generator\"; // A Generator should always return itself as the iterator object when the\n    // @@iterator function is called on it. Some browsers' implementations of the\n    // iterator prototype chain incorrectly implement this, causing the Generator\n    // object to not be returned from this call. This ensures that doesn't happen.\n    // See https://github.com/facebook/regenerator/issues/274 for more details.\n\n    Gp[iteratorSymbol] = function () {\n      return this;\n    };\n\n    Gp.toString = function () {\n      return \"[object Generator]\";\n    };\n\n    function pushTryEntry(locs) {\n      var entry = {\n        tryLoc: locs[0]\n      };\n\n      if (1 in locs) {\n        entry.catchLoc = locs[1];\n      }\n\n      if (2 in locs) {\n        entry.finallyLoc = locs[2];\n        entry.afterLoc = locs[3];\n      }\n\n      this.tryEntries.push(entry);\n    }\n\n    function resetTryEntry(entry) {\n      var record = entry.completion || {};\n      record.type = \"normal\";\n      delete record.arg;\n      entry.completion = record;\n    }\n\n    function Context(tryLocsList) {\n      // The root entry object (effectively a try statement without a catch\n      // or a finally block) gives us a place to store values thrown from\n      // locations where there is no enclosing try statement.\n      this.tryEntries = [{\n        tryLoc: \"root\"\n      }];\n      tryLocsList.forEach(pushTryEntry, this);\n      this.reset(true);\n    }\n\n    exports.keys = function (object) {\n      var keys = [];\n\n      for (var key in object) {\n        keys.push(key);\n      }\n\n      keys.reverse(); // Rather than returning an object with a next method, we keep\n      // things simple and return the next function itself.\n\n      return function next() {\n        while (keys.length) {\n          var key = keys.pop();\n\n          if (key in object) {\n            next.value = key;\n            next.done = false;\n            return next;\n          }\n        } // To avoid creating an additional object, we just hang the .value\n        // and .done properties off the next function object itself. This\n        // also ensures that the minifier will not anonymize the function.\n\n\n        next.done = true;\n        return next;\n      };\n    };\n\n    function values(iterable) {\n      if (iterable) {\n        var iteratorMethod = iterable[iteratorSymbol];\n\n        if (iteratorMethod) {\n          return iteratorMethod.call(iterable);\n        }\n\n        if (typeof iterable.next === \"function\") {\n          return iterable;\n        }\n\n        if (!isNaN(iterable.length)) {\n          var i = -1,\n              next = function next() {\n            while (++i < iterable.length) {\n              if (hasOwn.call(iterable, i)) {\n                next.value = iterable[i];\n                next.done = false;\n                return next;\n              }\n            }\n\n            next.value = undefined$1;\n            next.done = true;\n            return next;\n          };\n\n          return next.next = next;\n        }\n      } // Return an iterator with no values.\n\n\n      return {\n        next: doneResult\n      };\n    }\n\n    exports.values = values;\n\n    function doneResult() {\n      return {\n        value: undefined$1,\n        done: true\n      };\n    }\n\n    Context.prototype = {\n      constructor: Context,\n      reset: function (skipTempReset) {\n        this.prev = 0;\n        this.next = 0; // Resetting context._sent for legacy support of Babel's\n        // function.sent implementation.\n\n        this.sent = this._sent = undefined$1;\n        this.done = false;\n        this.delegate = null;\n        this.method = \"next\";\n        this.arg = undefined$1;\n        this.tryEntries.forEach(resetTryEntry);\n\n        if (!skipTempReset) {\n          for (var name in this) {\n            // Not sure about the optimal order of these conditions:\n            if (name.charAt(0) === \"t\" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {\n              this[name] = undefined$1;\n            }\n          }\n        }\n      },\n      stop: function () {\n        this.done = true;\n        var rootEntry = this.tryEntries[0];\n        var rootRecord = rootEntry.completion;\n\n        if (rootRecord.type === \"throw\") {\n          throw rootRecord.arg;\n        }\n\n        return this.rval;\n      },\n      dispatchException: function (exception) {\n        if (this.done) {\n          throw exception;\n        }\n\n        var context = this;\n\n        function handle(loc, caught) {\n          record.type = \"throw\";\n          record.arg = exception;\n          context.next = loc;\n\n          if (caught) {\n            // If the dispatched exception was caught by a catch block,\n            // then let that catch block handle the exception normally.\n            context.method = \"next\";\n            context.arg = undefined$1;\n          }\n\n          return !!caught;\n        }\n\n        for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n          var entry = this.tryEntries[i];\n          var record = entry.completion;\n\n          if (entry.tryLoc === \"root\") {\n            // Exception thrown outside of any try block that could handle\n            // it, so set the completion value of the entire function to\n            // throw the exception.\n            return handle(\"end\");\n          }\n\n          if (entry.tryLoc <= this.prev) {\n            var hasCatch = hasOwn.call(entry, \"catchLoc\");\n            var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n            if (hasCatch && hasFinally) {\n              if (this.prev < entry.catchLoc) {\n                return handle(entry.catchLoc, true);\n              } else if (this.prev < entry.finallyLoc) {\n                return handle(entry.finallyLoc);\n              }\n            } else if (hasCatch) {\n              if (this.prev < entry.catchLoc) {\n                return handle(entry.catchLoc, true);\n              }\n            } else if (hasFinally) {\n              if (this.prev < entry.finallyLoc) {\n                return handle(entry.finallyLoc);\n              }\n            } else {\n              throw new Error(\"try statement without catch or finally\");\n            }\n          }\n        }\n      },\n      abrupt: function (type, arg) {\n        for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n          var entry = this.tryEntries[i];\n\n          if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n            var finallyEntry = entry;\n            break;\n          }\n        }\n\n        if (finallyEntry && (type === \"break\" || type === \"continue\") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {\n          // Ignore the finally entry if control is not jumping to a\n          // location outside the try/catch block.\n          finallyEntry = null;\n        }\n\n        var record = finallyEntry ? finallyEntry.completion : {};\n        record.type = type;\n        record.arg = arg;\n\n        if (finallyEntry) {\n          this.method = \"next\";\n          this.next = finallyEntry.finallyLoc;\n          return ContinueSentinel;\n        }\n\n        return this.complete(record);\n      },\n      complete: function (record, afterLoc) {\n        if (record.type === \"throw\") {\n          throw record.arg;\n        }\n\n        if (record.type === \"break\" || record.type === \"continue\") {\n          this.next = record.arg;\n        } else if (record.type === \"return\") {\n          this.rval = this.arg = record.arg;\n          this.method = \"return\";\n          this.next = \"end\";\n        } else if (record.type === \"normal\" && afterLoc) {\n          this.next = afterLoc;\n        }\n\n        return ContinueSentinel;\n      },\n      finish: function (finallyLoc) {\n        for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n          var entry = this.tryEntries[i];\n\n          if (entry.finallyLoc === finallyLoc) {\n            this.complete(entry.completion, entry.afterLoc);\n            resetTryEntry(entry);\n            return ContinueSentinel;\n          }\n        }\n      },\n      \"catch\": function (tryLoc) {\n        for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n          var entry = this.tryEntries[i];\n\n          if (entry.tryLoc === tryLoc) {\n            var record = entry.completion;\n\n            if (record.type === \"throw\") {\n              var thrown = record.arg;\n              resetTryEntry(entry);\n            }\n\n            return thrown;\n          }\n        } // The context.catch method must only be called with a location\n        // argument that corresponds to a known catch block.\n\n\n        throw new Error(\"illegal catch attempt\");\n      },\n      delegateYield: function (iterable, resultName, nextLoc) {\n        this.delegate = {\n          iterator: values(iterable),\n          resultName: resultName,\n          nextLoc: nextLoc\n        };\n\n        if (this.method === \"next\") {\n          // Deliberately forget the last sent value so that we don't\n          // accidentally pass it on to the delegate.\n          this.arg = undefined$1;\n        }\n\n        return ContinueSentinel;\n      }\n    }; // Regardless of whether this script is executing as a CommonJS module\n    // or not, return the runtime object so that we can declare the variable\n    // regeneratorRuntime in the outer scope, which allows this module to be\n    // injected easily by `bin/regenerator --include-runtime script.js`.\n\n    return exports;\n  }( // If this script is executing as a CommonJS module, use module.exports\n  // as the regeneratorRuntime namespace. Otherwise create a new empty\n  // object. Either way, the resulting object will be used to initialize\n  // the regeneratorRuntime variable at the top of this file.\n   module.exports );\n\n  try {\n    regeneratorRuntime = runtime;\n  } catch (accidentalStrictMode) {\n    // This module should not be running in strict mode, so the above\n    // assignment should always work unless something is misconfigured. Just\n    // in case runtime.js accidentally runs in strict mode, we can escape\n    // strict mode using a global Function call. This could conceivably fail\n    // if a Content Security Policy forbids using Function, but in that case\n    // the proper solution is to fix the accidental strict mode problem. If\n    // you've misconfigured your bundler to force strict mode and applied a\n    // CSP to forbid Function, and you're not willing to fix either of those\n    // problems, please detail your unique predicament in a GitHub issue.\n    Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n  }\n});\n\nvar Property = /*#__PURE__*/function () {\n  function Property(document, name, value) {\n    _classCallCheck(this, Property);\n\n    this.document = document;\n    this.name = name;\n    this.value = value;\n  }\n\n  _createClass(Property, [{\n    key: \"hasValue\",\n    value: function hasValue() {\n      var value = this.value;\n      return value !== null && value !== '' && value !== 0 && typeof value !== 'undefined';\n    }\n  }, {\n    key: \"isString\",\n    value: function isString(regexp) {\n      var value = this.value;\n      var result = typeof value === 'string';\n\n      if (!result || !regexp) {\n        return result;\n      }\n\n      return regexp.test(value);\n    }\n  }, {\n    key: \"isUrlDefinition\",\n    value: function isUrlDefinition() {\n      return this.isString(/^url\\(/);\n    }\n  }, {\n    key: \"isPixels\",\n    value: function isPixels() {\n      if (!this.hasValue()) {\n        return false;\n      }\n\n      var asString = this.getString();\n\n      switch (true) {\n        case /px$/.test(asString):\n        case /^[0-9]+$/.test(asString):\n          return true;\n\n        default:\n          return false;\n      }\n    }\n  }, {\n    key: \"setValue\",\n    value: function setValue(value) {\n      this.value = value;\n      return this;\n    }\n  }, {\n    key: \"getValue\",\n    value: function getValue(def) {\n      if (typeof def === 'undefined' || this.hasValue()) {\n        return this.value;\n      }\n\n      return def;\n    }\n  }, {\n    key: \"getNumber\",\n    value: function getNumber(def) {\n      if (!this.hasValue()) {\n        if (typeof def === 'undefined') {\n          return 0;\n        }\n\n        return parseFloat(def);\n      }\n\n      var value = this.value;\n      var n = parseFloat(value);\n\n      if (this.isString(/%$/)) {\n        n = n / 100.0;\n      }\n\n      return n;\n    }\n  }, {\n    key: \"getString\",\n    value: function getString(def) {\n      if (typeof def === 'undefined' || this.hasValue()) {\n        return typeof this.value === 'undefined' ? '' : String(this.value);\n      }\n\n      return String(def);\n    }\n  }, {\n    key: \"getDpi\",\n    value: function getDpi() {\n      return 96.0; // TODO: compute?\n    }\n  }, {\n    key: \"getRem\",\n    value: function getRem() {\n      return this.document.rootEmSize;\n    }\n  }, {\n    key: \"getEm\",\n    value: function getEm() {\n      return this.document.emSize;\n    }\n  }, {\n    key: \"getUnits\",\n    value: function getUnits() {\n      return this.getString().replace(/[0-9\\.\\-]/g, '');\n    }\n  }, {\n    key: \"getPixels\",\n    value: function getPixels(axisOrIsFontSize) {\n      var processPercent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (!this.hasValue()) {\n        return 0;\n      }\n\n      var _ref = typeof axisOrIsFontSize === 'boolean' ? [undefined, axisOrIsFontSize] : [axisOrIsFontSize],\n          _ref2 = _slicedToArray(_ref, 2),\n          axis = _ref2[0],\n          isFontSize = _ref2[1];\n\n      var viewPort = this.document.screen.viewPort;\n\n      switch (true) {\n        case this.isString(/vmin$/):\n          return this.getNumber() / 100.0 * Math.min(viewPort.computeSize('x'), viewPort.computeSize('y'));\n\n        case this.isString(/vmax$/):\n          return this.getNumber() / 100.0 * Math.max(viewPort.computeSize('x'), viewPort.computeSize('y'));\n\n        case this.isString(/vw$/):\n          return this.getNumber() / 100.0 * viewPort.computeSize('x');\n\n        case this.isString(/vh$/):\n          return this.getNumber() / 100.0 * viewPort.computeSize('y');\n\n        case this.isString(/rem$/):\n          return this.getNumber() * this.getRem();\n\n        case this.isString(/em$/):\n          return this.getNumber() * this.getEm();\n\n        case this.isString(/ex$/):\n          return this.getNumber() * this.getEm() / 2.0;\n\n        case this.isString(/px$/):\n          return this.getNumber();\n\n        case this.isString(/pt$/):\n          return this.getNumber() * this.getDpi() * (1.0 / 72.0);\n\n        case this.isString(/pc$/):\n          return this.getNumber() * 15;\n\n        case this.isString(/cm$/):\n          return this.getNumber() * this.getDpi() / 2.54;\n\n        case this.isString(/mm$/):\n          return this.getNumber() * this.getDpi() / 25.4;\n\n        case this.isString(/in$/):\n          return this.getNumber() * this.getDpi();\n\n        case this.isString(/%$/) && isFontSize:\n          return this.getNumber() * this.getEm();\n\n        case this.isString(/%$/):\n          return this.getNumber() * viewPort.computeSize(axis);\n\n        default:\n          {\n            var n = this.getNumber();\n\n            if (processPercent && n < 1.0) {\n              return n * viewPort.computeSize(axis);\n            }\n\n            return n;\n          }\n      }\n    }\n  }, {\n    key: \"getMilliseconds\",\n    value: function getMilliseconds() {\n      if (!this.hasValue()) {\n        return 0;\n      }\n\n      if (this.isString(/ms$/)) {\n        return this.getNumber();\n      }\n\n      return this.getNumber() * 1000;\n    }\n  }, {\n    key: \"getRadians\",\n    value: function getRadians() {\n      if (!this.hasValue()) {\n        return 0;\n      }\n\n      switch (true) {\n        case this.isString(/deg$/):\n          return this.getNumber() * (Math.PI / 180.0);\n\n        case this.isString(/grad$/):\n          return this.getNumber() * (Math.PI / 200.0);\n\n        case this.isString(/rad$/):\n          return this.getNumber();\n\n        default:\n          return this.getNumber() * (Math.PI / 180.0);\n      }\n    }\n  }, {\n    key: \"getDefinition\",\n    value: function getDefinition() {\n      var asString = this.getString();\n      var name = asString.match(/#([^\\)'\"]+)/);\n\n      if (name) {\n        name = name[1];\n      }\n\n      if (!name) {\n        name = asString;\n      }\n\n      return this.document.definitions[name];\n    }\n  }, {\n    key: \"getFillStyleDefinition\",\n    value: function getFillStyleDefinition(element, opacity) {\n      var def = this.getDefinition();\n\n      if (!def) {\n        return null;\n      } // gradient\n\n\n      if (typeof def.createGradient === 'function') {\n        return def.createGradient(this.document.ctx, element, opacity);\n      } // pattern\n\n\n      if (typeof def.createPattern === 'function') {\n        if (def.getHrefAttribute().hasValue()) {\n          var patternTransform = def.getAttribute('patternTransform');\n          def = def.getHrefAttribute().getDefinition();\n\n          if (patternTransform.hasValue()) {\n            def.getAttribute('patternTransform', true).setValue(patternTransform.value);\n          }\n        }\n\n        return def.createPattern(this.document.ctx, element, opacity);\n      }\n\n      return null;\n    }\n  }, {\n    key: \"getTextBaseline\",\n    value: function getTextBaseline() {\n      if (!this.hasValue()) {\n        return null;\n      }\n\n      return Property.textBaselineMapping[this.getString()];\n    }\n  }, {\n    key: \"addOpacity\",\n    value: function addOpacity(opacity) {\n      var value = this.value;\n      var len = value.length;\n      var commas = 0; // Simulate old RGBColor version, which can't parse rgba.\n\n      for (var i = 0; i < len; i++) {\n        if (value[i] === ',') {\n          commas++;\n        }\n\n        if (commas === 3) {\n          break;\n        }\n      }\n\n      if (opacity.hasValue() && this.isString() && commas !== 3) {\n        var color = new RGBColor(value);\n\n        if (color.ok) {\n          value = \"rgba(\".concat(color.r, \", \").concat(color.g, \", \").concat(color.b, \", \").concat(opacity.getNumber(), \")\");\n        }\n      }\n\n      return new Property(this.document, this.name, value);\n    }\n  }], [{\n    key: \"empty\",\n    value: function empty(document) {\n      return new Property(document, 'EMPTY', '');\n    }\n  }]);\n\n  return Property;\n}();\nProperty.textBaselineMapping = {\n  'baseline': 'alphabetic',\n  'before-edge': 'top',\n  'text-before-edge': 'top',\n  'middle': 'middle',\n  'central': 'middle',\n  'after-edge': 'bottom',\n  'text-after-edge': 'bottom',\n  'ideographic': 'ideographic',\n  'alphabetic': 'alphabetic',\n  'hanging': 'hanging',\n  'mathematical': 'alphabetic'\n};\n\nvar ViewPort = /*#__PURE__*/function () {\n  function ViewPort() {\n    _classCallCheck(this, ViewPort);\n\n    this.viewPorts = [];\n  }\n\n  _createClass(ViewPort, [{\n    key: \"clear\",\n    value: function clear() {\n      this.viewPorts = [];\n    }\n  }, {\n    key: \"setCurrent\",\n    value: function setCurrent(width, height) {\n      this.viewPorts.push({\n        width: width,\n        height: height\n      });\n    }\n  }, {\n    key: \"removeCurrent\",\n    value: function removeCurrent() {\n      this.viewPorts.pop();\n    }\n  }, {\n    key: \"getCurrent\",\n    value: function getCurrent() {\n      var viewPorts = this.viewPorts;\n      return viewPorts[viewPorts.length - 1];\n    }\n  }, {\n    key: \"computeSize\",\n    value: function computeSize(d) {\n      if (typeof d === 'number') {\n        return d;\n      }\n\n      if (d === 'x') {\n        return this.width;\n      }\n\n      if (d === 'y') {\n        return this.height;\n      }\n\n      return Math.sqrt(Math.pow(this.width, 2) + Math.pow(this.height, 2)) / Math.sqrt(2);\n    }\n  }, {\n    key: \"width\",\n    get: function get() {\n      return this.getCurrent().width;\n    }\n  }, {\n    key: \"height\",\n    get: function get() {\n      return this.getCurrent().height;\n    }\n  }]);\n\n  return ViewPort;\n}();\n\nvar Point = /*#__PURE__*/function () {\n  function Point(x, y) {\n    _classCallCheck(this, Point);\n\n    this.x = x;\n    this.y = y;\n  }\n\n  _createClass(Point, [{\n    key: \"angleTo\",\n    value: function angleTo(point) {\n      return Math.atan2(point.y - this.y, point.x - this.x);\n    }\n  }, {\n    key: \"applyTransform\",\n    value: function applyTransform(transform) {\n      var x = this.x,\n          y = this.y;\n      var xp = x * transform[0] + y * transform[2] + transform[4];\n      var yp = x * transform[1] + y * transform[3] + transform[5];\n      this.x = xp;\n      this.y = yp;\n    }\n  }], [{\n    key: \"parse\",\n    value: function parse(point) {\n      var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n      var _toNumbers = toNumbers(point),\n          _toNumbers2 = _slicedToArray(_toNumbers, 2),\n          _toNumbers2$ = _toNumbers2[0],\n          x = _toNumbers2$ === void 0 ? defaultValue : _toNumbers2$,\n          _toNumbers2$2 = _toNumbers2[1],\n          y = _toNumbers2$2 === void 0 ? x : _toNumbers2$2;\n\n      return new Point(x, y);\n    }\n  }, {\n    key: \"parsePath\",\n    value: function parsePath(path) {\n      var points = toNumbers(path);\n      var len = points.length;\n      var pathPoints = [];\n\n      for (var i = 0; i < len; i += 2) {\n        pathPoints.push(new Point(points[i], points[i + 1]));\n      }\n\n      return pathPoints;\n    }\n  }]);\n\n  return Point;\n}();\n\nvar Mouse = /*#__PURE__*/function () {\n  function Mouse(screen) {\n    _classCallCheck(this, Mouse);\n\n    this.screen = screen;\n    this.working = false;\n    this.events = [];\n    this.eventElements = [];\n    this.onClick = this.onClick.bind(this);\n    this.onMouseMove = this.onMouseMove.bind(this);\n  }\n\n  _createClass(Mouse, [{\n    key: \"isWorking\",\n    value: function isWorking() {\n      return this.working;\n    }\n  }, {\n    key: \"start\",\n    value: function start() {\n      if (this.working) {\n        return;\n      }\n\n      var screen = this.screen,\n          onClick = this.onClick,\n          onMouseMove = this.onMouseMove;\n      var canvas = screen.ctx.canvas;\n      canvas.onclick = onClick;\n      canvas.onmousemove = onMouseMove;\n      this.working = true;\n    }\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      if (!this.working) {\n        return;\n      }\n\n      var canvas = this.screen.ctx.canvas;\n      this.working = false;\n      canvas.onclick = null;\n      canvas.onmousemove = null;\n    }\n  }, {\n    key: \"hasEvents\",\n    value: function hasEvents() {\n      return this.working && this.events.length > 0;\n    }\n  }, {\n    key: \"runEvents\",\n    value: function runEvents() {\n      if (!this.working) {\n        return;\n      }\n\n      var document = this.screen,\n          events = this.events,\n          eventElements = this.eventElements;\n      var style = document.ctx.canvas.style;\n\n      if (style) {\n        style.cursor = '';\n      }\n\n      events.forEach(function (_ref, i) {\n        var run = _ref.run;\n        var element = eventElements[i];\n\n        while (element) {\n          run(element);\n          element = element.parent;\n        }\n      }); // done running, clear\n\n      this.events = [];\n      this.eventElements = [];\n    }\n  }, {\n    key: \"checkPath\",\n    value: function checkPath(element, ctx) {\n      if (!this.working || !ctx) {\n        return;\n      }\n\n      var events = this.events,\n          eventElements = this.eventElements;\n      events.forEach(function (_ref2, i) {\n        var x = _ref2.x,\n            y = _ref2.y;\n\n        if (!eventElements[i] && ctx.isPointInPath && ctx.isPointInPath(x, y)) {\n          eventElements[i] = element;\n        }\n      });\n    }\n  }, {\n    key: \"checkBoundingBox\",\n    value: function checkBoundingBox(element, boundingBox) {\n      if (!this.working || !boundingBox) {\n        return;\n      }\n\n      var events = this.events,\n          eventElements = this.eventElements;\n      events.forEach(function (_ref3, i) {\n        var x = _ref3.x,\n            y = _ref3.y;\n\n        if (!eventElements[i] && boundingBox.isPointInBox(x, y)) {\n          eventElements[i] = element;\n        }\n      });\n    }\n  }, {\n    key: \"mapXY\",\n    value: function mapXY(x, y) {\n      var _this$screen = this.screen,\n          window = _this$screen.window,\n          ctx = _this$screen.ctx;\n      var point = new Point(x, y);\n      var element = ctx.canvas;\n\n      while (element) {\n        point.x -= element.offsetLeft;\n        point.y -= element.offsetTop;\n        element = element.offsetParent;\n      }\n\n      if (window.scrollX) {\n        point.x += window.scrollX;\n      }\n\n      if (window.scrollY) {\n        point.y += window.scrollY;\n      }\n\n      return point;\n    }\n  }, {\n    key: \"onClick\",\n    value: function onClick(evt) {\n      var _this$mapXY = this.mapXY((evt || event).clientX, (evt || event).clientY),\n          x = _this$mapXY.x,\n          y = _this$mapXY.y;\n\n      this.events.push({\n        type: 'onclick',\n        x: x,\n        y: y,\n        run: function run(event) {\n          if (event.onClick) {\n            event.onClick();\n          }\n        }\n      });\n    }\n  }, {\n    key: \"onMouseMove\",\n    value: function onMouseMove(evt) {\n      var _this$mapXY2 = this.mapXY((evt || event).clientX, (evt || event).clientY),\n          x = _this$mapXY2.x,\n          y = _this$mapXY2.y;\n\n      this.events.push({\n        type: 'onmousemove',\n        x: x,\n        y: y,\n        run: function run(event) {\n          if (event.onMouseMove) {\n            event.onMouseMove();\n          }\n        }\n      });\n    }\n  }]);\n\n  return Mouse;\n}();\n\nvar defaultWindow = typeof window !== 'undefined' ? window : null;\nvar defaultFetch = typeof fetch !== 'undefined' ? fetch.bind(window) : null;\n\nvar Screen = /*#__PURE__*/function () {\n  function Screen(ctx) {\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n        _ref$fetch = _ref.fetch,\n        fetch = _ref$fetch === void 0 ? defaultFetch : _ref$fetch,\n        _ref$window = _ref.window,\n        window = _ref$window === void 0 ? defaultWindow : _ref$window;\n\n    _classCallCheck(this, Screen);\n\n    this.ctx = ctx;\n    this.FRAMERATE = 30;\n    this.MAX_VIRTUAL_PIXELS = 30000;\n    this.CLIENT_WIDTH = 800;\n    this.CLIENT_HEIGHT = 600;\n    this.viewPort = new ViewPort();\n    this.mouse = new Mouse(this);\n    this.animations = [];\n    this.waits = [];\n    this.frameDuration = 0;\n    this.isReadyLock = false;\n    this.isFirstRender = true;\n    this.intervalId = null;\n    this.window = window;\n    this.fetch = fetch;\n  }\n\n  _createClass(Screen, [{\n    key: \"wait\",\n    value: function wait(checker) {\n      this.waits.push(checker);\n    }\n  }, {\n    key: \"ready\",\n    value: function ready() {\n      if (!this.readyPromise) {\n        return Promise.resolve();\n      }\n\n      return this.readyPromise;\n    }\n  }, {\n    key: \"isReady\",\n    value: function isReady() {\n      if (this.isReadyLock) {\n        return true;\n      }\n\n      var isReadyLock = this.waits.every(function (_) {\n        return _();\n      });\n\n      if (isReadyLock) {\n        this.waits = [];\n\n        if (this.resolveReady) {\n          this.resolveReady();\n        }\n      }\n\n      this.isReadyLock = isReadyLock;\n      return isReadyLock;\n    }\n  }, {\n    key: \"setDefaults\",\n    value: function setDefaults(ctx) {\n      // initial values and defaults\n      ctx.strokeStyle = 'rgba(0,0,0,0)';\n      ctx.lineCap = 'butt';\n      ctx.lineJoin = 'miter';\n      ctx.miterLimit = 4;\n    }\n  }, {\n    key: \"setViewBox\",\n    value: function setViewBox(_ref2) {\n      var document = _ref2.document,\n          ctx = _ref2.ctx,\n          aspectRatio = _ref2.aspectRatio,\n          width = _ref2.width,\n          desiredWidth = _ref2.desiredWidth,\n          height = _ref2.height,\n          desiredHeight = _ref2.desiredHeight,\n          _ref2$minX = _ref2.minX,\n          minX = _ref2$minX === void 0 ? 0 : _ref2$minX,\n          _ref2$minY = _ref2.minY,\n          minY = _ref2$minY === void 0 ? 0 : _ref2$minY,\n          refX = _ref2.refX,\n          refY = _ref2.refY,\n          _ref2$clip = _ref2.clip,\n          clip = _ref2$clip === void 0 ? false : _ref2$clip,\n          _ref2$clipX = _ref2.clipX,\n          clipX = _ref2$clipX === void 0 ? 0 : _ref2$clipX,\n          _ref2$clipY = _ref2.clipY,\n          clipY = _ref2$clipY === void 0 ? 0 : _ref2$clipY;\n      // aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute\n      var cleanAspectRatio = compressSpaces(aspectRatio).replace(/^defer\\s/, ''); // ignore defer\n\n      var _cleanAspectRatio$spl = cleanAspectRatio.split(' '),\n          _cleanAspectRatio$spl2 = _slicedToArray(_cleanAspectRatio$spl, 2),\n          aspectRatioAlign = _cleanAspectRatio$spl2[0],\n          aspectRatioMeetOrSlice = _cleanAspectRatio$spl2[1];\n\n      var align = aspectRatioAlign || 'xMidYMid';\n      var meetOrSlice = aspectRatioMeetOrSlice || 'meet'; // calculate scale\n\n      var scaleX = width / desiredWidth;\n      var scaleY = height / desiredHeight;\n      var scaleMin = Math.min(scaleX, scaleY);\n      var scaleMax = Math.max(scaleX, scaleY);\n      var finalDesiredWidth = desiredWidth;\n      var finalDesiredHeight = desiredHeight;\n\n      if (meetOrSlice === 'meet') {\n        finalDesiredWidth *= scaleMin;\n        finalDesiredHeight *= scaleMin;\n      }\n\n      if (meetOrSlice === 'slice') {\n        finalDesiredWidth *= scaleMax;\n        finalDesiredHeight *= scaleMax;\n      }\n\n      var refXProp = new Property(document, 'refX', refX);\n      var refYProp = new Property(document, 'refY', refY);\n      var hasRefs = refXProp.hasValue() && refYProp.hasValue();\n\n      if (hasRefs) {\n        ctx.translate(-scaleMin * refXProp.getPixels('x'), -scaleMin * refYProp.getPixels('y'));\n      }\n\n      if (clip) {\n        var scaledClipX = scaleMin * clipX;\n        var scaledClipY = scaleMin * clipY;\n        ctx.beginPath();\n        ctx.moveTo(scaledClipX, scaledClipY);\n        ctx.lineTo(width, scaledClipY);\n        ctx.lineTo(width, height);\n        ctx.lineTo(scaledClipX, height);\n        ctx.closePath();\n        ctx.clip();\n      }\n\n      if (!hasRefs) {\n        var isMeetMinY = meetOrSlice === 'meet' && scaleMin === scaleY;\n        var isSliceMaxY = meetOrSlice === 'slice' && scaleMax === scaleY;\n        var isMeetMinX = meetOrSlice === 'meet' && scaleMin === scaleX;\n        var isSliceMaxX = meetOrSlice === 'slice' && scaleMax === scaleX;\n\n        if (/^xMid/.test(align) && (isMeetMinY || isSliceMaxY)) {\n          ctx.translate(width / 2.0 - finalDesiredWidth / 2.0, 0);\n        }\n\n        if (/YMid$/.test(align) && (isMeetMinX || isSliceMaxX)) {\n          ctx.translate(0, height / 2.0 - finalDesiredHeight / 2.0);\n        }\n\n        if (/^xMax/.test(align) && (isMeetMinY || isSliceMaxY)) {\n          ctx.translate(width - finalDesiredWidth, 0);\n        }\n\n        if (/YMax$/.test(align) && (isMeetMinX || isSliceMaxX)) {\n          ctx.translate(0, height - finalDesiredHeight);\n        }\n      } // scale\n\n\n      switch (true) {\n        case align === 'none':\n          ctx.scale(scaleX, scaleY);\n          break;\n\n        case meetOrSlice === 'meet':\n          ctx.scale(scaleMin, scaleMin);\n          break;\n\n        case meetOrSlice === 'slice':\n          ctx.scale(scaleMax, scaleMax);\n          break;\n      } // translate\n\n\n      ctx.translate(-minX, -minY);\n    }\n  }, {\n    key: \"start\",\n    value: function start(element) {\n      var _this = this;\n\n      var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref3$enableRedraw = _ref3.enableRedraw,\n          enableRedraw = _ref3$enableRedraw === void 0 ? false : _ref3$enableRedraw,\n          _ref3$ignoreMouse = _ref3.ignoreMouse,\n          ignoreMouse = _ref3$ignoreMouse === void 0 ? false : _ref3$ignoreMouse,\n          _ref3$ignoreAnimation = _ref3.ignoreAnimation,\n          ignoreAnimation = _ref3$ignoreAnimation === void 0 ? false : _ref3$ignoreAnimation,\n          _ref3$ignoreDimension = _ref3.ignoreDimensions,\n          ignoreDimensions = _ref3$ignoreDimension === void 0 ? false : _ref3$ignoreDimension,\n          _ref3$ignoreClear = _ref3.ignoreClear,\n          ignoreClear = _ref3$ignoreClear === void 0 ? false : _ref3$ignoreClear,\n          forceRedraw = _ref3.forceRedraw,\n          scaleWidth = _ref3.scaleWidth,\n          scaleHeight = _ref3.scaleHeight,\n          offsetX = _ref3.offsetX,\n          offsetY = _ref3.offsetY;\n\n      var FRAMERATE = this.FRAMERATE,\n          mouse = this.mouse;\n      var frameDuration = 1000 / FRAMERATE;\n      this.frameDuration = frameDuration;\n      this.readyPromise = new Promise(function (resolve) {\n        _this.resolveReady = resolve;\n      });\n\n      if (this.isReady()) {\n        this.render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY);\n      }\n\n      if (!enableRedraw) {\n        return;\n      }\n\n      var now = Date.now();\n      var then = now;\n      var delta = 0;\n\n      var tick = function tick() {\n        now = Date.now();\n        delta = now - then;\n\n        if (delta >= frameDuration) {\n          then = now - delta % frameDuration;\n\n          if (_this.shouldUpdate(ignoreAnimation, forceRedraw)) {\n            _this.render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY);\n\n            mouse.runEvents();\n          }\n        }\n\n        _this.intervalId = requestAnimationFrame(tick);\n      };\n\n      if (!ignoreMouse) {\n        mouse.start();\n      }\n\n      this.intervalId = requestAnimationFrame(tick);\n    }\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      if (this.intervalId) {\n        requestAnimationFrame.cancel(this.intervalId);\n        this.intervalId = null;\n      }\n\n      this.mouse.stop();\n    }\n  }, {\n    key: \"shouldUpdate\",\n    value: function shouldUpdate(ignoreAnimation, forceRedraw) {\n      // need update from animations?\n      if (!ignoreAnimation) {\n        var frameDuration = this.frameDuration;\n        var shouldUpdate = this.animations.reduce(function (shouldUpdate, animation) {\n          return animation.update(frameDuration) || shouldUpdate;\n        }, false);\n\n        if (shouldUpdate) {\n          return true;\n        }\n      } // need update from redraw?\n\n\n      if (typeof forceRedraw === 'function' && forceRedraw()) {\n        return true;\n      }\n\n      if (!this.isReadyLock && this.isReady()) {\n        return true;\n      } // need update from mouse events?\n\n\n      if (this.mouse.hasEvents()) {\n        return true;\n      }\n\n      return false;\n    }\n  }, {\n    key: \"render\",\n    value: function render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY) {\n      var CLIENT_WIDTH = this.CLIENT_WIDTH,\n          CLIENT_HEIGHT = this.CLIENT_HEIGHT,\n          viewPort = this.viewPort,\n          ctx = this.ctx,\n          isFirstRender = this.isFirstRender;\n      var canvas = ctx.canvas;\n      viewPort.clear();\n\n      if (canvas.width && canvas.height) {\n        viewPort.setCurrent(canvas.width, canvas.height);\n      } else {\n        viewPort.setCurrent(CLIENT_WIDTH, CLIENT_HEIGHT);\n      }\n\n      var widthStyle = element.getStyle('width');\n      var heightStyle = element.getStyle('height');\n\n      if (!ignoreDimensions && (isFirstRender || typeof scaleWidth !== 'number' && typeof scaleHeight !== 'number')) {\n        // set canvas size\n        if (widthStyle.hasValue()) {\n          canvas.width = widthStyle.getPixels('x');\n\n          if (canvas.style) {\n            canvas.style.width = \"\".concat(canvas.width, \"px\");\n          }\n        }\n\n        if (heightStyle.hasValue()) {\n          canvas.height = heightStyle.getPixels('y');\n\n          if (canvas.style) {\n            canvas.style.height = \"\".concat(canvas.height, \"px\");\n          }\n        }\n      }\n\n      var cWidth = canvas.clientWidth || canvas.width;\n      var cHeight = canvas.clientHeight || canvas.height;\n\n      if (ignoreDimensions && widthStyle.hasValue() && heightStyle.hasValue()) {\n        cWidth = widthStyle.getPixels('x');\n        cHeight = heightStyle.getPixels('y');\n      }\n\n      viewPort.setCurrent(cWidth, cHeight);\n\n      if (typeof offsetX === 'number') {\n        element.getAttribute('x', true).setValue(offsetX);\n      }\n\n      if (typeof offsetY === 'number') {\n        element.getAttribute('y', true).setValue(offsetY);\n      }\n\n      if (typeof scaleWidth === 'number' || typeof scaleHeight === 'number') {\n        var viewBox = toNumbers(element.getAttribute('viewBox').getString());\n        var xRatio = 0;\n        var yRatio = 0;\n\n        if (typeof scaleWidth === 'number') {\n          var widthAttr = element.getAttribute('width');\n\n          if (widthAttr.hasValue()) {\n            xRatio = widthAttr.getPixels('x') / scaleWidth;\n          } else if (!isNaN(viewBox[2])) {\n            xRatio = viewBox[2] / scaleWidth;\n          }\n        }\n\n        if (typeof scaleHeight === 'number') {\n          var heightAttr = element.getAttribute('height');\n\n          if (heightAttr.hasValue()) {\n            yRatio = heightAttr.getPixels('y') / scaleHeight;\n          } else if (!isNaN(viewBox[3])) {\n            yRatio = viewBox[3] / scaleHeight;\n          }\n        }\n\n        if (!xRatio) {\n          xRatio = yRatio;\n        }\n\n        if (!yRatio) {\n          yRatio = xRatio;\n        }\n\n        element.getAttribute('width', true).setValue(scaleWidth);\n        element.getAttribute('height', true).setValue(scaleHeight);\n        var transformStyle = element.getStyle('transform', true, true);\n        transformStyle.setValue(\"\".concat(transformStyle.getString(), \" scale(\").concat(1.0 / xRatio, \", \").concat(1.0 / yRatio, \")\"));\n      } // clear and render\n\n\n      if (!ignoreClear) {\n        ctx.clearRect(0, 0, cWidth, cHeight);\n      }\n\n      element.render(ctx);\n\n      if (isFirstRender) {\n        this.isFirstRender = false;\n      }\n    }\n  }]);\n\n  return Screen;\n}();\nScreen.defaultWindow = defaultWindow;\nScreen.defaultFetch = defaultFetch;\n\nvar defaultFetch$1 = Screen.defaultFetch;\nvar DefaultDOMParser = typeof DOMParser !== 'undefined' ? DOMParser : null;\n\nvar Parser = /*#__PURE__*/function () {\n  // private readonly options: any;\n  function Parser() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        _ref$fetch = _ref.fetch,\n        fetch = _ref$fetch === void 0 ? defaultFetch$1 : _ref$fetch,\n        _ref$DOMParser = _ref.DOMParser,\n        DOMParser = _ref$DOMParser === void 0 ? DefaultDOMParser : _ref$DOMParser;\n\n    _classCallCheck(this, Parser);\n\n    this.fetch = fetch;\n    this.DOMParser = DOMParser; // this.options = options;\n  }\n\n  _createClass(Parser, [{\n    key: \"parse\",\n    value: function () {\n      var _parse = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(resource) {\n        return _regeneratorRuntime.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                if (!/^</.test(resource)) {\n                  _context.next = 2;\n                  break;\n                }\n\n                return _context.abrupt(\"return\", this.parseFromString(resource));\n\n              case 2:\n                return _context.abrupt(\"return\", this.load(resource));\n\n              case 3:\n              case \"end\":\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function parse(_x) {\n        return _parse.apply(this, arguments);\n      }\n\n      return parse;\n    }()\n  }, {\n    key: \"parseFromString\",\n    value: function parseFromString(xml) {\n      try {\n        var parser = new this.DOMParser();\n        return parser.parseFromString(xml, 'image/svg+xml');\n      } catch (err) {\n        var _parser = new this.DOMParser();\n\n        return _parser.parseFromString(xml, 'text/xml');\n      }\n    }\n  }, {\n    key: \"load\",\n    value: function () {\n      var _load = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(url) {\n        var response, xml;\n        return _regeneratorRuntime.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                _context2.next = 2;\n                return this.fetch(url);\n\n              case 2:\n                response = _context2.sent;\n                _context2.next = 5;\n                return response.text();\n\n              case 5:\n                xml = _context2.sent;\n                return _context2.abrupt(\"return\", this.parseFromString(xml));\n\n              case 7:\n              case \"end\":\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function load(_x2) {\n        return _load.apply(this, arguments);\n      }\n\n      return load;\n    }()\n  }]);\n\n  return Parser;\n}();\n\nvar Element = /*#__PURE__*/function () {\n  function Element(document, node) {\n    var _this = this;\n\n    var captureTextNodes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    _classCallCheck(this, Element);\n\n    this.document = document;\n    this.node = node;\n    this.captureTextNodes = captureTextNodes;\n    this.attributes = {};\n    this.styles = {};\n    this.stylesSpecificity = {};\n    this.animationFrozen = false;\n    this.animationFrozenValue = '';\n    this.parent = null;\n    this.children = [];\n\n    if (!node || node.nodeType !== 1) {\n      // ELEMENT_NODE\n      return;\n    } // add attributes\n\n\n    Array.from(node.attributes).forEach(function (attribute) {\n      var nodeName = normalizeAttributeName(attribute.nodeName);\n      _this.attributes[nodeName] = new Property(document, nodeName, attribute.value);\n    });\n    this.addStylesFromStyleDefinition(); // add inline styles\n\n    if (this.getAttribute('style').hasValue()) {\n      var styles = this.getAttribute('style').getString().split(';').map(function (_) {\n        return _.trim();\n      });\n      styles.forEach(function (style) {\n        if (!style) {\n          return;\n        }\n\n        var _style$split = style.split(':'),\n            _style$split2 = _slicedToArray(_style$split, 2),\n            name = _style$split2[0],\n            value = _style$split2[1];\n\n        _this.styles[name] = new Property(document, name.trim(), value.trim());\n      });\n    }\n\n    var definitions = document.definitions;\n    var id = this.getAttribute('id'); // add id\n\n    if (id.hasValue()) {\n      if (!definitions[id.getValue()]) {\n        definitions[id.getValue()] = this;\n      }\n    }\n\n    Array.from(node.childNodes).forEach(function (childNode) {\n      if (childNode.nodeType === 1) {\n        _this.addChild(childNode); // ELEMENT_NODE\n\n      } else if (captureTextNodes && (childNode.nodeType === 3 || childNode.nodeType === 4)) {\n        var textNode = document.createTextNode(childNode);\n\n        if (textNode.getText().length > 0) {\n          _this.addChild(textNode); // TEXT_NODE\n\n        }\n      }\n    });\n  }\n\n  _createClass(Element, [{\n    key: \"getAttribute\",\n    value: function getAttribute(name) {\n      var createIfNotExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      var attr = this.attributes[name];\n\n      if (!attr && createIfNotExists) {\n        var _attr = new Property(this.document, name, '');\n\n        this.attributes[name] = _attr;\n        return _attr;\n      }\n\n      return attr || Property.empty(this.document);\n    }\n  }, {\n    key: \"getHrefAttribute\",\n    value: function getHrefAttribute() {\n      for (var key in this.attributes) {\n        if (key === 'href' || /:href$/.test(key)) {\n          return this.attributes[key];\n        }\n      }\n\n      return Property.empty(this.document);\n    }\n  }, {\n    key: \"getStyle\",\n    value: function getStyle(name) {\n      var createIfNotExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      var skipAncestors = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n      var style = this.styles[name];\n\n      if (style) {\n        return style;\n      }\n\n      var attr = this.getAttribute(name);\n\n      if (attr && attr.hasValue()) {\n        this.styles[name] = attr; // move up to me to cache\n\n        return attr;\n      }\n\n      if (!skipAncestors) {\n        var parent = this.parent;\n\n        if (parent) {\n          var parentStyle = parent.getStyle(name);\n\n          if (parentStyle && parentStyle.hasValue()) {\n            return parentStyle;\n          }\n        }\n      }\n\n      if (createIfNotExists) {\n        var _style = new Property(this.document, name, '');\n\n        this.styles[name] = _style;\n        return _style;\n      }\n\n      return style || Property.empty(this.document);\n    }\n  }, {\n    key: \"render\",\n    value: function render(ctx) {\n      // don't render display=none\n      // don't render visibility=hidden\n      if (this.getStyle('display').getString() === 'none' || this.getStyle('visibility').getString() === 'hidden') {\n        return;\n      }\n\n      ctx.save();\n\n      if (this.getStyle('mask').hasValue()) {\n        // mask\n        var mask = this.getStyle('mask').getDefinition();\n\n        if (mask) {\n          mask.apply(ctx, this);\n        }\n      } else if (this.getStyle('filter').getValue('none') !== 'none') {\n        // filter\n        var filter = this.getStyle('filter').getDefinition();\n\n        if (filter) {\n          filter.apply(ctx, this);\n        }\n      } else {\n        this.setContext(ctx);\n        this.renderChildren(ctx);\n        this.clearContext(ctx);\n      }\n\n      ctx.restore();\n    }\n  }, {\n    key: \"setContext\",\n    value: function setContext(_) {}\n  }, {\n    key: \"clearContext\",\n    value: function clearContext(_) {}\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      this.children.forEach(function (child) {\n        child.render(ctx);\n      });\n    }\n  }, {\n    key: \"addChild\",\n    value: function addChild(childNode) {\n      var child = childNode instanceof Element ? childNode : this.document.createElement(childNode);\n      child.parent = this;\n\n      if (!Element.ignoreChildTypes.includes(child.type)) {\n        this.children.push(child);\n      }\n    }\n  }, {\n    key: \"matchesSelector\",\n    value: function matchesSelector(selector) {\n      var node = this.node;\n\n      if (typeof node.matches === 'function') {\n        return node.matches(selector);\n      }\n\n      var styleClasses = node.getAttribute('class');\n\n      if (!styleClasses || styleClasses === '') {\n        return false;\n      }\n\n      return styleClasses.split(' ').some(function (styleClass) {\n        if (\".\".concat(styleClass) === selector) {\n          return true;\n        }\n      });\n    }\n  }, {\n    key: \"addStylesFromStyleDefinition\",\n    value: function addStylesFromStyleDefinition() {\n      var _this$document = this.document,\n          styles = _this$document.styles,\n          stylesSpecificity = _this$document.stylesSpecificity;\n\n      for (var selector in styles) {\n        if (selector[0] !== '@' && this.matchesSelector(selector)) {\n          var style = styles[selector];\n          var specificity = stylesSpecificity[selector];\n\n          if (style) {\n            for (var name in style) {\n              var existingSpecificity = this.stylesSpecificity[name];\n\n              if (typeof existingSpecificity === 'undefined') {\n                existingSpecificity = '000';\n              }\n\n              if (specificity >= existingSpecificity) {\n                this.styles[name] = style[name];\n                this.stylesSpecificity[name] = specificity;\n              }\n            }\n          }\n        }\n      }\n    }\n  }]);\n\n  return Element;\n}();\nElement.ignoreChildTypes = ['title'];\n\nfunction _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar UnknownElement = /*#__PURE__*/function (_Element) {\n  _inherits(UnknownElement, _Element);\n\n  var _super = _createSuper(UnknownElement);\n\n  function UnknownElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, UnknownElement);\n\n    _this = _super.call(this, document, node, captureTextNodes); // tslint:disable-next-line: no-console\n\n    console.warn(\"Element \".concat(node.nodeName, \" not yet implemented.\"));\n    return _this;\n  }\n\n  return UnknownElement;\n}(Element);\n\nfunction wrapFontFamily(fontFamily) {\n  var trimmed = fontFamily.trim();\n  return /^('|\")/.test(trimmed) ? trimmed : \"\\\"\".concat(trimmed, \"\\\"\");\n}\n\nfunction prepareFontFamily(fontFamily) {\n  return typeof process === 'undefined' ? fontFamily : fontFamily.trim().split(',').map(wrapFontFamily).join(',');\n}\n\nvar Font = /*#__PURE__*/function () {\n  function Font(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) {\n    _classCallCheck(this, Font);\n\n    var inheritFont = inherit ? typeof inherit === 'string' ? Font.parse(inherit) : inherit : {};\n    this.fontFamily = fontFamily || inheritFont.fontFamily;\n    this.fontSize = fontSize || inheritFont.fontSize;\n    this.fontStyle = fontStyle || inheritFont.fontStyle;\n    this.fontWeight = fontWeight || inheritFont.fontWeight;\n    this.fontVariant = fontVariant || inheritFont.fontVariant;\n  }\n\n  _createClass(Font, [{\n    key: \"toString\",\n    value: function toString() {\n      return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, // Wrap fontFamily only on nodejs and only for canvas.ctx\n      prepareFontFamily(this.fontFamily)].join(' ');\n    }\n  }], [{\n    key: \"parse\",\n    value: function parse() {\n      var font = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n      var inherit = arguments.length > 1 ? arguments[1] : undefined;\n      var fontStyle = '';\n      var fontVariant = '';\n      var fontWeight = '';\n      var fontSize = '';\n      var fontFamily = '';\n      var parts = compressSpaces(font).trim().split(' ');\n      var set = {\n        fontSize: false,\n        fontStyle: false,\n        fontWeight: false,\n        fontVariant: false\n      };\n      parts.forEach(function (part) {\n        switch (true) {\n          case !set.fontStyle && Font.styles.includes(part):\n            if (part !== 'inherit') {\n              fontStyle = part;\n            }\n\n            set.fontStyle = true;\n            break;\n\n          case !set.fontVariant && Font.variants.includes(part):\n            if (part !== 'inherit') {\n              fontVariant = part;\n            }\n\n            set.fontStyle = true;\n            set.fontVariant = true;\n            break;\n\n          case !set.fontWeight && Font.weights.includes(part):\n            if (part !== 'inherit') {\n              fontWeight = part;\n            }\n\n            set.fontStyle = true;\n            set.fontVariant = true;\n            set.fontWeight = true;\n            break;\n\n          case !set.fontSize:\n            if (part !== 'inherit') {\n              var _part$split = part.split('/');\n\n              var _part$split2 = _slicedToArray(_part$split, 1);\n\n              fontSize = _part$split2[0];\n            }\n\n            set.fontStyle = true;\n            set.fontVariant = true;\n            set.fontWeight = true;\n            set.fontSize = true;\n            break;\n\n          default:\n            if (part !== 'inherit') {\n              fontFamily += part;\n            }\n\n        }\n      });\n      return new Font(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit);\n    }\n  }]);\n\n  return Font;\n}();\nFont.styles = 'normal|italic|oblique|inherit';\nFont.variants = 'normal|small-caps|inherit';\nFont.weights = 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit';\n\nvar BoundingBox = /*#__PURE__*/function () {\n  function BoundingBox() {\n    var x1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Number.NaN;\n    var y1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.NaN;\n    var x2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Number.NaN;\n    var y2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Number.NaN;\n\n    _classCallCheck(this, BoundingBox);\n\n    this.x1 = x1;\n    this.y1 = y1;\n    this.x2 = x2;\n    this.y2 = y2;\n    this.addPoint(x1, y1);\n    this.addPoint(x2, y2);\n  }\n\n  _createClass(BoundingBox, [{\n    key: \"addPoint\",\n    value: function addPoint(x, y) {\n      if (typeof x !== 'undefined') {\n        if (isNaN(this.x1) || isNaN(this.x2)) {\n          this.x1 = x;\n          this.x2 = x;\n        }\n\n        if (x < this.x1) {\n          this.x1 = x;\n        }\n\n        if (x > this.x2) {\n          this.x2 = x;\n        }\n      }\n\n      if (typeof y !== 'undefined') {\n        if (isNaN(this.y1) || isNaN(this.y2)) {\n          this.y1 = y;\n          this.y2 = y;\n        }\n\n        if (y < this.y1) {\n          this.y1 = y;\n        }\n\n        if (y > this.y2) {\n          this.y2 = y;\n        }\n      }\n    }\n  }, {\n    key: \"addX\",\n    value: function addX(x) {\n      this.addPoint(x, null);\n    }\n  }, {\n    key: \"addY\",\n    value: function addY(y) {\n      this.addPoint(null, y);\n    }\n  }, {\n    key: \"addBoundingBox\",\n    value: function addBoundingBox(_ref) {\n      var x1 = _ref.x1,\n          y1 = _ref.y1,\n          x2 = _ref.x2,\n          y2 = _ref.y2;\n      this.addPoint(x1, y1);\n      this.addPoint(x2, y2);\n    }\n  }, {\n    key: \"sumCubic\",\n    value: function sumCubic(t, p0, p1, p2, p3) {\n      return Math.pow(1 - t, 3) * p0 + 3 * Math.pow(1 - t, 2) * t * p1 + 3 * (1 - t) * Math.pow(t, 2) * p2 + Math.pow(t, 3) * p3;\n    }\n  }, {\n    key: \"bezierCurveAdd\",\n    value: function bezierCurveAdd(forX, p0, p1, p2, p3) {\n      var b = 6 * p0 - 12 * p1 + 6 * p2;\n      var a = -3 * p0 + 9 * p1 - 9 * p2 + 3 * p3;\n      var c = 3 * p1 - 3 * p0;\n\n      if (a === 0) {\n        if (b === 0) {\n          return;\n        }\n\n        var t = -c / b;\n\n        if (0 < t && t < 1) {\n          if (forX) {\n            this.addX(this.sumCubic(t, p0, p1, p2, p3));\n          } else {\n            this.addY(this.sumCubic(t, p0, p1, p2, p3));\n          }\n        }\n\n        return;\n      }\n\n      var b2ac = Math.pow(b, 2) - 4 * c * a;\n\n      if (b2ac < 0) {\n        return;\n      }\n\n      var t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n\n      if (0 < t1 && t1 < 1) {\n        if (forX) {\n          this.addX(this.sumCubic(t1, p0, p1, p2, p3));\n        } else {\n          this.addY(this.sumCubic(t1, p0, p1, p2, p3));\n        }\n      }\n\n      var t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n\n      if (0 < t2 && t2 < 1) {\n        if (forX) {\n          this.addX(this.sumCubic(t2, p0, p1, p2, p3));\n        } else {\n          this.addY(this.sumCubic(t2, p0, p1, p2, p3));\n        }\n      }\n    } // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n\n  }, {\n    key: \"addBezierCurve\",\n    value: function addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n      this.addPoint(p0x, p0y);\n      this.addPoint(p3x, p3y);\n      this.bezierCurveAdd(true, p0x, p1x, p2x, p3x);\n      this.bezierCurveAdd(false, p0y, p1y, p2y, p3y);\n    }\n  }, {\n    key: \"addQuadraticCurve\",\n    value: function addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n      var cp1x = p0x + 2 / 3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)\n\n      var cp1y = p0y + 2 / 3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)\n\n      var cp2x = cp1x + 1 / 3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)\n\n      var cp2y = cp1y + 1 / 3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)\n\n      this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y);\n    }\n  }, {\n    key: \"isPointInBox\",\n    value: function isPointInBox(x, y) {\n      var x1 = this.x1,\n          y1 = this.y1,\n          x2 = this.x2,\n          y2 = this.y2;\n      return x1 <= x && x <= x2 && y1 <= y && y <= y2;\n    }\n  }, {\n    key: \"x\",\n    get: function get() {\n      return this.x1;\n    }\n  }, {\n    key: \"y\",\n    get: function get() {\n      return this.y1;\n    }\n  }, {\n    key: \"width\",\n    get: function get() {\n      return this.x2 - this.x1;\n    }\n  }, {\n    key: \"height\",\n    get: function get() {\n      return this.y2 - this.y1;\n    }\n  }]);\n\n  return BoundingBox;\n}();\n\nvar Translate = /*#__PURE__*/function () {\n  function Translate(_, point) {\n    _classCallCheck(this, Translate);\n\n    this.type = 'translate';\n    this.point = null;\n    this.point = Point.parse(point);\n  }\n\n  _createClass(Translate, [{\n    key: \"apply\",\n    value: function apply(ctx) {\n      var _this$point = this.point,\n          x = _this$point.x,\n          y = _this$point.y;\n      ctx.translate(x || 0.0, y || 0.0);\n    }\n  }, {\n    key: \"unapply\",\n    value: function unapply(ctx) {\n      var _this$point2 = this.point,\n          x = _this$point2.x,\n          y = _this$point2.y;\n      ctx.translate(-1.0 * x || 0.0, -1.0 * y || 0.0);\n    }\n  }, {\n    key: \"applyToPoint\",\n    value: function applyToPoint(point) {\n      var _this$point3 = this.point,\n          x = _this$point3.x,\n          y = _this$point3.y;\n      point.applyTransform([1, 0, 0, 1, x || 0.0, y || 0.0]);\n    }\n  }]);\n\n  return Translate;\n}();\n\nvar Rotate = /*#__PURE__*/function () {\n  function Rotate(document, rotate) {\n    var transformOrigin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n    _classCallCheck(this, Rotate);\n\n    this.type = 'rotate';\n    this.angle = null;\n    this.cx = 0;\n    this.cy = 0;\n    var numbers = toNumbers(rotate);\n    this.angle = new Property(document, 'angle', numbers[0]);\n    this.cx = (numbers[1] || 0) + (transformOrigin[0] || 0);\n    this.cy = (numbers[2] || 0) + (transformOrigin[1] || 0);\n  }\n\n  _createClass(Rotate, [{\n    key: \"apply\",\n    value: function apply(ctx) {\n      var cx = this.cx,\n          cy = this.cy,\n          angle = this.angle;\n      ctx.translate(cx, cy);\n      ctx.rotate(angle.getRadians());\n      ctx.translate(-cx, -cy);\n    }\n  }, {\n    key: \"unapply\",\n    value: function unapply(ctx) {\n      var cx = this.cx,\n          cy = this.cy,\n          angle = this.angle;\n      ctx.translate(cx, cy);\n      ctx.rotate(-1.0 * angle.getRadians());\n      ctx.translate(-cx, -cy);\n    }\n  }, {\n    key: \"applyToPoint\",\n    value: function applyToPoint(point) {\n      var cx = this.cx,\n          cy = this.cy,\n          angle = this.angle;\n      var rad = angle.getRadians(); // tslint:disable-next-line: no-console\n      // console.warn('Unknown action:', (this as any).p, this);\n      // ?\n\n      point.applyTransform([1, 0, 0, 1, cx || 0.0, cy || 0.0 // this.p.y\n      ]);\n      point.applyTransform([Math.cos(rad), Math.sin(rad), -Math.sin(rad), Math.cos(rad), 0, 0]);\n      point.applyTransform([1, 0, 0, 1, -cx || 0.0, -cy || 0.0 // -this.p.y\n      ]);\n    }\n  }]);\n\n  return Rotate;\n}();\n\nvar Scale = /*#__PURE__*/function () {\n  function Scale(_, scale) {\n    _classCallCheck(this, Scale);\n\n    this.type = 'scale';\n    this.scale = null;\n    var scaleSize = Point.parse(scale, 1); // Workaround for node-canvas\n\n    if (scaleSize.x === 0 || scaleSize.y === 0) {\n      scaleSize.x = PSEUDO_ZERO;\n      scaleSize.y = PSEUDO_ZERO;\n    }\n\n    this.scale = scaleSize;\n  }\n\n  _createClass(Scale, [{\n    key: \"apply\",\n    value: function apply(ctx) {\n      var _this$scale = this.scale,\n          x = _this$scale.x,\n          y = _this$scale.y;\n      ctx.scale(x, y || x);\n    }\n  }, {\n    key: \"unapply\",\n    value: function unapply(ctx) {\n      var _this$scale2 = this.scale,\n          x = _this$scale2.x,\n          y = _this$scale2.y;\n      ctx.scale(1.0 / x, 1.0 / y || x);\n    }\n  }, {\n    key: \"applyToPoint\",\n    value: function applyToPoint(point) {\n      var _this$scale3 = this.scale,\n          x = _this$scale3.x,\n          y = _this$scale3.y;\n      point.applyTransform([x || 0.0, 0, 0, y || 0.0, 0, 0]);\n    }\n  }]);\n\n  return Scale;\n}();\n\nvar Matrix = /*#__PURE__*/function () {\n  function Matrix(_, matrix) {\n    _classCallCheck(this, Matrix);\n\n    this.type = 'matrix';\n    this.matrix = [];\n    this.matrix = toNumbers(matrix);\n  }\n\n  _createClass(Matrix, [{\n    key: \"apply\",\n    value: function apply(ctx) {\n      var matrix = this.matrix;\n      ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);\n    }\n  }, {\n    key: \"unapply\",\n    value: function unapply(ctx) {\n      var matrix = this.matrix;\n      var a = matrix[0];\n      var b = matrix[2];\n      var c = matrix[4];\n      var d = matrix[1];\n      var e = matrix[3];\n      var f = matrix[5];\n      var g = 0.0;\n      var h = 0.0;\n      var i = 1.0;\n      var det = 1 / (a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g));\n      ctx.transform(det * (e * i - f * h), det * (f * g - d * i), det * (c * h - b * i), det * (a * i - c * g), det * (b * f - c * e), det * (c * d - a * f));\n    }\n  }, {\n    key: \"applyToPoint\",\n    value: function applyToPoint(point) {\n      point.applyTransform(this.matrix);\n    }\n  }]);\n\n  return Matrix;\n}();\n\nfunction _createSuper$1(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$1()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$1() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar Skew = /*#__PURE__*/function (_Matrix) {\n  _inherits(Skew, _Matrix);\n\n  var _super = _createSuper$1(Skew);\n\n  function Skew(document, skew) {\n    var _this;\n\n    _classCallCheck(this, Skew);\n\n    _this = _super.call(this, document, skew);\n    _this.type = 'skew';\n    _this.angle = null;\n    _this.angle = new Property(document, 'angle', skew);\n    return _this;\n  }\n\n  return Skew;\n}(Matrix);\n\nfunction _createSuper$2(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$2()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$2() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar SkewX = /*#__PURE__*/function (_Skew) {\n  _inherits(SkewX, _Skew);\n\n  var _super = _createSuper$2(SkewX);\n\n  function SkewX(document, skew) {\n    var _this;\n\n    _classCallCheck(this, SkewX);\n\n    _this = _super.call(this, document, skew);\n    _this.type = 'skewX';\n    _this.matrix = [1, 0, Math.tan(_this.angle.getRadians()), 1, 0, 0];\n    return _this;\n  }\n\n  return SkewX;\n}(Skew);\n\nfunction _createSuper$3(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$3()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$3() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar SkewY = /*#__PURE__*/function (_Skew) {\n  _inherits(SkewY, _Skew);\n\n  var _super = _createSuper$3(SkewY);\n\n  function SkewY(document, skew) {\n    var _this;\n\n    _classCallCheck(this, SkewY);\n\n    _this = _super.call(this, document, skew);\n    _this.type = 'skewY';\n    _this.matrix = [1, Math.tan(_this.angle.getRadians()), 0, 1, 0, 0];\n    return _this;\n  }\n\n  return SkewY;\n}(Skew);\n\nfunction parseTransforms(transform) {\n  return compressSpaces(transform).trim().replace(/\\)([a-zA-Z])/g, ') $1').replace(/\\)(\\s?,\\s?)/g, ') ').split(/\\s(?=[a-z])/);\n}\n\nfunction parseTransform(transform) {\n  var _transform$split = transform.split('('),\n      _transform$split2 = _slicedToArray(_transform$split, 2),\n      type = _transform$split2[0],\n      value = _transform$split2[1];\n\n  return [type.trim(), value.trim().replace(')', '')];\n}\n\nvar Transform = /*#__PURE__*/function () {\n  function Transform(document, transform, transformOrigin) {\n    var _this = this;\n\n    _classCallCheck(this, Transform);\n\n    this.document = document;\n    this.transforms = [];\n    var data = parseTransforms(transform);\n    var originCoords = transformOrigin ? toNumbers(transformOrigin) : [];\n    data.forEach(function (transform) {\n      if (transform === 'none') {\n        return;\n      }\n\n      var _parseTransform = parseTransform(transform),\n          _parseTransform2 = _slicedToArray(_parseTransform, 2),\n          type = _parseTransform2[0],\n          value = _parseTransform2[1];\n\n      var TransformType = Transform.transformTypes[type];\n\n      if (typeof TransformType !== 'undefined') {\n        _this.transforms.push(new TransformType(_this.document, value, originCoords));\n      }\n    });\n  }\n\n  _createClass(Transform, [{\n    key: \"apply\",\n    value: function apply(ctx) {\n      var transforms = this.transforms;\n      var len = transforms.length;\n\n      for (var i = 0; i < len; i++) {\n        transforms[i].apply(ctx);\n      }\n    }\n  }, {\n    key: \"unapply\",\n    value: function unapply(ctx) {\n      var transforms = this.transforms;\n      var len = transforms.length;\n\n      for (var i = len - 1; i >= 0; i--) {\n        transforms[i].unapply(ctx);\n      }\n    } // TODO: applyToPoint unused ... remove?\n\n  }, {\n    key: \"applyToPoint\",\n    value: function applyToPoint(point) {\n      var transforms = this.transforms;\n      var len = transforms.length;\n\n      for (var i = 0; i < len; i++) {\n        transforms[i].applyToPoint(point);\n      }\n    }\n  }], [{\n    key: \"fromElement\",\n    value: function fromElement(document, element) {\n      var transformStyle = element.getStyle('transform', false, true);\n      var transformOriginStyle = element.getStyle('transform-origin', false, true);\n\n      if (transformStyle.hasValue()) {\n        return new Transform(document, transformStyle.getString(), transformOriginStyle.getString());\n      }\n\n      return null;\n    }\n  }]);\n\n  return Transform;\n}();\nTransform.transformTypes = {\n  translate: Translate,\n  rotate: Rotate,\n  scale: Scale,\n  matrix: Matrix,\n  skewX: SkewX,\n  skewY: SkewY\n};\n\nfunction _createSuper$4(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$4()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$4() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar RenderedElement = /*#__PURE__*/function (_Element) {\n  _inherits(RenderedElement, _Element);\n\n  var _super = _createSuper$4(RenderedElement);\n\n  function RenderedElement() {\n    var _this;\n\n    _classCallCheck(this, RenderedElement);\n\n    _this = _super.apply(this, arguments);\n    _this.modifiedEmSizeStack = false;\n    return _this;\n  }\n\n  _createClass(RenderedElement, [{\n    key: \"calculateOpacity\",\n    value: function calculateOpacity() {\n      var opacity = 1.0; // tslint:disable-next-line: no-this-assignment\n\n      var element = this;\n\n      while (element) {\n        var opacityStyle = element.getStyle('opacity', false, true); // no ancestors on style call\n\n        if (opacityStyle.hasValue()) {\n          opacity *= opacityStyle.getNumber();\n        }\n\n        element = element.parent;\n      }\n\n      return opacity;\n    }\n  }, {\n    key: \"setContext\",\n    value: function setContext(ctx) {\n      var fromMeasure = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (!fromMeasure) {\n        // causes stack overflow when measuring text with gradients\n        // fill\n        var fillStyleProp = this.getStyle('fill');\n        var fillOpacityStyleProp = this.getStyle('fill-opacity');\n        var strokeStyleProp = this.getStyle('stroke');\n        var strokeOpacityProp = this.getStyle('stroke-opacity');\n\n        if (fillStyleProp.isUrlDefinition()) {\n          var fillStyle = fillStyleProp.getFillStyleDefinition(this, fillOpacityStyleProp);\n\n          if (fillStyle) {\n            ctx.fillStyle = fillStyle;\n          }\n        } else if (fillStyleProp.hasValue()) {\n          if (fillStyleProp.getString() === 'currentColor') {\n            fillStyleProp.setValue(this.getStyle('color').getValue());\n          }\n\n          var _fillStyle = fillStyleProp.getString();\n\n          if (_fillStyle !== 'inherit') {\n            ctx.fillStyle = _fillStyle === 'none' ? 'rgba(0,0,0,0)' : _fillStyle;\n          }\n        }\n\n        if (fillOpacityStyleProp.hasValue()) {\n          var _fillStyle2 = new Property(this.document, 'fill', ctx.fillStyle).addOpacity(fillOpacityStyleProp).getString();\n\n          ctx.fillStyle = _fillStyle2;\n        } // stroke\n\n\n        if (strokeStyleProp.isUrlDefinition()) {\n          var strokeStyle = strokeStyleProp.getFillStyleDefinition(this, strokeOpacityProp);\n\n          if (strokeStyle) {\n            ctx.strokeStyle = strokeStyle;\n          }\n        } else if (strokeStyleProp.hasValue()) {\n          if (strokeStyleProp.getString() === 'currentColor') {\n            strokeStyleProp.setValue(this.getStyle('color').getValue());\n          }\n\n          var _strokeStyle = strokeStyleProp.getString();\n\n          if (_strokeStyle !== 'inherit') {\n            ctx.strokeStyle = _strokeStyle === 'none' ? 'rgba(0,0,0,0)' : _strokeStyle;\n          }\n        }\n\n        if (strokeOpacityProp.hasValue()) {\n          var _strokeStyle2 = new Property(this.document, 'stroke', ctx.strokeStyle).addOpacity(strokeOpacityProp).getString();\n\n          ctx.strokeStyle = _strokeStyle2;\n        }\n\n        var strokeWidthStyleProp = this.getStyle('stroke-width');\n\n        if (strokeWidthStyleProp.hasValue()) {\n          var newLineWidth = strokeWidthStyleProp.getPixels();\n          ctx.lineWidth = !newLineWidth ? PSEUDO_ZERO // browsers don't respect 0 (or node-canvas? :-)\n          : newLineWidth;\n        }\n\n        var strokeLinecapStyleProp = this.getStyle('stroke-linecap');\n        var strokeLinejoinStyleProp = this.getStyle('stroke-linejoin');\n        var strokeMiterlimitProp = this.getStyle('stroke-miterlimit');\n        var pointOrderStyleProp = this.getStyle('paint-order');\n        var strokeDasharrayStyleProp = this.getStyle('stroke-dasharray');\n        var strokeDashoffsetProp = this.getStyle('stroke-dashoffset');\n\n        if (strokeLinecapStyleProp.hasValue()) {\n          ctx.lineCap = strokeLinecapStyleProp.getString();\n        }\n\n        if (strokeLinejoinStyleProp.hasValue()) {\n          ctx.lineJoin = strokeLinejoinStyleProp.getString();\n        }\n\n        if (strokeMiterlimitProp.hasValue()) {\n          ctx.miterLimit = strokeMiterlimitProp.getNumber();\n        }\n\n        if (pointOrderStyleProp.hasValue()) {\n          // ?\n          ctx.paintOrder = pointOrderStyleProp.getValue();\n        }\n\n        if (strokeDasharrayStyleProp.hasValue() && strokeDasharrayStyleProp.getString() !== 'none') {\n          var gaps = toNumbers(strokeDasharrayStyleProp.getString());\n\n          if (typeof ctx.setLineDash !== 'undefined') {\n            ctx.setLineDash(gaps);\n          } else if (typeof ctx.webkitLineDash !== 'undefined') {\n            ctx.webkitLineDash = gaps;\n          } else if (typeof ctx.mozDash !== 'undefined' && !(gaps.length === 1 && gaps[0] === 0)) {\n            ctx.mozDash = gaps;\n          }\n\n          var offset = strokeDashoffsetProp.getPixels();\n\n          if (typeof ctx.lineDashOffset !== 'undefined') {\n            ctx.lineDashOffset = offset;\n          } else if (typeof ctx.webkitLineDashOffset !== 'undefined') {\n            ctx.webkitLineDashOffset = offset;\n          } else if (typeof ctx.mozDashOffset !== 'undefined') {\n            ctx.mozDashOffset = offset;\n          }\n        }\n      } // font\n\n\n      this.modifiedEmSizeStack = false;\n\n      if (typeof ctx.font !== 'undefined') {\n        var fontStyleProp = this.getStyle('font');\n        var fontStyleStyleProp = this.getStyle('font-style');\n        var fontVariantStyleProp = this.getStyle('font-variant');\n        var fontWeightStyleProp = this.getStyle('font-weight');\n        var fontSizeStyleProp = this.getStyle('font-size');\n        var fontFamilyStyleProp = this.getStyle('font-family');\n        var font = new Font(fontStyleStyleProp.getString(), fontVariantStyleProp.getString(), fontWeightStyleProp.getString(), fontSizeStyleProp.hasValue() ? \"\".concat(fontSizeStyleProp.getPixels(true), \"px\") : '', fontFamilyStyleProp.getString(), Font.parse(fontStyleProp.getString(), ctx.font));\n        fontStyleStyleProp.setValue(font.fontStyle);\n        fontVariantStyleProp.setValue(font.fontVariant);\n        fontWeightStyleProp.setValue(font.fontWeight);\n        fontSizeStyleProp.setValue(font.fontSize);\n        fontFamilyStyleProp.setValue(font.fontFamily);\n        ctx.font = font.toString();\n\n        if (fontSizeStyleProp.isPixels()) {\n          this.document.emSize = fontSizeStyleProp.getPixels();\n          this.modifiedEmSizeStack = true;\n        }\n      } // transform\n\n\n      var transform = Transform.fromElement(this.document, this);\n\n      if (transform) {\n        transform.apply(ctx);\n      } // clip\n\n\n      var clipPathStyleProp = this.getStyle('clip-path', false, true);\n\n      if (clipPathStyleProp.hasValue()) {\n        var clip = clipPathStyleProp.getDefinition();\n\n        if (clip) {\n          clip.apply(ctx);\n        }\n      } // opacity\n\n\n      ctx.globalAlpha = this.calculateOpacity();\n    }\n  }, {\n    key: \"clearContext\",\n    value: function clearContext(ctx) {\n      _get(_getPrototypeOf(RenderedElement.prototype), \"clearContext\", this).call(this, ctx);\n\n      if (this.modifiedEmSizeStack) {\n        this.document.popEmSize();\n      }\n    }\n  }]);\n\n  return RenderedElement;\n}(Element);\n\nfunction _createSuper$5(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$5()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$5() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar TextElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(TextElement, _RenderedElement);\n\n  var _super = _createSuper$5(TextElement);\n\n  function TextElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, TextElement);\n\n    _this = _super.call(this, document, node, (this instanceof TextElement ? this.constructor : void 0) === TextElement ? true : captureTextNodes);\n    _this.type = 'text';\n    _this.x = 0;\n    _this.y = 0;\n    _this.measureCache = -1;\n    return _this;\n  }\n\n  _createClass(TextElement, [{\n    key: \"setContext\",\n    value: function setContext(ctx) {\n      var fromMeasure = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      _get(_getPrototypeOf(TextElement.prototype), \"setContext\", this).call(this, ctx, fromMeasure);\n\n      var textBaseline = this.getStyle('dominant-baseline').getTextBaseline() || this.getStyle('alignment-baseline').getTextBaseline();\n\n      if (textBaseline) {\n        ctx.textBaseline = textBaseline;\n      }\n    }\n  }, {\n    key: \"initializeCoordinates\",\n    value: function initializeCoordinates(ctx) {\n      this.x = this.getAttribute('x').getPixels('x');\n      this.y = this.getAttribute('y').getPixels('y');\n      var dxAttr = this.getAttribute('dx');\n      var dyAttr = this.getAttribute('dy');\n\n      if (dxAttr.hasValue()) {\n        this.x += dxAttr.getPixels('x');\n      }\n\n      if (dyAttr.hasValue()) {\n        this.y += dyAttr.getPixels('y');\n      }\n\n      this.x += this.getAnchorDelta(ctx, this, 0);\n    }\n  }, {\n    key: \"getBoundingBox\",\n    value: function getBoundingBox(ctx) {\n      var _this2 = this;\n\n      if (this.type !== 'text') {\n        return this.getTElementBoundingBox(ctx);\n      }\n\n      this.initializeCoordinates(ctx);\n      var boundingBox = null;\n      this.children.forEach(function (_, i) {\n        var childBoundingBox = _this2.getChildBoundingBox(ctx, _this2, _this2, i);\n\n        if (!boundingBox) {\n          boundingBox = childBoundingBox;\n        } else {\n          boundingBox.addBoundingBox(childBoundingBox);\n        }\n      });\n      return boundingBox;\n    }\n  }, {\n    key: \"getFontSize\",\n    value: function getFontSize() {\n      var document = this.document,\n          parent = this.parent;\n      var inheritFontSize = Font.parse(document.ctx.font).fontSize;\n      var fontSize = parent.getStyle('font-size').getNumber(inheritFontSize);\n      return fontSize;\n    }\n  }, {\n    key: \"getTElementBoundingBox\",\n    value: function getTElementBoundingBox(ctx) {\n      var fontSize = this.getFontSize();\n      return new BoundingBox(this.x, this.y - fontSize, this.x + this.measureText(ctx), this.y);\n    }\n  }, {\n    key: \"getGlyph\",\n    value: function getGlyph(font, text, i) {\n      var char = text[i];\n      var glyph = null;\n\n      if (font.isArabic) {\n        var len = text.length;\n        var prevChar = text[i - 1];\n        var nextChar = text[i + 1];\n        var arabicForm = 'isolated';\n\n        if ((i === 0 || prevChar === ' ') && i < len - 2 && nextChar !== ' ') {\n          arabicForm = 'terminal';\n        }\n\n        if (i > 0 && prevChar !== ' ' && i < len - 2 && nextChar !== ' ') {\n          arabicForm = 'medial';\n        }\n\n        if (i > 0 && prevChar !== ' ' && (i === len - 1 || nextChar === ' ')) {\n          arabicForm = 'initial';\n        }\n\n        if (typeof font.glyphs[char] !== 'undefined') {\n          glyph = font.glyphs[char][arabicForm];\n\n          if (!glyph && font.glyphs[char].type === 'glyph') {\n            glyph = font.glyphs[char];\n          }\n        }\n      } else {\n        glyph = font.glyphs[char];\n      }\n\n      if (!glyph) {\n        glyph = font.missingGlyph;\n      }\n\n      return glyph;\n    }\n  }, {\n    key: \"getText\",\n    value: function getText() {\n      return '';\n    }\n  }, {\n    key: \"getTextFromNode\",\n    value: function getTextFromNode(node) {\n      var textNode = node || this.node;\n      var childNodes = Array.from(textNode.parentNode.childNodes);\n      var index = childNodes.indexOf(textNode);\n      var lastIndex = childNodes.length - 1;\n      var text = compressSpaces(textNode.value || textNode.text || textNode.textContent || '');\n\n      if (index === 0) {\n        text = trimLeft(text);\n      } else if (index === lastIndex) {\n        text = trimRight(text);\n      }\n\n      return text;\n    }\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      var _this3 = this;\n\n      if (this.type !== 'text') {\n        this.renderTElementChildren(ctx);\n        return;\n      }\n\n      this.initializeCoordinates(ctx);\n      this.children.forEach(function (_, i) {\n        _this3.renderChild(ctx, _this3, _this3, i);\n      });\n      var mouse = this.document.screen.mouse; // Do not calc bounding box if mouse is not working.\n\n      if (mouse.isWorking()) {\n        mouse.checkBoundingBox(this, this.getBoundingBox(ctx));\n      }\n    }\n  }, {\n    key: \"renderTElementChildren\",\n    value: function renderTElementChildren(ctx) {\n      var document = this.document,\n          parent = this.parent;\n      var renderText = this.getText();\n      var customFont = parent.getStyle('font-family').getDefinition();\n\n      if (customFont) {\n        var unitsPerEm = customFont.fontFace.unitsPerEm;\n        var ctxFont = Font.parse(document.ctx.font);\n        var fontSize = parent.getStyle('font-size').getNumber(ctxFont.fontSize);\n        var fontStyle = parent.getStyle('font-style').getString(ctxFont.fontStyle);\n        var scale = fontSize / unitsPerEm;\n        var text = customFont.isRTL ? renderText.split('').reverse().join('') : renderText;\n        var dx = toNumbers(parent.getAttribute('dx').getString());\n        var len = text.length;\n\n        for (var i = 0; i < len; i++) {\n          var glyph = this.getGlyph(customFont, text, i);\n          ctx.translate(this.x, this.y);\n          ctx.scale(scale, -scale);\n          var lw = ctx.lineWidth;\n          ctx.lineWidth = ctx.lineWidth * unitsPerEm / fontSize;\n\n          if (fontStyle === 'italic') {\n            ctx.transform(1, 0, .4, 1, 0, 0);\n          }\n\n          glyph.render(ctx);\n\n          if (fontStyle === 'italic') {\n            ctx.transform(1, 0, -.4, 1, 0, 0);\n          }\n\n          ctx.lineWidth = lw;\n          ctx.scale(1 / scale, -1 / scale);\n          ctx.translate(-this.x, -this.y);\n          this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / unitsPerEm;\n\n          if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) {\n            this.x += dx[i];\n          }\n        }\n\n        return;\n      }\n\n      var x = this.x,\n          y = this.y;\n\n      if (ctx.paintOrder === 'stroke') {\n        if (ctx.strokeStyle) {\n          ctx.strokeText(renderText, x, y);\n        }\n\n        if (ctx.fillStyle) {\n          ctx.fillText(renderText, x, y);\n        }\n      } else {\n        if (ctx.fillStyle) {\n          ctx.fillText(renderText, x, y);\n        }\n\n        if (ctx.strokeStyle) {\n          ctx.strokeText(renderText, x, y);\n        }\n      }\n    }\n  }, {\n    key: \"getAnchorDelta\",\n    value: function getAnchorDelta(ctx, parent, startI) {\n      var textAnchor = this.getStyle('text-anchor').getString('start');\n\n      if (textAnchor !== 'start') {\n        var children = parent.children;\n        var len = children.length;\n        var child = null;\n        var width = 0;\n\n        for (var i = startI; i < len; i++) {\n          child = children[i];\n\n          if (i > startI && child.getAttribute('x').hasValue() || child.getAttribute('text-anchor').hasValue()) {\n            break; // new group\n          }\n\n          width += child.measureTextRecursive(ctx);\n        }\n\n        return -1 * (textAnchor === 'end' ? width : width / 2.0);\n      }\n\n      return 0;\n    }\n  }, {\n    key: \"adjustChildCoordinates\",\n    value: function adjustChildCoordinates(ctx, textParent, parent, i) {\n      var child = parent.children[i];\n\n      if (typeof child.measureText !== 'function') {\n        return child;\n      }\n\n      var xAttr = child.getAttribute('x');\n      var yAttr = child.getAttribute('y');\n      var dxAttr = child.getAttribute('dx');\n      var dyAttr = child.getAttribute('dy');\n      var textAnchor = child.getAttribute('text-anchor').getString('start');\n\n      if (i === 0 && child.type !== 'textNode') {\n        if (!xAttr.hasValue()) {\n          xAttr.setValue(textParent.getAttribute('x').getValue('0'));\n        }\n\n        if (!yAttr.hasValue()) {\n          yAttr.setValue(textParent.getAttribute('y').getValue('0'));\n        }\n\n        if (!dxAttr.hasValue()) {\n          dxAttr.setValue(textParent.getAttribute('dx').getValue('0'));\n        }\n\n        if (!dyAttr.hasValue()) {\n          dyAttr.setValue(textParent.getAttribute('dy').getValue('0'));\n        }\n      }\n\n      if (xAttr.hasValue()) {\n        child.x = xAttr.getPixels('x') + textParent.getAnchorDelta(ctx, parent, i);\n\n        if (textAnchor !== 'start') {\n          var width = child.measureTextRecursive(ctx);\n          child.x += -1 * (textAnchor === 'end' ? width : width / 2.0);\n        }\n\n        if (dxAttr.hasValue()) {\n          child.x += dxAttr.getPixels('x');\n        }\n      } else {\n        if (textAnchor !== 'start') {\n          var _width = child.measureTextRecursive(ctx);\n\n          textParent.x += -1 * (textAnchor === 'end' ? _width : _width / 2.0);\n        }\n\n        if (dxAttr.hasValue()) {\n          textParent.x += dxAttr.getPixels('x');\n        }\n\n        child.x = textParent.x;\n      }\n\n      textParent.x = child.x + child.measureText(ctx);\n\n      if (yAttr.hasValue()) {\n        child.y = yAttr.getPixels('y');\n\n        if (dyAttr.hasValue()) {\n          child.y += dyAttr.getPixels('y');\n        }\n      } else {\n        if (dyAttr.hasValue()) {\n          textParent.y += dyAttr.getPixels('y');\n        }\n\n        child.y = textParent.y;\n      }\n\n      textParent.y = child.y;\n      return child;\n    }\n  }, {\n    key: \"getChildBoundingBox\",\n    value: function getChildBoundingBox(ctx, textParent, parent, i) {\n      var child = this.adjustChildCoordinates(ctx, textParent, parent, i);\n      var boundingBox = child.getBoundingBox(ctx);\n      child.children.forEach(function (_, i) {\n        var childBoundingBox = textParent.getChildBoundingBox(ctx, textParent, child, i);\n        boundingBox.addBoundingBox(childBoundingBox);\n      });\n      return boundingBox;\n    }\n  }, {\n    key: \"renderChild\",\n    value: function renderChild(ctx, textParent, parent, i) {\n      var child = this.adjustChildCoordinates(ctx, textParent, parent, i);\n      child.render(ctx);\n      child.children.forEach(function (_, i) {\n        textParent.renderChild(ctx, textParent, child, i);\n      });\n    }\n  }, {\n    key: \"measureTextRecursive\",\n    value: function measureTextRecursive(ctx) {\n      var width = this.children.reduce(function (width, child) {\n        return width + child.measureTextRecursive(ctx);\n      }, this.measureText(ctx));\n      return width;\n    }\n  }, {\n    key: \"measureText\",\n    value: function measureText(ctx) {\n      var measureCache = this.measureCache;\n\n      if (~measureCache) {\n        return measureCache;\n      }\n\n      var renderText = this.getText();\n      var measure = this.measureTargetText(ctx, renderText);\n      this.measureCache = measure;\n      return measure;\n    }\n  }, {\n    key: \"measureTargetText\",\n    value: function measureTargetText(ctx, targetText) {\n      if (!targetText.length) {\n        return 0;\n      }\n\n      var parent = this.parent;\n      var customFont = parent.getStyle('font-family').getDefinition();\n\n      if (customFont) {\n        var fontSize = this.getFontSize();\n        var text = customFont.isRTL ? targetText.split('').reverse().join('') : targetText;\n        var dx = toNumbers(parent.getAttribute('dx').getString());\n        var len = text.length;\n        var _measure = 0;\n\n        for (var i = 0; i < len; i++) {\n          var glyph = this.getGlyph(customFont, text, i);\n          _measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;\n\n          if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) {\n            _measure += dx[i];\n          }\n        }\n\n        return _measure;\n      }\n\n      if (!ctx.measureText) {\n        return targetText.length * 10;\n      }\n\n      ctx.save();\n      this.setContext(ctx, true);\n\n      var _ctx$measureText = ctx.measureText(targetText),\n          measure = _ctx$measureText.width;\n\n      ctx.restore();\n      return measure;\n    }\n  }]);\n\n  return TextElement;\n}(RenderedElement);\n\nfunction _createSuper$6(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$6()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$6() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar TSpanElement = /*#__PURE__*/function (_TextElement) {\n  _inherits(TSpanElement, _TextElement);\n\n  var _super = _createSuper$6(TSpanElement);\n\n  function TSpanElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, TSpanElement);\n\n    _this = _super.call(this, document, node, (this instanceof TSpanElement ? this.constructor : void 0) === TSpanElement ? true : captureTextNodes);\n    _this.type = 'tspan'; // if this node has children, then they own the text\n\n    _this.text = _this.children.length > 0 ? '' : _this.getTextFromNode();\n    return _this;\n  }\n\n  _createClass(TSpanElement, [{\n    key: \"getText\",\n    value: function getText() {\n      return this.text;\n    }\n  }]);\n\n  return TSpanElement;\n}(TextElement);\n\nfunction _createSuper$7(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$7()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$7() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar TextNode = /*#__PURE__*/function (_TSpanElement) {\n  _inherits(TextNode, _TSpanElement);\n\n  var _super = _createSuper$7(TextNode);\n\n  function TextNode() {\n    var _this;\n\n    _classCallCheck(this, TextNode);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'textNode';\n    return _this;\n  }\n\n  return TextNode;\n}(TSpanElement);\n\nfunction preparePath(path) {\n  var d = path.replace(/,/gm, ' ') // get rid of all commas\n  // As the end of a match can also be the start of the next match, we need to run this replace twice.\n  .replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm, '$1 $2') // suffix commands with spaces\n  .replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm, '$1 $2') // suffix commands with spaces\n  .replace(/([^\\s])([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // prefix commands with spaces\n  .replace(/([0-9])([+\\-])/gm, '$1 $2') // separate digits on +- signs\n  // Again, we need to run this twice to find all occurances\n  .replace(/(\\.[0-9]*)(\\.)/gm, '$1 $2') // separate digits when they start with a comma\n  .replace(/(\\.[0-9]*)(\\.)/gm, '$1 $2') // separate digits when they start with a comma\n  .replace(/([Aa](\\s+[0-9]+){3})\\s+([01])\\s*([01])/gm, '$1 $3 $4 '); // shorthand elliptical arc path syntax\n\n  return compressSpaces(d).trim();\n}\n\nvar PathParser = /*#__PURE__*/function () {\n  function PathParser(path) {\n    _classCallCheck(this, PathParser);\n\n    this.control = null;\n    this.start = null;\n    this.current = null;\n    this.command = '';\n    this.tokens = [];\n    this.i = -1;\n    this.previousCommand = '';\n    this.points = [];\n    this.angles = [];\n    this.tokens = preparePath(path).split(' ');\n  }\n\n  _createClass(PathParser, [{\n    key: \"reset\",\n    value: function reset() {\n      this.i = -1;\n      this.command = '';\n      this.previousCommand = '';\n      this.start = new Point(0, 0);\n      this.control = new Point(0, 0);\n      this.current = new Point(0, 0);\n      this.points = [];\n      this.angles = [];\n    }\n  }, {\n    key: \"isEnd\",\n    value: function isEnd() {\n      var i = this.i,\n          tokens = this.tokens;\n      return i >= tokens.length - 1;\n    }\n  }, {\n    key: \"isCommandOrEnd\",\n    value: function isCommandOrEnd() {\n      if (this.isEnd()) {\n        return true;\n      }\n\n      var i = this.i,\n          tokens = this.tokens;\n      return /^[A-Za-z]$/.test(tokens[i + 1]);\n    }\n  }, {\n    key: \"isRelativeCommand\",\n    value: function isRelativeCommand() {\n      switch (this.command) {\n        case 'm':\n        case 'l':\n        case 'h':\n        case 'v':\n        case 'c':\n        case 's':\n        case 'q':\n        case 't':\n        case 'a':\n        case 'z':\n          return true;\n\n        default:\n          return false;\n      }\n    }\n  }, {\n    key: \"getToken\",\n    value: function getToken() {\n      this.i++;\n      return this.tokens[this.i];\n    }\n  }, {\n    key: \"getScalar\",\n    value: function getScalar() {\n      return parseFloat(this.getToken());\n    }\n  }, {\n    key: \"nextCommand\",\n    value: function nextCommand() {\n      this.previousCommand = this.command;\n      this.command = this.getToken();\n    }\n  }, {\n    key: \"getPoint\",\n    value: function getPoint() {\n      var point = new Point(this.getScalar(), this.getScalar());\n      return this.makeAbsolute(point);\n    }\n  }, {\n    key: \"getAsControlPoint\",\n    value: function getAsControlPoint() {\n      var point = this.getPoint();\n      this.control = point;\n      return point;\n    }\n  }, {\n    key: \"getAsCurrentPoint\",\n    value: function getAsCurrentPoint() {\n      var point = this.getPoint();\n      this.current = point;\n      return point;\n    }\n  }, {\n    key: \"getReflectedControlPoint\",\n    value: function getReflectedControlPoint() {\n      var previousCommand = this.previousCommand.toLowerCase();\n\n      if (previousCommand !== 'c' && previousCommand !== 's' && previousCommand !== 'q' && previousCommand !== 't') {\n        return this.current;\n      } // reflect point\n\n\n      var _this$current = this.current,\n          cx = _this$current.x,\n          cy = _this$current.y,\n          _this$control = this.control,\n          ox = _this$control.x,\n          oy = _this$control.y;\n      var point = new Point(2 * cx - ox, 2 * cy - oy);\n      return point;\n    }\n  }, {\n    key: \"makeAbsolute\",\n    value: function makeAbsolute(point) {\n      if (this.isRelativeCommand()) {\n        var _this$current2 = this.current,\n            x = _this$current2.x,\n            y = _this$current2.y;\n        point.x += x;\n        point.y += y;\n      }\n\n      return point;\n    }\n  }, {\n    key: \"addMarker\",\n    value: function addMarker(point, from, priorTo) {\n      var points = this.points,\n          angles = this.angles; // if the last angle isn't filled in because we didn't have this point yet ...\n\n      if (priorTo && angles.length > 0 && !angles[angles.length - 1]) {\n        angles[angles.length - 1] = points[points.length - 1].angleTo(priorTo);\n      }\n\n      this.addMarkerAngle(point, from ? from.angleTo(point) : null);\n    }\n  }, {\n    key: \"addMarkerAngle\",\n    value: function addMarkerAngle(point, angle) {\n      this.points.push(point);\n      this.angles.push(angle);\n    }\n  }, {\n    key: \"getMarkerPoints\",\n    value: function getMarkerPoints() {\n      return this.points;\n    }\n  }, {\n    key: \"getMarkerAngles\",\n    value: function getMarkerAngles() {\n      var angles = this.angles;\n      var len = angles.length;\n\n      for (var i = 0; i < len; i++) {\n        if (!angles[i]) {\n          for (var j = i + 1; j < len; j++) {\n            if (angles[j]) {\n              angles[i] = angles[j];\n              break;\n            }\n          }\n        }\n      }\n\n      return angles;\n    }\n  }]);\n\n  return PathParser;\n}();\n\nfunction _createSuper$8(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$8()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$8() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar PathElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(PathElement, _RenderedElement);\n\n  var _super = _createSuper$8(PathElement);\n\n  function PathElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, PathElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'path';\n    _this.pathParser = null;\n    _this.pathParser = new PathParser(_this.getAttribute('d').getString());\n    return _this;\n  }\n\n  _createClass(PathElement, [{\n    key: \"path\",\n    value: function path(ctx) {\n      var pathParser = this.pathParser;\n      var boundingBox = new BoundingBox();\n      pathParser.reset();\n\n      if (ctx) {\n        ctx.beginPath();\n      }\n\n      while (!pathParser.isEnd()) {\n        pathParser.nextCommand();\n\n        switch (pathParser.command) {\n          case 'M':\n          case 'm':\n            this.pathM(ctx, boundingBox);\n            break;\n\n          case 'L':\n          case 'l':\n            this.pathL(ctx, boundingBox);\n            break;\n\n          case 'H':\n          case 'h':\n            this.pathH(ctx, boundingBox);\n            break;\n\n          case 'V':\n          case 'v':\n            this.pathV(ctx, boundingBox);\n            break;\n\n          case 'C':\n          case 'c':\n            this.pathC(ctx, boundingBox);\n            break;\n\n          case 'S':\n          case 's':\n            this.pathS(ctx, boundingBox);\n            break;\n\n          case 'Q':\n          case 'q':\n            this.pathQ(ctx, boundingBox);\n            break;\n\n          case 'T':\n          case 't':\n            this.pathT(ctx, boundingBox);\n            break;\n\n          case 'A':\n          case 'a':\n            this.pathA(ctx, boundingBox);\n            break;\n\n          case 'Z':\n          case 'z':\n            this.pathZ(ctx, boundingBox);\n            break;\n        }\n      }\n\n      return boundingBox;\n    }\n  }, {\n    key: \"getBoundingBox\",\n    value: function getBoundingBox(_) {\n      return this.path();\n    }\n  }, {\n    key: \"getMarkers\",\n    value: function getMarkers() {\n      var pathParser = this.pathParser;\n      var points = pathParser.getMarkerPoints();\n      var angles = pathParser.getMarkerAngles();\n      var markers = points.map(function (point, i) {\n        return [point, angles[i]];\n      });\n      return markers;\n    }\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      this.path(ctx);\n      this.document.screen.mouse.checkPath(this, ctx);\n      var fillRuleStyleProp = this.getStyle('fill-rule');\n\n      if (ctx.fillStyle !== '') {\n        if (fillRuleStyleProp.getString('inherit') !== 'inherit') {\n          ctx.fill(fillRuleStyleProp.getString());\n        } else {\n          ctx.fill();\n        }\n      }\n\n      if (ctx.strokeStyle !== '') {\n        ctx.stroke();\n      }\n\n      var markers = this.getMarkers();\n\n      if (markers) {\n        var markersLastIndex = markers.length - 1;\n        var markerStartStyleProp = this.getStyle('marker-start');\n        var markerMidStyleProp = this.getStyle('marker-mid');\n        var markerEndStyleProp = this.getStyle('marker-end');\n\n        if (markerStartStyleProp.isUrlDefinition()) {\n          var marker = markerStartStyleProp.getDefinition();\n\n          var _markers$ = _slicedToArray(markers[0], 2),\n              point = _markers$[0],\n              angle = _markers$[1];\n\n          marker.render(ctx, point, angle);\n        }\n\n        if (markerMidStyleProp.isUrlDefinition()) {\n          var _marker = markerMidStyleProp.getDefinition();\n\n          for (var i = 1; i < markersLastIndex; i++) {\n            var _markers$i = _slicedToArray(markers[i], 2),\n                _point = _markers$i[0],\n                _angle = _markers$i[1];\n\n            _marker.render(ctx, _point, _angle);\n          }\n        }\n\n        if (markerEndStyleProp.isUrlDefinition()) {\n          var _marker2 = markerEndStyleProp.getDefinition();\n\n          var _markers$markersLastI = _slicedToArray(markers[markersLastIndex], 2),\n              _point2 = _markers$markersLastI[0],\n              _angle2 = _markers$markersLastI[1];\n\n          _marker2.render(ctx, _point2, _angle2);\n        }\n      }\n    }\n  }, {\n    key: \"pathM\",\n    value: function pathM(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n      var point = pathParser.getAsCurrentPoint();\n      var x = point.x,\n          y = point.y;\n      pathParser.addMarker(point);\n      boundingBox.addPoint(x, y);\n\n      if (ctx) {\n        ctx.moveTo(x, y);\n      }\n\n      pathParser.start = pathParser.current;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var _point3 = pathParser.getAsCurrentPoint();\n\n        var _x = _point3.x,\n            _y = _point3.y;\n        pathParser.addMarker(_point3, pathParser.start);\n        boundingBox.addPoint(_x, _y);\n\n        if (ctx) {\n          ctx.lineTo(_x, _y);\n        }\n      }\n    }\n  }, {\n    key: \"pathL\",\n    value: function pathL(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = pathParser.getAsCurrentPoint();\n        var x = point.x,\n            y = point.y;\n        pathParser.addMarker(point, current);\n        boundingBox.addPoint(x, y);\n\n        if (ctx) {\n          ctx.lineTo(x, y);\n        }\n      }\n    }\n  }, {\n    key: \"pathH\",\n    value: function pathH(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = new Point((pathParser.isRelativeCommand() ? current.x : 0) + pathParser.getScalar(), current.y);\n        pathParser.addMarker(point, current);\n        pathParser.current = point;\n        boundingBox.addPoint(point.x, point.y);\n\n        if (ctx) {\n          ctx.lineTo(point.x, point.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathV\",\n    value: function pathV(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = new Point(current.x, (pathParser.isRelativeCommand() ? current.y : 0) + pathParser.getScalar());\n        pathParser.addMarker(point, current);\n        pathParser.current = point;\n        boundingBox.addPoint(point.x, point.y);\n\n        if (ctx) {\n          ctx.lineTo(point.x, point.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathC\",\n    value: function pathC(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = pathParser.getPoint();\n        var controlPoint = pathParser.getAsControlPoint();\n        var currentPoint = pathParser.getAsCurrentPoint();\n        pathParser.addMarker(currentPoint, controlPoint, point);\n        boundingBox.addBezierCurve(current.x, current.y, point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n\n        if (ctx) {\n          ctx.bezierCurveTo(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathS\",\n    value: function pathS(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = pathParser.getReflectedControlPoint();\n        var controlPoint = pathParser.getAsControlPoint();\n        var currentPoint = pathParser.getAsCurrentPoint();\n        pathParser.addMarker(currentPoint, controlPoint, point);\n        boundingBox.addBezierCurve(current.x, current.y, point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n\n        if (ctx) {\n          ctx.bezierCurveTo(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathQ\",\n    value: function pathQ(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var controlPoint = pathParser.getAsControlPoint();\n        var currentPoint = pathParser.getAsCurrentPoint();\n        pathParser.addMarker(currentPoint, controlPoint, controlPoint);\n        boundingBox.addQuadraticCurve(current.x, current.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n\n        if (ctx) {\n          ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathT\",\n    value: function pathT(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var controlPoint = pathParser.getReflectedControlPoint();\n        pathParser.control = controlPoint;\n        var currentPoint = pathParser.getAsCurrentPoint();\n        pathParser.addMarker(currentPoint, controlPoint, controlPoint);\n        boundingBox.addQuadraticCurve(current.x, current.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n\n        if (ctx) {\n          ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathA\",\n    value: function pathA(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var rx = pathParser.getScalar();\n        var ry = pathParser.getScalar();\n        var xAxisRotation = pathParser.getScalar() * (Math.PI / 180.0);\n        var largeArcFlag = pathParser.getScalar();\n        var sweepFlag = pathParser.getScalar();\n        var currentPoint = pathParser.getAsCurrentPoint(); // Conversion from endpoint to center parameterization\n        // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n        // x1', y1'\n\n        var currp = new Point(Math.cos(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.sin(xAxisRotation) * (current.y - currentPoint.y) / 2.0, -Math.sin(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * (current.y - currentPoint.y) / 2.0); // adjust radii\n\n        var l = Math.pow(currp.x, 2) / Math.pow(rx, 2) + Math.pow(currp.y, 2) / Math.pow(ry, 2);\n\n        if (l > 1) {\n          rx *= Math.sqrt(l);\n          ry *= Math.sqrt(l);\n        } // cx', cy'\n\n\n        var s = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt((Math.pow(rx, 2) * Math.pow(ry, 2) - Math.pow(rx, 2) * Math.pow(currp.y, 2) - Math.pow(ry, 2) * Math.pow(currp.x, 2)) / (Math.pow(rx, 2) * Math.pow(currp.y, 2) + Math.pow(ry, 2) * Math.pow(currp.x, 2)));\n\n        if (isNaN(s)) {\n          s = 0;\n        }\n\n        var cpp = new Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); // cx, cy\n\n        var centp = new Point((current.x + currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, (current.y + currentPoint.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y); // initial angle\n\n        var a1 = vectorsAngle([1, 0], [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]); // angle delta\n\n        var u = [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry];\n        var v = [(-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry];\n        var ad = vectorsAngle(u, v);\n\n        if (vectorsRatio(u, v) <= -1) {\n          ad = Math.PI;\n        }\n\n        if (vectorsRatio(u, v) >= 1) {\n          ad = 0;\n        } // for markers\n\n\n        var dir = 1 - sweepFlag ? 1.0 : -1.0;\n        var ah = a1 + dir * (ad / 2.0);\n        var halfWay = new Point(centp.x + rx * Math.cos(ah), centp.y + ry * Math.sin(ah));\n        pathParser.addMarkerAngle(halfWay, ah - dir * Math.PI / 2);\n        pathParser.addMarkerAngle(currentPoint, ah - dir * Math.PI);\n        boundingBox.addPoint(currentPoint.x, currentPoint.y); // TODO: this is too naive, make it better\n\n        if (ctx && !isNaN(a1) && !isNaN(ad)) {\n          var r = rx > ry ? rx : ry;\n          var sx = rx > ry ? 1 : rx / ry;\n          var sy = rx > ry ? ry / rx : 1;\n          ctx.translate(centp.x, centp.y);\n          ctx.rotate(xAxisRotation);\n          ctx.scale(sx, sy);\n          ctx.arc(0, 0, r, a1, a1 + ad, Boolean(1 - sweepFlag));\n          ctx.scale(1 / sx, 1 / sy);\n          ctx.rotate(-xAxisRotation);\n          ctx.translate(-centp.x, -centp.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathZ\",\n    value: function pathZ(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      if (ctx) {\n        // only close path if it is not a straight line\n        if (boundingBox.x1 !== boundingBox.x2 && boundingBox.y1 !== boundingBox.y2) {\n          ctx.closePath();\n        }\n      }\n\n      pathParser.current = pathParser.start;\n    }\n  }]);\n\n  return PathElement;\n}(RenderedElement);\n\nfunction _createSuper$9(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$9()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$9() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar SVGElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(SVGElement, _RenderedElement);\n\n  var _super = _createSuper$9(SVGElement);\n\n  function SVGElement() {\n    var _this;\n\n    _classCallCheck(this, SVGElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'svg';\n    _this.root = false;\n    return _this;\n  }\n\n  _createClass(SVGElement, [{\n    key: \"clearContext\",\n    value: function clearContext(ctx) {\n      _get(_getPrototypeOf(SVGElement.prototype), \"clearContext\", this).call(this, ctx);\n\n      this.document.screen.viewPort.removeCurrent();\n    }\n  }, {\n    key: \"setContext\",\n    value: function setContext(ctx) {\n      var document = this.document;\n      var screen = document.screen,\n          window = document.window;\n      var canvas = ctx.canvas;\n      screen.setDefaults(ctx);\n\n      if (canvas.style && typeof ctx.font !== 'undefined' && window && typeof window.getComputedStyle !== 'undefined') {\n        ctx.font = window.getComputedStyle(canvas).getPropertyValue('font');\n        var fontSizeProp = new Property(document, 'fontSize', Font.parse(ctx.font).fontSize);\n\n        if (fontSizeProp.hasValue()) {\n          document.rootEmSize = fontSizeProp.getPixels('y');\n          document.emSize = document.rootEmSize;\n        }\n      }\n\n      _get(_getPrototypeOf(SVGElement.prototype), \"setContext\", this).call(this, ctx); // create new view port\n\n\n      if (!this.getAttribute('x').hasValue()) {\n        this.getAttribute('x', true).setValue(0);\n      }\n\n      if (!this.getAttribute('y').hasValue()) {\n        this.getAttribute('y', true).setValue(0);\n      }\n\n      ctx.translate(this.getAttribute('x').getPixels('x'), this.getAttribute('y').getPixels('y'));\n      var _screen$viewPort = screen.viewPort,\n          width = _screen$viewPort.width,\n          height = _screen$viewPort.height;\n\n      if (!this.getAttribute('width').hasValue()) {\n        this.getAttribute('width', true).setValue('100%');\n      }\n\n      if (!this.getAttribute('height').hasValue()) {\n        this.getAttribute('height', true).setValue('100%');\n      }\n\n      var refXAttr = this.getAttribute('refX');\n      var refYAttr = this.getAttribute('refY');\n      var viewBoxAttr = this.getAttribute('viewBox');\n      var viewBox = viewBoxAttr.hasValue() ? toNumbers(viewBoxAttr.getString()) : null;\n      var clip = !this.root && this.getAttribute('overflow').getValue('hidden') !== 'visible';\n      var minX = 0;\n      var minY = 0;\n      var clipX = 0;\n      var clipY = 0;\n\n      if (viewBox) {\n        minX = viewBox[0];\n        minY = viewBox[1];\n      }\n\n      if (!this.root) {\n        width = this.getAttribute('width').getPixels('x');\n        height = this.getAttribute('height').getPixels('y');\n\n        if (this.type === 'marker') {\n          clipX = minX;\n          clipY = minY;\n          minX = 0;\n          minY = 0;\n        }\n      }\n\n      screen.viewPort.setCurrent(width, height);\n\n      if (viewBox) {\n        width = viewBox[2];\n        height = viewBox[3];\n      }\n\n      document.setViewBox({\n        ctx: ctx,\n        aspectRatio: this.getAttribute('preserveAspectRatio').getString(),\n        width: screen.viewPort.width,\n        desiredWidth: width,\n        height: screen.viewPort.height,\n        desiredHeight: height,\n        minX: minX,\n        minY: minY,\n        refX: refXAttr.getValue(),\n        refY: refYAttr.getValue(),\n        clip: clip,\n        clipX: clipX,\n        clipY: clipY\n      });\n\n      if (viewBox) {\n        screen.viewPort.removeCurrent();\n        screen.viewPort.setCurrent(width, height);\n      }\n    }\n    /**\n     * Resize SVG to fit in given size.\n     * @param width\n     * @param height\n     * @param preserveAspectRatio\n     */\n\n  }, {\n    key: \"resize\",\n    value: function resize(width) {\n      var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : width;\n      var preserveAspectRatio = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n      var widthAttr = this.getAttribute('width', true);\n      var heightAttr = this.getAttribute('height', true);\n      var viewBoxAttr = this.getAttribute('viewBox');\n      var styleAttr = this.getAttribute('style');\n      var originWidth = widthAttr.getNumber(0);\n      var originHeight = heightAttr.getNumber(0);\n\n      if (preserveAspectRatio) {\n        if (typeof preserveAspectRatio === 'string') {\n          this.getAttribute('preserveAspectRatio', true).setValue(preserveAspectRatio);\n        } else {\n          var preserveAspectRatioAttr = this.getAttribute('preserveAspectRatio');\n\n          if (preserveAspectRatioAttr.hasValue()) {\n            preserveAspectRatioAttr.setValue(preserveAspectRatioAttr.getString().replace(/^\\s*(\\S.*\\S)\\s*$/, '$1'));\n          }\n        }\n      }\n\n      widthAttr.setValue(width);\n      heightAttr.setValue(height);\n\n      if (!viewBoxAttr.hasValue()) {\n        viewBoxAttr.setValue(\"0 0 \".concat(originWidth || width, \" \").concat(originHeight || height));\n      }\n\n      if (styleAttr.hasValue()) {\n        var widthStyle = this.getStyle('width');\n        var heightStyle = this.getStyle('height');\n\n        if (widthStyle.hasValue()) {\n          widthStyle.setValue(\"\".concat(width, \"px\"));\n        }\n\n        if (heightStyle.hasValue()) {\n          heightStyle.setValue(\"\".concat(height, \"px\"));\n        }\n      }\n    }\n  }]);\n\n  return SVGElement;\n}(RenderedElement);\n\nfunction _createSuper$a(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$a()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$a() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar RectElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(RectElement, _PathElement);\n\n  var _super = _createSuper$a(RectElement);\n\n  function RectElement() {\n    var _this;\n\n    _classCallCheck(this, RectElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'rect';\n    return _this;\n  }\n\n  _createClass(RectElement, [{\n    key: \"path\",\n    value: function path(ctx) {\n      var x = this.getAttribute('x').getPixels('x');\n      var y = this.getAttribute('y').getPixels('y');\n      var width = this.getAttribute('width').getPixels('x');\n      var height = this.getAttribute('height').getPixels('y');\n      var rxAttr = this.getAttribute('rx');\n      var ryAttr = this.getAttribute('ry');\n      var rx = rxAttr.getPixels('x');\n      var ry = ryAttr.getPixels('y');\n\n      if (rxAttr.hasValue() && !ryAttr.hasValue()) {\n        ry = rx;\n      }\n\n      if (ryAttr.hasValue() && !rxAttr.hasValue()) {\n        rx = ry;\n      }\n\n      rx = Math.min(rx, width / 2.0);\n      ry = Math.min(ry, height / 2.0);\n\n      if (ctx) {\n        var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\n        ctx.beginPath(); // always start the path so we don't fill prior paths\n\n        if (height > 0 && width > 0) {\n          ctx.moveTo(x + rx, y);\n          ctx.lineTo(x + width - rx, y);\n          ctx.bezierCurveTo(x + width - rx + KAPPA * rx, y, x + width, y + ry - KAPPA * ry, x + width, y + ry);\n          ctx.lineTo(x + width, y + height - ry);\n          ctx.bezierCurveTo(x + width, y + height - ry + KAPPA * ry, x + width - rx + KAPPA * rx, y + height, x + width - rx, y + height);\n          ctx.lineTo(x + rx, y + height);\n          ctx.bezierCurveTo(x + rx - KAPPA * rx, y + height, x, y + height - ry + KAPPA * ry, x, y + height - ry);\n          ctx.lineTo(x, y + ry);\n          ctx.bezierCurveTo(x, y + ry - KAPPA * ry, x + rx - KAPPA * rx, y, x + rx, y);\n          ctx.closePath();\n        }\n      }\n\n      return new BoundingBox(x, y, x + width, y + height);\n    }\n  }, {\n    key: \"getMarkers\",\n    value: function getMarkers() {\n      return null;\n    }\n  }]);\n\n  return RectElement;\n}(PathElement);\n\nfunction _createSuper$b(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$b()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$b() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar CircleElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(CircleElement, _PathElement);\n\n  var _super = _createSuper$b(CircleElement);\n\n  function CircleElement() {\n    var _this;\n\n    _classCallCheck(this, CircleElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'circle';\n    return _this;\n  }\n\n  _createClass(CircleElement, [{\n    key: \"path\",\n    value: function path(ctx) {\n      var cx = this.getAttribute('cx').getPixels('x');\n      var cy = this.getAttribute('cy').getPixels('y');\n      var r = this.getAttribute('r').getPixels();\n\n      if (ctx && r > 0) {\n        ctx.beginPath();\n        ctx.arc(cx, cy, r, 0, Math.PI * 2, false);\n        ctx.closePath();\n      }\n\n      return new BoundingBox(cx - r, cy - r, cx + r, cy + r);\n    }\n  }, {\n    key: \"getMarkers\",\n    value: function getMarkers() {\n      return null;\n    }\n  }]);\n\n  return CircleElement;\n}(PathElement);\n\nfunction _createSuper$c(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$c()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$c() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar EllipseElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(EllipseElement, _PathElement);\n\n  var _super = _createSuper$c(EllipseElement);\n\n  function EllipseElement() {\n    var _this;\n\n    _classCallCheck(this, EllipseElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'ellipse';\n    return _this;\n  }\n\n  _createClass(EllipseElement, [{\n    key: \"path\",\n    value: function path(ctx) {\n      var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\n      var rx = this.getAttribute('rx').getPixels('x');\n      var ry = this.getAttribute('ry').getPixels('y');\n      var cx = this.getAttribute('cx').getPixels('x');\n      var cy = this.getAttribute('cy').getPixels('y');\n\n      if (ctx) {\n        ctx.beginPath();\n        ctx.moveTo(cx + rx, cy);\n        ctx.bezierCurveTo(cx + rx, cy + KAPPA * ry, cx + KAPPA * rx, cy + ry, cx, cy + ry);\n        ctx.bezierCurveTo(cx - KAPPA * rx, cy + ry, cx - rx, cy + KAPPA * ry, cx - rx, cy);\n        ctx.bezierCurveTo(cx - rx, cy - KAPPA * ry, cx - KAPPA * rx, cy - ry, cx, cy - ry);\n        ctx.bezierCurveTo(cx + KAPPA * rx, cy - ry, cx + rx, cy - KAPPA * ry, cx + rx, cy);\n        ctx.closePath();\n      }\n\n      return new BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);\n    }\n  }, {\n    key: \"getMarkers\",\n    value: function getMarkers() {\n      return null;\n    }\n  }]);\n\n  return EllipseElement;\n}(PathElement);\n\nfunction _createSuper$d(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$d()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$d() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar LineElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(LineElement, _PathElement);\n\n  var _super = _createSuper$d(LineElement);\n\n  function LineElement() {\n    var _this;\n\n    _classCallCheck(this, LineElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'line';\n    return _this;\n  }\n\n  _createClass(LineElement, [{\n    key: \"getPoints\",\n    value: function getPoints() {\n      return [new Point(this.getAttribute('x1').getPixels('x'), this.getAttribute('y1').getPixels('y')), new Point(this.getAttribute('x2').getPixels('x'), this.getAttribute('y2').getPixels('y'))];\n    }\n  }, {\n    key: \"path\",\n    value: function path(ctx) {\n      var _this$getPoints = this.getPoints(),\n          _this$getPoints2 = _slicedToArray(_this$getPoints, 2),\n          _this$getPoints2$ = _this$getPoints2[0],\n          x0 = _this$getPoints2$.x,\n          y0 = _this$getPoints2$.y,\n          _this$getPoints2$2 = _this$getPoints2[1],\n          x1 = _this$getPoints2$2.x,\n          y1 = _this$getPoints2$2.y;\n\n      if (ctx) {\n        ctx.beginPath();\n        ctx.moveTo(x0, y0);\n        ctx.lineTo(x1, y1);\n      }\n\n      return new BoundingBox(x0, y0, x1, y1);\n    }\n  }, {\n    key: \"getMarkers\",\n    value: function getMarkers() {\n      var _this$getPoints3 = this.getPoints(),\n          _this$getPoints4 = _slicedToArray(_this$getPoints3, 2),\n          p0 = _this$getPoints4[0],\n          p1 = _this$getPoints4[1];\n\n      var a = p0.angleTo(p1);\n      return [[p0, a], [p1, a]];\n    }\n  }]);\n\n  return LineElement;\n}(PathElement);\n\nfunction _createSuper$e(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$e()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$e() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar PolylineElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(PolylineElement, _PathElement);\n\n  var _super = _createSuper$e(PolylineElement);\n\n  function PolylineElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, PolylineElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'polyline';\n    _this.points = [];\n    _this.points = Point.parsePath(_this.getAttribute('points').getString());\n    return _this;\n  }\n\n  _createClass(PolylineElement, [{\n    key: \"path\",\n    value: function path(ctx) {\n      var points = this.points;\n\n      var _points = _slicedToArray(points, 1),\n          _points$ = _points[0],\n          x0 = _points$.x,\n          y0 = _points$.y;\n\n      var boundingBox = new BoundingBox(x0, y0);\n\n      if (ctx) {\n        ctx.beginPath();\n        ctx.moveTo(x0, y0);\n      }\n\n      points.forEach(function (_ref) {\n        var x = _ref.x,\n            y = _ref.y;\n        boundingBox.addPoint(x, y);\n\n        if (ctx) {\n          ctx.lineTo(x, y);\n        }\n      });\n      return boundingBox;\n    }\n  }, {\n    key: \"getMarkers\",\n    value: function getMarkers() {\n      var points = this.points;\n      var lastIndex = points.length - 1;\n      var markers = [];\n      points.forEach(function (point, i) {\n        if (i === lastIndex) {\n          return;\n        }\n\n        markers.push([point, point.angleTo(points[i + 1])]);\n      });\n\n      if (markers.length > 0) {\n        markers.push([points[points.length - 1], markers[markers.length - 1][1]]);\n      }\n\n      return markers;\n    }\n  }]);\n\n  return PolylineElement;\n}(PathElement);\n\nfunction _createSuper$f(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$f()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$f() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar PolygonElement = /*#__PURE__*/function (_PolylineElement) {\n  _inherits(PolygonElement, _PolylineElement);\n\n  var _super = _createSuper$f(PolygonElement);\n\n  function PolygonElement() {\n    var _this;\n\n    _classCallCheck(this, PolygonElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'polygon';\n    return _this;\n  }\n\n  _createClass(PolygonElement, [{\n    key: \"path\",\n    value: function path(ctx) {\n      var boundingBox = _get(_getPrototypeOf(PolygonElement.prototype), \"path\", this).call(this, ctx);\n\n      var _this$points = _slicedToArray(this.points, 1),\n          _this$points$ = _this$points[0],\n          x = _this$points$.x,\n          y = _this$points$.y;\n\n      if (ctx) {\n        ctx.lineTo(x, y);\n        ctx.closePath();\n      }\n\n      return boundingBox;\n    }\n  }]);\n\n  return PolygonElement;\n}(PolylineElement);\n\nfunction _createSuper$g(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$g()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$g() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar PatternElement = /*#__PURE__*/function (_Element) {\n  _inherits(PatternElement, _Element);\n\n  var _super = _createSuper$g(PatternElement);\n\n  function PatternElement() {\n    var _this;\n\n    _classCallCheck(this, PatternElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'pattern';\n    return _this;\n  }\n\n  _createClass(PatternElement, [{\n    key: \"createPattern\",\n    value: function createPattern(ctx, _, parentOpacityProp) {\n      var width = this.getAttribute('width').getPixels('x', true);\n      var height = this.getAttribute('height').getPixels('y', true); // render me using a temporary svg element\n\n      var patternSvg = new SVGElement(this.document, null);\n      patternSvg.attributes.viewBox = new Property(this.document, 'viewBox', this.getAttribute('viewBox').getValue());\n      patternSvg.attributes.width = new Property(this.document, 'width', \"\".concat(width, \"px\"));\n      patternSvg.attributes.height = new Property(this.document, 'height', \"\".concat(height, \"px\"));\n      patternSvg.attributes.transform = new Property(this.document, 'transform', this.getAttribute('patternTransform').getValue());\n      patternSvg.children = this.children;\n      var patternCanvas = this.document.createCanvas(width, height);\n      var patternCtx = patternCanvas.getContext('2d');\n      var xAttr = this.getAttribute('x');\n      var yAttr = this.getAttribute('y');\n\n      if (xAttr.hasValue() && yAttr.hasValue()) {\n        patternCtx.translate(xAttr.getPixels('x', true), yAttr.getPixels('y', true));\n      }\n\n      if (parentOpacityProp.hasValue()) {\n        this.styles['fill-opacity'] = parentOpacityProp;\n      } else {\n        Reflect.deleteProperty(this.styles, 'fill-opacity');\n      } // render 3x3 grid so when we transform there's no white space on edges\n\n\n      for (var x = -1; x <= 1; x++) {\n        for (var y = -1; y <= 1; y++) {\n          patternCtx.save();\n          patternSvg.attributes.x = new Property(this.document, 'x', x * patternCanvas.width);\n          patternSvg.attributes.y = new Property(this.document, 'y', y * patternCanvas.height);\n          patternSvg.render(patternCtx);\n          patternCtx.restore();\n        }\n      }\n\n      var pattern = ctx.createPattern(patternCanvas, 'repeat');\n      return pattern;\n    }\n  }]);\n\n  return PatternElement;\n}(Element);\n\nfunction _createSuper$h(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$h()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$h() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar MarkerElement = /*#__PURE__*/function (_Element) {\n  _inherits(MarkerElement, _Element);\n\n  var _super = _createSuper$h(MarkerElement);\n\n  function MarkerElement() {\n    var _this;\n\n    _classCallCheck(this, MarkerElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'marker';\n    return _this;\n  }\n\n  _createClass(MarkerElement, [{\n    key: \"render\",\n    value: function render(ctx, point, angle) {\n      if (!point) {\n        return;\n      }\n\n      var x = point.x,\n          y = point.y;\n      var orient = this.getAttribute('orient').getValue('auto');\n      var markerUnits = this.getAttribute('markerUnits').getValue('strokeWidth');\n      ctx.translate(x, y);\n\n      if (orient === 'auto') {\n        ctx.rotate(angle);\n      }\n\n      if (markerUnits === 'strokeWidth') {\n        ctx.scale(ctx.lineWidth, ctx.lineWidth);\n      }\n\n      ctx.save(); // render me using a temporary svg element\n\n      var markerSvg = new SVGElement(this.document, null);\n      markerSvg.type = this.type;\n      markerSvg.attributes.viewBox = new Property(this.document, 'viewBox', this.getAttribute('viewBox').getValue());\n      markerSvg.attributes.refX = new Property(this.document, 'refX', this.getAttribute('refX').getValue());\n      markerSvg.attributes.refY = new Property(this.document, 'refY', this.getAttribute('refY').getValue());\n      markerSvg.attributes.width = new Property(this.document, 'width', this.getAttribute('markerWidth').getValue());\n      markerSvg.attributes.height = new Property(this.document, 'height', this.getAttribute('markerHeight').getValue());\n      markerSvg.attributes.overflow = new Property(this.document, 'overflow', this.getAttribute('overflow').getValue());\n      markerSvg.attributes.fill = new Property(this.document, 'fill', this.getAttribute('fill').getValue('black'));\n      markerSvg.attributes.stroke = new Property(this.document, 'stroke', this.getAttribute('stroke').getValue('none'));\n      markerSvg.children = this.children;\n      markerSvg.render(ctx);\n      ctx.restore();\n\n      if (markerUnits === 'strokeWidth') {\n        ctx.scale(1 / ctx.lineWidth, 1 / ctx.lineWidth);\n      }\n\n      if (orient === 'auto') {\n        ctx.rotate(-angle);\n      }\n\n      ctx.translate(-x, -y);\n    }\n  }]);\n\n  return MarkerElement;\n}(Element);\n\nfunction _createSuper$i(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$i()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$i() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar DefsElement = /*#__PURE__*/function (_Element) {\n  _inherits(DefsElement, _Element);\n\n  var _super = _createSuper$i(DefsElement);\n\n  function DefsElement() {\n    var _this;\n\n    _classCallCheck(this, DefsElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'defs';\n    return _this;\n  }\n\n  _createClass(DefsElement, [{\n    key: \"render\",\n    value: function render() {// NOOP\n    }\n  }]);\n\n  return DefsElement;\n}(Element);\n\nfunction _createSuper$j(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$j()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$j() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar GElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(GElement, _RenderedElement);\n\n  var _super = _createSuper$j(GElement);\n\n  function GElement() {\n    var _this;\n\n    _classCallCheck(this, GElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'g';\n    return _this;\n  }\n\n  _createClass(GElement, [{\n    key: \"getBoundingBox\",\n    value: function getBoundingBox(ctx) {\n      var boundingBox = new BoundingBox();\n      this.children.forEach(function (child) {\n        boundingBox.addBoundingBox(child.getBoundingBox(ctx));\n      });\n      return boundingBox;\n    }\n  }]);\n\n  return GElement;\n}(RenderedElement);\n\nfunction _createSuper$k(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$k()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$k() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar GradientElement = /*#__PURE__*/function (_Element) {\n  _inherits(GradientElement, _Element);\n\n  var _super = _createSuper$k(GradientElement);\n\n  function GradientElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, GradientElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.attributesToInherit = ['gradientUnits'];\n    _this.stops = [];\n\n    var _assertThisInitialize = _assertThisInitialized(_this),\n        stops = _assertThisInitialize.stops,\n        children = _assertThisInitialize.children;\n\n    children.forEach(function (child) {\n      if (child.type === 'stop') {\n        stops.push(child);\n      }\n    });\n    return _this;\n  }\n\n  _createClass(GradientElement, [{\n    key: \"getGradientUnits\",\n    value: function getGradientUnits() {\n      return this.getAttribute('gradientUnits').getString('objectBoundingBox');\n    }\n  }, {\n    key: \"createGradient\",\n    value: function createGradient(ctx, element, parentOpacityProp) {\n      var _this2 = this;\n\n      // tslint:disable-next-line: no-this-assignment\n      var stopsContainer = this;\n\n      if (this.getHrefAttribute().hasValue()) {\n        stopsContainer = this.getHrefAttribute().getDefinition();\n        this.inheritStopContainer(stopsContainer);\n      }\n\n      var _stopsContainer = stopsContainer,\n          stops = _stopsContainer.stops;\n      var gradient = this.getGradient(ctx, element);\n\n      if (!gradient) {\n        return this.addParentOpacity(parentOpacityProp, stops[stops.length - 1].color);\n      }\n\n      stops.forEach(function (stop) {\n        gradient.addColorStop(stop.offset, _this2.addParentOpacity(parentOpacityProp, stop.color));\n      });\n\n      if (this.getAttribute('gradientTransform').hasValue()) {\n        // render as transformed pattern on temporary canvas\n        var document = this.document;\n        var _document$screen = document.screen,\n            MAX_VIRTUAL_PIXELS = _document$screen.MAX_VIRTUAL_PIXELS,\n            viewPort = _document$screen.viewPort;\n\n        var _viewPort$viewPorts = _slicedToArray(viewPort.viewPorts, 1),\n            rootView = _viewPort$viewPorts[0];\n\n        var rect = new RectElement(document, null);\n        rect.attributes.x = new Property(document, 'x', -MAX_VIRTUAL_PIXELS / 3.0);\n        rect.attributes.y = new Property(document, 'y', -MAX_VIRTUAL_PIXELS / 3.0);\n        rect.attributes.width = new Property(document, 'width', MAX_VIRTUAL_PIXELS);\n        rect.attributes.height = new Property(document, 'height', MAX_VIRTUAL_PIXELS);\n        var group = new GElement(document, null);\n        group.attributes.transform = new Property(document, 'transform', this.getAttribute('gradientTransform').getValue());\n        group.children = [rect];\n        var patternSvg = new SVGElement(document, null);\n        patternSvg.attributes.x = new Property(document, 'x', 0);\n        patternSvg.attributes.y = new Property(document, 'y', 0);\n        patternSvg.attributes.width = new Property(document, 'width', rootView.width);\n        patternSvg.attributes.height = new Property(document, 'height', rootView.height);\n        patternSvg.children = [group];\n        var patternCanvas = document.createCanvas(rootView.width, rootView.height);\n        var patternCtx = patternCanvas.getContext('2d');\n        patternCtx.fillStyle = gradient;\n        patternSvg.render(patternCtx);\n        return patternCtx.createPattern(patternCanvas, 'no-repeat');\n      }\n\n      return gradient;\n    }\n  }, {\n    key: \"inheritStopContainer\",\n    value: function inheritStopContainer(stopsContainer) {\n      var _this3 = this;\n\n      this.attributesToInherit.forEach(function (attributeToInherit) {\n        if (!_this3.getAttribute(attributeToInherit).hasValue() && stopsContainer.getAttribute(attributeToInherit).hasValue()) {\n          _this3.getAttribute(attributeToInherit, true).setValue(stopsContainer.getAttribute(attributeToInherit).getValue());\n        }\n      });\n    }\n  }, {\n    key: \"addParentOpacity\",\n    value: function addParentOpacity(parentOpacityProp, color) {\n      if (parentOpacityProp.hasValue()) {\n        var colorProp = new Property(this.document, 'color', color);\n        return colorProp.addOpacity(parentOpacityProp).getString();\n      }\n\n      return color;\n    }\n  }]);\n\n  return GradientElement;\n}(Element);\n\nfunction _createSuper$l(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$l()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$l() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar LinearGradientElement = /*#__PURE__*/function (_GradientElement) {\n  _inherits(LinearGradientElement, _GradientElement);\n\n  var _super = _createSuper$l(LinearGradientElement);\n\n  function LinearGradientElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, LinearGradientElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'linearGradient';\n\n    _this.attributesToInherit.push('x1', 'y1', 'x2', 'y2');\n\n    return _this;\n  }\n\n  _createClass(LinearGradientElement, [{\n    key: \"getGradient\",\n    value: function getGradient(ctx, element) {\n      var boundingBox = this.getGradientUnits() === 'objectBoundingBox' ? element.getBoundingBox(ctx) : null;\n\n      if (!this.getAttribute('x1').hasValue() && !this.getAttribute('y1').hasValue() && !this.getAttribute('x2').hasValue() && !this.getAttribute('y2').hasValue()) {\n        this.getAttribute('x1', true).setValue(0);\n        this.getAttribute('y1', true).setValue(0);\n        this.getAttribute('x2', true).setValue(1);\n        this.getAttribute('y2', true).setValue(0);\n      }\n\n      var x1 = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.x + boundingBox.width * this.getAttribute('x1').getNumber() : this.getAttribute('x1').getPixels('x');\n      var y1 = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.y + boundingBox.height * this.getAttribute('y1').getNumber() : this.getAttribute('y1').getPixels('y');\n      var x2 = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.x + boundingBox.width * this.getAttribute('x2').getNumber() : this.getAttribute('x2').getPixels('x');\n      var y2 = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.y + boundingBox.height * this.getAttribute('y2').getNumber() : this.getAttribute('y2').getPixels('y');\n\n      if (x1 === x2 && y1 === y2) {\n        return null;\n      }\n\n      return ctx.createLinearGradient(x1, y1, x2, y2);\n    }\n  }]);\n\n  return LinearGradientElement;\n}(GradientElement);\n\nfunction _createSuper$m(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$m()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$m() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar RadialGradientElement = /*#__PURE__*/function (_GradientElement) {\n  _inherits(RadialGradientElement, _GradientElement);\n\n  var _super = _createSuper$m(RadialGradientElement);\n\n  function RadialGradientElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, RadialGradientElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'radialGradient';\n\n    _this.attributesToInherit.push('cx', 'cy', 'r', 'fx', 'fy', 'fr');\n\n    return _this;\n  }\n\n  _createClass(RadialGradientElement, [{\n    key: \"getGradient\",\n    value: function getGradient(ctx, element) {\n      var boundingBox = element.getBoundingBox(ctx);\n\n      if (!this.getAttribute('cx').hasValue()) {\n        this.getAttribute('cx', true).setValue('50%');\n      }\n\n      if (!this.getAttribute('cy').hasValue()) {\n        this.getAttribute('cy', true).setValue('50%');\n      }\n\n      if (!this.getAttribute('r').hasValue()) {\n        this.getAttribute('r', true).setValue('50%');\n      }\n\n      var cx = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.x + boundingBox.width * this.getAttribute('cx').getNumber() : this.getAttribute('cx').getPixels('x');\n      var cy = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.y + boundingBox.height * this.getAttribute('cy').getNumber() : this.getAttribute('cy').getPixels('y');\n      var fx = cx;\n      var fy = cy;\n\n      if (this.getAttribute('fx').hasValue()) {\n        fx = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.x + boundingBox.width * this.getAttribute('fx').getNumber() : this.getAttribute('fx').getPixels('x');\n      }\n\n      if (this.getAttribute('fy').hasValue()) {\n        fy = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.y + boundingBox.height * this.getAttribute('fy').getNumber() : this.getAttribute('fy').getPixels('y');\n      }\n\n      var r = this.getGradientUnits() === 'objectBoundingBox' ? (boundingBox.width + boundingBox.height) / 2.0 * this.getAttribute('r').getNumber() : this.getAttribute('r').getPixels();\n      var fr = this.getAttribute('fr').getPixels();\n      return ctx.createRadialGradient(fx, fy, fr, cx, cy, r);\n    }\n  }]);\n\n  return RadialGradientElement;\n}(GradientElement);\n\nfunction _createSuper$n(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$n()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$n() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar StopElement = /*#__PURE__*/function (_Element) {\n  _inherits(StopElement, _Element);\n\n  var _super = _createSuper$n(StopElement);\n\n  function StopElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, StopElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'stop';\n    var offset = Math.max(0, Math.min(1, _this.getAttribute('offset').getNumber()));\n\n    var stopOpacity = _this.getStyle('stop-opacity');\n\n    var stopColor = _this.getStyle('stop-color', true);\n\n    if (stopColor.getString() === '') {\n      stopColor.setValue('#000');\n    }\n\n    if (stopOpacity.hasValue()) {\n      stopColor = stopColor.addOpacity(stopOpacity);\n    }\n\n    _this.offset = offset;\n    _this.color = stopColor.getString();\n    return _this;\n  }\n\n  return StopElement;\n}(Element);\n\nfunction _createSuper$o(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$o()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$o() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar AnimateElement = /*#__PURE__*/function (_Element) {\n  _inherits(AnimateElement, _Element);\n\n  var _super = _createSuper$o(AnimateElement);\n\n  function AnimateElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, AnimateElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'animate';\n    _this.duration = 0;\n    _this.initialValue = null;\n    _this.initialUnits = '';\n    _this.removed = false;\n    _this.frozen = false;\n    document.screen.animations.push(_assertThisInitialized(_this));\n    _this.begin = _this.getAttribute('begin').getMilliseconds();\n    _this.maxDuration = _this.begin + _this.getAttribute('dur').getMilliseconds();\n    _this.from = _this.getAttribute('from');\n    _this.to = _this.getAttribute('to');\n    _this.values = _this.getAttribute('values');\n\n    if (_this.values.hasValue()) {\n      _this.values.setValue(_this.values.getString().split(';'));\n    }\n\n    return _this;\n  }\n\n  _createClass(AnimateElement, [{\n    key: \"getProperty\",\n    value: function getProperty() {\n      var attributeType = this.getAttribute('attributeType').getString();\n      var attributeName = this.getAttribute('attributeName').getString();\n\n      if (attributeType === 'CSS') {\n        return this.parent.getStyle(attributeName, true);\n      }\n\n      return this.parent.getAttribute(attributeName, true);\n    }\n  }, {\n    key: \"calcValue\",\n    value: function calcValue() {\n      var initialUnits = this.initialUnits;\n\n      var _this$getProgress = this.getProgress(),\n          progress = _this$getProgress.progress,\n          from = _this$getProgress.from,\n          to = _this$getProgress.to; // tween value linearly\n\n\n      var newValue = from.getNumber() + (to.getNumber() - from.getNumber()) * progress;\n\n      if (initialUnits === '%') {\n        newValue *= 100.0; // numValue() returns 0-1 whereas properties are 0-100\n      }\n\n      return \"\".concat(newValue).concat(initialUnits);\n    }\n  }, {\n    key: \"update\",\n    value: function update(delta) {\n      var parent = this.parent;\n      var prop = this.getProperty(); // set initial value\n\n      if (!this.initialValue) {\n        this.initialValue = prop.getString();\n        this.initialUnits = prop.getUnits();\n      } // if we're past the end time\n\n\n      if (this.duration > this.maxDuration) {\n        var fill = this.getAttribute('fill').getString('remove'); // loop for indefinitely repeating animations\n\n        if (this.getAttribute('repeatCount').getString() === 'indefinite' || this.getAttribute('repeatDur').getString() === 'indefinite') {\n          this.duration = 0;\n        } else if (fill === 'freeze' && !this.frozen) {\n          this.frozen = true;\n          parent.animationFrozen = true;\n          parent.animationFrozenValue = prop.getString();\n        } else if (fill === 'remove' && !this.removed) {\n          this.removed = true;\n          prop.setValue(parent.animationFrozen ? parent.animationFrozenValue : this.initialValue);\n          return true;\n        }\n\n        return false;\n      }\n\n      this.duration += delta; // if we're past the begin time\n\n      var updated = false;\n\n      if (this.begin < this.duration) {\n        var newValue = this.calcValue(); // tween\n\n        var typeAttr = this.getAttribute('type');\n\n        if (typeAttr.hasValue()) {\n          // for transform, etc.\n          var type = typeAttr.getString();\n          newValue = \"\".concat(type, \"(\").concat(newValue, \")\");\n        }\n\n        prop.setValue(newValue);\n        updated = true;\n      }\n\n      return updated;\n    }\n  }, {\n    key: \"getProgress\",\n    value: function getProgress() {\n      var document = this.document,\n          values = this.values;\n      var result = {\n        progress: (this.duration - this.begin) / (this.maxDuration - this.begin)\n      };\n\n      if (values.hasValue()) {\n        var p = result.progress * (values.getValue().length - 1);\n        var lb = Math.floor(p);\n        var ub = Math.ceil(p);\n        result.from = new Property(document, 'from', parseFloat(values.getValue()[lb]));\n        result.to = new Property(document, 'to', parseFloat(values.getValue()[ub]));\n        result.progress = (p - lb) / (ub - lb);\n      } else {\n        result.from = this.from;\n        result.to = this.to;\n      }\n\n      return result;\n    }\n  }]);\n\n  return AnimateElement;\n}(Element);\n\nfunction _createSuper$p(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$p()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$p() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar AnimateColorElement = /*#__PURE__*/function (_AnimateElement) {\n  _inherits(AnimateColorElement, _AnimateElement);\n\n  var _super = _createSuper$p(AnimateColorElement);\n\n  function AnimateColorElement() {\n    var _this;\n\n    _classCallCheck(this, AnimateColorElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'animateColor';\n    return _this;\n  }\n\n  _createClass(AnimateColorElement, [{\n    key: \"calcValue\",\n    value: function calcValue() {\n      var _this$getProgress = this.getProgress(),\n          progress = _this$getProgress.progress,\n          from = _this$getProgress.from,\n          to = _this$getProgress.to;\n\n      var colorFrom = new RGBColor(from.getString());\n      var colorTo = new RGBColor(to.getString());\n\n      if (colorFrom.ok && colorTo.ok) {\n        // tween color linearly\n        var r = colorFrom.r + (colorTo.r - colorFrom.r) * progress;\n        var g = colorFrom.g + (colorTo.g - colorFrom.g) * progress;\n        var b = colorFrom.b + (colorTo.b - colorFrom.b) * progress; // ? alpha\n\n        return \"rgb(\".concat(parseInt(r, 10), \", \").concat(parseInt(g, 10), \", \").concat(parseInt(b, 10), \")\");\n      }\n\n      return this.getAttribute('from').getString();\n    }\n  }]);\n\n  return AnimateColorElement;\n}(AnimateElement);\n\nfunction _createSuper$q(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$q()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$q() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar AnimateTransformElement = /*#__PURE__*/function (_AnimateElement) {\n  _inherits(AnimateTransformElement, _AnimateElement);\n\n  var _super = _createSuper$q(AnimateTransformElement);\n\n  function AnimateTransformElement() {\n    var _this;\n\n    _classCallCheck(this, AnimateTransformElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'animateTransform';\n    return _this;\n  }\n\n  _createClass(AnimateTransformElement, [{\n    key: \"calcValue\",\n    value: function calcValue() {\n      var _this$getProgress = this.getProgress(),\n          progress = _this$getProgress.progress,\n          from = _this$getProgress.from,\n          to = _this$getProgress.to; // tween value linearly\n\n\n      var transformFrom = toNumbers(from.getString());\n      var transformTo = toNumbers(to.getString());\n      var newValue = transformFrom.map(function (from, i) {\n        var to = transformTo[i];\n        return from + (to - from) * progress;\n      }).join(' ');\n      return newValue;\n    }\n  }]);\n\n  return AnimateTransformElement;\n}(AnimateElement);\n\nfunction _createForOfIteratorHelper(o) { if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\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(n); 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 _createSuper$r(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$r()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$r() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FontElement = /*#__PURE__*/function (_Element) {\n  _inherits(FontElement, _Element);\n\n  var _super = _createSuper$r(FontElement);\n\n  function FontElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, FontElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'font';\n    _this.glyphs = {};\n    _this.horizAdvX = _this.getAttribute('horiz-adv-x').getNumber();\n    var definitions = document.definitions;\n\n    var _assertThisInitialize = _assertThisInitialized(_this),\n        children = _assertThisInitialize.children;\n\n    var _iterator = _createForOfIteratorHelper(children),\n        _step;\n\n    try {\n      for (_iterator.s(); !(_step = _iterator.n()).done;) {\n        var child = _step.value;\n\n        switch (child.type) {\n          case 'font-face':\n            {\n              _this.fontFace = child;\n              var fontFamilyStyle = child.getStyle('font-family');\n\n              if (fontFamilyStyle.hasValue()) {\n                definitions[fontFamilyStyle.getString()] = _assertThisInitialized(_this);\n              }\n\n              break;\n            }\n\n          case 'missing-glyph':\n            _this.missingGlyph = child;\n            break;\n\n          case 'glyph':\n            {\n              var glyph = child;\n\n              if (glyph.arabicForm) {\n                _this.isRTL = true;\n                _this.isArabic = true;\n\n                if (typeof _this.glyphs[glyph.unicode] === 'undefined') {\n                  _this.glyphs[glyph.unicode] = {};\n                }\n\n                _this.glyphs[glyph.unicode][glyph.arabicForm] = glyph;\n              } else {\n                _this.glyphs[glyph.unicode] = glyph;\n              }\n\n              break;\n            }\n\n          default:\n        }\n      }\n    } catch (err) {\n      _iterator.e(err);\n    } finally {\n      _iterator.f();\n    }\n\n    return _this;\n  }\n\n  _createClass(FontElement, [{\n    key: \"render\",\n    value: function render() {// NO RENDER\n    }\n  }]);\n\n  return FontElement;\n}(Element);\n\nfunction _createSuper$s(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$s()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$s() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FontFaceElement = /*#__PURE__*/function (_Element) {\n  _inherits(FontFaceElement, _Element);\n\n  var _super = _createSuper$s(FontFaceElement);\n\n  function FontFaceElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, FontFaceElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'font-face';\n    _this.ascent = _this.getAttribute('ascent').getNumber();\n    _this.descent = _this.getAttribute('descent').getNumber();\n    _this.unitsPerEm = _this.getAttribute('units-per-em').getNumber();\n    return _this;\n  }\n\n  return FontFaceElement;\n}(Element);\n\nfunction _createSuper$t(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$t()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$t() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar MissingGlyphElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(MissingGlyphElement, _PathElement);\n\n  var _super = _createSuper$t(MissingGlyphElement);\n\n  function MissingGlyphElement() {\n    var _this;\n\n    _classCallCheck(this, MissingGlyphElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'missing-glyph';\n    _this.horizAdvX = 0;\n    return _this;\n  }\n\n  return MissingGlyphElement;\n}(PathElement);\n\nfunction _createSuper$u(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$u()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$u() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar GlyphElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(GlyphElement, _PathElement);\n\n  var _super = _createSuper$u(GlyphElement);\n\n  function GlyphElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, GlyphElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'glyph';\n    _this.horizAdvX = _this.getAttribute('horiz-adv-x').getNumber();\n    _this.unicode = _this.getAttribute('unicode').getString();\n    _this.arabicForm = _this.getAttribute('arabic-form').getString();\n    return _this;\n  }\n\n  return GlyphElement;\n}(PathElement);\n\nfunction _createSuper$v(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$v()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$v() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar TRefElement = /*#__PURE__*/function (_TextElement) {\n  _inherits(TRefElement, _TextElement);\n\n  var _super = _createSuper$v(TRefElement);\n\n  function TRefElement() {\n    var _this;\n\n    _classCallCheck(this, TRefElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'tref';\n    return _this;\n  }\n\n  _createClass(TRefElement, [{\n    key: \"getText\",\n    value: function getText() {\n      var element = this.getHrefAttribute().getDefinition();\n\n      if (element) {\n        var firstChild = element.children[0];\n\n        if (firstChild) {\n          return firstChild.getText();\n        }\n      }\n\n      return '';\n    }\n  }]);\n\n  return TRefElement;\n}(TextElement);\n\nfunction _createSuper$w(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$w()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$w() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar AElement = /*#__PURE__*/function (_TextElement) {\n  _inherits(AElement, _TextElement);\n\n  var _super = _createSuper$w(AElement);\n\n  function AElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, AElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'a';\n    var childNodes = node.childNodes;\n    var firstChild = childNodes[0];\n    var hasText = childNodes.length > 0 && Array.from(childNodes).every(function (node) {\n      return node.nodeType === 3;\n    });\n    _this.hasText = hasText;\n    _this.text = hasText ? _this.getTextFromNode(firstChild) : '';\n    return _this;\n  }\n\n  _createClass(AElement, [{\n    key: \"getText\",\n    value: function getText() {\n      return this.text;\n    }\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      if (this.hasText) {\n        // render as text element\n        _get(_getPrototypeOf(AElement.prototype), \"renderChildren\", this).call(this, ctx);\n\n        var document = this.document,\n            x = this.x,\n            y = this.y;\n        var mouse = document.screen.mouse;\n        var fontSize = new Property(document, 'fontSize', Font.parse(document.ctx.font).fontSize); // Do not calc bounding box if mouse is not working.\n\n        if (mouse.isWorking()) {\n          mouse.checkBoundingBox(this, new BoundingBox(x, y - fontSize.getPixels('y'), x + this.measureText(ctx), y));\n        }\n      } else if (this.children.length > 0) {\n        // render as temporary group\n        var g = new GElement(this.document, null);\n        g.children = this.children;\n        g.parent = this;\n        g.render(ctx);\n      }\n    }\n  }, {\n    key: \"onClick\",\n    value: function onClick() {\n      var window = this.document.window;\n\n      if (window) {\n        window.open(this.getHrefAttribute().getString());\n      }\n    }\n  }, {\n    key: \"onMouseMove\",\n    value: function onMouseMove() {\n      var ctx = this.document.ctx;\n      ctx.canvas.style.cursor = 'pointer';\n    }\n  }]);\n\n  return AElement;\n}(TextElement);\n\nfunction _createForOfIteratorHelper$1(o) { if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$1(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$1(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(n); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); }\n\nfunction _arrayLikeToArray$1(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 _createSuper$x(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$x()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$x() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar TextPathElement = /*#__PURE__*/function (_TextElement) {\n  _inherits(TextPathElement, _TextElement);\n\n  var _super = _createSuper$x(TextPathElement);\n\n  function TextPathElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, TextPathElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'textPath';\n    _this.textWidth = 0;\n    _this.textHeight = 0;\n    _this.pathLength = -1;\n    _this.glyphInfo = null;\n    _this.letterSpacingCache = [];\n    _this.measuresCache = new Map([['', 0]]);\n\n    var pathElement = _this.getHrefAttribute().getDefinition();\n\n    _this.text = _this.getTextFromNode();\n    _this.dataArray = _this.parsePathData(pathElement);\n    return _this;\n  }\n\n  _createClass(TextPathElement, [{\n    key: \"getText\",\n    value: function getText() {\n      return this.text;\n    }\n  }, {\n    key: \"path\",\n    value: function path(ctx) {\n      var dataArray = this.dataArray;\n\n      if (ctx) {\n        ctx.beginPath();\n      }\n\n      dataArray.forEach(function (_ref) {\n        var command = _ref.command,\n            points = _ref.points;\n\n        switch (command) {\n          case 'L':\n            if (ctx) {\n              ctx.lineTo(points[0], points[1]);\n            }\n\n            break;\n\n          case 'M':\n            if (ctx) {\n              ctx.moveTo(points[0], points[1]);\n            }\n\n            break;\n\n          case 'C':\n            if (ctx) {\n              ctx.bezierCurveTo(points[0], points[1], points[2], points[3], points[4], points[5]);\n            }\n\n            break;\n\n          case 'Q':\n            if (ctx) {\n              ctx.quadraticCurveTo(points[0], points[1], points[2], points[3]);\n            }\n\n            break;\n\n          case 'A':\n            {\n              var cx = points[0];\n              var cy = points[1];\n              var rx = points[2];\n              var ry = points[3];\n              var theta = points[4];\n              var dTheta = points[5];\n              var psi = points[6];\n              var fs = points[7];\n              var r = rx > ry ? rx : ry;\n              var scaleX = rx > ry ? 1 : rx / ry;\n              var scaleY = rx > ry ? ry / rx : 1;\n\n              if (ctx) {\n                ctx.translate(cx, cy);\n                ctx.rotate(psi);\n                ctx.scale(scaleX, scaleY);\n                ctx.arc(0, 0, r, theta, theta + dTheta, Boolean(1 - fs));\n                ctx.scale(1 / scaleX, 1 / scaleY);\n                ctx.rotate(-psi);\n                ctx.translate(-cx, -cy);\n              }\n\n              break;\n            }\n\n          case 'z':\n            if (ctx) {\n              ctx.closePath();\n            }\n\n            break;\n        }\n      });\n    }\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      this.setTextData(ctx);\n      ctx.save();\n      var textDecoration = this.parent.getStyle('text-decoration').getString();\n      var fontSize = this.getFontSize();\n      var glyphInfo = this.glyphInfo;\n      var fill = ctx.fillStyle;\n\n      if (textDecoration === 'underline') {\n        ctx.beginPath();\n      }\n\n      glyphInfo.forEach(function (glyph, i) {\n        var p0 = glyph.p0,\n            p1 = glyph.p1,\n            partialText = glyph.text;\n        ctx.save();\n        ctx.translate(p0.x, p0.y);\n        ctx.rotate(glyphInfo[i].rotation);\n\n        if (ctx.fillStyle) {\n          ctx.fillText(partialText, 0, 0);\n        }\n\n        if (ctx.strokeStyle) {\n          ctx.strokeText(partialText, 0, 0);\n        }\n\n        ctx.restore();\n\n        if (textDecoration === 'underline') {\n          if (i === 0) {\n            ctx.moveTo(p0.x, p0.y + fontSize / 8);\n          }\n\n          ctx.lineTo(p1.x, p1.y + fontSize / 5);\n        } //// To assist with debugging visually, uncomment following\n        //\n        // ctx.beginPath();\n        // if (i % 2)\n        // \tctx.strokeStyle = 'red';\n        // else\n        // \tctx.strokeStyle = 'green';\n        // ctx.moveTo(p0.x, p0.y);\n        // ctx.lineTo(p1.x, p1.y);\n        // ctx.stroke();\n        // ctx.closePath();\n\n      });\n\n      if (textDecoration === 'underline') {\n        ctx.lineWidth = fontSize / 20;\n        ctx.strokeStyle = fill;\n        ctx.stroke();\n        ctx.closePath();\n      }\n\n      ctx.restore();\n    }\n  }, {\n    key: \"getLetterSpacingAt\",\n    value: function getLetterSpacingAt() {\n      var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n      return this.letterSpacingCache[idx] || 0;\n    }\n  }, {\n    key: \"findSegmentToFitChar\",\n    value: function findSegmentToFitChar(ctx, anchor, textFullWidth, fullPathWidth, spacesNumber, inputOffset, c, charI) {\n      var offset = inputOffset;\n      var glyphWidth = this.measureText(ctx, c);\n\n      if (c === ' ' && anchor === 'justify' && textFullWidth < fullPathWidth) {\n        glyphWidth += (fullPathWidth - textFullWidth) / spacesNumber;\n      }\n\n      if (charI > -1) {\n        offset += this.getLetterSpacingAt(charI);\n      }\n\n      var splineStep = this.textHeight / 20;\n      var segment = {\n        p0: this.getEquidistantPointOnPath(offset, splineStep),\n        p1: this.getEquidistantPointOnPath(offset + glyphWidth, splineStep)\n      };\n      offset += glyphWidth;\n      return {\n        offset: offset,\n        segment: segment\n      };\n    }\n  }, {\n    key: \"measureText\",\n    value: function measureText(ctx, text) {\n      var measuresCache = this.measuresCache;\n      var targetText = text || this.getText();\n\n      if (measuresCache.has(targetText)) {\n        return measuresCache.get(targetText);\n      }\n\n      var measure = this.measureTargetText(ctx, targetText);\n      measuresCache.set(targetText, measure);\n      return measure;\n    } // This method supposes what all custom fonts already loaded.\n    // If some font will be loaded after this method call, <textPath> will not be rendered correctly.\n    // You need to call this method manually to update glyphs cache.\n\n  }, {\n    key: \"setTextData\",\n    value: function setTextData(ctx) {\n      var _this2 = this;\n\n      if (this.glyphInfo) {\n        return;\n      }\n\n      var renderText = this.getText();\n      var chars = renderText.split('');\n      var spacesNumber = renderText.split(' ').length - 1;\n      var dx = toNumbers(this.parent.getAttribute('dx').getString('0'));\n      var anchor = this.parent.getStyle('text-anchor').getString('start');\n      var thisSpacing = this.getStyle('letter-spacing');\n      var parentSpacing = this.parent.getStyle('letter-spacing');\n      var letterSpacing = 0;\n\n      if (!thisSpacing.hasValue() || thisSpacing.getValue() === 'inherit') {\n        letterSpacing = parentSpacing.getPixels();\n      } else if (thisSpacing.hasValue()) {\n        if (thisSpacing.getValue() !== 'initial' && thisSpacing.getValue() !== 'unset') {\n          letterSpacing = thisSpacing.getPixels();\n        }\n      } // fill letter-spacing cache\n\n\n      var letterSpacingCache = [];\n      var textLen = renderText.length;\n      this.letterSpacingCache = letterSpacingCache;\n\n      for (var i = 0; i < textLen; i++) {\n        letterSpacingCache.push(typeof dx[i] !== 'undefined' ? dx[i] : letterSpacing);\n      }\n\n      var dxSum = letterSpacingCache.reduce(function (acc, cur) {\n        return acc + cur || 0;\n      }, 0);\n      this.textWidth = this.measureText(ctx);\n      this.textHeight = this.getFontSize();\n      var textFullWidth = Math.max(this.textWidth + dxSum, 0);\n      this.glyphInfo = [];\n      var fullPathWidth = this.getPathLength();\n      var startOffset = this.getStyle('startOffset').getNumber(0) * fullPathWidth;\n      var offset = 0;\n\n      if (anchor === 'middle' || anchor === 'center') {\n        offset = -textFullWidth / 2;\n      }\n\n      if (anchor === 'end' || anchor === 'right') {\n        offset = -textFullWidth;\n      }\n\n      offset += startOffset;\n      chars.forEach(function (char, i) {\n        // Find such segment what distance between p0 and p1 is approx. width of glyph\n        var _this2$findSegmentToF = _this2.findSegmentToFitChar(ctx, anchor, textFullWidth, fullPathWidth, spacesNumber, offset, char, i),\n            nextOffset = _this2$findSegmentToF.offset,\n            segment = _this2$findSegmentToF.segment;\n\n        offset = nextOffset;\n\n        if (!segment.p0 || !segment.p1) {\n          return;\n        }\n\n        var width = _this2.getLineLength(segment.p0.x, segment.p0.y, segment.p1.x, segment.p1.y); // Note: Since glyphs are rendered one at a time, any kerning pair data built into the font will not be used.\n        // Can foresee having a rough pair table built in that the developer can override as needed.\n        // Or use \"dx\" attribute of the <text> node as a naive replacement\n\n\n        var kern = 0; // placeholder for future implementation\n\n        var midpoint = _this2.getPointOnLine(kern + width / 2.0, segment.p0.x, segment.p0.y, segment.p1.x, segment.p1.y);\n\n        var rotation = Math.atan2(segment.p1.y - segment.p0.y, segment.p1.x - segment.p0.x);\n\n        _this2.glyphInfo.push({\n          transposeX: midpoint.x,\n          transposeY: midpoint.y,\n          text: chars[i],\n          p0: segment.p0,\n          p1: segment.p1,\n          rotation: rotation\n        });\n      });\n    }\n  }, {\n    key: \"parsePathData\",\n    value: function parsePathData(path) {\n      this.pathLength = -1; // reset path length\n\n      if (!path) {\n        return [];\n      }\n\n      var pathCommands = [];\n      var pathParser = path.pathParser;\n      pathParser.reset(); // convert l, H, h, V, and v to L\n\n      while (!pathParser.isEnd()) {\n        var current = pathParser.current;\n        var startX = current ? current.x : 0;\n        var startY = current ? current.y : 0;\n        var cmd = '';\n        var points = [];\n        pathParser.nextCommand();\n        var upperCommand = pathParser.command.toUpperCase();\n\n        switch (pathParser.command) {\n          case 'M':\n          case 'm':\n            cmd = this.pathM(pathParser, points);\n            break;\n\n          case 'L':\n          case 'l':\n            cmd = this.pathL(pathParser, points);\n            break;\n\n          case 'H':\n          case 'h':\n            cmd = this.pathH(pathParser, points);\n            break;\n\n          case 'V':\n          case 'v':\n            cmd = this.pathV(pathParser, points);\n            break;\n\n          case 'C':\n          case 'c':\n            this.pathC(pathParser, points);\n            break;\n\n          case 'S':\n          case 's':\n            cmd = this.pathS(pathParser, points);\n            break;\n\n          case 'Q':\n          case 'q':\n            this.pathQ(pathParser, points);\n            break;\n\n          case 'T':\n          case 't':\n            cmd = this.pathT(pathParser, points);\n            break;\n\n          case 'A':\n          case 'a':\n            points = this.pathA(pathParser);\n            break;\n\n          case 'Z':\n          case 'z':\n            pathParser.current = pathParser.start;\n            break;\n        }\n\n        if (upperCommand !== 'Z') {\n          pathCommands.push({\n            command: cmd || upperCommand,\n            points: points,\n            start: {\n              x: startX,\n              y: startY\n            },\n            pathLength: this.calcLength(startX, startY, cmd || upperCommand, points)\n          });\n        } else {\n          pathCommands.push({\n            command: 'z',\n            points: [],\n            pathLength: 0\n          });\n        }\n      }\n\n      return pathCommands;\n    }\n  }, {\n    key: \"pathM\",\n    value: function pathM(pathParser, points) {\n      var p = pathParser.getAsCurrentPoint(); // pathParser.addMarker(p);\n\n      points.push(p.x, p.y);\n      pathParser.start = pathParser.current;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var _p = pathParser.getAsCurrentPoint();\n\n        points.push(_p.x, _p.y);\n        return 'L';\n      }\n    }\n  }, {\n    key: \"pathL\",\n    value: function pathL(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var p = pathParser.getAsCurrentPoint();\n        points.push(p.x, p.y);\n      }\n\n      return 'L';\n    }\n  }, {\n    key: \"pathH\",\n    value: function pathH(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = new Point((pathParser.isRelativeCommand() ? current.x : 0) + pathParser.getScalar(), current.y);\n        points.push(point.x, point.y);\n        pathParser.current = point;\n      }\n\n      return 'L';\n    }\n  }, {\n    key: \"pathV\",\n    value: function pathV(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = new Point(current.x, (pathParser.isRelativeCommand() ? current.y : 0) + pathParser.getScalar());\n        points.push(point.x, point.y);\n        pathParser.current = point;\n      }\n\n      return 'L';\n    }\n  }, {\n    key: \"pathC\",\n    value: function pathC(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var point = pathParser.getPoint();\n        var controlPoint = pathParser.getAsControlPoint();\n        var currentPoint = pathParser.getAsCurrentPoint();\n        points.push(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n      }\n    }\n  }, {\n    key: \"pathS\",\n    value: function pathS(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var point = pathParser.getReflectedControlPoint();\n        var controlPoint = pathParser.getAsControlPoint();\n        var currentPoint = pathParser.getAsCurrentPoint();\n        points.push(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n      }\n\n      return 'C';\n    }\n  }, {\n    key: \"pathQ\",\n    value: function pathQ(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var controlPoint = pathParser.getAsControlPoint();\n        var currentPoint = pathParser.getAsCurrentPoint();\n        points.push(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n      }\n    }\n  }, {\n    key: \"pathT\",\n    value: function pathT(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var controlPoint = pathParser.getReflectedControlPoint();\n        pathParser.control = controlPoint;\n        var currentPoint = pathParser.getAsCurrentPoint();\n        points.push(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n      }\n\n      return 'Q';\n    }\n  }, {\n    key: \"pathA\",\n    value: function pathA(pathParser) {\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current; // x1, y1\n\n        var rx = pathParser.getScalar();\n        var ry = pathParser.getScalar();\n        var xAxisRotation = pathParser.getScalar() * (Math.PI / 180.0); // φ\n\n        var largeArcFlag = pathParser.getScalar(); //  fA\n\n        var sweepFlag = pathParser.getScalar(); //  fS\n\n        var currentPoint = pathParser.getAsCurrentPoint(); // x2, y2\n        // Conversion from endpoint to center parameterization\n        // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n        // x1', y1'\n\n        var currp = new Point(Math.cos(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.sin(xAxisRotation) * (current.y - currentPoint.y) / 2.0, -Math.sin(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * (current.y - currentPoint.y) / 2.0); // adjust radii\n\n        var l = Math.pow(currp.x, 2) / Math.pow(rx, 2) + Math.pow(currp.y, 2) / Math.pow(ry, 2);\n\n        if (l > 1) {\n          rx *= Math.sqrt(l);\n          ry *= Math.sqrt(l);\n        } // cx', cy'\n\n\n        var s = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt((Math.pow(rx, 2) * Math.pow(ry, 2) - Math.pow(rx, 2) * Math.pow(currp.y, 2) - Math.pow(ry, 2) * Math.pow(currp.x, 2)) / (Math.pow(rx, 2) * Math.pow(currp.y, 2) + Math.pow(ry, 2) * Math.pow(currp.x, 2)));\n\n        if (isNaN(s)) {\n          s = 0;\n        }\n\n        var cpp = new Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); // cx, cy\n\n        var centp = new Point((current.x + currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, (current.y + currentPoint.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y); // initial angle\n\n        var a1 = vectorsAngle([1, 0], [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]); // θ1\n        // angle delta\n\n        var u = [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry];\n        var v = [(-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry];\n        var ad = vectorsAngle(u, v); // Δθ\n\n        if (vectorsRatio(u, v) <= -1) {\n          ad = Math.PI;\n        }\n\n        if (vectorsRatio(u, v) >= 1) {\n          ad = 0;\n        }\n\n        if (sweepFlag === 0 && ad > 0) {\n          ad = ad - 2 * Math.PI;\n        }\n\n        if (sweepFlag === 1 && ad < 0) {\n          ad = ad + 2 * Math.PI;\n        }\n\n        return [centp.x, centp.y, rx, ry, a1, ad, xAxisRotation, sweepFlag];\n      }\n    }\n  }, {\n    key: \"calcLength\",\n    value: function calcLength(x, y, cmd, points) {\n      var len = 0;\n      var p1 = null;\n      var p2 = null;\n      var t = 0;\n\n      switch (cmd) {\n        case 'L':\n          return this.getLineLength(x, y, points[0], points[1]);\n\n        case 'C':\n          // Approximates by breaking curve into 100 line segments\n          len = 0.0;\n          p1 = this.getPointOnCubicBezier(0, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);\n\n          for (t = 0.01; t <= 1; t += 0.01) {\n            p2 = this.getPointOnCubicBezier(t, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);\n            len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n            p1 = p2;\n          }\n\n          return len;\n\n        case 'Q':\n          // Approximates by breaking curve into 100 line segments\n          len = 0.0;\n          p1 = this.getPointOnQuadraticBezier(0, x, y, points[0], points[1], points[2], points[3]);\n\n          for (t = 0.01; t <= 1; t += 0.01) {\n            p2 = this.getPointOnQuadraticBezier(t, x, y, points[0], points[1], points[2], points[3]);\n            len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n            p1 = p2;\n          }\n\n          return len;\n\n        case 'A':\n          // Approximates by breaking curve into line segments\n          len = 0.0;\n          var start = points[4]; // 4 = theta\n\n          var dTheta = points[5]; // 5 = dTheta\n\n          var end = points[4] + dTheta;\n          var inc = Math.PI / 180.0; // 1 degree resolution\n\n          if (Math.abs(start - end) < inc) {\n            inc = Math.abs(start - end);\n          } // Note: for purpose of calculating arc length, not going to worry about rotating X-axis by angle psi\n\n\n          p1 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], start, 0);\n\n          if (dTheta < 0) {\n            // clockwise\n            for (t = start - inc; t > end; t -= inc) {\n              p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);\n              len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n              p1 = p2;\n            }\n          } else {\n            // counter-clockwise\n            for (t = start + inc; t < end; t += inc) {\n              p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);\n              len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n              p1 = p2;\n            }\n          }\n\n          p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], end, 0);\n          len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n          return len;\n      }\n\n      return 0;\n    }\n  }, {\n    key: \"getPointOnLine\",\n    value: function getPointOnLine(dist, P1x, P1y, P2x, P2y) {\n      var fromX = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : P1x;\n      var fromY = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : P1y;\n      var m = (P2y - P1y) / (P2x - P1x + PSEUDO_ZERO);\n      var run = Math.sqrt(dist * dist / (1 + m * m));\n\n      if (P2x < P1x) {\n        run *= -1;\n      }\n\n      var rise = m * run;\n      var pt = null;\n\n      if (P2x === P1x) {\n        // vertical line\n        pt = {\n          x: fromX,\n          y: fromY + rise\n        };\n      } else if ((fromY - P1y) / (fromX - P1x + PSEUDO_ZERO) === m) {\n        pt = {\n          x: fromX + run,\n          y: fromY + rise\n        };\n      } else {\n        var ix = 0;\n        var iy = 0;\n        var len = this.getLineLength(P1x, P1y, P2x, P2y);\n\n        if (len < PSEUDO_ZERO) {\n          return null;\n        }\n\n        var u = (fromX - P1x) * (P2x - P1x) + (fromY - P1y) * (P2y - P1y);\n        u = u / (len * len);\n        ix = P1x + u * (P2x - P1x);\n        iy = P1y + u * (P2y - P1y);\n        var pRise = this.getLineLength(fromX, fromY, ix, iy);\n        var pRun = Math.sqrt(dist * dist - pRise * pRise);\n        run = Math.sqrt(pRun * pRun / (1 + m * m));\n\n        if (P2x < P1x) {\n          run *= -1;\n        }\n\n        rise = m * run;\n        pt = {\n          x: ix + run,\n          y: iy + rise\n        };\n      }\n\n      return pt;\n    }\n  }, {\n    key: \"getPointOnPath\",\n    value: function getPointOnPath(distance) {\n      var fullLen = this.getPathLength();\n      var cumulativePathLength = 0;\n      var p = null;\n\n      if (distance < -0.00005 || distance - 0.00005 > fullLen) {\n        return null;\n      }\n\n      var dataArray = this.dataArray;\n\n      var _iterator = _createForOfIteratorHelper$1(dataArray),\n          _step;\n\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var pathCmd = _step.value;\n\n          if (pathCmd && (pathCmd.pathLength < 0.00005 || cumulativePathLength + pathCmd.pathLength + 0.00005 < distance)) {\n            cumulativePathLength += pathCmd.pathLength;\n            continue;\n          }\n\n          var delta = distance - cumulativePathLength;\n          var currentT = 0;\n\n          switch (pathCmd.command) {\n            case 'L':\n              p = this.getPointOnLine(delta, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.start.x, pathCmd.start.y);\n              break;\n\n            case 'A':\n              var start = pathCmd.points[4]; // 4 = theta\n\n              var dTheta = pathCmd.points[5]; // 5 = dTheta\n\n              var end = pathCmd.points[4] + dTheta;\n              currentT = start + delta / pathCmd.pathLength * dTheta;\n\n              if (dTheta < 0 && currentT < end || dTheta >= 0 && currentT > end) {\n                break;\n              }\n\n              p = this.getPointOnEllipticalArc(pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3], currentT, pathCmd.points[6]);\n              break;\n\n            case 'C':\n              currentT = delta / pathCmd.pathLength;\n\n              if (currentT > 1) {\n                currentT = 1;\n              }\n\n              p = this.getPointOnCubicBezier(currentT, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3], pathCmd.points[4], pathCmd.points[5]);\n              break;\n\n            case 'Q':\n              currentT = delta / pathCmd.pathLength;\n\n              if (currentT > 1) {\n                currentT = 1;\n              }\n\n              p = this.getPointOnQuadraticBezier(currentT, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3]);\n              break;\n\n            default:\n          }\n\n          if (p) {\n            return p;\n          }\n\n          break;\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n\n      return null;\n    }\n  }, {\n    key: \"getLineLength\",\n    value: function getLineLength(x1, y1, x2, y2) {\n      return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n    }\n  }, {\n    key: \"getPathLength\",\n    value: function getPathLength() {\n      if (this.pathLength === -1) {\n        this.pathLength = this.dataArray.reduce(function (length, command) {\n          return command.pathLength > 0 ? length + command.pathLength : length;\n        }, 0);\n      }\n\n      return this.pathLength;\n    }\n  }, {\n    key: \"getPointOnCubicBezier\",\n    value: function getPointOnCubicBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y, P4x, P4y) {\n      var x = P4x * CB1(pct) + P3x * CB2(pct) + P2x * CB3(pct) + P1x * CB4(pct);\n      var y = P4y * CB1(pct) + P3y * CB2(pct) + P2y * CB3(pct) + P1y * CB4(pct);\n      return {\n        x: x,\n        y: y\n      };\n    }\n  }, {\n    key: \"getPointOnQuadraticBezier\",\n    value: function getPointOnQuadraticBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y) {\n      var x = P3x * QB1(pct) + P2x * QB2(pct) + P1x * QB3(pct);\n      var y = P3y * QB1(pct) + P2y * QB2(pct) + P1y * QB3(pct);\n      return {\n        x: x,\n        y: y\n      };\n    }\n  }, {\n    key: \"getPointOnEllipticalArc\",\n    value: function getPointOnEllipticalArc(cx, cy, rx, ry, theta, psi) {\n      var cosPsi = Math.cos(psi);\n      var sinPsi = Math.sin(psi);\n      var pt = {\n        x: rx * Math.cos(theta),\n        y: ry * Math.sin(theta)\n      };\n      return {\n        x: cx + (pt.x * cosPsi - pt.y * sinPsi),\n        y: cy + (pt.x * sinPsi + pt.y * cosPsi)\n      };\n    } // TODO need some optimisations. possibly build cache only for curved segments?\n\n  }, {\n    key: \"buildEquidistantCache\",\n    value: function buildEquidistantCache(inputStep, inputPrecision) {\n      var fullLen = this.getPathLength();\n      var precision = inputPrecision || 0.25; // accuracy vs performance\n\n      var step = inputStep || fullLen / 100;\n\n      if (!this.equidistantCache || this.equidistantCache.step !== step || this.equidistantCache.precision !== precision) {\n        // Prepare cache\n        this.equidistantCache = {\n          step: step,\n          precision: precision,\n          points: []\n        }; // Calculate points\n\n        var s = 0;\n\n        for (var l = 0; l <= fullLen; l += precision) {\n          var p0 = this.getPointOnPath(l);\n          var p1 = this.getPointOnPath(l + precision);\n\n          if (!p0 || !p1) {\n            continue;\n          }\n\n          s += this.getLineLength(p0.x, p0.y, p1.x, p1.y);\n\n          if (s >= step) {\n            this.equidistantCache.points.push({\n              x: p0.x,\n              y: p0.y,\n              distance: l\n            });\n            s -= step;\n          }\n        }\n      }\n    }\n  }, {\n    key: \"getEquidistantPointOnPath\",\n    value: function getEquidistantPointOnPath(targetDistance, step, precision) {\n      this.buildEquidistantCache(step, precision);\n\n      if (targetDistance < 0 || targetDistance - this.getPathLength() > 0.00005) {\n        return null;\n      }\n\n      var idx = Math.round(targetDistance / this.getPathLength() * (this.equidistantCache.points.length - 1));\n      return this.equidistantCache.points[idx] || null;\n    }\n  }]);\n\n  return TextPathElement;\n}(TextElement);\n\nfunction _createSuper$y(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$y()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$y() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar ImageElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(ImageElement, _RenderedElement);\n\n  var _super = _createSuper$y(ImageElement);\n\n  function ImageElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, ImageElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'image';\n    _this.loaded = false;\n\n    var href = _this.getHrefAttribute().getString();\n\n    if (!href) {\n      return _possibleConstructorReturn(_this);\n    }\n\n    var isSvg = /\\.svg$/.test(href);\n    document.images.push(_assertThisInitialized(_this));\n\n    if (!isSvg) {\n      _this.loadImage(href);\n    } else {\n      _this.loadSvg(href);\n    }\n\n    _this.isSvg = isSvg;\n    return _this;\n  }\n\n  _createClass(ImageElement, [{\n    key: \"loadImage\",\n    value: function () {\n      var _loadImage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(href) {\n        var image;\n        return _regeneratorRuntime.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.prev = 0;\n                _context.next = 3;\n                return this.document.createImage(href);\n\n              case 3:\n                image = _context.sent;\n                this.image = image;\n                _context.next = 10;\n                break;\n\n              case 7:\n                _context.prev = 7;\n                _context.t0 = _context[\"catch\"](0);\n                // tslint:disable-next-line: no-console\n                console.error(\"ERROR: image \\\"\".concat(href, \"\\\" not found\"), _context.t0);\n\n              case 10:\n                this.loaded = true;\n\n              case 11:\n              case \"end\":\n                return _context.stop();\n            }\n          }\n        }, _callee, this, [[0, 7]]);\n      }));\n\n      function loadImage(_x) {\n        return _loadImage.apply(this, arguments);\n      }\n\n      return loadImage;\n    }()\n  }, {\n    key: \"loadSvg\",\n    value: function () {\n      var _loadSvg = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(href) {\n        var response, svg;\n        return _regeneratorRuntime.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                _context2.prev = 0;\n                _context2.next = 3;\n                return this.document.fetch(href);\n\n              case 3:\n                response = _context2.sent;\n                _context2.next = 6;\n                return response.text();\n\n              case 6:\n                svg = _context2.sent;\n                this.image = svg;\n                _context2.next = 13;\n                break;\n\n              case 10:\n                _context2.prev = 10;\n                _context2.t0 = _context2[\"catch\"](0);\n                // tslint:disable-next-line: no-console\n                console.error(\"ERROR: image \\\"\".concat(href, \"\\\" not found\"), _context2.t0);\n\n              case 13:\n                this.loaded = true;\n\n              case 14:\n              case \"end\":\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this, [[0, 10]]);\n      }));\n\n      function loadSvg(_x2) {\n        return _loadSvg.apply(this, arguments);\n      }\n\n      return loadSvg;\n    }()\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      var document = this.document;\n      var x = this.getAttribute('x').getPixels('x');\n      var y = this.getAttribute('y').getPixels('y');\n      var width = this.getAttribute('width').getPixels('x');\n      var height = this.getAttribute('height').getPixels('y');\n\n      if (!width || !height) {\n        return;\n      }\n\n      ctx.save();\n\n      if (this.isSvg) {\n        document.canvg.forkString(ctx, this.image, {\n          ignoreMouse: true,\n          ignoreAnimation: true,\n          ignoreDimensions: true,\n          ignoreClear: true,\n          offsetX: x,\n          offsetY: y,\n          scaleWidth: width,\n          scaleHeight: height\n        }).render();\n      } else {\n        var image = this.image;\n        ctx.translate(x, y);\n        document.setViewBox({\n          ctx: ctx,\n          aspectRatio: this.getAttribute('preserveAspectRatio').getString(),\n          width: width,\n          desiredWidth: image.width,\n          height: height,\n          desiredHeight: image.height\n        });\n\n        if (this.loaded) {\n          if (typeof image.complete === 'undefined' || image.complete) {\n            ctx.drawImage(image, 0, 0);\n          }\n        }\n      }\n\n      ctx.restore();\n    }\n  }, {\n    key: \"getBoundingBox\",\n    value: function getBoundingBox() {\n      var x = this.getAttribute('x').getPixels('x');\n      var y = this.getAttribute('y').getPixels('y');\n      var width = this.getAttribute('width').getPixels('x');\n      var height = this.getAttribute('height').getPixels('y');\n      return new BoundingBox(x, y, x + width, y + height);\n    }\n  }]);\n\n  return ImageElement;\n}(RenderedElement);\n\nfunction _createSuper$z(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$z()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$z() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar SymbolElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(SymbolElement, _RenderedElement);\n\n  var _super = _createSuper$z(SymbolElement);\n\n  function SymbolElement() {\n    var _this;\n\n    _classCallCheck(this, SymbolElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'symbol';\n    return _this;\n  }\n\n  _createClass(SymbolElement, [{\n    key: \"render\",\n    value: function render(_) {// NO RENDER\n    }\n  }]);\n\n  return SymbolElement;\n}(RenderedElement);\n\nvar SVGFontLoader = /*#__PURE__*/function () {\n  function SVGFontLoader(document) {\n    _classCallCheck(this, SVGFontLoader);\n\n    this.document = document;\n    this.loaded = false;\n    document.fonts.push(this);\n  }\n\n  _createClass(SVGFontLoader, [{\n    key: \"load\",\n    value: function () {\n      var _load = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(fontFamily, url) {\n        var document, svgDocument, fonts;\n        return _regeneratorRuntime.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.prev = 0;\n                document = this.document;\n                _context.next = 4;\n                return document.canvg.parser.load(url);\n\n              case 4:\n                svgDocument = _context.sent;\n                fonts = svgDocument.getElementsByTagName('font');\n                Array.from(fonts).forEach(function (fontNode) {\n                  var font = document.createElement(fontNode);\n                  document.definitions[fontFamily] = font;\n                });\n                _context.next = 12;\n                break;\n\n              case 9:\n                _context.prev = 9;\n                _context.t0 = _context[\"catch\"](0);\n                // tslint:disable-next-line: no-console\n                console.error(\"ERROR: font \\\"\".concat(url, \"\\\" not found\"), _context.t0);\n\n              case 12:\n                this.loaded = true;\n\n              case 13:\n              case \"end\":\n                return _context.stop();\n            }\n          }\n        }, _callee, this, [[0, 9]]);\n      }));\n\n      function load(_x, _x2) {\n        return _load.apply(this, arguments);\n      }\n\n      return load;\n    }()\n  }]);\n\n  return SVGFontLoader;\n}();\n\nfunction _createSuper$A(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$A()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$A() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar StyleElement = /*#__PURE__*/function (_Element) {\n  _inherits(StyleElement, _Element);\n\n  var _super = _createSuper$A(StyleElement);\n\n  function StyleElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, StyleElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'style';\n    var css = compressSpaces(Array.from(node.childNodes).map(function (_) {\n      return _.data;\n    }).join('').replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*\\/]|[\\r\\n])))*\\*+\\/)|(^[\\s]*\\/\\/.*)/gm, '') // remove comments;\n    );\n    var cssDefs = css.split('}');\n    cssDefs.forEach(function (_) {\n      var def = _.trim();\n\n      if (!def) {\n        return;\n      }\n\n      var cssParts = def.split('{');\n      var cssClasses = cssParts[0].split(',');\n      var cssProps = cssParts[1].split(';');\n      cssClasses.forEach(function (_) {\n        var cssClass = _.trim();\n\n        if (!cssClass) {\n          return;\n        }\n\n        var props = document.styles[cssClass] || {};\n        cssProps.forEach(function (cssProp) {\n          var prop = cssProp.indexOf(':');\n          var name = cssProp.substr(0, prop).trim();\n          var value = cssProp.substr(prop + 1, cssProp.length - prop).trim();\n\n          if (name && value) {\n            props[name] = new Property(document, name, value);\n          }\n        });\n        document.styles[cssClass] = props;\n        document.stylesSpecificity[cssClass] = getSelectorSpecificity(cssClass);\n\n        if (cssClass === '@font-face') {\n          //  && !nodeEnv\n          var fontFamily = props['font-family'].getString().replace(/\"|'/g, '');\n          var srcs = props.src.getString().split(',');\n          srcs.forEach(function (src) {\n            if (src.indexOf('format(\"svg\")') > 0) {\n              var url = parseExternalUrl(src);\n\n              if (url) {\n                new SVGFontLoader(document).load(fontFamily, url);\n              }\n            }\n          });\n        }\n      });\n    });\n    return _this;\n  }\n\n  return StyleElement;\n}(Element);\nStyleElement.parseExternalUrl = parseExternalUrl;\n\nfunction _createSuper$B(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$B()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$B() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar UseElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(UseElement, _RenderedElement);\n\n  var _super = _createSuper$B(UseElement);\n\n  function UseElement() {\n    var _this;\n\n    _classCallCheck(this, UseElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'use';\n    return _this;\n  }\n\n  _createClass(UseElement, [{\n    key: \"setContext\",\n    value: function setContext(ctx) {\n      _get(_getPrototypeOf(UseElement.prototype), \"setContext\", this).call(this, ctx);\n\n      var xAttr = this.getAttribute('x');\n      var yAttr = this.getAttribute('y');\n\n      if (xAttr.hasValue()) {\n        ctx.translate(xAttr.getPixels('x'), 0);\n      }\n\n      if (yAttr.hasValue()) {\n        ctx.translate(0, yAttr.getPixels('y'));\n      }\n    }\n  }, {\n    key: \"path\",\n    value: function path(ctx) {\n      var element = this.element;\n\n      if (element) {\n        element.path(ctx);\n      }\n    }\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      var document = this.document,\n          element = this.element;\n\n      if (element) {\n        var tempSvg = element;\n\n        if (element.type === 'symbol') {\n          // render me using a temporary svg element in symbol cases (http://www.w3.org/TR/SVG/struct.html#UseElement)\n          tempSvg = new SVGElement(document, null);\n          tempSvg.attributes.viewBox = new Property(document, 'viewBox', element.getAttribute('viewBox').getString());\n          tempSvg.attributes.preserveAspectRatio = new Property(document, 'preserveAspectRatio', element.getAttribute('preserveAspectRatio').getString());\n          tempSvg.attributes.overflow = new Property(document, 'overflow', element.getAttribute('overflow').getString());\n          tempSvg.children = element.children;\n        }\n\n        if (tempSvg.type === 'svg') {\n          var widthAttr = this.getAttribute('width');\n          var heightAttr = this.getAttribute('height'); // if symbol or svg, inherit width/height from me\n\n          if (widthAttr.hasValue()) {\n            tempSvg.attributes.width = new Property(document, 'width', this.getAttribute('width').getString());\n          }\n\n          if (heightAttr.hasValue()) {\n            tempSvg.attributes.height = new Property(document, 'height', heightAttr.getString());\n          }\n        }\n\n        var oldParent = tempSvg.parent;\n        tempSvg.parent = null;\n        tempSvg.render(ctx);\n        tempSvg.parent = oldParent;\n      }\n    }\n  }, {\n    key: \"getBoundingBox\",\n    value: function getBoundingBox(ctx) {\n      var element = this.element;\n\n      if (element) {\n        return element.getBoundingBox(ctx);\n      }\n\n      return null;\n    }\n  }, {\n    key: \"elementTransform\",\n    value: function elementTransform() {\n      var document = this.document,\n          element = this.element;\n      return Transform.fromElement(document, element);\n    }\n  }, {\n    key: \"element\",\n    get: function get() {\n      if (!this._element) {\n        this._element = this.getHrefAttribute().getDefinition();\n      }\n\n      return this._element;\n    }\n  }]);\n\n  return UseElement;\n}(RenderedElement);\n\nfunction _createSuper$C(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$C()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$C() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction imGet(img, x, y, width, _, rgba) {\n  return img[y * width * 4 + x * 4 + rgba];\n}\n\nfunction imSet(img, x, y, width, _, rgba, val) {\n  img[y * width * 4 + x * 4 + rgba] = val;\n}\n\nfunction m(matrix, i, v) {\n  var mi = matrix[i];\n  return mi * (mi < 0 ? v - 255 : v);\n}\n\nfunction c(a, m1, m2, m3) {\n  return m1 + Math.cos(a) * m2 + Math.sin(a) * m3;\n}\n\nvar FeColorMatrixElement = /*#__PURE__*/function (_Element) {\n  _inherits(FeColorMatrixElement, _Element);\n\n  var _super = _createSuper$C(FeColorMatrixElement);\n\n  function FeColorMatrixElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, FeColorMatrixElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'feColorMatrix';\n    var matrix = toNumbers(_this.getAttribute('values').getString());\n\n    switch (_this.getAttribute('type').getString('matrix')) {\n      // http://www.w3.org/TR/SVG/filters.html#feColorMatrixElement\n      case 'saturate':\n        {\n          var s = matrix[0];\n          matrix = [0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1];\n          break;\n        }\n\n      case 'hueRotate':\n        {\n          var a = matrix[0] * Math.PI / 180.0;\n          matrix = [c(a, 0.213, 0.787, -0.213), c(a, 0.715, -0.715, -0.715), c(a, 0.072, -0.072, 0.928), 0, 0, c(a, 0.213, -0.213, 0.143), c(a, 0.715, 0.285, 0.140), c(a, 0.072, -0.072, -0.283), 0, 0, c(a, 0.213, -0.213, -0.787), c(a, 0.715, -0.715, 0.715), c(a, 0.072, 0.928, 0.072), 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1];\n          break;\n        }\n\n      case 'luminanceToAlpha':\n        matrix = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2125, 0.7154, 0.0721, 0, 0, 0, 0, 0, 0, 1];\n        break;\n    }\n\n    _this.matrix = matrix;\n    _this.includeOpacity = _this.getAttribute('includeOpacity').hasValue();\n    return _this;\n  }\n\n  _createClass(FeColorMatrixElement, [{\n    key: \"apply\",\n    value: function apply(ctx, _, __, width, height) {\n      // assuming x==0 && y==0 for now\n      var includeOpacity = this.includeOpacity,\n          matrix = this.matrix;\n      var srcData = ctx.getImageData(0, 0, width, height);\n\n      for (var y = 0; y < height; y++) {\n        for (var x = 0; x < width; x++) {\n          var r = imGet(srcData.data, x, y, width, height, 0);\n          var g = imGet(srcData.data, x, y, width, height, 1);\n          var b = imGet(srcData.data, x, y, width, height, 2);\n          var a = imGet(srcData.data, x, y, width, height, 3);\n          var nr = m(matrix, 0, r) + m(matrix, 1, g) + m(matrix, 2, b) + m(matrix, 3, a) + m(matrix, 4, 1);\n          var ng = m(matrix, 5, r) + m(matrix, 6, g) + m(matrix, 7, b) + m(matrix, 8, a) + m(matrix, 9, 1);\n          var nb = m(matrix, 10, r) + m(matrix, 11, g) + m(matrix, 12, b) + m(matrix, 13, a) + m(matrix, 14, 1);\n          var na = m(matrix, 15, r) + m(matrix, 16, g) + m(matrix, 17, b) + m(matrix, 18, a) + m(matrix, 19, 1);\n\n          if (includeOpacity) {\n            nr = ng = nb = 0;\n            na *= a / 255;\n          }\n\n          imSet(srcData.data, x, y, width, height, 0, nr);\n          imSet(srcData.data, x, y, width, height, 1, ng);\n          imSet(srcData.data, x, y, width, height, 2, nb);\n          imSet(srcData.data, x, y, width, height, 3, na);\n        }\n      }\n\n      ctx.clearRect(0, 0, width, height);\n      ctx.putImageData(srcData, 0, 0);\n    }\n  }]);\n\n  return FeColorMatrixElement;\n}(Element);\n\nfunction _createSuper$D(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$D()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$D() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar MaskElement = /*#__PURE__*/function (_Element) {\n  _inherits(MaskElement, _Element);\n\n  var _super = _createSuper$D(MaskElement);\n\n  function MaskElement() {\n    var _this;\n\n    _classCallCheck(this, MaskElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'mask';\n    return _this;\n  }\n\n  _createClass(MaskElement, [{\n    key: \"apply\",\n    value: function apply(ctx, element) {\n      var document = this.document; // render as temp svg\n\n      var x = this.getAttribute('x').getPixels('x');\n      var y = this.getAttribute('y').getPixels('y');\n      var width = this.getAttribute('width').getPixels('x');\n      var height = this.getAttribute('height').getPixels('y');\n\n      if (!width && !height) {\n        var boundingBox = new BoundingBox();\n        this.children.forEach(function (child) {\n          boundingBox.addBoundingBox(child.getBoundingBox(ctx));\n        });\n        x = Math.floor(boundingBox.x1);\n        y = Math.floor(boundingBox.y1);\n        width = Math.floor(boundingBox.width);\n        height = Math.floor(boundingBox.height);\n      } // temporarily remove mask to avoid recursion\n\n\n      var mask = element.getStyle('mask').getString();\n      element.getStyle('mask').setValue('');\n      var cMask = document.createCanvas(x + width, y + height);\n      var maskCtx = cMask.getContext('2d');\n      document.screen.setDefaults(maskCtx);\n      this.renderChildren(maskCtx); // convert mask to alpha with a fake node\n      // TODO: refactor out apply from feColorMatrix\n\n      var cm = new FeColorMatrixElement(document, {\n        nodeType: 1,\n        childNodes: [],\n        attributes: [{\n          nodeName: 'type',\n          value: 'luminanceToAlpha'\n        }, {\n          nodeName: 'includeOpacity',\n          value: 'true'\n        }]\n      });\n      cm.apply(maskCtx, 0, 0, x + width, y + height);\n      var c = document.createCanvas(x + width, y + height);\n      var tempCtx = c.getContext('2d');\n      document.screen.setDefaults(tempCtx);\n      element.render(tempCtx);\n      tempCtx.globalCompositeOperation = 'destination-in';\n      tempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');\n      tempCtx.fillRect(0, 0, x + width, y + height);\n      ctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');\n      ctx.fillRect(0, 0, x + width, y + height); // reassign mask\n\n      element.getStyle('mask').setValue(mask);\n    }\n  }, {\n    key: \"render\",\n    value: function render(_) {// NO RENDER\n    }\n  }]);\n\n  return MaskElement;\n}(Element);\n\nfunction _createSuper$E(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$E()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$E() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar noop = function noop() {};\n\nvar ClipPathElement = /*#__PURE__*/function (_Element) {\n  _inherits(ClipPathElement, _Element);\n\n  var _super = _createSuper$E(ClipPathElement);\n\n  function ClipPathElement() {\n    var _this;\n\n    _classCallCheck(this, ClipPathElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'clipPath';\n    return _this;\n  }\n\n  _createClass(ClipPathElement, [{\n    key: \"apply\",\n    value: function apply(ctx) {\n      var document = this.document;\n      var contextProto = Reflect.getPrototypeOf(ctx);\n      var beginPath = ctx.beginPath,\n          closePath = ctx.closePath;\n\n      if (contextProto) {\n        contextProto.beginPath = noop;\n        contextProto.closePath = noop;\n      }\n\n      Reflect.apply(beginPath, ctx, []);\n      this.children.forEach(function (child) {\n        if (typeof child.path === 'undefined') {\n          return;\n        }\n\n        var transform = typeof child.elementTransform !== 'undefined' ? child.elementTransform() : null; // handle <use />\n\n        if (!transform) {\n          transform = Transform.fromElement(document, child);\n        }\n\n        if (transform) {\n          transform.apply(ctx);\n        }\n\n        child.path(ctx);\n\n        if (contextProto) {\n          contextProto.closePath = closePath;\n        }\n\n        if (transform) {\n          transform.unapply(ctx);\n        }\n      });\n      Reflect.apply(closePath, ctx, []);\n      ctx.clip();\n\n      if (contextProto) {\n        contextProto.beginPath = beginPath;\n        contextProto.closePath = closePath;\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render(_) {// NO RENDER\n    }\n  }]);\n\n  return ClipPathElement;\n}(Element);\n\nfunction _createSuper$F(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$F()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$F() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FilterElement = /*#__PURE__*/function (_Element) {\n  _inherits(FilterElement, _Element);\n\n  var _super = _createSuper$F(FilterElement);\n\n  function FilterElement() {\n    var _this;\n\n    _classCallCheck(this, FilterElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'filter';\n    return _this;\n  }\n\n  _createClass(FilterElement, [{\n    key: \"apply\",\n    value: function apply(ctx, element) {\n      // render as temp svg\n      var document = this.document;\n      var boundingBox = element.getBoundingBox(ctx);\n      var x = Math.floor(boundingBox.x1);\n      var y = Math.floor(boundingBox.y1);\n      var width = Math.floor(boundingBox.width);\n      var height = Math.floor(boundingBox.height); // temporarily remove filter to avoid recursion\n\n      var filter = element.getStyle('filter').getString();\n      element.getStyle('filter').setValue('');\n      var px = 0;\n      var py = 0;\n      this.children.forEach(function (child) {\n        var efd = child.extraFilterDistance || 0;\n        px = Math.max(px, efd);\n        py = Math.max(py, efd);\n      });\n      var tmpCanvas = document.createCanvas(width + 2 * px, height + 2 * py);\n      var tmpCtx = tmpCanvas.getContext('2d');\n      document.screen.setDefaults(tmpCtx);\n      tmpCtx.translate(-x + px, -y + py);\n      element.render(tmpCtx); // apply filters\n\n      this.children.forEach(function (child) {\n        if (typeof child.apply === 'function') {\n          child.apply(tmpCtx, 0, 0, width + 2 * px, height + 2 * py);\n        }\n      }); // render on me\n\n      ctx.drawImage(tmpCanvas, 0, 0, width + 2 * px, height + 2 * py, x - px, y - py, width + 2 * px, height + 2 * py); // reassign filter\n\n      element.getStyle('filter', true).setValue(filter);\n    }\n  }, {\n    key: \"render\",\n    value: function render(_) {// NO RENDER\n    }\n  }]);\n\n  return FilterElement;\n}(Element);\n\nfunction _createSuper$G(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$G()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$G() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FeDropShadowElement = /*#__PURE__*/function (_Element) {\n  _inherits(FeDropShadowElement, _Element);\n\n  var _super = _createSuper$G(FeDropShadowElement);\n\n  function FeDropShadowElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, FeDropShadowElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'feDropShadow';\n\n    _this.addStylesFromStyleDefinition();\n\n    return _this;\n  }\n\n  _createClass(FeDropShadowElement, [{\n    key: \"apply\",\n    value: function apply(_, __, ___, ____, _____) {// TODO: implement\n    }\n  }]);\n\n  return FeDropShadowElement;\n}(Element);\n\nfunction _createSuper$H(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$H()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$H() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FeMorphologyElement = /*#__PURE__*/function (_Element) {\n  _inherits(FeMorphologyElement, _Element);\n\n  var _super = _createSuper$H(FeMorphologyElement);\n\n  function FeMorphologyElement() {\n    var _this;\n\n    _classCallCheck(this, FeMorphologyElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'feMorphology';\n    return _this;\n  }\n\n  _createClass(FeMorphologyElement, [{\n    key: \"apply\",\n    value: function apply(_, __, ___, ____, _____) {// TODO: implement\n    }\n  }]);\n\n  return FeMorphologyElement;\n}(Element);\n\nfunction _createSuper$I(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$I()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$I() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FeCompositeElement = /*#__PURE__*/function (_Element) {\n  _inherits(FeCompositeElement, _Element);\n\n  var _super = _createSuper$I(FeCompositeElement);\n\n  function FeCompositeElement() {\n    var _this;\n\n    _classCallCheck(this, FeCompositeElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'feComposite';\n    return _this;\n  }\n\n  _createClass(FeCompositeElement, [{\n    key: \"apply\",\n    value: function apply(_, __, ___, ____, _____) {// TODO: implement\n    }\n  }]);\n\n  return FeCompositeElement;\n}(Element);\n\nfunction _createSuper$J(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$J()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$J() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FeGaussianBlurElement = /*#__PURE__*/function (_Element) {\n  _inherits(FeGaussianBlurElement, _Element);\n\n  var _super = _createSuper$J(FeGaussianBlurElement);\n\n  function FeGaussianBlurElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, FeGaussianBlurElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'feGaussianBlur';\n    _this.blurRadius = Math.floor(_this.getAttribute('stdDeviation').getNumber());\n    _this.extraFilterDistance = _this.blurRadius;\n    return _this;\n  }\n\n  _createClass(FeGaussianBlurElement, [{\n    key: \"apply\",\n    value: function apply(ctx, x, y, width, height) {\n      var document = this.document,\n          blurRadius = this.blurRadius;\n      var body = document.window ? document.window.document.body : null;\n      var canvas = ctx.canvas; // StackBlur requires canvas be on document\n\n      canvas.id = document.getUniqueId();\n\n      if (body) {\n        canvas.style.display = 'none';\n        body.appendChild(canvas);\n      }\n\n      canvasRGBA(canvas, x, y, width, height, blurRadius);\n\n      if (body) {\n        body.removeChild(canvas);\n      }\n    }\n  }]);\n\n  return FeGaussianBlurElement;\n}(Element);\n\nfunction _createSuper$K(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$K()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$K() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar TitleElement = /*#__PURE__*/function (_Element) {\n  _inherits(TitleElement, _Element);\n\n  var _super = _createSuper$K(TitleElement);\n\n  function TitleElement() {\n    var _this;\n\n    _classCallCheck(this, TitleElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'title';\n    return _this;\n  }\n\n  return TitleElement;\n}(Element);\n\nfunction _createSuper$L(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$L()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$L() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar DescElement = /*#__PURE__*/function (_Element) {\n  _inherits(DescElement, _Element);\n\n  var _super = _createSuper$L(DescElement);\n\n  function DescElement() {\n    var _this;\n\n    _classCallCheck(this, DescElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'desc';\n    return _this;\n  }\n\n  return DescElement;\n}(Element);\n\nvar elementTypes = {\n  'svg': SVGElement,\n  'rect': RectElement,\n  'circle': CircleElement,\n  'ellipse': EllipseElement,\n  'line': LineElement,\n  'polyline': PolylineElement,\n  'polygon': PolygonElement,\n  'path': PathElement,\n  'pattern': PatternElement,\n  'marker': MarkerElement,\n  'defs': DefsElement,\n  'linearGradient': LinearGradientElement,\n  'radialGradient': RadialGradientElement,\n  'stop': StopElement,\n  'animate': AnimateElement,\n  'animateColor': AnimateColorElement,\n  'animateTransform': AnimateTransformElement,\n  'font': FontElement,\n  'font-face': FontFaceElement,\n  'missing-glyph': MissingGlyphElement,\n  'glyph': GlyphElement,\n  'text': TextElement,\n  'tspan': TSpanElement,\n  'tref': TRefElement,\n  'a': AElement,\n  'textPath': TextPathElement,\n  'image': ImageElement,\n  'g': GElement,\n  'symbol': SymbolElement,\n  'style': StyleElement,\n  'use': UseElement,\n  'mask': MaskElement,\n  'clipPath': ClipPathElement,\n  'filter': FilterElement,\n  'feDropShadow': FeDropShadowElement,\n  'feMorphology': FeMorphologyElement,\n  'feComposite': FeCompositeElement,\n  'feColorMatrix': FeColorMatrixElement,\n  'feGaussianBlur': FeGaussianBlurElement,\n  'title': TitleElement,\n  'desc': DescElement\n};\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction createCanvas(width, height) {\n  var canvas = document.createElement('canvas');\n  canvas.width = width;\n  canvas.height = height;\n  return canvas;\n}\n\nfunction createImage(_x) {\n  return _createImage.apply(this, arguments);\n}\n\nfunction _createImage() {\n  _createImage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(src) {\n    var image;\n    return _regeneratorRuntime.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            image = document.createElement('img'); // image.crossOrigin = 'Anonymous';\n\n            return _context.abrupt(\"return\", new Promise(function (resolve, reject) {\n              image.onload = function () {\n                resolve(image);\n              };\n\n              image.onerror = function () {\n                reject();\n              };\n\n              image.src = src;\n            }));\n\n          case 2:\n          case \"end\":\n            return _context.stop();\n        }\n      }\n    }, _callee);\n  }));\n  return _createImage.apply(this, arguments);\n}\n\nvar Document = /*#__PURE__*/function () {\n  function Document(canvg) {\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n        _ref$rootEmSize = _ref.rootEmSize,\n        rootEmSize = _ref$rootEmSize === void 0 ? 12 : _ref$rootEmSize,\n        _ref$emSize = _ref.emSize,\n        emSize = _ref$emSize === void 0 ? 12 : _ref$emSize,\n        _ref$createCanvas = _ref.createCanvas,\n        createCanvas = _ref$createCanvas === void 0 ? Document.createCanvas : _ref$createCanvas,\n        _ref$createImage = _ref.createImage,\n        createImage = _ref$createImage === void 0 ? Document.createImage : _ref$createImage;\n\n    _classCallCheck(this, Document);\n\n    this.canvg = canvg;\n    this.definitions = {};\n    this.styles = {};\n    this.stylesSpecificity = {};\n    this.images = [];\n    this.fonts = [];\n    this.emSizeStack = [];\n    this.uniqueId = 0;\n    this.screen = canvg.screen;\n    this.rootEmSize = rootEmSize;\n    this.emSize = emSize;\n    this.createCanvas = createCanvas;\n    this.createImage = createImage;\n    this.screen.wait(this.isImagesLoaded.bind(this));\n    this.screen.wait(this.isFontsLoaded.bind(this));\n  }\n\n  _createClass(Document, [{\n    key: \"popEmSize\",\n    value: function popEmSize() {\n      var emSizeStack = this.emSizeStack;\n      emSizeStack.pop();\n    }\n  }, {\n    key: \"getUniqueId\",\n    value: function getUniqueId() {\n      return \"canvg\".concat(++this.uniqueId);\n    }\n  }, {\n    key: \"isImagesLoaded\",\n    value: function isImagesLoaded() {\n      return this.images.every(function (_) {\n        return _.loaded;\n      });\n    }\n  }, {\n    key: \"isFontsLoaded\",\n    value: function isFontsLoaded() {\n      return this.fonts.every(function (_) {\n        return _.loaded;\n      });\n    }\n  }, {\n    key: \"createDocumentElement\",\n    value: function createDocumentElement(document) {\n      var documentElement = this.createElement(document.documentElement);\n      documentElement.root = true;\n      documentElement.addStylesFromStyleDefinition();\n      this.documentElement = documentElement;\n      return documentElement;\n    }\n  }, {\n    key: \"createElement\",\n    value: function createElement(node) {\n      var elementType = node.nodeName.replace(/^[^:]+:/, '');\n      var ElementType = Document.elementTypes[elementType];\n\n      if (typeof ElementType !== 'undefined') {\n        return new ElementType(this, node);\n      }\n\n      return new UnknownElement(this, node);\n    }\n  }, {\n    key: \"createTextNode\",\n    value: function createTextNode(node) {\n      return new TextNode(this, node);\n    }\n  }, {\n    key: \"setViewBox\",\n    value: function setViewBox(config) {\n      this.screen.setViewBox(_objectSpread({\n        document: this\n      }, config));\n    }\n  }, {\n    key: \"window\",\n    get: function get() {\n      return this.screen.window;\n    }\n  }, {\n    key: \"fetch\",\n    get: function get() {\n      return this.screen.fetch;\n    }\n  }, {\n    key: \"ctx\",\n    get: function get() {\n      return this.screen.ctx;\n    }\n  }, {\n    key: \"emSize\",\n    get: function get() {\n      var emSizeStack = this.emSizeStack;\n      return emSizeStack[emSizeStack.length - 1];\n    },\n    set: function set(value) {\n      var emSizeStack = this.emSizeStack;\n      emSizeStack.push(value);\n    }\n  }]);\n\n  return Document;\n}();\nDocument.createCanvas = createCanvas;\nDocument.createImage = createImage;\nDocument.elementTypes = elementTypes;\n\nfunction ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n/**\n * SVG renderer on canvas.\n */\n\nvar Canvg = /*#__PURE__*/function () {\n  /**\n   * Main constructor.\n   * @param ctx - Rendering context.\n   * @param svg - SVG Document.\n   * @param options - Rendering options.\n   */\n  function Canvg(ctx, svg) {\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n    _classCallCheck(this, Canvg);\n\n    this.parser = new Parser(options);\n    this.screen = new Screen(ctx, options);\n    this.options = options;\n    var document = new Document(this, options);\n    var documentElement = document.createDocumentElement(svg);\n    this.document = document;\n    this.documentElement = documentElement;\n  }\n  /**\n   * Create Canvg isntance from SVG source string or URL.\n   * @param ctx - Rendering context.\n   * @param svg - SVG source string or URL.\n   * @param options - Rendering options.\n   */\n\n\n  _createClass(Canvg, [{\n    key: \"fork\",\n\n    /**\n     * Create new Canvg instance with inherited options.\n     * @param ctx - Rendering context.\n     * @param svg - SVG source string or URL.\n     * @param options - Rendering options.\n     */\n    value: function fork(ctx, svg) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      return Canvg.from(ctx, svg, _objectSpread$1({}, this.options, {}, options));\n    }\n    /**\n     * Create new Canvg instance with inherited options.\n     * @param ctx - Rendering context.\n     * @param svg - SVG source string.\n     * @param options - Rendering options.\n     */\n\n  }, {\n    key: \"forkString\",\n    value: function forkString(ctx, svg) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      return Canvg.fromString(ctx, svg, _objectSpread$1({}, this.options, {}, options));\n    }\n    /**\n     * Document is ready promise.\n     */\n\n  }, {\n    key: \"ready\",\n    value: function ready() {\n      return this.screen.ready();\n    }\n    /**\n     * Document is ready value.\n     */\n\n  }, {\n    key: \"isReady\",\n    value: function isReady() {\n      return this.screen.isReady();\n    }\n    /**\n     * Render only first frame, ignoring animations and mouse.\n     * @param options - Rendering options.\n     */\n\n  }, {\n    key: \"render\",\n    value: function () {\n      var _render = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {\n        var options,\n            _args = arguments;\n        return _regeneratorRuntime.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                options = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};\n                this.start(_objectSpread$1({\n                  enableRedraw: true,\n                  ignoreAnimation: true,\n                  ignoreMouse: true\n                }, options));\n                _context.next = 4;\n                return this.ready();\n\n              case 4:\n                this.stop();\n\n              case 5:\n              case \"end\":\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function render() {\n        return _render.apply(this, arguments);\n      }\n\n      return render;\n    }()\n    /**\n     * Start rendering.\n     * @param options - Render options.\n     */\n\n  }, {\n    key: \"start\",\n    value: function start() {\n      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var documentElement = this.documentElement,\n          screen = this.screen,\n          baseOptions = this.options;\n      screen.start(documentElement, _objectSpread$1({\n        enableRedraw: true\n      }, baseOptions, {}, options));\n    }\n    /**\n     * Stop rendering.\n     */\n\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      this.screen.stop();\n    }\n    /**\n     * Resize SVG to fit in given size.\n     * @param width\n     * @param height\n     * @param preserveAspectRatio\n     */\n\n  }, {\n    key: \"resize\",\n    value: function resize(width) {\n      var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : width;\n      var preserveAspectRatio = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n      this.documentElement.resize(width, height, preserveAspectRatio);\n    }\n  }], [{\n    key: \"from\",\n    value: function () {\n      var _from = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(ctx, svg) {\n        var options,\n            parser,\n            svgDocument,\n            _args2 = arguments;\n        return _regeneratorRuntime.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                options = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : {};\n                parser = new Parser(options);\n                _context2.next = 4;\n                return parser.parse(svg);\n\n              case 4:\n                svgDocument = _context2.sent;\n                return _context2.abrupt(\"return\", new Canvg(ctx, svgDocument, options));\n\n              case 6:\n              case \"end\":\n                return _context2.stop();\n            }\n          }\n        }, _callee2);\n      }));\n\n      function from(_x, _x2) {\n        return _from.apply(this, arguments);\n      }\n\n      return from;\n    }()\n    /**\n     * Create Canvg isntance from SVG source string.\n     * @param ctx - Rendering context.\n     * @param svg - SVG source string.\n     * @param options - Rendering options.\n     */\n\n  }, {\n    key: \"fromString\",\n    value: function fromString(ctx, svg) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var parser = new Parser(options);\n      var svgDocument = parser.parseFromString(svg);\n      return new Canvg(ctx, svgDocument, options);\n    }\n  }]);\n\n  return Canvg;\n}();\n\n/**\n * Options preset for `OffscreenCanvas`.\n */\nfunction offscreen() {\n  return {\n    window: null,\n    ignoreAnimation: true,\n    ignoreMouse: true,\n    createCanvas: function createCanvas(width, height) {\n      return new OffscreenCanvas(width, height);\n    },\n    createImage: function createImage(url) {\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {\n        var response, blob, img;\n        return _regeneratorRuntime.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return fetch(url);\n\n              case 2:\n                response = _context.sent;\n                _context.next = 5;\n                return response.blob();\n\n              case 5:\n                blob = _context.sent;\n                _context.next = 8;\n                return createImageBitmap(blob);\n\n              case 8:\n                img = _context.sent;\n                return _context.abrupt(\"return\", img);\n\n              case 10:\n              case \"end\":\n                return _context.stop();\n            }\n          }\n        }, _callee);\n      }))();\n    }\n  };\n}\n\n/**\n * Options preset for `node-canvas`.\n * @param config - Preset requirements.\n * @param config.DOMParser - XML/HTML parser from string into DOM Document.\n * @param config.canvas - `node-canvas` exports.\n * @param config.fetch - WHATWG-compatible `fetch` function.\n */\nfunction node(_ref) {\n  var DOMParser = _ref.DOMParser,\n      canvas = _ref.canvas,\n      fetch = _ref.fetch;\n  return {\n    window: null,\n    ignoreAnimation: true,\n    ignoreMouse: true,\n    DOMParser: DOMParser,\n    fetch: fetch,\n    createCanvas: canvas.createCanvas,\n    createImage: canvas.loadImage\n  };\n}\n\n\n\nvar index = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\toffscreen: offscreen,\n\tnode: node\n});\n\nexport default Canvg;\nexport { AElement, AnimateColorElement, AnimateElement, AnimateTransformElement, BoundingBox, CB1, CB2, CB3, CB4, Canvg, CircleElement, ClipPathElement, DefsElement, DescElement, Document, Element, EllipseElement, FeColorMatrixElement, FeCompositeElement, FeDropShadowElement, FeGaussianBlurElement, FeMorphologyElement, FilterElement, Font, FontElement, FontFaceElement, GElement, GlyphElement, GradientElement, ImageElement, LineElement, LinearGradientElement, MarkerElement, MaskElement, Matrix, MissingGlyphElement, Mouse, PSEUDO_ZERO, Parser, PathElement, PathParser, PatternElement, Point, PolygonElement, PolylineElement, Property, QB1, QB2, QB3, RadialGradientElement, RectElement, RenderedElement, Rotate, SVGElement, SVGFontLoader, Scale, Screen, Skew, SkewX, SkewY, StopElement, StyleElement, SymbolElement, TRefElement, TSpanElement, TextElement, TextPathElement, TitleElement, Transform, Translate, UnknownElement, UseElement, ViewPort, compressSpaces, getSelectorSpecificity, normalizeAttributeName, parseExternalUrl, index as presets, toNumbers, trimLeft, trimRight, vectorMagnitude, vectorsAngle, vectorsRatio };\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXMuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG52YXIgcnVudGltZSA9IChmdW5jdGlvbiAoZXhwb3J0cykge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgYSByZWplY3RlZCBQcm9taXNlIHdhcyB5aWVsZGVkLCB0aHJvdyB0aGUgcmVqZWN0aW9uIGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuXG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkge1xuICAgIGlmIChQcm9taXNlSW1wbCA9PT0gdm9pZCAwKSBQcm9taXNlSW1wbCA9IFByb21pc2U7XG5cbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksXG4gICAgICBQcm9taXNlSW1wbFxuICAgICk7XG5cbiAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgLy8gTm90ZTogW1wicmV0dXJuXCJdIG11c3QgYmUgdXNlZCBmb3IgRVMzIHBhcnNpbmcgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yW1wicmV0dXJuXCJdKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JcIjtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBleHBvcnRzLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlXG4gIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZVxuICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgLy8gaW5qZWN0ZWQgZWFzaWx5IGJ5IGBiaW4vcmVnZW5lcmF0b3IgLS1pbmNsdWRlLXJ1bnRpbWUgc2NyaXB0LmpzYC5cbiAgcmV0dXJuIGV4cG9ydHM7XG5cbn0oXG4gIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge31cbikpO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmVcbiAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgd2UgY2FuIGVzY2FwZVxuICAvLyBzdHJpY3QgbW9kZSB1c2luZyBhIGdsb2JhbCBGdW5jdGlvbiBjYWxsLiBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGZhaWxcbiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmXG4gIC8vIHlvdSd2ZSBtaXNjb25maWd1cmVkIHlvdXIgYnVuZGxlciB0byBmb3JjZSBzdHJpY3QgbW9kZSBhbmQgYXBwbGllZCBhXG4gIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS5cbiAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKShydW50aW1lKTtcbn1cbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiZXhwb3J0cyIsIk9wIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duIiwiaGFzT3duUHJvcGVydHkiLCJ1bmRlZmluZWQiLCIkU3ltYm9sIiwiU3ltYm9sIiwiaXRlcmF0b3JTeW1ib2wiLCJpdGVyYXRvciIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiY3JlYXRlIiwiY29udGV4dCIsIkNvbnRleHQiLCJfaW52b2tlIiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwiZm4iLCJvYmoiLCJhcmciLCJ0eXBlIiwiY2FsbCIsImVyciIsIkdlblN0YXRlU3VzcGVuZGVkU3RhcnQiLCJHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkIiwiR2VuU3RhdGVFeGVjdXRpbmciLCJHZW5TdGF0ZUNvbXBsZXRlZCIsIkNvbnRpbnVlU2VudGluZWwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJnZXRQcm90byIsImdldFByb3RvdHlwZU9mIiwiTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUiLCJ2YWx1ZXMiLCJHcCIsImNvbnN0cnVjdG9yIiwiZGlzcGxheU5hbWUiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwibWV0aG9kIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJfX2F3YWl0IiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwiaW52b2tlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlY29yZCIsInJlc3VsdCIsInZhbHVlIiwidGhlbiIsInVud3JhcHBlZCIsImVycm9yIiwicHJldmlvdXNQcm9taXNlIiwiZW5xdWV1ZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiYXN5bmMiLCJQcm9taXNlIiwiaXRlciIsIm5leHQiLCJkb25lIiwic3RhdGUiLCJFcnJvciIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiVHlwZUVycm9yIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0TG9jIiwidG9TdHJpbmciLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsImtleXMiLCJvYmplY3QiLCJrZXkiLCJyZXZlcnNlIiwibGVuZ3RoIiwicG9wIiwiaXRlcmFibGUiLCJpdGVyYXRvck1ldGhvZCIsImlzTmFOIiwiaSIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicm9vdEVudHJ5Iiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsInRocm93biIsImRlbGVnYXRlWWllbGQiLCJtb2R1bGUiLCJyZWdlbmVyYXRvclJ1bnRpbWUiLCJhY2NpZGVudGFsU3RyaWN0TW9kZSIsIkZ1bmN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7OztBQU9BLE1BQUlBLE9BQU8sR0FBSSxVQUFVQyxPQUFWLEVBQW1CO0FBQ2hDO0FBRUEsUUFBSUMsRUFBRSxHQUFHQyxNQUFNLENBQUNDLFNBQWhCO0FBQ0EsUUFBSUMsTUFBTSxHQUFHSCxFQUFFLENBQUNJLGNBQWhCO0FBQ0EsUUFBSUMsV0FBSixDQUxnQzs7QUFNaEMsUUFBSUMsT0FBTyxHQUFHLE9BQU9DLE1BQVAsS0FBa0IsVUFBbEIsR0FBK0JBLE1BQS9CLEdBQXdDLEVBQXREO0FBQ0EsUUFBSUMsY0FBYyxHQUFHRixPQUFPLENBQUNHLFFBQVIsSUFBb0IsWUFBekM7QUFDQSxRQUFJQyxtQkFBbUIsR0FBR0osT0FBTyxDQUFDSyxhQUFSLElBQXlCLGlCQUFuRDtBQUNBLFFBQUlDLGlCQUFpQixHQUFHTixPQUFPLENBQUNPLFdBQVIsSUFBdUIsZUFBL0M7O0FBRUEsYUFBU0MsSUFBVCxDQUFjQyxPQUFkLEVBQXVCQyxPQUF2QixFQUFnQ0MsSUFBaEMsRUFBc0NDLFdBQXRDLEVBQW1EOztBQUVqRCxVQUFJQyxjQUFjLEdBQUdILE9BQU8sSUFBSUEsT0FBTyxDQUFDZCxTQUFSLFlBQTZCa0IsU0FBeEMsR0FBb0RKLE9BQXBELEdBQThESSxTQUFuRjtBQUNBLFVBQUlDLFNBQVMsR0FBR3BCLE1BQU0sQ0FBQ3FCLE1BQVAsQ0FBY0gsY0FBYyxDQUFDakIsU0FBN0IsQ0FBaEI7QUFDQSxVQUFJcUIsT0FBTyxHQUFHLElBQUlDLE9BQUosQ0FBWU4sV0FBVyxJQUFJLEVBQTNCLENBQWQsQ0FKaUQ7OztBQVFqREcsTUFBQUEsU0FBUyxDQUFDSSxPQUFWLEdBQW9CQyxnQkFBZ0IsQ0FBQ1gsT0FBRCxFQUFVRSxJQUFWLEVBQWdCTSxPQUFoQixDQUFwQztBQUVBLGFBQU9GLFNBQVA7QUFDRDs7QUFDRHRCLElBQUFBLE9BQU8sQ0FBQ2UsSUFBUixHQUFlQSxJQUFmLENBdkJnQzs7Ozs7Ozs7Ozs7QUFtQ2hDLGFBQVNhLFFBQVQsQ0FBa0JDLEVBQWxCLEVBQXNCQyxHQUF0QixFQUEyQkMsR0FBM0IsRUFBZ0M7QUFDOUIsVUFBSTtBQUNGLGVBQU87QUFBRUMsVUFBQUEsSUFBSSxFQUFFLFFBQVI7QUFBa0JELFVBQUFBLEdBQUcsRUFBRUYsRUFBRSxDQUFDSSxJQUFILENBQVFILEdBQVIsRUFBYUMsR0FBYjtBQUF2QixTQUFQO0FBQ0QsT0FGRCxDQUVFLE9BQU9HLEdBQVAsRUFBWTtBQUNaLGVBQU87QUFBRUYsVUFBQUEsSUFBSSxFQUFFLE9BQVI7QUFBaUJELFVBQUFBLEdBQUcsRUFBRUc7QUFBdEIsU0FBUDtBQUNEO0FBQ0Y7O0FBRUQsUUFBSUMsc0JBQXNCLEdBQUcsZ0JBQTdCO0FBQ0EsUUFBSUMsc0JBQXNCLEdBQUcsZ0JBQTdCO0FBQ0EsUUFBSUMsaUJBQWlCLEdBQUcsV0FBeEI7QUFDQSxRQUFJQyxpQkFBaUIsR0FBRyxXQUF4QixDQTlDZ0M7OztBQWtEaEMsUUFBSUMsZ0JBQWdCLEdBQUcsRUFBdkIsQ0FsRGdDOzs7OztBQXdEaEMsYUFBU2xCLFNBQVQsR0FBcUI7O0FBQ3JCLGFBQVNtQixpQkFBVCxHQUE2Qjs7QUFDN0IsYUFBU0MsMEJBQVQsR0FBc0MsRUExRE47Ozs7QUE4RGhDLFFBQUlDLGlCQUFpQixHQUFHLEVBQXhCOztBQUNBQSxJQUFBQSxpQkFBaUIsQ0FBQ2pDLGNBQUQsQ0FBakIsR0FBb0MsWUFBWTtBQUM5QyxhQUFPLElBQVA7QUFDRCxLQUZEOztBQUlBLFFBQUlrQyxRQUFRLEdBQUd6QyxNQUFNLENBQUMwQyxjQUF0QjtBQUNBLFFBQUlDLHVCQUF1QixHQUFHRixRQUFRLElBQUlBLFFBQVEsQ0FBQ0EsUUFBUSxDQUFDRyxNQUFNLENBQUMsRUFBRCxDQUFQLENBQVQsQ0FBbEQ7O0FBQ0EsUUFBSUQsdUJBQXVCLElBQ3ZCQSx1QkFBdUIsS0FBSzVDLEVBRDVCLElBRUFHLE1BQU0sQ0FBQzZCLElBQVAsQ0FBWVksdUJBQVosRUFBcUNwQyxjQUFyQyxDQUZKLEVBRTBEOzs7QUFHeERpQyxNQUFBQSxpQkFBaUIsR0FBR0csdUJBQXBCO0FBQ0Q7O0FBRUQsUUFBSUUsRUFBRSxHQUFHTiwwQkFBMEIsQ0FBQ3RDLFNBQTNCLEdBQ1BrQixTQUFTLENBQUNsQixTQUFWLEdBQXNCRCxNQUFNLENBQUNxQixNQUFQLENBQWNtQixpQkFBZCxDQUR4QjtBQUVBRixJQUFBQSxpQkFBaUIsQ0FBQ3JDLFNBQWxCLEdBQThCNEMsRUFBRSxDQUFDQyxXQUFILEdBQWlCUCwwQkFBL0M7QUFDQUEsSUFBQUEsMEJBQTBCLENBQUNPLFdBQTNCLEdBQXlDUixpQkFBekM7QUFDQUMsSUFBQUEsMEJBQTBCLENBQUM1QixpQkFBRCxDQUExQixHQUNFMkIsaUJBQWlCLENBQUNTLFdBQWxCLEdBQWdDLG1CQURsQyxDQWpGZ0M7OztBQXNGaEMsYUFBU0MscUJBQVQsQ0FBK0IvQyxTQUEvQixFQUEwQztBQUN4QyxPQUFDLE1BQUQsRUFBUyxPQUFULEVBQWtCLFFBQWxCLEVBQTRCZ0QsT0FBNUIsQ0FBb0MsVUFBU0MsTUFBVCxFQUFpQjtBQUNuRGpELFFBQUFBLFNBQVMsQ0FBQ2lELE1BQUQsQ0FBVCxHQUFvQixVQUFTckIsR0FBVCxFQUFjO0FBQ2hDLGlCQUFPLEtBQUtMLE9BQUwsQ0FBYTBCLE1BQWIsRUFBcUJyQixHQUFyQixDQUFQO0FBQ0QsU0FGRDtBQUdELE9BSkQ7QUFLRDs7QUFFRC9CLElBQUFBLE9BQU8sQ0FBQ3FELG1CQUFSLEdBQThCLFVBQVNDLE1BQVQsRUFBaUI7QUFDN0MsVUFBSUMsSUFBSSxHQUFHLE9BQU9ELE1BQVAsS0FBa0IsVUFBbEIsSUFBZ0NBLE1BQU0sQ0FBQ04sV0FBbEQ7QUFDQSxhQUFPTyxJQUFJLEdBQ1BBLElBQUksS0FBS2YsaUJBQVQ7O0FBR0EsT0FBQ2UsSUFBSSxDQUFDTixXQUFMLElBQW9CTSxJQUFJLENBQUNDLElBQTFCLE1BQW9DLG1CQUo3QixHQUtQLEtBTEo7QUFNRCxLQVJEOztBQVVBeEQsSUFBQUEsT0FBTyxDQUFDeUQsSUFBUixHQUFlLFVBQVNILE1BQVQsRUFBaUI7QUFDOUIsVUFBSXBELE1BQU0sQ0FBQ3dELGNBQVgsRUFBMkI7QUFDekJ4RCxRQUFBQSxNQUFNLENBQUN3RCxjQUFQLENBQXNCSixNQUF0QixFQUE4QmIsMEJBQTlCO0FBQ0QsT0FGRCxNQUVPO0FBQ0xhLFFBQUFBLE1BQU0sQ0FBQ0ssU0FBUCxHQUFtQmxCLDBCQUFuQjs7QUFDQSxZQUFJLEVBQUU1QixpQkFBaUIsSUFBSXlDLE1BQXZCLENBQUosRUFBb0M7QUFDbENBLFVBQUFBLE1BQU0sQ0FBQ3pDLGlCQUFELENBQU4sR0FBNEIsbUJBQTVCO0FBQ0Q7QUFDRjs7QUFDRHlDLE1BQUFBLE1BQU0sQ0FBQ25ELFNBQVAsR0FBbUJELE1BQU0sQ0FBQ3FCLE1BQVAsQ0FBY3dCLEVBQWQsQ0FBbkI7QUFDQSxhQUFPTyxNQUFQO0FBQ0QsS0FYRCxDQXhHZ0M7Ozs7OztBQXlIaEN0RCxJQUFBQSxPQUFPLENBQUM0RCxLQUFSLEdBQWdCLFVBQVM3QixHQUFULEVBQWM7QUFDNUIsYUFBTztBQUFFOEIsUUFBQUEsT0FBTyxFQUFFOUI7QUFBWCxPQUFQO0FBQ0QsS0FGRDs7QUFJQSxhQUFTK0IsYUFBVCxDQUF1QnhDLFNBQXZCLEVBQWtDeUMsV0FBbEMsRUFBK0M7QUFDN0MsZUFBU0MsTUFBVCxDQUFnQlosTUFBaEIsRUFBd0JyQixHQUF4QixFQUE2QmtDLE9BQTdCLEVBQXNDQyxNQUF0QyxFQUE4QztBQUM1QyxZQUFJQyxNQUFNLEdBQUd2QyxRQUFRLENBQUNOLFNBQVMsQ0FBQzhCLE1BQUQsQ0FBVixFQUFvQjlCLFNBQXBCLEVBQStCUyxHQUEvQixDQUFyQjs7QUFDQSxZQUFJb0MsTUFBTSxDQUFDbkMsSUFBUCxLQUFnQixPQUFwQixFQUE2QjtBQUMzQmtDLFVBQUFBLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDcEMsR0FBUixDQUFOO0FBQ0QsU0FGRCxNQUVPO0FBQ0wsY0FBSXFDLE1BQU0sR0FBR0QsTUFBTSxDQUFDcEMsR0FBcEI7QUFDQSxjQUFJc0MsS0FBSyxHQUFHRCxNQUFNLENBQUNDLEtBQW5COztBQUNBLGNBQUlBLEtBQUssSUFDTCxPQUFPQSxLQUFQLEtBQWlCLFFBRGpCLElBRUFqRSxNQUFNLENBQUM2QixJQUFQLENBQVlvQyxLQUFaLEVBQW1CLFNBQW5CLENBRkosRUFFbUM7QUFDakMsbUJBQU9OLFdBQVcsQ0FBQ0UsT0FBWixDQUFvQkksS0FBSyxDQUFDUixPQUExQixFQUFtQ1MsSUFBbkMsQ0FBd0MsVUFBU0QsS0FBVCxFQUFnQjtBQUM3REwsY0FBQUEsTUFBTSxDQUFDLE1BQUQsRUFBU0ssS0FBVCxFQUFnQkosT0FBaEIsRUFBeUJDLE1BQXpCLENBQU47QUFDRCxhQUZNLEVBRUosVUFBU2hDLEdBQVQsRUFBYztBQUNmOEIsY0FBQUEsTUFBTSxDQUFDLE9BQUQsRUFBVTlCLEdBQVYsRUFBZStCLE9BQWYsRUFBd0JDLE1BQXhCLENBQU47QUFDRCxhQUpNLENBQVA7QUFLRDs7QUFFRCxpQkFBT0gsV0FBVyxDQUFDRSxPQUFaLENBQW9CSSxLQUFwQixFQUEyQkMsSUFBM0IsQ0FBZ0MsVUFBU0MsU0FBVCxFQUFvQjs7OztBQUl6REgsWUFBQUEsTUFBTSxDQUFDQyxLQUFQLEdBQWVFLFNBQWY7QUFDQU4sWUFBQUEsT0FBTyxDQUFDRyxNQUFELENBQVA7QUFDRCxXQU5NLEVBTUosVUFBU0ksS0FBVCxFQUFnQjs7O0FBR2pCLG1CQUFPUixNQUFNLENBQUMsT0FBRCxFQUFVUSxLQUFWLEVBQWlCUCxPQUFqQixFQUEwQkMsTUFBMUIsQ0FBYjtBQUNELFdBVk0sQ0FBUDtBQVdEO0FBQ0Y7O0FBRUQsVUFBSU8sZUFBSjs7QUFFQSxlQUFTQyxPQUFULENBQWlCdEIsTUFBakIsRUFBeUJyQixHQUF6QixFQUE4QjtBQUM1QixpQkFBUzRDLDBCQUFULEdBQXNDO0FBQ3BDLGlCQUFPLElBQUlaLFdBQUosQ0FBZ0IsVUFBU0UsT0FBVCxFQUFrQkMsTUFBbEIsRUFBMEI7QUFDL0NGLFlBQUFBLE1BQU0sQ0FBQ1osTUFBRCxFQUFTckIsR0FBVCxFQUFja0MsT0FBZCxFQUF1QkMsTUFBdkIsQ0FBTjtBQUNELFdBRk0sQ0FBUDtBQUdEOztBQUVELGVBQU9PLGVBQWU7Ozs7Ozs7Ozs7OztBQWFwQkEsUUFBQUEsZUFBZSxHQUFHQSxlQUFlLENBQUNILElBQWhCLENBQ2hCSywwQkFEZ0I7O0FBSWhCQSxRQUFBQSwwQkFKZ0IsQ0FBSCxHQUtYQSwwQkFBMEIsRUFsQmhDO0FBbUJELE9BNUQ0Qzs7OztBQWdFN0MsV0FBS2pELE9BQUwsR0FBZWdELE9BQWY7QUFDRDs7QUFFRHhCLElBQUFBLHFCQUFxQixDQUFDWSxhQUFhLENBQUMzRCxTQUFmLENBQXJCOztBQUNBMkQsSUFBQUEsYUFBYSxDQUFDM0QsU0FBZCxDQUF3QlEsbUJBQXhCLElBQStDLFlBQVk7QUFDekQsYUFBTyxJQUFQO0FBQ0QsS0FGRDs7QUFHQVgsSUFBQUEsT0FBTyxDQUFDOEQsYUFBUixHQUF3QkEsYUFBeEIsQ0FwTWdDOzs7O0FBeU1oQzlELElBQUFBLE9BQU8sQ0FBQzRFLEtBQVIsR0FBZ0IsVUFBUzVELE9BQVQsRUFBa0JDLE9BQWxCLEVBQTJCQyxJQUEzQixFQUFpQ0MsV0FBakMsRUFBOEM0QyxXQUE5QyxFQUEyRDtBQUN6RSxVQUFJQSxXQUFXLEtBQUssS0FBSyxDQUF6QixFQUE0QkEsV0FBVyxHQUFHYyxPQUFkO0FBRTVCLFVBQUlDLElBQUksR0FBRyxJQUFJaEIsYUFBSixDQUNUL0MsSUFBSSxDQUFDQyxPQUFELEVBQVVDLE9BQVYsRUFBbUJDLElBQW5CLEVBQXlCQyxXQUF6QixDQURLLEVBRVQ0QyxXQUZTLENBQVg7QUFLQSxhQUFPL0QsT0FBTyxDQUFDcUQsbUJBQVIsQ0FBNEJwQyxPQUE1QixJQUNINkQsSUFERztBQUFBLFFBRUhBLElBQUksQ0FBQ0MsSUFBTCxHQUFZVCxJQUFaLENBQWlCLFVBQVNGLE1BQVQsRUFBaUI7QUFDaEMsZUFBT0EsTUFBTSxDQUFDWSxJQUFQLEdBQWNaLE1BQU0sQ0FBQ0MsS0FBckIsR0FBNkJTLElBQUksQ0FBQ0MsSUFBTCxFQUFwQztBQUNELE9BRkQsQ0FGSjtBQUtELEtBYkQ7O0FBZUEsYUFBU3BELGdCQUFULENBQTBCWCxPQUExQixFQUFtQ0UsSUFBbkMsRUFBeUNNLE9BQXpDLEVBQWtEO0FBQ2hELFVBQUl5RCxLQUFLLEdBQUc5QyxzQkFBWjtBQUVBLGFBQU8sU0FBUzZCLE1BQVQsQ0FBZ0JaLE1BQWhCLEVBQXdCckIsR0FBeEIsRUFBNkI7QUFDbEMsWUFBSWtELEtBQUssS0FBSzVDLGlCQUFkLEVBQWlDO0FBQy9CLGdCQUFNLElBQUk2QyxLQUFKLENBQVUsOEJBQVYsQ0FBTjtBQUNEOztBQUVELFlBQUlELEtBQUssS0FBSzNDLGlCQUFkLEVBQWlDO0FBQy9CLGNBQUljLE1BQU0sS0FBSyxPQUFmLEVBQXdCO0FBQ3RCLGtCQUFNckIsR0FBTjtBQUNELFdBSDhCOzs7O0FBTy9CLGlCQUFPb0QsVUFBVSxFQUFqQjtBQUNEOztBQUVEM0QsUUFBQUEsT0FBTyxDQUFDNEIsTUFBUixHQUFpQkEsTUFBakI7QUFDQTVCLFFBQUFBLE9BQU8sQ0FBQ08sR0FBUixHQUFjQSxHQUFkOztBQUVBLGVBQU8sSUFBUCxFQUFhO0FBQ1gsY0FBSXFELFFBQVEsR0FBRzVELE9BQU8sQ0FBQzRELFFBQXZCOztBQUNBLGNBQUlBLFFBQUosRUFBYztBQUNaLGdCQUFJQyxjQUFjLEdBQUdDLG1CQUFtQixDQUFDRixRQUFELEVBQVc1RCxPQUFYLENBQXhDOztBQUNBLGdCQUFJNkQsY0FBSixFQUFvQjtBQUNsQixrQkFBSUEsY0FBYyxLQUFLOUMsZ0JBQXZCLEVBQXlDO0FBQ3pDLHFCQUFPOEMsY0FBUDtBQUNEO0FBQ0Y7O0FBRUQsY0FBSTdELE9BQU8sQ0FBQzRCLE1BQVIsS0FBbUIsTUFBdkIsRUFBK0I7OztBQUc3QjVCLFlBQUFBLE9BQU8sQ0FBQytELElBQVIsR0FBZS9ELE9BQU8sQ0FBQ2dFLEtBQVIsR0FBZ0JoRSxPQUFPLENBQUNPLEdBQXZDO0FBRUQsV0FMRCxNQUtPLElBQUlQLE9BQU8sQ0FBQzRCLE1BQVIsS0FBbUIsT0FBdkIsRUFBZ0M7QUFDckMsZ0JBQUk2QixLQUFLLEtBQUs5QyxzQkFBZCxFQUFzQztBQUNwQzhDLGNBQUFBLEtBQUssR0FBRzNDLGlCQUFSO0FBQ0Esb0JBQU1kLE9BQU8sQ0FBQ08sR0FBZDtBQUNEOztBQUVEUCxZQUFBQSxPQUFPLENBQUNpRSxpQkFBUixDQUEwQmpFLE9BQU8sQ0FBQ08sR0FBbEM7QUFFRCxXQVJNLE1BUUEsSUFBSVAsT0FBTyxDQUFDNEIsTUFBUixLQUFtQixRQUF2QixFQUFpQztBQUN0QzVCLFlBQUFBLE9BQU8sQ0FBQ2tFLE1BQVIsQ0FBZSxRQUFmLEVBQXlCbEUsT0FBTyxDQUFDTyxHQUFqQztBQUNEOztBQUVEa0QsVUFBQUEsS0FBSyxHQUFHNUMsaUJBQVI7QUFFQSxjQUFJOEIsTUFBTSxHQUFHdkMsUUFBUSxDQUFDWixPQUFELEVBQVVFLElBQVYsRUFBZ0JNLE9BQWhCLENBQXJCOztBQUNBLGNBQUkyQyxNQUFNLENBQUNuQyxJQUFQLEtBQWdCLFFBQXBCLEVBQThCOzs7QUFHNUJpRCxZQUFBQSxLQUFLLEdBQUd6RCxPQUFPLENBQUN3RCxJQUFSLEdBQ0oxQyxpQkFESSxHQUVKRixzQkFGSjs7QUFJQSxnQkFBSStCLE1BQU0sQ0FBQ3BDLEdBQVAsS0FBZVEsZ0JBQW5CLEVBQXFDO0FBQ25DO0FBQ0Q7O0FBRUQsbUJBQU87QUFDTDhCLGNBQUFBLEtBQUssRUFBRUYsTUFBTSxDQUFDcEMsR0FEVDtBQUVMaUQsY0FBQUEsSUFBSSxFQUFFeEQsT0FBTyxDQUFDd0Q7QUFGVCxhQUFQO0FBS0QsV0FoQkQsTUFnQk8sSUFBSWIsTUFBTSxDQUFDbkMsSUFBUCxLQUFnQixPQUFwQixFQUE2QjtBQUNsQ2lELFlBQUFBLEtBQUssR0FBRzNDLGlCQUFSLENBRGtDOzs7QUFJbENkLFlBQUFBLE9BQU8sQ0FBQzRCLE1BQVIsR0FBaUIsT0FBakI7QUFDQTVCLFlBQUFBLE9BQU8sQ0FBQ08sR0FBUixHQUFjb0MsTUFBTSxDQUFDcEMsR0FBckI7QUFDRDtBQUNGO0FBQ0YsT0F4RUQ7QUF5RUQsS0FwUytCOzs7Ozs7QUEwU2hDLGFBQVN1RCxtQkFBVCxDQUE2QkYsUUFBN0IsRUFBdUM1RCxPQUF2QyxFQUFnRDtBQUM5QyxVQUFJNEIsTUFBTSxHQUFHZ0MsUUFBUSxDQUFDMUUsUUFBVCxDQUFrQmMsT0FBTyxDQUFDNEIsTUFBMUIsQ0FBYjs7QUFDQSxVQUFJQSxNQUFNLEtBQUs5QyxXQUFmLEVBQTBCOzs7QUFHeEJrQixRQUFBQSxPQUFPLENBQUM0RCxRQUFSLEdBQW1CLElBQW5COztBQUVBLFlBQUk1RCxPQUFPLENBQUM0QixNQUFSLEtBQW1CLE9BQXZCLEVBQWdDOztBQUU5QixjQUFJZ0MsUUFBUSxDQUFDMUUsUUFBVCxDQUFrQixRQUFsQixDQUFKLEVBQWlDOzs7QUFHL0JjLFlBQUFBLE9BQU8sQ0FBQzRCLE1BQVIsR0FBaUIsUUFBakI7QUFDQTVCLFlBQUFBLE9BQU8sQ0FBQ08sR0FBUixHQUFjekIsV0FBZDtBQUNBZ0YsWUFBQUEsbUJBQW1CLENBQUNGLFFBQUQsRUFBVzVELE9BQVgsQ0FBbkI7O0FBRUEsZ0JBQUlBLE9BQU8sQ0FBQzRCLE1BQVIsS0FBbUIsT0FBdkIsRUFBZ0M7OztBQUc5QixxQkFBT2IsZ0JBQVA7QUFDRDtBQUNGOztBQUVEZixVQUFBQSxPQUFPLENBQUM0QixNQUFSLEdBQWlCLE9BQWpCO0FBQ0E1QixVQUFBQSxPQUFPLENBQUNPLEdBQVIsR0FBYyxJQUFJNEQsU0FBSixDQUNaLGdEQURZLENBQWQ7QUFFRDs7QUFFRCxlQUFPcEQsZ0JBQVA7QUFDRDs7QUFFRCxVQUFJNEIsTUFBTSxHQUFHdkMsUUFBUSxDQUFDd0IsTUFBRCxFQUFTZ0MsUUFBUSxDQUFDMUUsUUFBbEIsRUFBNEJjLE9BQU8sQ0FBQ08sR0FBcEMsQ0FBckI7O0FBRUEsVUFBSW9DLE1BQU0sQ0FBQ25DLElBQVAsS0FBZ0IsT0FBcEIsRUFBNkI7QUFDM0JSLFFBQUFBLE9BQU8sQ0FBQzRCLE1BQVIsR0FBaUIsT0FBakI7QUFDQTVCLFFBQUFBLE9BQU8sQ0FBQ08sR0FBUixHQUFjb0MsTUFBTSxDQUFDcEMsR0FBckI7QUFDQVAsUUFBQUEsT0FBTyxDQUFDNEQsUUFBUixHQUFtQixJQUFuQjtBQUNBLGVBQU83QyxnQkFBUDtBQUNEOztBQUVELFVBQUlxRCxJQUFJLEdBQUd6QixNQUFNLENBQUNwQyxHQUFsQjs7QUFFQSxVQUFJLENBQUU2RCxJQUFOLEVBQVk7QUFDVnBFLFFBQUFBLE9BQU8sQ0FBQzRCLE1BQVIsR0FBaUIsT0FBakI7QUFDQTVCLFFBQUFBLE9BQU8sQ0FBQ08sR0FBUixHQUFjLElBQUk0RCxTQUFKLENBQWMsa0NBQWQsQ0FBZDtBQUNBbkUsUUFBQUEsT0FBTyxDQUFDNEQsUUFBUixHQUFtQixJQUFuQjtBQUNBLGVBQU83QyxnQkFBUDtBQUNEOztBQUVELFVBQUlxRCxJQUFJLENBQUNaLElBQVQsRUFBZTs7O0FBR2J4RCxRQUFBQSxPQUFPLENBQUM0RCxRQUFRLENBQUNTLFVBQVYsQ0FBUCxHQUErQkQsSUFBSSxDQUFDdkIsS0FBcEMsQ0FIYTs7QUFNYjdDLFFBQUFBLE9BQU8sQ0FBQ3VELElBQVIsR0FBZUssUUFBUSxDQUFDVSxPQUF4QixDQU5hOzs7Ozs7O0FBY2IsWUFBSXRFLE9BQU8sQ0FBQzRCLE1BQVIsS0FBbUIsUUFBdkIsRUFBaUM7QUFDL0I1QixVQUFBQSxPQUFPLENBQUM0QixNQUFSLEdBQWlCLE1BQWpCO0FBQ0E1QixVQUFBQSxPQUFPLENBQUNPLEdBQVIsR0FBY3pCLFdBQWQ7QUFDRDtBQUVGLE9BbkJELE1BbUJPOztBQUVMLGVBQU9zRixJQUFQO0FBQ0QsT0F2RTZDOzs7O0FBMkU5Q3BFLE1BQUFBLE9BQU8sQ0FBQzRELFFBQVIsR0FBbUIsSUFBbkI7QUFDQSxhQUFPN0MsZ0JBQVA7QUFDRCxLQXZYK0I7Ozs7QUEyWGhDVyxJQUFBQSxxQkFBcUIsQ0FBQ0gsRUFBRCxDQUFyQjtBQUVBQSxJQUFBQSxFQUFFLENBQUNsQyxpQkFBRCxDQUFGLEdBQXdCLFdBQXhCLENBN1hnQzs7Ozs7O0FBb1loQ2tDLElBQUFBLEVBQUUsQ0FBQ3RDLGNBQUQsQ0FBRixHQUFxQixZQUFXO0FBQzlCLGFBQU8sSUFBUDtBQUNELEtBRkQ7O0FBSUFzQyxJQUFBQSxFQUFFLENBQUNnRCxRQUFILEdBQWMsWUFBVztBQUN2QixhQUFPLG9CQUFQO0FBQ0QsS0FGRDs7QUFJQSxhQUFTQyxZQUFULENBQXNCQyxJQUF0QixFQUE0QjtBQUMxQixVQUFJQyxLQUFLLEdBQUc7QUFBRUMsUUFBQUEsTUFBTSxFQUFFRixJQUFJLENBQUMsQ0FBRDtBQUFkLE9BQVo7O0FBRUEsVUFBSSxLQUFLQSxJQUFULEVBQWU7QUFDYkMsUUFBQUEsS0FBSyxDQUFDRSxRQUFOLEdBQWlCSCxJQUFJLENBQUMsQ0FBRCxDQUFyQjtBQUNEOztBQUVELFVBQUksS0FBS0EsSUFBVCxFQUFlO0FBQ2JDLFFBQUFBLEtBQUssQ0FBQ0csVUFBTixHQUFtQkosSUFBSSxDQUFDLENBQUQsQ0FBdkI7QUFDQUMsUUFBQUEsS0FBSyxDQUFDSSxRQUFOLEdBQWlCTCxJQUFJLENBQUMsQ0FBRCxDQUFyQjtBQUNEOztBQUVELFdBQUtNLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCTixLQUFyQjtBQUNEOztBQUVELGFBQVNPLGFBQVQsQ0FBdUJQLEtBQXZCLEVBQThCO0FBQzVCLFVBQUkvQixNQUFNLEdBQUcrQixLQUFLLENBQUNRLFVBQU4sSUFBb0IsRUFBakM7QUFDQXZDLE1BQUFBLE1BQU0sQ0FBQ25DLElBQVAsR0FBYyxRQUFkO0FBQ0EsYUFBT21DLE1BQU0sQ0FBQ3BDLEdBQWQ7QUFDQW1FLE1BQUFBLEtBQUssQ0FBQ1EsVUFBTixHQUFtQnZDLE1BQW5CO0FBQ0Q7O0FBRUQsYUFBUzFDLE9BQVQsQ0FBaUJOLFdBQWpCLEVBQThCOzs7O0FBSTVCLFdBQUtvRixVQUFMLEdBQWtCLENBQUM7QUFBRUosUUFBQUEsTUFBTSxFQUFFO0FBQVYsT0FBRCxDQUFsQjtBQUNBaEYsTUFBQUEsV0FBVyxDQUFDZ0MsT0FBWixDQUFvQjZDLFlBQXBCLEVBQWtDLElBQWxDO0FBQ0EsV0FBS1csS0FBTCxDQUFXLElBQVg7QUFDRDs7QUFFRDNHLElBQUFBLE9BQU8sQ0FBQzRHLElBQVIsR0FBZSxVQUFTQyxNQUFULEVBQWlCO0FBQzlCLFVBQUlELElBQUksR0FBRyxFQUFYOztBQUNBLFdBQUssSUFBSUUsR0FBVCxJQUFnQkQsTUFBaEIsRUFBd0I7QUFDdEJELFFBQUFBLElBQUksQ0FBQ0osSUFBTCxDQUFVTSxHQUFWO0FBQ0Q7O0FBQ0RGLE1BQUFBLElBQUksQ0FBQ0csT0FBTCxHQUw4Qjs7O0FBUzlCLGFBQU8sU0FBU2hDLElBQVQsR0FBZ0I7QUFDckIsZUFBTzZCLElBQUksQ0FBQ0ksTUFBWixFQUFvQjtBQUNsQixjQUFJRixHQUFHLEdBQUdGLElBQUksQ0FBQ0ssR0FBTCxFQUFWOztBQUNBLGNBQUlILEdBQUcsSUFBSUQsTUFBWCxFQUFtQjtBQUNqQjlCLFlBQUFBLElBQUksQ0FBQ1YsS0FBTCxHQUFheUMsR0FBYjtBQUNBL0IsWUFBQUEsSUFBSSxDQUFDQyxJQUFMLEdBQVksS0FBWjtBQUNBLG1CQUFPRCxJQUFQO0FBQ0Q7QUFDRixTQVJvQjs7Ozs7QUFhckJBLFFBQUFBLElBQUksQ0FBQ0MsSUFBTCxHQUFZLElBQVo7QUFDQSxlQUFPRCxJQUFQO0FBQ0QsT0FmRDtBQWdCRCxLQXpCRDs7QUEyQkEsYUFBU2pDLE1BQVQsQ0FBZ0JvRSxRQUFoQixFQUEwQjtBQUN4QixVQUFJQSxRQUFKLEVBQWM7QUFDWixZQUFJQyxjQUFjLEdBQUdELFFBQVEsQ0FBQ3pHLGNBQUQsQ0FBN0I7O0FBQ0EsWUFBSTBHLGNBQUosRUFBb0I7QUFDbEIsaUJBQU9BLGNBQWMsQ0FBQ2xGLElBQWYsQ0FBb0JpRixRQUFwQixDQUFQO0FBQ0Q7O0FBRUQsWUFBSSxPQUFPQSxRQUFRLENBQUNuQyxJQUFoQixLQUF5QixVQUE3QixFQUF5QztBQUN2QyxpQkFBT21DLFFBQVA7QUFDRDs7QUFFRCxZQUFJLENBQUNFLEtBQUssQ0FBQ0YsUUFBUSxDQUFDRixNQUFWLENBQVYsRUFBNkI7QUFDM0IsY0FBSUssQ0FBQyxHQUFHLENBQUMsQ0FBVDtBQUFBLGNBQVl0QyxJQUFJLEdBQUcsU0FBU0EsSUFBVCxHQUFnQjtBQUNqQyxtQkFBTyxFQUFFc0MsQ0FBRixHQUFNSCxRQUFRLENBQUNGLE1BQXRCLEVBQThCO0FBQzVCLGtCQUFJNUcsTUFBTSxDQUFDNkIsSUFBUCxDQUFZaUYsUUFBWixFQUFzQkcsQ0FBdEIsQ0FBSixFQUE4QjtBQUM1QnRDLGdCQUFBQSxJQUFJLENBQUNWLEtBQUwsR0FBYTZDLFFBQVEsQ0FBQ0csQ0FBRCxDQUFyQjtBQUNBdEMsZ0JBQUFBLElBQUksQ0FBQ0MsSUFBTCxHQUFZLEtBQVo7QUFDQSx1QkFBT0QsSUFBUDtBQUNEO0FBQ0Y7O0FBRURBLFlBQUFBLElBQUksQ0FBQ1YsS0FBTCxHQUFhL0QsV0FBYjtBQUNBeUUsWUFBQUEsSUFBSSxDQUFDQyxJQUFMLEdBQVksSUFBWjtBQUVBLG1CQUFPRCxJQUFQO0FBQ0QsV0FiRDs7QUFlQSxpQkFBT0EsSUFBSSxDQUFDQSxJQUFMLEdBQVlBLElBQW5CO0FBQ0Q7QUFDRixPQTdCdUI7OztBQWdDeEIsYUFBTztBQUFFQSxRQUFBQSxJQUFJLEVBQUVJO0FBQVIsT0FBUDtBQUNEOztBQUNEbkYsSUFBQUEsT0FBTyxDQUFDOEMsTUFBUixHQUFpQkEsTUFBakI7O0FBRUEsYUFBU3FDLFVBQVQsR0FBc0I7QUFDcEIsYUFBTztBQUFFZCxRQUFBQSxLQUFLLEVBQUUvRCxXQUFUO0FBQW9CMEUsUUFBQUEsSUFBSSxFQUFFO0FBQTFCLE9BQVA7QUFDRDs7QUFFRHZELElBQUFBLE9BQU8sQ0FBQ3RCLFNBQVIsR0FBb0I7QUFDbEI2QyxNQUFBQSxXQUFXLEVBQUV2QixPQURLO0FBR2xCa0YsTUFBQUEsS0FBSyxFQUFFLFVBQVNXLGFBQVQsRUFBd0I7QUFDN0IsYUFBS0MsSUFBTCxHQUFZLENBQVo7QUFDQSxhQUFLeEMsSUFBTCxHQUFZLENBQVosQ0FGNkI7OztBQUs3QixhQUFLUSxJQUFMLEdBQVksS0FBS0MsS0FBTCxHQUFhbEYsV0FBekI7QUFDQSxhQUFLMEUsSUFBTCxHQUFZLEtBQVo7QUFDQSxhQUFLSSxRQUFMLEdBQWdCLElBQWhCO0FBRUEsYUFBS2hDLE1BQUwsR0FBYyxNQUFkO0FBQ0EsYUFBS3JCLEdBQUwsR0FBV3pCLFdBQVg7QUFFQSxhQUFLaUcsVUFBTCxDQUFnQnBELE9BQWhCLENBQXdCc0QsYUFBeEI7O0FBRUEsWUFBSSxDQUFDYSxhQUFMLEVBQW9CO0FBQ2xCLGVBQUssSUFBSTlELElBQVQsSUFBaUIsSUFBakIsRUFBdUI7O0FBRXJCLGdCQUFJQSxJQUFJLENBQUNnRSxNQUFMLENBQVksQ0FBWixNQUFtQixHQUFuQixJQUNBcEgsTUFBTSxDQUFDNkIsSUFBUCxDQUFZLElBQVosRUFBa0J1QixJQUFsQixDQURBLElBRUEsQ0FBQzRELEtBQUssQ0FBQyxDQUFDNUQsSUFBSSxDQUFDaUUsS0FBTCxDQUFXLENBQVgsQ0FBRixDQUZWLEVBRTRCO0FBQzFCLG1CQUFLakUsSUFBTCxJQUFhbEQsV0FBYjtBQUNEO0FBQ0Y7QUFDRjtBQUNGLE9BM0JpQjtBQTZCbEJvSCxNQUFBQSxJQUFJLEVBQUUsWUFBVztBQUNmLGFBQUsxQyxJQUFMLEdBQVksSUFBWjtBQUVBLFlBQUkyQyxTQUFTLEdBQUcsS0FBS3BCLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FBaEI7QUFDQSxZQUFJcUIsVUFBVSxHQUFHRCxTQUFTLENBQUNqQixVQUEzQjs7QUFDQSxZQUFJa0IsVUFBVSxDQUFDNUYsSUFBWCxLQUFvQixPQUF4QixFQUFpQztBQUMvQixnQkFBTTRGLFVBQVUsQ0FBQzdGLEdBQWpCO0FBQ0Q7O0FBRUQsZUFBTyxLQUFLOEYsSUFBWjtBQUNELE9BdkNpQjtBQXlDbEJwQyxNQUFBQSxpQkFBaUIsRUFBRSxVQUFTcUMsU0FBVCxFQUFvQjtBQUNyQyxZQUFJLEtBQUs5QyxJQUFULEVBQWU7QUFDYixnQkFBTThDLFNBQU47QUFDRDs7QUFFRCxZQUFJdEcsT0FBTyxHQUFHLElBQWQ7O0FBQ0EsaUJBQVN1RyxNQUFULENBQWdCQyxHQUFoQixFQUFxQkMsTUFBckIsRUFBNkI7QUFDM0I5RCxVQUFBQSxNQUFNLENBQUNuQyxJQUFQLEdBQWMsT0FBZDtBQUNBbUMsVUFBQUEsTUFBTSxDQUFDcEMsR0FBUCxHQUFhK0YsU0FBYjtBQUNBdEcsVUFBQUEsT0FBTyxDQUFDdUQsSUFBUixHQUFlaUQsR0FBZjs7QUFFQSxjQUFJQyxNQUFKLEVBQVk7OztBQUdWekcsWUFBQUEsT0FBTyxDQUFDNEIsTUFBUixHQUFpQixNQUFqQjtBQUNBNUIsWUFBQUEsT0FBTyxDQUFDTyxHQUFSLEdBQWN6QixXQUFkO0FBQ0Q7O0FBRUQsaUJBQU8sQ0FBQyxDQUFFMkgsTUFBVjtBQUNEOztBQUVELGFBQUssSUFBSVosQ0FBQyxHQUFHLEtBQUtkLFVBQUwsQ0FBZ0JTLE1BQWhCLEdBQXlCLENBQXRDLEVBQXlDSyxDQUFDLElBQUksQ0FBOUMsRUFBaUQsRUFBRUEsQ0FBbkQsRUFBc0Q7QUFDcEQsY0FBSW5CLEtBQUssR0FBRyxLQUFLSyxVQUFMLENBQWdCYyxDQUFoQixDQUFaO0FBQ0EsY0FBSWxELE1BQU0sR0FBRytCLEtBQUssQ0FBQ1EsVUFBbkI7O0FBRUEsY0FBSVIsS0FBSyxDQUFDQyxNQUFOLEtBQWlCLE1BQXJCLEVBQTZCOzs7O0FBSTNCLG1CQUFPNEIsTUFBTSxDQUFDLEtBQUQsQ0FBYjtBQUNEOztBQUVELGNBQUk3QixLQUFLLENBQUNDLE1BQU4sSUFBZ0IsS0FBS29CLElBQXpCLEVBQStCO0FBQzdCLGdCQUFJVyxRQUFRLEdBQUc5SCxNQUFNLENBQUM2QixJQUFQLENBQVlpRSxLQUFaLEVBQW1CLFVBQW5CLENBQWY7QUFDQSxnQkFBSWlDLFVBQVUsR0FBRy9ILE1BQU0sQ0FBQzZCLElBQVAsQ0FBWWlFLEtBQVosRUFBbUIsWUFBbkIsQ0FBakI7O0FBRUEsZ0JBQUlnQyxRQUFRLElBQUlDLFVBQWhCLEVBQTRCO0FBQzFCLGtCQUFJLEtBQUtaLElBQUwsR0FBWXJCLEtBQUssQ0FBQ0UsUUFBdEIsRUFBZ0M7QUFDOUIsdUJBQU8yQixNQUFNLENBQUM3QixLQUFLLENBQUNFLFFBQVAsRUFBaUIsSUFBakIsQ0FBYjtBQUNELGVBRkQsTUFFTyxJQUFJLEtBQUttQixJQUFMLEdBQVlyQixLQUFLLENBQUNHLFVBQXRCLEVBQWtDO0FBQ3ZDLHVCQUFPMEIsTUFBTSxDQUFDN0IsS0FBSyxDQUFDRyxVQUFQLENBQWI7QUFDRDtBQUVGLGFBUEQsTUFPTyxJQUFJNkIsUUFBSixFQUFjO0FBQ25CLGtCQUFJLEtBQUtYLElBQUwsR0FBWXJCLEtBQUssQ0FBQ0UsUUFBdEIsRUFBZ0M7QUFDOUIsdUJBQU8yQixNQUFNLENBQUM3QixLQUFLLENBQUNFLFFBQVAsRUFBaUIsSUFBakIsQ0FBYjtBQUNEO0FBRUYsYUFMTSxNQUtBLElBQUkrQixVQUFKLEVBQWdCO0FBQ3JCLGtCQUFJLEtBQUtaLElBQUwsR0FBWXJCLEtBQUssQ0FBQ0csVUFBdEIsRUFBa0M7QUFDaEMsdUJBQU8wQixNQUFNLENBQUM3QixLQUFLLENBQUNHLFVBQVAsQ0FBYjtBQUNEO0FBRUYsYUFMTSxNQUtBO0FBQ0wsb0JBQU0sSUFBSW5CLEtBQUosQ0FBVSx3Q0FBVixDQUFOO0FBQ0Q7QUFDRjtBQUNGO0FBQ0YsT0FuR2lCO0FBcUdsQlEsTUFBQUEsTUFBTSxFQUFFLFVBQVMxRCxJQUFULEVBQWVELEdBQWYsRUFBb0I7QUFDMUIsYUFBSyxJQUFJc0YsQ0FBQyxHQUFHLEtBQUtkLFVBQUwsQ0FBZ0JTLE1BQWhCLEdBQXlCLENBQXRDLEVBQXlDSyxDQUFDLElBQUksQ0FBOUMsRUFBaUQsRUFBRUEsQ0FBbkQsRUFBc0Q7QUFDcEQsY0FBSW5CLEtBQUssR0FBRyxLQUFLSyxVQUFMLENBQWdCYyxDQUFoQixDQUFaOztBQUNBLGNBQUluQixLQUFLLENBQUNDLE1BQU4sSUFBZ0IsS0FBS29CLElBQXJCLElBQ0FuSCxNQUFNLENBQUM2QixJQUFQLENBQVlpRSxLQUFaLEVBQW1CLFlBQW5CLENBREEsSUFFQSxLQUFLcUIsSUFBTCxHQUFZckIsS0FBSyxDQUFDRyxVQUZ0QixFQUVrQztBQUNoQyxnQkFBSStCLFlBQVksR0FBR2xDLEtBQW5CO0FBQ0E7QUFDRDtBQUNGOztBQUVELFlBQUlrQyxZQUFZLEtBQ1hwRyxJQUFJLEtBQUssT0FBVCxJQUNBQSxJQUFJLEtBQUssVUFGRSxDQUFaLElBR0FvRyxZQUFZLENBQUNqQyxNQUFiLElBQXVCcEUsR0FIdkIsSUFJQUEsR0FBRyxJQUFJcUcsWUFBWSxDQUFDL0IsVUFKeEIsRUFJb0M7OztBQUdsQytCLFVBQUFBLFlBQVksR0FBRyxJQUFmO0FBQ0Q7O0FBRUQsWUFBSWpFLE1BQU0sR0FBR2lFLFlBQVksR0FBR0EsWUFBWSxDQUFDMUIsVUFBaEIsR0FBNkIsRUFBdEQ7QUFDQXZDLFFBQUFBLE1BQU0sQ0FBQ25DLElBQVAsR0FBY0EsSUFBZDtBQUNBbUMsUUFBQUEsTUFBTSxDQUFDcEMsR0FBUCxHQUFhQSxHQUFiOztBQUVBLFlBQUlxRyxZQUFKLEVBQWtCO0FBQ2hCLGVBQUtoRixNQUFMLEdBQWMsTUFBZDtBQUNBLGVBQUsyQixJQUFMLEdBQVlxRCxZQUFZLENBQUMvQixVQUF6QjtBQUNBLGlCQUFPOUQsZ0JBQVA7QUFDRDs7QUFFRCxlQUFPLEtBQUs4RixRQUFMLENBQWNsRSxNQUFkLENBQVA7QUFDRCxPQXJJaUI7QUF1SWxCa0UsTUFBQUEsUUFBUSxFQUFFLFVBQVNsRSxNQUFULEVBQWlCbUMsUUFBakIsRUFBMkI7QUFDbkMsWUFBSW5DLE1BQU0sQ0FBQ25DLElBQVAsS0FBZ0IsT0FBcEIsRUFBNkI7QUFDM0IsZ0JBQU1tQyxNQUFNLENBQUNwQyxHQUFiO0FBQ0Q7O0FBRUQsWUFBSW9DLE1BQU0sQ0FBQ25DLElBQVAsS0FBZ0IsT0FBaEIsSUFDQW1DLE1BQU0sQ0FBQ25DLElBQVAsS0FBZ0IsVUFEcEIsRUFDZ0M7QUFDOUIsZUFBSytDLElBQUwsR0FBWVosTUFBTSxDQUFDcEMsR0FBbkI7QUFDRCxTQUhELE1BR08sSUFBSW9DLE1BQU0sQ0FBQ25DLElBQVAsS0FBZ0IsUUFBcEIsRUFBOEI7QUFDbkMsZUFBSzZGLElBQUwsR0FBWSxLQUFLOUYsR0FBTCxHQUFXb0MsTUFBTSxDQUFDcEMsR0FBOUI7QUFDQSxlQUFLcUIsTUFBTCxHQUFjLFFBQWQ7QUFDQSxlQUFLMkIsSUFBTCxHQUFZLEtBQVo7QUFDRCxTQUpNLE1BSUEsSUFBSVosTUFBTSxDQUFDbkMsSUFBUCxLQUFnQixRQUFoQixJQUE0QnNFLFFBQWhDLEVBQTBDO0FBQy9DLGVBQUt2QixJQUFMLEdBQVl1QixRQUFaO0FBQ0Q7O0FBRUQsZUFBTy9ELGdCQUFQO0FBQ0QsT0F4SmlCO0FBMEpsQitGLE1BQUFBLE1BQU0sRUFBRSxVQUFTakMsVUFBVCxFQUFxQjtBQUMzQixhQUFLLElBQUlnQixDQUFDLEdBQUcsS0FBS2QsVUFBTCxDQUFnQlMsTUFBaEIsR0FBeUIsQ0FBdEMsRUFBeUNLLENBQUMsSUFBSSxDQUE5QyxFQUFpRCxFQUFFQSxDQUFuRCxFQUFzRDtBQUNwRCxjQUFJbkIsS0FBSyxHQUFHLEtBQUtLLFVBQUwsQ0FBZ0JjLENBQWhCLENBQVo7O0FBQ0EsY0FBSW5CLEtBQUssQ0FBQ0csVUFBTixLQUFxQkEsVUFBekIsRUFBcUM7QUFDbkMsaUJBQUtnQyxRQUFMLENBQWNuQyxLQUFLLENBQUNRLFVBQXBCLEVBQWdDUixLQUFLLENBQUNJLFFBQXRDO0FBQ0FHLFlBQUFBLGFBQWEsQ0FBQ1AsS0FBRCxDQUFiO0FBQ0EsbUJBQU8zRCxnQkFBUDtBQUNEO0FBQ0Y7QUFDRixPQW5LaUI7QUFxS2xCLGVBQVMsVUFBUzRELE1BQVQsRUFBaUI7QUFDeEIsYUFBSyxJQUFJa0IsQ0FBQyxHQUFHLEtBQUtkLFVBQUwsQ0FBZ0JTLE1BQWhCLEdBQXlCLENBQXRDLEVBQXlDSyxDQUFDLElBQUksQ0FBOUMsRUFBaUQsRUFBRUEsQ0FBbkQsRUFBc0Q7QUFDcEQsY0FBSW5CLEtBQUssR0FBRyxLQUFLSyxVQUFMLENBQWdCYyxDQUFoQixDQUFaOztBQUNBLGNBQUluQixLQUFLLENBQUNDLE1BQU4sS0FBaUJBLE1BQXJCLEVBQTZCO0FBQzNCLGdCQUFJaEMsTUFBTSxHQUFHK0IsS0FBSyxDQUFDUSxVQUFuQjs7QUFDQSxnQkFBSXZDLE1BQU0sQ0FBQ25DLElBQVAsS0FBZ0IsT0FBcEIsRUFBNkI7QUFDM0Isa0JBQUl1RyxNQUFNLEdBQUdwRSxNQUFNLENBQUNwQyxHQUFwQjtBQUNBMEUsY0FBQUEsYUFBYSxDQUFDUCxLQUFELENBQWI7QUFDRDs7QUFDRCxtQkFBT3FDLE1BQVA7QUFDRDtBQUNGLFNBWHVCOzs7O0FBZXhCLGNBQU0sSUFBSXJELEtBQUosQ0FBVSx1QkFBVixDQUFOO0FBQ0QsT0FyTGlCO0FBdUxsQnNELE1BQUFBLGFBQWEsRUFBRSxVQUFTdEIsUUFBVCxFQUFtQnJCLFVBQW5CLEVBQStCQyxPQUEvQixFQUF3QztBQUNyRCxhQUFLVixRQUFMLEdBQWdCO0FBQ2QxRSxVQUFBQSxRQUFRLEVBQUVvQyxNQUFNLENBQUNvRSxRQUFELENBREY7QUFFZHJCLFVBQUFBLFVBQVUsRUFBRUEsVUFGRTtBQUdkQyxVQUFBQSxPQUFPLEVBQUVBO0FBSEssU0FBaEI7O0FBTUEsWUFBSSxLQUFLMUMsTUFBTCxLQUFnQixNQUFwQixFQUE0Qjs7O0FBRzFCLGVBQUtyQixHQUFMLEdBQVd6QixXQUFYO0FBQ0Q7O0FBRUQsZUFBT2lDLGdCQUFQO0FBQ0Q7QUFyTWlCLEtBQXBCLENBOWVnQzs7Ozs7QUEwckJoQyxXQUFPdkMsT0FBUDtBQUVELEdBNXJCYzs7OztBQWlzQmIsR0FBNkJ5SSxNQUFNLENBQUN6SSxPQUFwQyxDQWpzQmEsQ0FBZjs7QUFvc0JBLE1BQUk7QUFDRjBJLElBQUFBLGtCQUFrQixHQUFHM0ksT0FBckI7QUFDRCxHQUZELENBRUUsT0FBTzRJLG9CQUFQLEVBQTZCOzs7Ozs7Ozs7O0FBVTdCQyxJQUFBQSxRQUFRLENBQUMsR0FBRCxFQUFNLHdCQUFOLENBQVIsQ0FBd0M3SSxPQUF4Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsifQ==\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/canvg/index.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nrequire('core-js/modules/es.array.map');\nrequire('core-js/modules/es.regexp.exec');\nrequire('core-js/modules/es.string.match');\nrequire('core-js/modules/es.string.replace');\nrequire('core-js/modules/es.array.join');\nvar _slicedToArray = _interopDefault(require('@babel/runtime/helpers/slicedToArray'));\nrequire('core-js/modules/es.symbol');\nrequire('core-js/modules/es.array.filter');\nrequire('core-js/modules/es.array.for-each');\nrequire('core-js/modules/es.object.get-own-property-descriptor');\nrequire('core-js/modules/es.object.get-own-property-descriptors');\nrequire('core-js/modules/es.object.keys');\nrequire('core-js/modules/web.dom-collections.for-each');\nvar _regeneratorRuntime = _interopDefault(require('@babel/runtime/regenerator'));\nvar _asyncToGenerator = _interopDefault(require('@babel/runtime/helpers/asyncToGenerator'));\nvar _defineProperty = _interopDefault(require('@babel/runtime/helpers/defineProperty'));\nvar _classCallCheck = _interopDefault(require('@babel/runtime/helpers/classCallCheck'));\nvar _createClass = _interopDefault(require('@babel/runtime/helpers/createClass'));\nrequire('core-js/modules/es.array.concat');\nrequire('core-js/modules/es.array.every');\nrequire('core-js/modules/es.array.reduce');\nrequire('core-js/modules/es.object.to-string');\nrequire('core-js/modules/es.promise');\nrequire('core-js/modules/es.string.split');\nvar requestAnimationFrame = _interopDefault(require('raf'));\nrequire('core-js/modules/es.function.name');\nvar RGBColor = _interopDefault(require('rgbcolor'));\nrequire('core-js/modules/es.reflect.construct');\nrequire('core-js/modules/es.regexp.to-string');\nvar _inherits = _interopDefault(require('@babel/runtime/helpers/inherits'));\nvar _possibleConstructorReturn = _interopDefault(require('@babel/runtime/helpers/possibleConstructorReturn'));\nvar _getPrototypeOf = _interopDefault(require('@babel/runtime/helpers/getPrototypeOf'));\nrequire('core-js/modules/es.array.from');\nrequire('core-js/modules/es.array.includes');\nrequire('core-js/modules/es.array.some');\nrequire('core-js/modules/es.string.includes');\nrequire('core-js/modules/es.string.iterator');\nrequire('core-js/modules/es.string.trim');\nrequire('core-js/modules/es.array.index-of');\nrequire('core-js/modules/es.array.reverse');\nvar _get = _interopDefault(require('@babel/runtime/helpers/get'));\nrequire('core-js/modules/es.number.constructor');\nrequire('core-js/modules/es.array.fill');\nrequire('core-js/modules/es.reflect.delete-property');\nvar _assertThisInitialized = _interopDefault(require('@babel/runtime/helpers/assertThisInitialized'));\nrequire('core-js/modules/es.array.iterator');\nrequire('core-js/modules/web.dom-collections.iterator');\nrequire('core-js/modules/es.symbol.description');\nrequire('core-js/modules/es.symbol.iterator');\nrequire('core-js/modules/es.array.slice');\nrequire('core-js/modules/es.map');\nrequire('core-js/modules/es.reflect.apply');\nrequire('core-js/modules/es.reflect.get-prototype-of');\nvar stackblurCanvas = require('stackblur-canvas');\n\n/**\n * HTML-safe compress white-spaces.\n * @param str - String to compress.\n */\nfunction compressSpaces(str) {\n  return str.replace(/(?!\\u3000)\\s+/gm, ' ');\n}\n/**\n * HTML-safe left trim.\n * @param str - String to trim.\n */\n\nfunction trimLeft(str) {\n  return str.replace(/^[\\n \\t]+/, '');\n}\n/**\n * HTML-safe right trim.\n * @param str - String to trim.\n */\n\nfunction trimRight(str) {\n  return str.replace(/[\\n \\t]+$/, '');\n}\n/**\n * String to numbers array.\n * @param str - Numbers string.\n */\n\nfunction toNumbers(str) {\n  var matches = (str || '').match(/-?(\\d+(?:\\.\\d*(?:[eE][+-]?\\d+)?)?|\\.\\d+)(?=\\D|$)/gm) || [];\n  return matches.map(parseFloat);\n} // Microsoft Edge fix\n\nvar allUppercase = /^[A-Z-]+$/;\n/**\n * Normalize attribute name.\n * @param name - Attribute name.\n */\n\nfunction normalizeAttributeName(name) {\n  if (allUppercase.test(name)) {\n    return name.toLowerCase();\n  }\n\n  return name;\n}\n/**\n * Parse external URL.\n * @param url - CSS url string.\n */\n\nfunction parseExternalUrl(url) {\n  //                                   single quotes [2]\n  //                                   v           double quotes [3]\n  //                                   v           v        no quotes [4]\n  //                                   v           v        v\n  var urlMatch = url.match(/url\\(('([^']+)'|\"([^\"]+)\"|([^'\"\\)]+))\\)/) || [];\n  return urlMatch[2] || urlMatch[3] || urlMatch[4];\n}\n\n// slightly modified version of https://github.com/keeganstreet/specificity/blob/master/specificity.js\nvar attributeRegex = /(\\[[^\\]]+\\])/g;\nvar idRegex = /(#[^\\s\\+>~\\.\\[:]+)/g;\nvar classRegex = /(\\.[^\\s\\+>~\\.\\[:]+)/g;\nvar pseudoElementRegex = /(::[^\\s\\+>~\\.\\[:]+|:first-line|:first-letter|:before|:after)/gi;\nvar pseudoClassWithBracketsRegex = /(:[\\w-]+\\([^\\)]*\\))/gi;\nvar pseudoClassRegex = /(:[^\\s\\+>~\\.\\[:]+)/g;\nvar elementRegex = /([^\\s\\+>~\\.\\[:]+)/g;\n\nfunction findSelectorMatch(selector, regex) {\n  var matches = selector.match(regex);\n\n  if (!matches) {\n    return [selector, 0];\n  }\n\n  return [selector.replace(regex, ' '), matches.length];\n}\n/**\n * Measure selector specificity.\n * @param selector - Selector to measure.\n */\n\n\nfunction getSelectorSpecificity(selector) {\n  var specificity = [0, 0, 0];\n  var currentSelector = selector.replace(/:not\\(([^\\)]*)\\)/g, '     $1 ').replace(/{[\\s\\S]*/gm, ' ');\n  var delta = 0;\n\n  var _findSelectorMatch = findSelectorMatch(currentSelector, attributeRegex);\n\n  var _findSelectorMatch2 = _slicedToArray(_findSelectorMatch, 2);\n\n  currentSelector = _findSelectorMatch2[0];\n  delta = _findSelectorMatch2[1];\n  specificity[1] += delta;\n\n  var _findSelectorMatch3 = findSelectorMatch(currentSelector, idRegex);\n\n  var _findSelectorMatch4 = _slicedToArray(_findSelectorMatch3, 2);\n\n  currentSelector = _findSelectorMatch4[0];\n  delta = _findSelectorMatch4[1];\n  specificity[0] += delta;\n\n  var _findSelectorMatch5 = findSelectorMatch(currentSelector, classRegex);\n\n  var _findSelectorMatch6 = _slicedToArray(_findSelectorMatch5, 2);\n\n  currentSelector = _findSelectorMatch6[0];\n  delta = _findSelectorMatch6[1];\n  specificity[1] += delta;\n\n  var _findSelectorMatch7 = findSelectorMatch(currentSelector, pseudoElementRegex);\n\n  var _findSelectorMatch8 = _slicedToArray(_findSelectorMatch7, 2);\n\n  currentSelector = _findSelectorMatch8[0];\n  delta = _findSelectorMatch8[1];\n  specificity[2] += delta;\n\n  var _findSelectorMatch9 = findSelectorMatch(currentSelector, pseudoClassWithBracketsRegex);\n\n  var _findSelectorMatch10 = _slicedToArray(_findSelectorMatch9, 2);\n\n  currentSelector = _findSelectorMatch10[0];\n  delta = _findSelectorMatch10[1];\n  specificity[1] += delta;\n\n  var _findSelectorMatch11 = findSelectorMatch(currentSelector, pseudoClassRegex);\n\n  var _findSelectorMatch12 = _slicedToArray(_findSelectorMatch11, 2);\n\n  currentSelector = _findSelectorMatch12[0];\n  delta = _findSelectorMatch12[1];\n  specificity[1] += delta;\n  currentSelector = currentSelector.replace(/[\\*\\s\\+>~]/g, ' ').replace(/[#\\.]/g, ' ');\n\n  var _findSelectorMatch13 = findSelectorMatch(currentSelector, elementRegex);\n\n  var _findSelectorMatch14 = _slicedToArray(_findSelectorMatch13, 2);\n\n  currentSelector = _findSelectorMatch14[0];\n  delta = _findSelectorMatch14[1];\n  // lgtm [js/useless-assignment-to-local]\n  specificity[2] += delta;\n  return specificity.join('');\n}\n\nvar PSEUDO_ZERO = .00000001;\n/**\n * Vector magnitude.\n */\n\nfunction vectorMagnitude(v) {\n  return Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2));\n}\n/**\n * Ratio between two vectors.\n */\n\nfunction vectorsRatio(u, v) {\n  return (u[0] * v[0] + u[1] * v[1]) / (vectorMagnitude(u) * vectorMagnitude(v));\n}\n/**\n * Angle between two vectors.\n */\n\nfunction vectorsAngle(u, v) {\n  return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vectorsRatio(u, v));\n}\nfunction CB1(t) {\n  return t * t * t;\n}\nfunction CB2(t) {\n  return 3 * t * t * (1 - t);\n}\nfunction CB3(t) {\n  return 3 * t * (1 - t) * (1 - t);\n}\nfunction CB4(t) {\n  return (1 - t) * (1 - t) * (1 - t);\n}\nfunction QB1(t) {\n  return t * t;\n}\nfunction QB2(t) {\n  return 2 * t * (1 - t);\n}\nfunction QB3(t) {\n  return (1 - t) * (1 - t);\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar runtime_1 = createCommonjsModule(function (module) {\n  /**\n   * Copyright (c) 2014-present, Facebook, Inc.\n   *\n   * This source code is licensed under the MIT license found in the\n   * LICENSE file in the root directory of this source tree.\n   */\n  var runtime = function (exports) {\n\n    var Op = Object.prototype;\n    var hasOwn = Op.hasOwnProperty;\n    var undefined$1; // More compressible than void 0.\n\n    var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n    var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n    var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n    var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n    function wrap(innerFn, outerFn, self, tryLocsList) {\n      // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n      var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n      var generator = Object.create(protoGenerator.prototype);\n      var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,\n      // .throw, and .return methods.\n\n      generator._invoke = makeInvokeMethod(innerFn, self, context);\n      return generator;\n    }\n\n    exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion\n    // record like context.tryEntries[i].completion. This interface could\n    // have been (and was previously) designed to take a closure to be\n    // invoked without arguments, but in all the cases we care about we\n    // already have an existing method we want to call, so there's no need\n    // to create a new function object. We can even get away with assuming\n    // the method takes exactly one argument, since that happens to be true\n    // in every case, so we don't have to touch the arguments object. The\n    // only additional allocation required is the completion record, which\n    // has a stable shape and so hopefully should be cheap to allocate.\n\n    function tryCatch(fn, obj, arg) {\n      try {\n        return {\n          type: \"normal\",\n          arg: fn.call(obj, arg)\n        };\n      } catch (err) {\n        return {\n          type: \"throw\",\n          arg: err\n        };\n      }\n    }\n\n    var GenStateSuspendedStart = \"suspendedStart\";\n    var GenStateSuspendedYield = \"suspendedYield\";\n    var GenStateExecuting = \"executing\";\n    var GenStateCompleted = \"completed\"; // Returning this object from the innerFn has the same effect as\n    // breaking out of the dispatch switch statement.\n\n    var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and\n    // .constructor.prototype properties for functions that return Generator\n    // objects. For full spec compliance, you may wish to configure your\n    // minifier not to mangle the names of these two functions.\n\n    function Generator() {}\n\n    function GeneratorFunction() {}\n\n    function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that\n    // don't natively support it.\n\n\n    var IteratorPrototype = {};\n\n    IteratorPrototype[iteratorSymbol] = function () {\n      return this;\n    };\n\n    var getProto = Object.getPrototypeOf;\n    var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n\n    if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n      // This environment has a native %IteratorPrototype%; use it instead\n      // of the polyfill.\n      IteratorPrototype = NativeIteratorPrototype;\n    }\n\n    var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n    GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n    GeneratorFunctionPrototype.constructor = GeneratorFunction;\n    GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = \"GeneratorFunction\"; // Helper for defining the .next, .throw, and .return methods of the\n    // Iterator interface in terms of a single ._invoke method.\n\n    function defineIteratorMethods(prototype) {\n      [\"next\", \"throw\", \"return\"].forEach(function (method) {\n        prototype[method] = function (arg) {\n          return this._invoke(method, arg);\n        };\n      });\n    }\n\n    exports.isGeneratorFunction = function (genFun) {\n      var ctor = typeof genFun === \"function\" && genFun.constructor;\n      return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can\n      // do is to check its .name property.\n      (ctor.displayName || ctor.name) === \"GeneratorFunction\" : false;\n    };\n\n    exports.mark = function (genFun) {\n      if (Object.setPrototypeOf) {\n        Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n      } else {\n        genFun.__proto__ = GeneratorFunctionPrototype;\n\n        if (!(toStringTagSymbol in genFun)) {\n          genFun[toStringTagSymbol] = \"GeneratorFunction\";\n        }\n      }\n\n      genFun.prototype = Object.create(Gp);\n      return genFun;\n    }; // Within the body of any async function, `await x` is transformed to\n    // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n    // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n    // meant to be awaited.\n\n\n    exports.awrap = function (arg) {\n      return {\n        __await: arg\n      };\n    };\n\n    function AsyncIterator(generator, PromiseImpl) {\n      function invoke(method, arg, resolve, reject) {\n        var record = tryCatch(generator[method], generator, arg);\n\n        if (record.type === \"throw\") {\n          reject(record.arg);\n        } else {\n          var result = record.arg;\n          var value = result.value;\n\n          if (value && typeof value === \"object\" && hasOwn.call(value, \"__await\")) {\n            return PromiseImpl.resolve(value.__await).then(function (value) {\n              invoke(\"next\", value, resolve, reject);\n            }, function (err) {\n              invoke(\"throw\", err, resolve, reject);\n            });\n          }\n\n          return PromiseImpl.resolve(value).then(function (unwrapped) {\n            // When a yielded Promise is resolved, its final value becomes\n            // the .value of the Promise<{value,done}> result for the\n            // current iteration.\n            result.value = unwrapped;\n            resolve(result);\n          }, function (error) {\n            // If a rejected Promise was yielded, throw the rejection back\n            // into the async generator function so it can be handled there.\n            return invoke(\"throw\", error, resolve, reject);\n          });\n        }\n      }\n\n      var previousPromise;\n\n      function enqueue(method, arg) {\n        function callInvokeWithMethodAndArg() {\n          return new PromiseImpl(function (resolve, reject) {\n            invoke(method, arg, resolve, reject);\n          });\n        }\n\n        return previousPromise = // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later\n        // invocations of the iterator.\n        callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n      } // Define the unified helper method that is used to implement .next,\n      // .throw, and .return (see defineIteratorMethods).\n\n\n      this._invoke = enqueue;\n    }\n\n    defineIteratorMethods(AsyncIterator.prototype);\n\n    AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n      return this;\n    };\n\n    exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of\n    // AsyncIterator objects; they just return a Promise for the value of\n    // the final result produced by the iterator.\n\n    exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n      if (PromiseImpl === void 0) PromiseImpl = Promise;\n      var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n      return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function (result) {\n        return result.done ? result.value : iter.next();\n      });\n    };\n\n    function makeInvokeMethod(innerFn, self, context) {\n      var state = GenStateSuspendedStart;\n      return function invoke(method, arg) {\n        if (state === GenStateExecuting) {\n          throw new Error(\"Generator is already running\");\n        }\n\n        if (state === GenStateCompleted) {\n          if (method === \"throw\") {\n            throw arg;\n          } // Be forgiving, per 25.3.3.3.3 of the spec:\n          // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n\n\n          return doneResult();\n        }\n\n        context.method = method;\n        context.arg = arg;\n\n        while (true) {\n          var delegate = context.delegate;\n\n          if (delegate) {\n            var delegateResult = maybeInvokeDelegate(delegate, context);\n\n            if (delegateResult) {\n              if (delegateResult === ContinueSentinel) continue;\n              return delegateResult;\n            }\n          }\n\n          if (context.method === \"next\") {\n            // Setting context._sent for legacy support of Babel's\n            // function.sent implementation.\n            context.sent = context._sent = context.arg;\n          } else if (context.method === \"throw\") {\n            if (state === GenStateSuspendedStart) {\n              state = GenStateCompleted;\n              throw context.arg;\n            }\n\n            context.dispatchException(context.arg);\n          } else if (context.method === \"return\") {\n            context.abrupt(\"return\", context.arg);\n          }\n\n          state = GenStateExecuting;\n          var record = tryCatch(innerFn, self, context);\n\n          if (record.type === \"normal\") {\n            // If an exception is thrown from innerFn, we leave state ===\n            // GenStateExecuting and loop back for another invocation.\n            state = context.done ? GenStateCompleted : GenStateSuspendedYield;\n\n            if (record.arg === ContinueSentinel) {\n              continue;\n            }\n\n            return {\n              value: record.arg,\n              done: context.done\n            };\n          } else if (record.type === \"throw\") {\n            state = GenStateCompleted; // Dispatch the exception by looping back around to the\n            // context.dispatchException(context.arg) call above.\n\n            context.method = \"throw\";\n            context.arg = record.arg;\n          }\n        }\n      };\n    } // Call delegate.iterator[context.method](context.arg) and handle the\n    // result, either by returning a { value, done } result from the\n    // delegate iterator, or by modifying context.method and context.arg,\n    // setting context.delegate to null, and returning the ContinueSentinel.\n\n\n    function maybeInvokeDelegate(delegate, context) {\n      var method = delegate.iterator[context.method];\n\n      if (method === undefined$1) {\n        // A .throw or .return when the delegate iterator has no .throw\n        // method always terminates the yield* loop.\n        context.delegate = null;\n\n        if (context.method === \"throw\") {\n          // Note: [\"return\"] must be used for ES3 parsing compatibility.\n          if (delegate.iterator[\"return\"]) {\n            // If the delegate iterator has a return method, give it a\n            // chance to clean up.\n            context.method = \"return\";\n            context.arg = undefined$1;\n            maybeInvokeDelegate(delegate, context);\n\n            if (context.method === \"throw\") {\n              // If maybeInvokeDelegate(context) changed context.method from\n              // \"return\" to \"throw\", let that override the TypeError below.\n              return ContinueSentinel;\n            }\n          }\n\n          context.method = \"throw\";\n          context.arg = new TypeError(\"The iterator does not provide a 'throw' method\");\n        }\n\n        return ContinueSentinel;\n      }\n\n      var record = tryCatch(method, delegate.iterator, context.arg);\n\n      if (record.type === \"throw\") {\n        context.method = \"throw\";\n        context.arg = record.arg;\n        context.delegate = null;\n        return ContinueSentinel;\n      }\n\n      var info = record.arg;\n\n      if (!info) {\n        context.method = \"throw\";\n        context.arg = new TypeError(\"iterator result is not an object\");\n        context.delegate = null;\n        return ContinueSentinel;\n      }\n\n      if (info.done) {\n        // Assign the result of the finished delegate to the temporary\n        // variable specified by delegate.resultName (see delegateYield).\n        context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).\n\n        context.next = delegate.nextLoc; // If context.method was \"throw\" but the delegate handled the\n        // exception, let the outer generator proceed normally. If\n        // context.method was \"next\", forget context.arg since it has been\n        // \"consumed\" by the delegate iterator. If context.method was\n        // \"return\", allow the original .return call to continue in the\n        // outer generator.\n\n        if (context.method !== \"return\") {\n          context.method = \"next\";\n          context.arg = undefined$1;\n        }\n      } else {\n        // Re-yield the result returned by the delegate method.\n        return info;\n      } // The delegate iterator is finished, so forget it and continue with\n      // the outer generator.\n\n\n      context.delegate = null;\n      return ContinueSentinel;\n    } // Define Generator.prototype.{next,throw,return} in terms of the\n    // unified ._invoke helper method.\n\n\n    defineIteratorMethods(Gp);\n    Gp[toStringTagSymbol] = \"Generator\"; // A Generator should always return itself as the iterator object when the\n    // @@iterator function is called on it. Some browsers' implementations of the\n    // iterator prototype chain incorrectly implement this, causing the Generator\n    // object to not be returned from this call. This ensures that doesn't happen.\n    // See https://github.com/facebook/regenerator/issues/274 for more details.\n\n    Gp[iteratorSymbol] = function () {\n      return this;\n    };\n\n    Gp.toString = function () {\n      return \"[object Generator]\";\n    };\n\n    function pushTryEntry(locs) {\n      var entry = {\n        tryLoc: locs[0]\n      };\n\n      if (1 in locs) {\n        entry.catchLoc = locs[1];\n      }\n\n      if (2 in locs) {\n        entry.finallyLoc = locs[2];\n        entry.afterLoc = locs[3];\n      }\n\n      this.tryEntries.push(entry);\n    }\n\n    function resetTryEntry(entry) {\n      var record = entry.completion || {};\n      record.type = \"normal\";\n      delete record.arg;\n      entry.completion = record;\n    }\n\n    function Context(tryLocsList) {\n      // The root entry object (effectively a try statement without a catch\n      // or a finally block) gives us a place to store values thrown from\n      // locations where there is no enclosing try statement.\n      this.tryEntries = [{\n        tryLoc: \"root\"\n      }];\n      tryLocsList.forEach(pushTryEntry, this);\n      this.reset(true);\n    }\n\n    exports.keys = function (object) {\n      var keys = [];\n\n      for (var key in object) {\n        keys.push(key);\n      }\n\n      keys.reverse(); // Rather than returning an object with a next method, we keep\n      // things simple and return the next function itself.\n\n      return function next() {\n        while (keys.length) {\n          var key = keys.pop();\n\n          if (key in object) {\n            next.value = key;\n            next.done = false;\n            return next;\n          }\n        } // To avoid creating an additional object, we just hang the .value\n        // and .done properties off the next function object itself. This\n        // also ensures that the minifier will not anonymize the function.\n\n\n        next.done = true;\n        return next;\n      };\n    };\n\n    function values(iterable) {\n      if (iterable) {\n        var iteratorMethod = iterable[iteratorSymbol];\n\n        if (iteratorMethod) {\n          return iteratorMethod.call(iterable);\n        }\n\n        if (typeof iterable.next === \"function\") {\n          return iterable;\n        }\n\n        if (!isNaN(iterable.length)) {\n          var i = -1,\n              next = function next() {\n            while (++i < iterable.length) {\n              if (hasOwn.call(iterable, i)) {\n                next.value = iterable[i];\n                next.done = false;\n                return next;\n              }\n            }\n\n            next.value = undefined$1;\n            next.done = true;\n            return next;\n          };\n\n          return next.next = next;\n        }\n      } // Return an iterator with no values.\n\n\n      return {\n        next: doneResult\n      };\n    }\n\n    exports.values = values;\n\n    function doneResult() {\n      return {\n        value: undefined$1,\n        done: true\n      };\n    }\n\n    Context.prototype = {\n      constructor: Context,\n      reset: function (skipTempReset) {\n        this.prev = 0;\n        this.next = 0; // Resetting context._sent for legacy support of Babel's\n        // function.sent implementation.\n\n        this.sent = this._sent = undefined$1;\n        this.done = false;\n        this.delegate = null;\n        this.method = \"next\";\n        this.arg = undefined$1;\n        this.tryEntries.forEach(resetTryEntry);\n\n        if (!skipTempReset) {\n          for (var name in this) {\n            // Not sure about the optimal order of these conditions:\n            if (name.charAt(0) === \"t\" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {\n              this[name] = undefined$1;\n            }\n          }\n        }\n      },\n      stop: function () {\n        this.done = true;\n        var rootEntry = this.tryEntries[0];\n        var rootRecord = rootEntry.completion;\n\n        if (rootRecord.type === \"throw\") {\n          throw rootRecord.arg;\n        }\n\n        return this.rval;\n      },\n      dispatchException: function (exception) {\n        if (this.done) {\n          throw exception;\n        }\n\n        var context = this;\n\n        function handle(loc, caught) {\n          record.type = \"throw\";\n          record.arg = exception;\n          context.next = loc;\n\n          if (caught) {\n            // If the dispatched exception was caught by a catch block,\n            // then let that catch block handle the exception normally.\n            context.method = \"next\";\n            context.arg = undefined$1;\n          }\n\n          return !!caught;\n        }\n\n        for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n          var entry = this.tryEntries[i];\n          var record = entry.completion;\n\n          if (entry.tryLoc === \"root\") {\n            // Exception thrown outside of any try block that could handle\n            // it, so set the completion value of the entire function to\n            // throw the exception.\n            return handle(\"end\");\n          }\n\n          if (entry.tryLoc <= this.prev) {\n            var hasCatch = hasOwn.call(entry, \"catchLoc\");\n            var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n            if (hasCatch && hasFinally) {\n              if (this.prev < entry.catchLoc) {\n                return handle(entry.catchLoc, true);\n              } else if (this.prev < entry.finallyLoc) {\n                return handle(entry.finallyLoc);\n              }\n            } else if (hasCatch) {\n              if (this.prev < entry.catchLoc) {\n                return handle(entry.catchLoc, true);\n              }\n            } else if (hasFinally) {\n              if (this.prev < entry.finallyLoc) {\n                return handle(entry.finallyLoc);\n              }\n            } else {\n              throw new Error(\"try statement without catch or finally\");\n            }\n          }\n        }\n      },\n      abrupt: function (type, arg) {\n        for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n          var entry = this.tryEntries[i];\n\n          if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n            var finallyEntry = entry;\n            break;\n          }\n        }\n\n        if (finallyEntry && (type === \"break\" || type === \"continue\") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {\n          // Ignore the finally entry if control is not jumping to a\n          // location outside the try/catch block.\n          finallyEntry = null;\n        }\n\n        var record = finallyEntry ? finallyEntry.completion : {};\n        record.type = type;\n        record.arg = arg;\n\n        if (finallyEntry) {\n          this.method = \"next\";\n          this.next = finallyEntry.finallyLoc;\n          return ContinueSentinel;\n        }\n\n        return this.complete(record);\n      },\n      complete: function (record, afterLoc) {\n        if (record.type === \"throw\") {\n          throw record.arg;\n        }\n\n        if (record.type === \"break\" || record.type === \"continue\") {\n          this.next = record.arg;\n        } else if (record.type === \"return\") {\n          this.rval = this.arg = record.arg;\n          this.method = \"return\";\n          this.next = \"end\";\n        } else if (record.type === \"normal\" && afterLoc) {\n          this.next = afterLoc;\n        }\n\n        return ContinueSentinel;\n      },\n      finish: function (finallyLoc) {\n        for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n          var entry = this.tryEntries[i];\n\n          if (entry.finallyLoc === finallyLoc) {\n            this.complete(entry.completion, entry.afterLoc);\n            resetTryEntry(entry);\n            return ContinueSentinel;\n          }\n        }\n      },\n      \"catch\": function (tryLoc) {\n        for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n          var entry = this.tryEntries[i];\n\n          if (entry.tryLoc === tryLoc) {\n            var record = entry.completion;\n\n            if (record.type === \"throw\") {\n              var thrown = record.arg;\n              resetTryEntry(entry);\n            }\n\n            return thrown;\n          }\n        } // The context.catch method must only be called with a location\n        // argument that corresponds to a known catch block.\n\n\n        throw new Error(\"illegal catch attempt\");\n      },\n      delegateYield: function (iterable, resultName, nextLoc) {\n        this.delegate = {\n          iterator: values(iterable),\n          resultName: resultName,\n          nextLoc: nextLoc\n        };\n\n        if (this.method === \"next\") {\n          // Deliberately forget the last sent value so that we don't\n          // accidentally pass it on to the delegate.\n          this.arg = undefined$1;\n        }\n\n        return ContinueSentinel;\n      }\n    }; // Regardless of whether this script is executing as a CommonJS module\n    // or not, return the runtime object so that we can declare the variable\n    // regeneratorRuntime in the outer scope, which allows this module to be\n    // injected easily by `bin/regenerator --include-runtime script.js`.\n\n    return exports;\n  }( // If this script is executing as a CommonJS module, use module.exports\n  // as the regeneratorRuntime namespace. Otherwise create a new empty\n  // object. Either way, the resulting object will be used to initialize\n  // the regeneratorRuntime variable at the top of this file.\n   module.exports );\n\n  try {\n    regeneratorRuntime = runtime;\n  } catch (accidentalStrictMode) {\n    // This module should not be running in strict mode, so the above\n    // assignment should always work unless something is misconfigured. Just\n    // in case runtime.js accidentally runs in strict mode, we can escape\n    // strict mode using a global Function call. This could conceivably fail\n    // if a Content Security Policy forbids using Function, but in that case\n    // the proper solution is to fix the accidental strict mode problem. If\n    // you've misconfigured your bundler to force strict mode and applied a\n    // CSP to forbid Function, and you're not willing to fix either of those\n    // problems, please detail your unique predicament in a GitHub issue.\n    Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n  }\n});\n\nvar Property = /*#__PURE__*/function () {\n  function Property(document, name, value) {\n    _classCallCheck(this, Property);\n\n    this.document = document;\n    this.name = name;\n    this.value = value;\n  }\n\n  _createClass(Property, [{\n    key: \"hasValue\",\n    value: function hasValue() {\n      var value = this.value;\n      return value !== null && value !== '' && value !== 0 && typeof value !== 'undefined';\n    }\n  }, {\n    key: \"isString\",\n    value: function isString(regexp) {\n      var value = this.value;\n      var result = typeof value === 'string';\n\n      if (!result || !regexp) {\n        return result;\n      }\n\n      return regexp.test(value);\n    }\n  }, {\n    key: \"isUrlDefinition\",\n    value: function isUrlDefinition() {\n      return this.isString(/^url\\(/);\n    }\n  }, {\n    key: \"isPixels\",\n    value: function isPixels() {\n      if (!this.hasValue()) {\n        return false;\n      }\n\n      var asString = this.getString();\n\n      switch (true) {\n        case /px$/.test(asString):\n        case /^[0-9]+$/.test(asString):\n          return true;\n\n        default:\n          return false;\n      }\n    }\n  }, {\n    key: \"setValue\",\n    value: function setValue(value) {\n      this.value = value;\n      return this;\n    }\n  }, {\n    key: \"getValue\",\n    value: function getValue(def) {\n      if (typeof def === 'undefined' || this.hasValue()) {\n        return this.value;\n      }\n\n      return def;\n    }\n  }, {\n    key: \"getNumber\",\n    value: function getNumber(def) {\n      if (!this.hasValue()) {\n        if (typeof def === 'undefined') {\n          return 0;\n        }\n\n        return parseFloat(def);\n      }\n\n      var value = this.value;\n      var n = parseFloat(value);\n\n      if (this.isString(/%$/)) {\n        n = n / 100.0;\n      }\n\n      return n;\n    }\n  }, {\n    key: \"getString\",\n    value: function getString(def) {\n      if (typeof def === 'undefined' || this.hasValue()) {\n        return typeof this.value === 'undefined' ? '' : String(this.value);\n      }\n\n      return String(def);\n    }\n  }, {\n    key: \"getDpi\",\n    value: function getDpi() {\n      return 96.0; // TODO: compute?\n    }\n  }, {\n    key: \"getRem\",\n    value: function getRem() {\n      return this.document.rootEmSize;\n    }\n  }, {\n    key: \"getEm\",\n    value: function getEm() {\n      return this.document.emSize;\n    }\n  }, {\n    key: \"getUnits\",\n    value: function getUnits() {\n      return this.getString().replace(/[0-9\\.\\-]/g, '');\n    }\n  }, {\n    key: \"getPixels\",\n    value: function getPixels(axisOrIsFontSize) {\n      var processPercent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (!this.hasValue()) {\n        return 0;\n      }\n\n      var _ref = typeof axisOrIsFontSize === 'boolean' ? [undefined, axisOrIsFontSize] : [axisOrIsFontSize],\n          _ref2 = _slicedToArray(_ref, 2),\n          axis = _ref2[0],\n          isFontSize = _ref2[1];\n\n      var viewPort = this.document.screen.viewPort;\n\n      switch (true) {\n        case this.isString(/vmin$/):\n          return this.getNumber() / 100.0 * Math.min(viewPort.computeSize('x'), viewPort.computeSize('y'));\n\n        case this.isString(/vmax$/):\n          return this.getNumber() / 100.0 * Math.max(viewPort.computeSize('x'), viewPort.computeSize('y'));\n\n        case this.isString(/vw$/):\n          return this.getNumber() / 100.0 * viewPort.computeSize('x');\n\n        case this.isString(/vh$/):\n          return this.getNumber() / 100.0 * viewPort.computeSize('y');\n\n        case this.isString(/rem$/):\n          return this.getNumber() * this.getRem();\n\n        case this.isString(/em$/):\n          return this.getNumber() * this.getEm();\n\n        case this.isString(/ex$/):\n          return this.getNumber() * this.getEm() / 2.0;\n\n        case this.isString(/px$/):\n          return this.getNumber();\n\n        case this.isString(/pt$/):\n          return this.getNumber() * this.getDpi() * (1.0 / 72.0);\n\n        case this.isString(/pc$/):\n          return this.getNumber() * 15;\n\n        case this.isString(/cm$/):\n          return this.getNumber() * this.getDpi() / 2.54;\n\n        case this.isString(/mm$/):\n          return this.getNumber() * this.getDpi() / 25.4;\n\n        case this.isString(/in$/):\n          return this.getNumber() * this.getDpi();\n\n        case this.isString(/%$/) && isFontSize:\n          return this.getNumber() * this.getEm();\n\n        case this.isString(/%$/):\n          return this.getNumber() * viewPort.computeSize(axis);\n\n        default:\n          {\n            var n = this.getNumber();\n\n            if (processPercent && n < 1.0) {\n              return n * viewPort.computeSize(axis);\n            }\n\n            return n;\n          }\n      }\n    }\n  }, {\n    key: \"getMilliseconds\",\n    value: function getMilliseconds() {\n      if (!this.hasValue()) {\n        return 0;\n      }\n\n      if (this.isString(/ms$/)) {\n        return this.getNumber();\n      }\n\n      return this.getNumber() * 1000;\n    }\n  }, {\n    key: \"getRadians\",\n    value: function getRadians() {\n      if (!this.hasValue()) {\n        return 0;\n      }\n\n      switch (true) {\n        case this.isString(/deg$/):\n          return this.getNumber() * (Math.PI / 180.0);\n\n        case this.isString(/grad$/):\n          return this.getNumber() * (Math.PI / 200.0);\n\n        case this.isString(/rad$/):\n          return this.getNumber();\n\n        default:\n          return this.getNumber() * (Math.PI / 180.0);\n      }\n    }\n  }, {\n    key: \"getDefinition\",\n    value: function getDefinition() {\n      var asString = this.getString();\n      var name = asString.match(/#([^\\)'\"]+)/);\n\n      if (name) {\n        name = name[1];\n      }\n\n      if (!name) {\n        name = asString;\n      }\n\n      return this.document.definitions[name];\n    }\n  }, {\n    key: \"getFillStyleDefinition\",\n    value: function getFillStyleDefinition(element, opacity) {\n      var def = this.getDefinition();\n\n      if (!def) {\n        return null;\n      } // gradient\n\n\n      if (typeof def.createGradient === 'function') {\n        return def.createGradient(this.document.ctx, element, opacity);\n      } // pattern\n\n\n      if (typeof def.createPattern === 'function') {\n        if (def.getHrefAttribute().hasValue()) {\n          var patternTransform = def.getAttribute('patternTransform');\n          def = def.getHrefAttribute().getDefinition();\n\n          if (patternTransform.hasValue()) {\n            def.getAttribute('patternTransform', true).setValue(patternTransform.value);\n          }\n        }\n\n        return def.createPattern(this.document.ctx, element, opacity);\n      }\n\n      return null;\n    }\n  }, {\n    key: \"getTextBaseline\",\n    value: function getTextBaseline() {\n      if (!this.hasValue()) {\n        return null;\n      }\n\n      return Property.textBaselineMapping[this.getString()];\n    }\n  }, {\n    key: \"addOpacity\",\n    value: function addOpacity(opacity) {\n      var value = this.value;\n      var len = value.length;\n      var commas = 0; // Simulate old RGBColor version, which can't parse rgba.\n\n      for (var i = 0; i < len; i++) {\n        if (value[i] === ',') {\n          commas++;\n        }\n\n        if (commas === 3) {\n          break;\n        }\n      }\n\n      if (opacity.hasValue() && this.isString() && commas !== 3) {\n        var color = new RGBColor(value);\n\n        if (color.ok) {\n          value = \"rgba(\".concat(color.r, \", \").concat(color.g, \", \").concat(color.b, \", \").concat(opacity.getNumber(), \")\");\n        }\n      }\n\n      return new Property(this.document, this.name, value);\n    }\n  }], [{\n    key: \"empty\",\n    value: function empty(document) {\n      return new Property(document, 'EMPTY', '');\n    }\n  }]);\n\n  return Property;\n}();\nProperty.textBaselineMapping = {\n  'baseline': 'alphabetic',\n  'before-edge': 'top',\n  'text-before-edge': 'top',\n  'middle': 'middle',\n  'central': 'middle',\n  'after-edge': 'bottom',\n  'text-after-edge': 'bottom',\n  'ideographic': 'ideographic',\n  'alphabetic': 'alphabetic',\n  'hanging': 'hanging',\n  'mathematical': 'alphabetic'\n};\n\nvar ViewPort = /*#__PURE__*/function () {\n  function ViewPort() {\n    _classCallCheck(this, ViewPort);\n\n    this.viewPorts = [];\n  }\n\n  _createClass(ViewPort, [{\n    key: \"clear\",\n    value: function clear() {\n      this.viewPorts = [];\n    }\n  }, {\n    key: \"setCurrent\",\n    value: function setCurrent(width, height) {\n      this.viewPorts.push({\n        width: width,\n        height: height\n      });\n    }\n  }, {\n    key: \"removeCurrent\",\n    value: function removeCurrent() {\n      this.viewPorts.pop();\n    }\n  }, {\n    key: \"getCurrent\",\n    value: function getCurrent() {\n      var viewPorts = this.viewPorts;\n      return viewPorts[viewPorts.length - 1];\n    }\n  }, {\n    key: \"computeSize\",\n    value: function computeSize(d) {\n      if (typeof d === 'number') {\n        return d;\n      }\n\n      if (d === 'x') {\n        return this.width;\n      }\n\n      if (d === 'y') {\n        return this.height;\n      }\n\n      return Math.sqrt(Math.pow(this.width, 2) + Math.pow(this.height, 2)) / Math.sqrt(2);\n    }\n  }, {\n    key: \"width\",\n    get: function get() {\n      return this.getCurrent().width;\n    }\n  }, {\n    key: \"height\",\n    get: function get() {\n      return this.getCurrent().height;\n    }\n  }]);\n\n  return ViewPort;\n}();\n\nvar Point = /*#__PURE__*/function () {\n  function Point(x, y) {\n    _classCallCheck(this, Point);\n\n    this.x = x;\n    this.y = y;\n  }\n\n  _createClass(Point, [{\n    key: \"angleTo\",\n    value: function angleTo(point) {\n      return Math.atan2(point.y - this.y, point.x - this.x);\n    }\n  }, {\n    key: \"applyTransform\",\n    value: function applyTransform(transform) {\n      var x = this.x,\n          y = this.y;\n      var xp = x * transform[0] + y * transform[2] + transform[4];\n      var yp = x * transform[1] + y * transform[3] + transform[5];\n      this.x = xp;\n      this.y = yp;\n    }\n  }], [{\n    key: \"parse\",\n    value: function parse(point) {\n      var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n      var _toNumbers = toNumbers(point),\n          _toNumbers2 = _slicedToArray(_toNumbers, 2),\n          _toNumbers2$ = _toNumbers2[0],\n          x = _toNumbers2$ === void 0 ? defaultValue : _toNumbers2$,\n          _toNumbers2$2 = _toNumbers2[1],\n          y = _toNumbers2$2 === void 0 ? x : _toNumbers2$2;\n\n      return new Point(x, y);\n    }\n  }, {\n    key: \"parsePath\",\n    value: function parsePath(path) {\n      var points = toNumbers(path);\n      var len = points.length;\n      var pathPoints = [];\n\n      for (var i = 0; i < len; i += 2) {\n        pathPoints.push(new Point(points[i], points[i + 1]));\n      }\n\n      return pathPoints;\n    }\n  }]);\n\n  return Point;\n}();\n\nvar Mouse = /*#__PURE__*/function () {\n  function Mouse(screen) {\n    _classCallCheck(this, Mouse);\n\n    this.screen = screen;\n    this.working = false;\n    this.events = [];\n    this.eventElements = [];\n    this.onClick = this.onClick.bind(this);\n    this.onMouseMove = this.onMouseMove.bind(this);\n  }\n\n  _createClass(Mouse, [{\n    key: \"isWorking\",\n    value: function isWorking() {\n      return this.working;\n    }\n  }, {\n    key: \"start\",\n    value: function start() {\n      if (this.working) {\n        return;\n      }\n\n      var screen = this.screen,\n          onClick = this.onClick,\n          onMouseMove = this.onMouseMove;\n      var canvas = screen.ctx.canvas;\n      canvas.onclick = onClick;\n      canvas.onmousemove = onMouseMove;\n      this.working = true;\n    }\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      if (!this.working) {\n        return;\n      }\n\n      var canvas = this.screen.ctx.canvas;\n      this.working = false;\n      canvas.onclick = null;\n      canvas.onmousemove = null;\n    }\n  }, {\n    key: \"hasEvents\",\n    value: function hasEvents() {\n      return this.working && this.events.length > 0;\n    }\n  }, {\n    key: \"runEvents\",\n    value: function runEvents() {\n      if (!this.working) {\n        return;\n      }\n\n      var document = this.screen,\n          events = this.events,\n          eventElements = this.eventElements;\n      var style = document.ctx.canvas.style;\n\n      if (style) {\n        style.cursor = '';\n      }\n\n      events.forEach(function (_ref, i) {\n        var run = _ref.run;\n        var element = eventElements[i];\n\n        while (element) {\n          run(element);\n          element = element.parent;\n        }\n      }); // done running, clear\n\n      this.events = [];\n      this.eventElements = [];\n    }\n  }, {\n    key: \"checkPath\",\n    value: function checkPath(element, ctx) {\n      if (!this.working || !ctx) {\n        return;\n      }\n\n      var events = this.events,\n          eventElements = this.eventElements;\n      events.forEach(function (_ref2, i) {\n        var x = _ref2.x,\n            y = _ref2.y;\n\n        if (!eventElements[i] && ctx.isPointInPath && ctx.isPointInPath(x, y)) {\n          eventElements[i] = element;\n        }\n      });\n    }\n  }, {\n    key: \"checkBoundingBox\",\n    value: function checkBoundingBox(element, boundingBox) {\n      if (!this.working || !boundingBox) {\n        return;\n      }\n\n      var events = this.events,\n          eventElements = this.eventElements;\n      events.forEach(function (_ref3, i) {\n        var x = _ref3.x,\n            y = _ref3.y;\n\n        if (!eventElements[i] && boundingBox.isPointInBox(x, y)) {\n          eventElements[i] = element;\n        }\n      });\n    }\n  }, {\n    key: \"mapXY\",\n    value: function mapXY(x, y) {\n      var _this$screen = this.screen,\n          window = _this$screen.window,\n          ctx = _this$screen.ctx;\n      var point = new Point(x, y);\n      var element = ctx.canvas;\n\n      while (element) {\n        point.x -= element.offsetLeft;\n        point.y -= element.offsetTop;\n        element = element.offsetParent;\n      }\n\n      if (window.scrollX) {\n        point.x += window.scrollX;\n      }\n\n      if (window.scrollY) {\n        point.y += window.scrollY;\n      }\n\n      return point;\n    }\n  }, {\n    key: \"onClick\",\n    value: function onClick(evt) {\n      var _this$mapXY = this.mapXY((evt || event).clientX, (evt || event).clientY),\n          x = _this$mapXY.x,\n          y = _this$mapXY.y;\n\n      this.events.push({\n        type: 'onclick',\n        x: x,\n        y: y,\n        run: function run(event) {\n          if (event.onClick) {\n            event.onClick();\n          }\n        }\n      });\n    }\n  }, {\n    key: \"onMouseMove\",\n    value: function onMouseMove(evt) {\n      var _this$mapXY2 = this.mapXY((evt || event).clientX, (evt || event).clientY),\n          x = _this$mapXY2.x,\n          y = _this$mapXY2.y;\n\n      this.events.push({\n        type: 'onmousemove',\n        x: x,\n        y: y,\n        run: function run(event) {\n          if (event.onMouseMove) {\n            event.onMouseMove();\n          }\n        }\n      });\n    }\n  }]);\n\n  return Mouse;\n}();\n\nvar defaultWindow = typeof window !== 'undefined' ? window : null;\nvar defaultFetch = typeof fetch !== 'undefined' ? fetch.bind(window) : null;\n\nvar Screen = /*#__PURE__*/function () {\n  function Screen(ctx) {\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n        _ref$fetch = _ref.fetch,\n        fetch = _ref$fetch === void 0 ? defaultFetch : _ref$fetch,\n        _ref$window = _ref.window,\n        window = _ref$window === void 0 ? defaultWindow : _ref$window;\n\n    _classCallCheck(this, Screen);\n\n    this.ctx = ctx;\n    this.FRAMERATE = 30;\n    this.MAX_VIRTUAL_PIXELS = 30000;\n    this.CLIENT_WIDTH = 800;\n    this.CLIENT_HEIGHT = 600;\n    this.viewPort = new ViewPort();\n    this.mouse = new Mouse(this);\n    this.animations = [];\n    this.waits = [];\n    this.frameDuration = 0;\n    this.isReadyLock = false;\n    this.isFirstRender = true;\n    this.intervalId = null;\n    this.window = window;\n    this.fetch = fetch;\n  }\n\n  _createClass(Screen, [{\n    key: \"wait\",\n    value: function wait(checker) {\n      this.waits.push(checker);\n    }\n  }, {\n    key: \"ready\",\n    value: function ready() {\n      if (!this.readyPromise) {\n        return Promise.resolve();\n      }\n\n      return this.readyPromise;\n    }\n  }, {\n    key: \"isReady\",\n    value: function isReady() {\n      if (this.isReadyLock) {\n        return true;\n      }\n\n      var isReadyLock = this.waits.every(function (_) {\n        return _();\n      });\n\n      if (isReadyLock) {\n        this.waits = [];\n\n        if (this.resolveReady) {\n          this.resolveReady();\n        }\n      }\n\n      this.isReadyLock = isReadyLock;\n      return isReadyLock;\n    }\n  }, {\n    key: \"setDefaults\",\n    value: function setDefaults(ctx) {\n      // initial values and defaults\n      ctx.strokeStyle = 'rgba(0,0,0,0)';\n      ctx.lineCap = 'butt';\n      ctx.lineJoin = 'miter';\n      ctx.miterLimit = 4;\n    }\n  }, {\n    key: \"setViewBox\",\n    value: function setViewBox(_ref2) {\n      var document = _ref2.document,\n          ctx = _ref2.ctx,\n          aspectRatio = _ref2.aspectRatio,\n          width = _ref2.width,\n          desiredWidth = _ref2.desiredWidth,\n          height = _ref2.height,\n          desiredHeight = _ref2.desiredHeight,\n          _ref2$minX = _ref2.minX,\n          minX = _ref2$minX === void 0 ? 0 : _ref2$minX,\n          _ref2$minY = _ref2.minY,\n          minY = _ref2$minY === void 0 ? 0 : _ref2$minY,\n          refX = _ref2.refX,\n          refY = _ref2.refY,\n          _ref2$clip = _ref2.clip,\n          clip = _ref2$clip === void 0 ? false : _ref2$clip,\n          _ref2$clipX = _ref2.clipX,\n          clipX = _ref2$clipX === void 0 ? 0 : _ref2$clipX,\n          _ref2$clipY = _ref2.clipY,\n          clipY = _ref2$clipY === void 0 ? 0 : _ref2$clipY;\n      // aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute\n      var cleanAspectRatio = compressSpaces(aspectRatio).replace(/^defer\\s/, ''); // ignore defer\n\n      var _cleanAspectRatio$spl = cleanAspectRatio.split(' '),\n          _cleanAspectRatio$spl2 = _slicedToArray(_cleanAspectRatio$spl, 2),\n          aspectRatioAlign = _cleanAspectRatio$spl2[0],\n          aspectRatioMeetOrSlice = _cleanAspectRatio$spl2[1];\n\n      var align = aspectRatioAlign || 'xMidYMid';\n      var meetOrSlice = aspectRatioMeetOrSlice || 'meet'; // calculate scale\n\n      var scaleX = width / desiredWidth;\n      var scaleY = height / desiredHeight;\n      var scaleMin = Math.min(scaleX, scaleY);\n      var scaleMax = Math.max(scaleX, scaleY);\n      var finalDesiredWidth = desiredWidth;\n      var finalDesiredHeight = desiredHeight;\n\n      if (meetOrSlice === 'meet') {\n        finalDesiredWidth *= scaleMin;\n        finalDesiredHeight *= scaleMin;\n      }\n\n      if (meetOrSlice === 'slice') {\n        finalDesiredWidth *= scaleMax;\n        finalDesiredHeight *= scaleMax;\n      }\n\n      var refXProp = new Property(document, 'refX', refX);\n      var refYProp = new Property(document, 'refY', refY);\n      var hasRefs = refXProp.hasValue() && refYProp.hasValue();\n\n      if (hasRefs) {\n        ctx.translate(-scaleMin * refXProp.getPixels('x'), -scaleMin * refYProp.getPixels('y'));\n      }\n\n      if (clip) {\n        var scaledClipX = scaleMin * clipX;\n        var scaledClipY = scaleMin * clipY;\n        ctx.beginPath();\n        ctx.moveTo(scaledClipX, scaledClipY);\n        ctx.lineTo(width, scaledClipY);\n        ctx.lineTo(width, height);\n        ctx.lineTo(scaledClipX, height);\n        ctx.closePath();\n        ctx.clip();\n      }\n\n      if (!hasRefs) {\n        var isMeetMinY = meetOrSlice === 'meet' && scaleMin === scaleY;\n        var isSliceMaxY = meetOrSlice === 'slice' && scaleMax === scaleY;\n        var isMeetMinX = meetOrSlice === 'meet' && scaleMin === scaleX;\n        var isSliceMaxX = meetOrSlice === 'slice' && scaleMax === scaleX;\n\n        if (/^xMid/.test(align) && (isMeetMinY || isSliceMaxY)) {\n          ctx.translate(width / 2.0 - finalDesiredWidth / 2.0, 0);\n        }\n\n        if (/YMid$/.test(align) && (isMeetMinX || isSliceMaxX)) {\n          ctx.translate(0, height / 2.0 - finalDesiredHeight / 2.0);\n        }\n\n        if (/^xMax/.test(align) && (isMeetMinY || isSliceMaxY)) {\n          ctx.translate(width - finalDesiredWidth, 0);\n        }\n\n        if (/YMax$/.test(align) && (isMeetMinX || isSliceMaxX)) {\n          ctx.translate(0, height - finalDesiredHeight);\n        }\n      } // scale\n\n\n      switch (true) {\n        case align === 'none':\n          ctx.scale(scaleX, scaleY);\n          break;\n\n        case meetOrSlice === 'meet':\n          ctx.scale(scaleMin, scaleMin);\n          break;\n\n        case meetOrSlice === 'slice':\n          ctx.scale(scaleMax, scaleMax);\n          break;\n      } // translate\n\n\n      ctx.translate(-minX, -minY);\n    }\n  }, {\n    key: \"start\",\n    value: function start(element) {\n      var _this = this;\n\n      var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref3$enableRedraw = _ref3.enableRedraw,\n          enableRedraw = _ref3$enableRedraw === void 0 ? false : _ref3$enableRedraw,\n          _ref3$ignoreMouse = _ref3.ignoreMouse,\n          ignoreMouse = _ref3$ignoreMouse === void 0 ? false : _ref3$ignoreMouse,\n          _ref3$ignoreAnimation = _ref3.ignoreAnimation,\n          ignoreAnimation = _ref3$ignoreAnimation === void 0 ? false : _ref3$ignoreAnimation,\n          _ref3$ignoreDimension = _ref3.ignoreDimensions,\n          ignoreDimensions = _ref3$ignoreDimension === void 0 ? false : _ref3$ignoreDimension,\n          _ref3$ignoreClear = _ref3.ignoreClear,\n          ignoreClear = _ref3$ignoreClear === void 0 ? false : _ref3$ignoreClear,\n          forceRedraw = _ref3.forceRedraw,\n          scaleWidth = _ref3.scaleWidth,\n          scaleHeight = _ref3.scaleHeight,\n          offsetX = _ref3.offsetX,\n          offsetY = _ref3.offsetY;\n\n      var FRAMERATE = this.FRAMERATE,\n          mouse = this.mouse;\n      var frameDuration = 1000 / FRAMERATE;\n      this.frameDuration = frameDuration;\n      this.readyPromise = new Promise(function (resolve) {\n        _this.resolveReady = resolve;\n      });\n\n      if (this.isReady()) {\n        this.render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY);\n      }\n\n      if (!enableRedraw) {\n        return;\n      }\n\n      var now = Date.now();\n      var then = now;\n      var delta = 0;\n\n      var tick = function tick() {\n        now = Date.now();\n        delta = now - then;\n\n        if (delta >= frameDuration) {\n          then = now - delta % frameDuration;\n\n          if (_this.shouldUpdate(ignoreAnimation, forceRedraw)) {\n            _this.render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY);\n\n            mouse.runEvents();\n          }\n        }\n\n        _this.intervalId = requestAnimationFrame(tick);\n      };\n\n      if (!ignoreMouse) {\n        mouse.start();\n      }\n\n      this.intervalId = requestAnimationFrame(tick);\n    }\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      if (this.intervalId) {\n        requestAnimationFrame.cancel(this.intervalId);\n        this.intervalId = null;\n      }\n\n      this.mouse.stop();\n    }\n  }, {\n    key: \"shouldUpdate\",\n    value: function shouldUpdate(ignoreAnimation, forceRedraw) {\n      // need update from animations?\n      if (!ignoreAnimation) {\n        var frameDuration = this.frameDuration;\n        var shouldUpdate = this.animations.reduce(function (shouldUpdate, animation) {\n          return animation.update(frameDuration) || shouldUpdate;\n        }, false);\n\n        if (shouldUpdate) {\n          return true;\n        }\n      } // need update from redraw?\n\n\n      if (typeof forceRedraw === 'function' && forceRedraw()) {\n        return true;\n      }\n\n      if (!this.isReadyLock && this.isReady()) {\n        return true;\n      } // need update from mouse events?\n\n\n      if (this.mouse.hasEvents()) {\n        return true;\n      }\n\n      return false;\n    }\n  }, {\n    key: \"render\",\n    value: function render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY) {\n      var CLIENT_WIDTH = this.CLIENT_WIDTH,\n          CLIENT_HEIGHT = this.CLIENT_HEIGHT,\n          viewPort = this.viewPort,\n          ctx = this.ctx,\n          isFirstRender = this.isFirstRender;\n      var canvas = ctx.canvas;\n      viewPort.clear();\n\n      if (canvas.width && canvas.height) {\n        viewPort.setCurrent(canvas.width, canvas.height);\n      } else {\n        viewPort.setCurrent(CLIENT_WIDTH, CLIENT_HEIGHT);\n      }\n\n      var widthStyle = element.getStyle('width');\n      var heightStyle = element.getStyle('height');\n\n      if (!ignoreDimensions && (isFirstRender || typeof scaleWidth !== 'number' && typeof scaleHeight !== 'number')) {\n        // set canvas size\n        if (widthStyle.hasValue()) {\n          canvas.width = widthStyle.getPixels('x');\n\n          if (canvas.style) {\n            canvas.style.width = \"\".concat(canvas.width, \"px\");\n          }\n        }\n\n        if (heightStyle.hasValue()) {\n          canvas.height = heightStyle.getPixels('y');\n\n          if (canvas.style) {\n            canvas.style.height = \"\".concat(canvas.height, \"px\");\n          }\n        }\n      }\n\n      var cWidth = canvas.clientWidth || canvas.width;\n      var cHeight = canvas.clientHeight || canvas.height;\n\n      if (ignoreDimensions && widthStyle.hasValue() && heightStyle.hasValue()) {\n        cWidth = widthStyle.getPixels('x');\n        cHeight = heightStyle.getPixels('y');\n      }\n\n      viewPort.setCurrent(cWidth, cHeight);\n\n      if (typeof offsetX === 'number') {\n        element.getAttribute('x', true).setValue(offsetX);\n      }\n\n      if (typeof offsetY === 'number') {\n        element.getAttribute('y', true).setValue(offsetY);\n      }\n\n      if (typeof scaleWidth === 'number' || typeof scaleHeight === 'number') {\n        var viewBox = toNumbers(element.getAttribute('viewBox').getString());\n        var xRatio = 0;\n        var yRatio = 0;\n\n        if (typeof scaleWidth === 'number') {\n          var widthAttr = element.getAttribute('width');\n\n          if (widthAttr.hasValue()) {\n            xRatio = widthAttr.getPixels('x') / scaleWidth;\n          } else if (!isNaN(viewBox[2])) {\n            xRatio = viewBox[2] / scaleWidth;\n          }\n        }\n\n        if (typeof scaleHeight === 'number') {\n          var heightAttr = element.getAttribute('height');\n\n          if (heightAttr.hasValue()) {\n            yRatio = heightAttr.getPixels('y') / scaleHeight;\n          } else if (!isNaN(viewBox[3])) {\n            yRatio = viewBox[3] / scaleHeight;\n          }\n        }\n\n        if (!xRatio) {\n          xRatio = yRatio;\n        }\n\n        if (!yRatio) {\n          yRatio = xRatio;\n        }\n\n        element.getAttribute('width', true).setValue(scaleWidth);\n        element.getAttribute('height', true).setValue(scaleHeight);\n        var transformStyle = element.getStyle('transform', true, true);\n        transformStyle.setValue(\"\".concat(transformStyle.getString(), \" scale(\").concat(1.0 / xRatio, \", \").concat(1.0 / yRatio, \")\"));\n      } // clear and render\n\n\n      if (!ignoreClear) {\n        ctx.clearRect(0, 0, cWidth, cHeight);\n      }\n\n      element.render(ctx);\n\n      if (isFirstRender) {\n        this.isFirstRender = false;\n      }\n    }\n  }]);\n\n  return Screen;\n}();\nScreen.defaultWindow = defaultWindow;\nScreen.defaultFetch = defaultFetch;\n\nvar defaultFetch$1 = Screen.defaultFetch;\nvar DefaultDOMParser = typeof DOMParser !== 'undefined' ? DOMParser : null;\n\nvar Parser = /*#__PURE__*/function () {\n  // private readonly options: any;\n  function Parser() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        _ref$fetch = _ref.fetch,\n        fetch = _ref$fetch === void 0 ? defaultFetch$1 : _ref$fetch,\n        _ref$DOMParser = _ref.DOMParser,\n        DOMParser = _ref$DOMParser === void 0 ? DefaultDOMParser : _ref$DOMParser;\n\n    _classCallCheck(this, Parser);\n\n    this.fetch = fetch;\n    this.DOMParser = DOMParser; // this.options = options;\n  }\n\n  _createClass(Parser, [{\n    key: \"parse\",\n    value: function () {\n      var _parse = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(resource) {\n        return _regeneratorRuntime.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                if (!/^</.test(resource)) {\n                  _context.next = 2;\n                  break;\n                }\n\n                return _context.abrupt(\"return\", this.parseFromString(resource));\n\n              case 2:\n                return _context.abrupt(\"return\", this.load(resource));\n\n              case 3:\n              case \"end\":\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function parse(_x) {\n        return _parse.apply(this, arguments);\n      }\n\n      return parse;\n    }()\n  }, {\n    key: \"parseFromString\",\n    value: function parseFromString(xml) {\n      try {\n        var parser = new this.DOMParser();\n        return parser.parseFromString(xml, 'image/svg+xml');\n      } catch (err) {\n        var _parser = new this.DOMParser();\n\n        return _parser.parseFromString(xml, 'text/xml');\n      }\n    }\n  }, {\n    key: \"load\",\n    value: function () {\n      var _load = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(url) {\n        var response, xml;\n        return _regeneratorRuntime.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                _context2.next = 2;\n                return this.fetch(url);\n\n              case 2:\n                response = _context2.sent;\n                _context2.next = 5;\n                return response.text();\n\n              case 5:\n                xml = _context2.sent;\n                return _context2.abrupt(\"return\", this.parseFromString(xml));\n\n              case 7:\n              case \"end\":\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function load(_x2) {\n        return _load.apply(this, arguments);\n      }\n\n      return load;\n    }()\n  }]);\n\n  return Parser;\n}();\n\nvar Element = /*#__PURE__*/function () {\n  function Element(document, node) {\n    var _this = this;\n\n    var captureTextNodes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    _classCallCheck(this, Element);\n\n    this.document = document;\n    this.node = node;\n    this.captureTextNodes = captureTextNodes;\n    this.attributes = {};\n    this.styles = {};\n    this.stylesSpecificity = {};\n    this.animationFrozen = false;\n    this.animationFrozenValue = '';\n    this.parent = null;\n    this.children = [];\n\n    if (!node || node.nodeType !== 1) {\n      // ELEMENT_NODE\n      return;\n    } // add attributes\n\n\n    Array.from(node.attributes).forEach(function (attribute) {\n      var nodeName = normalizeAttributeName(attribute.nodeName);\n      _this.attributes[nodeName] = new Property(document, nodeName, attribute.value);\n    });\n    this.addStylesFromStyleDefinition(); // add inline styles\n\n    if (this.getAttribute('style').hasValue()) {\n      var styles = this.getAttribute('style').getString().split(';').map(function (_) {\n        return _.trim();\n      });\n      styles.forEach(function (style) {\n        if (!style) {\n          return;\n        }\n\n        var _style$split = style.split(':'),\n            _style$split2 = _slicedToArray(_style$split, 2),\n            name = _style$split2[0],\n            value = _style$split2[1];\n\n        _this.styles[name] = new Property(document, name.trim(), value.trim());\n      });\n    }\n\n    var definitions = document.definitions;\n    var id = this.getAttribute('id'); // add id\n\n    if (id.hasValue()) {\n      if (!definitions[id.getValue()]) {\n        definitions[id.getValue()] = this;\n      }\n    }\n\n    Array.from(node.childNodes).forEach(function (childNode) {\n      if (childNode.nodeType === 1) {\n        _this.addChild(childNode); // ELEMENT_NODE\n\n      } else if (captureTextNodes && (childNode.nodeType === 3 || childNode.nodeType === 4)) {\n        var textNode = document.createTextNode(childNode);\n\n        if (textNode.getText().length > 0) {\n          _this.addChild(textNode); // TEXT_NODE\n\n        }\n      }\n    });\n  }\n\n  _createClass(Element, [{\n    key: \"getAttribute\",\n    value: function getAttribute(name) {\n      var createIfNotExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      var attr = this.attributes[name];\n\n      if (!attr && createIfNotExists) {\n        var _attr = new Property(this.document, name, '');\n\n        this.attributes[name] = _attr;\n        return _attr;\n      }\n\n      return attr || Property.empty(this.document);\n    }\n  }, {\n    key: \"getHrefAttribute\",\n    value: function getHrefAttribute() {\n      for (var key in this.attributes) {\n        if (key === 'href' || /:href$/.test(key)) {\n          return this.attributes[key];\n        }\n      }\n\n      return Property.empty(this.document);\n    }\n  }, {\n    key: \"getStyle\",\n    value: function getStyle(name) {\n      var createIfNotExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      var skipAncestors = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n      var style = this.styles[name];\n\n      if (style) {\n        return style;\n      }\n\n      var attr = this.getAttribute(name);\n\n      if (attr && attr.hasValue()) {\n        this.styles[name] = attr; // move up to me to cache\n\n        return attr;\n      }\n\n      if (!skipAncestors) {\n        var parent = this.parent;\n\n        if (parent) {\n          var parentStyle = parent.getStyle(name);\n\n          if (parentStyle && parentStyle.hasValue()) {\n            return parentStyle;\n          }\n        }\n      }\n\n      if (createIfNotExists) {\n        var _style = new Property(this.document, name, '');\n\n        this.styles[name] = _style;\n        return _style;\n      }\n\n      return style || Property.empty(this.document);\n    }\n  }, {\n    key: \"render\",\n    value: function render(ctx) {\n      // don't render display=none\n      // don't render visibility=hidden\n      if (this.getStyle('display').getString() === 'none' || this.getStyle('visibility').getString() === 'hidden') {\n        return;\n      }\n\n      ctx.save();\n\n      if (this.getStyle('mask').hasValue()) {\n        // mask\n        var mask = this.getStyle('mask').getDefinition();\n\n        if (mask) {\n          mask.apply(ctx, this);\n        }\n      } else if (this.getStyle('filter').getValue('none') !== 'none') {\n        // filter\n        var filter = this.getStyle('filter').getDefinition();\n\n        if (filter) {\n          filter.apply(ctx, this);\n        }\n      } else {\n        this.setContext(ctx);\n        this.renderChildren(ctx);\n        this.clearContext(ctx);\n      }\n\n      ctx.restore();\n    }\n  }, {\n    key: \"setContext\",\n    value: function setContext(_) {}\n  }, {\n    key: \"clearContext\",\n    value: function clearContext(_) {}\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      this.children.forEach(function (child) {\n        child.render(ctx);\n      });\n    }\n  }, {\n    key: \"addChild\",\n    value: function addChild(childNode) {\n      var child = childNode instanceof Element ? childNode : this.document.createElement(childNode);\n      child.parent = this;\n\n      if (!Element.ignoreChildTypes.includes(child.type)) {\n        this.children.push(child);\n      }\n    }\n  }, {\n    key: \"matchesSelector\",\n    value: function matchesSelector(selector) {\n      var node = this.node;\n\n      if (typeof node.matches === 'function') {\n        return node.matches(selector);\n      }\n\n      var styleClasses = node.getAttribute('class');\n\n      if (!styleClasses || styleClasses === '') {\n        return false;\n      }\n\n      return styleClasses.split(' ').some(function (styleClass) {\n        if (\".\".concat(styleClass) === selector) {\n          return true;\n        }\n      });\n    }\n  }, {\n    key: \"addStylesFromStyleDefinition\",\n    value: function addStylesFromStyleDefinition() {\n      var _this$document = this.document,\n          styles = _this$document.styles,\n          stylesSpecificity = _this$document.stylesSpecificity;\n\n      for (var selector in styles) {\n        if (selector[0] !== '@' && this.matchesSelector(selector)) {\n          var style = styles[selector];\n          var specificity = stylesSpecificity[selector];\n\n          if (style) {\n            for (var name in style) {\n              var existingSpecificity = this.stylesSpecificity[name];\n\n              if (typeof existingSpecificity === 'undefined') {\n                existingSpecificity = '000';\n              }\n\n              if (specificity >= existingSpecificity) {\n                this.styles[name] = style[name];\n                this.stylesSpecificity[name] = specificity;\n              }\n            }\n          }\n        }\n      }\n    }\n  }]);\n\n  return Element;\n}();\nElement.ignoreChildTypes = ['title'];\n\nfunction _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar UnknownElement = /*#__PURE__*/function (_Element) {\n  _inherits(UnknownElement, _Element);\n\n  var _super = _createSuper(UnknownElement);\n\n  function UnknownElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, UnknownElement);\n\n    _this = _super.call(this, document, node, captureTextNodes); // tslint:disable-next-line: no-console\n\n    console.warn(\"Element \".concat(node.nodeName, \" not yet implemented.\"));\n    return _this;\n  }\n\n  return UnknownElement;\n}(Element);\n\nfunction wrapFontFamily(fontFamily) {\n  var trimmed = fontFamily.trim();\n  return /^('|\")/.test(trimmed) ? trimmed : \"\\\"\".concat(trimmed, \"\\\"\");\n}\n\nfunction prepareFontFamily(fontFamily) {\n  return typeof process === 'undefined' ? fontFamily : fontFamily.trim().split(',').map(wrapFontFamily).join(',');\n}\n\nvar Font = /*#__PURE__*/function () {\n  function Font(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) {\n    _classCallCheck(this, Font);\n\n    var inheritFont = inherit ? typeof inherit === 'string' ? Font.parse(inherit) : inherit : {};\n    this.fontFamily = fontFamily || inheritFont.fontFamily;\n    this.fontSize = fontSize || inheritFont.fontSize;\n    this.fontStyle = fontStyle || inheritFont.fontStyle;\n    this.fontWeight = fontWeight || inheritFont.fontWeight;\n    this.fontVariant = fontVariant || inheritFont.fontVariant;\n  }\n\n  _createClass(Font, [{\n    key: \"toString\",\n    value: function toString() {\n      return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, // Wrap fontFamily only on nodejs and only for canvas.ctx\n      prepareFontFamily(this.fontFamily)].join(' ');\n    }\n  }], [{\n    key: \"parse\",\n    value: function parse() {\n      var font = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n      var inherit = arguments.length > 1 ? arguments[1] : undefined;\n      var fontStyle = '';\n      var fontVariant = '';\n      var fontWeight = '';\n      var fontSize = '';\n      var fontFamily = '';\n      var parts = compressSpaces(font).trim().split(' ');\n      var set = {\n        fontSize: false,\n        fontStyle: false,\n        fontWeight: false,\n        fontVariant: false\n      };\n      parts.forEach(function (part) {\n        switch (true) {\n          case !set.fontStyle && Font.styles.includes(part):\n            if (part !== 'inherit') {\n              fontStyle = part;\n            }\n\n            set.fontStyle = true;\n            break;\n\n          case !set.fontVariant && Font.variants.includes(part):\n            if (part !== 'inherit') {\n              fontVariant = part;\n            }\n\n            set.fontStyle = true;\n            set.fontVariant = true;\n            break;\n\n          case !set.fontWeight && Font.weights.includes(part):\n            if (part !== 'inherit') {\n              fontWeight = part;\n            }\n\n            set.fontStyle = true;\n            set.fontVariant = true;\n            set.fontWeight = true;\n            break;\n\n          case !set.fontSize:\n            if (part !== 'inherit') {\n              var _part$split = part.split('/');\n\n              var _part$split2 = _slicedToArray(_part$split, 1);\n\n              fontSize = _part$split2[0];\n            }\n\n            set.fontStyle = true;\n            set.fontVariant = true;\n            set.fontWeight = true;\n            set.fontSize = true;\n            break;\n\n          default:\n            if (part !== 'inherit') {\n              fontFamily += part;\n            }\n\n        }\n      });\n      return new Font(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit);\n    }\n  }]);\n\n  return Font;\n}();\nFont.styles = 'normal|italic|oblique|inherit';\nFont.variants = 'normal|small-caps|inherit';\nFont.weights = 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit';\n\nvar BoundingBox = /*#__PURE__*/function () {\n  function BoundingBox() {\n    var x1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Number.NaN;\n    var y1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.NaN;\n    var x2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Number.NaN;\n    var y2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Number.NaN;\n\n    _classCallCheck(this, BoundingBox);\n\n    this.x1 = x1;\n    this.y1 = y1;\n    this.x2 = x2;\n    this.y2 = y2;\n    this.addPoint(x1, y1);\n    this.addPoint(x2, y2);\n  }\n\n  _createClass(BoundingBox, [{\n    key: \"addPoint\",\n    value: function addPoint(x, y) {\n      if (typeof x !== 'undefined') {\n        if (isNaN(this.x1) || isNaN(this.x2)) {\n          this.x1 = x;\n          this.x2 = x;\n        }\n\n        if (x < this.x1) {\n          this.x1 = x;\n        }\n\n        if (x > this.x2) {\n          this.x2 = x;\n        }\n      }\n\n      if (typeof y !== 'undefined') {\n        if (isNaN(this.y1) || isNaN(this.y2)) {\n          this.y1 = y;\n          this.y2 = y;\n        }\n\n        if (y < this.y1) {\n          this.y1 = y;\n        }\n\n        if (y > this.y2) {\n          this.y2 = y;\n        }\n      }\n    }\n  }, {\n    key: \"addX\",\n    value: function addX(x) {\n      this.addPoint(x, null);\n    }\n  }, {\n    key: \"addY\",\n    value: function addY(y) {\n      this.addPoint(null, y);\n    }\n  }, {\n    key: \"addBoundingBox\",\n    value: function addBoundingBox(_ref) {\n      var x1 = _ref.x1,\n          y1 = _ref.y1,\n          x2 = _ref.x2,\n          y2 = _ref.y2;\n      this.addPoint(x1, y1);\n      this.addPoint(x2, y2);\n    }\n  }, {\n    key: \"sumCubic\",\n    value: function sumCubic(t, p0, p1, p2, p3) {\n      return Math.pow(1 - t, 3) * p0 + 3 * Math.pow(1 - t, 2) * t * p1 + 3 * (1 - t) * Math.pow(t, 2) * p2 + Math.pow(t, 3) * p3;\n    }\n  }, {\n    key: \"bezierCurveAdd\",\n    value: function bezierCurveAdd(forX, p0, p1, p2, p3) {\n      var b = 6 * p0 - 12 * p1 + 6 * p2;\n      var a = -3 * p0 + 9 * p1 - 9 * p2 + 3 * p3;\n      var c = 3 * p1 - 3 * p0;\n\n      if (a === 0) {\n        if (b === 0) {\n          return;\n        }\n\n        var t = -c / b;\n\n        if (0 < t && t < 1) {\n          if (forX) {\n            this.addX(this.sumCubic(t, p0, p1, p2, p3));\n          } else {\n            this.addY(this.sumCubic(t, p0, p1, p2, p3));\n          }\n        }\n\n        return;\n      }\n\n      var b2ac = Math.pow(b, 2) - 4 * c * a;\n\n      if (b2ac < 0) {\n        return;\n      }\n\n      var t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n\n      if (0 < t1 && t1 < 1) {\n        if (forX) {\n          this.addX(this.sumCubic(t1, p0, p1, p2, p3));\n        } else {\n          this.addY(this.sumCubic(t1, p0, p1, p2, p3));\n        }\n      }\n\n      var t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n\n      if (0 < t2 && t2 < 1) {\n        if (forX) {\n          this.addX(this.sumCubic(t2, p0, p1, p2, p3));\n        } else {\n          this.addY(this.sumCubic(t2, p0, p1, p2, p3));\n        }\n      }\n    } // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n\n  }, {\n    key: \"addBezierCurve\",\n    value: function addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n      this.addPoint(p0x, p0y);\n      this.addPoint(p3x, p3y);\n      this.bezierCurveAdd(true, p0x, p1x, p2x, p3x);\n      this.bezierCurveAdd(false, p0y, p1y, p2y, p3y);\n    }\n  }, {\n    key: \"addQuadraticCurve\",\n    value: function addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n      var cp1x = p0x + 2 / 3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)\n\n      var cp1y = p0y + 2 / 3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)\n\n      var cp2x = cp1x + 1 / 3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)\n\n      var cp2y = cp1y + 1 / 3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)\n\n      this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y);\n    }\n  }, {\n    key: \"isPointInBox\",\n    value: function isPointInBox(x, y) {\n      var x1 = this.x1,\n          y1 = this.y1,\n          x2 = this.x2,\n          y2 = this.y2;\n      return x1 <= x && x <= x2 && y1 <= y && y <= y2;\n    }\n  }, {\n    key: \"x\",\n    get: function get() {\n      return this.x1;\n    }\n  }, {\n    key: \"y\",\n    get: function get() {\n      return this.y1;\n    }\n  }, {\n    key: \"width\",\n    get: function get() {\n      return this.x2 - this.x1;\n    }\n  }, {\n    key: \"height\",\n    get: function get() {\n      return this.y2 - this.y1;\n    }\n  }]);\n\n  return BoundingBox;\n}();\n\nvar Translate = /*#__PURE__*/function () {\n  function Translate(_, point) {\n    _classCallCheck(this, Translate);\n\n    this.type = 'translate';\n    this.point = null;\n    this.point = Point.parse(point);\n  }\n\n  _createClass(Translate, [{\n    key: \"apply\",\n    value: function apply(ctx) {\n      var _this$point = this.point,\n          x = _this$point.x,\n          y = _this$point.y;\n      ctx.translate(x || 0.0, y || 0.0);\n    }\n  }, {\n    key: \"unapply\",\n    value: function unapply(ctx) {\n      var _this$point2 = this.point,\n          x = _this$point2.x,\n          y = _this$point2.y;\n      ctx.translate(-1.0 * x || 0.0, -1.0 * y || 0.0);\n    }\n  }, {\n    key: \"applyToPoint\",\n    value: function applyToPoint(point) {\n      var _this$point3 = this.point,\n          x = _this$point3.x,\n          y = _this$point3.y;\n      point.applyTransform([1, 0, 0, 1, x || 0.0, y || 0.0]);\n    }\n  }]);\n\n  return Translate;\n}();\n\nvar Rotate = /*#__PURE__*/function () {\n  function Rotate(document, rotate) {\n    var transformOrigin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n    _classCallCheck(this, Rotate);\n\n    this.type = 'rotate';\n    this.angle = null;\n    this.cx = 0;\n    this.cy = 0;\n    var numbers = toNumbers(rotate);\n    this.angle = new Property(document, 'angle', numbers[0]);\n    this.cx = (numbers[1] || 0) + (transformOrigin[0] || 0);\n    this.cy = (numbers[2] || 0) + (transformOrigin[1] || 0);\n  }\n\n  _createClass(Rotate, [{\n    key: \"apply\",\n    value: function apply(ctx) {\n      var cx = this.cx,\n          cy = this.cy,\n          angle = this.angle;\n      ctx.translate(cx, cy);\n      ctx.rotate(angle.getRadians());\n      ctx.translate(-cx, -cy);\n    }\n  }, {\n    key: \"unapply\",\n    value: function unapply(ctx) {\n      var cx = this.cx,\n          cy = this.cy,\n          angle = this.angle;\n      ctx.translate(cx, cy);\n      ctx.rotate(-1.0 * angle.getRadians());\n      ctx.translate(-cx, -cy);\n    }\n  }, {\n    key: \"applyToPoint\",\n    value: function applyToPoint(point) {\n      var cx = this.cx,\n          cy = this.cy,\n          angle = this.angle;\n      var rad = angle.getRadians(); // tslint:disable-next-line: no-console\n      // console.warn('Unknown action:', (this as any).p, this);\n      // ?\n\n      point.applyTransform([1, 0, 0, 1, cx || 0.0, cy || 0.0 // this.p.y\n      ]);\n      point.applyTransform([Math.cos(rad), Math.sin(rad), -Math.sin(rad), Math.cos(rad), 0, 0]);\n      point.applyTransform([1, 0, 0, 1, -cx || 0.0, -cy || 0.0 // -this.p.y\n      ]);\n    }\n  }]);\n\n  return Rotate;\n}();\n\nvar Scale = /*#__PURE__*/function () {\n  function Scale(_, scale) {\n    _classCallCheck(this, Scale);\n\n    this.type = 'scale';\n    this.scale = null;\n    var scaleSize = Point.parse(scale, 1); // Workaround for node-canvas\n\n    if (scaleSize.x === 0 || scaleSize.y === 0) {\n      scaleSize.x = PSEUDO_ZERO;\n      scaleSize.y = PSEUDO_ZERO;\n    }\n\n    this.scale = scaleSize;\n  }\n\n  _createClass(Scale, [{\n    key: \"apply\",\n    value: function apply(ctx) {\n      var _this$scale = this.scale,\n          x = _this$scale.x,\n          y = _this$scale.y;\n      ctx.scale(x, y || x);\n    }\n  }, {\n    key: \"unapply\",\n    value: function unapply(ctx) {\n      var _this$scale2 = this.scale,\n          x = _this$scale2.x,\n          y = _this$scale2.y;\n      ctx.scale(1.0 / x, 1.0 / y || x);\n    }\n  }, {\n    key: \"applyToPoint\",\n    value: function applyToPoint(point) {\n      var _this$scale3 = this.scale,\n          x = _this$scale3.x,\n          y = _this$scale3.y;\n      point.applyTransform([x || 0.0, 0, 0, y || 0.0, 0, 0]);\n    }\n  }]);\n\n  return Scale;\n}();\n\nvar Matrix = /*#__PURE__*/function () {\n  function Matrix(_, matrix) {\n    _classCallCheck(this, Matrix);\n\n    this.type = 'matrix';\n    this.matrix = [];\n    this.matrix = toNumbers(matrix);\n  }\n\n  _createClass(Matrix, [{\n    key: \"apply\",\n    value: function apply(ctx) {\n      var matrix = this.matrix;\n      ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);\n    }\n  }, {\n    key: \"unapply\",\n    value: function unapply(ctx) {\n      var matrix = this.matrix;\n      var a = matrix[0];\n      var b = matrix[2];\n      var c = matrix[4];\n      var d = matrix[1];\n      var e = matrix[3];\n      var f = matrix[5];\n      var g = 0.0;\n      var h = 0.0;\n      var i = 1.0;\n      var det = 1 / (a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g));\n      ctx.transform(det * (e * i - f * h), det * (f * g - d * i), det * (c * h - b * i), det * (a * i - c * g), det * (b * f - c * e), det * (c * d - a * f));\n    }\n  }, {\n    key: \"applyToPoint\",\n    value: function applyToPoint(point) {\n      point.applyTransform(this.matrix);\n    }\n  }]);\n\n  return Matrix;\n}();\n\nfunction _createSuper$1(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$1()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$1() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar Skew = /*#__PURE__*/function (_Matrix) {\n  _inherits(Skew, _Matrix);\n\n  var _super = _createSuper$1(Skew);\n\n  function Skew(document, skew) {\n    var _this;\n\n    _classCallCheck(this, Skew);\n\n    _this = _super.call(this, document, skew);\n    _this.type = 'skew';\n    _this.angle = null;\n    _this.angle = new Property(document, 'angle', skew);\n    return _this;\n  }\n\n  return Skew;\n}(Matrix);\n\nfunction _createSuper$2(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$2()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$2() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar SkewX = /*#__PURE__*/function (_Skew) {\n  _inherits(SkewX, _Skew);\n\n  var _super = _createSuper$2(SkewX);\n\n  function SkewX(document, skew) {\n    var _this;\n\n    _classCallCheck(this, SkewX);\n\n    _this = _super.call(this, document, skew);\n    _this.type = 'skewX';\n    _this.matrix = [1, 0, Math.tan(_this.angle.getRadians()), 1, 0, 0];\n    return _this;\n  }\n\n  return SkewX;\n}(Skew);\n\nfunction _createSuper$3(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$3()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$3() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar SkewY = /*#__PURE__*/function (_Skew) {\n  _inherits(SkewY, _Skew);\n\n  var _super = _createSuper$3(SkewY);\n\n  function SkewY(document, skew) {\n    var _this;\n\n    _classCallCheck(this, SkewY);\n\n    _this = _super.call(this, document, skew);\n    _this.type = 'skewY';\n    _this.matrix = [1, Math.tan(_this.angle.getRadians()), 0, 1, 0, 0];\n    return _this;\n  }\n\n  return SkewY;\n}(Skew);\n\nfunction parseTransforms(transform) {\n  return compressSpaces(transform).trim().replace(/\\)([a-zA-Z])/g, ') $1').replace(/\\)(\\s?,\\s?)/g, ') ').split(/\\s(?=[a-z])/);\n}\n\nfunction parseTransform(transform) {\n  var _transform$split = transform.split('('),\n      _transform$split2 = _slicedToArray(_transform$split, 2),\n      type = _transform$split2[0],\n      value = _transform$split2[1];\n\n  return [type.trim(), value.trim().replace(')', '')];\n}\n\nvar Transform = /*#__PURE__*/function () {\n  function Transform(document, transform, transformOrigin) {\n    var _this = this;\n\n    _classCallCheck(this, Transform);\n\n    this.document = document;\n    this.transforms = [];\n    var data = parseTransforms(transform);\n    var originCoords = transformOrigin ? toNumbers(transformOrigin) : [];\n    data.forEach(function (transform) {\n      if (transform === 'none') {\n        return;\n      }\n\n      var _parseTransform = parseTransform(transform),\n          _parseTransform2 = _slicedToArray(_parseTransform, 2),\n          type = _parseTransform2[0],\n          value = _parseTransform2[1];\n\n      var TransformType = Transform.transformTypes[type];\n\n      if (typeof TransformType !== 'undefined') {\n        _this.transforms.push(new TransformType(_this.document, value, originCoords));\n      }\n    });\n  }\n\n  _createClass(Transform, [{\n    key: \"apply\",\n    value: function apply(ctx) {\n      var transforms = this.transforms;\n      var len = transforms.length;\n\n      for (var i = 0; i < len; i++) {\n        transforms[i].apply(ctx);\n      }\n    }\n  }, {\n    key: \"unapply\",\n    value: function unapply(ctx) {\n      var transforms = this.transforms;\n      var len = transforms.length;\n\n      for (var i = len - 1; i >= 0; i--) {\n        transforms[i].unapply(ctx);\n      }\n    } // TODO: applyToPoint unused ... remove?\n\n  }, {\n    key: \"applyToPoint\",\n    value: function applyToPoint(point) {\n      var transforms = this.transforms;\n      var len = transforms.length;\n\n      for (var i = 0; i < len; i++) {\n        transforms[i].applyToPoint(point);\n      }\n    }\n  }], [{\n    key: \"fromElement\",\n    value: function fromElement(document, element) {\n      var transformStyle = element.getStyle('transform', false, true);\n      var transformOriginStyle = element.getStyle('transform-origin', false, true);\n\n      if (transformStyle.hasValue()) {\n        return new Transform(document, transformStyle.getString(), transformOriginStyle.getString());\n      }\n\n      return null;\n    }\n  }]);\n\n  return Transform;\n}();\nTransform.transformTypes = {\n  translate: Translate,\n  rotate: Rotate,\n  scale: Scale,\n  matrix: Matrix,\n  skewX: SkewX,\n  skewY: SkewY\n};\n\nfunction _createSuper$4(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$4()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$4() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar RenderedElement = /*#__PURE__*/function (_Element) {\n  _inherits(RenderedElement, _Element);\n\n  var _super = _createSuper$4(RenderedElement);\n\n  function RenderedElement() {\n    var _this;\n\n    _classCallCheck(this, RenderedElement);\n\n    _this = _super.apply(this, arguments);\n    _this.modifiedEmSizeStack = false;\n    return _this;\n  }\n\n  _createClass(RenderedElement, [{\n    key: \"calculateOpacity\",\n    value: function calculateOpacity() {\n      var opacity = 1.0; // tslint:disable-next-line: no-this-assignment\n\n      var element = this;\n\n      while (element) {\n        var opacityStyle = element.getStyle('opacity', false, true); // no ancestors on style call\n\n        if (opacityStyle.hasValue()) {\n          opacity *= opacityStyle.getNumber();\n        }\n\n        element = element.parent;\n      }\n\n      return opacity;\n    }\n  }, {\n    key: \"setContext\",\n    value: function setContext(ctx) {\n      var fromMeasure = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (!fromMeasure) {\n        // causes stack overflow when measuring text with gradients\n        // fill\n        var fillStyleProp = this.getStyle('fill');\n        var fillOpacityStyleProp = this.getStyle('fill-opacity');\n        var strokeStyleProp = this.getStyle('stroke');\n        var strokeOpacityProp = this.getStyle('stroke-opacity');\n\n        if (fillStyleProp.isUrlDefinition()) {\n          var fillStyle = fillStyleProp.getFillStyleDefinition(this, fillOpacityStyleProp);\n\n          if (fillStyle) {\n            ctx.fillStyle = fillStyle;\n          }\n        } else if (fillStyleProp.hasValue()) {\n          if (fillStyleProp.getString() === 'currentColor') {\n            fillStyleProp.setValue(this.getStyle('color').getValue());\n          }\n\n          var _fillStyle = fillStyleProp.getString();\n\n          if (_fillStyle !== 'inherit') {\n            ctx.fillStyle = _fillStyle === 'none' ? 'rgba(0,0,0,0)' : _fillStyle;\n          }\n        }\n\n        if (fillOpacityStyleProp.hasValue()) {\n          var _fillStyle2 = new Property(this.document, 'fill', ctx.fillStyle).addOpacity(fillOpacityStyleProp).getString();\n\n          ctx.fillStyle = _fillStyle2;\n        } // stroke\n\n\n        if (strokeStyleProp.isUrlDefinition()) {\n          var strokeStyle = strokeStyleProp.getFillStyleDefinition(this, strokeOpacityProp);\n\n          if (strokeStyle) {\n            ctx.strokeStyle = strokeStyle;\n          }\n        } else if (strokeStyleProp.hasValue()) {\n          if (strokeStyleProp.getString() === 'currentColor') {\n            strokeStyleProp.setValue(this.getStyle('color').getValue());\n          }\n\n          var _strokeStyle = strokeStyleProp.getString();\n\n          if (_strokeStyle !== 'inherit') {\n            ctx.strokeStyle = _strokeStyle === 'none' ? 'rgba(0,0,0,0)' : _strokeStyle;\n          }\n        }\n\n        if (strokeOpacityProp.hasValue()) {\n          var _strokeStyle2 = new Property(this.document, 'stroke', ctx.strokeStyle).addOpacity(strokeOpacityProp).getString();\n\n          ctx.strokeStyle = _strokeStyle2;\n        }\n\n        var strokeWidthStyleProp = this.getStyle('stroke-width');\n\n        if (strokeWidthStyleProp.hasValue()) {\n          var newLineWidth = strokeWidthStyleProp.getPixels();\n          ctx.lineWidth = !newLineWidth ? PSEUDO_ZERO // browsers don't respect 0 (or node-canvas? :-)\n          : newLineWidth;\n        }\n\n        var strokeLinecapStyleProp = this.getStyle('stroke-linecap');\n        var strokeLinejoinStyleProp = this.getStyle('stroke-linejoin');\n        var strokeMiterlimitProp = this.getStyle('stroke-miterlimit');\n        var pointOrderStyleProp = this.getStyle('paint-order');\n        var strokeDasharrayStyleProp = this.getStyle('stroke-dasharray');\n        var strokeDashoffsetProp = this.getStyle('stroke-dashoffset');\n\n        if (strokeLinecapStyleProp.hasValue()) {\n          ctx.lineCap = strokeLinecapStyleProp.getString();\n        }\n\n        if (strokeLinejoinStyleProp.hasValue()) {\n          ctx.lineJoin = strokeLinejoinStyleProp.getString();\n        }\n\n        if (strokeMiterlimitProp.hasValue()) {\n          ctx.miterLimit = strokeMiterlimitProp.getNumber();\n        }\n\n        if (pointOrderStyleProp.hasValue()) {\n          // ?\n          ctx.paintOrder = pointOrderStyleProp.getValue();\n        }\n\n        if (strokeDasharrayStyleProp.hasValue() && strokeDasharrayStyleProp.getString() !== 'none') {\n          var gaps = toNumbers(strokeDasharrayStyleProp.getString());\n\n          if (typeof ctx.setLineDash !== 'undefined') {\n            ctx.setLineDash(gaps);\n          } else if (typeof ctx.webkitLineDash !== 'undefined') {\n            ctx.webkitLineDash = gaps;\n          } else if (typeof ctx.mozDash !== 'undefined' && !(gaps.length === 1 && gaps[0] === 0)) {\n            ctx.mozDash = gaps;\n          }\n\n          var offset = strokeDashoffsetProp.getPixels();\n\n          if (typeof ctx.lineDashOffset !== 'undefined') {\n            ctx.lineDashOffset = offset;\n          } else if (typeof ctx.webkitLineDashOffset !== 'undefined') {\n            ctx.webkitLineDashOffset = offset;\n          } else if (typeof ctx.mozDashOffset !== 'undefined') {\n            ctx.mozDashOffset = offset;\n          }\n        }\n      } // font\n\n\n      this.modifiedEmSizeStack = false;\n\n      if (typeof ctx.font !== 'undefined') {\n        var fontStyleProp = this.getStyle('font');\n        var fontStyleStyleProp = this.getStyle('font-style');\n        var fontVariantStyleProp = this.getStyle('font-variant');\n        var fontWeightStyleProp = this.getStyle('font-weight');\n        var fontSizeStyleProp = this.getStyle('font-size');\n        var fontFamilyStyleProp = this.getStyle('font-family');\n        var font = new Font(fontStyleStyleProp.getString(), fontVariantStyleProp.getString(), fontWeightStyleProp.getString(), fontSizeStyleProp.hasValue() ? \"\".concat(fontSizeStyleProp.getPixels(true), \"px\") : '', fontFamilyStyleProp.getString(), Font.parse(fontStyleProp.getString(), ctx.font));\n        fontStyleStyleProp.setValue(font.fontStyle);\n        fontVariantStyleProp.setValue(font.fontVariant);\n        fontWeightStyleProp.setValue(font.fontWeight);\n        fontSizeStyleProp.setValue(font.fontSize);\n        fontFamilyStyleProp.setValue(font.fontFamily);\n        ctx.font = font.toString();\n\n        if (fontSizeStyleProp.isPixels()) {\n          this.document.emSize = fontSizeStyleProp.getPixels();\n          this.modifiedEmSizeStack = true;\n        }\n      } // transform\n\n\n      var transform = Transform.fromElement(this.document, this);\n\n      if (transform) {\n        transform.apply(ctx);\n      } // clip\n\n\n      var clipPathStyleProp = this.getStyle('clip-path', false, true);\n\n      if (clipPathStyleProp.hasValue()) {\n        var clip = clipPathStyleProp.getDefinition();\n\n        if (clip) {\n          clip.apply(ctx);\n        }\n      } // opacity\n\n\n      ctx.globalAlpha = this.calculateOpacity();\n    }\n  }, {\n    key: \"clearContext\",\n    value: function clearContext(ctx) {\n      _get(_getPrototypeOf(RenderedElement.prototype), \"clearContext\", this).call(this, ctx);\n\n      if (this.modifiedEmSizeStack) {\n        this.document.popEmSize();\n      }\n    }\n  }]);\n\n  return RenderedElement;\n}(Element);\n\nfunction _createSuper$5(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$5()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$5() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar TextElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(TextElement, _RenderedElement);\n\n  var _super = _createSuper$5(TextElement);\n\n  function TextElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, TextElement);\n\n    _this = _super.call(this, document, node, (this instanceof TextElement ? this.constructor : void 0) === TextElement ? true : captureTextNodes);\n    _this.type = 'text';\n    _this.x = 0;\n    _this.y = 0;\n    _this.measureCache = -1;\n    return _this;\n  }\n\n  _createClass(TextElement, [{\n    key: \"setContext\",\n    value: function setContext(ctx) {\n      var fromMeasure = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      _get(_getPrototypeOf(TextElement.prototype), \"setContext\", this).call(this, ctx, fromMeasure);\n\n      var textBaseline = this.getStyle('dominant-baseline').getTextBaseline() || this.getStyle('alignment-baseline').getTextBaseline();\n\n      if (textBaseline) {\n        ctx.textBaseline = textBaseline;\n      }\n    }\n  }, {\n    key: \"initializeCoordinates\",\n    value: function initializeCoordinates(ctx) {\n      this.x = this.getAttribute('x').getPixels('x');\n      this.y = this.getAttribute('y').getPixels('y');\n      var dxAttr = this.getAttribute('dx');\n      var dyAttr = this.getAttribute('dy');\n\n      if (dxAttr.hasValue()) {\n        this.x += dxAttr.getPixels('x');\n      }\n\n      if (dyAttr.hasValue()) {\n        this.y += dyAttr.getPixels('y');\n      }\n\n      this.x += this.getAnchorDelta(ctx, this, 0);\n    }\n  }, {\n    key: \"getBoundingBox\",\n    value: function getBoundingBox(ctx) {\n      var _this2 = this;\n\n      if (this.type !== 'text') {\n        return this.getTElementBoundingBox(ctx);\n      }\n\n      this.initializeCoordinates(ctx);\n      var boundingBox = null;\n      this.children.forEach(function (_, i) {\n        var childBoundingBox = _this2.getChildBoundingBox(ctx, _this2, _this2, i);\n\n        if (!boundingBox) {\n          boundingBox = childBoundingBox;\n        } else {\n          boundingBox.addBoundingBox(childBoundingBox);\n        }\n      });\n      return boundingBox;\n    }\n  }, {\n    key: \"getFontSize\",\n    value: function getFontSize() {\n      var document = this.document,\n          parent = this.parent;\n      var inheritFontSize = Font.parse(document.ctx.font).fontSize;\n      var fontSize = parent.getStyle('font-size').getNumber(inheritFontSize);\n      return fontSize;\n    }\n  }, {\n    key: \"getTElementBoundingBox\",\n    value: function getTElementBoundingBox(ctx) {\n      var fontSize = this.getFontSize();\n      return new BoundingBox(this.x, this.y - fontSize, this.x + this.measureText(ctx), this.y);\n    }\n  }, {\n    key: \"getGlyph\",\n    value: function getGlyph(font, text, i) {\n      var char = text[i];\n      var glyph = null;\n\n      if (font.isArabic) {\n        var len = text.length;\n        var prevChar = text[i - 1];\n        var nextChar = text[i + 1];\n        var arabicForm = 'isolated';\n\n        if ((i === 0 || prevChar === ' ') && i < len - 2 && nextChar !== ' ') {\n          arabicForm = 'terminal';\n        }\n\n        if (i > 0 && prevChar !== ' ' && i < len - 2 && nextChar !== ' ') {\n          arabicForm = 'medial';\n        }\n\n        if (i > 0 && prevChar !== ' ' && (i === len - 1 || nextChar === ' ')) {\n          arabicForm = 'initial';\n        }\n\n        if (typeof font.glyphs[char] !== 'undefined') {\n          glyph = font.glyphs[char][arabicForm];\n\n          if (!glyph && font.glyphs[char].type === 'glyph') {\n            glyph = font.glyphs[char];\n          }\n        }\n      } else {\n        glyph = font.glyphs[char];\n      }\n\n      if (!glyph) {\n        glyph = font.missingGlyph;\n      }\n\n      return glyph;\n    }\n  }, {\n    key: \"getText\",\n    value: function getText() {\n      return '';\n    }\n  }, {\n    key: \"getTextFromNode\",\n    value: function getTextFromNode(node) {\n      var textNode = node || this.node;\n      var childNodes = Array.from(textNode.parentNode.childNodes);\n      var index = childNodes.indexOf(textNode);\n      var lastIndex = childNodes.length - 1;\n      var text = compressSpaces(textNode.value || textNode.text || textNode.textContent || '');\n\n      if (index === 0) {\n        text = trimLeft(text);\n      } else if (index === lastIndex) {\n        text = trimRight(text);\n      }\n\n      return text;\n    }\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      var _this3 = this;\n\n      if (this.type !== 'text') {\n        this.renderTElementChildren(ctx);\n        return;\n      }\n\n      this.initializeCoordinates(ctx);\n      this.children.forEach(function (_, i) {\n        _this3.renderChild(ctx, _this3, _this3, i);\n      });\n      var mouse = this.document.screen.mouse; // Do not calc bounding box if mouse is not working.\n\n      if (mouse.isWorking()) {\n        mouse.checkBoundingBox(this, this.getBoundingBox(ctx));\n      }\n    }\n  }, {\n    key: \"renderTElementChildren\",\n    value: function renderTElementChildren(ctx) {\n      var document = this.document,\n          parent = this.parent;\n      var renderText = this.getText();\n      var customFont = parent.getStyle('font-family').getDefinition();\n\n      if (customFont) {\n        var unitsPerEm = customFont.fontFace.unitsPerEm;\n        var ctxFont = Font.parse(document.ctx.font);\n        var fontSize = parent.getStyle('font-size').getNumber(ctxFont.fontSize);\n        var fontStyle = parent.getStyle('font-style').getString(ctxFont.fontStyle);\n        var scale = fontSize / unitsPerEm;\n        var text = customFont.isRTL ? renderText.split('').reverse().join('') : renderText;\n        var dx = toNumbers(parent.getAttribute('dx').getString());\n        var len = text.length;\n\n        for (var i = 0; i < len; i++) {\n          var glyph = this.getGlyph(customFont, text, i);\n          ctx.translate(this.x, this.y);\n          ctx.scale(scale, -scale);\n          var lw = ctx.lineWidth;\n          ctx.lineWidth = ctx.lineWidth * unitsPerEm / fontSize;\n\n          if (fontStyle === 'italic') {\n            ctx.transform(1, 0, .4, 1, 0, 0);\n          }\n\n          glyph.render(ctx);\n\n          if (fontStyle === 'italic') {\n            ctx.transform(1, 0, -.4, 1, 0, 0);\n          }\n\n          ctx.lineWidth = lw;\n          ctx.scale(1 / scale, -1 / scale);\n          ctx.translate(-this.x, -this.y);\n          this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / unitsPerEm;\n\n          if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) {\n            this.x += dx[i];\n          }\n        }\n\n        return;\n      }\n\n      var x = this.x,\n          y = this.y;\n\n      if (ctx.paintOrder === 'stroke') {\n        if (ctx.strokeStyle) {\n          ctx.strokeText(renderText, x, y);\n        }\n\n        if (ctx.fillStyle) {\n          ctx.fillText(renderText, x, y);\n        }\n      } else {\n        if (ctx.fillStyle) {\n          ctx.fillText(renderText, x, y);\n        }\n\n        if (ctx.strokeStyle) {\n          ctx.strokeText(renderText, x, y);\n        }\n      }\n    }\n  }, {\n    key: \"getAnchorDelta\",\n    value: function getAnchorDelta(ctx, parent, startI) {\n      var textAnchor = this.getStyle('text-anchor').getString('start');\n\n      if (textAnchor !== 'start') {\n        var children = parent.children;\n        var len = children.length;\n        var child = null;\n        var width = 0;\n\n        for (var i = startI; i < len; i++) {\n          child = children[i];\n\n          if (i > startI && child.getAttribute('x').hasValue() || child.getAttribute('text-anchor').hasValue()) {\n            break; // new group\n          }\n\n          width += child.measureTextRecursive(ctx);\n        }\n\n        return -1 * (textAnchor === 'end' ? width : width / 2.0);\n      }\n\n      return 0;\n    }\n  }, {\n    key: \"adjustChildCoordinates\",\n    value: function adjustChildCoordinates(ctx, textParent, parent, i) {\n      var child = parent.children[i];\n\n      if (typeof child.measureText !== 'function') {\n        return child;\n      }\n\n      var xAttr = child.getAttribute('x');\n      var yAttr = child.getAttribute('y');\n      var dxAttr = child.getAttribute('dx');\n      var dyAttr = child.getAttribute('dy');\n      var textAnchor = child.getAttribute('text-anchor').getString('start');\n\n      if (i === 0 && child.type !== 'textNode') {\n        if (!xAttr.hasValue()) {\n          xAttr.setValue(textParent.getAttribute('x').getValue('0'));\n        }\n\n        if (!yAttr.hasValue()) {\n          yAttr.setValue(textParent.getAttribute('y').getValue('0'));\n        }\n\n        if (!dxAttr.hasValue()) {\n          dxAttr.setValue(textParent.getAttribute('dx').getValue('0'));\n        }\n\n        if (!dyAttr.hasValue()) {\n          dyAttr.setValue(textParent.getAttribute('dy').getValue('0'));\n        }\n      }\n\n      if (xAttr.hasValue()) {\n        child.x = xAttr.getPixels('x') + textParent.getAnchorDelta(ctx, parent, i);\n\n        if (textAnchor !== 'start') {\n          var width = child.measureTextRecursive(ctx);\n          child.x += -1 * (textAnchor === 'end' ? width : width / 2.0);\n        }\n\n        if (dxAttr.hasValue()) {\n          child.x += dxAttr.getPixels('x');\n        }\n      } else {\n        if (textAnchor !== 'start') {\n          var _width = child.measureTextRecursive(ctx);\n\n          textParent.x += -1 * (textAnchor === 'end' ? _width : _width / 2.0);\n        }\n\n        if (dxAttr.hasValue()) {\n          textParent.x += dxAttr.getPixels('x');\n        }\n\n        child.x = textParent.x;\n      }\n\n      textParent.x = child.x + child.measureText(ctx);\n\n      if (yAttr.hasValue()) {\n        child.y = yAttr.getPixels('y');\n\n        if (dyAttr.hasValue()) {\n          child.y += dyAttr.getPixels('y');\n        }\n      } else {\n        if (dyAttr.hasValue()) {\n          textParent.y += dyAttr.getPixels('y');\n        }\n\n        child.y = textParent.y;\n      }\n\n      textParent.y = child.y;\n      return child;\n    }\n  }, {\n    key: \"getChildBoundingBox\",\n    value: function getChildBoundingBox(ctx, textParent, parent, i) {\n      var child = this.adjustChildCoordinates(ctx, textParent, parent, i);\n      var boundingBox = child.getBoundingBox(ctx);\n      child.children.forEach(function (_, i) {\n        var childBoundingBox = textParent.getChildBoundingBox(ctx, textParent, child, i);\n        boundingBox.addBoundingBox(childBoundingBox);\n      });\n      return boundingBox;\n    }\n  }, {\n    key: \"renderChild\",\n    value: function renderChild(ctx, textParent, parent, i) {\n      var child = this.adjustChildCoordinates(ctx, textParent, parent, i);\n      child.render(ctx);\n      child.children.forEach(function (_, i) {\n        textParent.renderChild(ctx, textParent, child, i);\n      });\n    }\n  }, {\n    key: \"measureTextRecursive\",\n    value: function measureTextRecursive(ctx) {\n      var width = this.children.reduce(function (width, child) {\n        return width + child.measureTextRecursive(ctx);\n      }, this.measureText(ctx));\n      return width;\n    }\n  }, {\n    key: \"measureText\",\n    value: function measureText(ctx) {\n      var measureCache = this.measureCache;\n\n      if (~measureCache) {\n        return measureCache;\n      }\n\n      var renderText = this.getText();\n      var measure = this.measureTargetText(ctx, renderText);\n      this.measureCache = measure;\n      return measure;\n    }\n  }, {\n    key: \"measureTargetText\",\n    value: function measureTargetText(ctx, targetText) {\n      if (!targetText.length) {\n        return 0;\n      }\n\n      var parent = this.parent;\n      var customFont = parent.getStyle('font-family').getDefinition();\n\n      if (customFont) {\n        var fontSize = this.getFontSize();\n        var text = customFont.isRTL ? targetText.split('').reverse().join('') : targetText;\n        var dx = toNumbers(parent.getAttribute('dx').getString());\n        var len = text.length;\n        var _measure = 0;\n\n        for (var i = 0; i < len; i++) {\n          var glyph = this.getGlyph(customFont, text, i);\n          _measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;\n\n          if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) {\n            _measure += dx[i];\n          }\n        }\n\n        return _measure;\n      }\n\n      if (!ctx.measureText) {\n        return targetText.length * 10;\n      }\n\n      ctx.save();\n      this.setContext(ctx, true);\n\n      var _ctx$measureText = ctx.measureText(targetText),\n          measure = _ctx$measureText.width;\n\n      ctx.restore();\n      return measure;\n    }\n  }]);\n\n  return TextElement;\n}(RenderedElement);\n\nfunction _createSuper$6(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$6()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$6() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar TSpanElement = /*#__PURE__*/function (_TextElement) {\n  _inherits(TSpanElement, _TextElement);\n\n  var _super = _createSuper$6(TSpanElement);\n\n  function TSpanElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, TSpanElement);\n\n    _this = _super.call(this, document, node, (this instanceof TSpanElement ? this.constructor : void 0) === TSpanElement ? true : captureTextNodes);\n    _this.type = 'tspan'; // if this node has children, then they own the text\n\n    _this.text = _this.children.length > 0 ? '' : _this.getTextFromNode();\n    return _this;\n  }\n\n  _createClass(TSpanElement, [{\n    key: \"getText\",\n    value: function getText() {\n      return this.text;\n    }\n  }]);\n\n  return TSpanElement;\n}(TextElement);\n\nfunction _createSuper$7(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$7()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$7() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar TextNode = /*#__PURE__*/function (_TSpanElement) {\n  _inherits(TextNode, _TSpanElement);\n\n  var _super = _createSuper$7(TextNode);\n\n  function TextNode() {\n    var _this;\n\n    _classCallCheck(this, TextNode);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'textNode';\n    return _this;\n  }\n\n  return TextNode;\n}(TSpanElement);\n\nfunction preparePath(path) {\n  var d = path.replace(/,/gm, ' ') // get rid of all commas\n  // As the end of a match can also be the start of the next match, we need to run this replace twice.\n  .replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm, '$1 $2') // suffix commands with spaces\n  .replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm, '$1 $2') // suffix commands with spaces\n  .replace(/([^\\s])([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // prefix commands with spaces\n  .replace(/([0-9])([+\\-])/gm, '$1 $2') // separate digits on +- signs\n  // Again, we need to run this twice to find all occurances\n  .replace(/(\\.[0-9]*)(\\.)/gm, '$1 $2') // separate digits when they start with a comma\n  .replace(/(\\.[0-9]*)(\\.)/gm, '$1 $2') // separate digits when they start with a comma\n  .replace(/([Aa](\\s+[0-9]+){3})\\s+([01])\\s*([01])/gm, '$1 $3 $4 '); // shorthand elliptical arc path syntax\n\n  return compressSpaces(d).trim();\n}\n\nvar PathParser = /*#__PURE__*/function () {\n  function PathParser(path) {\n    _classCallCheck(this, PathParser);\n\n    this.control = null;\n    this.start = null;\n    this.current = null;\n    this.command = '';\n    this.tokens = [];\n    this.i = -1;\n    this.previousCommand = '';\n    this.points = [];\n    this.angles = [];\n    this.tokens = preparePath(path).split(' ');\n  }\n\n  _createClass(PathParser, [{\n    key: \"reset\",\n    value: function reset() {\n      this.i = -1;\n      this.command = '';\n      this.previousCommand = '';\n      this.start = new Point(0, 0);\n      this.control = new Point(0, 0);\n      this.current = new Point(0, 0);\n      this.points = [];\n      this.angles = [];\n    }\n  }, {\n    key: \"isEnd\",\n    value: function isEnd() {\n      var i = this.i,\n          tokens = this.tokens;\n      return i >= tokens.length - 1;\n    }\n  }, {\n    key: \"isCommandOrEnd\",\n    value: function isCommandOrEnd() {\n      if (this.isEnd()) {\n        return true;\n      }\n\n      var i = this.i,\n          tokens = this.tokens;\n      return /^[A-Za-z]$/.test(tokens[i + 1]);\n    }\n  }, {\n    key: \"isRelativeCommand\",\n    value: function isRelativeCommand() {\n      switch (this.command) {\n        case 'm':\n        case 'l':\n        case 'h':\n        case 'v':\n        case 'c':\n        case 's':\n        case 'q':\n        case 't':\n        case 'a':\n        case 'z':\n          return true;\n\n        default:\n          return false;\n      }\n    }\n  }, {\n    key: \"getToken\",\n    value: function getToken() {\n      this.i++;\n      return this.tokens[this.i];\n    }\n  }, {\n    key: \"getScalar\",\n    value: function getScalar() {\n      return parseFloat(this.getToken());\n    }\n  }, {\n    key: \"nextCommand\",\n    value: function nextCommand() {\n      this.previousCommand = this.command;\n      this.command = this.getToken();\n    }\n  }, {\n    key: \"getPoint\",\n    value: function getPoint() {\n      var point = new Point(this.getScalar(), this.getScalar());\n      return this.makeAbsolute(point);\n    }\n  }, {\n    key: \"getAsControlPoint\",\n    value: function getAsControlPoint() {\n      var point = this.getPoint();\n      this.control = point;\n      return point;\n    }\n  }, {\n    key: \"getAsCurrentPoint\",\n    value: function getAsCurrentPoint() {\n      var point = this.getPoint();\n      this.current = point;\n      return point;\n    }\n  }, {\n    key: \"getReflectedControlPoint\",\n    value: function getReflectedControlPoint() {\n      var previousCommand = this.previousCommand.toLowerCase();\n\n      if (previousCommand !== 'c' && previousCommand !== 's' && previousCommand !== 'q' && previousCommand !== 't') {\n        return this.current;\n      } // reflect point\n\n\n      var _this$current = this.current,\n          cx = _this$current.x,\n          cy = _this$current.y,\n          _this$control = this.control,\n          ox = _this$control.x,\n          oy = _this$control.y;\n      var point = new Point(2 * cx - ox, 2 * cy - oy);\n      return point;\n    }\n  }, {\n    key: \"makeAbsolute\",\n    value: function makeAbsolute(point) {\n      if (this.isRelativeCommand()) {\n        var _this$current2 = this.current,\n            x = _this$current2.x,\n            y = _this$current2.y;\n        point.x += x;\n        point.y += y;\n      }\n\n      return point;\n    }\n  }, {\n    key: \"addMarker\",\n    value: function addMarker(point, from, priorTo) {\n      var points = this.points,\n          angles = this.angles; // if the last angle isn't filled in because we didn't have this point yet ...\n\n      if (priorTo && angles.length > 0 && !angles[angles.length - 1]) {\n        angles[angles.length - 1] = points[points.length - 1].angleTo(priorTo);\n      }\n\n      this.addMarkerAngle(point, from ? from.angleTo(point) : null);\n    }\n  }, {\n    key: \"addMarkerAngle\",\n    value: function addMarkerAngle(point, angle) {\n      this.points.push(point);\n      this.angles.push(angle);\n    }\n  }, {\n    key: \"getMarkerPoints\",\n    value: function getMarkerPoints() {\n      return this.points;\n    }\n  }, {\n    key: \"getMarkerAngles\",\n    value: function getMarkerAngles() {\n      var angles = this.angles;\n      var len = angles.length;\n\n      for (var i = 0; i < len; i++) {\n        if (!angles[i]) {\n          for (var j = i + 1; j < len; j++) {\n            if (angles[j]) {\n              angles[i] = angles[j];\n              break;\n            }\n          }\n        }\n      }\n\n      return angles;\n    }\n  }]);\n\n  return PathParser;\n}();\n\nfunction _createSuper$8(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$8()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$8() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar PathElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(PathElement, _RenderedElement);\n\n  var _super = _createSuper$8(PathElement);\n\n  function PathElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, PathElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'path';\n    _this.pathParser = null;\n    _this.pathParser = new PathParser(_this.getAttribute('d').getString());\n    return _this;\n  }\n\n  _createClass(PathElement, [{\n    key: \"path\",\n    value: function path(ctx) {\n      var pathParser = this.pathParser;\n      var boundingBox = new BoundingBox();\n      pathParser.reset();\n\n      if (ctx) {\n        ctx.beginPath();\n      }\n\n      while (!pathParser.isEnd()) {\n        pathParser.nextCommand();\n\n        switch (pathParser.command) {\n          case 'M':\n          case 'm':\n            this.pathM(ctx, boundingBox);\n            break;\n\n          case 'L':\n          case 'l':\n            this.pathL(ctx, boundingBox);\n            break;\n\n          case 'H':\n          case 'h':\n            this.pathH(ctx, boundingBox);\n            break;\n\n          case 'V':\n          case 'v':\n            this.pathV(ctx, boundingBox);\n            break;\n\n          case 'C':\n          case 'c':\n            this.pathC(ctx, boundingBox);\n            break;\n\n          case 'S':\n          case 's':\n            this.pathS(ctx, boundingBox);\n            break;\n\n          case 'Q':\n          case 'q':\n            this.pathQ(ctx, boundingBox);\n            break;\n\n          case 'T':\n          case 't':\n            this.pathT(ctx, boundingBox);\n            break;\n\n          case 'A':\n          case 'a':\n            this.pathA(ctx, boundingBox);\n            break;\n\n          case 'Z':\n          case 'z':\n            this.pathZ(ctx, boundingBox);\n            break;\n        }\n      }\n\n      return boundingBox;\n    }\n  }, {\n    key: \"getBoundingBox\",\n    value: function getBoundingBox(_) {\n      return this.path();\n    }\n  }, {\n    key: \"getMarkers\",\n    value: function getMarkers() {\n      var pathParser = this.pathParser;\n      var points = pathParser.getMarkerPoints();\n      var angles = pathParser.getMarkerAngles();\n      var markers = points.map(function (point, i) {\n        return [point, angles[i]];\n      });\n      return markers;\n    }\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      this.path(ctx);\n      this.document.screen.mouse.checkPath(this, ctx);\n      var fillRuleStyleProp = this.getStyle('fill-rule');\n\n      if (ctx.fillStyle !== '') {\n        if (fillRuleStyleProp.getString('inherit') !== 'inherit') {\n          ctx.fill(fillRuleStyleProp.getString());\n        } else {\n          ctx.fill();\n        }\n      }\n\n      if (ctx.strokeStyle !== '') {\n        ctx.stroke();\n      }\n\n      var markers = this.getMarkers();\n\n      if (markers) {\n        var markersLastIndex = markers.length - 1;\n        var markerStartStyleProp = this.getStyle('marker-start');\n        var markerMidStyleProp = this.getStyle('marker-mid');\n        var markerEndStyleProp = this.getStyle('marker-end');\n\n        if (markerStartStyleProp.isUrlDefinition()) {\n          var marker = markerStartStyleProp.getDefinition();\n\n          var _markers$ = _slicedToArray(markers[0], 2),\n              point = _markers$[0],\n              angle = _markers$[1];\n\n          marker.render(ctx, point, angle);\n        }\n\n        if (markerMidStyleProp.isUrlDefinition()) {\n          var _marker = markerMidStyleProp.getDefinition();\n\n          for (var i = 1; i < markersLastIndex; i++) {\n            var _markers$i = _slicedToArray(markers[i], 2),\n                _point = _markers$i[0],\n                _angle = _markers$i[1];\n\n            _marker.render(ctx, _point, _angle);\n          }\n        }\n\n        if (markerEndStyleProp.isUrlDefinition()) {\n          var _marker2 = markerEndStyleProp.getDefinition();\n\n          var _markers$markersLastI = _slicedToArray(markers[markersLastIndex], 2),\n              _point2 = _markers$markersLastI[0],\n              _angle2 = _markers$markersLastI[1];\n\n          _marker2.render(ctx, _point2, _angle2);\n        }\n      }\n    }\n  }, {\n    key: \"pathM\",\n    value: function pathM(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n      var point = pathParser.getAsCurrentPoint();\n      var x = point.x,\n          y = point.y;\n      pathParser.addMarker(point);\n      boundingBox.addPoint(x, y);\n\n      if (ctx) {\n        ctx.moveTo(x, y);\n      }\n\n      pathParser.start = pathParser.current;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var _point3 = pathParser.getAsCurrentPoint();\n\n        var _x = _point3.x,\n            _y = _point3.y;\n        pathParser.addMarker(_point3, pathParser.start);\n        boundingBox.addPoint(_x, _y);\n\n        if (ctx) {\n          ctx.lineTo(_x, _y);\n        }\n      }\n    }\n  }, {\n    key: \"pathL\",\n    value: function pathL(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = pathParser.getAsCurrentPoint();\n        var x = point.x,\n            y = point.y;\n        pathParser.addMarker(point, current);\n        boundingBox.addPoint(x, y);\n\n        if (ctx) {\n          ctx.lineTo(x, y);\n        }\n      }\n    }\n  }, {\n    key: \"pathH\",\n    value: function pathH(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = new Point((pathParser.isRelativeCommand() ? current.x : 0) + pathParser.getScalar(), current.y);\n        pathParser.addMarker(point, current);\n        pathParser.current = point;\n        boundingBox.addPoint(point.x, point.y);\n\n        if (ctx) {\n          ctx.lineTo(point.x, point.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathV\",\n    value: function pathV(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = new Point(current.x, (pathParser.isRelativeCommand() ? current.y : 0) + pathParser.getScalar());\n        pathParser.addMarker(point, current);\n        pathParser.current = point;\n        boundingBox.addPoint(point.x, point.y);\n\n        if (ctx) {\n          ctx.lineTo(point.x, point.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathC\",\n    value: function pathC(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = pathParser.getPoint();\n        var controlPoint = pathParser.getAsControlPoint();\n        var currentPoint = pathParser.getAsCurrentPoint();\n        pathParser.addMarker(currentPoint, controlPoint, point);\n        boundingBox.addBezierCurve(current.x, current.y, point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n\n        if (ctx) {\n          ctx.bezierCurveTo(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathS\",\n    value: function pathS(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = pathParser.getReflectedControlPoint();\n        var controlPoint = pathParser.getAsControlPoint();\n        var currentPoint = pathParser.getAsCurrentPoint();\n        pathParser.addMarker(currentPoint, controlPoint, point);\n        boundingBox.addBezierCurve(current.x, current.y, point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n\n        if (ctx) {\n          ctx.bezierCurveTo(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathQ\",\n    value: function pathQ(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var controlPoint = pathParser.getAsControlPoint();\n        var currentPoint = pathParser.getAsCurrentPoint();\n        pathParser.addMarker(currentPoint, controlPoint, controlPoint);\n        boundingBox.addQuadraticCurve(current.x, current.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n\n        if (ctx) {\n          ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathT\",\n    value: function pathT(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var controlPoint = pathParser.getReflectedControlPoint();\n        pathParser.control = controlPoint;\n        var currentPoint = pathParser.getAsCurrentPoint();\n        pathParser.addMarker(currentPoint, controlPoint, controlPoint);\n        boundingBox.addQuadraticCurve(current.x, current.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n\n        if (ctx) {\n          ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathA\",\n    value: function pathA(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var rx = pathParser.getScalar();\n        var ry = pathParser.getScalar();\n        var xAxisRotation = pathParser.getScalar() * (Math.PI / 180.0);\n        var largeArcFlag = pathParser.getScalar();\n        var sweepFlag = pathParser.getScalar();\n        var currentPoint = pathParser.getAsCurrentPoint(); // Conversion from endpoint to center parameterization\n        // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n        // x1', y1'\n\n        var currp = new Point(Math.cos(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.sin(xAxisRotation) * (current.y - currentPoint.y) / 2.0, -Math.sin(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * (current.y - currentPoint.y) / 2.0); // adjust radii\n\n        var l = Math.pow(currp.x, 2) / Math.pow(rx, 2) + Math.pow(currp.y, 2) / Math.pow(ry, 2);\n\n        if (l > 1) {\n          rx *= Math.sqrt(l);\n          ry *= Math.sqrt(l);\n        } // cx', cy'\n\n\n        var s = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt((Math.pow(rx, 2) * Math.pow(ry, 2) - Math.pow(rx, 2) * Math.pow(currp.y, 2) - Math.pow(ry, 2) * Math.pow(currp.x, 2)) / (Math.pow(rx, 2) * Math.pow(currp.y, 2) + Math.pow(ry, 2) * Math.pow(currp.x, 2)));\n\n        if (isNaN(s)) {\n          s = 0;\n        }\n\n        var cpp = new Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); // cx, cy\n\n        var centp = new Point((current.x + currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, (current.y + currentPoint.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y); // initial angle\n\n        var a1 = vectorsAngle([1, 0], [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]); // angle delta\n\n        var u = [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry];\n        var v = [(-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry];\n        var ad = vectorsAngle(u, v);\n\n        if (vectorsRatio(u, v) <= -1) {\n          ad = Math.PI;\n        }\n\n        if (vectorsRatio(u, v) >= 1) {\n          ad = 0;\n        } // for markers\n\n\n        var dir = 1 - sweepFlag ? 1.0 : -1.0;\n        var ah = a1 + dir * (ad / 2.0);\n        var halfWay = new Point(centp.x + rx * Math.cos(ah), centp.y + ry * Math.sin(ah));\n        pathParser.addMarkerAngle(halfWay, ah - dir * Math.PI / 2);\n        pathParser.addMarkerAngle(currentPoint, ah - dir * Math.PI);\n        boundingBox.addPoint(currentPoint.x, currentPoint.y); // TODO: this is too naive, make it better\n\n        if (ctx && !isNaN(a1) && !isNaN(ad)) {\n          var r = rx > ry ? rx : ry;\n          var sx = rx > ry ? 1 : rx / ry;\n          var sy = rx > ry ? ry / rx : 1;\n          ctx.translate(centp.x, centp.y);\n          ctx.rotate(xAxisRotation);\n          ctx.scale(sx, sy);\n          ctx.arc(0, 0, r, a1, a1 + ad, Boolean(1 - sweepFlag));\n          ctx.scale(1 / sx, 1 / sy);\n          ctx.rotate(-xAxisRotation);\n          ctx.translate(-centp.x, -centp.y);\n        }\n      }\n    }\n  }, {\n    key: \"pathZ\",\n    value: function pathZ(ctx, boundingBox) {\n      var pathParser = this.pathParser;\n\n      if (ctx) {\n        // only close path if it is not a straight line\n        if (boundingBox.x1 !== boundingBox.x2 && boundingBox.y1 !== boundingBox.y2) {\n          ctx.closePath();\n        }\n      }\n\n      pathParser.current = pathParser.start;\n    }\n  }]);\n\n  return PathElement;\n}(RenderedElement);\n\nfunction _createSuper$9(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$9()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$9() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar SVGElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(SVGElement, _RenderedElement);\n\n  var _super = _createSuper$9(SVGElement);\n\n  function SVGElement() {\n    var _this;\n\n    _classCallCheck(this, SVGElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'svg';\n    _this.root = false;\n    return _this;\n  }\n\n  _createClass(SVGElement, [{\n    key: \"clearContext\",\n    value: function clearContext(ctx) {\n      _get(_getPrototypeOf(SVGElement.prototype), \"clearContext\", this).call(this, ctx);\n\n      this.document.screen.viewPort.removeCurrent();\n    }\n  }, {\n    key: \"setContext\",\n    value: function setContext(ctx) {\n      var document = this.document;\n      var screen = document.screen,\n          window = document.window;\n      var canvas = ctx.canvas;\n      screen.setDefaults(ctx);\n\n      if (canvas.style && typeof ctx.font !== 'undefined' && window && typeof window.getComputedStyle !== 'undefined') {\n        ctx.font = window.getComputedStyle(canvas).getPropertyValue('font');\n        var fontSizeProp = new Property(document, 'fontSize', Font.parse(ctx.font).fontSize);\n\n        if (fontSizeProp.hasValue()) {\n          document.rootEmSize = fontSizeProp.getPixels('y');\n          document.emSize = document.rootEmSize;\n        }\n      }\n\n      _get(_getPrototypeOf(SVGElement.prototype), \"setContext\", this).call(this, ctx); // create new view port\n\n\n      if (!this.getAttribute('x').hasValue()) {\n        this.getAttribute('x', true).setValue(0);\n      }\n\n      if (!this.getAttribute('y').hasValue()) {\n        this.getAttribute('y', true).setValue(0);\n      }\n\n      ctx.translate(this.getAttribute('x').getPixels('x'), this.getAttribute('y').getPixels('y'));\n      var _screen$viewPort = screen.viewPort,\n          width = _screen$viewPort.width,\n          height = _screen$viewPort.height;\n\n      if (!this.getAttribute('width').hasValue()) {\n        this.getAttribute('width', true).setValue('100%');\n      }\n\n      if (!this.getAttribute('height').hasValue()) {\n        this.getAttribute('height', true).setValue('100%');\n      }\n\n      var refXAttr = this.getAttribute('refX');\n      var refYAttr = this.getAttribute('refY');\n      var viewBoxAttr = this.getAttribute('viewBox');\n      var viewBox = viewBoxAttr.hasValue() ? toNumbers(viewBoxAttr.getString()) : null;\n      var clip = !this.root && this.getAttribute('overflow').getValue('hidden') !== 'visible';\n      var minX = 0;\n      var minY = 0;\n      var clipX = 0;\n      var clipY = 0;\n\n      if (viewBox) {\n        minX = viewBox[0];\n        minY = viewBox[1];\n      }\n\n      if (!this.root) {\n        width = this.getAttribute('width').getPixels('x');\n        height = this.getAttribute('height').getPixels('y');\n\n        if (this.type === 'marker') {\n          clipX = minX;\n          clipY = minY;\n          minX = 0;\n          minY = 0;\n        }\n      }\n\n      screen.viewPort.setCurrent(width, height);\n\n      if (viewBox) {\n        width = viewBox[2];\n        height = viewBox[3];\n      }\n\n      document.setViewBox({\n        ctx: ctx,\n        aspectRatio: this.getAttribute('preserveAspectRatio').getString(),\n        width: screen.viewPort.width,\n        desiredWidth: width,\n        height: screen.viewPort.height,\n        desiredHeight: height,\n        minX: minX,\n        minY: minY,\n        refX: refXAttr.getValue(),\n        refY: refYAttr.getValue(),\n        clip: clip,\n        clipX: clipX,\n        clipY: clipY\n      });\n\n      if (viewBox) {\n        screen.viewPort.removeCurrent();\n        screen.viewPort.setCurrent(width, height);\n      }\n    }\n    /**\n     * Resize SVG to fit in given size.\n     * @param width\n     * @param height\n     * @param preserveAspectRatio\n     */\n\n  }, {\n    key: \"resize\",\n    value: function resize(width) {\n      var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : width;\n      var preserveAspectRatio = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n      var widthAttr = this.getAttribute('width', true);\n      var heightAttr = this.getAttribute('height', true);\n      var viewBoxAttr = this.getAttribute('viewBox');\n      var styleAttr = this.getAttribute('style');\n      var originWidth = widthAttr.getNumber(0);\n      var originHeight = heightAttr.getNumber(0);\n\n      if (preserveAspectRatio) {\n        if (typeof preserveAspectRatio === 'string') {\n          this.getAttribute('preserveAspectRatio', true).setValue(preserveAspectRatio);\n        } else {\n          var preserveAspectRatioAttr = this.getAttribute('preserveAspectRatio');\n\n          if (preserveAspectRatioAttr.hasValue()) {\n            preserveAspectRatioAttr.setValue(preserveAspectRatioAttr.getString().replace(/^\\s*(\\S.*\\S)\\s*$/, '$1'));\n          }\n        }\n      }\n\n      widthAttr.setValue(width);\n      heightAttr.setValue(height);\n\n      if (!viewBoxAttr.hasValue()) {\n        viewBoxAttr.setValue(\"0 0 \".concat(originWidth || width, \" \").concat(originHeight || height));\n      }\n\n      if (styleAttr.hasValue()) {\n        var widthStyle = this.getStyle('width');\n        var heightStyle = this.getStyle('height');\n\n        if (widthStyle.hasValue()) {\n          widthStyle.setValue(\"\".concat(width, \"px\"));\n        }\n\n        if (heightStyle.hasValue()) {\n          heightStyle.setValue(\"\".concat(height, \"px\"));\n        }\n      }\n    }\n  }]);\n\n  return SVGElement;\n}(RenderedElement);\n\nfunction _createSuper$a(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$a()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$a() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar RectElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(RectElement, _PathElement);\n\n  var _super = _createSuper$a(RectElement);\n\n  function RectElement() {\n    var _this;\n\n    _classCallCheck(this, RectElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'rect';\n    return _this;\n  }\n\n  _createClass(RectElement, [{\n    key: \"path\",\n    value: function path(ctx) {\n      var x = this.getAttribute('x').getPixels('x');\n      var y = this.getAttribute('y').getPixels('y');\n      var width = this.getAttribute('width').getPixels('x');\n      var height = this.getAttribute('height').getPixels('y');\n      var rxAttr = this.getAttribute('rx');\n      var ryAttr = this.getAttribute('ry');\n      var rx = rxAttr.getPixels('x');\n      var ry = ryAttr.getPixels('y');\n\n      if (rxAttr.hasValue() && !ryAttr.hasValue()) {\n        ry = rx;\n      }\n\n      if (ryAttr.hasValue() && !rxAttr.hasValue()) {\n        rx = ry;\n      }\n\n      rx = Math.min(rx, width / 2.0);\n      ry = Math.min(ry, height / 2.0);\n\n      if (ctx) {\n        var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\n        ctx.beginPath(); // always start the path so we don't fill prior paths\n\n        if (height > 0 && width > 0) {\n          ctx.moveTo(x + rx, y);\n          ctx.lineTo(x + width - rx, y);\n          ctx.bezierCurveTo(x + width - rx + KAPPA * rx, y, x + width, y + ry - KAPPA * ry, x + width, y + ry);\n          ctx.lineTo(x + width, y + height - ry);\n          ctx.bezierCurveTo(x + width, y + height - ry + KAPPA * ry, x + width - rx + KAPPA * rx, y + height, x + width - rx, y + height);\n          ctx.lineTo(x + rx, y + height);\n          ctx.bezierCurveTo(x + rx - KAPPA * rx, y + height, x, y + height - ry + KAPPA * ry, x, y + height - ry);\n          ctx.lineTo(x, y + ry);\n          ctx.bezierCurveTo(x, y + ry - KAPPA * ry, x + rx - KAPPA * rx, y, x + rx, y);\n          ctx.closePath();\n        }\n      }\n\n      return new BoundingBox(x, y, x + width, y + height);\n    }\n  }, {\n    key: \"getMarkers\",\n    value: function getMarkers() {\n      return null;\n    }\n  }]);\n\n  return RectElement;\n}(PathElement);\n\nfunction _createSuper$b(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$b()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$b() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar CircleElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(CircleElement, _PathElement);\n\n  var _super = _createSuper$b(CircleElement);\n\n  function CircleElement() {\n    var _this;\n\n    _classCallCheck(this, CircleElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'circle';\n    return _this;\n  }\n\n  _createClass(CircleElement, [{\n    key: \"path\",\n    value: function path(ctx) {\n      var cx = this.getAttribute('cx').getPixels('x');\n      var cy = this.getAttribute('cy').getPixels('y');\n      var r = this.getAttribute('r').getPixels();\n\n      if (ctx && r > 0) {\n        ctx.beginPath();\n        ctx.arc(cx, cy, r, 0, Math.PI * 2, false);\n        ctx.closePath();\n      }\n\n      return new BoundingBox(cx - r, cy - r, cx + r, cy + r);\n    }\n  }, {\n    key: \"getMarkers\",\n    value: function getMarkers() {\n      return null;\n    }\n  }]);\n\n  return CircleElement;\n}(PathElement);\n\nfunction _createSuper$c(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$c()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$c() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar EllipseElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(EllipseElement, _PathElement);\n\n  var _super = _createSuper$c(EllipseElement);\n\n  function EllipseElement() {\n    var _this;\n\n    _classCallCheck(this, EllipseElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'ellipse';\n    return _this;\n  }\n\n  _createClass(EllipseElement, [{\n    key: \"path\",\n    value: function path(ctx) {\n      var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\n      var rx = this.getAttribute('rx').getPixels('x');\n      var ry = this.getAttribute('ry').getPixels('y');\n      var cx = this.getAttribute('cx').getPixels('x');\n      var cy = this.getAttribute('cy').getPixels('y');\n\n      if (ctx) {\n        ctx.beginPath();\n        ctx.moveTo(cx + rx, cy);\n        ctx.bezierCurveTo(cx + rx, cy + KAPPA * ry, cx + KAPPA * rx, cy + ry, cx, cy + ry);\n        ctx.bezierCurveTo(cx - KAPPA * rx, cy + ry, cx - rx, cy + KAPPA * ry, cx - rx, cy);\n        ctx.bezierCurveTo(cx - rx, cy - KAPPA * ry, cx - KAPPA * rx, cy - ry, cx, cy - ry);\n        ctx.bezierCurveTo(cx + KAPPA * rx, cy - ry, cx + rx, cy - KAPPA * ry, cx + rx, cy);\n        ctx.closePath();\n      }\n\n      return new BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);\n    }\n  }, {\n    key: \"getMarkers\",\n    value: function getMarkers() {\n      return null;\n    }\n  }]);\n\n  return EllipseElement;\n}(PathElement);\n\nfunction _createSuper$d(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$d()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$d() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar LineElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(LineElement, _PathElement);\n\n  var _super = _createSuper$d(LineElement);\n\n  function LineElement() {\n    var _this;\n\n    _classCallCheck(this, LineElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'line';\n    return _this;\n  }\n\n  _createClass(LineElement, [{\n    key: \"getPoints\",\n    value: function getPoints() {\n      return [new Point(this.getAttribute('x1').getPixels('x'), this.getAttribute('y1').getPixels('y')), new Point(this.getAttribute('x2').getPixels('x'), this.getAttribute('y2').getPixels('y'))];\n    }\n  }, {\n    key: \"path\",\n    value: function path(ctx) {\n      var _this$getPoints = this.getPoints(),\n          _this$getPoints2 = _slicedToArray(_this$getPoints, 2),\n          _this$getPoints2$ = _this$getPoints2[0],\n          x0 = _this$getPoints2$.x,\n          y0 = _this$getPoints2$.y,\n          _this$getPoints2$2 = _this$getPoints2[1],\n          x1 = _this$getPoints2$2.x,\n          y1 = _this$getPoints2$2.y;\n\n      if (ctx) {\n        ctx.beginPath();\n        ctx.moveTo(x0, y0);\n        ctx.lineTo(x1, y1);\n      }\n\n      return new BoundingBox(x0, y0, x1, y1);\n    }\n  }, {\n    key: \"getMarkers\",\n    value: function getMarkers() {\n      var _this$getPoints3 = this.getPoints(),\n          _this$getPoints4 = _slicedToArray(_this$getPoints3, 2),\n          p0 = _this$getPoints4[0],\n          p1 = _this$getPoints4[1];\n\n      var a = p0.angleTo(p1);\n      return [[p0, a], [p1, a]];\n    }\n  }]);\n\n  return LineElement;\n}(PathElement);\n\nfunction _createSuper$e(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$e()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$e() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar PolylineElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(PolylineElement, _PathElement);\n\n  var _super = _createSuper$e(PolylineElement);\n\n  function PolylineElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, PolylineElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'polyline';\n    _this.points = [];\n    _this.points = Point.parsePath(_this.getAttribute('points').getString());\n    return _this;\n  }\n\n  _createClass(PolylineElement, [{\n    key: \"path\",\n    value: function path(ctx) {\n      var points = this.points;\n\n      var _points = _slicedToArray(points, 1),\n          _points$ = _points[0],\n          x0 = _points$.x,\n          y0 = _points$.y;\n\n      var boundingBox = new BoundingBox(x0, y0);\n\n      if (ctx) {\n        ctx.beginPath();\n        ctx.moveTo(x0, y0);\n      }\n\n      points.forEach(function (_ref) {\n        var x = _ref.x,\n            y = _ref.y;\n        boundingBox.addPoint(x, y);\n\n        if (ctx) {\n          ctx.lineTo(x, y);\n        }\n      });\n      return boundingBox;\n    }\n  }, {\n    key: \"getMarkers\",\n    value: function getMarkers() {\n      var points = this.points;\n      var lastIndex = points.length - 1;\n      var markers = [];\n      points.forEach(function (point, i) {\n        if (i === lastIndex) {\n          return;\n        }\n\n        markers.push([point, point.angleTo(points[i + 1])]);\n      });\n\n      if (markers.length > 0) {\n        markers.push([points[points.length - 1], markers[markers.length - 1][1]]);\n      }\n\n      return markers;\n    }\n  }]);\n\n  return PolylineElement;\n}(PathElement);\n\nfunction _createSuper$f(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$f()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$f() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar PolygonElement = /*#__PURE__*/function (_PolylineElement) {\n  _inherits(PolygonElement, _PolylineElement);\n\n  var _super = _createSuper$f(PolygonElement);\n\n  function PolygonElement() {\n    var _this;\n\n    _classCallCheck(this, PolygonElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'polygon';\n    return _this;\n  }\n\n  _createClass(PolygonElement, [{\n    key: \"path\",\n    value: function path(ctx) {\n      var boundingBox = _get(_getPrototypeOf(PolygonElement.prototype), \"path\", this).call(this, ctx);\n\n      var _this$points = _slicedToArray(this.points, 1),\n          _this$points$ = _this$points[0],\n          x = _this$points$.x,\n          y = _this$points$.y;\n\n      if (ctx) {\n        ctx.lineTo(x, y);\n        ctx.closePath();\n      }\n\n      return boundingBox;\n    }\n  }]);\n\n  return PolygonElement;\n}(PolylineElement);\n\nfunction _createSuper$g(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$g()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$g() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar PatternElement = /*#__PURE__*/function (_Element) {\n  _inherits(PatternElement, _Element);\n\n  var _super = _createSuper$g(PatternElement);\n\n  function PatternElement() {\n    var _this;\n\n    _classCallCheck(this, PatternElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'pattern';\n    return _this;\n  }\n\n  _createClass(PatternElement, [{\n    key: \"createPattern\",\n    value: function createPattern(ctx, _, parentOpacityProp) {\n      var width = this.getAttribute('width').getPixels('x', true);\n      var height = this.getAttribute('height').getPixels('y', true); // render me using a temporary svg element\n\n      var patternSvg = new SVGElement(this.document, null);\n      patternSvg.attributes.viewBox = new Property(this.document, 'viewBox', this.getAttribute('viewBox').getValue());\n      patternSvg.attributes.width = new Property(this.document, 'width', \"\".concat(width, \"px\"));\n      patternSvg.attributes.height = new Property(this.document, 'height', \"\".concat(height, \"px\"));\n      patternSvg.attributes.transform = new Property(this.document, 'transform', this.getAttribute('patternTransform').getValue());\n      patternSvg.children = this.children;\n      var patternCanvas = this.document.createCanvas(width, height);\n      var patternCtx = patternCanvas.getContext('2d');\n      var xAttr = this.getAttribute('x');\n      var yAttr = this.getAttribute('y');\n\n      if (xAttr.hasValue() && yAttr.hasValue()) {\n        patternCtx.translate(xAttr.getPixels('x', true), yAttr.getPixels('y', true));\n      }\n\n      if (parentOpacityProp.hasValue()) {\n        this.styles['fill-opacity'] = parentOpacityProp;\n      } else {\n        Reflect.deleteProperty(this.styles, 'fill-opacity');\n      } // render 3x3 grid so when we transform there's no white space on edges\n\n\n      for (var x = -1; x <= 1; x++) {\n        for (var y = -1; y <= 1; y++) {\n          patternCtx.save();\n          patternSvg.attributes.x = new Property(this.document, 'x', x * patternCanvas.width);\n          patternSvg.attributes.y = new Property(this.document, 'y', y * patternCanvas.height);\n          patternSvg.render(patternCtx);\n          patternCtx.restore();\n        }\n      }\n\n      var pattern = ctx.createPattern(patternCanvas, 'repeat');\n      return pattern;\n    }\n  }]);\n\n  return PatternElement;\n}(Element);\n\nfunction _createSuper$h(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$h()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$h() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar MarkerElement = /*#__PURE__*/function (_Element) {\n  _inherits(MarkerElement, _Element);\n\n  var _super = _createSuper$h(MarkerElement);\n\n  function MarkerElement() {\n    var _this;\n\n    _classCallCheck(this, MarkerElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'marker';\n    return _this;\n  }\n\n  _createClass(MarkerElement, [{\n    key: \"render\",\n    value: function render(ctx, point, angle) {\n      if (!point) {\n        return;\n      }\n\n      var x = point.x,\n          y = point.y;\n      var orient = this.getAttribute('orient').getValue('auto');\n      var markerUnits = this.getAttribute('markerUnits').getValue('strokeWidth');\n      ctx.translate(x, y);\n\n      if (orient === 'auto') {\n        ctx.rotate(angle);\n      }\n\n      if (markerUnits === 'strokeWidth') {\n        ctx.scale(ctx.lineWidth, ctx.lineWidth);\n      }\n\n      ctx.save(); // render me using a temporary svg element\n\n      var markerSvg = new SVGElement(this.document, null);\n      markerSvg.type = this.type;\n      markerSvg.attributes.viewBox = new Property(this.document, 'viewBox', this.getAttribute('viewBox').getValue());\n      markerSvg.attributes.refX = new Property(this.document, 'refX', this.getAttribute('refX').getValue());\n      markerSvg.attributes.refY = new Property(this.document, 'refY', this.getAttribute('refY').getValue());\n      markerSvg.attributes.width = new Property(this.document, 'width', this.getAttribute('markerWidth').getValue());\n      markerSvg.attributes.height = new Property(this.document, 'height', this.getAttribute('markerHeight').getValue());\n      markerSvg.attributes.overflow = new Property(this.document, 'overflow', this.getAttribute('overflow').getValue());\n      markerSvg.attributes.fill = new Property(this.document, 'fill', this.getAttribute('fill').getValue('black'));\n      markerSvg.attributes.stroke = new Property(this.document, 'stroke', this.getAttribute('stroke').getValue('none'));\n      markerSvg.children = this.children;\n      markerSvg.render(ctx);\n      ctx.restore();\n\n      if (markerUnits === 'strokeWidth') {\n        ctx.scale(1 / ctx.lineWidth, 1 / ctx.lineWidth);\n      }\n\n      if (orient === 'auto') {\n        ctx.rotate(-angle);\n      }\n\n      ctx.translate(-x, -y);\n    }\n  }]);\n\n  return MarkerElement;\n}(Element);\n\nfunction _createSuper$i(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$i()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$i() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar DefsElement = /*#__PURE__*/function (_Element) {\n  _inherits(DefsElement, _Element);\n\n  var _super = _createSuper$i(DefsElement);\n\n  function DefsElement() {\n    var _this;\n\n    _classCallCheck(this, DefsElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'defs';\n    return _this;\n  }\n\n  _createClass(DefsElement, [{\n    key: \"render\",\n    value: function render() {// NOOP\n    }\n  }]);\n\n  return DefsElement;\n}(Element);\n\nfunction _createSuper$j(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$j()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$j() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar GElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(GElement, _RenderedElement);\n\n  var _super = _createSuper$j(GElement);\n\n  function GElement() {\n    var _this;\n\n    _classCallCheck(this, GElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'g';\n    return _this;\n  }\n\n  _createClass(GElement, [{\n    key: \"getBoundingBox\",\n    value: function getBoundingBox(ctx) {\n      var boundingBox = new BoundingBox();\n      this.children.forEach(function (child) {\n        boundingBox.addBoundingBox(child.getBoundingBox(ctx));\n      });\n      return boundingBox;\n    }\n  }]);\n\n  return GElement;\n}(RenderedElement);\n\nfunction _createSuper$k(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$k()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$k() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar GradientElement = /*#__PURE__*/function (_Element) {\n  _inherits(GradientElement, _Element);\n\n  var _super = _createSuper$k(GradientElement);\n\n  function GradientElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, GradientElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.attributesToInherit = ['gradientUnits'];\n    _this.stops = [];\n\n    var _assertThisInitialize = _assertThisInitialized(_this),\n        stops = _assertThisInitialize.stops,\n        children = _assertThisInitialize.children;\n\n    children.forEach(function (child) {\n      if (child.type === 'stop') {\n        stops.push(child);\n      }\n    });\n    return _this;\n  }\n\n  _createClass(GradientElement, [{\n    key: \"getGradientUnits\",\n    value: function getGradientUnits() {\n      return this.getAttribute('gradientUnits').getString('objectBoundingBox');\n    }\n  }, {\n    key: \"createGradient\",\n    value: function createGradient(ctx, element, parentOpacityProp) {\n      var _this2 = this;\n\n      // tslint:disable-next-line: no-this-assignment\n      var stopsContainer = this;\n\n      if (this.getHrefAttribute().hasValue()) {\n        stopsContainer = this.getHrefAttribute().getDefinition();\n        this.inheritStopContainer(stopsContainer);\n      }\n\n      var _stopsContainer = stopsContainer,\n          stops = _stopsContainer.stops;\n      var gradient = this.getGradient(ctx, element);\n\n      if (!gradient) {\n        return this.addParentOpacity(parentOpacityProp, stops[stops.length - 1].color);\n      }\n\n      stops.forEach(function (stop) {\n        gradient.addColorStop(stop.offset, _this2.addParentOpacity(parentOpacityProp, stop.color));\n      });\n\n      if (this.getAttribute('gradientTransform').hasValue()) {\n        // render as transformed pattern on temporary canvas\n        var document = this.document;\n        var _document$screen = document.screen,\n            MAX_VIRTUAL_PIXELS = _document$screen.MAX_VIRTUAL_PIXELS,\n            viewPort = _document$screen.viewPort;\n\n        var _viewPort$viewPorts = _slicedToArray(viewPort.viewPorts, 1),\n            rootView = _viewPort$viewPorts[0];\n\n        var rect = new RectElement(document, null);\n        rect.attributes.x = new Property(document, 'x', -MAX_VIRTUAL_PIXELS / 3.0);\n        rect.attributes.y = new Property(document, 'y', -MAX_VIRTUAL_PIXELS / 3.0);\n        rect.attributes.width = new Property(document, 'width', MAX_VIRTUAL_PIXELS);\n        rect.attributes.height = new Property(document, 'height', MAX_VIRTUAL_PIXELS);\n        var group = new GElement(document, null);\n        group.attributes.transform = new Property(document, 'transform', this.getAttribute('gradientTransform').getValue());\n        group.children = [rect];\n        var patternSvg = new SVGElement(document, null);\n        patternSvg.attributes.x = new Property(document, 'x', 0);\n        patternSvg.attributes.y = new Property(document, 'y', 0);\n        patternSvg.attributes.width = new Property(document, 'width', rootView.width);\n        patternSvg.attributes.height = new Property(document, 'height', rootView.height);\n        patternSvg.children = [group];\n        var patternCanvas = document.createCanvas(rootView.width, rootView.height);\n        var patternCtx = patternCanvas.getContext('2d');\n        patternCtx.fillStyle = gradient;\n        patternSvg.render(patternCtx);\n        return patternCtx.createPattern(patternCanvas, 'no-repeat');\n      }\n\n      return gradient;\n    }\n  }, {\n    key: \"inheritStopContainer\",\n    value: function inheritStopContainer(stopsContainer) {\n      var _this3 = this;\n\n      this.attributesToInherit.forEach(function (attributeToInherit) {\n        if (!_this3.getAttribute(attributeToInherit).hasValue() && stopsContainer.getAttribute(attributeToInherit).hasValue()) {\n          _this3.getAttribute(attributeToInherit, true).setValue(stopsContainer.getAttribute(attributeToInherit).getValue());\n        }\n      });\n    }\n  }, {\n    key: \"addParentOpacity\",\n    value: function addParentOpacity(parentOpacityProp, color) {\n      if (parentOpacityProp.hasValue()) {\n        var colorProp = new Property(this.document, 'color', color);\n        return colorProp.addOpacity(parentOpacityProp).getString();\n      }\n\n      return color;\n    }\n  }]);\n\n  return GradientElement;\n}(Element);\n\nfunction _createSuper$l(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$l()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$l() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar LinearGradientElement = /*#__PURE__*/function (_GradientElement) {\n  _inherits(LinearGradientElement, _GradientElement);\n\n  var _super = _createSuper$l(LinearGradientElement);\n\n  function LinearGradientElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, LinearGradientElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'linearGradient';\n\n    _this.attributesToInherit.push('x1', 'y1', 'x2', 'y2');\n\n    return _this;\n  }\n\n  _createClass(LinearGradientElement, [{\n    key: \"getGradient\",\n    value: function getGradient(ctx, element) {\n      var boundingBox = this.getGradientUnits() === 'objectBoundingBox' ? element.getBoundingBox(ctx) : null;\n\n      if (!this.getAttribute('x1').hasValue() && !this.getAttribute('y1').hasValue() && !this.getAttribute('x2').hasValue() && !this.getAttribute('y2').hasValue()) {\n        this.getAttribute('x1', true).setValue(0);\n        this.getAttribute('y1', true).setValue(0);\n        this.getAttribute('x2', true).setValue(1);\n        this.getAttribute('y2', true).setValue(0);\n      }\n\n      var x1 = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.x + boundingBox.width * this.getAttribute('x1').getNumber() : this.getAttribute('x1').getPixels('x');\n      var y1 = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.y + boundingBox.height * this.getAttribute('y1').getNumber() : this.getAttribute('y1').getPixels('y');\n      var x2 = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.x + boundingBox.width * this.getAttribute('x2').getNumber() : this.getAttribute('x2').getPixels('x');\n      var y2 = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.y + boundingBox.height * this.getAttribute('y2').getNumber() : this.getAttribute('y2').getPixels('y');\n\n      if (x1 === x2 && y1 === y2) {\n        return null;\n      }\n\n      return ctx.createLinearGradient(x1, y1, x2, y2);\n    }\n  }]);\n\n  return LinearGradientElement;\n}(GradientElement);\n\nfunction _createSuper$m(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$m()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$m() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar RadialGradientElement = /*#__PURE__*/function (_GradientElement) {\n  _inherits(RadialGradientElement, _GradientElement);\n\n  var _super = _createSuper$m(RadialGradientElement);\n\n  function RadialGradientElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, RadialGradientElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'radialGradient';\n\n    _this.attributesToInherit.push('cx', 'cy', 'r', 'fx', 'fy', 'fr');\n\n    return _this;\n  }\n\n  _createClass(RadialGradientElement, [{\n    key: \"getGradient\",\n    value: function getGradient(ctx, element) {\n      var boundingBox = element.getBoundingBox(ctx);\n\n      if (!this.getAttribute('cx').hasValue()) {\n        this.getAttribute('cx', true).setValue('50%');\n      }\n\n      if (!this.getAttribute('cy').hasValue()) {\n        this.getAttribute('cy', true).setValue('50%');\n      }\n\n      if (!this.getAttribute('r').hasValue()) {\n        this.getAttribute('r', true).setValue('50%');\n      }\n\n      var cx = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.x + boundingBox.width * this.getAttribute('cx').getNumber() : this.getAttribute('cx').getPixels('x');\n      var cy = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.y + boundingBox.height * this.getAttribute('cy').getNumber() : this.getAttribute('cy').getPixels('y');\n      var fx = cx;\n      var fy = cy;\n\n      if (this.getAttribute('fx').hasValue()) {\n        fx = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.x + boundingBox.width * this.getAttribute('fx').getNumber() : this.getAttribute('fx').getPixels('x');\n      }\n\n      if (this.getAttribute('fy').hasValue()) {\n        fy = this.getGradientUnits() === 'objectBoundingBox' ? boundingBox.y + boundingBox.height * this.getAttribute('fy').getNumber() : this.getAttribute('fy').getPixels('y');\n      }\n\n      var r = this.getGradientUnits() === 'objectBoundingBox' ? (boundingBox.width + boundingBox.height) / 2.0 * this.getAttribute('r').getNumber() : this.getAttribute('r').getPixels();\n      var fr = this.getAttribute('fr').getPixels();\n      return ctx.createRadialGradient(fx, fy, fr, cx, cy, r);\n    }\n  }]);\n\n  return RadialGradientElement;\n}(GradientElement);\n\nfunction _createSuper$n(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$n()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$n() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar StopElement = /*#__PURE__*/function (_Element) {\n  _inherits(StopElement, _Element);\n\n  var _super = _createSuper$n(StopElement);\n\n  function StopElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, StopElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'stop';\n    var offset = Math.max(0, Math.min(1, _this.getAttribute('offset').getNumber()));\n\n    var stopOpacity = _this.getStyle('stop-opacity');\n\n    var stopColor = _this.getStyle('stop-color', true);\n\n    if (stopColor.getString() === '') {\n      stopColor.setValue('#000');\n    }\n\n    if (stopOpacity.hasValue()) {\n      stopColor = stopColor.addOpacity(stopOpacity);\n    }\n\n    _this.offset = offset;\n    _this.color = stopColor.getString();\n    return _this;\n  }\n\n  return StopElement;\n}(Element);\n\nfunction _createSuper$o(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$o()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$o() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar AnimateElement = /*#__PURE__*/function (_Element) {\n  _inherits(AnimateElement, _Element);\n\n  var _super = _createSuper$o(AnimateElement);\n\n  function AnimateElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, AnimateElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'animate';\n    _this.duration = 0;\n    _this.initialValue = null;\n    _this.initialUnits = '';\n    _this.removed = false;\n    _this.frozen = false;\n    document.screen.animations.push(_assertThisInitialized(_this));\n    _this.begin = _this.getAttribute('begin').getMilliseconds();\n    _this.maxDuration = _this.begin + _this.getAttribute('dur').getMilliseconds();\n    _this.from = _this.getAttribute('from');\n    _this.to = _this.getAttribute('to');\n    _this.values = _this.getAttribute('values');\n\n    if (_this.values.hasValue()) {\n      _this.values.setValue(_this.values.getString().split(';'));\n    }\n\n    return _this;\n  }\n\n  _createClass(AnimateElement, [{\n    key: \"getProperty\",\n    value: function getProperty() {\n      var attributeType = this.getAttribute('attributeType').getString();\n      var attributeName = this.getAttribute('attributeName').getString();\n\n      if (attributeType === 'CSS') {\n        return this.parent.getStyle(attributeName, true);\n      }\n\n      return this.parent.getAttribute(attributeName, true);\n    }\n  }, {\n    key: \"calcValue\",\n    value: function calcValue() {\n      var initialUnits = this.initialUnits;\n\n      var _this$getProgress = this.getProgress(),\n          progress = _this$getProgress.progress,\n          from = _this$getProgress.from,\n          to = _this$getProgress.to; // tween value linearly\n\n\n      var newValue = from.getNumber() + (to.getNumber() - from.getNumber()) * progress;\n\n      if (initialUnits === '%') {\n        newValue *= 100.0; // numValue() returns 0-1 whereas properties are 0-100\n      }\n\n      return \"\".concat(newValue).concat(initialUnits);\n    }\n  }, {\n    key: \"update\",\n    value: function update(delta) {\n      var parent = this.parent;\n      var prop = this.getProperty(); // set initial value\n\n      if (!this.initialValue) {\n        this.initialValue = prop.getString();\n        this.initialUnits = prop.getUnits();\n      } // if we're past the end time\n\n\n      if (this.duration > this.maxDuration) {\n        var fill = this.getAttribute('fill').getString('remove'); // loop for indefinitely repeating animations\n\n        if (this.getAttribute('repeatCount').getString() === 'indefinite' || this.getAttribute('repeatDur').getString() === 'indefinite') {\n          this.duration = 0;\n        } else if (fill === 'freeze' && !this.frozen) {\n          this.frozen = true;\n          parent.animationFrozen = true;\n          parent.animationFrozenValue = prop.getString();\n        } else if (fill === 'remove' && !this.removed) {\n          this.removed = true;\n          prop.setValue(parent.animationFrozen ? parent.animationFrozenValue : this.initialValue);\n          return true;\n        }\n\n        return false;\n      }\n\n      this.duration += delta; // if we're past the begin time\n\n      var updated = false;\n\n      if (this.begin < this.duration) {\n        var newValue = this.calcValue(); // tween\n\n        var typeAttr = this.getAttribute('type');\n\n        if (typeAttr.hasValue()) {\n          // for transform, etc.\n          var type = typeAttr.getString();\n          newValue = \"\".concat(type, \"(\").concat(newValue, \")\");\n        }\n\n        prop.setValue(newValue);\n        updated = true;\n      }\n\n      return updated;\n    }\n  }, {\n    key: \"getProgress\",\n    value: function getProgress() {\n      var document = this.document,\n          values = this.values;\n      var result = {\n        progress: (this.duration - this.begin) / (this.maxDuration - this.begin)\n      };\n\n      if (values.hasValue()) {\n        var p = result.progress * (values.getValue().length - 1);\n        var lb = Math.floor(p);\n        var ub = Math.ceil(p);\n        result.from = new Property(document, 'from', parseFloat(values.getValue()[lb]));\n        result.to = new Property(document, 'to', parseFloat(values.getValue()[ub]));\n        result.progress = (p - lb) / (ub - lb);\n      } else {\n        result.from = this.from;\n        result.to = this.to;\n      }\n\n      return result;\n    }\n  }]);\n\n  return AnimateElement;\n}(Element);\n\nfunction _createSuper$p(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$p()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$p() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar AnimateColorElement = /*#__PURE__*/function (_AnimateElement) {\n  _inherits(AnimateColorElement, _AnimateElement);\n\n  var _super = _createSuper$p(AnimateColorElement);\n\n  function AnimateColorElement() {\n    var _this;\n\n    _classCallCheck(this, AnimateColorElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'animateColor';\n    return _this;\n  }\n\n  _createClass(AnimateColorElement, [{\n    key: \"calcValue\",\n    value: function calcValue() {\n      var _this$getProgress = this.getProgress(),\n          progress = _this$getProgress.progress,\n          from = _this$getProgress.from,\n          to = _this$getProgress.to;\n\n      var colorFrom = new RGBColor(from.getString());\n      var colorTo = new RGBColor(to.getString());\n\n      if (colorFrom.ok && colorTo.ok) {\n        // tween color linearly\n        var r = colorFrom.r + (colorTo.r - colorFrom.r) * progress;\n        var g = colorFrom.g + (colorTo.g - colorFrom.g) * progress;\n        var b = colorFrom.b + (colorTo.b - colorFrom.b) * progress; // ? alpha\n\n        return \"rgb(\".concat(parseInt(r, 10), \", \").concat(parseInt(g, 10), \", \").concat(parseInt(b, 10), \")\");\n      }\n\n      return this.getAttribute('from').getString();\n    }\n  }]);\n\n  return AnimateColorElement;\n}(AnimateElement);\n\nfunction _createSuper$q(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$q()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$q() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar AnimateTransformElement = /*#__PURE__*/function (_AnimateElement) {\n  _inherits(AnimateTransformElement, _AnimateElement);\n\n  var _super = _createSuper$q(AnimateTransformElement);\n\n  function AnimateTransformElement() {\n    var _this;\n\n    _classCallCheck(this, AnimateTransformElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'animateTransform';\n    return _this;\n  }\n\n  _createClass(AnimateTransformElement, [{\n    key: \"calcValue\",\n    value: function calcValue() {\n      var _this$getProgress = this.getProgress(),\n          progress = _this$getProgress.progress,\n          from = _this$getProgress.from,\n          to = _this$getProgress.to; // tween value linearly\n\n\n      var transformFrom = toNumbers(from.getString());\n      var transformTo = toNumbers(to.getString());\n      var newValue = transformFrom.map(function (from, i) {\n        var to = transformTo[i];\n        return from + (to - from) * progress;\n      }).join(' ');\n      return newValue;\n    }\n  }]);\n\n  return AnimateTransformElement;\n}(AnimateElement);\n\nfunction _createForOfIteratorHelper(o) { if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\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(n); 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 _createSuper$r(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$r()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$r() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FontElement = /*#__PURE__*/function (_Element) {\n  _inherits(FontElement, _Element);\n\n  var _super = _createSuper$r(FontElement);\n\n  function FontElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, FontElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'font';\n    _this.glyphs = {};\n    _this.horizAdvX = _this.getAttribute('horiz-adv-x').getNumber();\n    var definitions = document.definitions;\n\n    var _assertThisInitialize = _assertThisInitialized(_this),\n        children = _assertThisInitialize.children;\n\n    var _iterator = _createForOfIteratorHelper(children),\n        _step;\n\n    try {\n      for (_iterator.s(); !(_step = _iterator.n()).done;) {\n        var child = _step.value;\n\n        switch (child.type) {\n          case 'font-face':\n            {\n              _this.fontFace = child;\n              var fontFamilyStyle = child.getStyle('font-family');\n\n              if (fontFamilyStyle.hasValue()) {\n                definitions[fontFamilyStyle.getString()] = _assertThisInitialized(_this);\n              }\n\n              break;\n            }\n\n          case 'missing-glyph':\n            _this.missingGlyph = child;\n            break;\n\n          case 'glyph':\n            {\n              var glyph = child;\n\n              if (glyph.arabicForm) {\n                _this.isRTL = true;\n                _this.isArabic = true;\n\n                if (typeof _this.glyphs[glyph.unicode] === 'undefined') {\n                  _this.glyphs[glyph.unicode] = {};\n                }\n\n                _this.glyphs[glyph.unicode][glyph.arabicForm] = glyph;\n              } else {\n                _this.glyphs[glyph.unicode] = glyph;\n              }\n\n              break;\n            }\n\n          default:\n        }\n      }\n    } catch (err) {\n      _iterator.e(err);\n    } finally {\n      _iterator.f();\n    }\n\n    return _this;\n  }\n\n  _createClass(FontElement, [{\n    key: \"render\",\n    value: function render() {// NO RENDER\n    }\n  }]);\n\n  return FontElement;\n}(Element);\n\nfunction _createSuper$s(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$s()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$s() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FontFaceElement = /*#__PURE__*/function (_Element) {\n  _inherits(FontFaceElement, _Element);\n\n  var _super = _createSuper$s(FontFaceElement);\n\n  function FontFaceElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, FontFaceElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'font-face';\n    _this.ascent = _this.getAttribute('ascent').getNumber();\n    _this.descent = _this.getAttribute('descent').getNumber();\n    _this.unitsPerEm = _this.getAttribute('units-per-em').getNumber();\n    return _this;\n  }\n\n  return FontFaceElement;\n}(Element);\n\nfunction _createSuper$t(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$t()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$t() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar MissingGlyphElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(MissingGlyphElement, _PathElement);\n\n  var _super = _createSuper$t(MissingGlyphElement);\n\n  function MissingGlyphElement() {\n    var _this;\n\n    _classCallCheck(this, MissingGlyphElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'missing-glyph';\n    _this.horizAdvX = 0;\n    return _this;\n  }\n\n  return MissingGlyphElement;\n}(PathElement);\n\nfunction _createSuper$u(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$u()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$u() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar GlyphElement = /*#__PURE__*/function (_PathElement) {\n  _inherits(GlyphElement, _PathElement);\n\n  var _super = _createSuper$u(GlyphElement);\n\n  function GlyphElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, GlyphElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'glyph';\n    _this.horizAdvX = _this.getAttribute('horiz-adv-x').getNumber();\n    _this.unicode = _this.getAttribute('unicode').getString();\n    _this.arabicForm = _this.getAttribute('arabic-form').getString();\n    return _this;\n  }\n\n  return GlyphElement;\n}(PathElement);\n\nfunction _createSuper$v(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$v()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$v() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar TRefElement = /*#__PURE__*/function (_TextElement) {\n  _inherits(TRefElement, _TextElement);\n\n  var _super = _createSuper$v(TRefElement);\n\n  function TRefElement() {\n    var _this;\n\n    _classCallCheck(this, TRefElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'tref';\n    return _this;\n  }\n\n  _createClass(TRefElement, [{\n    key: \"getText\",\n    value: function getText() {\n      var element = this.getHrefAttribute().getDefinition();\n\n      if (element) {\n        var firstChild = element.children[0];\n\n        if (firstChild) {\n          return firstChild.getText();\n        }\n      }\n\n      return '';\n    }\n  }]);\n\n  return TRefElement;\n}(TextElement);\n\nfunction _createSuper$w(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$w()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$w() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar AElement = /*#__PURE__*/function (_TextElement) {\n  _inherits(AElement, _TextElement);\n\n  var _super = _createSuper$w(AElement);\n\n  function AElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, AElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'a';\n    var childNodes = node.childNodes;\n    var firstChild = childNodes[0];\n    var hasText = childNodes.length > 0 && Array.from(childNodes).every(function (node) {\n      return node.nodeType === 3;\n    });\n    _this.hasText = hasText;\n    _this.text = hasText ? _this.getTextFromNode(firstChild) : '';\n    return _this;\n  }\n\n  _createClass(AElement, [{\n    key: \"getText\",\n    value: function getText() {\n      return this.text;\n    }\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      if (this.hasText) {\n        // render as text element\n        _get(_getPrototypeOf(AElement.prototype), \"renderChildren\", this).call(this, ctx);\n\n        var document = this.document,\n            x = this.x,\n            y = this.y;\n        var mouse = document.screen.mouse;\n        var fontSize = new Property(document, 'fontSize', Font.parse(document.ctx.font).fontSize); // Do not calc bounding box if mouse is not working.\n\n        if (mouse.isWorking()) {\n          mouse.checkBoundingBox(this, new BoundingBox(x, y - fontSize.getPixels('y'), x + this.measureText(ctx), y));\n        }\n      } else if (this.children.length > 0) {\n        // render as temporary group\n        var g = new GElement(this.document, null);\n        g.children = this.children;\n        g.parent = this;\n        g.render(ctx);\n      }\n    }\n  }, {\n    key: \"onClick\",\n    value: function onClick() {\n      var window = this.document.window;\n\n      if (window) {\n        window.open(this.getHrefAttribute().getString());\n      }\n    }\n  }, {\n    key: \"onMouseMove\",\n    value: function onMouseMove() {\n      var ctx = this.document.ctx;\n      ctx.canvas.style.cursor = 'pointer';\n    }\n  }]);\n\n  return AElement;\n}(TextElement);\n\nfunction _createForOfIteratorHelper$1(o) { if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$1(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$1(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(n); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); }\n\nfunction _arrayLikeToArray$1(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 _createSuper$x(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$x()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$x() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar TextPathElement = /*#__PURE__*/function (_TextElement) {\n  _inherits(TextPathElement, _TextElement);\n\n  var _super = _createSuper$x(TextPathElement);\n\n  function TextPathElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, TextPathElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'textPath';\n    _this.textWidth = 0;\n    _this.textHeight = 0;\n    _this.pathLength = -1;\n    _this.glyphInfo = null;\n    _this.letterSpacingCache = [];\n    _this.measuresCache = new Map([['', 0]]);\n\n    var pathElement = _this.getHrefAttribute().getDefinition();\n\n    _this.text = _this.getTextFromNode();\n    _this.dataArray = _this.parsePathData(pathElement);\n    return _this;\n  }\n\n  _createClass(TextPathElement, [{\n    key: \"getText\",\n    value: function getText() {\n      return this.text;\n    }\n  }, {\n    key: \"path\",\n    value: function path(ctx) {\n      var dataArray = this.dataArray;\n\n      if (ctx) {\n        ctx.beginPath();\n      }\n\n      dataArray.forEach(function (_ref) {\n        var command = _ref.command,\n            points = _ref.points;\n\n        switch (command) {\n          case 'L':\n            if (ctx) {\n              ctx.lineTo(points[0], points[1]);\n            }\n\n            break;\n\n          case 'M':\n            if (ctx) {\n              ctx.moveTo(points[0], points[1]);\n            }\n\n            break;\n\n          case 'C':\n            if (ctx) {\n              ctx.bezierCurveTo(points[0], points[1], points[2], points[3], points[4], points[5]);\n            }\n\n            break;\n\n          case 'Q':\n            if (ctx) {\n              ctx.quadraticCurveTo(points[0], points[1], points[2], points[3]);\n            }\n\n            break;\n\n          case 'A':\n            {\n              var cx = points[0];\n              var cy = points[1];\n              var rx = points[2];\n              var ry = points[3];\n              var theta = points[4];\n              var dTheta = points[5];\n              var psi = points[6];\n              var fs = points[7];\n              var r = rx > ry ? rx : ry;\n              var scaleX = rx > ry ? 1 : rx / ry;\n              var scaleY = rx > ry ? ry / rx : 1;\n\n              if (ctx) {\n                ctx.translate(cx, cy);\n                ctx.rotate(psi);\n                ctx.scale(scaleX, scaleY);\n                ctx.arc(0, 0, r, theta, theta + dTheta, Boolean(1 - fs));\n                ctx.scale(1 / scaleX, 1 / scaleY);\n                ctx.rotate(-psi);\n                ctx.translate(-cx, -cy);\n              }\n\n              break;\n            }\n\n          case 'z':\n            if (ctx) {\n              ctx.closePath();\n            }\n\n            break;\n        }\n      });\n    }\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      this.setTextData(ctx);\n      ctx.save();\n      var textDecoration = this.parent.getStyle('text-decoration').getString();\n      var fontSize = this.getFontSize();\n      var glyphInfo = this.glyphInfo;\n      var fill = ctx.fillStyle;\n\n      if (textDecoration === 'underline') {\n        ctx.beginPath();\n      }\n\n      glyphInfo.forEach(function (glyph, i) {\n        var p0 = glyph.p0,\n            p1 = glyph.p1,\n            partialText = glyph.text;\n        ctx.save();\n        ctx.translate(p0.x, p0.y);\n        ctx.rotate(glyphInfo[i].rotation);\n\n        if (ctx.fillStyle) {\n          ctx.fillText(partialText, 0, 0);\n        }\n\n        if (ctx.strokeStyle) {\n          ctx.strokeText(partialText, 0, 0);\n        }\n\n        ctx.restore();\n\n        if (textDecoration === 'underline') {\n          if (i === 0) {\n            ctx.moveTo(p0.x, p0.y + fontSize / 8);\n          }\n\n          ctx.lineTo(p1.x, p1.y + fontSize / 5);\n        } //// To assist with debugging visually, uncomment following\n        //\n        // ctx.beginPath();\n        // if (i % 2)\n        // \tctx.strokeStyle = 'red';\n        // else\n        // \tctx.strokeStyle = 'green';\n        // ctx.moveTo(p0.x, p0.y);\n        // ctx.lineTo(p1.x, p1.y);\n        // ctx.stroke();\n        // ctx.closePath();\n\n      });\n\n      if (textDecoration === 'underline') {\n        ctx.lineWidth = fontSize / 20;\n        ctx.strokeStyle = fill;\n        ctx.stroke();\n        ctx.closePath();\n      }\n\n      ctx.restore();\n    }\n  }, {\n    key: \"getLetterSpacingAt\",\n    value: function getLetterSpacingAt() {\n      var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n      return this.letterSpacingCache[idx] || 0;\n    }\n  }, {\n    key: \"findSegmentToFitChar\",\n    value: function findSegmentToFitChar(ctx, anchor, textFullWidth, fullPathWidth, spacesNumber, inputOffset, c, charI) {\n      var offset = inputOffset;\n      var glyphWidth = this.measureText(ctx, c);\n\n      if (c === ' ' && anchor === 'justify' && textFullWidth < fullPathWidth) {\n        glyphWidth += (fullPathWidth - textFullWidth) / spacesNumber;\n      }\n\n      if (charI > -1) {\n        offset += this.getLetterSpacingAt(charI);\n      }\n\n      var splineStep = this.textHeight / 20;\n      var segment = {\n        p0: this.getEquidistantPointOnPath(offset, splineStep),\n        p1: this.getEquidistantPointOnPath(offset + glyphWidth, splineStep)\n      };\n      offset += glyphWidth;\n      return {\n        offset: offset,\n        segment: segment\n      };\n    }\n  }, {\n    key: \"measureText\",\n    value: function measureText(ctx, text) {\n      var measuresCache = this.measuresCache;\n      var targetText = text || this.getText();\n\n      if (measuresCache.has(targetText)) {\n        return measuresCache.get(targetText);\n      }\n\n      var measure = this.measureTargetText(ctx, targetText);\n      measuresCache.set(targetText, measure);\n      return measure;\n    } // This method supposes what all custom fonts already loaded.\n    // If some font will be loaded after this method call, <textPath> will not be rendered correctly.\n    // You need to call this method manually to update glyphs cache.\n\n  }, {\n    key: \"setTextData\",\n    value: function setTextData(ctx) {\n      var _this2 = this;\n\n      if (this.glyphInfo) {\n        return;\n      }\n\n      var renderText = this.getText();\n      var chars = renderText.split('');\n      var spacesNumber = renderText.split(' ').length - 1;\n      var dx = toNumbers(this.parent.getAttribute('dx').getString('0'));\n      var anchor = this.parent.getStyle('text-anchor').getString('start');\n      var thisSpacing = this.getStyle('letter-spacing');\n      var parentSpacing = this.parent.getStyle('letter-spacing');\n      var letterSpacing = 0;\n\n      if (!thisSpacing.hasValue() || thisSpacing.getValue() === 'inherit') {\n        letterSpacing = parentSpacing.getPixels();\n      } else if (thisSpacing.hasValue()) {\n        if (thisSpacing.getValue() !== 'initial' && thisSpacing.getValue() !== 'unset') {\n          letterSpacing = thisSpacing.getPixels();\n        }\n      } // fill letter-spacing cache\n\n\n      var letterSpacingCache = [];\n      var textLen = renderText.length;\n      this.letterSpacingCache = letterSpacingCache;\n\n      for (var i = 0; i < textLen; i++) {\n        letterSpacingCache.push(typeof dx[i] !== 'undefined' ? dx[i] : letterSpacing);\n      }\n\n      var dxSum = letterSpacingCache.reduce(function (acc, cur) {\n        return acc + cur || 0;\n      }, 0);\n      this.textWidth = this.measureText(ctx);\n      this.textHeight = this.getFontSize();\n      var textFullWidth = Math.max(this.textWidth + dxSum, 0);\n      this.glyphInfo = [];\n      var fullPathWidth = this.getPathLength();\n      var startOffset = this.getStyle('startOffset').getNumber(0) * fullPathWidth;\n      var offset = 0;\n\n      if (anchor === 'middle' || anchor === 'center') {\n        offset = -textFullWidth / 2;\n      }\n\n      if (anchor === 'end' || anchor === 'right') {\n        offset = -textFullWidth;\n      }\n\n      offset += startOffset;\n      chars.forEach(function (char, i) {\n        // Find such segment what distance between p0 and p1 is approx. width of glyph\n        var _this2$findSegmentToF = _this2.findSegmentToFitChar(ctx, anchor, textFullWidth, fullPathWidth, spacesNumber, offset, char, i),\n            nextOffset = _this2$findSegmentToF.offset,\n            segment = _this2$findSegmentToF.segment;\n\n        offset = nextOffset;\n\n        if (!segment.p0 || !segment.p1) {\n          return;\n        }\n\n        var width = _this2.getLineLength(segment.p0.x, segment.p0.y, segment.p1.x, segment.p1.y); // Note: Since glyphs are rendered one at a time, any kerning pair data built into the font will not be used.\n        // Can foresee having a rough pair table built in that the developer can override as needed.\n        // Or use \"dx\" attribute of the <text> node as a naive replacement\n\n\n        var kern = 0; // placeholder for future implementation\n\n        var midpoint = _this2.getPointOnLine(kern + width / 2.0, segment.p0.x, segment.p0.y, segment.p1.x, segment.p1.y);\n\n        var rotation = Math.atan2(segment.p1.y - segment.p0.y, segment.p1.x - segment.p0.x);\n\n        _this2.glyphInfo.push({\n          transposeX: midpoint.x,\n          transposeY: midpoint.y,\n          text: chars[i],\n          p0: segment.p0,\n          p1: segment.p1,\n          rotation: rotation\n        });\n      });\n    }\n  }, {\n    key: \"parsePathData\",\n    value: function parsePathData(path) {\n      this.pathLength = -1; // reset path length\n\n      if (!path) {\n        return [];\n      }\n\n      var pathCommands = [];\n      var pathParser = path.pathParser;\n      pathParser.reset(); // convert l, H, h, V, and v to L\n\n      while (!pathParser.isEnd()) {\n        var current = pathParser.current;\n        var startX = current ? current.x : 0;\n        var startY = current ? current.y : 0;\n        var cmd = '';\n        var points = [];\n        pathParser.nextCommand();\n        var upperCommand = pathParser.command.toUpperCase();\n\n        switch (pathParser.command) {\n          case 'M':\n          case 'm':\n            cmd = this.pathM(pathParser, points);\n            break;\n\n          case 'L':\n          case 'l':\n            cmd = this.pathL(pathParser, points);\n            break;\n\n          case 'H':\n          case 'h':\n            cmd = this.pathH(pathParser, points);\n            break;\n\n          case 'V':\n          case 'v':\n            cmd = this.pathV(pathParser, points);\n            break;\n\n          case 'C':\n          case 'c':\n            this.pathC(pathParser, points);\n            break;\n\n          case 'S':\n          case 's':\n            cmd = this.pathS(pathParser, points);\n            break;\n\n          case 'Q':\n          case 'q':\n            this.pathQ(pathParser, points);\n            break;\n\n          case 'T':\n          case 't':\n            cmd = this.pathT(pathParser, points);\n            break;\n\n          case 'A':\n          case 'a':\n            points = this.pathA(pathParser);\n            break;\n\n          case 'Z':\n          case 'z':\n            pathParser.current = pathParser.start;\n            break;\n        }\n\n        if (upperCommand !== 'Z') {\n          pathCommands.push({\n            command: cmd || upperCommand,\n            points: points,\n            start: {\n              x: startX,\n              y: startY\n            },\n            pathLength: this.calcLength(startX, startY, cmd || upperCommand, points)\n          });\n        } else {\n          pathCommands.push({\n            command: 'z',\n            points: [],\n            pathLength: 0\n          });\n        }\n      }\n\n      return pathCommands;\n    }\n  }, {\n    key: \"pathM\",\n    value: function pathM(pathParser, points) {\n      var p = pathParser.getAsCurrentPoint(); // pathParser.addMarker(p);\n\n      points.push(p.x, p.y);\n      pathParser.start = pathParser.current;\n\n      while (!pathParser.isCommandOrEnd()) {\n        var _p = pathParser.getAsCurrentPoint();\n\n        points.push(_p.x, _p.y);\n        return 'L';\n      }\n    }\n  }, {\n    key: \"pathL\",\n    value: function pathL(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var p = pathParser.getAsCurrentPoint();\n        points.push(p.x, p.y);\n      }\n\n      return 'L';\n    }\n  }, {\n    key: \"pathH\",\n    value: function pathH(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = new Point((pathParser.isRelativeCommand() ? current.x : 0) + pathParser.getScalar(), current.y);\n        points.push(point.x, point.y);\n        pathParser.current = point;\n      }\n\n      return 'L';\n    }\n  }, {\n    key: \"pathV\",\n    value: function pathV(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current;\n        var point = new Point(current.x, (pathParser.isRelativeCommand() ? current.y : 0) + pathParser.getScalar());\n        points.push(point.x, point.y);\n        pathParser.current = point;\n      }\n\n      return 'L';\n    }\n  }, {\n    key: \"pathC\",\n    value: function pathC(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var point = pathParser.getPoint();\n        var controlPoint = pathParser.getAsControlPoint();\n        var currentPoint = pathParser.getAsCurrentPoint();\n        points.push(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n      }\n    }\n  }, {\n    key: \"pathS\",\n    value: function pathS(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var point = pathParser.getReflectedControlPoint();\n        var controlPoint = pathParser.getAsControlPoint();\n        var currentPoint = pathParser.getAsCurrentPoint();\n        points.push(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n      }\n\n      return 'C';\n    }\n  }, {\n    key: \"pathQ\",\n    value: function pathQ(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var controlPoint = pathParser.getAsControlPoint();\n        var currentPoint = pathParser.getAsCurrentPoint();\n        points.push(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n      }\n    }\n  }, {\n    key: \"pathT\",\n    value: function pathT(pathParser, points) {\n      while (!pathParser.isCommandOrEnd()) {\n        var controlPoint = pathParser.getReflectedControlPoint();\n        pathParser.control = controlPoint;\n        var currentPoint = pathParser.getAsCurrentPoint();\n        points.push(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n      }\n\n      return 'Q';\n    }\n  }, {\n    key: \"pathA\",\n    value: function pathA(pathParser) {\n      while (!pathParser.isCommandOrEnd()) {\n        var current = pathParser.current; // x1, y1\n\n        var rx = pathParser.getScalar();\n        var ry = pathParser.getScalar();\n        var xAxisRotation = pathParser.getScalar() * (Math.PI / 180.0); // φ\n\n        var largeArcFlag = pathParser.getScalar(); //  fA\n\n        var sweepFlag = pathParser.getScalar(); //  fS\n\n        var currentPoint = pathParser.getAsCurrentPoint(); // x2, y2\n        // Conversion from endpoint to center parameterization\n        // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n        // x1', y1'\n\n        var currp = new Point(Math.cos(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.sin(xAxisRotation) * (current.y - currentPoint.y) / 2.0, -Math.sin(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * (current.y - currentPoint.y) / 2.0); // adjust radii\n\n        var l = Math.pow(currp.x, 2) / Math.pow(rx, 2) + Math.pow(currp.y, 2) / Math.pow(ry, 2);\n\n        if (l > 1) {\n          rx *= Math.sqrt(l);\n          ry *= Math.sqrt(l);\n        } // cx', cy'\n\n\n        var s = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt((Math.pow(rx, 2) * Math.pow(ry, 2) - Math.pow(rx, 2) * Math.pow(currp.y, 2) - Math.pow(ry, 2) * Math.pow(currp.x, 2)) / (Math.pow(rx, 2) * Math.pow(currp.y, 2) + Math.pow(ry, 2) * Math.pow(currp.x, 2)));\n\n        if (isNaN(s)) {\n          s = 0;\n        }\n\n        var cpp = new Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); // cx, cy\n\n        var centp = new Point((current.x + currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, (current.y + currentPoint.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y); // initial angle\n\n        var a1 = vectorsAngle([1, 0], [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]); // θ1\n        // angle delta\n\n        var u = [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry];\n        var v = [(-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry];\n        var ad = vectorsAngle(u, v); // Δθ\n\n        if (vectorsRatio(u, v) <= -1) {\n          ad = Math.PI;\n        }\n\n        if (vectorsRatio(u, v) >= 1) {\n          ad = 0;\n        }\n\n        if (sweepFlag === 0 && ad > 0) {\n          ad = ad - 2 * Math.PI;\n        }\n\n        if (sweepFlag === 1 && ad < 0) {\n          ad = ad + 2 * Math.PI;\n        }\n\n        return [centp.x, centp.y, rx, ry, a1, ad, xAxisRotation, sweepFlag];\n      }\n    }\n  }, {\n    key: \"calcLength\",\n    value: function calcLength(x, y, cmd, points) {\n      var len = 0;\n      var p1 = null;\n      var p2 = null;\n      var t = 0;\n\n      switch (cmd) {\n        case 'L':\n          return this.getLineLength(x, y, points[0], points[1]);\n\n        case 'C':\n          // Approximates by breaking curve into 100 line segments\n          len = 0.0;\n          p1 = this.getPointOnCubicBezier(0, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);\n\n          for (t = 0.01; t <= 1; t += 0.01) {\n            p2 = this.getPointOnCubicBezier(t, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);\n            len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n            p1 = p2;\n          }\n\n          return len;\n\n        case 'Q':\n          // Approximates by breaking curve into 100 line segments\n          len = 0.0;\n          p1 = this.getPointOnQuadraticBezier(0, x, y, points[0], points[1], points[2], points[3]);\n\n          for (t = 0.01; t <= 1; t += 0.01) {\n            p2 = this.getPointOnQuadraticBezier(t, x, y, points[0], points[1], points[2], points[3]);\n            len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n            p1 = p2;\n          }\n\n          return len;\n\n        case 'A':\n          // Approximates by breaking curve into line segments\n          len = 0.0;\n          var start = points[4]; // 4 = theta\n\n          var dTheta = points[5]; // 5 = dTheta\n\n          var end = points[4] + dTheta;\n          var inc = Math.PI / 180.0; // 1 degree resolution\n\n          if (Math.abs(start - end) < inc) {\n            inc = Math.abs(start - end);\n          } // Note: for purpose of calculating arc length, not going to worry about rotating X-axis by angle psi\n\n\n          p1 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], start, 0);\n\n          if (dTheta < 0) {\n            // clockwise\n            for (t = start - inc; t > end; t -= inc) {\n              p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);\n              len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n              p1 = p2;\n            }\n          } else {\n            // counter-clockwise\n            for (t = start + inc; t < end; t += inc) {\n              p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);\n              len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n              p1 = p2;\n            }\n          }\n\n          p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], end, 0);\n          len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n          return len;\n      }\n\n      return 0;\n    }\n  }, {\n    key: \"getPointOnLine\",\n    value: function getPointOnLine(dist, P1x, P1y, P2x, P2y) {\n      var fromX = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : P1x;\n      var fromY = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : P1y;\n      var m = (P2y - P1y) / (P2x - P1x + PSEUDO_ZERO);\n      var run = Math.sqrt(dist * dist / (1 + m * m));\n\n      if (P2x < P1x) {\n        run *= -1;\n      }\n\n      var rise = m * run;\n      var pt = null;\n\n      if (P2x === P1x) {\n        // vertical line\n        pt = {\n          x: fromX,\n          y: fromY + rise\n        };\n      } else if ((fromY - P1y) / (fromX - P1x + PSEUDO_ZERO) === m) {\n        pt = {\n          x: fromX + run,\n          y: fromY + rise\n        };\n      } else {\n        var ix = 0;\n        var iy = 0;\n        var len = this.getLineLength(P1x, P1y, P2x, P2y);\n\n        if (len < PSEUDO_ZERO) {\n          return null;\n        }\n\n        var u = (fromX - P1x) * (P2x - P1x) + (fromY - P1y) * (P2y - P1y);\n        u = u / (len * len);\n        ix = P1x + u * (P2x - P1x);\n        iy = P1y + u * (P2y - P1y);\n        var pRise = this.getLineLength(fromX, fromY, ix, iy);\n        var pRun = Math.sqrt(dist * dist - pRise * pRise);\n        run = Math.sqrt(pRun * pRun / (1 + m * m));\n\n        if (P2x < P1x) {\n          run *= -1;\n        }\n\n        rise = m * run;\n        pt = {\n          x: ix + run,\n          y: iy + rise\n        };\n      }\n\n      return pt;\n    }\n  }, {\n    key: \"getPointOnPath\",\n    value: function getPointOnPath(distance) {\n      var fullLen = this.getPathLength();\n      var cumulativePathLength = 0;\n      var p = null;\n\n      if (distance < -0.00005 || distance - 0.00005 > fullLen) {\n        return null;\n      }\n\n      var dataArray = this.dataArray;\n\n      var _iterator = _createForOfIteratorHelper$1(dataArray),\n          _step;\n\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var pathCmd = _step.value;\n\n          if (pathCmd && (pathCmd.pathLength < 0.00005 || cumulativePathLength + pathCmd.pathLength + 0.00005 < distance)) {\n            cumulativePathLength += pathCmd.pathLength;\n            continue;\n          }\n\n          var delta = distance - cumulativePathLength;\n          var currentT = 0;\n\n          switch (pathCmd.command) {\n            case 'L':\n              p = this.getPointOnLine(delta, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.start.x, pathCmd.start.y);\n              break;\n\n            case 'A':\n              var start = pathCmd.points[4]; // 4 = theta\n\n              var dTheta = pathCmd.points[5]; // 5 = dTheta\n\n              var end = pathCmd.points[4] + dTheta;\n              currentT = start + delta / pathCmd.pathLength * dTheta;\n\n              if (dTheta < 0 && currentT < end || dTheta >= 0 && currentT > end) {\n                break;\n              }\n\n              p = this.getPointOnEllipticalArc(pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3], currentT, pathCmd.points[6]);\n              break;\n\n            case 'C':\n              currentT = delta / pathCmd.pathLength;\n\n              if (currentT > 1) {\n                currentT = 1;\n              }\n\n              p = this.getPointOnCubicBezier(currentT, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3], pathCmd.points[4], pathCmd.points[5]);\n              break;\n\n            case 'Q':\n              currentT = delta / pathCmd.pathLength;\n\n              if (currentT > 1) {\n                currentT = 1;\n              }\n\n              p = this.getPointOnQuadraticBezier(currentT, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3]);\n              break;\n\n            default:\n          }\n\n          if (p) {\n            return p;\n          }\n\n          break;\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n\n      return null;\n    }\n  }, {\n    key: \"getLineLength\",\n    value: function getLineLength(x1, y1, x2, y2) {\n      return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n    }\n  }, {\n    key: \"getPathLength\",\n    value: function getPathLength() {\n      if (this.pathLength === -1) {\n        this.pathLength = this.dataArray.reduce(function (length, command) {\n          return command.pathLength > 0 ? length + command.pathLength : length;\n        }, 0);\n      }\n\n      return this.pathLength;\n    }\n  }, {\n    key: \"getPointOnCubicBezier\",\n    value: function getPointOnCubicBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y, P4x, P4y) {\n      var x = P4x * CB1(pct) + P3x * CB2(pct) + P2x * CB3(pct) + P1x * CB4(pct);\n      var y = P4y * CB1(pct) + P3y * CB2(pct) + P2y * CB3(pct) + P1y * CB4(pct);\n      return {\n        x: x,\n        y: y\n      };\n    }\n  }, {\n    key: \"getPointOnQuadraticBezier\",\n    value: function getPointOnQuadraticBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y) {\n      var x = P3x * QB1(pct) + P2x * QB2(pct) + P1x * QB3(pct);\n      var y = P3y * QB1(pct) + P2y * QB2(pct) + P1y * QB3(pct);\n      return {\n        x: x,\n        y: y\n      };\n    }\n  }, {\n    key: \"getPointOnEllipticalArc\",\n    value: function getPointOnEllipticalArc(cx, cy, rx, ry, theta, psi) {\n      var cosPsi = Math.cos(psi);\n      var sinPsi = Math.sin(psi);\n      var pt = {\n        x: rx * Math.cos(theta),\n        y: ry * Math.sin(theta)\n      };\n      return {\n        x: cx + (pt.x * cosPsi - pt.y * sinPsi),\n        y: cy + (pt.x * sinPsi + pt.y * cosPsi)\n      };\n    } // TODO need some optimisations. possibly build cache only for curved segments?\n\n  }, {\n    key: \"buildEquidistantCache\",\n    value: function buildEquidistantCache(inputStep, inputPrecision) {\n      var fullLen = this.getPathLength();\n      var precision = inputPrecision || 0.25; // accuracy vs performance\n\n      var step = inputStep || fullLen / 100;\n\n      if (!this.equidistantCache || this.equidistantCache.step !== step || this.equidistantCache.precision !== precision) {\n        // Prepare cache\n        this.equidistantCache = {\n          step: step,\n          precision: precision,\n          points: []\n        }; // Calculate points\n\n        var s = 0;\n\n        for (var l = 0; l <= fullLen; l += precision) {\n          var p0 = this.getPointOnPath(l);\n          var p1 = this.getPointOnPath(l + precision);\n\n          if (!p0 || !p1) {\n            continue;\n          }\n\n          s += this.getLineLength(p0.x, p0.y, p1.x, p1.y);\n\n          if (s >= step) {\n            this.equidistantCache.points.push({\n              x: p0.x,\n              y: p0.y,\n              distance: l\n            });\n            s -= step;\n          }\n        }\n      }\n    }\n  }, {\n    key: \"getEquidistantPointOnPath\",\n    value: function getEquidistantPointOnPath(targetDistance, step, precision) {\n      this.buildEquidistantCache(step, precision);\n\n      if (targetDistance < 0 || targetDistance - this.getPathLength() > 0.00005) {\n        return null;\n      }\n\n      var idx = Math.round(targetDistance / this.getPathLength() * (this.equidistantCache.points.length - 1));\n      return this.equidistantCache.points[idx] || null;\n    }\n  }]);\n\n  return TextPathElement;\n}(TextElement);\n\nfunction _createSuper$y(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$y()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$y() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar ImageElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(ImageElement, _RenderedElement);\n\n  var _super = _createSuper$y(ImageElement);\n\n  function ImageElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, ImageElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'image';\n    _this.loaded = false;\n\n    var href = _this.getHrefAttribute().getString();\n\n    if (!href) {\n      return _possibleConstructorReturn(_this);\n    }\n\n    var isSvg = /\\.svg$/.test(href);\n    document.images.push(_assertThisInitialized(_this));\n\n    if (!isSvg) {\n      _this.loadImage(href);\n    } else {\n      _this.loadSvg(href);\n    }\n\n    _this.isSvg = isSvg;\n    return _this;\n  }\n\n  _createClass(ImageElement, [{\n    key: \"loadImage\",\n    value: function () {\n      var _loadImage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(href) {\n        var image;\n        return _regeneratorRuntime.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.prev = 0;\n                _context.next = 3;\n                return this.document.createImage(href);\n\n              case 3:\n                image = _context.sent;\n                this.image = image;\n                _context.next = 10;\n                break;\n\n              case 7:\n                _context.prev = 7;\n                _context.t0 = _context[\"catch\"](0);\n                // tslint:disable-next-line: no-console\n                console.error(\"ERROR: image \\\"\".concat(href, \"\\\" not found\"), _context.t0);\n\n              case 10:\n                this.loaded = true;\n\n              case 11:\n              case \"end\":\n                return _context.stop();\n            }\n          }\n        }, _callee, this, [[0, 7]]);\n      }));\n\n      function loadImage(_x) {\n        return _loadImage.apply(this, arguments);\n      }\n\n      return loadImage;\n    }()\n  }, {\n    key: \"loadSvg\",\n    value: function () {\n      var _loadSvg = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(href) {\n        var response, svg;\n        return _regeneratorRuntime.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                _context2.prev = 0;\n                _context2.next = 3;\n                return this.document.fetch(href);\n\n              case 3:\n                response = _context2.sent;\n                _context2.next = 6;\n                return response.text();\n\n              case 6:\n                svg = _context2.sent;\n                this.image = svg;\n                _context2.next = 13;\n                break;\n\n              case 10:\n                _context2.prev = 10;\n                _context2.t0 = _context2[\"catch\"](0);\n                // tslint:disable-next-line: no-console\n                console.error(\"ERROR: image \\\"\".concat(href, \"\\\" not found\"), _context2.t0);\n\n              case 13:\n                this.loaded = true;\n\n              case 14:\n              case \"end\":\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this, [[0, 10]]);\n      }));\n\n      function loadSvg(_x2) {\n        return _loadSvg.apply(this, arguments);\n      }\n\n      return loadSvg;\n    }()\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      var document = this.document;\n      var x = this.getAttribute('x').getPixels('x');\n      var y = this.getAttribute('y').getPixels('y');\n      var width = this.getAttribute('width').getPixels('x');\n      var height = this.getAttribute('height').getPixels('y');\n\n      if (!width || !height) {\n        return;\n      }\n\n      ctx.save();\n\n      if (this.isSvg) {\n        document.canvg.forkString(ctx, this.image, {\n          ignoreMouse: true,\n          ignoreAnimation: true,\n          ignoreDimensions: true,\n          ignoreClear: true,\n          offsetX: x,\n          offsetY: y,\n          scaleWidth: width,\n          scaleHeight: height\n        }).render();\n      } else {\n        var image = this.image;\n        ctx.translate(x, y);\n        document.setViewBox({\n          ctx: ctx,\n          aspectRatio: this.getAttribute('preserveAspectRatio').getString(),\n          width: width,\n          desiredWidth: image.width,\n          height: height,\n          desiredHeight: image.height\n        });\n\n        if (this.loaded) {\n          if (typeof image.complete === 'undefined' || image.complete) {\n            ctx.drawImage(image, 0, 0);\n          }\n        }\n      }\n\n      ctx.restore();\n    }\n  }, {\n    key: \"getBoundingBox\",\n    value: function getBoundingBox() {\n      var x = this.getAttribute('x').getPixels('x');\n      var y = this.getAttribute('y').getPixels('y');\n      var width = this.getAttribute('width').getPixels('x');\n      var height = this.getAttribute('height').getPixels('y');\n      return new BoundingBox(x, y, x + width, y + height);\n    }\n  }]);\n\n  return ImageElement;\n}(RenderedElement);\n\nfunction _createSuper$z(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$z()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$z() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar SymbolElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(SymbolElement, _RenderedElement);\n\n  var _super = _createSuper$z(SymbolElement);\n\n  function SymbolElement() {\n    var _this;\n\n    _classCallCheck(this, SymbolElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'symbol';\n    return _this;\n  }\n\n  _createClass(SymbolElement, [{\n    key: \"render\",\n    value: function render(_) {// NO RENDER\n    }\n  }]);\n\n  return SymbolElement;\n}(RenderedElement);\n\nvar SVGFontLoader = /*#__PURE__*/function () {\n  function SVGFontLoader(document) {\n    _classCallCheck(this, SVGFontLoader);\n\n    this.document = document;\n    this.loaded = false;\n    document.fonts.push(this);\n  }\n\n  _createClass(SVGFontLoader, [{\n    key: \"load\",\n    value: function () {\n      var _load = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(fontFamily, url) {\n        var document, svgDocument, fonts;\n        return _regeneratorRuntime.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.prev = 0;\n                document = this.document;\n                _context.next = 4;\n                return document.canvg.parser.load(url);\n\n              case 4:\n                svgDocument = _context.sent;\n                fonts = svgDocument.getElementsByTagName('font');\n                Array.from(fonts).forEach(function (fontNode) {\n                  var font = document.createElement(fontNode);\n                  document.definitions[fontFamily] = font;\n                });\n                _context.next = 12;\n                break;\n\n              case 9:\n                _context.prev = 9;\n                _context.t0 = _context[\"catch\"](0);\n                // tslint:disable-next-line: no-console\n                console.error(\"ERROR: font \\\"\".concat(url, \"\\\" not found\"), _context.t0);\n\n              case 12:\n                this.loaded = true;\n\n              case 13:\n              case \"end\":\n                return _context.stop();\n            }\n          }\n        }, _callee, this, [[0, 9]]);\n      }));\n\n      function load(_x, _x2) {\n        return _load.apply(this, arguments);\n      }\n\n      return load;\n    }()\n  }]);\n\n  return SVGFontLoader;\n}();\n\nfunction _createSuper$A(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$A()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$A() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar StyleElement = /*#__PURE__*/function (_Element) {\n  _inherits(StyleElement, _Element);\n\n  var _super = _createSuper$A(StyleElement);\n\n  function StyleElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, StyleElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'style';\n    var css = compressSpaces(Array.from(node.childNodes).map(function (_) {\n      return _.data;\n    }).join('').replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*\\/]|[\\r\\n])))*\\*+\\/)|(^[\\s]*\\/\\/.*)/gm, '') // remove comments;\n    );\n    var cssDefs = css.split('}');\n    cssDefs.forEach(function (_) {\n      var def = _.trim();\n\n      if (!def) {\n        return;\n      }\n\n      var cssParts = def.split('{');\n      var cssClasses = cssParts[0].split(',');\n      var cssProps = cssParts[1].split(';');\n      cssClasses.forEach(function (_) {\n        var cssClass = _.trim();\n\n        if (!cssClass) {\n          return;\n        }\n\n        var props = document.styles[cssClass] || {};\n        cssProps.forEach(function (cssProp) {\n          var prop = cssProp.indexOf(':');\n          var name = cssProp.substr(0, prop).trim();\n          var value = cssProp.substr(prop + 1, cssProp.length - prop).trim();\n\n          if (name && value) {\n            props[name] = new Property(document, name, value);\n          }\n        });\n        document.styles[cssClass] = props;\n        document.stylesSpecificity[cssClass] = getSelectorSpecificity(cssClass);\n\n        if (cssClass === '@font-face') {\n          //  && !nodeEnv\n          var fontFamily = props['font-family'].getString().replace(/\"|'/g, '');\n          var srcs = props.src.getString().split(',');\n          srcs.forEach(function (src) {\n            if (src.indexOf('format(\"svg\")') > 0) {\n              var url = parseExternalUrl(src);\n\n              if (url) {\n                new SVGFontLoader(document).load(fontFamily, url);\n              }\n            }\n          });\n        }\n      });\n    });\n    return _this;\n  }\n\n  return StyleElement;\n}(Element);\nStyleElement.parseExternalUrl = parseExternalUrl;\n\nfunction _createSuper$B(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$B()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$B() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar UseElement = /*#__PURE__*/function (_RenderedElement) {\n  _inherits(UseElement, _RenderedElement);\n\n  var _super = _createSuper$B(UseElement);\n\n  function UseElement() {\n    var _this;\n\n    _classCallCheck(this, UseElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'use';\n    return _this;\n  }\n\n  _createClass(UseElement, [{\n    key: \"setContext\",\n    value: function setContext(ctx) {\n      _get(_getPrototypeOf(UseElement.prototype), \"setContext\", this).call(this, ctx);\n\n      var xAttr = this.getAttribute('x');\n      var yAttr = this.getAttribute('y');\n\n      if (xAttr.hasValue()) {\n        ctx.translate(xAttr.getPixels('x'), 0);\n      }\n\n      if (yAttr.hasValue()) {\n        ctx.translate(0, yAttr.getPixels('y'));\n      }\n    }\n  }, {\n    key: \"path\",\n    value: function path(ctx) {\n      var element = this.element;\n\n      if (element) {\n        element.path(ctx);\n      }\n    }\n  }, {\n    key: \"renderChildren\",\n    value: function renderChildren(ctx) {\n      var document = this.document,\n          element = this.element;\n\n      if (element) {\n        var tempSvg = element;\n\n        if (element.type === 'symbol') {\n          // render me using a temporary svg element in symbol cases (http://www.w3.org/TR/SVG/struct.html#UseElement)\n          tempSvg = new SVGElement(document, null);\n          tempSvg.attributes.viewBox = new Property(document, 'viewBox', element.getAttribute('viewBox').getString());\n          tempSvg.attributes.preserveAspectRatio = new Property(document, 'preserveAspectRatio', element.getAttribute('preserveAspectRatio').getString());\n          tempSvg.attributes.overflow = new Property(document, 'overflow', element.getAttribute('overflow').getString());\n          tempSvg.children = element.children;\n        }\n\n        if (tempSvg.type === 'svg') {\n          var widthAttr = this.getAttribute('width');\n          var heightAttr = this.getAttribute('height'); // if symbol or svg, inherit width/height from me\n\n          if (widthAttr.hasValue()) {\n            tempSvg.attributes.width = new Property(document, 'width', this.getAttribute('width').getString());\n          }\n\n          if (heightAttr.hasValue()) {\n            tempSvg.attributes.height = new Property(document, 'height', heightAttr.getString());\n          }\n        }\n\n        var oldParent = tempSvg.parent;\n        tempSvg.parent = null;\n        tempSvg.render(ctx);\n        tempSvg.parent = oldParent;\n      }\n    }\n  }, {\n    key: \"getBoundingBox\",\n    value: function getBoundingBox(ctx) {\n      var element = this.element;\n\n      if (element) {\n        return element.getBoundingBox(ctx);\n      }\n\n      return null;\n    }\n  }, {\n    key: \"elementTransform\",\n    value: function elementTransform() {\n      var document = this.document,\n          element = this.element;\n      return Transform.fromElement(document, element);\n    }\n  }, {\n    key: \"element\",\n    get: function get() {\n      if (!this._element) {\n        this._element = this.getHrefAttribute().getDefinition();\n      }\n\n      return this._element;\n    }\n  }]);\n\n  return UseElement;\n}(RenderedElement);\n\nfunction _createSuper$C(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$C()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$C() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction imGet(img, x, y, width, _, rgba) {\n  return img[y * width * 4 + x * 4 + rgba];\n}\n\nfunction imSet(img, x, y, width, _, rgba, val) {\n  img[y * width * 4 + x * 4 + rgba] = val;\n}\n\nfunction m(matrix, i, v) {\n  var mi = matrix[i];\n  return mi * (mi < 0 ? v - 255 : v);\n}\n\nfunction c(a, m1, m2, m3) {\n  return m1 + Math.cos(a) * m2 + Math.sin(a) * m3;\n}\n\nvar FeColorMatrixElement = /*#__PURE__*/function (_Element) {\n  _inherits(FeColorMatrixElement, _Element);\n\n  var _super = _createSuper$C(FeColorMatrixElement);\n\n  function FeColorMatrixElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, FeColorMatrixElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'feColorMatrix';\n    var matrix = toNumbers(_this.getAttribute('values').getString());\n\n    switch (_this.getAttribute('type').getString('matrix')) {\n      // http://www.w3.org/TR/SVG/filters.html#feColorMatrixElement\n      case 'saturate':\n        {\n          var s = matrix[0];\n          matrix = [0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1];\n          break;\n        }\n\n      case 'hueRotate':\n        {\n          var a = matrix[0] * Math.PI / 180.0;\n          matrix = [c(a, 0.213, 0.787, -0.213), c(a, 0.715, -0.715, -0.715), c(a, 0.072, -0.072, 0.928), 0, 0, c(a, 0.213, -0.213, 0.143), c(a, 0.715, 0.285, 0.140), c(a, 0.072, -0.072, -0.283), 0, 0, c(a, 0.213, -0.213, -0.787), c(a, 0.715, -0.715, 0.715), c(a, 0.072, 0.928, 0.072), 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1];\n          break;\n        }\n\n      case 'luminanceToAlpha':\n        matrix = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2125, 0.7154, 0.0721, 0, 0, 0, 0, 0, 0, 1];\n        break;\n    }\n\n    _this.matrix = matrix;\n    _this.includeOpacity = _this.getAttribute('includeOpacity').hasValue();\n    return _this;\n  }\n\n  _createClass(FeColorMatrixElement, [{\n    key: \"apply\",\n    value: function apply(ctx, _, __, width, height) {\n      // assuming x==0 && y==0 for now\n      var includeOpacity = this.includeOpacity,\n          matrix = this.matrix;\n      var srcData = ctx.getImageData(0, 0, width, height);\n\n      for (var y = 0; y < height; y++) {\n        for (var x = 0; x < width; x++) {\n          var r = imGet(srcData.data, x, y, width, height, 0);\n          var g = imGet(srcData.data, x, y, width, height, 1);\n          var b = imGet(srcData.data, x, y, width, height, 2);\n          var a = imGet(srcData.data, x, y, width, height, 3);\n          var nr = m(matrix, 0, r) + m(matrix, 1, g) + m(matrix, 2, b) + m(matrix, 3, a) + m(matrix, 4, 1);\n          var ng = m(matrix, 5, r) + m(matrix, 6, g) + m(matrix, 7, b) + m(matrix, 8, a) + m(matrix, 9, 1);\n          var nb = m(matrix, 10, r) + m(matrix, 11, g) + m(matrix, 12, b) + m(matrix, 13, a) + m(matrix, 14, 1);\n          var na = m(matrix, 15, r) + m(matrix, 16, g) + m(matrix, 17, b) + m(matrix, 18, a) + m(matrix, 19, 1);\n\n          if (includeOpacity) {\n            nr = ng = nb = 0;\n            na *= a / 255;\n          }\n\n          imSet(srcData.data, x, y, width, height, 0, nr);\n          imSet(srcData.data, x, y, width, height, 1, ng);\n          imSet(srcData.data, x, y, width, height, 2, nb);\n          imSet(srcData.data, x, y, width, height, 3, na);\n        }\n      }\n\n      ctx.clearRect(0, 0, width, height);\n      ctx.putImageData(srcData, 0, 0);\n    }\n  }]);\n\n  return FeColorMatrixElement;\n}(Element);\n\nfunction _createSuper$D(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$D()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$D() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar MaskElement = /*#__PURE__*/function (_Element) {\n  _inherits(MaskElement, _Element);\n\n  var _super = _createSuper$D(MaskElement);\n\n  function MaskElement() {\n    var _this;\n\n    _classCallCheck(this, MaskElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'mask';\n    return _this;\n  }\n\n  _createClass(MaskElement, [{\n    key: \"apply\",\n    value: function apply(ctx, element) {\n      var document = this.document; // render as temp svg\n\n      var x = this.getAttribute('x').getPixels('x');\n      var y = this.getAttribute('y').getPixels('y');\n      var width = this.getAttribute('width').getPixels('x');\n      var height = this.getAttribute('height').getPixels('y');\n\n      if (!width && !height) {\n        var boundingBox = new BoundingBox();\n        this.children.forEach(function (child) {\n          boundingBox.addBoundingBox(child.getBoundingBox(ctx));\n        });\n        x = Math.floor(boundingBox.x1);\n        y = Math.floor(boundingBox.y1);\n        width = Math.floor(boundingBox.width);\n        height = Math.floor(boundingBox.height);\n      } // temporarily remove mask to avoid recursion\n\n\n      var mask = element.getStyle('mask').getString();\n      element.getStyle('mask').setValue('');\n      var cMask = document.createCanvas(x + width, y + height);\n      var maskCtx = cMask.getContext('2d');\n      document.screen.setDefaults(maskCtx);\n      this.renderChildren(maskCtx); // convert mask to alpha with a fake node\n      // TODO: refactor out apply from feColorMatrix\n\n      var cm = new FeColorMatrixElement(document, {\n        nodeType: 1,\n        childNodes: [],\n        attributes: [{\n          nodeName: 'type',\n          value: 'luminanceToAlpha'\n        }, {\n          nodeName: 'includeOpacity',\n          value: 'true'\n        }]\n      });\n      cm.apply(maskCtx, 0, 0, x + width, y + height);\n      var c = document.createCanvas(x + width, y + height);\n      var tempCtx = c.getContext('2d');\n      document.screen.setDefaults(tempCtx);\n      element.render(tempCtx);\n      tempCtx.globalCompositeOperation = 'destination-in';\n      tempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');\n      tempCtx.fillRect(0, 0, x + width, y + height);\n      ctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');\n      ctx.fillRect(0, 0, x + width, y + height); // reassign mask\n\n      element.getStyle('mask').setValue(mask);\n    }\n  }, {\n    key: \"render\",\n    value: function render(_) {// NO RENDER\n    }\n  }]);\n\n  return MaskElement;\n}(Element);\n\nfunction _createSuper$E(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$E()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$E() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar noop = function noop() {};\n\nvar ClipPathElement = /*#__PURE__*/function (_Element) {\n  _inherits(ClipPathElement, _Element);\n\n  var _super = _createSuper$E(ClipPathElement);\n\n  function ClipPathElement() {\n    var _this;\n\n    _classCallCheck(this, ClipPathElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'clipPath';\n    return _this;\n  }\n\n  _createClass(ClipPathElement, [{\n    key: \"apply\",\n    value: function apply(ctx) {\n      var document = this.document;\n      var contextProto = Reflect.getPrototypeOf(ctx);\n      var beginPath = ctx.beginPath,\n          closePath = ctx.closePath;\n\n      if (contextProto) {\n        contextProto.beginPath = noop;\n        contextProto.closePath = noop;\n      }\n\n      Reflect.apply(beginPath, ctx, []);\n      this.children.forEach(function (child) {\n        if (typeof child.path === 'undefined') {\n          return;\n        }\n\n        var transform = typeof child.elementTransform !== 'undefined' ? child.elementTransform() : null; // handle <use />\n\n        if (!transform) {\n          transform = Transform.fromElement(document, child);\n        }\n\n        if (transform) {\n          transform.apply(ctx);\n        }\n\n        child.path(ctx);\n\n        if (contextProto) {\n          contextProto.closePath = closePath;\n        }\n\n        if (transform) {\n          transform.unapply(ctx);\n        }\n      });\n      Reflect.apply(closePath, ctx, []);\n      ctx.clip();\n\n      if (contextProto) {\n        contextProto.beginPath = beginPath;\n        contextProto.closePath = closePath;\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render(_) {// NO RENDER\n    }\n  }]);\n\n  return ClipPathElement;\n}(Element);\n\nfunction _createSuper$F(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$F()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$F() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FilterElement = /*#__PURE__*/function (_Element) {\n  _inherits(FilterElement, _Element);\n\n  var _super = _createSuper$F(FilterElement);\n\n  function FilterElement() {\n    var _this;\n\n    _classCallCheck(this, FilterElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'filter';\n    return _this;\n  }\n\n  _createClass(FilterElement, [{\n    key: \"apply\",\n    value: function apply(ctx, element) {\n      // render as temp svg\n      var document = this.document;\n      var boundingBox = element.getBoundingBox(ctx);\n      var x = Math.floor(boundingBox.x1);\n      var y = Math.floor(boundingBox.y1);\n      var width = Math.floor(boundingBox.width);\n      var height = Math.floor(boundingBox.height); // temporarily remove filter to avoid recursion\n\n      var filter = element.getStyle('filter').getString();\n      element.getStyle('filter').setValue('');\n      var px = 0;\n      var py = 0;\n      this.children.forEach(function (child) {\n        var efd = child.extraFilterDistance || 0;\n        px = Math.max(px, efd);\n        py = Math.max(py, efd);\n      });\n      var tmpCanvas = document.createCanvas(width + 2 * px, height + 2 * py);\n      var tmpCtx = tmpCanvas.getContext('2d');\n      document.screen.setDefaults(tmpCtx);\n      tmpCtx.translate(-x + px, -y + py);\n      element.render(tmpCtx); // apply filters\n\n      this.children.forEach(function (child) {\n        if (typeof child.apply === 'function') {\n          child.apply(tmpCtx, 0, 0, width + 2 * px, height + 2 * py);\n        }\n      }); // render on me\n\n      ctx.drawImage(tmpCanvas, 0, 0, width + 2 * px, height + 2 * py, x - px, y - py, width + 2 * px, height + 2 * py); // reassign filter\n\n      element.getStyle('filter', true).setValue(filter);\n    }\n  }, {\n    key: \"render\",\n    value: function render(_) {// NO RENDER\n    }\n  }]);\n\n  return FilterElement;\n}(Element);\n\nfunction _createSuper$G(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$G()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$G() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FeDropShadowElement = /*#__PURE__*/function (_Element) {\n  _inherits(FeDropShadowElement, _Element);\n\n  var _super = _createSuper$G(FeDropShadowElement);\n\n  function FeDropShadowElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, FeDropShadowElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'feDropShadow';\n\n    _this.addStylesFromStyleDefinition();\n\n    return _this;\n  }\n\n  _createClass(FeDropShadowElement, [{\n    key: \"apply\",\n    value: function apply(_, __, ___, ____, _____) {// TODO: implement\n    }\n  }]);\n\n  return FeDropShadowElement;\n}(Element);\n\nfunction _createSuper$H(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$H()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$H() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FeMorphologyElement = /*#__PURE__*/function (_Element) {\n  _inherits(FeMorphologyElement, _Element);\n\n  var _super = _createSuper$H(FeMorphologyElement);\n\n  function FeMorphologyElement() {\n    var _this;\n\n    _classCallCheck(this, FeMorphologyElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'feMorphology';\n    return _this;\n  }\n\n  _createClass(FeMorphologyElement, [{\n    key: \"apply\",\n    value: function apply(_, __, ___, ____, _____) {// TODO: implement\n    }\n  }]);\n\n  return FeMorphologyElement;\n}(Element);\n\nfunction _createSuper$I(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$I()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$I() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FeCompositeElement = /*#__PURE__*/function (_Element) {\n  _inherits(FeCompositeElement, _Element);\n\n  var _super = _createSuper$I(FeCompositeElement);\n\n  function FeCompositeElement() {\n    var _this;\n\n    _classCallCheck(this, FeCompositeElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'feComposite';\n    return _this;\n  }\n\n  _createClass(FeCompositeElement, [{\n    key: \"apply\",\n    value: function apply(_, __, ___, ____, _____) {// TODO: implement\n    }\n  }]);\n\n  return FeCompositeElement;\n}(Element);\n\nfunction _createSuper$J(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$J()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$J() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar FeGaussianBlurElement = /*#__PURE__*/function (_Element) {\n  _inherits(FeGaussianBlurElement, _Element);\n\n  var _super = _createSuper$J(FeGaussianBlurElement);\n\n  function FeGaussianBlurElement(document, node, captureTextNodes) {\n    var _this;\n\n    _classCallCheck(this, FeGaussianBlurElement);\n\n    _this = _super.call(this, document, node, captureTextNodes);\n    _this.type = 'feGaussianBlur';\n    _this.blurRadius = Math.floor(_this.getAttribute('stdDeviation').getNumber());\n    _this.extraFilterDistance = _this.blurRadius;\n    return _this;\n  }\n\n  _createClass(FeGaussianBlurElement, [{\n    key: \"apply\",\n    value: function apply(ctx, x, y, width, height) {\n      var document = this.document,\n          blurRadius = this.blurRadius;\n      var body = document.window ? document.window.document.body : null;\n      var canvas = ctx.canvas; // StackBlur requires canvas be on document\n\n      canvas.id = document.getUniqueId();\n\n      if (body) {\n        canvas.style.display = 'none';\n        body.appendChild(canvas);\n      }\n\n      stackblurCanvas.canvasRGBA(canvas, x, y, width, height, blurRadius);\n\n      if (body) {\n        body.removeChild(canvas);\n      }\n    }\n  }]);\n\n  return FeGaussianBlurElement;\n}(Element);\n\nfunction _createSuper$K(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$K()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$K() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar TitleElement = /*#__PURE__*/function (_Element) {\n  _inherits(TitleElement, _Element);\n\n  var _super = _createSuper$K(TitleElement);\n\n  function TitleElement() {\n    var _this;\n\n    _classCallCheck(this, TitleElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'title';\n    return _this;\n  }\n\n  return TitleElement;\n}(Element);\n\nfunction _createSuper$L(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct$L()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$L() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nvar DescElement = /*#__PURE__*/function (_Element) {\n  _inherits(DescElement, _Element);\n\n  var _super = _createSuper$L(DescElement);\n\n  function DescElement() {\n    var _this;\n\n    _classCallCheck(this, DescElement);\n\n    _this = _super.apply(this, arguments);\n    _this.type = 'desc';\n    return _this;\n  }\n\n  return DescElement;\n}(Element);\n\nvar elementTypes = {\n  'svg': SVGElement,\n  'rect': RectElement,\n  'circle': CircleElement,\n  'ellipse': EllipseElement,\n  'line': LineElement,\n  'polyline': PolylineElement,\n  'polygon': PolygonElement,\n  'path': PathElement,\n  'pattern': PatternElement,\n  'marker': MarkerElement,\n  'defs': DefsElement,\n  'linearGradient': LinearGradientElement,\n  'radialGradient': RadialGradientElement,\n  'stop': StopElement,\n  'animate': AnimateElement,\n  'animateColor': AnimateColorElement,\n  'animateTransform': AnimateTransformElement,\n  'font': FontElement,\n  'font-face': FontFaceElement,\n  'missing-glyph': MissingGlyphElement,\n  'glyph': GlyphElement,\n  'text': TextElement,\n  'tspan': TSpanElement,\n  'tref': TRefElement,\n  'a': AElement,\n  'textPath': TextPathElement,\n  'image': ImageElement,\n  'g': GElement,\n  'symbol': SymbolElement,\n  'style': StyleElement,\n  'use': UseElement,\n  'mask': MaskElement,\n  'clipPath': ClipPathElement,\n  'filter': FilterElement,\n  'feDropShadow': FeDropShadowElement,\n  'feMorphology': FeMorphologyElement,\n  'feComposite': FeCompositeElement,\n  'feColorMatrix': FeColorMatrixElement,\n  'feGaussianBlur': FeGaussianBlurElement,\n  'title': TitleElement,\n  'desc': DescElement\n};\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction createCanvas(width, height) {\n  var canvas = document.createElement('canvas');\n  canvas.width = width;\n  canvas.height = height;\n  return canvas;\n}\n\nfunction createImage(_x) {\n  return _createImage.apply(this, arguments);\n}\n\nfunction _createImage() {\n  _createImage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(src) {\n    var image;\n    return _regeneratorRuntime.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            image = document.createElement('img'); // image.crossOrigin = 'Anonymous';\n\n            return _context.abrupt(\"return\", new Promise(function (resolve, reject) {\n              image.onload = function () {\n                resolve(image);\n              };\n\n              image.onerror = function () {\n                reject();\n              };\n\n              image.src = src;\n            }));\n\n          case 2:\n          case \"end\":\n            return _context.stop();\n        }\n      }\n    }, _callee);\n  }));\n  return _createImage.apply(this, arguments);\n}\n\nvar Document = /*#__PURE__*/function () {\n  function Document(canvg) {\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n        _ref$rootEmSize = _ref.rootEmSize,\n        rootEmSize = _ref$rootEmSize === void 0 ? 12 : _ref$rootEmSize,\n        _ref$emSize = _ref.emSize,\n        emSize = _ref$emSize === void 0 ? 12 : _ref$emSize,\n        _ref$createCanvas = _ref.createCanvas,\n        createCanvas = _ref$createCanvas === void 0 ? Document.createCanvas : _ref$createCanvas,\n        _ref$createImage = _ref.createImage,\n        createImage = _ref$createImage === void 0 ? Document.createImage : _ref$createImage;\n\n    _classCallCheck(this, Document);\n\n    this.canvg = canvg;\n    this.definitions = {};\n    this.styles = {};\n    this.stylesSpecificity = {};\n    this.images = [];\n    this.fonts = [];\n    this.emSizeStack = [];\n    this.uniqueId = 0;\n    this.screen = canvg.screen;\n    this.rootEmSize = rootEmSize;\n    this.emSize = emSize;\n    this.createCanvas = createCanvas;\n    this.createImage = createImage;\n    this.screen.wait(this.isImagesLoaded.bind(this));\n    this.screen.wait(this.isFontsLoaded.bind(this));\n  }\n\n  _createClass(Document, [{\n    key: \"popEmSize\",\n    value: function popEmSize() {\n      var emSizeStack = this.emSizeStack;\n      emSizeStack.pop();\n    }\n  }, {\n    key: \"getUniqueId\",\n    value: function getUniqueId() {\n      return \"canvg\".concat(++this.uniqueId);\n    }\n  }, {\n    key: \"isImagesLoaded\",\n    value: function isImagesLoaded() {\n      return this.images.every(function (_) {\n        return _.loaded;\n      });\n    }\n  }, {\n    key: \"isFontsLoaded\",\n    value: function isFontsLoaded() {\n      return this.fonts.every(function (_) {\n        return _.loaded;\n      });\n    }\n  }, {\n    key: \"createDocumentElement\",\n    value: function createDocumentElement(document) {\n      var documentElement = this.createElement(document.documentElement);\n      documentElement.root = true;\n      documentElement.addStylesFromStyleDefinition();\n      this.documentElement = documentElement;\n      return documentElement;\n    }\n  }, {\n    key: \"createElement\",\n    value: function createElement(node) {\n      var elementType = node.nodeName.replace(/^[^:]+:/, '');\n      var ElementType = Document.elementTypes[elementType];\n\n      if (typeof ElementType !== 'undefined') {\n        return new ElementType(this, node);\n      }\n\n      return new UnknownElement(this, node);\n    }\n  }, {\n    key: \"createTextNode\",\n    value: function createTextNode(node) {\n      return new TextNode(this, node);\n    }\n  }, {\n    key: \"setViewBox\",\n    value: function setViewBox(config) {\n      this.screen.setViewBox(_objectSpread({\n        document: this\n      }, config));\n    }\n  }, {\n    key: \"window\",\n    get: function get() {\n      return this.screen.window;\n    }\n  }, {\n    key: \"fetch\",\n    get: function get() {\n      return this.screen.fetch;\n    }\n  }, {\n    key: \"ctx\",\n    get: function get() {\n      return this.screen.ctx;\n    }\n  }, {\n    key: \"emSize\",\n    get: function get() {\n      var emSizeStack = this.emSizeStack;\n      return emSizeStack[emSizeStack.length - 1];\n    },\n    set: function set(value) {\n      var emSizeStack = this.emSizeStack;\n      emSizeStack.push(value);\n    }\n  }]);\n\n  return Document;\n}();\nDocument.createCanvas = createCanvas;\nDocument.createImage = createImage;\nDocument.elementTypes = elementTypes;\n\nfunction ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n/**\n * SVG renderer on canvas.\n */\n\nvar Canvg = /*#__PURE__*/function () {\n  /**\n   * Main constructor.\n   * @param ctx - Rendering context.\n   * @param svg - SVG Document.\n   * @param options - Rendering options.\n   */\n  function Canvg(ctx, svg) {\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n    _classCallCheck(this, Canvg);\n\n    this.parser = new Parser(options);\n    this.screen = new Screen(ctx, options);\n    this.options = options;\n    var document = new Document(this, options);\n    var documentElement = document.createDocumentElement(svg);\n    this.document = document;\n    this.documentElement = documentElement;\n  }\n  /**\n   * Create Canvg isntance from SVG source string or URL.\n   * @param ctx - Rendering context.\n   * @param svg - SVG source string or URL.\n   * @param options - Rendering options.\n   */\n\n\n  _createClass(Canvg, [{\n    key: \"fork\",\n\n    /**\n     * Create new Canvg instance with inherited options.\n     * @param ctx - Rendering context.\n     * @param svg - SVG source string or URL.\n     * @param options - Rendering options.\n     */\n    value: function fork(ctx, svg) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      return Canvg.from(ctx, svg, _objectSpread$1({}, this.options, {}, options));\n    }\n    /**\n     * Create new Canvg instance with inherited options.\n     * @param ctx - Rendering context.\n     * @param svg - SVG source string.\n     * @param options - Rendering options.\n     */\n\n  }, {\n    key: \"forkString\",\n    value: function forkString(ctx, svg) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      return Canvg.fromString(ctx, svg, _objectSpread$1({}, this.options, {}, options));\n    }\n    /**\n     * Document is ready promise.\n     */\n\n  }, {\n    key: \"ready\",\n    value: function ready() {\n      return this.screen.ready();\n    }\n    /**\n     * Document is ready value.\n     */\n\n  }, {\n    key: \"isReady\",\n    value: function isReady() {\n      return this.screen.isReady();\n    }\n    /**\n     * Render only first frame, ignoring animations and mouse.\n     * @param options - Rendering options.\n     */\n\n  }, {\n    key: \"render\",\n    value: function () {\n      var _render = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {\n        var options,\n            _args = arguments;\n        return _regeneratorRuntime.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                options = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};\n                this.start(_objectSpread$1({\n                  enableRedraw: true,\n                  ignoreAnimation: true,\n                  ignoreMouse: true\n                }, options));\n                _context.next = 4;\n                return this.ready();\n\n              case 4:\n                this.stop();\n\n              case 5:\n              case \"end\":\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function render() {\n        return _render.apply(this, arguments);\n      }\n\n      return render;\n    }()\n    /**\n     * Start rendering.\n     * @param options - Render options.\n     */\n\n  }, {\n    key: \"start\",\n    value: function start() {\n      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var documentElement = this.documentElement,\n          screen = this.screen,\n          baseOptions = this.options;\n      screen.start(documentElement, _objectSpread$1({\n        enableRedraw: true\n      }, baseOptions, {}, options));\n    }\n    /**\n     * Stop rendering.\n     */\n\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      this.screen.stop();\n    }\n    /**\n     * Resize SVG to fit in given size.\n     * @param width\n     * @param height\n     * @param preserveAspectRatio\n     */\n\n  }, {\n    key: \"resize\",\n    value: function resize(width) {\n      var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : width;\n      var preserveAspectRatio = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n      this.documentElement.resize(width, height, preserveAspectRatio);\n    }\n  }], [{\n    key: \"from\",\n    value: function () {\n      var _from = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(ctx, svg) {\n        var options,\n            parser,\n            svgDocument,\n            _args2 = arguments;\n        return _regeneratorRuntime.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                options = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : {};\n                parser = new Parser(options);\n                _context2.next = 4;\n                return parser.parse(svg);\n\n              case 4:\n                svgDocument = _context2.sent;\n                return _context2.abrupt(\"return\", new Canvg(ctx, svgDocument, options));\n\n              case 6:\n              case \"end\":\n                return _context2.stop();\n            }\n          }\n        }, _callee2);\n      }));\n\n      function from(_x, _x2) {\n        return _from.apply(this, arguments);\n      }\n\n      return from;\n    }()\n    /**\n     * Create Canvg isntance from SVG source string.\n     * @param ctx - Rendering context.\n     * @param svg - SVG source string.\n     * @param options - Rendering options.\n     */\n\n  }, {\n    key: \"fromString\",\n    value: function fromString(ctx, svg) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var parser = new Parser(options);\n      var svgDocument = parser.parseFromString(svg);\n      return new Canvg(ctx, svgDocument, options);\n    }\n  }]);\n\n  return Canvg;\n}();\n\n/**\n * Options preset for `OffscreenCanvas`.\n */\nfunction offscreen() {\n  return {\n    window: null,\n    ignoreAnimation: true,\n    ignoreMouse: true,\n    createCanvas: function createCanvas(width, height) {\n      return new OffscreenCanvas(width, height);\n    },\n    createImage: function createImage(url) {\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {\n        var response, blob, img;\n        return _regeneratorRuntime.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return fetch(url);\n\n              case 2:\n                response = _context.sent;\n                _context.next = 5;\n                return response.blob();\n\n              case 5:\n                blob = _context.sent;\n                _context.next = 8;\n                return createImageBitmap(blob);\n\n              case 8:\n                img = _context.sent;\n                return _context.abrupt(\"return\", img);\n\n              case 10:\n              case \"end\":\n                return _context.stop();\n            }\n          }\n        }, _callee);\n      }))();\n    }\n  };\n}\n\n/**\n * Options preset for `node-canvas`.\n * @param config - Preset requirements.\n * @param config.DOMParser - XML/HTML parser from string into DOM Document.\n * @param config.canvas - `node-canvas` exports.\n * @param config.fetch - WHATWG-compatible `fetch` function.\n */\nfunction node(_ref) {\n  var DOMParser = _ref.DOMParser,\n      canvas = _ref.canvas,\n      fetch = _ref.fetch;\n  return {\n    window: null,\n    ignoreAnimation: true,\n    ignoreMouse: true,\n    DOMParser: DOMParser,\n    fetch: fetch,\n    createCanvas: canvas.createCanvas,\n    createImage: canvas.loadImage\n  };\n}\n\n\n\nvar index = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\toffscreen: offscreen,\n\tnode: node\n});\n\nexports.AElement = AElement;\nexports.AnimateColorElement = AnimateColorElement;\nexports.AnimateElement = AnimateElement;\nexports.AnimateTransformElement = AnimateTransformElement;\nexports.BoundingBox = BoundingBox;\nexports.CB1 = CB1;\nexports.CB2 = CB2;\nexports.CB3 = CB3;\nexports.CB4 = CB4;\nexports.Canvg = Canvg;\nexports.CircleElement = CircleElement;\nexports.ClipPathElement = ClipPathElement;\nexports.DefsElement = DefsElement;\nexports.DescElement = DescElement;\nexports.Document = Document;\nexports.Element = Element;\nexports.EllipseElement = EllipseElement;\nexports.FeColorMatrixElement = FeColorMatrixElement;\nexports.FeCompositeElement = FeCompositeElement;\nexports.FeDropShadowElement = FeDropShadowElement;\nexports.FeGaussianBlurElement = FeGaussianBlurElement;\nexports.FeMorphologyElement = FeMorphologyElement;\nexports.FilterElement = FilterElement;\nexports.Font = Font;\nexports.FontElement = FontElement;\nexports.FontFaceElement = FontFaceElement;\nexports.GElement = GElement;\nexports.GlyphElement = GlyphElement;\nexports.GradientElement = GradientElement;\nexports.ImageElement = ImageElement;\nexports.LineElement = LineElement;\nexports.LinearGradientElement = LinearGradientElement;\nexports.MarkerElement = MarkerElement;\nexports.MaskElement = MaskElement;\nexports.Matrix = Matrix;\nexports.MissingGlyphElement = MissingGlyphElement;\nexports.Mouse = Mouse;\nexports.PSEUDO_ZERO = PSEUDO_ZERO;\nexports.Parser = Parser;\nexports.PathElement = PathElement;\nexports.PathParser = PathParser;\nexports.PatternElement = PatternElement;\nexports.Point = Point;\nexports.PolygonElement = PolygonElement;\nexports.PolylineElement = PolylineElement;\nexports.Property = Property;\nexports.QB1 = QB1;\nexports.QB2 = QB2;\nexports.QB3 = QB3;\nexports.RadialGradientElement = RadialGradientElement;\nexports.RectElement = RectElement;\nexports.RenderedElement = RenderedElement;\nexports.Rotate = Rotate;\nexports.SVGElement = SVGElement;\nexports.SVGFontLoader = SVGFontLoader;\nexports.Scale = Scale;\nexports.Screen = Screen;\nexports.Skew = Skew;\nexports.SkewX = SkewX;\nexports.SkewY = SkewY;\nexports.StopElement = StopElement;\nexports.StyleElement = StyleElement;\nexports.SymbolElement = SymbolElement;\nexports.TRefElement = TRefElement;\nexports.TSpanElement = TSpanElement;\nexports.TextElement = TextElement;\nexports.TextPathElement = TextPathElement;\nexports.TitleElement = TitleElement;\nexports.Transform = Transform;\nexports.Translate = Translate;\nexports.UnknownElement = UnknownElement;\nexports.UseElement = UseElement;\nexports.ViewPort = ViewPort;\nexports.compressSpaces = compressSpaces;\nexports.default = Canvg;\nexports.getSelectorSpecificity = getSelectorSpecificity;\nexports.normalizeAttributeName = normalizeAttributeName;\nexports.parseExternalUrl = parseExternalUrl;\nexports.presets = index;\nexports.toNumbers = toNumbers;\nexports.trimLeft = trimLeft;\nexports.trimRight = trimRight;\nexports.vectorMagnitude = vectorMagnitude;\nexports.vectorsAngle = vectorsAngle;\nexports.vectorsRatio = vectorsRatio;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG52YXIgcnVudGltZSA9IChmdW5jdGlvbiAoZXhwb3J0cykge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgYSByZWplY3RlZCBQcm9taXNlIHdhcyB5aWVsZGVkLCB0aHJvdyB0aGUgcmVqZWN0aW9uIGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuXG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkge1xuICAgIGlmIChQcm9taXNlSW1wbCA9PT0gdm9pZCAwKSBQcm9taXNlSW1wbCA9IFByb21pc2U7XG5cbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksXG4gICAgICBQcm9taXNlSW1wbFxuICAgICk7XG5cbiAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgLy8gTm90ZTogW1wicmV0dXJuXCJdIG11c3QgYmUgdXNlZCBmb3IgRVMzIHBhcnNpbmcgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yW1wicmV0dXJuXCJdKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JcIjtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBleHBvcnRzLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlXG4gIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZVxuICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgLy8gaW5qZWN0ZWQgZWFzaWx5IGJ5IGBiaW4vcmVnZW5lcmF0b3IgLS1pbmNsdWRlLXJ1bnRpbWUgc2NyaXB0LmpzYC5cbiAgcmV0dXJuIGV4cG9ydHM7XG5cbn0oXG4gIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge31cbikpO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmVcbiAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgd2UgY2FuIGVzY2FwZVxuICAvLyBzdHJpY3QgbW9kZSB1c2luZyBhIGdsb2JhbCBGdW5jdGlvbiBjYWxsLiBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGZhaWxcbiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmXG4gIC8vIHlvdSd2ZSBtaXNjb25maWd1cmVkIHlvdXIgYnVuZGxlciB0byBmb3JjZSBzdHJpY3QgbW9kZSBhbmQgYXBwbGllZCBhXG4gIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS5cbiAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKShydW50aW1lKTtcbn1cbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiZXhwb3J0cyIsIk9wIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duIiwiaGFzT3duUHJvcGVydHkiLCJ1bmRlZmluZWQiLCIkU3ltYm9sIiwiU3ltYm9sIiwiaXRlcmF0b3JTeW1ib2wiLCJpdGVyYXRvciIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiY3JlYXRlIiwiY29udGV4dCIsIkNvbnRleHQiLCJfaW52b2tlIiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwiZm4iLCJvYmoiLCJhcmciLCJ0eXBlIiwiY2FsbCIsImVyciIsIkdlblN0YXRlU3VzcGVuZGVkU3RhcnQiLCJHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkIiwiR2VuU3RhdGVFeGVjdXRpbmciLCJHZW5TdGF0ZUNvbXBsZXRlZCIsIkNvbnRpbnVlU2VudGluZWwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJnZXRQcm90byIsImdldFByb3RvdHlwZU9mIiwiTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUiLCJ2YWx1ZXMiLCJHcCIsImNvbnN0cnVjdG9yIiwiZGlzcGxheU5hbWUiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwibWV0aG9kIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJfX2F3YWl0IiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwiaW52b2tlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlY29yZCIsInJlc3VsdCIsInZhbHVlIiwidGhlbiIsInVud3JhcHBlZCIsImVycm9yIiwicHJldmlvdXNQcm9taXNlIiwiZW5xdWV1ZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiYXN5bmMiLCJQcm9taXNlIiwiaXRlciIsIm5leHQiLCJkb25lIiwic3RhdGUiLCJFcnJvciIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiVHlwZUVycm9yIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0TG9jIiwidG9TdHJpbmciLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsImtleXMiLCJvYmplY3QiLCJrZXkiLCJyZXZlcnNlIiwibGVuZ3RoIiwicG9wIiwiaXRlcmFibGUiLCJpdGVyYXRvck1ldGhvZCIsImlzTmFOIiwiaSIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicm9vdEVudHJ5Iiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsInRocm93biIsImRlbGVnYXRlWWllbGQiLCJtb2R1bGUiLCJyZWdlbmVyYXRvclJ1bnRpbWUiLCJhY2NpZGVudGFsU3RyaWN0TW9kZSIsIkZ1bmN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7OztBQU9BLE1BQUlBLE9BQU8sR0FBSSxVQUFVQyxPQUFWLEVBQW1CO0FBQ2hDO0FBRUEsUUFBSUMsRUFBRSxHQUFHQyxNQUFNLENBQUNDLFNBQWhCO0FBQ0EsUUFBSUMsTUFBTSxHQUFHSCxFQUFFLENBQUNJLGNBQWhCO0FBQ0EsUUFBSUMsV0FBSixDQUxnQzs7QUFNaEMsUUFBSUMsT0FBTyxHQUFHLE9BQU9DLE1BQVAsS0FBa0IsVUFBbEIsR0FBK0JBLE1BQS9CLEdBQXdDLEVBQXREO0FBQ0EsUUFBSUMsY0FBYyxHQUFHRixPQUFPLENBQUNHLFFBQVIsSUFBb0IsWUFBekM7QUFDQSxRQUFJQyxtQkFBbUIsR0FBR0osT0FBTyxDQUFDSyxhQUFSLElBQXlCLGlCQUFuRDtBQUNBLFFBQUlDLGlCQUFpQixHQUFHTixPQUFPLENBQUNPLFdBQVIsSUFBdUIsZUFBL0M7O0FBRUEsYUFBU0MsSUFBVCxDQUFjQyxPQUFkLEVBQXVCQyxPQUF2QixFQUFnQ0MsSUFBaEMsRUFBc0NDLFdBQXRDLEVBQW1EOztBQUVqRCxVQUFJQyxjQUFjLEdBQUdILE9BQU8sSUFBSUEsT0FBTyxDQUFDZCxTQUFSLFlBQTZCa0IsU0FBeEMsR0FBb0RKLE9BQXBELEdBQThESSxTQUFuRjtBQUNBLFVBQUlDLFNBQVMsR0FBR3BCLE1BQU0sQ0FBQ3FCLE1BQVAsQ0FBY0gsY0FBYyxDQUFDakIsU0FBN0IsQ0FBaEI7QUFDQSxVQUFJcUIsT0FBTyxHQUFHLElBQUlDLE9BQUosQ0FBWU4sV0FBVyxJQUFJLEVBQTNCLENBQWQsQ0FKaUQ7OztBQVFqREcsTUFBQUEsU0FBUyxDQUFDSSxPQUFWLEdBQW9CQyxnQkFBZ0IsQ0FBQ1gsT0FBRCxFQUFVRSxJQUFWLEVBQWdCTSxPQUFoQixDQUFwQztBQUVBLGFBQU9GLFNBQVA7QUFDRDs7QUFDRHRCLElBQUFBLE9BQU8sQ0FBQ2UsSUFBUixHQUFlQSxJQUFmLENBdkJnQzs7Ozs7Ozs7Ozs7QUFtQ2hDLGFBQVNhLFFBQVQsQ0FBa0JDLEVBQWxCLEVBQXNCQyxHQUF0QixFQUEyQkMsR0FBM0IsRUFBZ0M7QUFDOUIsVUFBSTtBQUNGLGVBQU87QUFBRUMsVUFBQUEsSUFBSSxFQUFFLFFBQVI7QUFBa0JELFVBQUFBLEdBQUcsRUFBRUYsRUFBRSxDQUFDSSxJQUFILENBQVFILEdBQVIsRUFBYUMsR0FBYjtBQUF2QixTQUFQO0FBQ0QsT0FGRCxDQUVFLE9BQU9HLEdBQVAsRUFBWTtBQUNaLGVBQU87QUFBRUYsVUFBQUEsSUFBSSxFQUFFLE9BQVI7QUFBaUJELFVBQUFBLEdBQUcsRUFBRUc7QUFBdEIsU0FBUDtBQUNEO0FBQ0Y7O0FBRUQsUUFBSUMsc0JBQXNCLEdBQUcsZ0JBQTdCO0FBQ0EsUUFBSUMsc0JBQXNCLEdBQUcsZ0JBQTdCO0FBQ0EsUUFBSUMsaUJBQWlCLEdBQUcsV0FBeEI7QUFDQSxRQUFJQyxpQkFBaUIsR0FBRyxXQUF4QixDQTlDZ0M7OztBQWtEaEMsUUFBSUMsZ0JBQWdCLEdBQUcsRUFBdkIsQ0FsRGdDOzs7OztBQXdEaEMsYUFBU2xCLFNBQVQsR0FBcUI7O0FBQ3JCLGFBQVNtQixpQkFBVCxHQUE2Qjs7QUFDN0IsYUFBU0MsMEJBQVQsR0FBc0MsRUExRE47Ozs7QUE4RGhDLFFBQUlDLGlCQUFpQixHQUFHLEVBQXhCOztBQUNBQSxJQUFBQSxpQkFBaUIsQ0FBQ2pDLGNBQUQsQ0FBakIsR0FBb0MsWUFBWTtBQUM5QyxhQUFPLElBQVA7QUFDRCxLQUZEOztBQUlBLFFBQUlrQyxRQUFRLEdBQUd6QyxNQUFNLENBQUMwQyxjQUF0QjtBQUNBLFFBQUlDLHVCQUF1QixHQUFHRixRQUFRLElBQUlBLFFBQVEsQ0FBQ0EsUUFBUSxDQUFDRyxNQUFNLENBQUMsRUFBRCxDQUFQLENBQVQsQ0FBbEQ7O0FBQ0EsUUFBSUQsdUJBQXVCLElBQ3ZCQSx1QkFBdUIsS0FBSzVDLEVBRDVCLElBRUFHLE1BQU0sQ0FBQzZCLElBQVAsQ0FBWVksdUJBQVosRUFBcUNwQyxjQUFyQyxDQUZKLEVBRTBEOzs7QUFHeERpQyxNQUFBQSxpQkFBaUIsR0FBR0csdUJBQXBCO0FBQ0Q7O0FBRUQsUUFBSUUsRUFBRSxHQUFHTiwwQkFBMEIsQ0FBQ3RDLFNBQTNCLEdBQ1BrQixTQUFTLENBQUNsQixTQUFWLEdBQXNCRCxNQUFNLENBQUNxQixNQUFQLENBQWNtQixpQkFBZCxDQUR4QjtBQUVBRixJQUFBQSxpQkFBaUIsQ0FBQ3JDLFNBQWxCLEdBQThCNEMsRUFBRSxDQUFDQyxXQUFILEdBQWlCUCwwQkFBL0M7QUFDQUEsSUFBQUEsMEJBQTBCLENBQUNPLFdBQTNCLEdBQXlDUixpQkFBekM7QUFDQUMsSUFBQUEsMEJBQTBCLENBQUM1QixpQkFBRCxDQUExQixHQUNFMkIsaUJBQWlCLENBQUNTLFdBQWxCLEdBQWdDLG1CQURsQyxDQWpGZ0M7OztBQXNGaEMsYUFBU0MscUJBQVQsQ0FBK0IvQyxTQUEvQixFQUEwQztBQUN4QyxPQUFDLE1BQUQsRUFBUyxPQUFULEVBQWtCLFFBQWxCLEVBQTRCZ0QsT0FBNUIsQ0FBb0MsVUFBU0MsTUFBVCxFQUFpQjtBQUNuRGpELFFBQUFBLFNBQVMsQ0FBQ2lELE1BQUQsQ0FBVCxHQUFvQixVQUFTckIsR0FBVCxFQUFjO0FBQ2hDLGlCQUFPLEtBQUtMLE9BQUwsQ0FBYTBCLE1BQWIsRUFBcUJyQixHQUFyQixDQUFQO0FBQ0QsU0FGRDtBQUdELE9BSkQ7QUFLRDs7QUFFRC9CLElBQUFBLE9BQU8sQ0FBQ3FELG1CQUFSLEdBQThCLFVBQVNDLE1BQVQsRUFBaUI7QUFDN0MsVUFBSUMsSUFBSSxHQUFHLE9BQU9ELE1BQVAsS0FBa0IsVUFBbEIsSUFBZ0NBLE1BQU0sQ0FBQ04sV0FBbEQ7QUFDQSxhQUFPTyxJQUFJLEdBQ1BBLElBQUksS0FBS2YsaUJBQVQ7O0FBR0EsT0FBQ2UsSUFBSSxDQUFDTixXQUFMLElBQW9CTSxJQUFJLENBQUNDLElBQTFCLE1BQW9DLG1CQUo3QixHQUtQLEtBTEo7QUFNRCxLQVJEOztBQVVBeEQsSUFBQUEsT0FBTyxDQUFDeUQsSUFBUixHQUFlLFVBQVNILE1BQVQsRUFBaUI7QUFDOUIsVUFBSXBELE1BQU0sQ0FBQ3dELGNBQVgsRUFBMkI7QUFDekJ4RCxRQUFBQSxNQUFNLENBQUN3RCxjQUFQLENBQXNCSixNQUF0QixFQUE4QmIsMEJBQTlCO0FBQ0QsT0FGRCxNQUVPO0FBQ0xhLFFBQUFBLE1BQU0sQ0FBQ0ssU0FBUCxHQUFtQmxCLDBCQUFuQjs7QUFDQSxZQUFJLEVBQUU1QixpQkFBaUIsSUFBSXlDLE1BQXZCLENBQUosRUFBb0M7QUFDbENBLFVBQUFBLE1BQU0sQ0FBQ3pDLGlCQUFELENBQU4sR0FBNEIsbUJBQTVCO0FBQ0Q7QUFDRjs7QUFDRHlDLE1BQUFBLE1BQU0sQ0FBQ25ELFNBQVAsR0FBbUJELE1BQU0sQ0FBQ3FCLE1BQVAsQ0FBY3dCLEVBQWQsQ0FBbkI7QUFDQSxhQUFPTyxNQUFQO0FBQ0QsS0FYRCxDQXhHZ0M7Ozs7OztBQXlIaEN0RCxJQUFBQSxPQUFPLENBQUM0RCxLQUFSLEdBQWdCLFVBQVM3QixHQUFULEVBQWM7QUFDNUIsYUFBTztBQUFFOEIsUUFBQUEsT0FBTyxFQUFFOUI7QUFBWCxPQUFQO0FBQ0QsS0FGRDs7QUFJQSxhQUFTK0IsYUFBVCxDQUF1QnhDLFNBQXZCLEVBQWtDeUMsV0FBbEMsRUFBK0M7QUFDN0MsZUFBU0MsTUFBVCxDQUFnQlosTUFBaEIsRUFBd0JyQixHQUF4QixFQUE2QmtDLE9BQTdCLEVBQXNDQyxNQUF0QyxFQUE4QztBQUM1QyxZQUFJQyxNQUFNLEdBQUd2QyxRQUFRLENBQUNOLFNBQVMsQ0FBQzhCLE1BQUQsQ0FBVixFQUFvQjlCLFNBQXBCLEVBQStCUyxHQUEvQixDQUFyQjs7QUFDQSxZQUFJb0MsTUFBTSxDQUFDbkMsSUFBUCxLQUFnQixPQUFwQixFQUE2QjtBQUMzQmtDLFVBQUFBLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDcEMsR0FBUixDQUFOO0FBQ0QsU0FGRCxNQUVPO0FBQ0wsY0FBSXFDLE1BQU0sR0FBR0QsTUFBTSxDQUFDcEMsR0FBcEI7QUFDQSxjQUFJc0MsS0FBSyxHQUFHRCxNQUFNLENBQUNDLEtBQW5COztBQUNBLGNBQUlBLEtBQUssSUFDTCxPQUFPQSxLQUFQLEtBQWlCLFFBRGpCLElBRUFqRSxNQUFNLENBQUM2QixJQUFQLENBQVlvQyxLQUFaLEVBQW1CLFNBQW5CLENBRkosRUFFbUM7QUFDakMsbUJBQU9OLFdBQVcsQ0FBQ0UsT0FBWixDQUFvQkksS0FBSyxDQUFDUixPQUExQixFQUFtQ1MsSUFBbkMsQ0FBd0MsVUFBU0QsS0FBVCxFQUFnQjtBQUM3REwsY0FBQUEsTUFBTSxDQUFDLE1BQUQsRUFBU0ssS0FBVCxFQUFnQkosT0FBaEIsRUFBeUJDLE1BQXpCLENBQU47QUFDRCxhQUZNLEVBRUosVUFBU2hDLEdBQVQsRUFBYztBQUNmOEIsY0FBQUEsTUFBTSxDQUFDLE9BQUQsRUFBVTlCLEdBQVYsRUFBZStCLE9BQWYsRUFBd0JDLE1BQXhCLENBQU47QUFDRCxhQUpNLENBQVA7QUFLRDs7QUFFRCxpQkFBT0gsV0FBVyxDQUFDRSxPQUFaLENBQW9CSSxLQUFwQixFQUEyQkMsSUFBM0IsQ0FBZ0MsVUFBU0MsU0FBVCxFQUFvQjs7OztBQUl6REgsWUFBQUEsTUFBTSxDQUFDQyxLQUFQLEdBQWVFLFNBQWY7QUFDQU4sWUFBQUEsT0FBTyxDQUFDRyxNQUFELENBQVA7QUFDRCxXQU5NLEVBTUosVUFBU0ksS0FBVCxFQUFnQjs7O0FBR2pCLG1CQUFPUixNQUFNLENBQUMsT0FBRCxFQUFVUSxLQUFWLEVBQWlCUCxPQUFqQixFQUEwQkMsTUFBMUIsQ0FBYjtBQUNELFdBVk0sQ0FBUDtBQVdEO0FBQ0Y7O0FBRUQsVUFBSU8sZUFBSjs7QUFFQSxlQUFTQyxPQUFULENBQWlCdEIsTUFBakIsRUFBeUJyQixHQUF6QixFQUE4QjtBQUM1QixpQkFBUzRDLDBCQUFULEdBQXNDO0FBQ3BDLGlCQUFPLElBQUlaLFdBQUosQ0FBZ0IsVUFBU0UsT0FBVCxFQUFrQkMsTUFBbEIsRUFBMEI7QUFDL0NGLFlBQUFBLE1BQU0sQ0FBQ1osTUFBRCxFQUFTckIsR0FBVCxFQUFja0MsT0FBZCxFQUF1QkMsTUFBdkIsQ0FBTjtBQUNELFdBRk0sQ0FBUDtBQUdEOztBQUVELGVBQU9PLGVBQWU7Ozs7Ozs7Ozs7OztBQWFwQkEsUUFBQUEsZUFBZSxHQUFHQSxlQUFlLENBQUNILElBQWhCLENBQ2hCSywwQkFEZ0I7O0FBSWhCQSxRQUFBQSwwQkFKZ0IsQ0FBSCxHQUtYQSwwQkFBMEIsRUFsQmhDO0FBbUJELE9BNUQ0Qzs7OztBQWdFN0MsV0FBS2pELE9BQUwsR0FBZWdELE9BQWY7QUFDRDs7QUFFRHhCLElBQUFBLHFCQUFxQixDQUFDWSxhQUFhLENBQUMzRCxTQUFmLENBQXJCOztBQUNBMkQsSUFBQUEsYUFBYSxDQUFDM0QsU0FBZCxDQUF3QlEsbUJBQXhCLElBQStDLFlBQVk7QUFDekQsYUFBTyxJQUFQO0FBQ0QsS0FGRDs7QUFHQVgsSUFBQUEsT0FBTyxDQUFDOEQsYUFBUixHQUF3QkEsYUFBeEIsQ0FwTWdDOzs7O0FBeU1oQzlELElBQUFBLE9BQU8sQ0FBQzRFLEtBQVIsR0FBZ0IsVUFBUzVELE9BQVQsRUFBa0JDLE9BQWxCLEVBQTJCQyxJQUEzQixFQUFpQ0MsV0FBakMsRUFBOEM0QyxXQUE5QyxFQUEyRDtBQUN6RSxVQUFJQSxXQUFXLEtBQUssS0FBSyxDQUF6QixFQUE0QkEsV0FBVyxHQUFHYyxPQUFkO0FBRTVCLFVBQUlDLElBQUksR0FBRyxJQUFJaEIsYUFBSixDQUNUL0MsSUFBSSxDQUFDQyxPQUFELEVBQVVDLE9BQVYsRUFBbUJDLElBQW5CLEVBQXlCQyxXQUF6QixDQURLLEVBRVQ0QyxXQUZTLENBQVg7QUFLQSxhQUFPL0QsT0FBTyxDQUFDcUQsbUJBQVIsQ0FBNEJwQyxPQUE1QixJQUNINkQsSUFERztBQUFBLFFBRUhBLElBQUksQ0FBQ0MsSUFBTCxHQUFZVCxJQUFaLENBQWlCLFVBQVNGLE1BQVQsRUFBaUI7QUFDaEMsZUFBT0EsTUFBTSxDQUFDWSxJQUFQLEdBQWNaLE1BQU0sQ0FBQ0MsS0FBckIsR0FBNkJTLElBQUksQ0FBQ0MsSUFBTCxFQUFwQztBQUNELE9BRkQsQ0FGSjtBQUtELEtBYkQ7O0FBZUEsYUFBU3BELGdCQUFULENBQTBCWCxPQUExQixFQUFtQ0UsSUFBbkMsRUFBeUNNLE9BQXpDLEVBQWtEO0FBQ2hELFVBQUl5RCxLQUFLLEdBQUc5QyxzQkFBWjtBQUVBLGFBQU8sU0FBUzZCLE1BQVQsQ0FBZ0JaLE1BQWhCLEVBQXdCckIsR0FBeEIsRUFBNkI7QUFDbEMsWUFBSWtELEtBQUssS0FBSzVDLGlCQUFkLEVBQWlDO0FBQy9CLGdCQUFNLElBQUk2QyxLQUFKLENBQVUsOEJBQVYsQ0FBTjtBQUNEOztBQUVELFlBQUlELEtBQUssS0FBSzNDLGlCQUFkLEVBQWlDO0FBQy9CLGNBQUljLE1BQU0sS0FBSyxPQUFmLEVBQXdCO0FBQ3RCLGtCQUFNckIsR0FBTjtBQUNELFdBSDhCOzs7O0FBTy9CLGlCQUFPb0QsVUFBVSxFQUFqQjtBQUNEOztBQUVEM0QsUUFBQUEsT0FBTyxDQUFDNEIsTUFBUixHQUFpQkEsTUFBakI7QUFDQTVCLFFBQUFBLE9BQU8sQ0FBQ08sR0FBUixHQUFjQSxHQUFkOztBQUVBLGVBQU8sSUFBUCxFQUFhO0FBQ1gsY0FBSXFELFFBQVEsR0FBRzVELE9BQU8sQ0FBQzRELFFBQXZCOztBQUNBLGNBQUlBLFFBQUosRUFBYztBQUNaLGdCQUFJQyxjQUFjLEdBQUdDLG1CQUFtQixDQUFDRixRQUFELEVBQVc1RCxPQUFYLENBQXhDOztBQUNBLGdCQUFJNkQsY0FBSixFQUFvQjtBQUNsQixrQkFBSUEsY0FBYyxLQUFLOUMsZ0JBQXZCLEVBQXlDO0FBQ3pDLHFCQUFPOEMsY0FBUDtBQUNEO0FBQ0Y7O0FBRUQsY0FBSTdELE9BQU8sQ0FBQzRCLE1BQVIsS0FBbUIsTUFBdkIsRUFBK0I7OztBQUc3QjVCLFlBQUFBLE9BQU8sQ0FBQytELElBQVIsR0FBZS9ELE9BQU8sQ0FBQ2dFLEtBQVIsR0FBZ0JoRSxPQUFPLENBQUNPLEdBQXZDO0FBRUQsV0FMRCxNQUtPLElBQUlQLE9BQU8sQ0FBQzRCLE1BQVIsS0FBbUIsT0FBdkIsRUFBZ0M7QUFDckMsZ0JBQUk2QixLQUFLLEtBQUs5QyxzQkFBZCxFQUFzQztBQUNwQzhDLGNBQUFBLEtBQUssR0FBRzNDLGlCQUFSO0FBQ0Esb0JBQU1kLE9BQU8sQ0FBQ08sR0FBZDtBQUNEOztBQUVEUCxZQUFBQSxPQUFPLENBQUNpRSxpQkFBUixDQUEwQmpFLE9BQU8sQ0FBQ08sR0FBbEM7QUFFRCxXQVJNLE1BUUEsSUFBSVAsT0FBTyxDQUFDNEIsTUFBUixLQUFtQixRQUF2QixFQUFpQztBQUN0QzVCLFlBQUFBLE9BQU8sQ0FBQ2tFLE1BQVIsQ0FBZSxRQUFmLEVBQXlCbEUsT0FBTyxDQUFDTyxHQUFqQztBQUNEOztBQUVEa0QsVUFBQUEsS0FBSyxHQUFHNUMsaUJBQVI7QUFFQSxjQUFJOEIsTUFBTSxHQUFHdkMsUUFBUSxDQUFDWixPQUFELEVBQVVFLElBQVYsRUFBZ0JNLE9BQWhCLENBQXJCOztBQUNBLGNBQUkyQyxNQUFNLENBQUNuQyxJQUFQLEtBQWdCLFFBQXBCLEVBQThCOzs7QUFHNUJpRCxZQUFBQSxLQUFLLEdBQUd6RCxPQUFPLENBQUN3RCxJQUFSLEdBQ0oxQyxpQkFESSxHQUVKRixzQkFGSjs7QUFJQSxnQkFBSStCLE1BQU0sQ0FBQ3BDLEdBQVAsS0FBZVEsZ0JBQW5CLEVBQXFDO0FBQ25DO0FBQ0Q7O0FBRUQsbUJBQU87QUFDTDhCLGNBQUFBLEtBQUssRUFBRUYsTUFBTSxDQUFDcEMsR0FEVDtBQUVMaUQsY0FBQUEsSUFBSSxFQUFFeEQsT0FBTyxDQUFDd0Q7QUFGVCxhQUFQO0FBS0QsV0FoQkQsTUFnQk8sSUFBSWIsTUFBTSxDQUFDbkMsSUFBUCxLQUFnQixPQUFwQixFQUE2QjtBQUNsQ2lELFlBQUFBLEtBQUssR0FBRzNDLGlCQUFSLENBRGtDOzs7QUFJbENkLFlBQUFBLE9BQU8sQ0FBQzRCLE1BQVIsR0FBaUIsT0FBakI7QUFDQTVCLFlBQUFBLE9BQU8sQ0FBQ08sR0FBUixHQUFjb0MsTUFBTSxDQUFDcEMsR0FBckI7QUFDRDtBQUNGO0FBQ0YsT0F4RUQ7QUF5RUQsS0FwUytCOzs7Ozs7QUEwU2hDLGFBQVN1RCxtQkFBVCxDQUE2QkYsUUFBN0IsRUFBdUM1RCxPQUF2QyxFQUFnRDtBQUM5QyxVQUFJNEIsTUFBTSxHQUFHZ0MsUUFBUSxDQUFDMUUsUUFBVCxDQUFrQmMsT0FBTyxDQUFDNEIsTUFBMUIsQ0FBYjs7QUFDQSxVQUFJQSxNQUFNLEtBQUs5QyxXQUFmLEVBQTBCOzs7QUFHeEJrQixRQUFBQSxPQUFPLENBQUM0RCxRQUFSLEdBQW1CLElBQW5COztBQUVBLFlBQUk1RCxPQUFPLENBQUM0QixNQUFSLEtBQW1CLE9BQXZCLEVBQWdDOztBQUU5QixjQUFJZ0MsUUFBUSxDQUFDMUUsUUFBVCxDQUFrQixRQUFsQixDQUFKLEVBQWlDOzs7QUFHL0JjLFlBQUFBLE9BQU8sQ0FBQzRCLE1BQVIsR0FBaUIsUUFBakI7QUFDQTVCLFlBQUFBLE9BQU8sQ0FBQ08sR0FBUixHQUFjekIsV0FBZDtBQUNBZ0YsWUFBQUEsbUJBQW1CLENBQUNGLFFBQUQsRUFBVzVELE9BQVgsQ0FBbkI7O0FBRUEsZ0JBQUlBLE9BQU8sQ0FBQzRCLE1BQVIsS0FBbUIsT0FBdkIsRUFBZ0M7OztBQUc5QixxQkFBT2IsZ0JBQVA7QUFDRDtBQUNGOztBQUVEZixVQUFBQSxPQUFPLENBQUM0QixNQUFSLEdBQWlCLE9BQWpCO0FBQ0E1QixVQUFBQSxPQUFPLENBQUNPLEdBQVIsR0FBYyxJQUFJNEQsU0FBSixDQUNaLGdEQURZLENBQWQ7QUFFRDs7QUFFRCxlQUFPcEQsZ0JBQVA7QUFDRDs7QUFFRCxVQUFJNEIsTUFBTSxHQUFHdkMsUUFBUSxDQUFDd0IsTUFBRCxFQUFTZ0MsUUFBUSxDQUFDMUUsUUFBbEIsRUFBNEJjLE9BQU8sQ0FBQ08sR0FBcEMsQ0FBckI7O0FBRUEsVUFBSW9DLE1BQU0sQ0FBQ25DLElBQVAsS0FBZ0IsT0FBcEIsRUFBNkI7QUFDM0JSLFFBQUFBLE9BQU8sQ0FBQzRCLE1BQVIsR0FBaUIsT0FBakI7QUFDQTVCLFFBQUFBLE9BQU8sQ0FBQ08sR0FBUixHQUFjb0MsTUFBTSxDQUFDcEMsR0FBckI7QUFDQVAsUUFBQUEsT0FBTyxDQUFDNEQsUUFBUixHQUFtQixJQUFuQjtBQUNBLGVBQU83QyxnQkFBUDtBQUNEOztBQUVELFVBQUlxRCxJQUFJLEdBQUd6QixNQUFNLENBQUNwQyxHQUFsQjs7QUFFQSxVQUFJLENBQUU2RCxJQUFOLEVBQVk7QUFDVnBFLFFBQUFBLE9BQU8sQ0FBQzRCLE1BQVIsR0FBaUIsT0FBakI7QUFDQTVCLFFBQUFBLE9BQU8sQ0FBQ08sR0FBUixHQUFjLElBQUk0RCxTQUFKLENBQWMsa0NBQWQsQ0FBZDtBQUNBbkUsUUFBQUEsT0FBTyxDQUFDNEQsUUFBUixHQUFtQixJQUFuQjtBQUNBLGVBQU83QyxnQkFBUDtBQUNEOztBQUVELFVBQUlxRCxJQUFJLENBQUNaLElBQVQsRUFBZTs7O0FBR2J4RCxRQUFBQSxPQUFPLENBQUM0RCxRQUFRLENBQUNTLFVBQVYsQ0FBUCxHQUErQkQsSUFBSSxDQUFDdkIsS0FBcEMsQ0FIYTs7QUFNYjdDLFFBQUFBLE9BQU8sQ0FBQ3VELElBQVIsR0FBZUssUUFBUSxDQUFDVSxPQUF4QixDQU5hOzs7Ozs7O0FBY2IsWUFBSXRFLE9BQU8sQ0FBQzRCLE1BQVIsS0FBbUIsUUFBdkIsRUFBaUM7QUFDL0I1QixVQUFBQSxPQUFPLENBQUM0QixNQUFSLEdBQWlCLE1BQWpCO0FBQ0E1QixVQUFBQSxPQUFPLENBQUNPLEdBQVIsR0FBY3pCLFdBQWQ7QUFDRDtBQUVGLE9BbkJELE1BbUJPOztBQUVMLGVBQU9zRixJQUFQO0FBQ0QsT0F2RTZDOzs7O0FBMkU5Q3BFLE1BQUFBLE9BQU8sQ0FBQzRELFFBQVIsR0FBbUIsSUFBbkI7QUFDQSxhQUFPN0MsZ0JBQVA7QUFDRCxLQXZYK0I7Ozs7QUEyWGhDVyxJQUFBQSxxQkFBcUIsQ0FBQ0gsRUFBRCxDQUFyQjtBQUVBQSxJQUFBQSxFQUFFLENBQUNsQyxpQkFBRCxDQUFGLEdBQXdCLFdBQXhCLENBN1hnQzs7Ozs7O0FBb1loQ2tDLElBQUFBLEVBQUUsQ0FBQ3RDLGNBQUQsQ0FBRixHQUFxQixZQUFXO0FBQzlCLGFBQU8sSUFBUDtBQUNELEtBRkQ7O0FBSUFzQyxJQUFBQSxFQUFFLENBQUNnRCxRQUFILEdBQWMsWUFBVztBQUN2QixhQUFPLG9CQUFQO0FBQ0QsS0FGRDs7QUFJQSxhQUFTQyxZQUFULENBQXNCQyxJQUF0QixFQUE0QjtBQUMxQixVQUFJQyxLQUFLLEdBQUc7QUFBRUMsUUFBQUEsTUFBTSxFQUFFRixJQUFJLENBQUMsQ0FBRDtBQUFkLE9BQVo7O0FBRUEsVUFBSSxLQUFLQSxJQUFULEVBQWU7QUFDYkMsUUFBQUEsS0FBSyxDQUFDRSxRQUFOLEdBQWlCSCxJQUFJLENBQUMsQ0FBRCxDQUFyQjtBQUNEOztBQUVELFVBQUksS0FBS0EsSUFBVCxFQUFlO0FBQ2JDLFFBQUFBLEtBQUssQ0FBQ0csVUFBTixHQUFtQkosSUFBSSxDQUFDLENBQUQsQ0FBdkI7QUFDQUMsUUFBQUEsS0FBSyxDQUFDSSxRQUFOLEdBQWlCTCxJQUFJLENBQUMsQ0FBRCxDQUFyQjtBQUNEOztBQUVELFdBQUtNLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCTixLQUFyQjtBQUNEOztBQUVELGFBQVNPLGFBQVQsQ0FBdUJQLEtBQXZCLEVBQThCO0FBQzVCLFVBQUkvQixNQUFNLEdBQUcrQixLQUFLLENBQUNRLFVBQU4sSUFBb0IsRUFBakM7QUFDQXZDLE1BQUFBLE1BQU0sQ0FBQ25DLElBQVAsR0FBYyxRQUFkO0FBQ0EsYUFBT21DLE1BQU0sQ0FBQ3BDLEdBQWQ7QUFDQW1FLE1BQUFBLEtBQUssQ0FBQ1EsVUFBTixHQUFtQnZDLE1BQW5CO0FBQ0Q7O0FBRUQsYUFBUzFDLE9BQVQsQ0FBaUJOLFdBQWpCLEVBQThCOzs7O0FBSTVCLFdBQUtvRixVQUFMLEdBQWtCLENBQUM7QUFBRUosUUFBQUEsTUFBTSxFQUFFO0FBQVYsT0FBRCxDQUFsQjtBQUNBaEYsTUFBQUEsV0FBVyxDQUFDZ0MsT0FBWixDQUFvQjZDLFlBQXBCLEVBQWtDLElBQWxDO0FBQ0EsV0FBS1csS0FBTCxDQUFXLElBQVg7QUFDRDs7QUFFRDNHLElBQUFBLE9BQU8sQ0FBQzRHLElBQVIsR0FBZSxVQUFTQyxNQUFULEVBQWlCO0FBQzlCLFVBQUlELElBQUksR0FBRyxFQUFYOztBQUNBLFdBQUssSUFBSUUsR0FBVCxJQUFnQkQsTUFBaEIsRUFBd0I7QUFDdEJELFFBQUFBLElBQUksQ0FBQ0osSUFBTCxDQUFVTSxHQUFWO0FBQ0Q7O0FBQ0RGLE1BQUFBLElBQUksQ0FBQ0csT0FBTCxHQUw4Qjs7O0FBUzlCLGFBQU8sU0FBU2hDLElBQVQsR0FBZ0I7QUFDckIsZUFBTzZCLElBQUksQ0FBQ0ksTUFBWixFQUFvQjtBQUNsQixjQUFJRixHQUFHLEdBQUdGLElBQUksQ0FBQ0ssR0FBTCxFQUFWOztBQUNBLGNBQUlILEdBQUcsSUFBSUQsTUFBWCxFQUFtQjtBQUNqQjlCLFlBQUFBLElBQUksQ0FBQ1YsS0FBTCxHQUFheUMsR0FBYjtBQUNBL0IsWUFBQUEsSUFBSSxDQUFDQyxJQUFMLEdBQVksS0FBWjtBQUNBLG1CQUFPRCxJQUFQO0FBQ0Q7QUFDRixTQVJvQjs7Ozs7QUFhckJBLFFBQUFBLElBQUksQ0FBQ0MsSUFBTCxHQUFZLElBQVo7QUFDQSxlQUFPRCxJQUFQO0FBQ0QsT0FmRDtBQWdCRCxLQXpCRDs7QUEyQkEsYUFBU2pDLE1BQVQsQ0FBZ0JvRSxRQUFoQixFQUEwQjtBQUN4QixVQUFJQSxRQUFKLEVBQWM7QUFDWixZQUFJQyxjQUFjLEdBQUdELFFBQVEsQ0FBQ3pHLGNBQUQsQ0FBN0I7O0FBQ0EsWUFBSTBHLGNBQUosRUFBb0I7QUFDbEIsaUJBQU9BLGNBQWMsQ0FBQ2xGLElBQWYsQ0FBb0JpRixRQUFwQixDQUFQO0FBQ0Q7O0FBRUQsWUFBSSxPQUFPQSxRQUFRLENBQUNuQyxJQUFoQixLQUF5QixVQUE3QixFQUF5QztBQUN2QyxpQkFBT21DLFFBQVA7QUFDRDs7QUFFRCxZQUFJLENBQUNFLEtBQUssQ0FBQ0YsUUFBUSxDQUFDRixNQUFWLENBQVYsRUFBNkI7QUFDM0IsY0FBSUssQ0FBQyxHQUFHLENBQUMsQ0FBVDtBQUFBLGNBQVl0QyxJQUFJLEdBQUcsU0FBU0EsSUFBVCxHQUFnQjtBQUNqQyxtQkFBTyxFQUFFc0MsQ0FBRixHQUFNSCxRQUFRLENBQUNGLE1BQXRCLEVBQThCO0FBQzVCLGtCQUFJNUcsTUFBTSxDQUFDNkIsSUFBUCxDQUFZaUYsUUFBWixFQUFzQkcsQ0FBdEIsQ0FBSixFQUE4QjtBQUM1QnRDLGdCQUFBQSxJQUFJLENBQUNWLEtBQUwsR0FBYTZDLFFBQVEsQ0FBQ0csQ0FBRCxDQUFyQjtBQUNBdEMsZ0JBQUFBLElBQUksQ0FBQ0MsSUFBTCxHQUFZLEtBQVo7QUFDQSx1QkFBT0QsSUFBUDtBQUNEO0FBQ0Y7O0FBRURBLFlBQUFBLElBQUksQ0FBQ1YsS0FBTCxHQUFhL0QsV0FBYjtBQUNBeUUsWUFBQUEsSUFBSSxDQUFDQyxJQUFMLEdBQVksSUFBWjtBQUVBLG1CQUFPRCxJQUFQO0FBQ0QsV0FiRDs7QUFlQSxpQkFBT0EsSUFBSSxDQUFDQSxJQUFMLEdBQVlBLElBQW5CO0FBQ0Q7QUFDRixPQTdCdUI7OztBQWdDeEIsYUFBTztBQUFFQSxRQUFBQSxJQUFJLEVBQUVJO0FBQVIsT0FBUDtBQUNEOztBQUNEbkYsSUFBQUEsT0FBTyxDQUFDOEMsTUFBUixHQUFpQkEsTUFBakI7O0FBRUEsYUFBU3FDLFVBQVQsR0FBc0I7QUFDcEIsYUFBTztBQUFFZCxRQUFBQSxLQUFLLEVBQUUvRCxXQUFUO0FBQW9CMEUsUUFBQUEsSUFBSSxFQUFFO0FBQTFCLE9BQVA7QUFDRDs7QUFFRHZELElBQUFBLE9BQU8sQ0FBQ3RCLFNBQVIsR0FBb0I7QUFDbEI2QyxNQUFBQSxXQUFXLEVBQUV2QixPQURLO0FBR2xCa0YsTUFBQUEsS0FBSyxFQUFFLFVBQVNXLGFBQVQsRUFBd0I7QUFDN0IsYUFBS0MsSUFBTCxHQUFZLENBQVo7QUFDQSxhQUFLeEMsSUFBTCxHQUFZLENBQVosQ0FGNkI7OztBQUs3QixhQUFLUSxJQUFMLEdBQVksS0FBS0MsS0FBTCxHQUFhbEYsV0FBekI7QUFDQSxhQUFLMEUsSUFBTCxHQUFZLEtBQVo7QUFDQSxhQUFLSSxRQUFMLEdBQWdCLElBQWhCO0FBRUEsYUFBS2hDLE1BQUwsR0FBYyxNQUFkO0FBQ0EsYUFBS3JCLEdBQUwsR0FBV3pCLFdBQVg7QUFFQSxhQUFLaUcsVUFBTCxDQUFnQnBELE9BQWhCLENBQXdCc0QsYUFBeEI7O0FBRUEsWUFBSSxDQUFDYSxhQUFMLEVBQW9CO0FBQ2xCLGVBQUssSUFBSTlELElBQVQsSUFBaUIsSUFBakIsRUFBdUI7O0FBRXJCLGdCQUFJQSxJQUFJLENBQUNnRSxNQUFMLENBQVksQ0FBWixNQUFtQixHQUFuQixJQUNBcEgsTUFBTSxDQUFDNkIsSUFBUCxDQUFZLElBQVosRUFBa0J1QixJQUFsQixDQURBLElBRUEsQ0FBQzRELEtBQUssQ0FBQyxDQUFDNUQsSUFBSSxDQUFDaUUsS0FBTCxDQUFXLENBQVgsQ0FBRixDQUZWLEVBRTRCO0FBQzFCLG1CQUFLakUsSUFBTCxJQUFhbEQsV0FBYjtBQUNEO0FBQ0Y7QUFDRjtBQUNGLE9BM0JpQjtBQTZCbEJvSCxNQUFBQSxJQUFJLEVBQUUsWUFBVztBQUNmLGFBQUsxQyxJQUFMLEdBQVksSUFBWjtBQUVBLFlBQUkyQyxTQUFTLEdBQUcsS0FBS3BCLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FBaEI7QUFDQSxZQUFJcUIsVUFBVSxHQUFHRCxTQUFTLENBQUNqQixVQUEzQjs7QUFDQSxZQUFJa0IsVUFBVSxDQUFDNUYsSUFBWCxLQUFvQixPQUF4QixFQUFpQztBQUMvQixnQkFBTTRGLFVBQVUsQ0FBQzdGLEdBQWpCO0FBQ0Q7O0FBRUQsZUFBTyxLQUFLOEYsSUFBWjtBQUNELE9BdkNpQjtBQXlDbEJwQyxNQUFBQSxpQkFBaUIsRUFBRSxVQUFTcUMsU0FBVCxFQUFvQjtBQUNyQyxZQUFJLEtBQUs5QyxJQUFULEVBQWU7QUFDYixnQkFBTThDLFNBQU47QUFDRDs7QUFFRCxZQUFJdEcsT0FBTyxHQUFHLElBQWQ7O0FBQ0EsaUJBQVN1RyxNQUFULENBQWdCQyxHQUFoQixFQUFxQkMsTUFBckIsRUFBNkI7QUFDM0I5RCxVQUFBQSxNQUFNLENBQUNuQyxJQUFQLEdBQWMsT0FBZDtBQUNBbUMsVUFBQUEsTUFBTSxDQUFDcEMsR0FBUCxHQUFhK0YsU0FBYjtBQUNBdEcsVUFBQUEsT0FBTyxDQUFDdUQsSUFBUixHQUFlaUQsR0FBZjs7QUFFQSxjQUFJQyxNQUFKLEVBQVk7OztBQUdWekcsWUFBQUEsT0FBTyxDQUFDNEIsTUFBUixHQUFpQixNQUFqQjtBQUNBNUIsWUFBQUEsT0FBTyxDQUFDTyxHQUFSLEdBQWN6QixXQUFkO0FBQ0Q7O0FBRUQsaUJBQU8sQ0FBQyxDQUFFMkgsTUFBVjtBQUNEOztBQUVELGFBQUssSUFBSVosQ0FBQyxHQUFHLEtBQUtkLFVBQUwsQ0FBZ0JTLE1BQWhCLEdBQXlCLENBQXRDLEVBQXlDSyxDQUFDLElBQUksQ0FBOUMsRUFBaUQsRUFBRUEsQ0FBbkQsRUFBc0Q7QUFDcEQsY0FBSW5CLEtBQUssR0FBRyxLQUFLSyxVQUFMLENBQWdCYyxDQUFoQixDQUFaO0FBQ0EsY0FBSWxELE1BQU0sR0FBRytCLEtBQUssQ0FBQ1EsVUFBbkI7O0FBRUEsY0FBSVIsS0FBSyxDQUFDQyxNQUFOLEtBQWlCLE1BQXJCLEVBQTZCOzs7O0FBSTNCLG1CQUFPNEIsTUFBTSxDQUFDLEtBQUQsQ0FBYjtBQUNEOztBQUVELGNBQUk3QixLQUFLLENBQUNDLE1BQU4sSUFBZ0IsS0FBS29CLElBQXpCLEVBQStCO0FBQzdCLGdCQUFJVyxRQUFRLEdBQUc5SCxNQUFNLENBQUM2QixJQUFQLENBQVlpRSxLQUFaLEVBQW1CLFVBQW5CLENBQWY7QUFDQSxnQkFBSWlDLFVBQVUsR0FBRy9ILE1BQU0sQ0FBQzZCLElBQVAsQ0FBWWlFLEtBQVosRUFBbUIsWUFBbkIsQ0FBakI7O0FBRUEsZ0JBQUlnQyxRQUFRLElBQUlDLFVBQWhCLEVBQTRCO0FBQzFCLGtCQUFJLEtBQUtaLElBQUwsR0FBWXJCLEtBQUssQ0FBQ0UsUUFBdEIsRUFBZ0M7QUFDOUIsdUJBQU8yQixNQUFNLENBQUM3QixLQUFLLENBQUNFLFFBQVAsRUFBaUIsSUFBakIsQ0FBYjtBQUNELGVBRkQsTUFFTyxJQUFJLEtBQUttQixJQUFMLEdBQVlyQixLQUFLLENBQUNHLFVBQXRCLEVBQWtDO0FBQ3ZDLHVCQUFPMEIsTUFBTSxDQUFDN0IsS0FBSyxDQUFDRyxVQUFQLENBQWI7QUFDRDtBQUVGLGFBUEQsTUFPTyxJQUFJNkIsUUFBSixFQUFjO0FBQ25CLGtCQUFJLEtBQUtYLElBQUwsR0FBWXJCLEtBQUssQ0FBQ0UsUUFBdEIsRUFBZ0M7QUFDOUIsdUJBQU8yQixNQUFNLENBQUM3QixLQUFLLENBQUNFLFFBQVAsRUFBaUIsSUFBakIsQ0FBYjtBQUNEO0FBRUYsYUFMTSxNQUtBLElBQUkrQixVQUFKLEVBQWdCO0FBQ3JCLGtCQUFJLEtBQUtaLElBQUwsR0FBWXJCLEtBQUssQ0FBQ0csVUFBdEIsRUFBa0M7QUFDaEMsdUJBQU8wQixNQUFNLENBQUM3QixLQUFLLENBQUNHLFVBQVAsQ0FBYjtBQUNEO0FBRUYsYUFMTSxNQUtBO0FBQ0wsb0JBQU0sSUFBSW5CLEtBQUosQ0FBVSx3Q0FBVixDQUFOO0FBQ0Q7QUFDRjtBQUNGO0FBQ0YsT0FuR2lCO0FBcUdsQlEsTUFBQUEsTUFBTSxFQUFFLFVBQVMxRCxJQUFULEVBQWVELEdBQWYsRUFBb0I7QUFDMUIsYUFBSyxJQUFJc0YsQ0FBQyxHQUFHLEtBQUtkLFVBQUwsQ0FBZ0JTLE1BQWhCLEdBQXlCLENBQXRDLEVBQXlDSyxDQUFDLElBQUksQ0FBOUMsRUFBaUQsRUFBRUEsQ0FBbkQsRUFBc0Q7QUFDcEQsY0FBSW5CLEtBQUssR0FBRyxLQUFLSyxVQUFMLENBQWdCYyxDQUFoQixDQUFaOztBQUNBLGNBQUluQixLQUFLLENBQUNDLE1BQU4sSUFBZ0IsS0FBS29CLElBQXJCLElBQ0FuSCxNQUFNLENBQUM2QixJQUFQLENBQVlpRSxLQUFaLEVBQW1CLFlBQW5CLENBREEsSUFFQSxLQUFLcUIsSUFBTCxHQUFZckIsS0FBSyxDQUFDRyxVQUZ0QixFQUVrQztBQUNoQyxnQkFBSStCLFlBQVksR0FBR2xDLEtBQW5CO0FBQ0E7QUFDRDtBQUNGOztBQUVELFlBQUlrQyxZQUFZLEtBQ1hwRyxJQUFJLEtBQUssT0FBVCxJQUNBQSxJQUFJLEtBQUssVUFGRSxDQUFaLElBR0FvRyxZQUFZLENBQUNqQyxNQUFiLElBQXVCcEUsR0FIdkIsSUFJQUEsR0FBRyxJQUFJcUcsWUFBWSxDQUFDL0IsVUFKeEIsRUFJb0M7OztBQUdsQytCLFVBQUFBLFlBQVksR0FBRyxJQUFmO0FBQ0Q7O0FBRUQsWUFBSWpFLE1BQU0sR0FBR2lFLFlBQVksR0FBR0EsWUFBWSxDQUFDMUIsVUFBaEIsR0FBNkIsRUFBdEQ7QUFDQXZDLFFBQUFBLE1BQU0sQ0FBQ25DLElBQVAsR0FBY0EsSUFBZDtBQUNBbUMsUUFBQUEsTUFBTSxDQUFDcEMsR0FBUCxHQUFhQSxHQUFiOztBQUVBLFlBQUlxRyxZQUFKLEVBQWtCO0FBQ2hCLGVBQUtoRixNQUFMLEdBQWMsTUFBZDtBQUNBLGVBQUsyQixJQUFMLEdBQVlxRCxZQUFZLENBQUMvQixVQUF6QjtBQUNBLGlCQUFPOUQsZ0JBQVA7QUFDRDs7QUFFRCxlQUFPLEtBQUs4RixRQUFMLENBQWNsRSxNQUFkLENBQVA7QUFDRCxPQXJJaUI7QUF1SWxCa0UsTUFBQUEsUUFBUSxFQUFFLFVBQVNsRSxNQUFULEVBQWlCbUMsUUFBakIsRUFBMkI7QUFDbkMsWUFBSW5DLE1BQU0sQ0FBQ25DLElBQVAsS0FBZ0IsT0FBcEIsRUFBNkI7QUFDM0IsZ0JBQU1tQyxNQUFNLENBQUNwQyxHQUFiO0FBQ0Q7O0FBRUQsWUFBSW9DLE1BQU0sQ0FBQ25DLElBQVAsS0FBZ0IsT0FBaEIsSUFDQW1DLE1BQU0sQ0FBQ25DLElBQVAsS0FBZ0IsVUFEcEIsRUFDZ0M7QUFDOUIsZUFBSytDLElBQUwsR0FBWVosTUFBTSxDQUFDcEMsR0FBbkI7QUFDRCxTQUhELE1BR08sSUFBSW9DLE1BQU0sQ0FBQ25DLElBQVAsS0FBZ0IsUUFBcEIsRUFBOEI7QUFDbkMsZUFBSzZGLElBQUwsR0FBWSxLQUFLOUYsR0FBTCxHQUFXb0MsTUFBTSxDQUFDcEMsR0FBOUI7QUFDQSxlQUFLcUIsTUFBTCxHQUFjLFFBQWQ7QUFDQSxlQUFLMkIsSUFBTCxHQUFZLEtBQVo7QUFDRCxTQUpNLE1BSUEsSUFBSVosTUFBTSxDQUFDbkMsSUFBUCxLQUFnQixRQUFoQixJQUE0QnNFLFFBQWhDLEVBQTBDO0FBQy9DLGVBQUt2QixJQUFMLEdBQVl1QixRQUFaO0FBQ0Q7O0FBRUQsZUFBTy9ELGdCQUFQO0FBQ0QsT0F4SmlCO0FBMEpsQitGLE1BQUFBLE1BQU0sRUFBRSxVQUFTakMsVUFBVCxFQUFxQjtBQUMzQixhQUFLLElBQUlnQixDQUFDLEdBQUcsS0FBS2QsVUFBTCxDQUFnQlMsTUFBaEIsR0FBeUIsQ0FBdEMsRUFBeUNLLENBQUMsSUFBSSxDQUE5QyxFQUFpRCxFQUFFQSxDQUFuRCxFQUFzRDtBQUNwRCxjQUFJbkIsS0FBSyxHQUFHLEtBQUtLLFVBQUwsQ0FBZ0JjLENBQWhCLENBQVo7O0FBQ0EsY0FBSW5CLEtBQUssQ0FBQ0csVUFBTixLQUFxQkEsVUFBekIsRUFBcUM7QUFDbkMsaUJBQUtnQyxRQUFMLENBQWNuQyxLQUFLLENBQUNRLFVBQXBCLEVBQWdDUixLQUFLLENBQUNJLFFBQXRDO0FBQ0FHLFlBQUFBLGFBQWEsQ0FBQ1AsS0FBRCxDQUFiO0FBQ0EsbUJBQU8zRCxnQkFBUDtBQUNEO0FBQ0Y7QUFDRixPQW5LaUI7QUFxS2xCLGVBQVMsVUFBUzRELE1BQVQsRUFBaUI7QUFDeEIsYUFBSyxJQUFJa0IsQ0FBQyxHQUFHLEtBQUtkLFVBQUwsQ0FBZ0JTLE1BQWhCLEdBQXlCLENBQXRDLEVBQXlDSyxDQUFDLElBQUksQ0FBOUMsRUFBaUQsRUFBRUEsQ0FBbkQsRUFBc0Q7QUFDcEQsY0FBSW5CLEtBQUssR0FBRyxLQUFLSyxVQUFMLENBQWdCYyxDQUFoQixDQUFaOztBQUNBLGNBQUluQixLQUFLLENBQUNDLE1BQU4sS0FBaUJBLE1BQXJCLEVBQTZCO0FBQzNCLGdCQUFJaEMsTUFBTSxHQUFHK0IsS0FBSyxDQUFDUSxVQUFuQjs7QUFDQSxnQkFBSXZDLE1BQU0sQ0FBQ25DLElBQVAsS0FBZ0IsT0FBcEIsRUFBNkI7QUFDM0Isa0JBQUl1RyxNQUFNLEdBQUdwRSxNQUFNLENBQUNwQyxHQUFwQjtBQUNBMEUsY0FBQUEsYUFBYSxDQUFDUCxLQUFELENBQWI7QUFDRDs7QUFDRCxtQkFBT3FDLE1BQVA7QUFDRDtBQUNGLFNBWHVCOzs7O0FBZXhCLGNBQU0sSUFBSXJELEtBQUosQ0FBVSx1QkFBVixDQUFOO0FBQ0QsT0FyTGlCO0FBdUxsQnNELE1BQUFBLGFBQWEsRUFBRSxVQUFTdEIsUUFBVCxFQUFtQnJCLFVBQW5CLEVBQStCQyxPQUEvQixFQUF3QztBQUNyRCxhQUFLVixRQUFMLEdBQWdCO0FBQ2QxRSxVQUFBQSxRQUFRLEVBQUVvQyxNQUFNLENBQUNvRSxRQUFELENBREY7QUFFZHJCLFVBQUFBLFVBQVUsRUFBRUEsVUFGRTtBQUdkQyxVQUFBQSxPQUFPLEVBQUVBO0FBSEssU0FBaEI7O0FBTUEsWUFBSSxLQUFLMUMsTUFBTCxLQUFnQixNQUFwQixFQUE0Qjs7O0FBRzFCLGVBQUtyQixHQUFMLEdBQVd6QixXQUFYO0FBQ0Q7O0FBRUQsZUFBT2lDLGdCQUFQO0FBQ0Q7QUFyTWlCLEtBQXBCLENBOWVnQzs7Ozs7QUEwckJoQyxXQUFPdkMsT0FBUDtBQUVELEdBNXJCYzs7OztBQWlzQmIsR0FBNkJ5SSxNQUFNLENBQUN6SSxPQUFwQyxDQWpzQmEsQ0FBZjs7QUFvc0JBLE1BQUk7QUFDRjBJLElBQUFBLGtCQUFrQixHQUFHM0ksT0FBckI7QUFDRCxHQUZELENBRUUsT0FBTzRJLG9CQUFQLEVBQTZCOzs7Ozs7Ozs7O0FBVTdCQyxJQUFBQSxRQUFRLENBQUMsR0FBRCxFQUFNLHdCQUFOLENBQVIsQ0FBd0M3SSxPQUF4Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/canvg/umd.js",
    "content": "(function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):(e=e||self,t(e.canvg={}))})(this,function(e){'use strict';var on=Math.tan,ln=Math.atan2,sn=Math.PI,cn=Math.round,un=String.prototype,dn=Math.max,gn=Math.min,pn=Math.ceil,yn=Math.sin,hn=Math.cos,fn=Math.floor,mn=Math.sqrt,xn=Math.pow;function t(e,t){return t={exports:{}},e(t,t.exports),t.exports}function n(e,t){return RegExp(e,t)}function r(e){return e.replace(/(?!\\u3000)\\s+/gm,\" \")}function a(e){return e.replace(/^[\\n \\t]+/,\"\")}function o(e){return e.replace(/[\\n \\t]+$/,\"\")}function l(e){var t=(e||\"\").match(/-?(\\d+(?:\\.\\d*(?:[eE][+-]?\\d+)?)?|\\.\\d+)(?=\\D|$)/gm)||[];return t.map(parseFloat)}function s(e){return Ka.test(e)?e.toLowerCase():e}function u(e){var t=e.match(/url\\(('([^']+)'|\"([^\"]+)\"|([^'\"\\)]+))\\)/)||[];return t[2]||t[3]||t[4]}function d(e,t){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(e)){var n=[],r=!0,a=!1,o=void 0;try{for(var i=e[Symbol.iterator](),l;!(r=(l=i.next()).done)&&(n.push(l.value),!(t&&n.length===t));r=!0);}catch(e){a=!0,o=e}finally{try{r||null==i[\"return\"]||i[\"return\"]()}finally{if(a)throw o}}return n}}function g(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function p(e,t){return no(e)||ro(e,t)||oo(e,t)||io()}function y(e,t){var n=e.match(t);return n?[e.replace(t,\" \"),n.length]:[e,0]}function h(e){var t=[0,0,0],n=e.replace(/:not\\(([^\\)]*)\\)/g,\"     $1 \").replace(/{[\\s\\S]*/gm,\" \"),r=0,a=y(n,so),o=lo(a,2);n=o[0],r=o[1],t[1]+=r;var i=y(n,co),l=lo(i,2);n=l[0],r=l[1],t[0]+=r;var s=y(n,uo),c=lo(s,2);n=c[0],r=c[1],t[1]+=r;var u=y(n,go),d=lo(u,2);n=d[0],r=d[1],t[2]+=r;var g=y(n,po),p=lo(g,2);n=p[0],r=p[1],t[1]+=r;var h=y(n,yo),f=lo(h,2);n=f[0],r=f[1],t[1]+=r,n=n.replace(/[\\*\\s\\+>~]/g,\" \").replace(/[#\\.]/g,\" \");var m=y(n,ho),x=lo(m,2);return n=x[0],r=x[1],t[2]+=r,t.join(\"\")}function x(e){return mn(xn(e[0],2)+xn(e[1],2))}function b(e,t){return(e[0]*t[0]+e[1]*t[1])/(x(e)*x(t))}function S(e,t){var n=Math.acos;return(e[0]*t[1]<e[1]*t[0]?-1:1)*n(b(e,t))}function k(e){return e*e*e}function A(e){return 3*e*e*(1-e)}function P(e){return 3*e*(1-e)*(1-e)}function E(e){return(1-e)*(1-e)*(1-e)}function T(e){return e*e}function C(e){return 2*e*(1-e)}function w(e){return(1-e)*(1-e)}function O(e,t,n,r,a,o,i){try{var l=e[o](i),s=l.value}catch(e){return void n(e)}l.done?t(s):Promise.resolve(s).then(r,a)}function V(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function L(e,t){for(var n=0,r;n<t.length;n++)r=t[n],r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}function R(){throw new Error(\"setTimeout has not been defined\")}function I(){throw new Error(\"clearTimeout has not been defined\")}function D(t){if(rc===setTimeout)return setTimeout(t,0);if((rc===R||!rc)&&setTimeout)return rc=setTimeout,setTimeout(t,0);try{return rc(t,0)}catch(n){try{return rc.call(null,t,0)}catch(n){return rc.call(this,t,0)}}}function N(t){if(ac===clearTimeout)return clearTimeout(t);if((ac===I||!ac)&&clearTimeout)return ac=clearTimeout,clearTimeout(t);try{return ac(t)}catch(n){try{return ac.call(null,t)}catch(n){return ac.call(this,t)}}}function M(){ic&&sc&&(ic=!1,sc.length?oc=sc.concat(oc):lc=-1,oc.length&&B())}function B(){if(!ic){var e=D(M);ic=!0;for(var t=oc.length;t;){for(sc=oc,oc=[];++lc<t;)sc&&sc[lc].run();lc=-1,t=oc.length}sc=null,ic=!1,N(e)}}function _(e){var t=Array(arguments.length-1);if(1<arguments.length)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];oc.push(new z(e,t)),1!==oc.length||ic||D(B)}function z(e,t){this.fun=e,this.array=t}function F(){}function G(){throw new Error(\"process.binding is not supported\")}function H(){return\"/\"}function U(){throw new Error(\"process.chdir is not supported\")}function Y(){return 0}function $(e){var t=1e-3*hc.call(yc),n=fn(t),r=fn(1e9*(t%1));return e&&(n-=e[0],r-=e[1],0>r&&(n--,r+=1e9)),[n,r]}function W(){var e=new Date;return(e-fc)/1e3}function X(e){return function(){var t=cu(e),n;if(q()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function q(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Q(e){var t=e.trim();return /^('|\")/.test(t)?t:\"\\\"\".concat(t,\"\\\"\")}function K(e){return\"undefined\"==typeof process?e:e.trim().split(\",\").map(Q).join(\",\")}function Z(e){return function(){var t=cu(e),n;if(J()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function J(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function ee(e){return function(){var t=cu(e),n;if(te()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function te(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function ne(e){return function(){var t=cu(e),n;if(re()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function re(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function ae(e){return r(e).trim().replace(/\\)([a-zA-Z])/g,\") $1\").replace(/\\)(\\s?,\\s?)/g,\") \").split(/\\s(?=[a-z])/)}function oe(e){var t=e.split(\"(\"),n=lo(t,2),r=n[0],a=n[1];return[r.trim(),a.trim().replace(\")\",\"\")]}function ie(e){return function(){var t=cu(e),n;if(le()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function le(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function se(e){return function(){var t=cu(e),n;if(ce()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function ce(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function ue(e){return function(){var t=cu(e),n;if(de()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function de(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function ge(e){return function(){var t=cu(e),n;if(pe()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function pe(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function ye(e){var t=e.replace(/,/gm,\" \").replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm,\"$1 $2\").replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm,\"$1 $2\").replace(/([^\\s])([MmZzLlHhVvCcSsQqTtAa])/gm,\"$1 $2\").replace(/([0-9])([+\\-])/gm,\"$1 $2\").replace(/(\\.[0-9]*)(\\.)/gm,\"$1 $2\").replace(/(\\.[0-9]*)(\\.)/gm,\"$1 $2\").replace(/([Aa](\\s+[0-9]+){3})\\s+([01])\\s*([01])/gm,\"$1 $3 $4 \");return r(t).trim()}function he(e){return function(){var t=cu(e),n;if(fe()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function fe(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function me(e){return function(){var t=cu(e),n;if(xe()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function xe(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function be(e){return function(){var t=cu(e),n;if(ve()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function ve(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Se(e){return function(){var t=cu(e),n;if(ke()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function ke(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Ae(e){return function(){var t=cu(e),n;if(Pe()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Pe(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Ee(e){return function(){var t=cu(e),n;if(Te()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Te(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Ce(e){return function(){var t=cu(e),n;if(we()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function we(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Oe(e){return function(){var t=cu(e),n;if(Ve()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Ve(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Le(e){return function(){var t=cu(e),n;if(Re()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Re(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Ie(e){return function(){var t=cu(e),n;if(De()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function De(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Ne(e){return function(){var t=cu(e),n;if(Me()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Me(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Be(e){return function(){var t=cu(e),n;if(_e()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function _e(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function ze(e){return function(){var t=cu(e),n;if(Fe()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Fe(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function je(e){return function(){var t=cu(e),n;if(Ge()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Ge(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function He(e){return function(){var t=cu(e),n;if(Ue()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Ue(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Ye(e){return function(){var t=cu(e),n;if($e()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function $e(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function We(e){return function(){var t=cu(e),n;if(Xe()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Xe(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function qe(e){return function(){var t=cu(e),n;if(Qe()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Qe(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Ke(e){return function(){var t=cu(e),n;if(Ze()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Ze(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Je(e){if(\"undefined\"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(e=et(e))){var t=0,n=function(){};return{s:n,n:function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}},e:function(e){throw e},f:n}}throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}var r=!0,a=!1,l,s;return{s:function(){l=e[Symbol.iterator]()},n:function(){var e=l.next();return r=e.done,e},e:function(e){a=!0,s=e},f:function(){try{r||null==l.return||l.return()}finally{if(a)throw s}}}}function et(e,t){if(e){if(\"string\"==typeof e)return tt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return\"Object\"===r&&e.constructor&&(r=e.constructor.name),\"Map\"===r||\"Set\"===r?Array.from(r):\"Arguments\"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?tt(e,t):void 0}}function tt(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function nt(e){return function(){var t=cu(e),n;if(rt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function rt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function at(e){return function(){var t=cu(e),n;if(ot()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function ot(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function it(e){return function(){var t=cu(e),n;if(lt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function lt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function st(e){return function(){var t=cu(e),n;if(ct()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function ct(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function ut(e){return function(){var t=cu(e),n;if(dt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function dt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function gt(e){return function(){var t=cu(e),n;if(pt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function pt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function yt(e){if(\"undefined\"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(e=ht(e))){var t=0,n=function(){};return{s:n,n:function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}},e:function(e){throw e},f:n}}throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}var r=!0,a=!1,l,s;return{s:function(){l=e[Symbol.iterator]()},n:function(){var e=l.next();return r=e.done,e},e:function(e){a=!0,s=e},f:function(){try{r||null==l.return||l.return()}finally{if(a)throw s}}}}function ht(e,t){if(e){if(\"string\"==typeof e)return ft(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return\"Object\"===r&&e.constructor&&(r=e.constructor.name),\"Map\"===r||\"Set\"===r?Array.from(r):\"Arguments\"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ft(e,t):void 0}}function ft(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function mt(e){return function(){var t=cu(e),n;if(xt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function xt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function bt(e){return function(){var t=cu(e),n;if(vt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function vt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function St(e){return function(){var t=cu(e),n;if(kt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function kt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function At(e){return function(){var t=cu(e),n;if(Pt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Pt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Et(e){return function(){var t=cu(e),n;if(Tt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Tt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Ct(e){return function(){var t=cu(e),n;if(wt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function wt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Ot(e,t,n,r,a,o){return e[4*(n*r)+4*t+o]}function Vt(e,t,n,r,a,o,i){e[4*(n*r)+4*t+o]=i}function Lt(e,t,n){var r=e[t];return r*(0>r?n-255:n)}function m(e,t,n,r){return t+hn(e)*n+yn(e)*r}function c(e){return function(){var t=cu(e),n;if(v()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function v(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Rt(e){return function(){var t=cu(e),n;if(It()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function It(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Dt(e){return function(){var t=cu(e),n;if(Nt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Nt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Mt(e){return function(){var t=cu(e),n;if(Bt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Bt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function _t(e){return function(){var t=cu(e),n;if(zt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function zt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Ft(e){return function(){var t=cu(e),n;if(jt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function jt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Gt(e){return Gt=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Gt(e)}function Ht(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function Ut(e,t,n,r,a){if(\"string\"==typeof e&&(e=document.getElementById(e)),!e||\"object\"!==Gt(e)||!(\"getContext\"in e))throw new TypeError(\"Expecting canvas with `getContext` method in processCanvasRGB(A) calls!\");var o=e.getContext(\"2d\");try{return o.getImageData(t,n,r,a)}catch(t){throw new Error(\"unable to access image data: \"+t)}}function Yt(e,t,n,r,a,o){if(!(isNaN(o)||1>o)){o|=0;var i=Ut(e,t,n,r,a);i=$t(i,t,n,r,a,o),e.getContext(\"2d\").putImageData(i,t,n)}}function $t(e,t,n,r,a,o){var l=e.data,s=r-1,c=a-1,u=o+1,d=u*(u+1)/2,g=new mp,h=g,f,m,b,v,S,k,A,P,E,T,C,w,O,V,L,R,I,D,N,M,B,_,z,F,j;for(b=1;b<2*o+1;b++)h=h.next=new mp,b===u&&(j=h);h.next=g;var G=null,H=null;A=k=0;var U=hp[o],Y=fp[o];for(m=0;m<a;m++){for(R=I=D=N=P=E=T=C=0,w=u*(M=l[k]),O=u*(B=l[k+1]),V=u*(_=l[k+2]),L=u*(z=l[k+3]),P+=d*M,E+=d*B,T+=d*_,C+=d*z,h=g,b=0;b<u;b++)h.r=M,h.g=B,h.b=_,h.a=z,h=h.next;for(b=1;b<u;b++)v=k+((s<b?s:b)<<2),P+=(h.r=M=l[v])*(F=u-b),E+=(h.g=B=l[v+1])*F,T+=(h.b=_=l[v+2])*F,C+=(h.a=z=l[v+3])*F,R+=M,I+=B,D+=_,N+=z,h=h.next;for(G=g,H=j,f=0;f<r;f++)l[k+3]=z=C*U>>Y,0===z?l[k]=l[k+1]=l[k+2]=0:(z=255/z,l[k]=(P*U>>Y)*z,l[k+1]=(E*U>>Y)*z,l[k+2]=(T*U>>Y)*z),P-=w,E-=O,T-=V,C-=L,w-=G.r,O-=G.g,V-=G.b,L-=G.a,v=A+((v=f+o+1)<s?v:s)<<2,R+=G.r=l[v],I+=G.g=l[v+1],D+=G.b=l[v+2],N+=G.a=l[v+3],P+=R,E+=I,T+=D,C+=N,G=G.next,w+=M=H.r,O+=B=H.g,V+=_=H.b,L+=z=H.a,R-=M,I-=B,D-=_,N-=z,H=H.next,k+=4;A+=r}for(f=0;f<r;f++){for(I=D=N=R=E=T=C=P=0,k=f<<2,w=u*(M=l[k]),O=u*(B=l[k+1]),V=u*(_=l[k+2]),L=u*(z=l[k+3]),P+=d*M,E+=d*B,T+=d*_,C+=d*z,h=g,b=0;b<u;b++)h.r=M,h.g=B,h.b=_,h.a=z,h=h.next;for(S=r,b=1;b<=o;b++)k=S+f<<2,P+=(h.r=M=l[k])*(F=u-b),E+=(h.g=B=l[k+1])*F,T+=(h.b=_=l[k+2])*F,C+=(h.a=z=l[k+3])*F,R+=M,I+=B,D+=_,N+=z,h=h.next,b<c&&(S+=r);for(k=f,G=g,H=j,m=0;m<a;m++)v=k<<2,l[v+3]=z=C*U>>Y,0<z?(z=255/z,l[v]=(P*U>>Y)*z,l[v+1]=(E*U>>Y)*z,l[v+2]=(T*U>>Y)*z):l[v]=l[v+1]=l[v+2]=0,P-=w,E-=O,T-=V,C-=L,w-=G.r,O-=G.g,V-=G.b,L-=G.a,v=f+((v=m+u)<c?v:c)*r<<2,P+=R+=G.r=l[v],E+=I+=G.g=l[v+1],T+=D+=G.b=l[v+2],C+=N+=G.a=l[v+3],G=G.next,w+=M=H.r,O+=B=H.g,V+=_=H.b,L+=z=H.a,R-=M,I-=B,D-=_,N-=z,H=H.next,k+=r}return e}function Wt(e){return function(){var t=cu(e),n;if(Xt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Xt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function qt(e){return function(){var t=cu(e),n;if(Qt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Qt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Kt(e){return function(){var t=cu(e),n;if(Zt()){var r=cu(this).constructor;n=Reflect.construct(t,arguments,r)}else n=t.apply(this,arguments);return su(this,n)}}function Zt(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}function Jt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function en(e){for(var t=1,n;t<arguments.length;t++)n=null==arguments[t]?{}:arguments[t],t%2?Jt(Object(n),!0).forEach(function(t){zi(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Jt(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))});return e}function tn(){return nn.apply(this,arguments)}function nn(){return nn=_i(Mi.mark(function e(t){var n;return Mi.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=document.createElement(\"img\"),e.abrupt(\"return\",new Promise(function(e,r){n.onload=function(){e(n)},n.onerror=function(){r()},n.src=t}));case 2:case\"end\":return e.stop();}},e)})),nn.apply(this,arguments)}function rn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function an(e){for(var t=1,n;t<arguments.length;t++)n=null==arguments[t]?{}:arguments[t],t%2?rn(Object(n),!0).forEach(function(t){zi(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):rn(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))});return e}var bn=\"undefined\"==typeof globalThis?\"undefined\"==typeof window?\"undefined\"==typeof global?\"undefined\"==typeof self?{}:self:global:window:globalThis,vn=function(e){return e&&e.Math==Math&&e},Sn=vn(\"object\"==typeof globalThis&&globalThis)||vn(\"object\"==typeof window&&window)||vn(\"object\"==typeof self&&self)||vn(\"object\"==typeof bn&&bn)||Function(\"return this\")(),kn=function(e){try{return!!e()}catch(e){return!0}},An=!kn(function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}),Pn={}.propertyIsEnumerable,En=Object.getOwnPropertyDescriptor,Tn=En&&!Pn.call({1:2},1),Cn=Tn?function(e){var t=En(this,e);return!!t&&t.enumerable}:Pn,f={f:Cn},wn=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},On={}.toString,Vn=function(e){return On.call(e).slice(8,-1)},Ln=\"\".split,Rn=kn(function(){return!Object(\"z\").propertyIsEnumerable(0)})?function(e){return\"String\"==Vn(e)?Ln.call(e,\"\"):Object(e)}:Object,In=function(e){if(null==e)throw TypeError(\"Can't call method on \"+e);return e},Dn=function(e){return Rn(In(e))},Nn=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e},Mn=function(e,t){if(!Nn(e))return e;var n,r;if(t&&\"function\"==typeof(n=e.toString)&&!Nn(r=n.call(e)))return r;if(\"function\"==typeof(n=e.valueOf)&&!Nn(r=n.call(e)))return r;if(!t&&\"function\"==typeof(n=e.toString)&&!Nn(r=n.call(e)))return r;throw TypeError(\"Can't convert object to primitive value\")},Bn={}.hasOwnProperty,_n=function(e,t){return Bn.call(e,t)},zn=Sn.document,Fn=Nn(zn)&&Nn(zn.createElement),jn=function(e){return Fn?zn.createElement(e):{}},Gn=!An&&!kn(function(){return 7!=Object.defineProperty(jn(\"div\"),\"a\",{get:function(){return 7}}).a}),Hn=Object.getOwnPropertyDescriptor,Un=An?Hn:function(e,t){if(e=Dn(e),t=Mn(t,!0),Gn)try{return Hn(e,t)}catch(e){}return _n(e,t)?wn(!f.f.call(e,t),e[t]):void 0},Yn={f:Un},$n=function(e){if(!Nn(e))throw TypeError(e+\" is not an object\");return e},Wn=Object.defineProperty,Xn=An?Wn:function(e,t,n){if($n(e),t=Mn(t,!0),$n(n),Gn)try{return Wn(e,t,n)}catch(e){}if(\"get\"in n||\"set\"in n)throw TypeError(\"Accessors not supported\");return\"value\"in n&&(e[t]=n.value),e},qn={f:Xn},Qn=An?function(e,t,n){return qn.f(e,t,wn(1,n))}:function(e,t,n){return e[t]=n,e},Kn=function(e,t){try{Qn(Sn,e,t)}catch(n){Sn[e]=t}return t},Zn=\"__core-js_shared__\",Jn=Sn[Zn]||Kn(Zn,{}),er=Jn,tr=Function.toString;\"function\"!=typeof er.inspectSource&&(er.inspectSource=function(e){return tr.call(e)});var nr=er.inspectSource,rr=Sn.WeakMap,ar=\"function\"==typeof rr&&/native code/.test(nr(rr)),or=t(function(e){(e.exports=function(e,t){return er[e]||(er[e]=void 0===t?{}:t)})(\"versions\",[]).push({version:\"3.6.5\",mode:\"global\",copyright:\"\\xA9 2020 Denis Pushkarev (zloirock.ru)\"})}),ir=0,lr=Math.random(),sr=function(e){return\"Symbol(\"+((void 0===e?\"\":e)+\")_\")+(++ir+lr).toString(36)},cr=or(\"keys\"),ur=function(e){return cr[e]||(cr[e]=sr(e))},dr={},gr=Sn.WeakMap,pr=function(e){return fr(e)?hr(e):yr(e,{})},yr,hr,fr;if(ar){var mr=new gr,xr=mr.get,br=mr.has,vr=mr.set;yr=function(e,t){return vr.call(mr,e,t),t},hr=function(e){return xr.call(mr,e)||{}},fr=function(e){return br.call(mr,e)}}else{var Sr=ur(\"state\");dr[Sr]=!0,yr=function(e,t){return Qn(e,Sr,t),t},hr=function(e){return _n(e,Sr)?e[Sr]:{}},fr=function(e){return _n(e,Sr)}}var kr={set:yr,get:hr,has:fr,enforce:pr,getterFor:function(e){return function(t){var n;if(!Nn(t)||(n=hr(t)).type!==e)throw TypeError(\"Incompatible receiver, \"+e+\" required\");return n}}},Ar=t(function(e){var t=kr.get,n=kr.enforce,r=(String+\"\").split(\"String\");(e.exports=function(e,t,a,o){var i=!!o&&!!o.unsafe,l=!!o&&!!o.enumerable,s=!!o&&!!o.noTargetGet;return(\"function\"==typeof a&&(\"string\"==typeof t&&!_n(a,\"name\")&&Qn(a,\"name\",t),n(a).source=r.join(\"string\"==typeof t?t:\"\")),e===Sn)?void(l?e[t]=a:Kn(t,a)):void(i?!s&&e[t]&&(l=!0):delete e[t],l?e[t]=a:Qn(e,t,a))})(Function.prototype,\"toString\",function(){return\"function\"==typeof this&&t(this).source||nr(this)})}),Pr=Sn,Er=function(e){return\"function\"==typeof e?e:void 0},Tr=function(e,t){return 2>arguments.length?Er(Pr[e])||Er(Sn[e]):Pr[e]&&Pr[e][t]||Sn[e]&&Sn[e][t]},Cr=function(e){return isNaN(e=+e)?0:(0<e?fn:pn)(e)},wr=function(e){return 0<e?gn(Cr(e),9007199254740991):0},Or=function(e,t){var n=Cr(e);return 0>n?dn(n+t,0):gn(n,t)},Vr=function(e){return function(t,n,r){var a=Dn(t),o=wr(a.length),i=Or(r,o),l;if(e&&n!=n){for(;o>i;)if(l=a[i++],l!=l)return!0;}else for(;o>i;i++)if((e||i in a)&&a[i]===n)return e||i||0;return!e&&-1}},Lr={includes:Vr(!0),indexOf:Vr(!1)},Rr=Lr.indexOf,Ir=function(e,t){var n=Dn(e),r=0,a=[],o;for(o in n)!_n(dr,o)&&_n(n,o)&&a.push(o);for(;t.length>r;)_n(n,o=t[r++])&&(~Rr(a,o)||a.push(o));return a},Dr=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],Nr=Dr.concat(\"length\",\"prototype\"),Mr=Object.getOwnPropertyNames||function(e){return Ir(e,Nr)},Br={f:Mr},_r=Object.getOwnPropertySymbols,zr={f:_r},Fr=Tr(\"Reflect\",\"ownKeys\")||function(e){var t=Br.f($n(e)),n=zr.f;return n?t.concat(n(e)):t},jr=function(e,t){for(var n=Fr(t),r=qn.f,a=Yn.f,o=0,l;o<n.length;o++)l=n[o],_n(e,l)||r(e,l,a(t,l))},Gr=function(e,t){var n=Ur[Hr(e)];return n==$r||n!=Yr&&(\"function\"==typeof t?kn(t):!!t)},Hr=Gr.normalize=function(e){return(e+\"\").replace(/#|\\.prototype\\./,\".\").toLowerCase()},Ur=Gr.data={},Yr=Gr.NATIVE=\"N\",$r=Gr.POLYFILL=\"P\",Wr=Gr,Xr=Yn.f,qr=function(e,t){var n=e.target,r=e.global,a=e.stat,o,i,l,s,c,u;if(i=r?Sn:a?Sn[n]||Kn(n,{}):(Sn[n]||{}).prototype,i)for(l in t){if(c=t[l],e.noTargetGet?(u=Xr(i,l),s=u&&u.value):s=i[l],o=Wr(r?l:n+(a?\".\":\"#\")+l,e.forced),!o&&void 0!==s){if(typeof c==typeof s)continue;jr(c,s)}(e.sham||s&&s.sham)&&Qn(c,\"sham\",!0),Ar(i,l,c,e)}},Qr=function(e){if(\"function\"!=typeof e)throw TypeError(e+\" is not a function\");return e},Kr=function(e,t,n){return(Qr(e),void 0===t)?e:0===n?function(){return e.call(t)}:1===n?function(n){return e.call(t,n)}:2===n?function(n,r){return e.call(t,n,r)}:3===n?function(n,r,a){return e.call(t,n,r,a)}:function(){return e.apply(t,arguments)}},Zr=function(e){return Object(In(e))},Jr=Array.isArray||function(e){return\"Array\"==Vn(e)},ea=!!Object.getOwnPropertySymbols&&!kn(function(){return!(Symbol()+\"\")}),ta=ea&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,na=or(\"wks\"),ra=Sn.Symbol,aa=ta?ra:ra&&ra.withoutSetter||sr,oa=function(e){return _n(na,e)||(ea&&_n(ra,e)?na[e]=ra[e]:na[e]=aa(\"Symbol.\"+e)),na[e]},ia=oa(\"species\"),la=function(e,t){var n;return Jr(e)&&(n=e.constructor,\"function\"==typeof n&&(n===Array||Jr(n.prototype))?n=void 0:Nn(n)&&(n=n[ia],null===n&&(n=void 0))),new(void 0===n?Array:n)(0===t?0:t)},sa=[].push,ca=function(e){var t=1==e,n=4==e,r=6==e;return function(a,o,i,l){for(var s=Zr(a),c=Rn(s),u=Kr(o,i,3),d=wr(c.length),g=0,p=l||la,y=t?p(a,d):2==e?p(a,0):void 0,h,f;d>g;g++)if((5==e||r||g in c)&&(h=c[g],f=u(h,g,s),e))if(t)y[g]=f;else if(f)switch(e){case 3:return!0;case 5:return h;case 6:return g;case 2:sa.call(y,h);}else if(n)return!1;return r?-1:3==e||n?n:y}},ua={forEach:ca(0),map:ca(1),filter:ca(2),some:ca(3),every:ca(4),find:ca(5),findIndex:ca(6)},da=Tr(\"navigator\",\"userAgent\")||\"\",ga=Sn.process,pa=ga&&ga.versions,ya=pa&&pa.v8,ha,fa;ya?(ha=ya.split(\".\"),fa=ha[0]+ha[1]):da&&(ha=da.match(/Edge\\/(\\d+)/),(!ha||74<=ha[1])&&(ha=da.match(/Chrome\\/(\\d+)/),ha&&(fa=ha[1])));var ma=fa&&+fa,xa=oa(\"species\"),ba=function(e){return 51<=ma||!kn(function(){var t=[],n=t.constructor={};return n[xa]=function(){return{foo:1}},1!==t[e](Boolean).foo})},va=Object.defineProperty,Sa={},ka=function(e){throw e},Aa=function(e,t){if(_n(Sa,e))return Sa[e];t||(t={});var n=[][e],r=!!_n(t,\"ACCESSORS\")&&t.ACCESSORS,a=_n(t,0)?t[0]:ka,o=_n(t,1)?t[1]:void 0;return Sa[e]=!!n&&!kn(function(){if(r&&!An)return!0;var e={length:-1};r?va(e,1,{enumerable:!0,get:ka}):e[1]=1,n.call(e,a,o)})},Pa=ua.map,Ea=ba(\"map\"),Ta=Aa(\"map\");qr({target:\"Array\",proto:!0,forced:!Ea||!Ta},{map:function(e){return Pa(this,e,1<arguments.length?arguments[1]:void 0)}});var Ca=function(){var e=$n(this),t=\"\";return e.global&&(t+=\"g\"),e.ignoreCase&&(t+=\"i\"),e.multiline&&(t+=\"m\"),e.dotAll&&(t+=\"s\"),e.unicode&&(t+=\"u\"),e.sticky&&(t+=\"y\"),t},wa=kn(function(){var e=n(\"a\",\"y\");return e.lastIndex=2,null!=e.exec(\"abcd\")}),Oa=kn(function(){var e=n(\"^r\",\"gy\");return e.lastIndex=2,null!=e.exec(\"str\")}),Va={UNSUPPORTED_Y:wa,BROKEN_CARET:Oa},La=RegExp.prototype.exec,Ra=un.replace,Ia=La,Da=function(){var e=/a/,t=/b*/g;return La.call(e,\"a\"),La.call(t,\"a\"),0!==e.lastIndex||0!==t.lastIndex}(),Na=Va.UNSUPPORTED_Y||Va.BROKEN_CARET,Ma=void 0!==/()??/.exec(\"\")[1];(Da||Ma||Na)&&(Ia=function(e){var t=this,n=Na&&t.sticky,r=Ca.call(t),a=t.source,o=0,l=e,s,c,u,d;return n&&(r=r.replace(\"y\",\"\"),-1===r.indexOf(\"g\")&&(r+=\"g\"),l=(e+\"\").slice(t.lastIndex),0<t.lastIndex&&(!t.multiline||t.multiline&&\"\\n\"!==e[t.lastIndex-1])&&(a=\"(?: \"+a+\")\",l=\" \"+l,o++),c=new RegExp(\"^(?:\"+a+\")\",r)),Ma&&(c=new RegExp(\"^\"+a+\"$(?!\\\\s)\",r)),Da&&(s=t.lastIndex),u=La.call(n?c:t,l),n?u?(u.input=u.input.slice(o),u[0]=u[0].slice(o),u.index=t.lastIndex,t.lastIndex+=u[0].length):t.lastIndex=0:Da&&u&&(t.lastIndex=t.global?u.index+u[0].length:s),Ma&&u&&1<u.length&&Ra.call(u[0],c,function(){for(d=1;d<arguments.length-2;d++)void 0===arguments[d]&&(u[d]=void 0)}),u});var Ba=Ia;qr({target:\"RegExp\",proto:!0,forced:/./.exec!==Ba},{exec:Ba}),qr({target:\"RegExp\",proto:!0,forced:/./.exec!==Ba},{exec:Ba});var _a=oa(\"species\"),za=!kn(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:\"7\"},e},\"7\"!==\"\".replace(e,\"$<a>\")}),Fa=function(){return\"$0\"===\"a\".replace(/./,\"$0\")}(),ja=oa(\"replace\"),Ga=function(){return!!/./[ja]&&\"\"===/./[ja](\"a\",\"$0\")}(),Ha=!kn(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n=\"ab\".split(e);return 2!==n.length||\"a\"!==n[0]||\"b\"!==n[1]}),Ua=function(e,t,n,r){var a=oa(e),o=!kn(function(){var t={};return t[a]=function(){return 7},7!=\"\"[e](t)}),i=o&&!kn(function(){var t=!1,n=/a/;return\"split\"===e&&(n={},n.constructor={},n.constructor[_a]=function(){return n},n.flags=\"\",n[a]=/./[a]),n.exec=function(){return t=!0,null},n[a](\"\"),!t});if(!o||!i||\"replace\"===e&&!(za&&Fa&&!Ga)||\"split\"===e&&!Ha){var l=/./[a],s=n(a,\"\"[e],function(e,t,n,r,a){return t.exec===Ba?o&&!a?{done:!0,value:l.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:Fa,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:Ga}),c=s[0],u=s[1];Ar(String.prototype,e,c),Ar(RegExp.prototype,a,2==t?function(e,t){return u.call(e,this,t)}:function(e){return u.call(e,this)})}r&&Qn(RegExp.prototype[a],\"sham\",!0)},Ya=function(e){return function(t,n){var r=In(t)+\"\",a=Cr(n),o=r.length,i,l;return 0>a||a>=o?e?\"\":void 0:(i=r.charCodeAt(a),55296>i||56319<i||a+1===o||56320>(l=r.charCodeAt(a+1))||57343<l?e?r.charAt(a):i:e?r.slice(a,a+2):(i-55296<<10)+(l-56320)+65536)}},$a={codeAt:Ya(!1),charAt:Ya(!0)},Wa=$a.charAt,Xa=function(e,t,n){return t+(n?Wa(e,t).length:1)},qa=function(e,t){var n=e.exec;if(\"function\"==typeof n){var r=n.call(e,t);if(\"object\"!=typeof r)throw TypeError(\"RegExp exec method returned something other than an Object or null\");return r}if(\"RegExp\"!==Vn(e))throw TypeError(\"RegExp#exec called on incompatible receiver\");return Ba.call(e,t)};Ua(\"match\",1,function(e,t,r){return[function(t){var n=In(this),r=null==t?void 0:t[e];return void 0===r?new RegExp(t)[e](n+\"\"):r.call(t,n)},function(e){var a=r(t,e,this);if(a.done)return a.value;var o=$n(e),i=this+\"\";if(!o.global)return qa(o,i);var l=o.unicode;o.lastIndex=0;for(var s=[],c=0,u,d;null!==(u=qa(o,i));)d=u[0]+\"\",s[c]=d,\"\"==d&&(o.lastIndex=Xa(i,wr(o.lastIndex),l)),c++;return 0===c?null:s}]});var Qa=function(e){return void 0===e?e:e+\"\"};Ua(\"replace\",2,function(e,t,n,r){function a(e,r,a,o,i,l){var s=a+e.length,c=o.length,n=/\\$([$&'`]|\\d\\d?)/g;return void 0!==i&&(i=Zr(i),n=/\\$([$&'`]|\\d\\d?|<[^>]*>)/g),t.call(l,n,function(t,l){var u;switch(l.charAt(0)){case\"$\":return\"$\";case\"&\":return e;case\"`\":return r.slice(0,a);case\"'\":return r.slice(s);case\"<\":u=i[l.slice(1,-1)];break;default:var d=+l;if(0==d)return t;if(d>c){var n=fn(d/10);return 0===n?t:n<=c?void 0===o[n-1]?l.charAt(1):o[n-1]+l.charAt(1):t}u=o[d-1];}return void 0===u?\"\":u})}var o=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,l=r.REPLACE_KEEPS_$0,s=o?\"$\":\"$0\";return[function(n,r){var a=In(this),o=null==n?void 0:n[e];return void 0===o?t.call(a+\"\",n,r):o.call(n,a,r)},function(e,r){if(!o&&l||\"string\"==typeof r&&-1===r.indexOf(s)){var c=n(t,e,this,r);if(c.done)return c.value}var u=$n(e),d=this+\"\",g=\"function\"==typeof r;g||(r+=\"\");var p=u.global;if(p){var y=u.unicode;u.lastIndex=0}for(var h=[],f,m;(f=qa(u,d),null!==f)&&(h.push(f),!!p);)m=f[0]+\"\",\"\"==m&&(u.lastIndex=Xa(d,wr(u.lastIndex),y));for(var x=\"\",b=0,v=0;v<h.length;v++){f=h[v];for(var S=f[0]+\"\",k=dn(gn(Cr(f.index),d.length),0),A=[],P=1;P<f.length;P++)A.push(Qa(f[P]));var E=f.groups;if(g){var T=[S].concat(A,k,d);void 0!==E&&T.push(E);var C=r.apply(void 0,T)+\"\"}else C=a(S,d,k,A,E,r);k>=b&&(x+=d.slice(b,k)+C,b=k+S.length)}return x+d.slice(b)}]});var Ka=/^[A-Z-]+$/,Za=function(e,t){var n=[][e];return!!n&&kn(function(){n.call(null,t||function(){throw 1},1)})},Ja=[].join,eo=Rn!=Object,to=Za(\"join\",\",\");qr({target:\"Array\",proto:!0,forced:eo||!to},{join:function(e){return Ja.call(Dn(this),void 0===e?\",\":e)}});var no=function(e){if(Array.isArray(e))return e},ro=d,ao=g,oo=function(e,t){if(e){if(\"string\"==typeof e)return ao(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return\"Object\"===r&&e.constructor&&(r=e.constructor.name),\"Map\"===r||\"Set\"===r?Array.from(r):\"Arguments\"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ao(e,t):void 0}},io=function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},lo=p,so=/(\\[[^\\]]+\\])/g,co=/(#[^\\s\\+>~\\.\\[:]+)/g,uo=/(\\.[^\\s\\+>~\\.\\[:]+)/g,go=/(::[^\\s\\+>~\\.\\[:]+|:first-line|:first-letter|:before|:after)/gi,po=/(:[\\w-]+\\([^\\)]*\\))/gi,yo=/(:[^\\s\\+>~\\.\\[:]+)/g,ho=/([^\\s\\+>~\\.\\[:]+)/g,fo=1e-8,mo=Object.keys||function(e){return Ir(e,Dr)},xo=An?Object.defineProperties:function(e,t){$n(e);for(var n=mo(t),r=n.length,a=0,o;r>a;)qn.f(e,o=n[a++],t[o]);return e},bo=Tr(\"document\",\"documentElement\"),vo=\">\",So=\"<\",ko=\"prototype\",Ao=\"script\",Po=ur(\"IE_PROTO\"),Eo=function(){},To=function(e){return So+Ao+vo+e+So+\"/\"+Ao+vo},Co=function(e){e.write(To(\"\")),e.close();var t=e.parentWindow.Object;return e=null,t},wo=function(){var e=jn(\"iframe\"),t;return e.style.display=\"none\",bo.appendChild(e),e.src=\"java\"+Ao+\":\"+\"\",t=e.contentWindow.document,t.open(),t.write(To(\"document.F=Object\")),t.close(),t.F},Oo=function(){try{Vo=document.domain&&new ActiveXObject(\"htmlfile\")}catch(e){}Oo=Vo?Co(Vo):wo();for(var e=Dr.length;e--;)delete Oo[ko][Dr[e]];return Oo()},Vo;dr[Po]=!0;var Lo=Object.create||function(e,t){var n;return null===e?n=Oo():(Eo[ko]=$n(e),n=new Eo,Eo[ko]=null,n[Po]=e),void 0===t?n:xo(n,t)},Ro=Br.f,Io={}.toString,Do=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],No=function(e){try{return Ro(e)}catch(e){return Do.slice()}},Mo={f:function(e){return Do&&\"[object Window]\"==Io.call(e)?No(e):Ro(Dn(e))}},Bo={f:oa},_o=qn.f,zo=function(e){var t=Pr.Symbol||(Pr.Symbol={});_n(t,e)||_o(t,e,{value:Bo.f(e)})},Fo=qn.f,jo=oa(\"toStringTag\"),Go=function(e,t,n){e&&!_n(e=n?e:e.prototype,jo)&&Fo(e,jo,{configurable:!0,value:t})},Ho=ua.forEach,Uo=ur(\"hidden\"),Yo=\"Symbol\",$o=\"prototype\",Wo=oa(\"toPrimitive\"),Xo=kr.set,qo=kr.getterFor(Yo),Qo=Object[$o],Ko=Sn.Symbol,Zo=Tr(\"JSON\",\"stringify\"),Jo=Yn.f,ei=qn.f,ti=Mo.f,ni=f.f,ri=or(\"symbols\"),ai=or(\"op-symbols\"),oi=or(\"string-to-symbol-registry\"),ii=or(\"symbol-to-string-registry\"),li=or(\"wks\"),si=Sn.QObject,ci=!si||!si[$o]||!si[$o].findChild,ui=An&&kn(function(){return 7!=Lo(ei({},\"a\",{get:function(){return ei(this,\"a\",{value:7}).a}})).a})?function(e,t,n){var r=Jo(Qo,t);r&&delete Qo[t],ei(e,t,n),r&&e!==Qo&&ei(Qo,t,r)}:ei,di=function(e,t){var n=ri[e]=Lo(Ko[$o]);return Xo(n,{type:Yo,tag:e,description:t}),An||(n.description=t),n},gi=ta?function(e){return\"symbol\"==typeof e}:function(e){return Object(e)instanceof Ko},pi=function(e,t,n){e===Qo&&pi(ai,t,n),$n(e);var r=Mn(t,!0);return $n(n),_n(ri,r)?(n.enumerable?(_n(e,Uo)&&e[Uo][r]&&(e[Uo][r]=!1),n=Lo(n,{enumerable:wn(0,!1)})):(!_n(e,Uo)&&ei(e,Uo,wn(1,{})),e[Uo][r]=!0),ui(e,r,n)):ei(e,r,n)},yi=function(e,t){$n(e);var n=Dn(t),r=mo(n).concat(xi(n));return Ho(r,function(t){(!An||hi.call(n,t))&&pi(e,t,n[t])}),e},hi=function(e){var t=Mn(e,!0),n=ni.call(this,t);return(this!==Qo||!_n(ri,t)||_n(ai,t))&&(!(n||!_n(this,t)||!_n(ri,t)||_n(this,Uo)&&this[Uo][t])||n)},fi=function(e,t){var n=Dn(e),r=Mn(t,!0);if(n!==Qo||!_n(ri,r)||_n(ai,r)){var a=Jo(n,r);return a&&_n(ri,r)&&!(_n(n,Uo)&&n[Uo][r])&&(a.enumerable=!0),a}},mi=function(e){var t=ti(Dn(e)),n=[];return Ho(t,function(e){_n(ri,e)||_n(dr,e)||n.push(e)}),n},xi=function(e){var t=e===Qo,n=ti(t?ai:Dn(e)),r=[];return Ho(n,function(e){_n(ri,e)&&(!t||_n(Qo,e))&&r.push(ri[e])}),r};if(ea||(Ko=function(){if(this instanceof Ko)throw TypeError(\"Symbol is not a constructor\");var e=arguments.length&&void 0!==arguments[0]?arguments[0]+\"\":void 0,t=sr(e),n=function(e){this===Qo&&n.call(ai,e),_n(this,Uo)&&_n(this[Uo],t)&&(this[Uo][t]=!1),ui(this,t,wn(1,e))};return An&&ci&&ui(Qo,t,{configurable:!0,set:n}),di(t,e)},Ar(Ko[$o],\"toString\",function(){return qo(this).tag}),Ar(Ko,\"withoutSetter\",function(e){return di(sr(e),e)}),f.f=hi,qn.f=pi,Yn.f=fi,Br.f=Mo.f=mi,zr.f=xi,Bo.f=function(e){return di(oa(e),e)},An&&(ei(Ko[$o],\"description\",{configurable:!0,get:function(){return qo(this).description}}),Ar(Qo,\"propertyIsEnumerable\",hi,{unsafe:!0}))),qr({global:!0,wrap:!0,forced:!ea,sham:!ea},{Symbol:Ko}),Ho(mo(li),function(e){zo(e)}),qr({target:Yo,stat:!0,forced:!ea},{for:function(e){var t=e+\"\";if(_n(oi,t))return oi[t];var n=Ko(t);return oi[t]=n,ii[n]=t,n},keyFor:function(e){if(!gi(e))throw TypeError(e+\" is not a symbol\");return _n(ii,e)?ii[e]:void 0},useSetter:function(){ci=!0},useSimple:function(){ci=!1}}),qr({target:\"Object\",stat:!0,forced:!ea,sham:!An},{create:function(e,t){return void 0===t?Lo(e):yi(Lo(e),t)},defineProperty:pi,defineProperties:yi,getOwnPropertyDescriptor:fi}),qr({target:\"Object\",stat:!0,forced:!ea},{getOwnPropertyNames:mi,getOwnPropertySymbols:xi}),qr({target:\"Object\",stat:!0,forced:kn(function(){zr.f(1)})},{getOwnPropertySymbols:function(e){return zr.f(Zr(e))}}),Zo){var bi=!ea||kn(function(){var e=Ko();return\"[null]\"!=Zo([e])||\"{}\"!=Zo({a:e})||\"{}\"!=Zo(Object(e))});qr({target:\"JSON\",stat:!0,forced:bi},{stringify:function(e,t){for(var n=[e],r=1,a;arguments.length>r;)n.push(arguments[r++]);if(a=t,(Nn(t)||void 0!==e)&&!gi(e))return Jr(t)||(t=function(e,t){if(\"function\"==typeof a&&(t=a.call(this,e,t)),!gi(t))return t}),n[1]=t,Zo.apply(null,n)}})}Ko[$o][Wo]||Qn(Ko[$o],Wo,Ko[$o].valueOf),Go(Ko,Yo),dr[Uo]=!0;var vi=ua.filter,Si=ba(\"filter\"),ki=Aa(\"filter\");qr({target:\"Array\",proto:!0,forced:!Si||!ki},{filter:function(e){return vi(this,e,1<arguments.length?arguments[1]:void 0)}});var Ai=ua.forEach,Pi=Za(\"forEach\"),Ei=Aa(\"forEach\"),Ti=Pi&&Ei?[].forEach:function(e){return Ai(this,e,1<arguments.length?arguments[1]:void 0)};qr({target:\"Array\",proto:!0,forced:[].forEach!=Ti},{forEach:Ti});var Ci=Yn.f,wi=kn(function(){Ci(1)});qr({target:\"Object\",stat:!0,forced:!An||wi,sham:!An},{getOwnPropertyDescriptor:function(e,t){return Ci(Dn(e),t)}});var Oi=function(e,t,n){var r=Mn(t);r in e?qn.f(e,r,wn(0,n)):e[r]=n};qr({target:\"Object\",stat:!0,sham:!An},{getOwnPropertyDescriptors:function(e){for(var t=Dn(e),n=Yn.f,r=Fr(t),a={},o=0,i,l;r.length>o;)l=n(t,i=r[o++]),void 0!==l&&Oi(a,i,l);return a}});var Vi=kn(function(){mo(1)});qr({target:\"Object\",stat:!0,forced:Vi},{keys:function(e){return mo(Zr(e))}});var Li={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0};for(var Ri in Li){var Ii=Sn[Ri],Di=Ii&&Ii.prototype;if(Di&&Di.forEach!==Ti)try{Qn(Di,\"forEach\",Ti)}catch(e){Di.forEach=Ti}}var Ni=t(function(e){var t=function(e){function t(e,t,n,a){var o=t&&t.prototype instanceof r?t:r,i=Object.create(o.prototype),l=new g(a||[]);return i._invoke=s(e,n,l),i}function n(e,t,n){try{return{type:\"normal\",arg:e.call(t,n)}}catch(e){return{type:\"throw\",arg:e}}}function r(){}function a(){}function o(){}function i(e){[\"next\",\"throw\",\"return\"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function l(e,t){function r(a,o,i,l){var s=n(e[a],e,o);if(\"throw\"===s.type)l(s.arg);else{var c=s.arg,u=c.value;return u&&\"object\"==typeof u&&f.call(u,\"__await\")?t.resolve(u.__await).then(function(e){r(\"next\",e,i,l)},function(e){r(\"throw\",e,i,l)}):t.resolve(u).then(function(e){c.value=e,i(c)},function(e){return r(\"throw\",e,i,l)})}}function a(e,n){function a(){return new t(function(t,a){r(e,n,t,a)})}return o=o?o.then(a,a):a()}var o;this._invoke=a}function s(e,t,r){var a=\"suspendedStart\";return function(o,i){if(\"executing\"===a)throw new Error(\"Generator is already running\");if(\"completed\"===a){if(\"throw\"===o)throw i;return y()}for(r.method=o,r.arg=i;;){var l=r.delegate;if(l){var s=c(l,r);if(s){if(s===k)continue;return s}}if(\"next\"===r.method)r.sent=r._sent=r.arg;else if(\"throw\"===r.method){if(\"suspendedStart\"===a)throw a=\"completed\",r.arg;r.dispatchException(r.arg)}else\"return\"===r.method&&r.abrupt(\"return\",r.arg);a=\"executing\";var u=n(e,t,r);if(\"normal\"===u.type){if(a=r.done?\"completed\":\"suspendedYield\",u.arg===k)continue;return{value:u.arg,done:r.done}}\"throw\"===u.type&&(a=\"completed\",r.method=\"throw\",r.arg=u.arg)}}}function c(e,t){var r=e.iterator[t.method];if(r===S){if(t.delegate=null,\"throw\"===t.method){if(e.iterator[\"return\"]&&(t.method=\"return\",t.arg=S,c(e,t),\"throw\"===t.method))return k;t.method=\"throw\",t.arg=new TypeError(\"The iterator does not provide a 'throw' method\")}return k}var a=n(r,e.iterator,t.arg);if(\"throw\"===a.type)return t.method=\"throw\",t.arg=a.arg,t.delegate=null,k;var o=a.arg;if(!o)return t.method=\"throw\",t.arg=new TypeError(\"iterator result is not an object\"),t.delegate=null,k;if(o.done)t[e.resultName]=o.value,t.next=e.nextLoc,\"return\"!==t.method&&(t.method=\"next\",t.arg=S);else return o;return t.delegate=null,k}function u(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function d(e){var t=e.completion||{};t.type=\"normal\",delete t.arg,e.completion=t}function g(e){this.tryEntries=[{tryLoc:\"root\"}],e.forEach(u,this),this.reset(!0)}function p(e){if(e){var t=e[x];if(t)return t.call(e);if(\"function\"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,r=function t(){for(;++n<e.length;)if(f.call(e,n))return t.value=e[n],t.done=!1,t;return t.value=S,t.done=!0,t};return r.next=r}}return{next:y}}function y(){return{value:S,done:!0}}var h=Object.prototype,f=h.hasOwnProperty,m=\"function\"==typeof Symbol?Symbol:{},x=m.iterator||\"@@iterator\",b=m.asyncIterator||\"@@asyncIterator\",v=m.toStringTag||\"@@toStringTag\",S;e.wrap=t;var k={},A={};A[x]=function(){return this};var P=Object.getPrototypeOf,E=P&&P(P(p([])));E&&E!==h&&f.call(E,x)&&(A=E);var T=o.prototype=r.prototype=Object.create(A);return a.prototype=T.constructor=o,o.constructor=a,o[v]=a.displayName=\"GeneratorFunction\",e.isGeneratorFunction=function(e){var t=\"function\"==typeof e&&e.constructor;return!!t&&(t===a||\"GeneratorFunction\"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,o):(e.__proto__=o,!(v in e)&&(e[v]=\"GeneratorFunction\")),e.prototype=Object.create(T),e},e.awrap=function(e){return{__await:e}},i(l.prototype),l.prototype[b]=function(){return this},e.AsyncIterator=l,e.async=function(n,r,a,o,i){void 0===i&&(i=Promise);var s=new l(t(n,r,a,o),i);return e.isGeneratorFunction(r)?s:s.next().then(function(e){return e.done?e.value:s.next()})},i(T),T[v]=\"Generator\",T[x]=function(){return this},T.toString=function(){return\"[object Generator]\"},e.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var r=t.pop();if(r in e)return n.value=r,n.done=!1,n}return n.done=!0,n}},e.values=p,g.prototype={constructor:g,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=S,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=S,this.tryEntries.forEach(d),!e)for(var t in this)\"t\"===t.charAt(0)&&f.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=S)},stop:function(){this.done=!0;var e=this.tryEntries[0],t=e.completion;if(\"throw\"===t.type)throw t.arg;return this.rval},dispatchException:function(e){function t(t,r){return o.type=\"throw\",o.arg=e,n.next=t,r&&(n.method=\"next\",n.arg=S),!!r}if(this.done)throw e;for(var n=this,r=this.tryEntries.length-1;0<=r;--r){var a=this.tryEntries[r],o=a.completion;if(\"root\"===a.tryLoc)return t(\"end\");if(a.tryLoc<=this.prev){var l=f.call(a,\"catchLoc\"),s=f.call(a,\"finallyLoc\");if(l&&s){if(this.prev<a.catchLoc)return t(a.catchLoc,!0);if(this.prev<a.finallyLoc)return t(a.finallyLoc)}else if(l){if(this.prev<a.catchLoc)return t(a.catchLoc,!0);}else if(!s)throw new Error(\"try statement without catch or finally\");else if(this.prev<a.finallyLoc)return t(a.finallyLoc)}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1,r;0<=n;--n)if(r=this.tryEntries[n],r.tryLoc<=this.prev&&f.call(r,\"finallyLoc\")&&this.prev<r.finallyLoc){var a=r;break}a&&(\"break\"===e||\"continue\"===e)&&a.tryLoc<=t&&t<=a.finallyLoc&&(a=null);var o=a?a.completion:{};return o.type=e,o.arg=t,a?(this.method=\"next\",this.next=a.finallyLoc,k):this.complete(o)},complete:function(e,t){if(\"throw\"===e.type)throw e.arg;return\"break\"===e.type||\"continue\"===e.type?this.next=e.arg:\"return\"===e.type?(this.rval=this.arg=e.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===e.type&&t&&(this.next=t),k},finish:function(e){for(var t=this.tryEntries.length-1,n;0<=t;--t)if(n=this.tryEntries[t],n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),d(n),k},catch:function(e){for(var t=this.tryEntries.length-1,n;0<=t;--t)if(n=this.tryEntries[t],n.tryLoc===e){var r=n.completion;if(\"throw\"===r.type){var a=r.arg;d(n)}return a}throw new Error(\"illegal catch attempt\")},delegateYield:function(e,t,n){return this.delegate={iterator:p(e),resultName:t,nextLoc:n},\"next\"===this.method&&(this.arg=S),k}},e}(e.exports);try{regeneratorRuntime=t}catch(e){Function(\"r\",\"regeneratorRuntime = r\")(t)}}),Mi=Ni,Bi=t(function(e){var t=function(e){function t(e,t,n,a){var o=t&&t.prototype instanceof r?t:r,i=Object.create(o.prototype),l=new g(a||[]);return i._invoke=s(e,n,l),i}function n(e,t,n){try{return{type:\"normal\",arg:e.call(t,n)}}catch(e){return{type:\"throw\",arg:e}}}function r(){}function a(){}function o(){}function i(e){[\"next\",\"throw\",\"return\"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function l(e,t){function r(a,o,i,l){var s=n(e[a],e,o);if(\"throw\"===s.type)l(s.arg);else{var c=s.arg,u=c.value;return u&&\"object\"==typeof u&&f.call(u,\"__await\")?t.resolve(u.__await).then(function(e){r(\"next\",e,i,l)},function(e){r(\"throw\",e,i,l)}):t.resolve(u).then(function(e){c.value=e,i(c)},function(e){return r(\"throw\",e,i,l)})}}function a(e,n){function a(){return new t(function(t,a){r(e,n,t,a)})}return o=o?o.then(a,a):a()}var o;this._invoke=a}function s(e,t,r){var a=\"suspendedStart\";return function(o,i){if(\"executing\"===a)throw new Error(\"Generator is already running\");if(\"completed\"===a){if(\"throw\"===o)throw i;return y()}for(r.method=o,r.arg=i;;){var l=r.delegate;if(l){var s=c(l,r);if(s){if(s===k)continue;return s}}if(\"next\"===r.method)r.sent=r._sent=r.arg;else if(\"throw\"===r.method){if(\"suspendedStart\"===a)throw a=\"completed\",r.arg;r.dispatchException(r.arg)}else\"return\"===r.method&&r.abrupt(\"return\",r.arg);a=\"executing\";var u=n(e,t,r);if(\"normal\"===u.type){if(a=r.done?\"completed\":\"suspendedYield\",u.arg===k)continue;return{value:u.arg,done:r.done}}\"throw\"===u.type&&(a=\"completed\",r.method=\"throw\",r.arg=u.arg)}}}function c(e,t){var r=e.iterator[t.method];if(r===S){if(t.delegate=null,\"throw\"===t.method){if(e.iterator[\"return\"]&&(t.method=\"return\",t.arg=S,c(e,t),\"throw\"===t.method))return k;t.method=\"throw\",t.arg=new TypeError(\"The iterator does not provide a 'throw' method\")}return k}var a=n(r,e.iterator,t.arg);if(\"throw\"===a.type)return t.method=\"throw\",t.arg=a.arg,t.delegate=null,k;var o=a.arg;if(!o)return t.method=\"throw\",t.arg=new TypeError(\"iterator result is not an object\"),t.delegate=null,k;if(o.done)t[e.resultName]=o.value,t.next=e.nextLoc,\"return\"!==t.method&&(t.method=\"next\",t.arg=S);else return o;return t.delegate=null,k}function u(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function d(e){var t=e.completion||{};t.type=\"normal\",delete t.arg,e.completion=t}function g(e){this.tryEntries=[{tryLoc:\"root\"}],e.forEach(u,this),this.reset(!0)}function p(e){if(e){var t=e[x];if(t)return t.call(e);if(\"function\"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,r=function t(){for(;++n<e.length;)if(f.call(e,n))return t.value=e[n],t.done=!1,t;return t.value=S,t.done=!0,t};return r.next=r}}return{next:y}}function y(){return{value:S,done:!0}}var h=Object.prototype,f=h.hasOwnProperty,m=\"function\"==typeof Symbol?Symbol:{},x=m.iterator||\"@@iterator\",b=m.asyncIterator||\"@@asyncIterator\",v=m.toStringTag||\"@@toStringTag\",S;e.wrap=t;var k={},A={};A[x]=function(){return this};var P=Object.getPrototypeOf,E=P&&P(P(p([])));E&&E!==h&&f.call(E,x)&&(A=E);var T=o.prototype=r.prototype=Object.create(A);return a.prototype=T.constructor=o,o.constructor=a,o[v]=a.displayName=\"GeneratorFunction\",e.isGeneratorFunction=function(e){var t=\"function\"==typeof e&&e.constructor;return!!t&&(t===a||\"GeneratorFunction\"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,o):(e.__proto__=o,!(v in e)&&(e[v]=\"GeneratorFunction\")),e.prototype=Object.create(T),e},e.awrap=function(e){return{__await:e}},i(l.prototype),l.prototype[b]=function(){return this},e.AsyncIterator=l,e.async=function(n,r,a,o,i){void 0===i&&(i=Promise);var s=new l(t(n,r,a,o),i);return e.isGeneratorFunction(r)?s:s.next().then(function(e){return e.done?e.value:s.next()})},i(T),T[v]=\"Generator\",T[x]=function(){return this},T.toString=function(){return\"[object Generator]\"},e.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var r=t.pop();if(r in e)return n.value=r,n.done=!1,n}return n.done=!0,n}},e.values=p,g.prototype={constructor:g,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=S,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=S,this.tryEntries.forEach(d),!e)for(var t in this)\"t\"===t.charAt(0)&&f.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=S)},stop:function(){this.done=!0;var e=this.tryEntries[0],t=e.completion;if(\"throw\"===t.type)throw t.arg;return this.rval},dispatchException:function(e){function t(t,r){return o.type=\"throw\",o.arg=e,n.next=t,r&&(n.method=\"next\",n.arg=S),!!r}if(this.done)throw e;for(var n=this,r=this.tryEntries.length-1;0<=r;--r){var a=this.tryEntries[r],o=a.completion;if(\"root\"===a.tryLoc)return t(\"end\");if(a.tryLoc<=this.prev){var l=f.call(a,\"catchLoc\"),s=f.call(a,\"finallyLoc\");if(l&&s){if(this.prev<a.catchLoc)return t(a.catchLoc,!0);if(this.prev<a.finallyLoc)return t(a.finallyLoc)}else if(l){if(this.prev<a.catchLoc)return t(a.catchLoc,!0);}else if(!s)throw new Error(\"try statement without catch or finally\");else if(this.prev<a.finallyLoc)return t(a.finallyLoc)}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1,r;0<=n;--n)if(r=this.tryEntries[n],r.tryLoc<=this.prev&&f.call(r,\"finallyLoc\")&&this.prev<r.finallyLoc){var a=r;break}a&&(\"break\"===e||\"continue\"===e)&&a.tryLoc<=t&&t<=a.finallyLoc&&(a=null);var o=a?a.completion:{};return o.type=e,o.arg=t,a?(this.method=\"next\",this.next=a.finallyLoc,k):this.complete(o)},complete:function(e,t){if(\"throw\"===e.type)throw e.arg;return\"break\"===e.type||\"continue\"===e.type?this.next=e.arg:\"return\"===e.type?(this.rval=this.arg=e.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===e.type&&t&&(this.next=t),k},finish:function(e){for(var t=this.tryEntries.length-1,n;0<=t;--t)if(n=this.tryEntries[t],n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),d(n),k},catch:function(e){for(var t=this.tryEntries.length-1,n;0<=t;--t)if(n=this.tryEntries[t],n.tryLoc===e){var r=n.completion;if(\"throw\"===r.type){var a=r.arg;d(n)}return a}throw new Error(\"illegal catch attempt\")},delegateYield:function(e,t,n){return this.delegate={iterator:p(e),resultName:t,nextLoc:n},\"next\"===this.method&&(this.arg=S),k}},e}(e.exports);try{regeneratorRuntime=t}catch(e){Function(\"r\",\"regeneratorRuntime = r\")(t)}}),_i=function(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){function o(e){O(l,r,a,o,i,\"next\",e)}function i(e){O(l,r,a,o,i,\"throw\",e)}var l=e.apply(t,n);o(void 0)})}},zi=V,Fi=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},ji=function(e,t,n){return t&&L(e.prototype,t),n&&L(e,n),e},Gi=oa(\"isConcatSpreadable\"),Hi=9007199254740991,Ui=\"Maximum allowed index exceeded\",Yi=51<=ma||!kn(function(){var e=[];return e[Gi]=!1,e.concat()[0]!==e}),$i=ba(\"concat\"),Wi=function(e){if(!Nn(e))return!1;var t=e[Gi];return void 0===t?Jr(e):!!t};qr({target:\"Array\",proto:!0,forced:!Yi||!$i},{concat:function(){var e=Zr(this),t=la(e,0),r=0,a,o,l,s,c;for(a=-1,l=arguments.length;a<l;a++)if(c=-1===a?e:arguments[a],Wi(c)){if(s=wr(c.length),r+s>Hi)throw TypeError(Ui);for(o=0;o<s;o++,r++)o in c&&Oi(t,r,c[o])}else{if(r>=Hi)throw TypeError(Ui);Oi(t,r++,c)}return t.length=r,t}});var Xi=ua.every,qi=Za(\"every\"),Qi=Aa(\"every\");qr({target:\"Array\",proto:!0,forced:!qi||!Qi},{every:function(e){return Xi(this,e,1<arguments.length?arguments[1]:void 0)}});var Ki=function(e){return function(t,n,r,a){Qr(n);var o=Zr(t),l=Rn(o),s=wr(o.length),c=e?s-1:0,u=e?-1:1;if(2>r)for(;;){if(c in l){a=l[c],c+=u;break}if(c+=u,e?0>c:s<=c)throw TypeError(\"Reduce of empty array with no initial value\")}for(;e?0<=c:s>c;c+=u)c in l&&(a=n(a,l[c],c,o));return a}},Zi={left:Ki(!1),right:Ki(!0)},Ji=Zi.left,el=Za(\"reduce\"),tl=Aa(\"reduce\",{1:0});qr({target:\"Array\",proto:!0,forced:!el||!tl},{reduce:function(e){return Ji(this,e,arguments.length,1<arguments.length?arguments[1]:void 0)}});var nl=oa(\"toStringTag\"),rl={};rl[nl]=\"z\";var al=\"[object z]\"===rl+\"\",ol=oa(\"toStringTag\"),il=\"Arguments\"==Vn(function(){return arguments}()),ll=function(e,t){try{return e[t]}catch(e){}},sl=function(e){var t,n,r;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=ll(t=Object(e),ol))?n:il?Vn(t):\"Object\"==(r=Vn(t))&&\"function\"==typeof t.callee?\"Arguments\":r},cl=function(){return\"[object \"+sl(this)+\"]\"};al||Ar(Object.prototype,\"toString\",cl,{unsafe:!0});var ul=Sn.Promise,dl=function(e,t,n){for(var r in t)Ar(e,r,t[r],n);return e},gl=oa(\"species\"),pl=function(e){var t=Tr(e),n=qn.f;An&&t&&!t[gl]&&n(t,gl,{configurable:!0,get:function(){return this}})},yl=function(e,t,n){if(!(e instanceof t))throw TypeError(\"Incorrect \"+(n?n+\" \":\"\")+\"invocation\");return e},hl={},fl=oa(\"iterator\"),ml=Array.prototype,xl=function(e){return void 0!==e&&(hl.Array===e||ml[fl]===e)},bl=oa(\"iterator\"),vl=function(e){if(null!=e)return e[bl]||e[\"@@iterator\"]||hl[sl(e)]},Sl=function(e,t,n,r){try{return r?t($n(n)[0],n[1]):t(n)}catch(t){var a=e[\"return\"];throw void 0!==a&&$n(a.call(e)),t}},kl=t(function(e){var t=function(e,t){this.stopped=e,this.result=t},n=e.exports=function(e,n,r,a,o){var i=Kr(n,r,a?2:1),l,s,c,u,d,g,p;if(o)l=e;else{if(s=vl(e),\"function\"!=typeof s)throw TypeError(\"Target is not iterable\");if(xl(s)){for(c=0,u=wr(e.length);u>c;c++)if(d=a?i($n(p=e[c])[0],p[1]):i(e[c]),d&&d instanceof t)return d;return new t(!1)}l=s.call(e)}for(g=l.next;!(p=g.call(l)).done;)if(d=Sl(l,i,p.value,a),\"object\"==typeof d&&d&&d instanceof t)return d;return new t(!1)};n.stop=function(e){return new t(!0,e)}}),Al=oa(\"iterator\"),Pl=!1;try{var El=0,Tl={next:function(){return{done:!!El++}},return:function(){Pl=!0}};Tl[Al]=function(){return this},Array.from(Tl,function(){throw 2})}catch(e){}var Cl=function(e,t){if(!t&&!Pl)return!1;var n=!1;try{var r={};r[Al]=function(){return{next:function(){return{done:n=!0}}}},e(r)}catch(e){}return n},wl=oa(\"species\"),Ol=function(e,t){var n=$n(e).constructor,r;return void 0===n||null==(r=$n(n)[wl])?t:Qr(r)},Vl=/(iphone|ipod|ipad).*applewebkit/i.test(da),Ll=Sn.location,Rl=Sn.setImmediate,Il=Sn.clearImmediate,Dl=Sn.process,Nl=Sn.MessageChannel,Ml=Sn.Dispatch,Bl=0,_l={},zl=\"onreadystatechange\",Fl=function(e){if(_l.hasOwnProperty(e)){var t=_l[e];delete _l[e],t()}},jl=function(e){return function(){Fl(e)}},Gl=function(e){Fl(e.data)},Hl=function(e){Sn.postMessage(e+\"\",Ll.protocol+\"//\"+Ll.host)},Ul,Yl,$l;Rl&&Il||(Rl=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return _l[++Bl]=function(){(\"function\"==typeof e?e:Function(e)).apply(void 0,t)},Ul(Bl),Bl},Il=function(e){delete _l[e]},\"process\"==Vn(Dl)?Ul=function(e){Dl.nextTick(jl(e))}:Ml&&Ml.now?Ul=function(e){Ml.now(jl(e))}:Nl&&!Vl?(Yl=new Nl,$l=Yl.port2,Yl.port1.onmessage=Gl,Ul=Kr($l.postMessage,$l,1)):!Sn.addEventListener||\"function\"!=typeof postMessage||Sn.importScripts||kn(Hl)||\"file:\"===Ll.protocol?zl in jn(\"script\")?Ul=function(e){bo.appendChild(jn(\"script\"))[zl]=function(){bo.removeChild(this),Fl(e)}}:Ul=function(e){setTimeout(jl(e),0)}:(Ul=Hl,Sn.addEventListener(\"message\",Gl,!1)));var Wl={set:Rl,clear:Il},Xl=Yn.f,ql=Wl.set,Ql=Sn.MutationObserver||Sn.WebKitMutationObserver,Kl=Sn.process,Zl=Sn.Promise,Jl=\"process\"==Vn(Kl),es=Xl(Sn,\"queueMicrotask\"),ts=es&&es.value,ns,rs,as,os,is,ls,ss,cs;ts||(ns=function(){var e,t;for(Jl&&(e=Kl.domain)&&e.exit();rs;){t=rs.fn,rs=rs.next;try{t()}catch(e){throw rs?os():as=void 0,e}}as=void 0,e&&e.enter()},Jl?os=function(){Kl.nextTick(ns)}:Ql&&!Vl?(is=!0,ls=document.createTextNode(\"\"),new Ql(ns).observe(ls,{characterData:!0}),os=function(){ls.data=is=!is}):Zl&&Zl.resolve?(ss=Zl.resolve(void 0),cs=ss.then,os=function(){cs.call(ss,ns)}):os=function(){ql.call(Sn,ns)});var us=ts||function(e){var t={fn:e,next:void 0};as&&(as.next=t),rs||(rs=t,os()),as=t},ds=function(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw TypeError(\"Bad Promise constructor\");t=e,n=r}),this.resolve=Qr(t),this.reject=Qr(n)},gs={f:function(e){return new ds(e)}},ps=function(e,t){if($n(e),Nn(t)&&t.constructor===e)return t;var n=gs.f(e),r=n.resolve;return r(t),n.promise},ys=function(e,t){var n=Sn.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))},hs=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},fs=Wl.set,ms=oa(\"species\"),xs=\"Promise\",bs=kr.get,vs=kr.set,Ss=kr.getterFor(xs),ks=ul,As=Sn.TypeError,Ps=Sn.document,Es=Sn.process,Ts=Tr(\"fetch\"),Cs=gs.f,ws=Cs,Os=\"process\"==Vn(Es),Vs=!!(Ps&&Ps.createEvent&&Sn.dispatchEvent),Ls=\"unhandledrejection\",Rs=0,Is=1,Ds=1,Ns=2,Ms=Wr(xs,function(){var e=nr(ks)!==ks+\"\";if(!e){if(66===ma)return!0;if(!Os&&\"function\"!=typeof PromiseRejectionEvent)return!0}if(51<=ma&&/native code/.test(ks))return!1;var t=ks.resolve(1),n=function(e){e(function(){},function(){})},r=t.constructor={};return r[ms]=n,!(t.then(function(){})instanceof n)}),Bs=Ms||!Cl(function(e){ks.all(e)[\"catch\"](function(){})}),_s=function(e){var t;return!!(Nn(e)&&\"function\"==typeof(t=e.then))&&t},zs=function(e,t,n){if(!t.notified){t.notified=!0;var r=t.reactions;us(function(){for(var a=t.value,o=t.state==Is,i=0;r.length>i;){var l=r[i++],s=o?l.ok:l.fail,c=l.resolve,u=l.reject,d=l.domain,g,p,y;try{s?(!o&&(t.rejection===Ns&&Hs(e,t),t.rejection=Ds),!0===s?g=a:(d&&d.enter(),g=s(a),d&&(d.exit(),y=!0)),g===l.promise?u(As(\"Promise-chain cycle\")):(p=_s(g))?p.call(g,c,u):c(g)):u(a)}catch(e){d&&!y&&d.exit(),u(e)}}t.reactions=[],t.notified=!1,n&&!t.rejection&&js(e,t)})}},Fs=function(e,t,n){var r,a;Vs?(r=Ps.createEvent(\"Event\"),r.promise=t,r.reason=n,r.initEvent(e,!1,!0),Sn.dispatchEvent(r)):r={promise:t,reason:n},(a=Sn[\"on\"+e])?a(r):e===Ls&&ys(\"Unhandled promise rejection\",n)},js=function(e,t){fs.call(Sn,function(){var n=t.value,r=Gs(t),a;if(r&&(a=hs(function(){Os?Es.emit(\"unhandledRejection\",n,e):Fs(Ls,e,n)}),t.rejection=Os||Gs(t)?Ns:Ds,a.error))throw a.value})},Gs=function(e){return e.rejection!==Ds&&!e.parent},Hs=function(e,t){fs.call(Sn,function(){Os?Es.emit(\"rejectionHandled\",e):Fs(\"rejectionhandled\",e,t.value)})},Us=function(e,t,n,r){return function(a){e(t,n,a,r)}},Ys=function(e,t,n,r){t.done||(t.done=!0,r&&(t=r),t.value=n,t.state=2,zs(e,t,!0))},$s=function(e,t,n,r){if(!t.done){t.done=!0,r&&(t=r);try{if(e===n)throw As(\"Promise can't be resolved itself\");var a=_s(n);a?us(function(){var r={done:!1};try{a.call(n,Us($s,e,r,t),Us(Ys,e,r,t))}catch(n){Ys(e,r,n,t)}}):(t.value=n,t.state=Is,zs(e,t,!1))}catch(n){Ys(e,{done:!1},n,t)}}},Ws,Xs,qs,Qs;Ms&&(ks=function(e){yl(this,ks,xs),Qr(e),Ws.call(this);var t=bs(this);try{e(Us($s,this,t),Us(Ys,this,t))}catch(e){Ys(this,t,e)}},Ws=function(){vs(this,{type:xs,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:Rs,value:void 0})},Ws.prototype=dl(ks.prototype,{then:function(e,t){var n=Ss(this),r=Cs(Ol(this,ks));return r.ok=\"function\"!=typeof e||e,r.fail=\"function\"==typeof t&&t,r.domain=Os?Es.domain:void 0,n.parent=!0,n.reactions.push(r),n.state!=Rs&&zs(this,n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),Xs=function(){var e=new Ws,t=bs(e);this.promise=e,this.resolve=Us($s,e,t),this.reject=Us(Ys,e,t)},gs.f=Cs=function(e){return e===ks||e===qs?new Xs(e):ws(e)},\"function\"==typeof ul&&(Qs=ul.prototype.then,Ar(ul.prototype,\"then\",function(e,t){var n=this;return new ks(function(e,t){Qs.call(n,e,t)}).then(e,t)},{unsafe:!0}),\"function\"==typeof Ts&&qr({global:!0,enumerable:!0,forced:!0},{fetch:function(){return ps(ks,Ts.apply(Sn,arguments))}}))),qr({global:!0,wrap:!0,forced:Ms},{Promise:ks}),Go(ks,xs,!1),pl(xs),qs=Tr(xs),qr({target:xs,stat:!0,forced:Ms},{reject:function(e){var t=Cs(this);return t.reject.call(void 0,e),t.promise}}),qr({target:xs,stat:!0,forced:Ms},{resolve:function(e){return ps(this,e)}}),qr({target:xs,stat:!0,forced:Bs},{all:function(e){var t=this,n=Cs(t),r=n.resolve,a=n.reject,o=hs(function(){var n=Qr(t.resolve),o=[],i=0,l=1;kl(e,function(e){var s=i++,c=!1;o.push(void 0),l++,n.call(t,e).then(function(e){c||(c=!0,o[s]=e,--l||r(o))},a)}),--l||r(o)});return o.error&&a(o.value),n.promise},race:function(e){var t=this,n=Cs(t),r=n.reject,a=hs(function(){var a=Qr(t.resolve);kl(e,function(e){a.call(t,e).then(n.resolve,r)})});return a.error&&r(a.value),n.promise}});var Ks=oa(\"match\"),Zs=function(e){var t;return Nn(e)&&(void 0===(t=e[Ks])?\"RegExp\"==Vn(e):!!t)},Js=[].push,ec=4294967295,tc=!kn(function(){return!RegExp(ec,\"y\")});Ua(\"split\",2,function(e,t,n){var r;return r=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||1<\".\".split(/()()/).length||\"\".split(/.?/).length?function(e,n){var r=In(this)+\"\",a=void 0===n?ec:n>>>0;if(0===a)return[];if(void 0===e)return[r];if(!Zs(e))return t.call(r,e,a);for(var o=[],i=(e.ignoreCase?\"i\":\"\")+(e.multiline?\"m\":\"\")+(e.unicode?\"u\":\"\")+(e.sticky?\"y\":\"\"),l=0,s=new RegExp(e.source,i+\"g\"),c,u,d;(c=Ba.call(s,r))&&(u=s.lastIndex,!(u>l&&(o.push(r.slice(l,c.index)),1<c.length&&c.index<r.length&&Js.apply(o,c.slice(1)),d=c[0].length,l=u,o.length>=a)));)s.lastIndex===c.index&&s.lastIndex++;return l===r.length?(d||!s.test(\"\"))&&o.push(\"\"):o.push(r.slice(l)),o.length>a?o.slice(0,a):o}:function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)},[function(t,n){var a=In(this),o=null==t?void 0:t[e];return void 0===o?r.call(a+\"\",t,n):o.call(t,a,n)},function(a,o){var l=n(r,a,this,o,r!==t);if(l.done)return l.value;var s=$n(a),c=this+\"\",u=Ol(s,RegExp),d=s.unicode,g=(s.ignoreCase?\"i\":\"\")+(s.multiline?\"m\":\"\")+(s.unicode?\"u\":\"\")+(tc?\"y\":\"g\"),y=new u(tc?s:\"^(?:\"+s.source+\")\",g),h=void 0===o?ec:o>>>0;if(0===h)return[];if(0===c.length)return null===qa(y,c)?[c]:[];for(var f=0,m=0,x=[];m<c.length;){y.lastIndex=tc?m:0;var b=qa(y,tc?c:c.slice(m)),v;if(null===b||(v=gn(wr(y.lastIndex+(tc?0:m)),c.length))===f)m=Xa(c,m,d);else{if(x.push(c.slice(f,m)),x.length===h)return x;for(var S=1;S<=b.length-1;S++)if(x.push(b[S]),x.length===h)return x;m=f=v}}return x.push(c.slice(f)),x}]},!tc);var nc=\"undefined\"==typeof global?\"undefined\"==typeof self?\"undefined\"==typeof window?{}:window:self:global,rc=R,ac=I;\"function\"==typeof nc.setTimeout&&(rc=setTimeout),\"function\"==typeof nc.clearTimeout&&(ac=clearTimeout);var oc=[],ic=!1,lc=-1,sc;z.prototype.run=function(){this.fun.apply(null,this.array)};for(var cc={},uc=[],dc={},gc={},pc={},yc=nc.performance||{},hc=yc.now||yc.mozNow||yc.msNow||yc.oNow||yc.webkitNow||function(){return new Date().getTime()},fc=new Date,mc={nextTick:_,title:\"browser\",browser:!0,env:cc,argv:uc,version:\"\",versions:dc,on:F,addListener:F,once:F,off:F,removeListener:F,removeAllListeners:F,emit:F,binding:G,cwd:H,chdir:U,umask:Y,hrtime:$,platform:\"browser\",release:gc,config:pc,uptime:W},xc=t(function(e){(function(){var t,n,r,a,o,i;\"undefined\"!=typeof performance&&null!==performance&&performance.now?e.exports=function(){return performance.now()}:\"undefined\"!=typeof mc&&null!==mc&&mc.hrtime?(e.exports=function(){return(t()-o)/1e6},n=mc.hrtime,t=function(){var e;return e=n(),1e9*e[0]+e[1]},a=t(),i=1e9*mc.uptime(),o=a-i):Date.now?(e.exports=function(){return Date.now()-r},r=Date.now()):(e.exports=function(){return new Date().getTime()-r},r=new Date().getTime())}).call(bn)}),bc=\"undefined\"==typeof window?bn:window,vc=[\"moz\",\"webkit\"],Sc=\"AnimationFrame\",kc=bc[\"request\"+Sc],Ac=bc[\"cancel\"+Sc]||bc[\"cancelRequest\"+Sc],Pc=0;!kc&&Pc<vc.length;Pc++)kc=bc[vc[Pc]+\"Request\"+Sc],Ac=bc[vc[Pc]+\"Cancel\"+Sc]||bc[vc[Pc]+\"CancelRequest\"+Sc];if(!kc||!Ac){var Ec=0,Tc=0,Cc=[];kc=function(e){if(0===Cc.length){var t=xc(),n=dn(0,1e3/60-(t-Ec));Ec=n+t,setTimeout(function(){var e=Cc.slice(0);Cc.length=0;for(var t=0;t<e.length;t++)if(!e[t].cancelled)try{e[t].callback(Ec)}catch(t){setTimeout(function(){throw t},0)}},cn(n))}return Cc.push({handle:++Tc,callback:e,cancelled:!1}),Tc},Ac=function(e){for(var t=0;t<Cc.length;t++)Cc[t].handle===e&&(Cc[t].cancelled=!0)}}var wc=function(e){return kc.call(bc,e)},Oc=function(){Ac.apply(bc,arguments)},Vc=function(e){e||(e=bc),e.requestAnimationFrame=kc,e.cancelAnimationFrame=Ac};wc.cancel=Oc,wc.polyfill=Vc;var Lc=qn.f,Rc=Function.prototype,Ic=Rc.toString,Dc=\"name\";An&&!(Dc in Rc)&&Lc(Rc,Dc,{configurable:!0,get:function(){try{return Ic.call(this).match(/^\\s*function ([^ (]*)/)[1]}catch(e){return\"\"}}});var Nc=function(e){this.ok=!1,this.alpha=1,\"#\"==e.charAt(0)&&(e=e.substr(1,6)),e=e.replace(/ /g,\"\"),e=e.toLowerCase();var t={aliceblue:\"f0f8ff\",antiquewhite:\"faebd7\",aqua:\"00ffff\",aquamarine:\"7fffd4\",azure:\"f0ffff\",beige:\"f5f5dc\",bisque:\"ffe4c4\",black:\"000000\",blanchedalmond:\"ffebcd\",blue:\"0000ff\",blueviolet:\"8a2be2\",brown:\"a52a2a\",burlywood:\"deb887\",cadetblue:\"5f9ea0\",chartreuse:\"7fff00\",chocolate:\"d2691e\",coral:\"ff7f50\",cornflowerblue:\"6495ed\",cornsilk:\"fff8dc\",crimson:\"dc143c\",cyan:\"00ffff\",darkblue:\"00008b\",darkcyan:\"008b8b\",darkgoldenrod:\"b8860b\",darkgray:\"a9a9a9\",darkgreen:\"006400\",darkkhaki:\"bdb76b\",darkmagenta:\"8b008b\",darkolivegreen:\"556b2f\",darkorange:\"ff8c00\",darkorchid:\"9932cc\",darkred:\"8b0000\",darksalmon:\"e9967a\",darkseagreen:\"8fbc8f\",darkslateblue:\"483d8b\",darkslategray:\"2f4f4f\",darkturquoise:\"00ced1\",darkviolet:\"9400d3\",deeppink:\"ff1493\",deepskyblue:\"00bfff\",dimgray:\"696969\",dodgerblue:\"1e90ff\",feldspar:\"d19275\",firebrick:\"b22222\",floralwhite:\"fffaf0\",forestgreen:\"228b22\",fuchsia:\"ff00ff\",gainsboro:\"dcdcdc\",ghostwhite:\"f8f8ff\",gold:\"ffd700\",goldenrod:\"daa520\",gray:\"808080\",green:\"008000\",greenyellow:\"adff2f\",honeydew:\"f0fff0\",hotpink:\"ff69b4\",indianred:\"cd5c5c\",indigo:\"4b0082\",ivory:\"fffff0\",khaki:\"f0e68c\",lavender:\"e6e6fa\",lavenderblush:\"fff0f5\",lawngreen:\"7cfc00\",lemonchiffon:\"fffacd\",lightblue:\"add8e6\",lightcoral:\"f08080\",lightcyan:\"e0ffff\",lightgoldenrodyellow:\"fafad2\",lightgrey:\"d3d3d3\",lightgreen:\"90ee90\",lightpink:\"ffb6c1\",lightsalmon:\"ffa07a\",lightseagreen:\"20b2aa\",lightskyblue:\"87cefa\",lightslateblue:\"8470ff\",lightslategray:\"778899\",lightsteelblue:\"b0c4de\",lightyellow:\"ffffe0\",lime:\"00ff00\",limegreen:\"32cd32\",linen:\"faf0e6\",magenta:\"ff00ff\",maroon:\"800000\",mediumaquamarine:\"66cdaa\",mediumblue:\"0000cd\",mediumorchid:\"ba55d3\",mediumpurple:\"9370d8\",mediumseagreen:\"3cb371\",mediumslateblue:\"7b68ee\",mediumspringgreen:\"00fa9a\",mediumturquoise:\"48d1cc\",mediumvioletred:\"c71585\",midnightblue:\"191970\",mintcream:\"f5fffa\",mistyrose:\"ffe4e1\",moccasin:\"ffe4b5\",navajowhite:\"ffdead\",navy:\"000080\",oldlace:\"fdf5e6\",olive:\"808000\",olivedrab:\"6b8e23\",orange:\"ffa500\",orangered:\"ff4500\",orchid:\"da70d6\",palegoldenrod:\"eee8aa\",palegreen:\"98fb98\",paleturquoise:\"afeeee\",palevioletred:\"d87093\",papayawhip:\"ffefd5\",peachpuff:\"ffdab9\",peru:\"cd853f\",pink:\"ffc0cb\",plum:\"dda0dd\",powderblue:\"b0e0e6\",purple:\"800080\",rebeccapurple:\"663399\",red:\"ff0000\",rosybrown:\"bc8f8f\",royalblue:\"4169e1\",saddlebrown:\"8b4513\",salmon:\"fa8072\",sandybrown:\"f4a460\",seagreen:\"2e8b57\",seashell:\"fff5ee\",sienna:\"a0522d\",silver:\"c0c0c0\",skyblue:\"87ceeb\",slateblue:\"6a5acd\",slategray:\"708090\",snow:\"fffafa\",springgreen:\"00ff7f\",steelblue:\"4682b4\",tan:\"d2b48c\",teal:\"008080\",thistle:\"d8bfd8\",tomato:\"ff6347\",turquoise:\"40e0d0\",violet:\"ee82ee\",violetred:\"d02090\",wheat:\"f5deb3\",white:\"ffffff\",whitesmoke:\"f5f5f5\",yellow:\"ffff00\",yellowgreen:\"9acd32\"};e=t[e]||e;for(var n=[{re:/^rgba\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3}),\\s*((?:\\d?\\.)?\\d)\\)$/,example:[\"rgba(123, 234, 45, 0.8)\",\"rgba(255,234,245,1.0)\"],process:function(e){return[parseInt(e[1]),parseInt(e[2]),parseInt(e[3]),parseFloat(e[4])]}},{re:/^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,example:[\"rgb(123, 234, 45)\",\"rgb(255,234,245)\"],process:function(e){return[parseInt(e[1]),parseInt(e[2]),parseInt(e[3])]}},{re:/^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,example:[\"#00ff00\",\"336699\"],process:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,example:[\"#fb0\",\"f0f\"],process:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}}],r=0;r<n.length;r++){var a=n[r].re,o=n[r].process,l=a.exec(e);if(l){var s=o(l);this.r=s[0],this.g=s[1],this.b=s[2],3<s.length&&(this.alpha=s[3]),this.ok=!0}}this.r=0>this.r||isNaN(this.r)?0:255<this.r?255:this.r,this.g=0>this.g||isNaN(this.g)?0:255<this.g?255:this.g,this.b=0>this.b||isNaN(this.b)?0:255<this.b?255:this.b,this.alpha=0>this.alpha?0:1<this.alpha||isNaN(this.alpha)?1:this.alpha,this.toRGB=function(){return\"rgb(\"+this.r+\", \"+this.g+\", \"+this.b+\")\"},this.toRGBA=function(){return\"rgba(\"+this.r+\", \"+this.g+\", \"+this.b+\", \"+this.alpha+\")\"},this.toHex=function(){var e=this.r.toString(16),t=this.g.toString(16),n=this.b.toString(16);return 1==e.length&&(e=\"0\"+e),1==t.length&&(t=\"0\"+t),1==n.length&&(n=\"0\"+n),\"#\"+e+t+n},this.getHelpXML=function(){for(var e=[],r=0,a;r<n.length;r++){a=n[r].example;for(var o=0;o<a.length;o++)e[e.length]=a[o]}for(var l in t)e[e.length]=l;var s=document.createElement(\"ul\");s.setAttribute(\"id\",\"rgbcolor-examples\");for(var r=0;r<e.length;r++)try{var c=document.createElement(\"li\"),u=new RGBColor(e[r]),d=document.createElement(\"div\");d.style.cssText=\"margin: 3px; border: 1px solid black; background:\"+u.toHex()+\"; color:\"+u.toHex(),d.appendChild(document.createTextNode(\"test\"));var g=document.createTextNode(\" \"+e[r]+\" -> \"+u.toRGB()+\" -> \"+u.toHex());c.appendChild(d),c.appendChild(g),s.appendChild(c)}catch(t){}return s}},Mc=function(){function e(t,n,r){Fi(this,e),this.document=t,this.name=n,this.value=r}return ji(e,[{key:\"hasValue\",value:function(){var e=this.value;return null!==e&&\"\"!==e&&0!==e&&\"undefined\"!=typeof e}},{key:\"isString\",value:function(e){var t=this.value,n=\"string\"==typeof t;return n&&e?e.test(t):n}},{key:\"isUrlDefinition\",value:function(){return this.isString(/^url\\(/)}},{key:\"isPixels\",value:function(){if(!this.hasValue())return!1;var e=this.getString();switch(!0){case /px$/.test(e):case /^[0-9]+$/.test(e):return!0;default:return!1;}}},{key:\"setValue\",value:function(e){return this.value=e,this}},{key:\"getValue\",value:function(e){return\"undefined\"==typeof e||this.hasValue()?this.value:e}},{key:\"getNumber\",value:function(e){if(!this.hasValue())return\"undefined\"==typeof e?0:parseFloat(e);var t=this.value,r=parseFloat(t);return this.isString(/%$/)&&(r/=100),r}},{key:\"getString\",value:function(e){return\"undefined\"==typeof e||this.hasValue()?\"undefined\"==typeof this.value?\"\":this.value+\"\":e+\"\"}},{key:\"getDpi\",value:function(){return 96}},{key:\"getRem\",value:function(){return this.document.rootEmSize}},{key:\"getEm\",value:function(){return this.document.emSize}},{key:\"getUnits\",value:function(){return this.getString().replace(/[0-9\\.\\-]/g,\"\")}},{key:\"getPixels\",value:function(e){var t=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1];if(!this.hasValue())return 0;var r=\"boolean\"==typeof e?[void 0,e]:[e],a=lo(r,2),o=a[0],i=a[1],l=this.document.screen.viewPort;switch(!0){case this.isString(/vmin$/):return this.getNumber()/100*gn(l.computeSize(\"x\"),l.computeSize(\"y\"));case this.isString(/vmax$/):return this.getNumber()/100*dn(l.computeSize(\"x\"),l.computeSize(\"y\"));case this.isString(/vw$/):return this.getNumber()/100*l.computeSize(\"x\");case this.isString(/vh$/):return this.getNumber()/100*l.computeSize(\"y\");case this.isString(/rem$/):return this.getNumber()*this.getRem();case this.isString(/em$/):return this.getNumber()*this.getEm();case this.isString(/ex$/):return this.getNumber()*this.getEm()/2;case this.isString(/px$/):return this.getNumber();case this.isString(/pt$/):return this.getNumber()*this.getDpi()*(1/72);case this.isString(/pc$/):return 15*this.getNumber();case this.isString(/cm$/):return this.getNumber()*this.getDpi()/2.54;case this.isString(/mm$/):return this.getNumber()*this.getDpi()/25.4;case this.isString(/in$/):return this.getNumber()*this.getDpi();case this.isString(/%$/)&&i:return this.getNumber()*this.getEm();case this.isString(/%$/):return this.getNumber()*l.computeSize(o);default:{var s=this.getNumber();return t&&1>s?s*l.computeSize(o):s}}}},{key:\"getMilliseconds\",value:function(){return this.hasValue()?this.isString(/ms$/)?this.getNumber():1e3*this.getNumber():0}},{key:\"getRadians\",value:function(){if(!this.hasValue())return 0;switch(!0){case this.isString(/deg$/):return this.getNumber()*(sn/180);case this.isString(/grad$/):return this.getNumber()*(sn/200);case this.isString(/rad$/):return this.getNumber();default:return this.getNumber()*(sn/180);}}},{key:\"getDefinition\",value:function(){var e=this.getString(),t=e.match(/#([^\\)'\"]+)/);return t&&(t=t[1]),t||(t=e),this.document.definitions[t]}},{key:\"getFillStyleDefinition\",value:function(e,t){var n=this.getDefinition();if(!n)return null;if(\"function\"==typeof n.createGradient)return n.createGradient(this.document.ctx,e,t);if(\"function\"==typeof n.createPattern){if(n.getHrefAttribute().hasValue()){var r=n.getAttribute(\"patternTransform\");n=n.getHrefAttribute().getDefinition(),r.hasValue()&&n.getAttribute(\"patternTransform\",!0).setValue(r.value)}return n.createPattern(this.document.ctx,e,t)}return null}},{key:\"getTextBaseline\",value:function(){return this.hasValue()?e.textBaselineMapping[this.getString()]:null}},{key:\"addOpacity\",value:function(t){for(var n=this.value,r=n.length,a=0,o=0;o<r&&(\",\"===n[o]&&a++,3!==a);o++);if(t.hasValue()&&this.isString()&&3!==a){var l=new Nc(n);l.ok&&(n=\"rgba(\".concat(l.r,\", \").concat(l.g,\", \").concat(l.b,\", \").concat(t.getNumber(),\")\"))}return new e(this.document,this.name,n)}}],[{key:\"empty\",value:function(t){return new e(t,\"EMPTY\",\"\")}}]),e}();Mc.textBaselineMapping={baseline:\"alphabetic\",\"before-edge\":\"top\",\"text-before-edge\":\"top\",middle:\"middle\",central:\"middle\",\"after-edge\":\"bottom\",\"text-after-edge\":\"bottom\",ideographic:\"ideographic\",alphabetic:\"alphabetic\",hanging:\"hanging\",mathematical:\"alphabetic\"};var Bc=function(){function e(){Fi(this,e),this.viewPorts=[]}return ji(e,[{key:\"clear\",value:function(){this.viewPorts=[]}},{key:\"setCurrent\",value:function(e,t){this.viewPorts.push({width:e,height:t})}},{key:\"removeCurrent\",value:function(){this.viewPorts.pop()}},{key:\"getCurrent\",value:function(){var e=this.viewPorts;return e[e.length-1]}},{key:\"computeSize\",value:function(e){return\"number\"==typeof e?e:\"x\"===e?this.width:\"y\"===e?this.height:mn(xn(this.width,2)+xn(this.height,2))/mn(2)}},{key:\"width\",get:function(){return this.getCurrent().width}},{key:\"height\",get:function(){return this.getCurrent().height}}]),e}(),_c=function(){function e(t,n){Fi(this,e),this.x=t,this.y=n}return ji(e,[{key:\"angleTo\",value:function(e){return ln(e.y-this.y,e.x-this.x)}},{key:\"applyTransform\",value:function(e){var t=this.x,n=this.y,r=t*e[0]+n*e[2]+e[4],a=t*e[1]+n*e[3]+e[5];this.x=r,this.y=a}}],[{key:\"parse\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0,r=l(t),a=lo(r,2),o=a[0],i=void 0===o?n:o,s=a[1],c=void 0===s?i:s;return new e(i,c)}},{key:\"parsePath\",value:function(t){for(var n=l(t),r=n.length,a=[],o=0;o<r;o+=2)a.push(new e(n[o],n[o+1]));return a}}]),e}(),zc=function(){function e(t){Fi(this,e),this.screen=t,this.working=!1,this.events=[],this.eventElements=[],this.onClick=this.onClick.bind(this),this.onMouseMove=this.onMouseMove.bind(this)}return ji(e,[{key:\"isWorking\",value:function(){return this.working}},{key:\"start\",value:function(){if(!this.working){var e=this.screen,t=this.onClick,n=this.onMouseMove,r=e.ctx.canvas;r.onclick=t,r.onmousemove=n,this.working=!0}}},{key:\"stop\",value:function(){if(this.working){var e=this.screen.ctx.canvas;this.working=!1,e.onclick=null,e.onmousemove=null}}},{key:\"hasEvents\",value:function(){return this.working&&0<this.events.length}},{key:\"runEvents\",value:function(){if(this.working){var e=this.screen,t=this.events,n=this.eventElements,r=e.ctx.canvas.style;r&&(r.cursor=\"\"),t.forEach(function(e,t){for(var r=e.run,a=n[t];a;)r(a),a=a.parent}),this.events=[],this.eventElements=[]}}},{key:\"checkPath\",value:function(e,t){if(this.working&&t){var n=this.events,r=this.eventElements;n.forEach(function(n,a){var o=n.x,i=n.y;!r[a]&&t.isPointInPath&&t.isPointInPath(o,i)&&(r[a]=e)})}}},{key:\"checkBoundingBox\",value:function(e,t){if(this.working&&t){var n=this.events,r=this.eventElements;n.forEach(function(n,a){var o=n.x,i=n.y;!r[a]&&t.isPointInBox(o,i)&&(r[a]=e)})}}},{key:\"mapXY\",value:function(e,t){for(var n=this.screen,r=n.window,a=n.ctx,o=new _c(e,t),i=a.canvas;i;)o.x-=i.offsetLeft,o.y-=i.offsetTop,i=i.offsetParent;return r.scrollX&&(o.x+=r.scrollX),r.scrollY&&(o.y+=r.scrollY),o}},{key:\"onClick\",value:function(e){var t=this.mapXY((e||event).clientX,(e||event).clientY),n=t.x,r=t.y;this.events.push({type:\"onclick\",x:n,y:r,run:function(e){e.onClick&&e.onClick()}})}},{key:\"onMouseMove\",value:function(e){var t=this.mapXY((e||event).clientX,(e||event).clientY),n=t.x,r=t.y;this.events.push({type:\"onmousemove\",x:n,y:r,run:function(e){e.onMouseMove&&e.onMouseMove()}})}}]),e}(),Fc=\"undefined\"==typeof window?null:window,jc=\"undefined\"==typeof fetch?null:fetch.bind(window),Gc=function(){function e(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=n.fetch,a=void 0===r?jc:r,o=n.window,i=void 0===o?Fc:o;Fi(this,e),this.ctx=t,this.FRAMERATE=30,this.MAX_VIRTUAL_PIXELS=3e4,this.CLIENT_WIDTH=800,this.CLIENT_HEIGHT=600,this.viewPort=new Bc,this.mouse=new zc(this),this.animations=[],this.waits=[],this.frameDuration=0,this.isReadyLock=!1,this.isFirstRender=!0,this.intervalId=null,this.window=i,this.fetch=a}return ji(e,[{key:\"wait\",value:function(e){this.waits.push(e)}},{key:\"ready\",value:function(){return this.readyPromise?this.readyPromise:Promise.resolve()}},{key:\"isReady\",value:function(){if(this.isReadyLock)return!0;var e=this.waits.every(function(e){return e()});return e&&(this.waits=[],this.resolveReady&&this.resolveReady()),this.isReadyLock=e,e}},{key:\"setDefaults\",value:function(e){e.strokeStyle=\"rgba(0,0,0,0)\",e.lineCap=\"butt\",e.lineJoin=\"miter\",e.miterLimit=4}},{key:\"setViewBox\",value:function(e){var t=e.document,n=e.ctx,a=e.aspectRatio,o=e.width,i=e.desiredWidth,l=e.height,s=e.desiredHeight,c=e.minX,u=void 0===c?0:c,d=e.minY,g=void 0===d?0:d,p=e.refX,y=e.refY,h=e.clip,f=e.clipX,m=void 0===f?0:f,x=e.clipY,b=void 0===x?0:x,v=r(a).replace(/^defer\\s/,\"\"),S=v.split(\" \"),k=lo(S,2),A=k[0],P=k[1],E=A||\"xMidYMid\",T=P||\"meet\",C=o/i,w=l/s,O=gn(C,w),V=dn(C,w),L=i,R=s;\"meet\"===T&&(L*=O,R*=O),\"slice\"===T&&(L*=V,R*=V);var I=new Mc(t,\"refX\",p),D=new Mc(t,\"refY\",y),N=I.hasValue()&&D.hasValue();if(N&&n.translate(-O*I.getPixels(\"x\"),-O*D.getPixels(\"y\")),void 0!==h&&h){var M=O*m,B=O*b;n.beginPath(),n.moveTo(M,B),n.lineTo(o,B),n.lineTo(o,l),n.lineTo(M,l),n.closePath(),n.clip()}if(!N){var _=\"meet\"===T&&O===w,z=\"slice\"===T&&V===w,F=\"meet\"===T&&O===C,j=\"slice\"===T&&V===C;/^xMid/.test(E)&&(_||z)&&n.translate(o/2-L/2,0),/YMid$/.test(E)&&(F||j)&&n.translate(0,l/2-R/2),/^xMax/.test(E)&&(_||z)&&n.translate(o-L,0),/YMax$/.test(E)&&(F||j)&&n.translate(0,l-R)}switch(!0){case\"none\"===E:n.scale(C,w);break;case\"meet\"===T:n.scale(O,O);break;case\"slice\"===T:n.scale(V,V);}n.translate(-u,-g)}},{key:\"start\",value:function(e){var t=this,n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=n.enableRedraw,a=n.ignoreMouse,o=n.ignoreAnimation,i=n.ignoreDimensions,l=void 0!==i&&i,s=n.ignoreClear,c=void 0!==s&&s,u=n.forceRedraw,d=n.scaleWidth,g=n.scaleHeight,p=n.offsetX,y=n.offsetY,h=this.FRAMERATE,f=this.mouse,m=1e3/h;if(this.frameDuration=m,this.readyPromise=new Promise(function(e){t.resolveReady=e}),this.isReady()&&this.render(e,l,c,d,g,p,y),!!(void 0!==r&&r)){var x=Date.now(),b=x,v=0,S=function n(){x=Date.now(),v=x-b,v>=m&&(b=x-v%m,t.shouldUpdate(void 0!==o&&o,u)&&(t.render(e,l,c,d,g,p,y),f.runEvents())),t.intervalId=wc(n)};void 0!==a&&a||f.start(),this.intervalId=wc(S)}}},{key:\"stop\",value:function(){this.intervalId&&(wc.cancel(this.intervalId),this.intervalId=null),this.mouse.stop()}},{key:\"shouldUpdate\",value:function e(t,n){if(!t){var r=this.frameDuration,e=this.animations.reduce(function(e,t){return t.update(r)||e},!1);if(e)return!0}return!!(\"function\"==typeof n&&n())||!this.isReadyLock&&this.isReady()||!!this.mouse.hasEvents()}},{key:\"render\",value:function(e,t,n,r,a,o,i){var s=this.CLIENT_WIDTH,c=this.CLIENT_HEIGHT,u=this.viewPort,d=this.ctx,g=this.isFirstRender,p=d.canvas;u.clear(),p.width&&p.height?u.setCurrent(p.width,p.height):u.setCurrent(s,c);var y=e.getStyle(\"width\"),h=e.getStyle(\"height\");!t&&(g||\"number\"!=typeof r&&\"number\"!=typeof a)&&(y.hasValue()&&(p.width=y.getPixels(\"x\"),p.style&&(p.style.width=\"\".concat(p.width,\"px\"))),h.hasValue()&&(p.height=h.getPixels(\"y\"),p.style&&(p.style.height=\"\".concat(p.height,\"px\"))));var f=p.clientWidth||p.width,m=p.clientHeight||p.height;if(t&&y.hasValue()&&h.hasValue()&&(f=y.getPixels(\"x\"),m=h.getPixels(\"y\")),u.setCurrent(f,m),\"number\"==typeof o&&e.getAttribute(\"x\",!0).setValue(o),\"number\"==typeof i&&e.getAttribute(\"y\",!0).setValue(i),\"number\"==typeof r||\"number\"==typeof a){var x=l(e.getAttribute(\"viewBox\").getString()),b=0,v=0;if(\"number\"==typeof r){var S=e.getAttribute(\"width\");S.hasValue()?b=S.getPixels(\"x\")/r:!isNaN(x[2])&&(b=x[2]/r)}if(\"number\"==typeof a){var k=e.getAttribute(\"height\");k.hasValue()?v=k.getPixels(\"y\")/a:!isNaN(x[3])&&(v=x[3]/a)}b||(b=v),v||(v=b),e.getAttribute(\"width\",!0).setValue(r),e.getAttribute(\"height\",!0).setValue(a);var A=e.getStyle(\"transform\",!0,!0);A.setValue(\"\".concat(A.getString(),\" scale(\").concat(1/b,\", \").concat(1/v,\")\"))}n||d.clearRect(0,0,f,m),e.render(d),g&&(this.isFirstRender=!1)}}]),e}();Gc.defaultWindow=Fc,Gc.defaultFetch=jc;var Hc=Gc.defaultFetch,Uc=\"undefined\"==typeof DOMParser?null:DOMParser,Yc=function(){function e(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},n=t.fetch,r=void 0===n?Hc:n,a=t.DOMParser,o=void 0===a?Uc:a;Fi(this,e),this.fetch=r,this.DOMParser=o}return ji(e,[{key:\"parse\",value:function(){var e=_i(Mi.mark(function e(t){return Mi.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!/^</.test(t)){e.next=2;break}return e.abrupt(\"return\",this.parseFromString(t));case 2:return e.abrupt(\"return\",this.load(t));case 3:case\"end\":return e.stop();}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:\"parseFromString\",value:function(e){try{var t=new this.DOMParser;return t.parseFromString(e,\"image/svg+xml\")}catch(t){var n=new this.DOMParser;return n.parseFromString(e,\"text/xml\")}}},{key:\"load\",value:function(){var e=_i(Mi.mark(function e(t){var n,r;return Mi.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.fetch(t);case 2:return n=e.sent,e.next=5,n.text();case 5:return r=e.sent,e.abrupt(\"return\",this.parseFromString(r));case 7:case\"end\":return e.stop();}},e,this)}));return function(){return e.apply(this,arguments)}}()}]),e}(),$c=[].slice,Wc={},Xc=function(e,t,n){if(!(t in Wc)){for(var r=[],a=0;a<t;a++)r[a]=\"a[\"+a+\"]\";Wc[t]=Function(\"C,a\",\"return new C(\"+r.join(\",\")+\")\")}return Wc[t](e,n)},qc=Function.bind||function(e){var t=Qr(this),n=$c.call(arguments,1),r=function(){var a=n.concat($c.call(arguments));return this instanceof r?Xc(t,a.length,a):t.apply(e,a)};return Nn(t.prototype)&&(r.prototype=t.prototype),r},Qc=Tr(\"Reflect\",\"construct\"),Kc=kn(function(){function e(){}return!(Qc(function(){},[],e)instanceof e)}),Zc=!kn(function(){Qc(function(){})}),Jc=Kc||Zc;qr({target:\"Reflect\",stat:!0,forced:Jc,sham:Jc},{construct:function(e,t){Qr(e),$n(t);var n=3>arguments.length?e:Qr(arguments[2]);if(Zc&&!Kc)return Qc(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3]);}var r=[null];return r.push.apply(r,t),new(qc.apply(e,r))}var a=n.prototype,o=Lo(Nn(a)?a:Object.prototype),i=Function.apply.call(e,o,t);return Nn(i)?i:o}});var eu=RegExp.prototype,tu=eu.toString,nu=kn(function(){return\"/a/b\"!=tu.call({source:\"a\",flags:\"b\"})}),ru=\"toString\"!=tu.name;(nu||ru)&&Ar(RegExp.prototype,\"toString\",function(){var e=$n(this),t=e.source+\"\",n=e.flags,r=(void 0===n&&e instanceof RegExp&&!(\"flags\"in eu)?Ca.call(e):n)+\"\";return\"/\"+t+\"/\"+r},{unsafe:!0});var au=t(function(e){function t(n,r){return e.exports=t=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},t(n,r)}e.exports=t}),ou=function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&au(e,t)},iu=t(function(e){function t(n){\"@babel/helpers - typeof\";return e.exports=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?t=function(e){return typeof e}:t=function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},t(n)}e.exports=t}),lu=function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e},su=function(e,t){return t&&(\"object\"===iu(t)||\"function\"==typeof t)?t:lu(e)},cu=t(function(e){function t(n){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},t(n)}e.exports=t}),uu=!Cl(function(e){Array.from(e)});qr({target:\"Array\",stat:!0,forced:uu},{from:function(e){var t=Zr(e),n=\"function\"==typeof this?this:Array,r=arguments.length,a=1<r?arguments[1]:void 0,o=void 0!==a,i=vl(t),l=0,s,c,u,d,g,p;if(o&&(a=Kr(a,2<r?arguments[2]:void 0,2)),null!=i&&!(n==Array&&xl(i)))for(d=i.call(t),g=d.next,c=new n;!(u=g.call(d)).done;l++)p=o?Sl(d,a,[u.value,l],!0):u.value,Oi(c,l,p);else for(s=wr(t.length),c=new n(s);s>l;l++)p=o?a(t[l],l):t[l],Oi(c,l,p);return c.length=l,c}});var du=oa(\"unscopables\"),gu=Array.prototype;null==gu[du]&&qn.f(gu,du,{configurable:!0,value:Lo(null)});var pu=function(e){gu[du][e]=!0},yu=Lr.includes,hu=Aa(\"indexOf\",{ACCESSORS:!0,1:0});qr({target:\"Array\",proto:!0,forced:!hu},{includes:function(e){return yu(this,e,1<arguments.length?arguments[1]:void 0)}}),pu(\"includes\");var fu=ua.some,mu=Za(\"some\"),xu=Aa(\"some\");qr({target:\"Array\",proto:!0,forced:!mu||!xu},{some:function(e){return fu(this,e,1<arguments.length?arguments[1]:void 0)}});var bu=function(e){if(Zs(e))throw TypeError(\"The method doesn't accept regular expressions\");return e},vu=oa(\"match\");qr({target:\"String\",proto:!0,forced:!function(e){var t=/./;try{\"/./\"[e](t)}catch(n){try{return t[vu]=!1,\"/./\"[e](t)}catch(e){}}return!1}(\"includes\")},{includes:function(e){return!!~(In(this)+\"\").indexOf(bu(e),1<arguments.length?arguments[1]:void 0)}});var Su=!kn(function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}),ku=ur(\"IE_PROTO\"),Au=Object.prototype,Pu=Su?Object.getPrototypeOf:function(e){return e=Zr(e),_n(e,ku)?e[ku]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Au:null},Eu=oa(\"iterator\"),Tu=!1,Cu,wu,Ou;[].keys&&(Ou=[].keys(),\"next\"in Ou?(wu=Pu(Pu(Ou)),wu!==Object.prototype&&(Cu=wu)):Tu=!0),null==Cu&&(Cu={}),_n(Cu,Eu)||Qn(Cu,Eu,function(){return this});var Vu={IteratorPrototype:Cu,BUGGY_SAFARI_ITERATORS:Tu},Lu=Vu.IteratorPrototype,Ru=function(){return this},Iu=function(e,t,n){var r=t+\" Iterator\";return e.prototype=Lo(Lu,{next:wn(1,n)}),Go(e,r,!1),hl[r]=Ru,e},Du=function(e){if(!Nn(e)&&null!==e)throw TypeError(\"Can't set \"+(e+\" as a prototype\"));return e},Nu=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var e=!1,t={},n;try{n=Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set,n.call(t,[]),e=t instanceof Array}catch(e){}return function(t,r){return $n(t),Du(r),e?n.call(t,r):t.__proto__=r,t}}():void 0),Mu=Vu.IteratorPrototype,Bu=Vu.BUGGY_SAFARI_ITERATORS,_u=oa(\"iterator\"),zu=\"keys\",Fu=\"values\",ju=\"entries\",Gu=function(){return this},Hu=function(e,t,n,r,a,o,i){Iu(n,t,r);var l=function(e){return e===a&&d?d:!Bu&&e in c?c[e]:e===zu?function(){return new n(this,e)}:e===Fu?function(){return new n(this,e)}:e===ju?function(){return new n(this,e)}:function(){return new n(this)}},s=!1,c=e.prototype,u=c[_u]||c[\"@@iterator\"]||a&&c[a],d=!Bu&&u||l(a),g=\"Array\"==t?c.entries||u:u,p,y,h;if(g&&(p=Pu(g.call(new e)),Mu!==Object.prototype&&p.next&&(Pu(p)!==Mu&&(Nu?Nu(p,Mu):\"function\"!=typeof p[_u]&&Qn(p,_u,Gu)),Go(p,t+\" Iterator\",!0))),a==Fu&&u&&u.name!==Fu&&(s=!0,d=function(){return u.call(this)}),c[_u]!==d&&Qn(c,_u,d),hl[t]=d,a)if(y={values:l(Fu),keys:o?d:l(zu),entries:l(ju)},i)for(h in y)(Bu||s||!(h in c))&&Ar(c,h,y[h]);else qr({target:t,proto:!0,forced:Bu||s},y);return y},Uu=$a.charAt,Yu=\"String Iterator\",$u=kr.set,Wu=kr.getterFor(Yu);Hu(String,\"String\",function(e){$u(this,{type:Yu,string:e+\"\",index:0})},function(){var e=Wu(this),t=e.string,n=e.index,r;return n>=t.length?{value:void 0,done:!0}:(r=Uu(t,n),e.index+=r.length,{value:r,done:!1})});var Xu=\"[\\t\\n\\x0B\\f\\r \\xA0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF]\",qu=RegExp(\"^\"+Xu+Xu+\"*\"),Qu=RegExp(Xu+Xu+\"*$\"),Ku=function(e){return function(t){var n=In(t)+\"\";return 1&e&&(n=n.replace(qu,\"\")),2&e&&(n=n.replace(Qu,\"\")),n}},Zu={start:Ku(1),end:Ku(2),trim:Ku(3)},Ju=\"\\u200B\\x85\\u180E\",ed=Zu.trim;qr({target:\"String\",proto:!0,forced:function(e){return kn(function(){return!!\"\\t\\n\\x0B\\f\\r \\xA0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF\"[e]()||Ju[e]()!=Ju||\"\\t\\n\\x0B\\f\\r \\xA0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF\"[e].name!==e})}(\"trim\")},{trim:function(){return ed(this)}});var td=function(){function e(t,n){var r=this,a=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2];if(Fi(this,e),this.document=t,this.node=n,this.captureTextNodes=a,this.attributes={},this.styles={},this.stylesSpecificity={},this.animationFrozen=!1,this.animationFrozenValue=\"\",this.parent=null,this.children=[],n&&1===n.nodeType){if(Array.from(n.attributes).forEach(function(e){var n=s(e.nodeName);r.attributes[n]=new Mc(t,n,e.value)}),this.addStylesFromStyleDefinition(),this.getAttribute(\"style\").hasValue()){var o=this.getAttribute(\"style\").getString().split(\";\").map(function(e){return e.trim()});o.forEach(function(e){if(e){var n=e.split(\":\"),a=lo(n,2),o=a[0],i=a[1];r.styles[o]=new Mc(t,o.trim(),i.trim())}})}var i=t.definitions,l=this.getAttribute(\"id\");l.hasValue()&&!i[l.getValue()]&&(i[l.getValue()]=this),Array.from(n.childNodes).forEach(function(e){if(1===e.nodeType)r.addChild(e);else if(a&&(3===e.nodeType||4===e.nodeType)){var n=t.createTextNode(e);0<n.getText().length&&r.addChild(n)}})}}return ji(e,[{key:\"getAttribute\",value:function(e){var t=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],n=this.attributes[e];if(!n&&t){var r=new Mc(this.document,e,\"\");return this.attributes[e]=r,r}return n||Mc.empty(this.document)}},{key:\"getHrefAttribute\",value:function(){for(var e in this.attributes)if(\"href\"==e||/:href$/.test(e))return this.attributes[e];return Mc.empty(this.document)}},{key:\"getStyle\",value:function(e){var t=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],n=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],r=this.styles[e];if(r)return r;var a=this.getAttribute(e);if(a&&a.hasValue())return this.styles[e]=a,a;if(!n){var o=this.parent;if(o){var i=o.getStyle(e);if(i&&i.hasValue())return i}}if(t){var l=new Mc(this.document,e,\"\");return this.styles[e]=l,l}return r||Mc.empty(this.document)}},{key:\"render\",value:function(e){if(\"none\"!==this.getStyle(\"display\").getString()&&\"hidden\"!==this.getStyle(\"visibility\").getString()){if(e.save(),this.getStyle(\"mask\").hasValue()){var t=this.getStyle(\"mask\").getDefinition();t&&t.apply(e,this)}else if(\"none\"!==this.getStyle(\"filter\").getValue(\"none\")){var n=this.getStyle(\"filter\").getDefinition();n&&n.apply(e,this)}else this.setContext(e),this.renderChildren(e),this.clearContext(e);e.restore()}}},{key:\"setContext\",value:function(){}},{key:\"clearContext\",value:function(){}},{key:\"renderChildren\",value:function(e){this.children.forEach(function(t){t.render(e)})}},{key:\"addChild\",value:function(t){var n=t instanceof e?t:this.document.createElement(t);n.parent=this,e.ignoreChildTypes.includes(n.type)||this.children.push(n)}},{key:\"matchesSelector\",value:function(e){var t=this.node;if(\"function\"==typeof t.matches)return t.matches(e);var n=t.getAttribute(\"class\");return!!(n&&\"\"!==n)&&n.split(\" \").some(function(t){if(\".\".concat(t)===e)return!0})}},{key:\"addStylesFromStyleDefinition\",value:function(){var e=this.document,t=e.styles,n=e.stylesSpecificity;for(var r in t)if(\"@\"!==r[0]&&this.matchesSelector(r)){var a=t[r],o=n[r];if(a)for(var i in a){var l=this.stylesSpecificity[i];\"undefined\"==typeof l&&(l=\"000\"),o>=l&&(this.styles[i]=a[i],this.stylesSpecificity[i]=o)}}}}]),e}();td.ignoreChildTypes=[\"title\"];var nd=function(e){function t(e,r,a){var o;return Fi(this,t),o=n.call(this,e,r,a),console.warn(\"Element \".concat(r.nodeName,\" not yet implemented.\")),o}ou(t,e);var n=X(t);return t}(td),rd=Lr.indexOf,ad=[].indexOf,od=!!ad&&0>1/[1].indexOf(1,-0),ld=Za(\"indexOf\"),sd=Aa(\"indexOf\",{ACCESSORS:!0,1:0});qr({target:\"Array\",proto:!0,forced:od||!ld||!sd},{indexOf:function(e){return od?ad.apply(this,arguments)||0:rd(this,e,1<arguments.length?arguments[1]:void 0)}});var cd=[].reverse,ud=[1,2];qr({target:\"Array\",proto:!0,forced:ud+\"\"===ud.reverse()+\"\"},{reverse:function(){return Jr(this)&&(this.length=this.length),cd.call(this)}});var dd=t(function(e){function t(n){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},t(n)}e.exports=t}),gd=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&(e=dd(e),null!==e););return e},pd=t(function(e){function t(n,r,a){return e.exports=\"undefined\"!=typeof Reflect&&Reflect.get?t=Reflect.get:t=function(e,t,n){var r=gd(e,t);if(r){var a=Object.getOwnPropertyDescriptor(r,t);return a.get?a.get.call(n):a.value}},t(n,r,a||n)}e.exports=t}),yd=function(){function e(t,n,r,a,o,i){Fi(this,e);var l=i?\"string\"==typeof i?e.parse(i):i:{};this.fontFamily=o||l.fontFamily,this.fontSize=a||l.fontSize,this.fontStyle=t||l.fontStyle,this.fontWeight=r||l.fontWeight,this.fontVariant=n||l.fontVariant}return ji(e,[{key:\"toString\",value:function(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,K(this.fontFamily)].join(\" \")}}],[{key:\"parse\",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:\"\",n=1<arguments.length?arguments[1]:void 0,a=\"\",o=\"\",i=\"\",l=\"\",s=\"\",c=r(t).trim().split(\" \"),u={fontSize:!1,fontStyle:!1,fontWeight:!1,fontVariant:!1};return c.forEach(function(t){switch(!0){case!u.fontStyle&&e.styles.includes(t):\"inherit\"!==t&&(a=t),u.fontStyle=!0;break;case!u.fontVariant&&e.variants.includes(t):\"inherit\"!==t&&(o=t),u.fontStyle=!0,u.fontVariant=!0;break;case!u.fontWeight&&e.weights.includes(t):\"inherit\"!==t&&(i=t),u.fontStyle=!0,u.fontVariant=!0,u.fontWeight=!0;break;case!u.fontSize:if(\"inherit\"!==t){var n=t.split(\"/\"),r=lo(n,1);l=r[0]}u.fontStyle=!0,u.fontVariant=!0,u.fontWeight=!0,u.fontSize=!0;break;default:\"inherit\"!==t&&(s+=t);}}),new e(a,o,i,l,s,n)}}]),e}();yd.styles=\"normal|italic|oblique|inherit\",yd.variants=\"normal|small-caps|inherit\",yd.weights=\"normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit\";var hd=function(e,t,n){var r,a;return Nu&&\"function\"==typeof(r=t.constructor)&&r!==n&&Nn(a=r.prototype)&&a!==n.prototype&&Nu(e,a),e},fd=Br.f,md=Yn.f,xd=qn.f,bd=Zu.trim,vd=\"Number\",Sd=Sn[vd],kd=Sd.prototype,Ad=Vn(Lo(kd))==vd,Pd=function(e){var t=Mn(e,!1),n,r,a,o,i,l,s,c;if(\"string\"==typeof t&&2<t.length)if(t=bd(t),n=t.charCodeAt(0),43===n||45===n){if(r=t.charCodeAt(2),88===r||120===r)return NaN;}else if(48===n){switch(t.charCodeAt(1)){case 66:case 98:a=2,o=49;break;case 79:case 111:a=8,o=55;break;default:return+t;}for(i=t.slice(2),l=i.length,s=0;s<l;s++)if(c=i.charCodeAt(s),48>c||c>o)return NaN;return parseInt(i,a)}return+t};if(Wr(vd,!Sd(\" 0o1\")||!Sd(\"0b1\")||Sd(\"+0x1\"))){for(var Ed=function(e){var t=1>arguments.length?0:e,n=this;return n instanceof Ed&&(Ad?kn(function(){kd.valueOf.call(n)}):Vn(n)!=vd)?hd(new Sd(Pd(t)),n,Ed):Pd(t)},Td=An?fd(Sd):[\"MAX_VALUE\",\"MIN_VALUE\",\"NaN\",\"NEGATIVE_INFINITY\",\"POSITIVE_INFINITY\",\"EPSILON\",\"isFinite\",\"isInteger\",\"isNaN\",\"isSafeInteger\",\"MAX_SAFE_INTEGER\",\"MIN_SAFE_INTEGER\",\"parseFloat\",\"parseInt\",\"isInteger\"],Cd=0,wd;Td.length>Cd;Cd++)_n(Sd,wd=Td[Cd])&&!_n(Ed,wd)&&xd(Ed,wd,md(Sd,wd));Ed.prototype=kd,kd.constructor=Ed,Ar(Sn,vd,Ed)}var Od=function(){function e(){var t=Number.NaN,n=0<arguments.length&&void 0!==arguments[0]?arguments[0]:t,r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:t,a=2<arguments.length&&void 0!==arguments[2]?arguments[2]:t,o=3<arguments.length&&void 0!==arguments[3]?arguments[3]:t;Fi(this,e),this.x1=n,this.y1=r,this.x2=a,this.y2=o,this.addPoint(n,r),this.addPoint(a,o)}return ji(e,[{key:\"addPoint\",value:function(e,t){\"undefined\"!=typeof e&&((isNaN(this.x1)||isNaN(this.x2))&&(this.x1=e,this.x2=e),e<this.x1&&(this.x1=e),e>this.x2&&(this.x2=e)),\"undefined\"!=typeof t&&((isNaN(this.y1)||isNaN(this.y2))&&(this.y1=t,this.y2=t),t<this.y1&&(this.y1=t),t>this.y2&&(this.y2=t))}},{key:\"addX\",value:function(e){this.addPoint(e,null)}},{key:\"addY\",value:function(e){this.addPoint(null,e)}},{key:\"addBoundingBox\",value:function(e){var t=e.x1,n=e.y1,r=e.x2,a=e.y2;this.addPoint(t,n),this.addPoint(r,a)}},{key:\"sumCubic\",value:function(e,t,n,r,a){return xn(1-e,3)*t+3*xn(1-e,2)*e*n+3*(1-e)*xn(e,2)*r+xn(e,3)*a}},{key:\"bezierCurveAdd\",value:function(e,n,r,o,i){var l=6*n-12*r+6*o,s=-3*n+9*r-9*o+3*i,a=3*r-3*n;if(0===s){if(0===l)return;var c=-a/l;return void(0<c&&1>c&&(e?this.addX(this.sumCubic(c,n,r,o,i)):this.addY(this.sumCubic(c,n,r,o,i))))}var t=xn(l,2)-4*a*s;if(!(0>t)){var u=(-l+mn(t))/(2*s);0<u&&1>u&&(e?this.addX(this.sumCubic(u,n,r,o,i)):this.addY(this.sumCubic(u,n,r,o,i)));var d=(-l-mn(t))/(2*s);0<d&&1>d&&(e?this.addX(this.sumCubic(d,n,r,o,i)):this.addY(this.sumCubic(d,n,r,o,i)))}}},{key:\"addBezierCurve\",value:function(e,t,n,r,a,o,i,l){this.addPoint(e,t),this.addPoint(i,l),this.bezierCurveAdd(!0,e,n,a,i),this.bezierCurveAdd(!1,t,r,o,l)}},{key:\"addQuadraticCurve\",value:function(e,t,n,r,a,o){var i=e+2/3*(n-e),l=t+2/3*(r-t);this.addBezierCurve(e,t,i,i+1/3*(a-e),l,l+1/3*(o-t),a,o)}},{key:\"isPointInBox\",value:function(e,t){var n=this.x1,r=this.y1,a=this.x2,o=this.y2;return n<=e&&e<=a&&r<=t&&t<=o}},{key:\"x\",get:function(){return this.x1}},{key:\"y\",get:function(){return this.y1}},{key:\"width\",get:function(){return this.x2-this.x1}},{key:\"height\",get:function(){return this.y2-this.y1}}]),e}(),Vd=function(){function e(t,n){Fi(this,e),this.type=\"translate\",this.point=null,this.point=_c.parse(n)}return ji(e,[{key:\"apply\",value:function(e){var t=this.point,n=t.x,r=t.y;e.translate(n||0,r||0)}},{key:\"unapply\",value:function(e){var t=this.point,n=t.x,r=t.y;e.translate(-1*n||0,-1*r||0)}},{key:\"applyToPoint\",value:function(e){var t=this.point,n=t.x,r=t.y;e.applyTransform([1,0,0,1,n||0,r||0])}}]),e}(),Ld=function(){function e(t,n){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:[];Fi(this,e),this.type=\"rotate\",this.angle=null,this.cx=0,this.cy=0;var a=l(n);this.angle=new Mc(t,\"angle\",a[0]),this.cx=(a[1]||0)+(r[0]||0),this.cy=(a[2]||0)+(r[1]||0)}return ji(e,[{key:\"apply\",value:function(e){var t=this.cx,n=this.cy,r=this.angle;e.translate(t,n),e.rotate(r.getRadians()),e.translate(-t,-n)}},{key:\"unapply\",value:function(e){var t=this.cx,n=this.cy,r=this.angle;e.translate(t,n),e.rotate(-1*r.getRadians()),e.translate(-t,-n)}},{key:\"applyToPoint\",value:function(e){var t=this.cx,n=this.cy,r=this.angle,a=r.getRadians();e.applyTransform([1,0,0,1,t||0,n||0]),e.applyTransform([hn(a),yn(a),-yn(a),hn(a),0,0]),e.applyTransform([1,0,0,1,-t||0,-n||0])}}]),e}(),Rd=function(){function e(t,n){Fi(this,e),this.type=\"scale\",this.scale=null;var r=_c.parse(n,1);(0===r.x||0===r.y)&&(r.x=fo,r.y=fo),this.scale=r}return ji(e,[{key:\"apply\",value:function(e){var t=this.scale,n=t.x,r=t.y;e.scale(n,r||n)}},{key:\"unapply\",value:function(e){var t=this.scale,n=t.x,r=t.y;e.scale(1/n,1/r||n)}},{key:\"applyToPoint\",value:function(e){var t=this.scale,n=t.x,r=t.y;e.applyTransform([n||0,0,0,r||0,0,0])}}]),e}(),Id=function(){function e(t,n){Fi(this,e),this.type=\"matrix\",this.matrix=[],this.matrix=l(n)}return ji(e,[{key:\"apply\",value:function(e){var t=this.matrix;e.transform(t[0],t[1],t[2],t[3],t[4],t[5])}},{key:\"unapply\",value:function(t){var n=this.matrix,r=n[0],a=n[2],o=n[4],l=n[1],s=n[3],e=n[5],c=0,u=0,d=1,i=1/(r*(s*d-e*u)-a*(l*d-e*c)+o*(l*u-s*c));t.transform(i*(s*d-e*u),i*(e*c-l*d),i*(o*u-a*d),i*(r*d-o*c),i*(a*e-o*s),i*(o*l-r*e))}},{key:\"applyToPoint\",value:function(e){e.applyTransform(this.matrix)}}]),e}(),Dd=function(e){function t(e,r){var a;return Fi(this,t),a=n.call(this,e,r),a.type=\"skew\",a.angle=null,a.angle=new Mc(e,\"angle\",r),a}ou(t,e);var n=Z(t);return t}(Id),Nd=function(e){function t(e,r){var a;return Fi(this,t),a=n.call(this,e,r),a.type=\"skewX\",a.matrix=[1,0,on(a.angle.getRadians()),1,0,0],a}ou(t,e);var n=ee(t);return t}(Dd),Md=function(e){function t(e,r){var a;return Fi(this,t),a=n.call(this,e,r),a.type=\"skewY\",a.matrix=[1,on(a.angle.getRadians()),0,1,0,0],a}ou(t,e);var n=ne(t);return t}(Dd),Bd=function(){function e(t,n,r){var a=this;Fi(this,e),this.document=t,this.transforms=[];var o=ae(n),i=r?l(r):[];o.forEach(function(t){if(\"none\"!==t){var n=oe(t),r=lo(n,2),o=r[0],l=r[1],s=e.transformTypes[o];\"undefined\"!=typeof s&&a.transforms.push(new s(a.document,l,i))}})}return ji(e,[{key:\"apply\",value:function(e){for(var t=this.transforms,n=t.length,r=0;r<n;r++)t[r].apply(e)}},{key:\"unapply\",value:function(e){for(var t=this.transforms,n=t.length,r=n-1;0<=r;r--)t[r].unapply(e)}},{key:\"applyToPoint\",value:function(e){for(var t=this.transforms,n=t.length,r=0;r<n;r++)t[r].applyToPoint(e)}}],[{key:\"fromElement\",value:function(t,n){var r=n.getStyle(\"transform\",!1,!0),a=n.getStyle(\"transform-origin\",!1,!0);return r.hasValue()?new e(t,r.getString(),a.getString()):null}}]),e}();Bd.transformTypes={translate:Vd,rotate:Ld,scale:Rd,matrix:Id,skewX:Nd,skewY:Md};var _d=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.modifiedEmSizeStack=!1,e}ou(t,e);var n=ie(t);return ji(t,[{key:\"calculateOpacity\",value:function(){for(var e=1,t=this,n;t;)n=t.getStyle(\"opacity\",!1,!0),n.hasValue()&&(e*=n.getNumber()),t=t.parent;return e}},{key:\"setContext\",value:function(e){var t=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1];if(!t){var n=this.getStyle(\"fill\"),r=this.getStyle(\"fill-opacity\"),a=this.getStyle(\"stroke\"),o=this.getStyle(\"stroke-opacity\");if(n.isUrlDefinition()){var i=n.getFillStyleDefinition(this,r);i&&(e.fillStyle=i)}else if(n.hasValue()){\"currentColor\"===n.getString()&&n.setValue(this.getStyle(\"color\").getValue());var s=n.getString();\"inherit\"!==s&&(e.fillStyle=\"none\"===s?\"rgba(0,0,0,0)\":s)}if(r.hasValue()){var c=new Mc(this.document,\"fill\",e.fillStyle).addOpacity(r).getString();e.fillStyle=c}if(a.isUrlDefinition()){var u=a.getFillStyleDefinition(this,o);u&&(e.strokeStyle=u)}else if(a.hasValue()){\"currentColor\"===a.getString()&&a.setValue(this.getStyle(\"color\").getValue());var d=a.getString();\"inherit\"!==d&&(e.strokeStyle=\"none\"===d?\"rgba(0,0,0,0)\":d)}if(o.hasValue()){var g=new Mc(this.document,\"stroke\",e.strokeStyle).addOpacity(o).getString();e.strokeStyle=g}var p=this.getStyle(\"stroke-width\");if(p.hasValue()){var y=p.getPixels();e.lineWidth=y?y:fo}var h=this.getStyle(\"stroke-linecap\"),f=this.getStyle(\"stroke-linejoin\"),m=this.getStyle(\"stroke-miterlimit\"),x=this.getStyle(\"paint-order\"),b=this.getStyle(\"stroke-dasharray\"),v=this.getStyle(\"stroke-dashoffset\");if(h.hasValue()&&(e.lineCap=h.getString()),f.hasValue()&&(e.lineJoin=f.getString()),m.hasValue()&&(e.miterLimit=m.getNumber()),x.hasValue()&&(e.paintOrder=x.getValue()),b.hasValue()&&\"none\"!==b.getString()){var S=l(b.getString());\"undefined\"==typeof e.setLineDash?\"undefined\"==typeof e.webkitLineDash?\"undefined\"!=typeof e.mozDash&&(1!==S.length||0!==S[0])&&(e.mozDash=S):e.webkitLineDash=S:e.setLineDash(S);var k=v.getPixels();\"undefined\"==typeof e.lineDashOffset?\"undefined\"==typeof e.webkitLineDashOffset?\"undefined\"!=typeof e.mozDashOffset&&(e.mozDashOffset=k):e.webkitLineDashOffset=k:e.lineDashOffset=k}}if(this.modifiedEmSizeStack=!1,\"undefined\"!=typeof e.font){var A=this.getStyle(\"font\"),P=this.getStyle(\"font-style\"),E=this.getStyle(\"font-variant\"),T=this.getStyle(\"font-weight\"),C=this.getStyle(\"font-size\"),w=this.getStyle(\"font-family\"),O=new yd(P.getString(),E.getString(),T.getString(),C.hasValue()?\"\".concat(C.getPixels(!0),\"px\"):\"\",w.getString(),yd.parse(A.getString(),e.font));P.setValue(O.fontStyle),E.setValue(O.fontVariant),T.setValue(O.fontWeight),C.setValue(O.fontSize),w.setValue(O.fontFamily),e.font=O.toString(),C.isPixels()&&(this.document.emSize=C.getPixels(),this.modifiedEmSizeStack=!0)}var V=Bd.fromElement(this.document,this);V&&V.apply(e);var L=this.getStyle(\"clip-path\",!1,!0);if(L.hasValue()){var R=L.getDefinition();R&&R.apply(e)}e.globalAlpha=this.calculateOpacity()}},{key:\"clearContext\",value:function(e){pd(cu(t.prototype),\"clearContext\",this).call(this,e),this.modifiedEmSizeStack&&this.document.popEmSize()}}]),t}(td),zd=function(e){function t(e,r,a){var o;return Fi(this,t),o=n.call(this,e,r,(this instanceof t?this.constructor:void 0)===t||a),o.type=\"text\",o.x=0,o.y=0,o.measureCache=-1,o}ou(t,e);var n=se(t);return ji(t,[{key:\"setContext\",value:function(e){var n=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1];pd(cu(t.prototype),\"setContext\",this).call(this,e,n);var r=this.getStyle(\"dominant-baseline\").getTextBaseline()||this.getStyle(\"alignment-baseline\").getTextBaseline();r&&(e.textBaseline=r)}},{key:\"initializeCoordinates\",value:function(e){this.x=this.getAttribute(\"x\").getPixels(\"x\"),this.y=this.getAttribute(\"y\").getPixels(\"y\");var t=this.getAttribute(\"dx\"),n=this.getAttribute(\"dy\");t.hasValue()&&(this.x+=t.getPixels(\"x\")),n.hasValue()&&(this.y+=n.getPixels(\"y\")),this.x+=this.getAnchorDelta(e,this,0)}},{key:\"getBoundingBox\",value:function(e){var t=this;if(\"text\"!==this.type)return this.getTElementBoundingBox(e);this.initializeCoordinates(e);var n=null;return this.children.forEach(function(r,a){var o=t.getChildBoundingBox(e,t,t,a);n?n.addBoundingBox(o):n=o}),n}},{key:\"getFontSize\",value:function(){var e=this.document,t=this.parent,n=yd.parse(e.ctx.font).fontSize,r=t.getStyle(\"font-size\").getNumber(n);return r}},{key:\"getTElementBoundingBox\",value:function(e){var t=this.getFontSize();return new Od(this.x,this.y-t,this.x+this.measureText(e),this.y)}},{key:\"getGlyph\",value:function(e,t,n){var r=t[n],a=null;if(e.isArabic){var o=t.length,i=t[n-1],l=t[n+1],s=\"isolated\";(0===n||\" \"===i)&&n<o-2&&\" \"!==l&&(s=\"terminal\"),0<n&&\" \"!==i&&n<o-2&&\" \"!==l&&(s=\"medial\"),0<n&&\" \"!==i&&(n===o-1||\" \"===l)&&(s=\"initial\"),\"undefined\"!=typeof e.glyphs[r]&&(a=e.glyphs[r][s],!a&&\"glyph\"===e.glyphs[r].type&&(a=e.glyphs[r]))}else a=e.glyphs[r];return a||(a=e.missingGlyph),a}},{key:\"getText\",value:function(){return\"\"}},{key:\"getTextFromNode\",value:function(e){var t=e||this.node,n=Array.from(t.parentNode.childNodes),i=n.indexOf(t),l=n.length-1,s=r(t.value||t.text||t.textContent||\"\");return 0===i?s=a(s):i===l&&(s=o(s)),s}},{key:\"renderChildren\",value:function(e){var t=this;if(\"text\"!==this.type)return void this.renderTElementChildren(e);this.initializeCoordinates(e),this.children.forEach(function(n,r){t.renderChild(e,t,t,r)});var n=this.document.screen.mouse;n.isWorking()&&n.checkBoundingBox(this,this.getBoundingBox(e))}},{key:\"renderTElementChildren\",value:function(e){var t=this.document,n=this.parent,r=this.getText(),a=n.getStyle(\"font-family\").getDefinition();if(a){for(var o=a.fontFace.unitsPerEm,s=yd.parse(t.ctx.font),c=n.getStyle(\"font-size\").getNumber(s.fontSize),u=n.getStyle(\"font-style\").getString(s.fontStyle),d=c/o,g=a.isRTL?r.split(\"\").reverse().join(\"\"):r,p=l(n.getAttribute(\"dx\").getString()),h=g.length,f=0,m;f<h;f++){m=this.getGlyph(a,g,f),e.translate(this.x,this.y),e.scale(d,-d);var b=e.lineWidth;e.lineWidth=e.lineWidth*o/c,\"italic\"===u&&e.transform(1,0,.4,1,0,0),m.render(e),\"italic\"===u&&e.transform(1,0,-.4,1,0,0),e.lineWidth=b,e.scale(1/d,-1/d),e.translate(-this.x,-this.y),this.x+=c*(m.horizAdvX||a.horizAdvX)/o,\"undefined\"==typeof p[f]||isNaN(p[f])||(this.x+=p[f])}return}var v=this.x,x=this.y;\"stroke\"===e.paintOrder?(e.strokeStyle&&e.strokeText(r,v,x),e.fillStyle&&e.fillText(r,v,x)):(e.fillStyle&&e.fillText(r,v,x),e.strokeStyle&&e.strokeText(r,v,x))}},{key:\"getAnchorDelta\",value:function(e,t,n){var r=this.getStyle(\"text-anchor\").getString(\"start\");if(\"start\"!==r){for(var a=t.children,o=a.length,l=null,s=0,c=n;c<o&&(l=a[c],!(c>n&&l.getAttribute(\"x\").hasValue()||l.getAttribute(\"text-anchor\").hasValue()));c++)s+=l.measureTextRecursive(e);return-1*(\"end\"===r?s:s/2)}return 0}},{key:\"adjustChildCoordinates\",value:function(e,t,n,r){var a=n.children[r];if(\"function\"!=typeof a.measureText)return a;var o=a.getAttribute(\"x\"),i=a.getAttribute(\"y\"),l=a.getAttribute(\"dx\"),s=a.getAttribute(\"dy\"),c=a.getAttribute(\"text-anchor\").getString(\"start\");if(0===r&&\"textNode\"!==a.type&&(!o.hasValue()&&o.setValue(t.getAttribute(\"x\").getValue(\"0\")),!i.hasValue()&&i.setValue(t.getAttribute(\"y\").getValue(\"0\")),!l.hasValue()&&l.setValue(t.getAttribute(\"dx\").getValue(\"0\")),!s.hasValue()&&s.setValue(t.getAttribute(\"dy\").getValue(\"0\"))),o.hasValue()){if(a.x=o.getPixels(\"x\")+t.getAnchorDelta(e,n,r),\"start\"!==c){var u=a.measureTextRecursive(e);a.x+=-1*(\"end\"===c?u:u/2)}l.hasValue()&&(a.x+=l.getPixels(\"x\"))}else{if(\"start\"!==c){var d=a.measureTextRecursive(e);t.x+=-1*(\"end\"===c?d:d/2)}l.hasValue()&&(t.x+=l.getPixels(\"x\")),a.x=t.x}return t.x=a.x+a.measureText(e),i.hasValue()?(a.y=i.getPixels(\"y\"),s.hasValue()&&(a.y+=s.getPixels(\"y\"))):(s.hasValue()&&(t.y+=s.getPixels(\"y\")),a.y=t.y),t.y=a.y,a}},{key:\"getChildBoundingBox\",value:function(e,t,n,r){var a=this.adjustChildCoordinates(e,t,n,r),o=a.getBoundingBox(e);return a.children.forEach(function(n,r){var i=t.getChildBoundingBox(e,t,a,r);o.addBoundingBox(i)}),o}},{key:\"renderChild\",value:function(e,t,n,r){var a=this.adjustChildCoordinates(e,t,n,r);a.render(e),a.children.forEach(function(n,r){t.renderChild(e,t,a,r)})}},{key:\"measureTextRecursive\",value:function(e){var t=this.children.reduce(function(t,n){return t+n.measureTextRecursive(e)},this.measureText(e));return t}},{key:\"measureText\",value:function(e){var t=this.measureCache;if(~t)return t;var n=this.getText(),r=this.measureTargetText(e,n);return this.measureCache=r,r}},{key:\"measureTargetText\",value:function(e,t){if(!t.length)return 0;var n=this.parent,r=n.getStyle(\"font-family\").getDefinition();if(r){for(var a=this.getFontSize(),o=r.isRTL?t.split(\"\").reverse().join(\"\"):t,s=l(n.getAttribute(\"dx\").getString()),c=o.length,u=0,d=0,g;d<c;d++)g=this.getGlyph(r,o,d),u+=(g.horizAdvX||r.horizAdvX)*a/r.fontFace.unitsPerEm,\"undefined\"==typeof s[d]||isNaN(s[d])||(u+=s[d]);return u}if(!e.measureText)return 10*t.length;e.save(),this.setContext(e,!0);var p=e.measureText(t),y=p.width;return e.restore(),y}}]),t}(_d),Fd=function(e){function t(e,r,a){var o;return Fi(this,t),o=n.call(this,e,r,(this instanceof t?this.constructor:void 0)===t||a),o.type=\"tspan\",o.text=0<o.children.length?\"\":o.getTextFromNode(),o}ou(t,e);var n=ue(t);return ji(t,[{key:\"getText\",value:function(){return this.text}}]),t}(zd),jd=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"textNode\",e}ou(t,e);var n=ge(t);return t}(Fd);qr({target:\"Array\",proto:!0},{fill:function(e){for(var t=Zr(this),n=wr(t.length),r=arguments.length,a=Or(1<r?arguments[1]:void 0,n),o=2<r?arguments[2]:void 0,i=void 0===o?n:Or(o,n);i>a;)t[a++]=e;return t}}),pu(\"fill\");var Gd=function(){function e(t){Fi(this,e),this.control=null,this.start=null,this.current=null,this.command=\"\",this.tokens=[],this.i=-1,this.previousCommand=\"\",this.points=[],this.angles=[],this.tokens=ye(t).split(\" \")}return ji(e,[{key:\"reset\",value:function(){this.i=-1,this.command=\"\",this.previousCommand=\"\",this.start=new _c(0,0),this.control=new _c(0,0),this.current=new _c(0,0),this.points=[],this.angles=[]}},{key:\"isEnd\",value:function(){var e=this.i,t=this.tokens;return e>=t.length-1}},{key:\"isCommandOrEnd\",value:function(){if(this.isEnd())return!0;var e=this.i,t=this.tokens;return /^[A-Za-z]$/.test(t[e+1])}},{key:\"isRelativeCommand\",value:function(){switch(this.command){case\"m\":case\"l\":case\"h\":case\"v\":case\"c\":case\"s\":case\"q\":case\"t\":case\"a\":case\"z\":return!0;default:return!1;}}},{key:\"getToken\",value:function(){return this.i++,this.tokens[this.i]}},{key:\"getScalar\",value:function(){return parseFloat(this.getToken())}},{key:\"nextCommand\",value:function(){this.previousCommand=this.command,this.command=this.getToken()}},{key:\"getPoint\",value:function(){var e=new _c(this.getScalar(),this.getScalar());return this.makeAbsolute(e)}},{key:\"getAsControlPoint\",value:function(){var e=this.getPoint();return this.control=e,e}},{key:\"getAsCurrentPoint\",value:function(){var e=this.getPoint();return this.current=e,e}},{key:\"getReflectedControlPoint\",value:function(){var e=this.previousCommand.toLowerCase();if(\"c\"!==e&&\"s\"!==e&&\"q\"!==e&&\"t\"!==e)return this.current;var t=this.current,n=t.x,r=t.y,a=this.control,o=a.x,i=a.y,l=new _c(2*n-o,2*r-i);return l}},{key:\"makeAbsolute\",value:function(e){if(this.isRelativeCommand()){var t=this.current,n=t.x,r=t.y;e.x+=n,e.y+=r}return e}},{key:\"addMarker\",value:function(e,t,n){var r=this.points,a=this.angles;n&&0<a.length&&!a[a.length-1]&&(a[a.length-1]=r[r.length-1].angleTo(n)),this.addMarkerAngle(e,t?t.angleTo(e):null)}},{key:\"addMarkerAngle\",value:function(e,t){this.points.push(e),this.angles.push(t)}},{key:\"getMarkerPoints\",value:function(){return this.points}},{key:\"getMarkerAngles\",value:function(){for(var e=this.angles,t=e.length,n=0;n<t;n++)if(!e[n])for(var r=n+1;r<t;r++)if(e[r]){e[n]=e[r];break}return e}}]),e}(),Hd=function(e){function t(e,r,a){var o;return Fi(this,t),o=n.call(this,e,r,a),o.type=\"path\",o.pathParser=null,o.pathParser=new Gd(o.getAttribute(\"d\").getString()),o}ou(t,e);var n=he(t);return ji(t,[{key:\"path\",value:function(e){var t=this.pathParser,n=new Od;for(t.reset(),e&&e.beginPath();!t.isEnd();)switch(t.nextCommand(),t.command){case\"M\":case\"m\":this.pathM(e,n);break;case\"L\":case\"l\":this.pathL(e,n);break;case\"H\":case\"h\":this.pathH(e,n);break;case\"V\":case\"v\":this.pathV(e,n);break;case\"C\":case\"c\":this.pathC(e,n);break;case\"S\":case\"s\":this.pathS(e,n);break;case\"Q\":case\"q\":this.pathQ(e,n);break;case\"T\":case\"t\":this.pathT(e,n);break;case\"A\":case\"a\":this.pathA(e,n);break;case\"Z\":case\"z\":this.pathZ(e,n);}return n}},{key:\"getBoundingBox\",value:function(){return this.path()}},{key:\"getMarkers\",value:function(){var e=this.pathParser,t=e.getMarkerPoints(),n=e.getMarkerAngles(),r=t.map(function(e,t){return[e,n[t]]});return r}},{key:\"renderChildren\",value:function(e){this.path(e),this.document.screen.mouse.checkPath(this,e);var t=this.getStyle(\"fill-rule\");\"\"!==e.fillStyle&&(\"inherit\"===t.getString(\"inherit\")?e.fill():e.fill(t.getString())),\"\"!==e.strokeStyle&&e.stroke();var n=this.getMarkers();if(n){var r=n.length-1,a=this.getStyle(\"marker-start\"),o=this.getStyle(\"marker-mid\"),l=this.getStyle(\"marker-end\");if(a.isUrlDefinition()){var s=a.getDefinition(),c=lo(n[0],2),u=c[0],d=c[1];s.render(e,u,d)}if(o.isUrlDefinition())for(var g=o.getDefinition(),p=1;p<r;p++){var y=lo(n[p],2),h=y[0],f=y[1];g.render(e,h,f)}if(l.isUrlDefinition()){var m=l.getDefinition(),x=lo(n[r],2),b=x[0],v=x[1];m.render(e,b,v)}}}},{key:\"pathM\",value:function(e,t){var n=this.pathParser,r=n.getAsCurrentPoint(),a=r.x,o=r.y;for(n.addMarker(r),t.addPoint(a,o),e&&e.moveTo(a,o),n.start=n.current;!n.isCommandOrEnd();){var i=n.getAsCurrentPoint(),l=i.x,s=i.y;n.addMarker(i,n.start),t.addPoint(l,s),e&&e.lineTo(l,s)}}},{key:\"pathL\",value:function(e,t){for(var n=this.pathParser;!n.isCommandOrEnd();){var r=n.current,a=n.getAsCurrentPoint(),o=a.x,i=a.y;n.addMarker(a,r),t.addPoint(o,i),e&&e.lineTo(o,i)}}},{key:\"pathH\",value:function(e,t){for(var n=this.pathParser;!n.isCommandOrEnd();){var r=n.current,a=new _c((n.isRelativeCommand()?r.x:0)+n.getScalar(),r.y);n.addMarker(a,r),n.current=a,t.addPoint(a.x,a.y),e&&e.lineTo(a.x,a.y)}}},{key:\"pathV\",value:function(e,t){for(var n=this.pathParser;!n.isCommandOrEnd();){var r=n.current,a=new _c(r.x,(n.isRelativeCommand()?r.y:0)+n.getScalar());n.addMarker(a,r),n.current=a,t.addPoint(a.x,a.y),e&&e.lineTo(a.x,a.y)}}},{key:\"pathC\",value:function(e,t){for(var n=this.pathParser;!n.isCommandOrEnd();){var r=n.current,a=n.getPoint(),o=n.getAsControlPoint(),i=n.getAsCurrentPoint();n.addMarker(i,o,a),t.addBezierCurve(r.x,r.y,a.x,a.y,o.x,o.y,i.x,i.y),e&&e.bezierCurveTo(a.x,a.y,o.x,o.y,i.x,i.y)}}},{key:\"pathS\",value:function(e,t){for(var n=this.pathParser;!n.isCommandOrEnd();){var r=n.current,a=n.getReflectedControlPoint(),o=n.getAsControlPoint(),i=n.getAsCurrentPoint();n.addMarker(i,o,a),t.addBezierCurve(r.x,r.y,a.x,a.y,o.x,o.y,i.x,i.y),e&&e.bezierCurveTo(a.x,a.y,o.x,o.y,i.x,i.y)}}},{key:\"pathQ\",value:function(e,t){for(var n=this.pathParser;!n.isCommandOrEnd();){var r=n.current,a=n.getAsControlPoint(),o=n.getAsCurrentPoint();n.addMarker(o,a,a),t.addQuadraticCurve(r.x,r.y,a.x,a.y,o.x,o.y),e&&e.quadraticCurveTo(a.x,a.y,o.x,o.y)}}},{key:\"pathT\",value:function(e,t){for(var n=this.pathParser;!n.isCommandOrEnd();){var r=n.current,a=n.getReflectedControlPoint();n.control=a;var o=n.getAsCurrentPoint();n.addMarker(o,a,a),t.addQuadraticCurve(r.x,r.y,a.x,a.y,o.x,o.y),e&&e.quadraticCurveTo(a.x,a.y,o.x,o.y)}}},{key:\"pathA\",value:function(e,t){for(var n=this.pathParser;!n.isCommandOrEnd();){var a=n.current,o=n.getScalar(),i=n.getScalar(),c=n.getScalar()*(sn/180),d=n.getScalar(),g=n.getScalar(),p=n.getAsCurrentPoint(),y=new _c(hn(c)*(a.x-p.x)/2+yn(c)*(a.y-p.y)/2,-yn(c)*(a.x-p.x)/2+hn(c)*(a.y-p.y)/2),h=xn(y.x,2)/xn(o,2)+xn(y.y,2)/xn(i,2);1<h&&(o*=mn(h),i*=mn(h));var l=(d===g?-1:1)*mn((xn(o,2)*xn(i,2)-xn(o,2)*xn(y.y,2)-xn(i,2)*xn(y.x,2))/(xn(o,2)*xn(y.y,2)+xn(i,2)*xn(y.x,2)));isNaN(l)&&(l=0);var f=new _c(l*o*y.y/i,l*-i*y.x/o),m=new _c((a.x+p.x)/2+hn(c)*f.x-yn(c)*f.y,(a.y+p.y)/2+yn(c)*f.x+hn(c)*f.y),x=S([1,0],[(y.x-f.x)/o,(y.y-f.y)/i]),k=[(y.x-f.x)/o,(y.y-f.y)/i],u=[(-y.x-f.x)/o,(-y.y-f.y)/i],v=S(k,u);-1>=b(k,u)&&(v=sn),1<=b(k,u)&&(v=0);var A=1-g?1:-1,P=x+A*(v/2),E=new _c(m.x+o*hn(P),m.y+i*yn(P));if(n.addMarkerAngle(E,P-A*sn/2),n.addMarkerAngle(p,P-A*sn),t.addPoint(p.x,p.y),e&&!isNaN(x)&&!isNaN(v)){var T=o>i?o:i,r=o>i?1:o/i,C=o>i?i/o:1;e.translate(m.x,m.y),e.rotate(c),e.scale(r,C),e.arc(0,0,T,x,x+v,!!(1-g)),e.scale(1/r,1/C),e.rotate(-c),e.translate(-m.x,-m.y)}}}},{key:\"pathZ\",value:function(e,t){var n=this.pathParser;e&&t.x1!==t.x2&&t.y1!==t.y2&&e.closePath(),n.current=n.start}}]),t}(_d),Ud=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"svg\",e.root=!1,e}ou(t,e);var n=me(t);return ji(t,[{key:\"clearContext\",value:function(e){pd(cu(t.prototype),\"clearContext\",this).call(this,e),this.document.screen.viewPort.removeCurrent()}},{key:\"setContext\",value:function(e){var n=this.document,r=n.screen,a=n.window,o=e.canvas;if(r.setDefaults(e),o.style&&\"undefined\"!=typeof e.font&&a&&\"undefined\"!=typeof a.getComputedStyle){e.font=a.getComputedStyle(o).getPropertyValue(\"font\");var i=new Mc(n,\"fontSize\",yd.parse(e.font).fontSize);i.hasValue()&&(n.rootEmSize=i.getPixels(\"y\"),n.emSize=n.rootEmSize)}pd(cu(t.prototype),\"setContext\",this).call(this,e),this.getAttribute(\"x\").hasValue()||this.getAttribute(\"x\",!0).setValue(0),this.getAttribute(\"y\").hasValue()||this.getAttribute(\"y\",!0).setValue(0),e.translate(this.getAttribute(\"x\").getPixels(\"x\"),this.getAttribute(\"y\").getPixels(\"y\"));var s=r.viewPort,c=s.width,u=s.height;this.getAttribute(\"width\").hasValue()||this.getAttribute(\"width\",!0).setValue(\"100%\"),this.getAttribute(\"height\").hasValue()||this.getAttribute(\"height\",!0).setValue(\"100%\");var d=this.getAttribute(\"refX\"),g=this.getAttribute(\"refY\"),p=this.getAttribute(\"viewBox\"),y=p.hasValue()?l(p.getString()):null,h=!this.root&&\"visible\"!==this.getAttribute(\"overflow\").getValue(\"hidden\"),f=0,m=0,x=0,b=0;y&&(f=y[0],m=y[1]),this.root||(c=this.getAttribute(\"width\").getPixels(\"x\"),u=this.getAttribute(\"height\").getPixels(\"y\"),\"marker\"===this.type&&(x=f,b=m,f=0,m=0)),r.viewPort.setCurrent(c,u),y&&(c=y[2],u=y[3]),n.setViewBox({ctx:e,aspectRatio:this.getAttribute(\"preserveAspectRatio\").getString(),width:r.viewPort.width,desiredWidth:c,height:r.viewPort.height,desiredHeight:u,minX:f,minY:m,refX:d.getValue(),refY:g.getValue(),clip:h,clipX:x,clipY:b}),y&&(r.viewPort.removeCurrent(),r.viewPort.setCurrent(c,u))}},{key:\"resize\",value:function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:e,n=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],r=this.getAttribute(\"width\",!0),a=this.getAttribute(\"height\",!0),o=this.getAttribute(\"viewBox\"),i=this.getAttribute(\"style\"),l=r.getNumber(0),s=a.getNumber(0);if(n)if(\"string\"==typeof n)this.getAttribute(\"preserveAspectRatio\",!0).setValue(n);else{var c=this.getAttribute(\"preserveAspectRatio\");c.hasValue()&&c.setValue(c.getString().replace(/^\\s*(\\S.*\\S)\\s*$/,\"$1\"))}if(r.setValue(e),a.setValue(t),o.hasValue()||o.setValue(\"0 0 \".concat(l||e,\" \").concat(s||t)),i.hasValue()){var u=this.getStyle(\"width\"),d=this.getStyle(\"height\");u.hasValue()&&u.setValue(\"\".concat(e,\"px\")),d.hasValue()&&d.setValue(\"\".concat(t,\"px\"))}}}]),t}(_d),Yd=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"rect\",e}ou(t,e);var n=be(t);return ji(t,[{key:\"path\",value:function(e){var t=this.getAttribute(\"x\").getPixels(\"x\"),n=this.getAttribute(\"y\").getPixels(\"y\"),r=this.getAttribute(\"width\").getPixels(\"x\"),a=this.getAttribute(\"height\").getPixels(\"y\"),o=this.getAttribute(\"rx\"),i=this.getAttribute(\"ry\"),l=o.getPixels(\"x\"),s=i.getPixels(\"y\");if(o.hasValue()&&!i.hasValue()&&(s=l),i.hasValue()&&!o.hasValue()&&(l=s),l=gn(l,r/2),s=gn(s,a/2),e){var c=4*((mn(2)-1)/3);e.beginPath(),0<a&&0<r&&(e.moveTo(t+l,n),e.lineTo(t+r-l,n),e.bezierCurveTo(t+r-l+c*l,n,t+r,n+s-c*s,t+r,n+s),e.lineTo(t+r,n+a-s),e.bezierCurveTo(t+r,n+a-s+c*s,t+r-l+c*l,n+a,t+r-l,n+a),e.lineTo(t+l,n+a),e.bezierCurveTo(t+l-c*l,n+a,t,n+a-s+c*s,t,n+a-s),e.lineTo(t,n+s),e.bezierCurveTo(t,n+s-c*s,t+l-c*l,n,t+l,n),e.closePath())}return new Od(t,n,t+r,n+a)}},{key:\"getMarkers\",value:function(){return null}}]),t}(Hd),$d=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"circle\",e}ou(t,e);var n=Se(t);return ji(t,[{key:\"path\",value:function(e){var t=this.getAttribute(\"cx\").getPixels(\"x\"),n=this.getAttribute(\"cy\").getPixels(\"y\"),a=this.getAttribute(\"r\").getPixels();return e&&0<a&&(e.beginPath(),e.arc(t,n,a,0,2*sn,!1),e.closePath()),new Od(t-a,n-a,t+a,n+a)}},{key:\"getMarkers\",value:function(){return null}}]),t}(Hd),Wd=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"ellipse\",e}ou(t,e);var n=Ae(t);return ji(t,[{key:\"path\",value:function(e){var t=4*((mn(2)-1)/3),n=this.getAttribute(\"rx\").getPixels(\"x\"),r=this.getAttribute(\"ry\").getPixels(\"y\"),a=this.getAttribute(\"cx\").getPixels(\"x\"),o=this.getAttribute(\"cy\").getPixels(\"y\");return e&&(e.beginPath(),e.moveTo(a+n,o),e.bezierCurveTo(a+n,o+t*r,a+t*n,o+r,a,o+r),e.bezierCurveTo(a-t*n,o+r,a-n,o+t*r,a-n,o),e.bezierCurveTo(a-n,o-t*r,a-t*n,o-r,a,o-r),e.bezierCurveTo(a+t*n,o-r,a+n,o-t*r,a+n,o),e.closePath()),new Od(a-n,o-r,a+n,o+r)}},{key:\"getMarkers\",value:function(){return null}}]),t}(Hd),Xd=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"line\",e}ou(t,e);var n=Ee(t);return ji(t,[{key:\"getPoints\",value:function(){return[new _c(this.getAttribute(\"x1\").getPixels(\"x\"),this.getAttribute(\"y1\").getPixels(\"y\")),new _c(this.getAttribute(\"x2\").getPixels(\"x\"),this.getAttribute(\"y2\").getPixels(\"y\"))]}},{key:\"path\",value:function(e){var t=this.getPoints(),n=lo(t,2),r=n[0],a=r.x,o=r.y,i=n[1],l=i.x,s=i.y;return e&&(e.beginPath(),e.moveTo(a,o),e.lineTo(l,s)),new Od(a,o,l,s)}},{key:\"getMarkers\",value:function(){var e=this.getPoints(),t=lo(e,2),n=t[0],r=t[1],o=n.angleTo(r);return[[n,o],[r,o]]}}]),t}(Hd),qd=function(e){function t(e,r,a){var o;return Fi(this,t),o=n.call(this,e,r,a),o.type=\"polyline\",o.points=[],o.points=_c.parsePath(o.getAttribute(\"points\").getString()),o}ou(t,e);var n=Ce(t);return ji(t,[{key:\"path\",value:function(e){var t=this.points,n=lo(t,1),r=n[0],a=r.x,o=r.y,i=new Od(a,o);return e&&(e.beginPath(),e.moveTo(a,o)),t.forEach(function(t){var n=t.x,r=t.y;i.addPoint(n,r),e&&e.lineTo(n,r)}),i}},{key:\"getMarkers\",value:function(){var e=this.points,t=e.length-1,n=[];return e.forEach(function(r,a){a===t||n.push([r,r.angleTo(e[a+1])])}),0<n.length&&n.push([e[e.length-1],n[n.length-1][1]]),n}}]),t}(Hd),Qd=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"polygon\",e}ou(t,e);var n=Oe(t);return ji(t,[{key:\"path\",value:function(e){var n=pd(cu(t.prototype),\"path\",this).call(this,e),r=lo(this.points,1),a=r[0],o=a.x,i=a.y;return e&&(e.lineTo(o,i),e.closePath()),n}}]),t}(qd),Kd=Yn.f;qr({target:\"Reflect\",stat:!0},{deleteProperty:function(e,t){var n=Kd($n(e),t);return(!n||n.configurable)&&delete e[t]}});var Zd=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"pattern\",e}ou(t,e);var n=Le(t);return ji(t,[{key:\"createPattern\",value:function(e,t,n){var r=this.getAttribute(\"width\").getPixels(\"x\",!0),a=this.getAttribute(\"height\").getPixels(\"y\",!0),o=new Ud(this.document,null);o.attributes.viewBox=new Mc(this.document,\"viewBox\",this.getAttribute(\"viewBox\").getValue()),o.attributes.width=new Mc(this.document,\"width\",\"\".concat(r,\"px\")),o.attributes.height=new Mc(this.document,\"height\",\"\".concat(a,\"px\")),o.attributes.transform=new Mc(this.document,\"transform\",this.getAttribute(\"patternTransform\").getValue()),o.children=this.children;var i=this.document.createCanvas(r,a),l=i.getContext(\"2d\"),s=this.getAttribute(\"x\"),c=this.getAttribute(\"y\");s.hasValue()&&c.hasValue()&&l.translate(s.getPixels(\"x\",!0),c.getPixels(\"y\",!0)),n.hasValue()?this.styles[\"fill-opacity\"]=n:Reflect.deleteProperty(this.styles,\"fill-opacity\");for(var u=-1;1>=u;u++)for(var d=-1;1>=d;d++)l.save(),o.attributes.x=new Mc(this.document,\"x\",u*i.width),o.attributes.y=new Mc(this.document,\"y\",d*i.height),o.render(l),l.restore();var g=e.createPattern(i,\"repeat\");return g}}]),t}(td),Jd=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"marker\",e}ou(t,e);var n=Ie(t);return ji(t,[{key:\"render\",value:function(e,t,n){if(t){var r=t.x,a=t.y,o=this.getAttribute(\"orient\").getValue(\"auto\"),i=this.getAttribute(\"markerUnits\").getValue(\"strokeWidth\");e.translate(r,a),\"auto\"===o&&e.rotate(n),\"strokeWidth\"===i&&e.scale(e.lineWidth,e.lineWidth),e.save();var l=new Ud(this.document,null);l.type=this.type,l.attributes.viewBox=new Mc(this.document,\"viewBox\",this.getAttribute(\"viewBox\").getValue()),l.attributes.refX=new Mc(this.document,\"refX\",this.getAttribute(\"refX\").getValue()),l.attributes.refY=new Mc(this.document,\"refY\",this.getAttribute(\"refY\").getValue()),l.attributes.width=new Mc(this.document,\"width\",this.getAttribute(\"markerWidth\").getValue()),l.attributes.height=new Mc(this.document,\"height\",this.getAttribute(\"markerHeight\").getValue()),l.attributes.overflow=new Mc(this.document,\"overflow\",this.getAttribute(\"overflow\").getValue()),l.attributes.fill=new Mc(this.document,\"fill\",this.getAttribute(\"fill\").getValue(\"black\")),l.attributes.stroke=new Mc(this.document,\"stroke\",this.getAttribute(\"stroke\").getValue(\"none\")),l.children=this.children,l.render(e),e.restore(),\"strokeWidth\"===i&&e.scale(1/e.lineWidth,1/e.lineWidth),\"auto\"===o&&e.rotate(-n),e.translate(-r,-a)}}}]),t}(td),eg=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"defs\",e}ou(t,e);var n=Ne(t);return ji(t,[{key:\"render\",value:function(){}}]),t}(td),tg=function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e},ng=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"g\",e}ou(t,e);var n=Be(t);return ji(t,[{key:\"getBoundingBox\",value:function(e){var t=new Od;return this.children.forEach(function(n){t.addBoundingBox(n.getBoundingBox(e))}),t}}]),t}(_d),rg=function(e){function t(e,r,a){var o;Fi(this,t),o=n.call(this,e,r,a),o.attributesToInherit=[\"gradientUnits\"],o.stops=[];var i=tg(o),l=i.stops,s=i.children;return s.forEach(function(e){\"stop\"===e.type&&l.push(e)}),o}ou(t,e);var n=ze(t);return ji(t,[{key:\"getGradientUnits\",value:function(){return this.getAttribute(\"gradientUnits\").getString(\"objectBoundingBox\")}},{key:\"createGradient\",value:function(e,t,n){var r=this,a=this;this.getHrefAttribute().hasValue()&&(a=this.getHrefAttribute().getDefinition(),this.inheritStopContainer(a));var o=a,i=o.stops,l=this.getGradient(e,t);if(!l)return this.addParentOpacity(n,i[i.length-1].color);if(i.forEach(function(e){l.addColorStop(e.offset,r.addParentOpacity(n,e.color))}),this.getAttribute(\"gradientTransform\").hasValue()){var s=this.document,c=s.screen,u=c.MAX_VIRTUAL_PIXELS,d=c.viewPort,g=lo(d.viewPorts,1),p=g[0],y=new Yd(s,null);y.attributes.x=new Mc(s,\"x\",-u/3),y.attributes.y=new Mc(s,\"y\",-u/3),y.attributes.width=new Mc(s,\"width\",u),y.attributes.height=new Mc(s,\"height\",u);var h=new ng(s,null);h.attributes.transform=new Mc(s,\"transform\",this.getAttribute(\"gradientTransform\").getValue()),h.children=[y];var f=new Ud(s,null);f.attributes.x=new Mc(s,\"x\",0),f.attributes.y=new Mc(s,\"y\",0),f.attributes.width=new Mc(s,\"width\",p.width),f.attributes.height=new Mc(s,\"height\",p.height),f.children=[h];var m=s.createCanvas(p.width,p.height),x=m.getContext(\"2d\");return x.fillStyle=l,f.render(x),x.createPattern(m,\"no-repeat\")}return l}},{key:\"inheritStopContainer\",value:function(e){var t=this;this.attributesToInherit.forEach(function(n){!t.getAttribute(n).hasValue()&&e.getAttribute(n).hasValue()&&t.getAttribute(n,!0).setValue(e.getAttribute(n).getValue())})}},{key:\"addParentOpacity\",value:function(e,t){if(e.hasValue()){var n=new Mc(this.document,\"color\",t);return n.addOpacity(e).getString()}return t}}]),t}(td),ag=function(e){function t(e,r,a){var o;return Fi(this,t),o=n.call(this,e,r,a),o.type=\"linearGradient\",o.attributesToInherit.push(\"x1\",\"y1\",\"x2\",\"y2\"),o}ou(t,e);var n=je(t);return ji(t,[{key:\"getGradient\",value:function(e,t){var n=\"objectBoundingBox\"===this.getGradientUnits()?t.getBoundingBox(e):null;this.getAttribute(\"x1\").hasValue()||this.getAttribute(\"y1\").hasValue()||this.getAttribute(\"x2\").hasValue()||this.getAttribute(\"y2\").hasValue()||(this.getAttribute(\"x1\",!0).setValue(0),this.getAttribute(\"y1\",!0).setValue(0),this.getAttribute(\"x2\",!0).setValue(1),this.getAttribute(\"y2\",!0).setValue(0));var r=\"objectBoundingBox\"===this.getGradientUnits()?n.x+n.width*this.getAttribute(\"x1\").getNumber():this.getAttribute(\"x1\").getPixels(\"x\"),a=\"objectBoundingBox\"===this.getGradientUnits()?n.y+n.height*this.getAttribute(\"y1\").getNumber():this.getAttribute(\"y1\").getPixels(\"y\"),o=\"objectBoundingBox\"===this.getGradientUnits()?n.x+n.width*this.getAttribute(\"x2\").getNumber():this.getAttribute(\"x2\").getPixels(\"x\"),i=\"objectBoundingBox\"===this.getGradientUnits()?n.y+n.height*this.getAttribute(\"y2\").getNumber():this.getAttribute(\"y2\").getPixels(\"y\");return r===o&&a===i?null:e.createLinearGradient(r,a,o,i)}}]),t}(rg),og=function(e){function t(e,r,a){var o;return Fi(this,t),o=n.call(this,e,r,a),o.type=\"radialGradient\",o.attributesToInherit.push(\"cx\",\"cy\",\"r\",\"fx\",\"fy\",\"fr\"),o}ou(t,e);var n=He(t);return ji(t,[{key:\"getGradient\",value:function(e,t){var n=t.getBoundingBox(e);this.getAttribute(\"cx\").hasValue()||this.getAttribute(\"cx\",!0).setValue(\"50%\"),this.getAttribute(\"cy\").hasValue()||this.getAttribute(\"cy\",!0).setValue(\"50%\"),this.getAttribute(\"r\").hasValue()||this.getAttribute(\"r\",!0).setValue(\"50%\");var a=\"objectBoundingBox\"===this.getGradientUnits()?n.x+n.width*this.getAttribute(\"cx\").getNumber():this.getAttribute(\"cx\").getPixels(\"x\"),o=\"objectBoundingBox\"===this.getGradientUnits()?n.y+n.height*this.getAttribute(\"cy\").getNumber():this.getAttribute(\"cy\").getPixels(\"y\"),i=a,l=o;this.getAttribute(\"fx\").hasValue()&&(i=\"objectBoundingBox\"===this.getGradientUnits()?n.x+n.width*this.getAttribute(\"fx\").getNumber():this.getAttribute(\"fx\").getPixels(\"x\")),this.getAttribute(\"fy\").hasValue()&&(l=\"objectBoundingBox\"===this.getGradientUnits()?n.y+n.height*this.getAttribute(\"fy\").getNumber():this.getAttribute(\"fy\").getPixels(\"y\"));var s=\"objectBoundingBox\"===this.getGradientUnits()?(n.width+n.height)/2*this.getAttribute(\"r\").getNumber():this.getAttribute(\"r\").getPixels(),r=this.getAttribute(\"fr\").getPixels();return e.createRadialGradient(i,l,r,a,o,s)}}]),t}(rg),ig=function(e){function t(e,r,a){var o;Fi(this,t),o=n.call(this,e,r,a),o.type=\"stop\";var i=dn(0,gn(1,o.getAttribute(\"offset\").getNumber())),l=o.getStyle(\"stop-opacity\"),s=o.getStyle(\"stop-color\",!0);return\"\"===s.getString()&&s.setValue(\"#000\"),l.hasValue()&&(s=s.addOpacity(l)),o.offset=i,o.color=s.getString(),o}ou(t,e);var n=Ye(t);return t}(td),lg=\"Array Iterator\",sg=kr.set,cg=kr.getterFor(lg),ug=Hu(Array,\"Array\",function(e,t){sg(this,{type:lg,target:Dn(e),index:0,kind:t})},function(){var e=cg(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):\"keys\"==n?{value:r,done:!1}:\"values\"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},\"values\");hl.Arguments=hl.Array,pu(\"keys\"),pu(\"values\"),pu(\"entries\");var dg=kr.set,gg=kr.getterFor(\"Array Iterator\"),pg=Hu(Array,\"Array\",function(e,t){dg(this,{type:\"Array Iterator\",target:Dn(e),index:0,kind:t})},function(){var e=gg(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):\"keys\"==n?{value:r,done:!1}:\"values\"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},\"values\");hl.Arguments=hl.Array,pu(\"keys\"),pu(\"values\"),pu(\"entries\");var yg=oa(\"iterator\"),hg=oa(\"toStringTag\"),fg=pg.values;for(var mg in Li){var xg=Sn[mg],bg=xg&&xg.prototype;if(bg){if(bg[yg]!==fg)try{Qn(bg,yg,fg)}catch(e){bg[yg]=fg}if(bg[hg]||Qn(bg,hg,mg),Li[mg])for(var vg in pg)if(bg[vg]!==pg[vg])try{Qn(bg,vg,pg[vg])}catch(e){bg[vg]=pg[vg]}}}var Sg=function(e){function t(e,r,a){var o;return Fi(this,t),o=n.call(this,e,r,a),o.type=\"animate\",o.duration=0,o.initialValue=null,o.initialUnits=\"\",o.removed=!1,o.frozen=!1,e.screen.animations.push(tg(o)),o.begin=o.getAttribute(\"begin\").getMilliseconds(),o.maxDuration=o.begin+o.getAttribute(\"dur\").getMilliseconds(),o.from=o.getAttribute(\"from\"),o.to=o.getAttribute(\"to\"),o.values=o.getAttribute(\"values\"),o.values.hasValue()&&o.values.setValue(o.values.getString().split(\";\")),o}ou(t,e);var n=We(t);return ji(t,[{key:\"getProperty\",value:function(){var e=this.getAttribute(\"attributeType\").getString(),t=this.getAttribute(\"attributeName\").getString();return\"CSS\"===e?this.parent.getStyle(t,!0):this.parent.getAttribute(t,!0)}},{key:\"calcValue\",value:function(){var e=this.initialUnits,t=this.getProgress(),n=t.progress,r=t.from,a=t.to,o=r.getNumber()+(a.getNumber()-r.getNumber())*n;return\"%\"===e&&(o*=100),\"\".concat(o).concat(e)}},{key:\"update\",value:function(e){var t=this.parent,n=this.getProperty();if(this.initialValue||(this.initialValue=n.getString(),this.initialUnits=n.getUnits()),this.duration>this.maxDuration){var r=this.getAttribute(\"fill\").getString(\"remove\");if(\"indefinite\"===this.getAttribute(\"repeatCount\").getString()||\"indefinite\"===this.getAttribute(\"repeatDur\").getString())this.duration=0;else if(\"freeze\"===r&&!this.frozen)this.frozen=!0,t.animationFrozen=!0,t.animationFrozenValue=n.getString();else if(\"remove\"===r&&!this.removed)return this.removed=!0,n.setValue(t.animationFrozen?t.animationFrozenValue:this.initialValue),!0;return!1}this.duration+=e;var a=!1;if(this.begin<this.duration){var o=this.calcValue(),i=this.getAttribute(\"type\");if(i.hasValue()){var l=i.getString();o=\"\".concat(l,\"(\").concat(o,\")\")}n.setValue(o),a=!0}return a}},{key:\"getProgress\",value:function(){var e=this.document,t=this.values,n={progress:(this.duration-this.begin)/(this.maxDuration-this.begin)};if(t.hasValue()){var r=n.progress*(t.getValue().length-1),a=fn(r),o=pn(r);n.from=new Mc(e,\"from\",parseFloat(t.getValue()[a])),n.to=new Mc(e,\"to\",parseFloat(t.getValue()[o])),n.progress=(r-a)/(o-a)}else n.from=this.from,n.to=this.to;return n}}]),t}(td),kg=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"animateColor\",e}ou(t,e);var n=qe(t);return ji(t,[{key:\"calcValue\",value:function(){var e=this.getProgress(),t=e.progress,n=e.from,a=e.to,o=new Nc(n.getString()),i=new Nc(a.getString());if(o.ok&&i.ok){var l=o.r+(i.r-o.r)*t,r=o.g+(i.g-o.g)*t,s=o.b+(i.b-o.b)*t;return\"rgb(\".concat(parseInt(l,10),\", \").concat(parseInt(r,10),\", \").concat(parseInt(s,10),\")\")}return this.getAttribute(\"from\").getString()}}]),t}(Sg),Ag=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"animateTransform\",e}ou(t,e);var n=Ke(t);return ji(t,[{key:\"calcValue\",value:function(){var e=this.getProgress(),t=e.progress,n=e.from,r=e.to,a=l(n.getString()),o=l(r.getString()),i=a.map(function(e,n){var r=o[n];return e+(r-e)*t}).join(\" \");return i}}]),t}(Sg),Pg=qn.f,Eg=Sn.Symbol;if(An&&\"function\"==typeof Eg&&(!(\"description\"in Eg.prototype)||void 0!==Eg().description)){var Tg={},Cg=function(){var e=1>arguments.length||void 0===arguments[0]?void 0:arguments[0]+\"\",t=this instanceof Cg?new Eg(e):void 0===e?Eg():Eg(e);return\"\"===e&&(Tg[t]=!0),t};jr(Cg,Eg);var wg=Cg.prototype=Eg.prototype;wg.constructor=Cg;var Og=wg.toString,Vg=\"Symbol(test)\"==Eg(\"test\")+\"\";Pg(wg,\"description\",{configurable:!0,get:function(){var e=Nn(this)?this.valueOf():this,t=Og.call(e);if(_n(Tg,e))return\"\";var n=Vg?t.slice(7,-1):t.replace(/^Symbol\\((.*)\\)[^)]+$/,\"$1\");return\"\"===n?void 0:n}}),qr({global:!0,forced:!0},{Symbol:Cg})}zo(\"iterator\");var Lg=ba(\"slice\"),Rg=Aa(\"slice\",{ACCESSORS:!0,0:0,1:2}),Ig=oa(\"species\"),Dg=[].slice;qr({target:\"Array\",proto:!0,forced:!Lg||!Rg},{slice:function(e,t){var r=Dn(this),a=wr(r.length),o=Or(e,a),i=Or(void 0===t?a:t,a),l,s,c;if(Jr(r)&&(l=r.constructor,\"function\"==typeof l&&(l===Array||Jr(l.prototype))?l=void 0:Nn(l)&&(l=l[Ig],null===l&&(l=void 0)),l===Array||void 0===l))return Dg.call(r,o,i);for(s=new(void 0===l?Array:l)(dn(i-o,0)),c=0;o<i;o++,c++)o in r&&Oi(s,c,r[o]);return s.length=c,s}});var Ng=function(e){function t(e,r,a){var o;Fi(this,t),o=n.call(this,e,r,a),o.type=\"font\",o.glyphs={},o.horizAdvX=o.getAttribute(\"horiz-adv-x\").getNumber();var i=e.definitions,l=tg(o),s=l.children,c=Je(s),u;try{for(c.s();!(u=c.n()).done;){var d=u.value;switch(d.type){case\"font-face\":{o.fontFace=d;var g=d.getStyle(\"font-family\");g.hasValue()&&(i[g.getString()]=tg(o));break}case\"missing-glyph\":o.missingGlyph=d;break;case\"glyph\":{var p=d;p.arabicForm?(o.isRTL=!0,o.isArabic=!0,\"undefined\"==typeof o.glyphs[p.unicode]&&(o.glyphs[p.unicode]={}),o.glyphs[p.unicode][p.arabicForm]=p):o.glyphs[p.unicode]=p;break}default:}}}catch(e){c.e(e)}finally{c.f()}return o}ou(t,e);var n=nt(t);return ji(t,[{key:\"render\",value:function(){}}]),t}(td),Mg=function(e){function t(e,r,a){var o;return Fi(this,t),o=n.call(this,e,r,a),o.type=\"font-face\",o.ascent=o.getAttribute(\"ascent\").getNumber(),o.descent=o.getAttribute(\"descent\").getNumber(),o.unitsPerEm=o.getAttribute(\"units-per-em\").getNumber(),o}ou(t,e);var n=at(t);return t}(td),Bg=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"missing-glyph\",e.horizAdvX=0,e}ou(t,e);var n=it(t);return t}(Hd),_g=function(e){function t(e,r,a){var o;return Fi(this,t),o=n.call(this,e,r,a),o.type=\"glyph\",o.horizAdvX=o.getAttribute(\"horiz-adv-x\").getNumber(),o.unicode=o.getAttribute(\"unicode\").getString(),o.arabicForm=o.getAttribute(\"arabic-form\").getString(),o}ou(t,e);var n=st(t);return t}(Hd),zg=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"tref\",e}ou(t,e);var n=ut(t);return ji(t,[{key:\"getText\",value:function(){var e=this.getHrefAttribute().getDefinition();if(e){var t=e.children[0];if(t)return t.getText()}return\"\"}}]),t}(zd),Fg=function(e){function t(e,r,a){var o;Fi(this,t),o=n.call(this,e,r,a),o.type=\"a\";var i=r.childNodes,l=i[0],s=0<i.length&&Array.from(i).every(function(e){return 3===e.nodeType});return o.hasText=s,o.text=s?o.getTextFromNode(l):\"\",o}ou(t,e);var n=gt(t);return ji(t,[{key:\"getText\",value:function(){return this.text}},{key:\"renderChildren\",value:function(e){if(this.hasText){pd(cu(t.prototype),\"renderChildren\",this).call(this,e);var n=this.document,r=this.x,a=this.y,o=n.screen.mouse,i=new Mc(n,\"fontSize\",yd.parse(n.ctx.font).fontSize);o.isWorking()&&o.checkBoundingBox(this,new Od(r,a-i.getPixels(\"y\"),r+this.measureText(e),a))}else if(0<this.children.length){var l=new ng(this.document,null);l.children=this.children,l.parent=this,l.render(e)}}},{key:\"onClick\",value:function(){var e=this.document.window;e&&e.open(this.getHrefAttribute().getString())}},{key:\"onMouseMove\",value:function(){var e=this.document.ctx;e.canvas.style.cursor=\"pointer\"}}]),t}(zd),jg=!kn(function(){return Object.isExtensible(Object.preventExtensions({}))}),Gg=t(function(e){var t=qn.f,n=sr(\"meta\"),r=0,a=Object.isExtensible||function(){return!0},o=function(e){t(e,n,{value:{objectID:\"O\"+ ++r,weakData:{}}})},i=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!Nn(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!_n(e,n)){if(!a(e))return\"F\";if(!t)return\"E\";o(e)}return e[n].objectID},getWeakData:function(e,t){if(!_n(e,n)){if(!a(e))return!0;if(!t)return!1;o(e)}return e[n].weakData},onFreeze:function(e){return jg&&i.REQUIRED&&a(e)&&!_n(e,n)&&o(e),e}};dr[n]=!0}),Hg=Gg.REQUIRED,Ug=Gg.fastKey,Yg=Gg.getWeakData,$g=Gg.onFreeze,Wg=qn.f,Xg=Gg.fastKey,qg=kr.set,Qg=kr.getterFor,Kg=function(e,t,n){var r=-1!==e.indexOf(\"Map\"),a=-1!==e.indexOf(\"Weak\"),o=r?\"set\":\"add\",i=Sn[e],l=i&&i.prototype,s=i,c={},u=function(e){var t=l[e];Ar(l,e,\"add\"==e?function(e){return t.call(this,0===e?0:e),this}:\"delete\"==e?function(e){return(!a||Nn(e))&&t.call(this,0===e?0:e)}:\"get\"==e?function(e){return a&&!Nn(e)?void 0:t.call(this,0===e?0:e)}:\"has\"==e?function(e){return(!a||Nn(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(Wr(e,\"function\"!=typeof i||!(a||l.forEach&&!kn(function(){new i().entries().next()}))))s=n.getConstructor(t,e,r,o),Gg.REQUIRED=!0;else if(Wr(e,!0)){var d=new s,g=d[o](a?{}:-0,1)!=d,p=kn(function(){d.has(1)}),y=Cl(function(e){new i(e)}),h=!a&&kn(function(){for(var e=new i,t=5;t--;)e[o](t,t);return!e.has(-0)});y||(s=t(function(t,n){yl(t,s,e);var a=hd(new i,t,s);return null!=n&&kl(n,a[o],a,r),a}),s.prototype=l,l.constructor=s),(p||h)&&(u(\"delete\"),u(\"has\"),r&&u(\"get\")),(h||g)&&u(o),a&&l.clear&&delete l.clear}return c[e]=s,qr({global:!0,forced:s!=i},c),Go(s,e),a||n.setStrong(s,e,r),s}(\"Map\",function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},{getConstructor:function(e,t,n,r){var a=e(function(e,o){yl(e,a,t),qg(e,{type:t,index:Lo(null),first:void 0,last:void 0,size:0}),An||(e.size=0),null!=o&&kl(o,e[r],e,n)}),o=Qg(t),i=function(e,t,n){var r=o(e),a=l(e,t),i,s;return a?a.value=n:(r.last=a={index:s=Xg(t,!0),key:t,value:n,previous:i=r.last,next:void 0,removed:!1},!r.first&&(r.first=a),i&&(i.next=a),An?r.size++:e.size++,\"F\"!==s&&(r.index[s]=a)),e},l=function(e,t){var n=o(e),r=Xg(t),a;if(\"F\"!==r)return n.index[r];for(a=n.first;a;a=a.next)if(a.key==t)return a};return dl(a.prototype,{clear:function(){for(var e=this,t=o(e),n=t.index,r=t.first;r;)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete n[r.index],r=r.next;t.first=t.last=void 0,An?t.size=0:e.size=0},delete:function(e){var t=this,n=o(t),r=l(t,e);if(r){var a=r.next,i=r.previous;delete n.index[r.index],r.removed=!0,i&&(i.next=a),a&&(a.previous=i),n.first==r&&(n.first=a),n.last==r&&(n.last=i),An?n.size--:t.size--}return!!r},forEach:function(e){for(var t=o(this),n=Kr(e,1<arguments.length?arguments[1]:void 0,3),r;r=r?r.next:t.first;)for(n(r.value,r.key,this);r&&r.removed;)r=r.previous},has:function(e){return!!l(this,e)}}),dl(a.prototype,n?{get:function(e){var t=l(this,e);return t&&t.value},set:function(e,t){return i(this,0===e?0:e,t)}}:{add:function(e){return i(this,e=0===e?0:e,e)}}),An&&Wg(a.prototype,\"size\",{get:function(){return o(this).size}}),a},setStrong:function(e,t,n){var r=t+\" Iterator\",a=Qg(t),o=Qg(r);Hu(e,t,function(e,t){qg(this,{type:r,target:e,state:a(e),kind:t,last:void 0})},function(){for(var e=o(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?\"keys\"==t?{value:n.key,done:!1}:\"values\"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})},n?\"entries\":\"values\",!n,!0),pl(t)}}),Zg=function(e){function t(e,r,a){var o;Fi(this,t),o=n.call(this,e,r,a),o.type=\"textPath\",o.textWidth=0,o.textHeight=0,o.pathLength=-1,o.glyphInfo=null,o.letterSpacingCache=[],o.measuresCache=new Map([[\"\",0]]);var i=o.getHrefAttribute().getDefinition();return o.text=o.getTextFromNode(),o.dataArray=o.parsePathData(i),o}ou(t,e);var n=mt(t);return ji(t,[{key:\"getText\",value:function(){return this.text}},{key:\"path\",value:function(e){var t=this.dataArray;e&&e.beginPath(),t.forEach(function(t){var n=t.command,a=t.points;switch(n){case\"L\":e&&e.lineTo(a[0],a[1]);break;case\"M\":e&&e.moveTo(a[0],a[1]);break;case\"C\":e&&e.bezierCurveTo(a[0],a[1],a[2],a[3],a[4],a[5]);break;case\"Q\":e&&e.quadraticCurveTo(a[0],a[1],a[2],a[3]);break;case\"A\":{var o=a[0],i=a[1],l=a[2],s=a[3],c=a[4],u=a[5],d=a[6],g=a[7],p=l>s?l:s,r=l>s?1:l/s,y=l>s?s/l:1;e&&(e.translate(o,i),e.rotate(d),e.scale(r,y),e.arc(0,0,p,c,c+u,!!(1-g)),e.scale(1/r,1/y),e.rotate(-d),e.translate(-o,-i));break}case\"z\":e&&e.closePath();}})}},{key:\"renderChildren\",value:function(e){this.setTextData(e),e.save();var t=this.parent.getStyle(\"text-decoration\").getString(),n=this.getFontSize(),r=this.glyphInfo,a=e.fillStyle;\"underline\"===t&&e.beginPath(),r.forEach(function(a,o){var i=a.p0,l=a.p1,s=a.text;e.save(),e.translate(i.x,i.y),e.rotate(r[o].rotation),e.fillStyle&&e.fillText(s,0,0),e.strokeStyle&&e.strokeText(s,0,0),e.restore(),\"underline\"===t&&(0===o&&e.moveTo(i.x,i.y+n/8),e.lineTo(l.x,l.y+n/5))}),\"underline\"===t&&(e.lineWidth=n/20,e.strokeStyle=a,e.stroke(),e.closePath()),e.restore()}},{key:\"getLetterSpacingAt\",value:function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:0;return this.letterSpacingCache[e]||0}},{key:\"findSegmentToFitChar\",value:function(e,t,n,r,a,o,i,l){var s=o,c=this.measureText(e,i);\" \"===i&&\"justify\"===t&&n<r&&(c+=(r-n)/a),-1<l&&(s+=this.getLetterSpacingAt(l));var u=this.textHeight/20,d={p0:this.getEquidistantPointOnPath(s,u),p1:this.getEquidistantPointOnPath(s+c,u)};return s+=c,{offset:s,segment:d}}},{key:\"measureText\",value:function(e,t){var n=this.measuresCache,r=t||this.getText();if(n.has(r))return n.get(r);var a=this.measureTargetText(e,r);return n.set(r,a),a}},{key:\"setTextData\",value:function(e){var t=this;if(!this.glyphInfo){var n=this.getText(),r=n.split(\"\"),a=n.split(\" \").length-1,o=l(this.parent.getAttribute(\"dx\").getString(\"0\")),s=this.parent.getStyle(\"text-anchor\").getString(\"start\"),c=this.getStyle(\"letter-spacing\"),u=this.parent.getStyle(\"letter-spacing\"),d=0;c.hasValue()&&\"inherit\"!==c.getValue()?c.hasValue()&&\"initial\"!==c.getValue()&&\"unset\"!==c.getValue()&&(d=c.getPixels()):d=u.getPixels();var g=[],p=n.length;this.letterSpacingCache=g;for(var y=0;y<p;y++)g.push(\"undefined\"==typeof o[y]?d:o[y]);var h=g.reduce(function(e,t){return e+t||0},0);this.textWidth=this.measureText(e),this.textHeight=this.getFontSize();var f=dn(this.textWidth+h,0);this.glyphInfo=[];var m=this.getPathLength(),x=this.getStyle(\"startOffset\").getNumber(0)*m,b=0;(\"middle\"===s||\"center\"===s)&&(b=-f/2),(\"end\"===s||\"right\"===s)&&(b=-f),b+=x,r.forEach(function(n,o){var i=t.findSegmentToFitChar(e,s,f,m,a,b,n,o),l=i.offset,c=i.segment;if(b=l,c.p0&&c.p1){var u=t.getLineLength(c.p0.x,c.p0.y,c.p1.x,c.p1.y),d=t.getPointOnLine(0+u/2,c.p0.x,c.p0.y,c.p1.x,c.p1.y),g=ln(c.p1.y-c.p0.y,c.p1.x-c.p0.x);t.glyphInfo.push({transposeX:d.x,transposeY:d.y,text:r[o],p0:c.p0,p1:c.p1,rotation:g})}})}}},{key:\"parsePathData\",value:function(e){if(this.pathLength=-1,!e)return[];var t=[],n=e.pathParser;for(n.reset();!n.isEnd();){var r=n.current,a=r?r.x:0,o=r?r.y:0,i=\"\",l=[];n.nextCommand();var s=n.command.toUpperCase();switch(n.command){case\"M\":case\"m\":i=this.pathM(n,l);break;case\"L\":case\"l\":i=this.pathL(n,l);break;case\"H\":case\"h\":i=this.pathH(n,l);break;case\"V\":case\"v\":i=this.pathV(n,l);break;case\"C\":case\"c\":this.pathC(n,l);break;case\"S\":case\"s\":i=this.pathS(n,l);break;case\"Q\":case\"q\":this.pathQ(n,l);break;case\"T\":case\"t\":i=this.pathT(n,l);break;case\"A\":case\"a\":l=this.pathA(n);break;case\"Z\":case\"z\":n.current=n.start;}\"Z\"===s?t.push({command:\"z\",points:[],pathLength:0}):t.push({command:i||s,points:l,start:{x:a,y:o},pathLength:this.calcLength(a,o,i||s,l)})}return t}},{key:\"pathM\",value:function(e,t){var n=e.getAsCurrentPoint();for(t.push(n.x,n.y),e.start=e.current;!e.isCommandOrEnd();){var r=e.getAsCurrentPoint();return t.push(r.x,r.y),\"L\"}}},{key:\"pathL\",value:function(e,t){for(;!e.isCommandOrEnd();){var n=e.getAsCurrentPoint();t.push(n.x,n.y)}return\"L\"}},{key:\"pathH\",value:function(e,t){for(;!e.isCommandOrEnd();){var n=e.current,r=new _c((e.isRelativeCommand()?n.x:0)+e.getScalar(),n.y);t.push(r.x,r.y),e.current=r}return\"L\"}},{key:\"pathV\",value:function(e,t){for(;!e.isCommandOrEnd();){var n=e.current,r=new _c(n.x,(e.isRelativeCommand()?n.y:0)+e.getScalar());t.push(r.x,r.y),e.current=r}return\"L\"}},{key:\"pathC\",value:function(e,t){for(;!e.isCommandOrEnd();){var n=e.getPoint(),r=e.getAsControlPoint(),a=e.getAsCurrentPoint();t.push(n.x,n.y,r.x,r.y,a.x,a.y)}}},{key:\"pathS\",value:function(e,t){for(;!e.isCommandOrEnd();){var n=e.getReflectedControlPoint(),r=e.getAsControlPoint(),a=e.getAsCurrentPoint();t.push(n.x,n.y,r.x,r.y,a.x,a.y)}return\"C\"}},{key:\"pathQ\",value:function(e,t){for(;!e.isCommandOrEnd();){var n=e.getAsControlPoint(),r=e.getAsCurrentPoint();t.push(n.x,n.y,r.x,r.y)}}},{key:\"pathT\",value:function(e,t){for(;!e.isCommandOrEnd();){var n=e.getReflectedControlPoint();e.control=n;var r=e.getAsCurrentPoint();t.push(n.x,n.y,r.x,r.y)}return\"Q\"}},{key:\"pathA\",value:function(e){for(;!e.isCommandOrEnd();){var t=e.current,n=e.getScalar(),r=e.getScalar(),a=e.getScalar()*(sn/180),o=e.getScalar(),i=e.getScalar(),c=e.getAsCurrentPoint(),d=new _c(hn(a)*(t.x-c.x)/2+yn(a)*(t.y-c.y)/2,-yn(a)*(t.x-c.x)/2+hn(a)*(t.y-c.y)/2),g=xn(d.x,2)/xn(n,2)+xn(d.y,2)/xn(r,2);1<g&&(n*=mn(g),r*=mn(g));var l=(o===i?-1:1)*mn((xn(n,2)*xn(r,2)-xn(n,2)*xn(d.y,2)-xn(r,2)*xn(d.x,2))/(xn(n,2)*xn(d.y,2)+xn(r,2)*xn(d.x,2)));isNaN(l)&&(l=0);var p=new _c(l*n*d.y/r,l*-r*d.x/n),y=new _c((t.x+c.x)/2+hn(a)*p.x-yn(a)*p.y,(t.y+c.y)/2+yn(a)*p.x+hn(a)*p.y),h=S([1,0],[(d.x-p.x)/n,(d.y-p.y)/r]),f=[(d.x-p.x)/n,(d.y-p.y)/r],u=[(-d.x-p.x)/n,(-d.y-p.y)/r],m=S(f,u);return-1>=b(f,u)&&(m=sn),1<=b(f,u)&&(m=0),0===i&&0<m&&(m-=2*sn),1===i&&0>m&&(m+=2*sn),[y.x,y.y,n,r,h,m,a,i]}}},{key:\"calcLength\",value:function(e,n,r,a){var o=Math.abs,i=0,l=null,s=null,c=0;switch(r){case\"L\":return this.getLineLength(e,n,a[0],a[1]);case\"C\":for(i=0,l=this.getPointOnCubicBezier(0,e,n,a[0],a[1],a[2],a[3],a[4],a[5]),c=.01;1>=c;c+=.01)s=this.getPointOnCubicBezier(c,e,n,a[0],a[1],a[2],a[3],a[4],a[5]),i+=this.getLineLength(l.x,l.y,s.x,s.y),l=s;return i;case\"Q\":for(i=0,l=this.getPointOnQuadraticBezier(0,e,n,a[0],a[1],a[2],a[3]),c=.01;1>=c;c+=.01)s=this.getPointOnQuadraticBezier(c,e,n,a[0],a[1],a[2],a[3]),i+=this.getLineLength(l.x,l.y,s.x,s.y),l=s;return i;case\"A\":i=0;var u=a[4],d=a[5],g=a[4]+d,p=sn/180;if(o(u-g)<p&&(p=o(u-g)),l=this.getPointOnEllipticalArc(a[0],a[1],a[2],a[3],u,0),0>d)for(c=u-p;c>g;c-=p)s=this.getPointOnEllipticalArc(a[0],a[1],a[2],a[3],c,0),i+=this.getLineLength(l.x,l.y,s.x,s.y),l=s;else for(c=u+p;c<g;c+=p)s=this.getPointOnEllipticalArc(a[0],a[1],a[2],a[3],c,0),i+=this.getLineLength(l.x,l.y,s.x,s.y),l=s;return s=this.getPointOnEllipticalArc(a[0],a[1],a[2],a[3],g,0),i+=this.getLineLength(l.x,l.y,s.x,s.y),i;}return 0}},{key:\"getPointOnLine\",value:function(e,t,n,r,a){var o=5<arguments.length&&void 0!==arguments[5]?arguments[5]:t,i=6<arguments.length&&void 0!==arguments[6]?arguments[6]:n,l=(a-n)/(r-t+fo),s=mn(e*e/(1+l*l));r<t&&(s*=-1);var c=l*s,d=null;if(r===t)d={x:o,y:i+c};else if((i-n)/(o-t+fo)===l)d={x:o+s,y:i+c};else{var g=0,p=0,y=this.getLineLength(t,n,r,a);if(y<fo)return null;var h=(o-t)*(r-t)+(i-n)*(a-n);h/=y*y,g=t+h*(r-t),p=n+h*(a-n);var f=this.getLineLength(o,i,g,p),m=mn(e*e-f*f);s=mn(m*m/(1+l*l)),r<t&&(s*=-1),c=l*s,d={x:g+s,y:p+c}}return d}},{key:\"getPointOnPath\",value:function(e){var t=this.getPathLength(),n=0,r=null;if(-5e-5>e||e-5e-5>t)return null;var a=this.dataArray,o=yt(a),i;try{for(o.s();!(i=o.n()).done;){var l=i.value;if(l&&(5e-5>l.pathLength||n+l.pathLength+5e-5<e)){n+=l.pathLength;continue}var s=e-n,c=0;switch(l.command){case\"L\":r=this.getPointOnLine(s,l.start.x,l.start.y,l.points[0],l.points[1],l.start.x,l.start.y);break;case\"A\":var u=l.points[4],d=l.points[5],g=l.points[4]+d;if(c=u+s/l.pathLength*d,0>d&&c<g||0<=d&&c>g)break;r=this.getPointOnEllipticalArc(l.points[0],l.points[1],l.points[2],l.points[3],c,l.points[6]);break;case\"C\":c=s/l.pathLength,1<c&&(c=1),r=this.getPointOnCubicBezier(c,l.start.x,l.start.y,l.points[0],l.points[1],l.points[2],l.points[3],l.points[4],l.points[5]);break;case\"Q\":c=s/l.pathLength,1<c&&(c=1),r=this.getPointOnQuadraticBezier(c,l.start.x,l.start.y,l.points[0],l.points[1],l.points[2],l.points[3]);break;default:}if(r)return r;break}}catch(e){o.e(e)}finally{o.f()}return null}},{key:\"getLineLength\",value:function(e,t,n,r){return mn((n-e)*(n-e)+(r-t)*(r-t))}},{key:\"getPathLength\",value:function(){return-1===this.pathLength&&(this.pathLength=this.dataArray.reduce(function(e,t){return 0<t.pathLength?e+t.pathLength:e},0)),this.pathLength}},{key:\"getPointOnCubicBezier\",value:function(e,t,n,r,a,o,i,l,s){var c=l*k(e)+o*A(e)+r*P(e)+t*E(e),u=s*k(e)+i*A(e)+a*P(e)+n*E(e);return{x:c,y:u}}},{key:\"getPointOnQuadraticBezier\",value:function(e,t,n,r,a,o,i){var l=o*T(e)+r*C(e)+t*w(e),s=i*T(e)+a*C(e)+n*w(e);return{x:l,y:s}}},{key:\"getPointOnEllipticalArc\",value:function(e,t,n,r,a,o){var i=hn(o),l=yn(o),s={x:n*hn(a),y:r*yn(a)};return{x:e+(s.x*i-s.y*l),y:t+(s.x*l+s.y*i)}}},{key:\"buildEquidistantCache\",value:function(e,t){var n=this.getPathLength(),r=t||.25,a=e||n/100;if(!this.equidistantCache||this.equidistantCache.step!==a||this.equidistantCache.precision!==r){this.equidistantCache={step:a,precision:r,points:[]};for(var o=0,i=0;i<=n;i+=r){var c=this.getPointOnPath(i),u=this.getPointOnPath(i+r);c&&u&&(o+=this.getLineLength(c.x,c.y,u.x,u.y),o>=a&&(this.equidistantCache.points.push({x:c.x,y:c.y,distance:i}),o-=a))}}}},{key:\"getEquidistantPointOnPath\",value:function(e,t,n){if(this.buildEquidistantCache(t,n),0>e||5e-5<e-this.getPathLength())return null;var r=cn(e/this.getPathLength()*(this.equidistantCache.points.length-1));return this.equidistantCache.points[r]||null}}]),t}(zd),Jg=function(e){function t(e,r,a){var o;Fi(this,t),o=n.call(this,e,r,a),o.type=\"image\",o.loaded=!1;var i=o.getHrefAttribute().getString();if(!i)return su(o);var l=/\\.svg$/.test(i);return e.images.push(tg(o)),l?o.loadSvg(i):o.loadImage(i),o.isSvg=l,o}ou(t,e);var n=bt(t);return ji(t,[{key:\"loadImage\",value:function(){var e=_i(Mi.mark(function e(t){var n;return Mi.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this.document.createImage(t);case 3:n=e.sent,this.image=n,e.next=10;break;case 7:e.prev=7,e.t0=e[\"catch\"](0),console.error(\"ERROR: image \\\"\".concat(t,\"\\\" not found\"),e.t0);case 10:this.loaded=!0;case 11:case\"end\":return e.stop();}},e,this,[[0,7]])}));return function(){return e.apply(this,arguments)}}()},{key:\"loadSvg\",value:function(){var e=_i(Mi.mark(function e(t){var n,r;return Mi.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this.document.fetch(t);case 3:return n=e.sent,e.next=6,n.text();case 6:r=e.sent,this.image=r,e.next=13;break;case 10:e.prev=10,e.t0=e[\"catch\"](0),console.error(\"ERROR: image \\\"\".concat(t,\"\\\" not found\"),e.t0);case 13:this.loaded=!0;case 14:case\"end\":return e.stop();}},e,this,[[0,10]])}));return function(){return e.apply(this,arguments)}}()},{key:\"renderChildren\",value:function(e){var t=this.document,n=this.getAttribute(\"x\").getPixels(\"x\"),r=this.getAttribute(\"y\").getPixels(\"y\"),a=this.getAttribute(\"width\").getPixels(\"x\"),o=this.getAttribute(\"height\").getPixels(\"y\");if(a&&o){if(e.save(),this.isSvg)t.canvg.forkString(e,this.image,{ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0,ignoreClear:!0,offsetX:n,offsetY:r,scaleWidth:a,scaleHeight:o}).render();else{var i=this.image;e.translate(n,r),t.setViewBox({ctx:e,aspectRatio:this.getAttribute(\"preserveAspectRatio\").getString(),width:a,desiredWidth:i.width,height:o,desiredHeight:i.height}),this.loaded&&(\"undefined\"==typeof i.complete||i.complete)&&e.drawImage(i,0,0)}e.restore()}}},{key:\"getBoundingBox\",value:function(){var e=this.getAttribute(\"x\").getPixels(\"x\"),t=this.getAttribute(\"y\").getPixels(\"y\"),n=this.getAttribute(\"width\").getPixels(\"x\"),r=this.getAttribute(\"height\").getPixels(\"y\");return new Od(e,t,e+n,t+r)}}]),t}(_d),ep=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"symbol\",e}ou(t,e);var n=St(t);return ji(t,[{key:\"render\",value:function(){}}]),t}(_d),tp=function(){function e(t){Fi(this,e),this.document=t,this.loaded=!1,t.fonts.push(this)}return ji(e,[{key:\"load\",value:function(){var e=_i(Mi.mark(function e(t,n){var r,a,o;return Mi.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,r=this.document,e.next=4,r.canvg.parser.load(n);case 4:a=e.sent,o=a.getElementsByTagName(\"font\"),Array.from(o).forEach(function(e){var n=r.createElement(e);r.definitions[t]=n}),e.next=12;break;case 9:e.prev=9,e.t0=e[\"catch\"](0),console.error(\"ERROR: font \\\"\".concat(n,\"\\\" not found\"),e.t0);case 12:this.loaded=!0;case 13:case\"end\":return e.stop();}},e,this,[[0,9]])}));return function(){return e.apply(this,arguments)}}()}]),e}(),np=function(e){function t(e,a,o){var i;Fi(this,t),i=n.call(this,e,a,o),i.type=\"style\";var l=r(Array.from(a.childNodes).map(function(e){return e.data}).join(\"\").replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*\\/]|[\\r\\n])))*\\*+\\/)|(^[\\s]*\\/\\/.*)/gm,\"\")),s=l.split(\"}\");return s.forEach(function(t){var n=t.trim();if(n){var r=n.split(\"{\"),a=r[0].split(\",\"),o=r[1].split(\";\");a.forEach(function(t){var n=t.trim();if(n){var r=e.styles[n]||{};if(o.forEach(function(t){var n=t.indexOf(\":\"),a=t.substr(0,n).trim(),o=t.substr(n+1,t.length-n).trim();a&&o&&(r[a]=new Mc(e,a,o))}),e.styles[n]=r,e.stylesSpecificity[n]=h(n),\"@font-face\"===n){var a=r[\"font-family\"].getString().replace(/\"|'/g,\"\"),i=r.src.getString().split(\",\");i.forEach(function(t){if(0<t.indexOf(\"format(\\\"svg\\\")\")){var n=u(t);n&&new tp(e).load(a,n)}})}}})}}),i}ou(t,e);var n=At(t);return t}(td);np.parseExternalUrl=u;var rp=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"use\",e}ou(t,e);var n=Et(t);return ji(t,[{key:\"setContext\",value:function(e){pd(cu(t.prototype),\"setContext\",this).call(this,e);var n=this.getAttribute(\"x\"),r=this.getAttribute(\"y\");n.hasValue()&&e.translate(n.getPixels(\"x\"),0),r.hasValue()&&e.translate(0,r.getPixels(\"y\"))}},{key:\"path\",value:function(e){var t=this.element;t&&t.path(e)}},{key:\"renderChildren\",value:function(e){var t=this.document,n=this.element;if(n){var r=n;if(\"symbol\"===n.type&&(r=new Ud(t,null),r.attributes.viewBox=new Mc(t,\"viewBox\",n.getAttribute(\"viewBox\").getString()),r.attributes.preserveAspectRatio=new Mc(t,\"preserveAspectRatio\",n.getAttribute(\"preserveAspectRatio\").getString()),r.attributes.overflow=new Mc(t,\"overflow\",n.getAttribute(\"overflow\").getString()),r.children=n.children),\"svg\"===r.type){var a=this.getAttribute(\"width\"),o=this.getAttribute(\"height\");a.hasValue()&&(r.attributes.width=new Mc(t,\"width\",this.getAttribute(\"width\").getString())),o.hasValue()&&(r.attributes.height=new Mc(t,\"height\",o.getString()))}var i=r.parent;r.parent=null,r.render(e),r.parent=i}}},{key:\"getBoundingBox\",value:function(e){var t=this.element;return t?t.getBoundingBox(e):null}},{key:\"elementTransform\",value:function(){var e=this.document,t=this.element;return Bd.fromElement(e,t)}},{key:\"element\",get:function(){return this._element||(this._element=this.getHrefAttribute().getDefinition()),this._element}}]),t}(_d),ap=function(e){function t(e,r,o){var i;Fi(this,t),i=n.call(this,e,r,o),i.type=\"feColorMatrix\";var c=l(i.getAttribute(\"values\").getString());switch(i.getAttribute(\"type\").getString(\"matrix\")){case\"saturate\":{var u=c[0];c=[.213+.787*u,.715-.715*u,.072-.072*u,0,0,.213-.213*u,.715+.285*u,.072-.072*u,0,0,.213-.213*u,.715-.715*u,.072+.928*u,0,0,0,0,0,1,0,0,0,0,0,1];break}case\"hueRotate\":{var s=c[0]*sn/180;c=[m(s,.213,.787,-.213),m(s,.715,-.715,-.715),m(s,.072,-.072,.928),0,0,m(s,.213,-.213,.143),m(s,.715,.285,.14),m(s,.072,-.072,-.283),0,0,m(s,.213,-.213,-.787),m(s,.715,-.715,.715),m(s,.072,.928,.072),0,0,0,0,0,1,0,0,0,0,0,1];break}case\"luminanceToAlpha\":c=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,.2125,.7154,.0721,0,0,0,0,0,0,1];}return i.matrix=c,i.includeOpacity=i.getAttribute(\"includeOpacity\").hasValue(),i}ou(t,e);var n=Ct(t);return ji(t,[{key:\"apply\",value:function(e,t,n,o,i){for(var l=this.includeOpacity,s=this.matrix,c=e.getImageData(0,0,o,i),u=0;u<i;u++)for(var d=0;d<o;d++){var p=Ot(c.data,d,u,o,i,0),r=Ot(c.data,d,u,o,i,1),g=Ot(c.data,d,u,o,i,2),h=Ot(c.data,d,u,o,i,3),a=Lt(s,0,p)+Lt(s,1,r)+Lt(s,2,g)+Lt(s,3,h)+Lt(s,4,1),f=Lt(s,5,p)+Lt(s,6,r)+Lt(s,7,g)+Lt(s,8,h)+Lt(s,9,1),m=Lt(s,10,p)+Lt(s,11,r)+Lt(s,12,g)+Lt(s,13,h)+Lt(s,14,1),b=Lt(s,15,p)+Lt(s,16,r)+Lt(s,17,g)+Lt(s,18,h)+Lt(s,19,1);l&&(a=f=m=0,b*=h/255),Vt(c.data,d,u,o,i,0,a),Vt(c.data,d,u,o,i,1,f),Vt(c.data,d,u,o,i,2,m),Vt(c.data,d,u,o,i,3,b)}e.clearRect(0,0,o,i),e.putImageData(c,0,0)}}]),t}(td),op=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"mask\",e}ou(t,e);var n=c(t);return ji(t,[{key:\"apply\",value:function(e,t){var n=this.document,r=this.getAttribute(\"x\").getPixels(\"x\"),a=this.getAttribute(\"y\").getPixels(\"y\"),o=this.getAttribute(\"width\").getPixels(\"x\"),i=this.getAttribute(\"height\").getPixels(\"y\");if(!o&&!i){var l=new Od;this.children.forEach(function(t){l.addBoundingBox(t.getBoundingBox(e))}),r=fn(l.x1),a=fn(l.y1),o=fn(l.width),i=fn(l.height)}var s=t.getStyle(\"mask\").getString();t.getStyle(\"mask\").setValue(\"\");var u=n.createCanvas(r+o,a+i),d=u.getContext(\"2d\");n.screen.setDefaults(d),this.renderChildren(d);var g=new ap(n,{nodeType:1,childNodes:[],attributes:[{nodeName:\"type\",value:\"luminanceToAlpha\"},{nodeName:\"includeOpacity\",value:\"true\"}]});g.apply(d,0,0,r+o,a+i);var p=n.createCanvas(r+o,a+i),c=p.getContext(\"2d\");n.screen.setDefaults(c),t.render(c),c.globalCompositeOperation=\"destination-in\",c.fillStyle=d.createPattern(u,\"no-repeat\"),c.fillRect(0,0,r+o,a+i),e.fillStyle=c.createPattern(p,\"no-repeat\"),e.fillRect(0,0,r+o,a+i),t.getStyle(\"mask\").setValue(s)}},{key:\"render\",value:function(){}}]),t}(td),ip=Tr(\"Reflect\",\"apply\"),lp=Function.apply,sp=!kn(function(){ip(function(){})});qr({target:\"Reflect\",stat:!0,forced:sp},{apply:function(e,t,n){return Qr(e),$n(n),ip?ip(e,t,n):lp.call(e,t,n)}}),qr({target:\"Reflect\",stat:!0,sham:!Su},{getPrototypeOf:function(e){return Pu($n(e))}});var cp=function(){},up=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"clipPath\",e}ou(t,e);var n=Rt(t);return ji(t,[{key:\"apply\",value:function(e){var t=this.document,n=Reflect.getPrototypeOf(e),r=e.beginPath,a=e.closePath;n&&(n.beginPath=cp,n.closePath=cp),Reflect.apply(r,e,[]),this.children.forEach(function(r){if(\"undefined\"!=typeof r.path){var o=\"undefined\"==typeof r.elementTransform?null:r.elementTransform();o||(o=Bd.fromElement(t,r)),o&&o.apply(e),r.path(e),n&&(n.closePath=a),o&&o.unapply(e)}}),Reflect.apply(a,e,[]),e.clip(),n&&(n.beginPath=r,n.closePath=a)}},{key:\"render\",value:function(){}}]),t}(td),dp=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"filter\",e}ou(t,e);var n=Dt(t);return ji(t,[{key:\"apply\",value:function(e,t){var n=this.document,r=t.getBoundingBox(e),a=fn(r.x1),o=fn(r.y1),i=fn(r.width),l=fn(r.height),s=t.getStyle(\"filter\").getString();t.getStyle(\"filter\").setValue(\"\");var c=0,u=0;this.children.forEach(function(e){var t=e.extraFilterDistance||0;c=dn(c,t),u=dn(u,t)});var d=n.createCanvas(i+2*c,l+2*u),g=d.getContext(\"2d\");n.screen.setDefaults(g),g.translate(-a+c,-o+u),t.render(g),this.children.forEach(function(e){\"function\"==typeof e.apply&&e.apply(g,0,0,i+2*c,l+2*u)}),e.drawImage(d,0,0,i+2*c,l+2*u,a-c,o-u,i+2*c,l+2*u),t.getStyle(\"filter\",!0).setValue(s)}},{key:\"render\",value:function(){}}]),t}(td),gp=function(e){function t(e,r,a){var o;return Fi(this,t),o=n.call(this,e,r,a),o.type=\"feDropShadow\",o.addStylesFromStyleDefinition(),o}ou(t,e);var n=Mt(t);return ji(t,[{key:\"apply\",value:function(){}}]),t}(td),pp=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"feMorphology\",e}ou(t,e);var n=_t(t);return ji(t,[{key:\"apply\",value:function(){}}]),t}(td),yp=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"feComposite\",e}ou(t,e);var n=Ft(t);return ji(t,[{key:\"apply\",value:function(){}}]),t}(td),hp=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259],fp=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24],mp=function e(){Ht(this,e),this.r=0,this.g=0,this.b=0,this.a=0,this.next=null},xp=function(e){function t(e,r,a){var o;return Fi(this,t),o=n.call(this,e,r,a),o.type=\"feGaussianBlur\",o.blurRadius=fn(o.getAttribute(\"stdDeviation\").getNumber()),o.extraFilterDistance=o.blurRadius,o}ou(t,e);var n=Wt(t);return ji(t,[{key:\"apply\",value:function(e,t,n,r,a){var o=this.document,i=this.blurRadius,l=o.window?o.window.document.body:null,s=e.canvas;s.id=o.getUniqueId(),l&&(s.style.display=\"none\",l.appendChild(s)),Yt(s,t,n,r,a,i),l&&l.removeChild(s)}}]),t}(td),bp=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"title\",e}ou(t,e);var n=qt(t);return t}(td),vp=function(e){function t(){var e;return Fi(this,t),e=n.apply(this,arguments),e.type=\"desc\",e}ou(t,e);var n=Kt(t);return t}(td),Sp=function(){function e(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=n.rootEmSize,a=void 0===r?12:r,o=n.emSize,i=void 0===o?12:o,l=n.createCanvas,s=void 0===l?e.createCanvas:l,c=n.createImage,u=void 0===c?e.createImage:c;Fi(this,e),this.canvg=t,this.definitions={},this.styles={},this.stylesSpecificity={},this.images=[],this.fonts=[],this.emSizeStack=[],this.uniqueId=0,this.screen=t.screen,this.rootEmSize=a,this.emSize=i,this.createCanvas=s,this.createImage=u,this.screen.wait(this.isImagesLoaded.bind(this)),this.screen.wait(this.isFontsLoaded.bind(this))}return ji(e,[{key:\"popEmSize\",value:function(){var e=this.emSizeStack;e.pop()}},{key:\"getUniqueId\",value:function(){return\"canvg\".concat(++this.uniqueId)}},{key:\"isImagesLoaded\",value:function(){return this.images.every(function(e){return e.loaded})}},{key:\"isFontsLoaded\",value:function(){return this.fonts.every(function(e){return e.loaded})}},{key:\"createDocumentElement\",value:function(e){var t=this.createElement(e.documentElement);return t.root=!0,t.addStylesFromStyleDefinition(),this.documentElement=t,t}},{key:\"createElement\",value:function(t){var n=t.nodeName.replace(/^[^:]+:/,\"\"),r=e.elementTypes[n];return\"undefined\"==typeof r?new nd(this,t):new r(this,t)}},{key:\"createTextNode\",value:function(e){return new jd(this,e)}},{key:\"setViewBox\",value:function(e){this.screen.setViewBox(en({document:this},e))}},{key:\"window\",get:function(){return this.screen.window}},{key:\"fetch\",get:function(){return this.screen.fetch}},{key:\"ctx\",get:function(){return this.screen.ctx}},{key:\"emSize\",get:function(){var e=this.emSizeStack;return e[e.length-1]},set:function(e){var t=this.emSizeStack;t.push(e)}}]),e}();Sp.createCanvas=function(e,t){var n=document.createElement(\"canvas\");return n.width=e,n.height=t,n},Sp.createImage=tn,Sp.elementTypes={svg:Ud,rect:Yd,circle:$d,ellipse:Wd,line:Xd,polyline:qd,polygon:Qd,path:Hd,pattern:Zd,marker:Jd,defs:eg,linearGradient:ag,radialGradient:og,stop:ig,animate:Sg,animateColor:kg,animateTransform:Ag,font:Ng,\"font-face\":Mg,\"missing-glyph\":Bg,glyph:_g,text:zd,tspan:Fd,tref:zg,a:Fg,textPath:Zg,image:Jg,g:ng,symbol:ep,style:np,use:rp,mask:op,clipPath:up,filter:dp,feDropShadow:gp,feMorphology:pp,feComposite:yp,feColorMatrix:ap,feGaussianBlur:xp,title:bp,desc:vp};var kp=function(){function e(t,n){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};Fi(this,e),this.parser=new Yc(r),this.screen=new Gc(t,r),this.options=r;var a=new Sp(this,r),o=a.createDocumentElement(n);this.document=a,this.documentElement=o}return ji(e,[{key:\"fork\",value:function(t,n){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};return e.from(t,n,an({},this.options,{},r))}},{key:\"forkString\",value:function(t,n){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};return e.fromString(t,n,an({},this.options,{},r))}},{key:\"ready\",value:function(){return this.screen.ready()}},{key:\"isReady\",value:function(){return this.screen.isReady()}},{key:\"render\",value:function(){var e=_i(Mi.mark(function e(){var t=arguments,n;return Mi.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=0<t.length&&void 0!==t[0]?t[0]:{},this.start(an({enableRedraw:!0,ignoreAnimation:!0,ignoreMouse:!0},n)),e.next=4,this.ready();case 4:this.stop();case 5:case\"end\":return e.stop();}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:\"start\",value:function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=this.documentElement,n=this.screen,r=this.options;n.start(t,an({enableRedraw:!0},r,{},e))}},{key:\"stop\",value:function(){this.screen.stop()}},{key:\"resize\",value:function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:e,n=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2];this.documentElement.resize(e,t,n)}}],[{key:\"from\",value:function(){var t=_i(Mi.mark(function t(n,r){var a=arguments,o,i,l;return Mi.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return o=2<a.length&&void 0!==a[2]?a[2]:{},i=new Yc(o),t.next=4,i.parse(r);case 4:return l=t.sent,t.abrupt(\"return\",new e(n,l,o));case 6:case\"end\":return t.stop();}},t)}));return function(){return t.apply(this,arguments)}}()},{key:\"fromString\",value:function(t,n){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},a=new Yc(r),o=a.parseFromString(n);return new e(t,o,r)}}]),e}(),Ap=Object.freeze({__proto__:null,offscreen:function(){return{window:null,ignoreAnimation:!0,ignoreMouse:!0,createCanvas:function(e,t){return new OffscreenCanvas(e,t)},createImage:function(e){return _i(Mi.mark(function t(){var n,r,a;return Mi.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,fetch(e);case 2:return n=t.sent,t.next=5,n.blob();case 5:return r=t.sent,t.next=8,createImageBitmap(r);case 8:return a=t.sent,t.abrupt(\"return\",a);case 10:case\"end\":return t.stop();}},t)}))()}}},node:function(e){var t=e.DOMParser,n=e.canvas,r=e.fetch;return{window:null,ignoreAnimation:!0,ignoreMouse:!0,DOMParser:t,fetch:r,createCanvas:n.createCanvas,createImage:n.loadImage}}});e.AElement=Fg,e.AnimateColorElement=kg,e.AnimateElement=Sg,e.AnimateTransformElement=Ag,e.BoundingBox=Od,e.CB1=k,e.CB2=A,e.CB3=P,e.CB4=E,e.Canvg=kp,e.CircleElement=$d,e.ClipPathElement=up,e.DefsElement=eg,e.DescElement=vp,e.Document=Sp,e.Element=td,e.EllipseElement=Wd,e.FeColorMatrixElement=ap,e.FeCompositeElement=yp,e.FeDropShadowElement=gp,e.FeGaussianBlurElement=xp,e.FeMorphologyElement=pp,e.FilterElement=dp,e.Font=yd,e.FontElement=Ng,e.FontFaceElement=Mg,e.GElement=ng,e.GlyphElement=_g,e.GradientElement=rg,e.ImageElement=Jg,e.LineElement=Xd,e.LinearGradientElement=ag,e.MarkerElement=Jd,e.MaskElement=op,e.Matrix=Id,e.MissingGlyphElement=Bg,e.Mouse=zc,e.PSEUDO_ZERO=fo,e.Parser=Yc,e.PathElement=Hd,e.PathParser=Gd,e.PatternElement=Zd,e.Point=_c,e.PolygonElement=Qd,e.PolylineElement=qd,e.Property=Mc,e.QB1=T,e.QB2=C,e.QB3=w,e.RadialGradientElement=og,e.RectElement=Yd,e.RenderedElement=_d,e.Rotate=Ld,e.SVGElement=Ud,e.SVGFontLoader=tp,e.Scale=Rd,e.Screen=Gc,e.Skew=Dd,e.SkewX=Nd,e.SkewY=Md,e.StopElement=ig,e.StyleElement=np,e.SymbolElement=ep,e.TRefElement=zg,e.TSpanElement=Fd,e.TextElement=zd,e.TextPathElement=Zg,e.TitleElement=bp,e.Transform=Bd,e.Translate=Vd,e.UnknownElement=nd,e.UseElement=rp,e.ViewPort=Bc,e.compressSpaces=r,e.default=kp,e.getSelectorSpecificity=h,e.normalizeAttributeName=s,e.parseExternalUrl=u,e.presets=Ap,e.toNumbers=l,e.trimLeft=a,e.trimRight=o,e.vectorMagnitude=x,e.vectorsAngle=S,e.vectorsRatio=b,Object.defineProperty(e,\"__esModule\",{value:!0})});\n//# sourceMappingURL=umd.js.map\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/images/ComponentmeasuresForSimulation.txt",
    "content": "Component   \t MinVol\t\tMaxVol\t\tMinCurrent\t\tMaxCurrent\n\nBuzzer\t\t4V\t\t8V\t\t\t\t\t0.03A or <30mA\n\nArduinoUNO R3\t7V\t\t12V\t\t\t\t\t40 mA DC (50 mA DC on 3.3V pin)\n\nTMP36 sensor\t35V\t\t-0.2V\t\t\t\t\t10mA\n\nUltraSonic\t\t\t5V\t\t\t\t\t<15mA\n\nPIR Sensor\t4V\t\t12V\t\t\t\t\tless than 60 micro-Amps.\n\nGasSenso\t0V\t\t5V\t\t\t\t\t65mA\n\nPontientiometer\t\t\t200Vdc\t\t\t\t\t20 mA.\n\nPushButton\t\t\t24V DC\t\t\t\t\t50mA\n\nSlideSwitch\t\t\t12 V DC\t\t\t\t\t200 mA\n\nL298N\t\t5V\t\t35V\t\t0mA\t\t\t36mA\n\nServoMeter\t4.8V\t\t5V\t\t100mA\t\t\t700mA\n\nLED\t\t3V DC\t\t5V DC\t\t\t\t\t20mA\n\nRGBLED\t\t3V DC\t\t5V DC\t\t\t\t\t6mA\n\nLCD(16X2)\t3V\t\t5V\t\t\t\t\t1mA\n\n7SegementModule\t3V\t\t5V\t\t\t\t\t30mA/segment\n\nRelay /module\t\t\t70VDC/50VAC\t10mA\n\nBattery 9V\t-\t\t9V\t\t\t\t\t400-600 mAh\n\nCoincell\t-\t\t3V\t\t\t\t\t240mAh @ 190�A\n\nDC Motor\t4.5V\t\t9V\t\t\t\t\t70mA\n\n\n\n\n\n\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/images/RGB CODE.txt",
    "content": "5 Strip\n1-Digit \n\nColor\t\tRGB\t\t\tHEX\n1 Brown\t\trgb(165,42,42)\t\t#A52A2A\n2 Red\t\trgb(255,0,0)\t\t#FF0000\n3 Orange\trgb(255,165,0)\t\t#FFA500\n4 Yellow\trgb(255,255,0)\t\t#FFFF00\n5 Green\t\trgb(0,128,0)\t\t#008000\n6 Blue\t\trgb(0,0,255)\t\t#0000FF\n7 Violet\trgb(75,0,130)\t\t#4B0082\n8 Gray\t\trgb(128,128,128)\t#808080\n9 White\t\trgb(255,255,255)\t#FFFFFF\n\n2-Digit\nColor\t\tRGB\t\t\tHEX\n0 Black\t\trgb(0,0,0)\t\t#000000\n1 Brown\t\trgb(165,42,42)\t\t#A52A2A\n2 Red\t\trgb(255,0,0)\t\t#FF0000\n3 Orange\trgb(255,165,0)\t\t#FFA500\n4 Yellow\trgb(255,255,0)\t\t#FFFF00\n5 Green\t\trgb(0,128,0)\t\t#008000\n6 Blue\t\trgb(0,0,255)\t\t#0000FF\n7 Violet\trgb(75,0,130)\t\t#4B0082\n8 Gray\t\trgb(128,128,128)\t#808080\n9 White\t\trgb(255,255,255)\t#FFFFFF\n\n\n3-Digit\nColor\t\tRGB\t\t\tHEX\n0 Black\t\trgb(0,0,0)\t\t#000000\n1 Brown\t\trgb(165,42,42)\t\t#A52A2A\n2 Red\t\trgb(255,0,0)\t\t#FF0000\n3 Orange\trgb(255,165,0)\t\t#FFA500\n4 Yellow\trgb(255,255,0)\t\t#FFFF00\n5 Green\t\trgb(0,128,0)\t\t#008000\n6 Blue\t\trgb(0,0,255)\t\t#0000FF\n7 Violet\trgb(75,0,130)\t\t#4B0082\n8 Gray\t\trgb(128,128,128)\t#808080\n9 White\t\trgb(255,255,255)\t#FFFFFF\n\n\n\nMultiplier\nColor\t\t\tRGB\t\t\tHEX\nx1    Black\t\trgb(0,0,0)\t\t#000000\nx10   Brown\t\trgb(165,42,42)\t\t#A52A2A\nx100  Red\t\trgb(255,0,0)\t\t#FF0000\nx1k   Orange\t\trgb(255,165,0)\t\t#FFA500\nx10k  Yellow\t\trgb(255,255,0)\t\t#FFFF00\nx100k Green\t\trgb(0,128,0)\t\t#008000\nx1M   Blue\t\trgb(0,0,255)\t\t#0000FF\nx10M  Violet\t\trgb(75,0,130)\t\t#4B0082\nx100M Gray\t\trgb(128,128,128)\t#808080\nx1G   White\t\trgb(255,255,255)\t#FFFFFF\n/10   Gold\t\trgb(255,215,0)\t\t#FFD700\n/100  Silver\t\trgb(192,192,192)\t#C0C0C0\n\nTolerance\nColor\t\t\tRGB\t\t\tHEX\n1%   Brown\t\trgb(165,42,42)\t\t#A52A2A\n2%   Red\t\trgb(255,0,0)\t\t#FF0000\n3%   Orange\t\trgb(255,165,0)\t\t#FFA500\n4%   Yellow\t\trgb(255,255,0)\t\t#FFFF00\n0.5% Green\t\trgb(0,128,0)\t\t#008000\n0.25% Blue\t\trgb(0,0,255)\t\t#0000FF\n0.10% Violet\t\trgb(75,0,130)\t\t#4B0082\n0.05% Gray\t\trgb(128,128,128)\t#808080\n5%   Gold\t\trgb(255,215,0)\t\t#FFD700\n10%  Silver\t\trgb(192,192,192)\t#C0C0C0\n\n\n6 Strip\n\nTempco\nColor\t\tRGB\t\t\tHEX\n100 Brown\trgb(165,42,42)\t\t#A52A2A\n50  Red\t\trgb(255,0,0)\t\t#FF0000\n15  Orange\trgb(255,165,0)\t\t#FFA500\n25  Yellow\trgb(255,255,0)\t\t#FFFF00\n10  Blue\trgb(0,0,255)\t\t#0000FF\n5   Violet\trgb(75,0,130)\t\t#4B0082\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/Arduino.json",
    "content": "{\n  \"name\": \"Arduino UNO R3\",\n  \"className\": \"ArduinoUno\",\n  \"pointHalf\": 4,\n  \"pins\": [\n    {\n      \"x\": 182,\n      \"y\": 26,\n      \"name\": \"AREF\"\n    },\n    {\n      \"x\": 198,\n      \"y\": 26,\n      \"name\": \"GND\"\n    },\n    {\n      \"x\": 212,\n      \"y\": 26,\n      \"name\": \"D13\"\n    },\n    {\n      \"x\": 226,\n      \"y\": 26,\n      \"name\": \"D12\"\n    },\n    {\n      \"x\": 240,\n      \"y\": 26,\n      \"name\": \"D11\"\n    },\n    {\n      \"x\": 254,\n      \"y\": 26,\n      \"name\": \"D10\"\n    },\n    {\n      \"x\": 270,\n      \"y\": 26,\n      \"name\": \"D9\"\n    },\n    {\n      \"x\": 284,\n      \"y\": 26,\n      \"name\": \"D8\"\n    },\n    {\n      \"x\": 308,\n      \"y\": 26,\n      \"name\": \"D7\"\n    },\n    {\n      \"x\": 322,\n      \"y\": 26,\n      \"name\": \"D6\"\n    },\n    {\n      \"x\": 336,\n      \"y\": 26,\n      \"name\": \"D5\"\n    },\n    {\n      \"x\": 350,\n      \"y\": 26,\n      \"name\": \"D4\"\n    },\n    {\n      \"x\": 364,\n      \"y\": 26,\n      \"name\": \"D3\"\n    },\n    {\n      \"x\": 378,\n      \"y\": 26,\n      \"name\": \"D2\"\n    },\n    {\n      \"x\": 394,\n      \"y\": 26,\n      \"name\": \"TX0\"\n    },\n    {\n      \"x\": 408,\n      \"y\": 26,\n      \"name\": \"RX0\"\n    },\n    {\n      \"x\": 234,\n      \"y\": 300,\n      \"name\": \"RESET\"\n    },\n    {\n      \"x\": 248,\n      \"y\": 300,\n      \"name\": \"3.3V\"\n    },\n    {\n      \"x\": 264,\n      \"y\": 300,\n      \"name\": \"5V\"\n    },\n    {\n      \"x\": 278,\n      \"y\": 300,\n      \"name\": \"GND\"\n    },\n    {\n      \"x\": 292,\n      \"y\": 300,\n      \"name\": \"GND\"\n    },\n    {\n      \"x\": 306,\n      \"y\": 300,\n      \"name\": \"VIN\"\n    },\n    {\n      \"x\": 336,\n      \"y\": 300,\n      \"name\": \"A0\"\n    },\n    {\n      \"x\": 350,\n      \"y\": 300,\n      \"name\": \"A1\"\n    },\n    {\n      \"x\": 364,\n      \"y\": 300,\n      \"name\": \"A2\"\n    },\n    {\n      \"x\": 378,\n      \"y\": 300,\n      \"name\": \"A3\"\n    },\n    {\n      \"x\": 392,\n      \"y\": 300,\n      \"name\": \"A4\"\n    },\n    {\n      \"x\": 408,\n      \"y\": 300,\n      \"name\": \"A5\"\n    }\n  ],\n  \"draw\": [\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/ArduinoUno.svg\",\n      \"width\": 456,\n      \"height\": 334,\n      \"x\": 0,\n      \"y\": 0\n    },\n    {\n      \"type\": \"rectangle\",\n      \"width\": 13,\n      \"height\": 7,\n      \"x\": 202,\n      \"y\": 81,\n      \"radius\": 0,\n      \"fill\": \"rgba(255,255,0,0.38297873)\"\n    },\n    {\n      \"type\": \"rectangle\",\n      \"width\": 13,\n      \"height\": 7,\n      \"x\": 380,\n      \"y\": 108,\n      \"radius\": 0,\n      \"fill\": \"rgba(0,255,0,0.38297873)\"\n    }\n  ],\n  \"simulation\": {},\n  \"info\": {\n    \"name\": \"Arduino UNO R3\",\n    \"image\": \"https://upload.wikimedia.org/wikipedia/commons/a/a6/Arduino_Uno_006.jpg\",\n    \"Datasheet\": \"https://www.farnell.com/datasheets/1682209.pdf\",\n    \"description\": \"This is the Arduino Uno R3. In addition to all the features of the previous board, the Uno now uses an ATmega16U2 instead of the 8U2 found on the Uno (or the FTDI found on previous generations). This allows for faster transfer rates and more memory. No drivers needed for Linux or Mac (inf file for Windows is needed and included in the Arduino IDE), and the ability to have the Uno show up as a keyboard, mouse, joystick, etc.\",\n    \"properties\": {\n      \"Microcontroller\": \"ATMega328P\",\n      \"Operating Voltage\": \"5V\",\n      \"Input Voltage(limits)\": \"6-20V(limits)\",\n      \"Input Voltage(recommended)\": \"7V to 12V(recommended)\",\n      \"DC Current per I/O Pin\": \"40 mA\",\n      \"DC Current for 3.3V Pin\": \"50 mA\",\n      \"Digital Pins\": \"14(of which 6 provide PWM output)\",\n      \"Analog Pins\": \"6\",\n      \"Flash Memory\": \"32KB of which 0.5 KB used by bootloader\",\n      \"SRAM\": \"2KB(ATmega328)\",\n      \"Clock Speed\": \"16MHz\",\n      \"EEPROM\": \"1 KB (ATmega328)\",\n      \"LED\": \"Inbuilt\",\n      \"isBreadBoardPlaceable\" : 0\n    }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/Battery9v.json",
    "content": "{\n    \"name\": \"Battery 9v\",\n    \"className\": \"Battery9v\",\n    \"pointHalf\": 4,\n    \"pins\": [\n        {\n            \"x\": -4,\n            \"y\": 27,\n            \"name\": \"Positive\"\n        },\n        {\n            \"x\": -4,\n            \"y\": 69,\n            \"name\": \"Negative\"\n        }\n    ],\n    \"draw\": [\n        {\n            \"type\": \"image\",\n            \"url\": \"assets/images/components/9vBattery.svg\",\n            \"width\": 179,\n            \"height\": 99,\n            \"x\": 0,\n            \"y\": 0\n        }\n    ],\n    \"simulation\": {},\n    \"info\": {\n        \"name\": \"9V 6F 22\",\n        \"image\": \"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Duracell_9_Volt_0849.jpg/323px-Duracell_9_Volt_0849.jpg\",\n        \"description\": \"It is an affordable, reliable, dedicated low-power solution to provide sufficient energy to your application. Ideally used in circuits with low power consumption so that it can work for longer durations.\",\n        \"properties\": {\n            \"Nominal Voltage(V) \": \"9V\",\n            \"Discharge Resistance(Ω)\": \"620\",\n            \"Cut-off Voltage(V)\": \"5.4\"\n        }\n    }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/Breadboard.json",
    "content": "  {\n  \"name\": \"Breadboard\",\n  \"className\": \"BreadBoard\",\n  \"pointHalf\": 4,\n  \"pins\": [\n    {\n       \"x\":15,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":15,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":15,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":15,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":30,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":30,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":30,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":30,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":45,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":45,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":45,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":45,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":60,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":60,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":60,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":60,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":75,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":75,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":75,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":75,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":108,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":108,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":108,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":108,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":123,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":123,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":123,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":123,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":138,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":138,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":138,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":138,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":153,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":153,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":153,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":153,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":168,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":168,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":168,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":168,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":201,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":201,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":201,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":201,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":216,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":216,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":216,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":216,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":231,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":231,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":231,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":231,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":246,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":246,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":246,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":246,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":261,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":261,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":261,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":261,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":294,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":294,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":294,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":294,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":309,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":309,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":309,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":309,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":324,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":324,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":324,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":324,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":339,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":339,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":339,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":339,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":354,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":354,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":354,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":354,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":387,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":387,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":387,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":387,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":402,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":402,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":402,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":402,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":417,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":417,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":417,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":417,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":432,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":432,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":432,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":432,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":447,\n       \"y\":18,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":447,\n       \"y\":33,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":447,\n       \"y\":288,\n       \"name\":\"+\"\n    },\n    {\n       \"x\":447,\n       \"y\":303,\n       \"name\":\"-\"\n    },\n    {\n       \"x\":15,\n       \"y\":67.5,\n       \"name\":\"a1\"\n    },\n    {\n       \"x\":15,\n       \"y\":187.5,\n       \"name\":\"f1\"\n    },\n    {\n       \"x\":30,\n       \"y\":67.5,\n       \"name\":\"a2\"\n    },\n    {\n       \"x\":30,\n       \"y\":187.5,\n       \"name\":\"f2\"\n    },\n    {\n       \"x\":45,\n       \"y\":67.5,\n       \"name\":\"a3\"\n    },\n    {\n       \"x\":45,\n       \"y\":187.5,\n       \"name\":\"f3\"\n    },\n    {\n       \"x\":60,\n       \"y\":67.5,\n       \"name\":\"a4\"\n    },\n    {\n       \"x\":60,\n       \"y\":187.5,\n       \"name\":\"f4\"\n    },\n    {\n       \"x\":75,\n       \"y\":67.5,\n       \"name\":\"a5\"\n    },\n    {\n       \"x\":75,\n       \"y\":187.5,\n       \"name\":\"f5\"\n    },\n    {\n       \"x\":90,\n       \"y\":67.5,\n       \"name\":\"a6\"\n    },\n    {\n       \"x\":90,\n       \"y\":187.5,\n       \"name\":\"f6\"\n    },\n    {\n       \"x\":105,\n       \"y\":67.5,\n       \"name\":\"a7\"\n    },\n    {\n       \"x\":105,\n       \"y\":187.5,\n       \"name\":\"f7\"\n    },\n    {\n       \"x\":120,\n       \"y\":67.5,\n       \"name\":\"a8\"\n    },\n    {\n       \"x\":120,\n       \"y\":187.5,\n       \"name\":\"f8\"\n    },\n    {\n       \"x\":135,\n       \"y\":67.5,\n       \"name\":\"a9\"\n    },\n    {\n       \"x\":135,\n       \"y\":187.5,\n       \"name\":\"f9\"\n    },\n    {\n       \"x\":150,\n       \"y\":67.5,\n       \"name\":\"a10\"\n    },\n    {\n       \"x\":150,\n       \"y\":187.5,\n       \"name\":\"f10\"\n    },\n    {\n       \"x\":165,\n       \"y\":67.5,\n       \"name\":\"a11\"\n    },\n    {\n       \"x\":165,\n       \"y\":187.5,\n       \"name\":\"f11\"\n    },\n    {\n       \"x\":180,\n       \"y\":67.5,\n       \"name\":\"a12\"\n    },\n    {\n       \"x\":180,\n       \"y\":187.5,\n       \"name\":\"f12\"\n    },\n    {\n       \"x\":195,\n       \"y\":67.5,\n       \"name\":\"a13\"\n    },\n    {\n       \"x\":195,\n       \"y\":187.5,\n       \"name\":\"f13\"\n    },\n    {\n       \"x\":210,\n       \"y\":67.5,\n       \"name\":\"a14\"\n    },\n    {\n       \"x\":210,\n       \"y\":187.5,\n       \"name\":\"f14\"\n    },\n    {\n       \"x\":225,\n       \"y\":67.5,\n       \"name\":\"a15\"\n    },\n    {\n       \"x\":225,\n       \"y\":187.5,\n       \"name\":\"f15\"\n    },\n    {\n       \"x\":240,\n       \"y\":67.5,\n       \"name\":\"a16\"\n    },\n    {\n       \"x\":240,\n       \"y\":187.5,\n       \"name\":\"f16\"\n    },\n    {\n       \"x\":255,\n       \"y\":67.5,\n       \"name\":\"a17\"\n    },\n    {\n       \"x\":255,\n       \"y\":187.5,\n       \"name\":\"f17\"\n    },\n    {\n       \"x\":270,\n       \"y\":67.5,\n       \"name\":\"a18\"\n    },\n    {\n       \"x\":270,\n       \"y\":187.5,\n       \"name\":\"f18\"\n    },\n    {\n       \"x\":285,\n       \"y\":67.5,\n       \"name\":\"a19\"\n    },\n    {\n       \"x\":285,\n       \"y\":187.5,\n       \"name\":\"f19\"\n    },\n    {\n       \"x\":300,\n       \"y\":67.5,\n       \"name\":\"a20\"\n    },\n    {\n       \"x\":300,\n       \"y\":187.5,\n       \"name\":\"f20\"\n    },\n    {\n       \"x\":315,\n       \"y\":67.5,\n       \"name\":\"a21\"\n    },\n    {\n       \"x\":315,\n       \"y\":187.5,\n       \"name\":\"f21\"\n    },\n    {\n       \"x\":330,\n       \"y\":67.5,\n       \"name\":\"a22\"\n    },\n    {\n       \"x\":330,\n       \"y\":187.5,\n       \"name\":\"f22\"\n    },\n    {\n       \"x\":345,\n       \"y\":67.5,\n       \"name\":\"a23\"\n    },\n    {\n       \"x\":345,\n       \"y\":187.5,\n       \"name\":\"f23\"\n    },\n    {\n       \"x\":360,\n       \"y\":67.5,\n       \"name\":\"a24\"\n    },\n    {\n       \"x\":360,\n       \"y\":187.5,\n       \"name\":\"f24\"\n    },\n    {\n       \"x\":375,\n       \"y\":67.5,\n       \"name\":\"a25\"\n    },\n    {\n       \"x\":375,\n       \"y\":187.5,\n       \"name\":\"f25\"\n    },\n    {\n       \"x\":390,\n       \"y\":67.5,\n       \"name\":\"a26\"\n    },\n    {\n       \"x\":390,\n       \"y\":187.5,\n       \"name\":\"f26\"\n    },\n    {\n       \"x\":405,\n       \"y\":67.5,\n       \"name\":\"a27\"\n    },\n    {\n       \"x\":405,\n       \"y\":187.5,\n       \"name\":\"f27\"\n    },\n    {\n       \"x\":420,\n       \"y\":67.5,\n       \"name\":\"a28\"\n    },\n    {\n       \"x\":420,\n       \"y\":187.5,\n       \"name\":\"f28\"\n    },\n    {\n       \"x\":435,\n       \"y\":67.5,\n       \"name\":\"a29\"\n    },\n    {\n       \"x\":435,\n       \"y\":187.5,\n       \"name\":\"f29\"\n    },\n    {\n       \"x\":450,\n       \"y\":67.5,\n       \"name\":\"a30\"\n    },\n    {\n       \"x\":450,\n       \"y\":187.5,\n       \"name\":\"f30\"\n    },\n    {\n       \"x\":15,\n       \"y\":82.5,\n       \"name\":\"b1\"\n    },\n    {\n       \"x\":15,\n       \"y\":202.5,\n       \"name\":\"g1\"\n    },\n    {\n       \"x\":30,\n       \"y\":82.5,\n       \"name\":\"b2\"\n    },\n    {\n       \"x\":30,\n       \"y\":202.5,\n       \"name\":\"g2\"\n    },\n    {\n       \"x\":45,\n       \"y\":82.5,\n       \"name\":\"b3\"\n    },\n    {\n       \"x\":45,\n       \"y\":202.5,\n       \"name\":\"g3\"\n    },\n    {\n       \"x\":60,\n       \"y\":82.5,\n       \"name\":\"b4\"\n    },\n    {\n       \"x\":60,\n       \"y\":202.5,\n       \"name\":\"g4\"\n    },\n    {\n       \"x\":75,\n       \"y\":82.5,\n       \"name\":\"b5\"\n    },\n    {\n       \"x\":75,\n       \"y\":202.5,\n       \"name\":\"g5\"\n    },\n    {\n       \"x\":90,\n       \"y\":82.5,\n       \"name\":\"b6\"\n    },\n    {\n       \"x\":90,\n       \"y\":202.5,\n       \"name\":\"g6\"\n    },\n    {\n       \"x\":105,\n       \"y\":82.5,\n       \"name\":\"b7\"\n    },\n    {\n       \"x\":105,\n       \"y\":202.5,\n       \"name\":\"g7\"\n    },\n    {\n       \"x\":120,\n       \"y\":82.5,\n       \"name\":\"b8\"\n    },\n    {\n       \"x\":120,\n       \"y\":202.5,\n       \"name\":\"g8\"\n    },\n    {\n       \"x\":135,\n       \"y\":82.5,\n       \"name\":\"b9\"\n    },\n    {\n       \"x\":135,\n       \"y\":202.5,\n       \"name\":\"g9\"\n    },\n    {\n       \"x\":150,\n       \"y\":82.5,\n       \"name\":\"b10\"\n    },\n    {\n       \"x\":150,\n       \"y\":202.5,\n       \"name\":\"g10\"\n    },\n    {\n       \"x\":165,\n       \"y\":82.5,\n       \"name\":\"b11\"\n    },\n    {\n       \"x\":165,\n       \"y\":202.5,\n       \"name\":\"g11\"\n    },\n    {\n       \"x\":180,\n       \"y\":82.5,\n       \"name\":\"b12\"\n    },\n    {\n       \"x\":180,\n       \"y\":202.5,\n       \"name\":\"g12\"\n    },\n    {\n       \"x\":195,\n       \"y\":82.5,\n       \"name\":\"b13\"\n    },\n    {\n       \"x\":195,\n       \"y\":202.5,\n       \"name\":\"g13\"\n    },\n    {\n       \"x\":210,\n       \"y\":82.5,\n       \"name\":\"b14\"\n    },\n    {\n       \"x\":210,\n       \"y\":202.5,\n       \"name\":\"g14\"\n    },\n    {\n       \"x\":225,\n       \"y\":82.5,\n       \"name\":\"b15\"\n    },\n    {\n       \"x\":225,\n       \"y\":202.5,\n       \"name\":\"g15\"\n    },\n    {\n       \"x\":240,\n       \"y\":82.5,\n       \"name\":\"b16\"\n    },\n    {\n       \"x\":240,\n       \"y\":202.5,\n       \"name\":\"g16\"\n    },\n    {\n       \"x\":255,\n       \"y\":82.5,\n       \"name\":\"b17\"\n    },\n    {\n       \"x\":255,\n       \"y\":202.5,\n       \"name\":\"g17\"\n    },\n    {\n       \"x\":270,\n       \"y\":82.5,\n       \"name\":\"b18\"\n    },\n    {\n       \"x\":270,\n       \"y\":202.5,\n       \"name\":\"g18\"\n    },\n    {\n       \"x\":285,\n       \"y\":82.5,\n       \"name\":\"b19\"\n    },\n    {\n       \"x\":285,\n       \"y\":202.5,\n       \"name\":\"g19\"\n    },\n    {\n       \"x\":300,\n       \"y\":82.5,\n       \"name\":\"b20\"\n    },\n    {\n       \"x\":300,\n       \"y\":202.5,\n       \"name\":\"g20\"\n    },\n    {\n       \"x\":315,\n       \"y\":82.5,\n       \"name\":\"b21\"\n    },\n    {\n       \"x\":315,\n       \"y\":202.5,\n       \"name\":\"g21\"\n    },\n    {\n       \"x\":330,\n       \"y\":82.5,\n       \"name\":\"b22\"\n    },\n    {\n       \"x\":330,\n       \"y\":202.5,\n       \"name\":\"g22\"\n    },\n    {\n       \"x\":345,\n       \"y\":82.5,\n       \"name\":\"b23\"\n    },\n    {\n       \"x\":345,\n       \"y\":202.5,\n       \"name\":\"g23\"\n    },\n    {\n       \"x\":360,\n       \"y\":82.5,\n       \"name\":\"b24\"\n    },\n    {\n       \"x\":360,\n       \"y\":202.5,\n       \"name\":\"g24\"\n    },\n    {\n       \"x\":375,\n       \"y\":82.5,\n       \"name\":\"b25\"\n    },\n    {\n       \"x\":375,\n       \"y\":202.5,\n       \"name\":\"g25\"\n    },\n    {\n       \"x\":390,\n       \"y\":82.5,\n       \"name\":\"b26\"\n    },\n    {\n       \"x\":390,\n       \"y\":202.5,\n       \"name\":\"g26\"\n    },\n    {\n       \"x\":405,\n       \"y\":82.5,\n       \"name\":\"b27\"\n    },\n    {\n       \"x\":405,\n       \"y\":202.5,\n       \"name\":\"g27\"\n    },\n    {\n       \"x\":420,\n       \"y\":82.5,\n       \"name\":\"b28\"\n    },\n    {\n       \"x\":420,\n       \"y\":202.5,\n       \"name\":\"g28\"\n    },\n    {\n       \"x\":435,\n       \"y\":82.5,\n       \"name\":\"b29\"\n    },\n    {\n       \"x\":435,\n       \"y\":202.5,\n       \"name\":\"g29\"\n    },\n    {\n       \"x\":450,\n       \"y\":82.5,\n       \"name\":\"b30\"\n    },\n    {\n       \"x\":450,\n       \"y\":202.5,\n       \"name\":\"g30\"\n    },\n    {\n       \"x\":15,\n       \"y\":97.5,\n       \"name\":\"c1\"\n    },\n    {\n       \"x\":15,\n       \"y\":217.5,\n       \"name\":\"h1\"\n    },\n    {\n       \"x\":30,\n       \"y\":97.5,\n       \"name\":\"c2\"\n    },\n    {\n       \"x\":30,\n       \"y\":217.5,\n       \"name\":\"h2\"\n    },\n    {\n       \"x\":45,\n       \"y\":97.5,\n       \"name\":\"c3\"\n    },\n    {\n       \"x\":45,\n       \"y\":217.5,\n       \"name\":\"h3\"\n    },\n    {\n       \"x\":60,\n       \"y\":97.5,\n       \"name\":\"c4\"\n    },\n    {\n       \"x\":60,\n       \"y\":217.5,\n       \"name\":\"h4\"\n    },\n    {\n       \"x\":75,\n       \"y\":97.5,\n       \"name\":\"c5\"\n    },\n    {\n       \"x\":75,\n       \"y\":217.5,\n       \"name\":\"h5\"\n    },\n    {\n       \"x\":90,\n       \"y\":97.5,\n       \"name\":\"c6\"\n    },\n    {\n       \"x\":90,\n       \"y\":217.5,\n       \"name\":\"h6\"\n    },\n    {\n       \"x\":105,\n       \"y\":97.5,\n       \"name\":\"c7\"\n    },\n    {\n       \"x\":105,\n       \"y\":217.5,\n       \"name\":\"h7\"\n    },\n    {\n       \"x\":120,\n       \"y\":97.5,\n       \"name\":\"c8\"\n    },\n    {\n       \"x\":120,\n       \"y\":217.5,\n       \"name\":\"h8\"\n    },\n    {\n       \"x\":135,\n       \"y\":97.5,\n       \"name\":\"c9\"\n    },\n    {\n       \"x\":135,\n       \"y\":217.5,\n       \"name\":\"h9\"\n    },\n    {\n       \"x\":150,\n       \"y\":97.5,\n       \"name\":\"c10\"\n    },\n    {\n       \"x\":150,\n       \"y\":217.5,\n       \"name\":\"h10\"\n    },\n    {\n       \"x\":165,\n       \"y\":97.5,\n       \"name\":\"c11\"\n    },\n    {\n       \"x\":165,\n       \"y\":217.5,\n       \"name\":\"h11\"\n    },\n    {\n       \"x\":180,\n       \"y\":97.5,\n       \"name\":\"c12\"\n    },\n    {\n       \"x\":180,\n       \"y\":217.5,\n       \"name\":\"h12\"\n    },\n    {\n       \"x\":195,\n       \"y\":97.5,\n       \"name\":\"c13\"\n    },\n    {\n       \"x\":195,\n       \"y\":217.5,\n       \"name\":\"h13\"\n    },\n    {\n       \"x\":210,\n       \"y\":97.5,\n       \"name\":\"c14\"\n    },\n    {\n       \"x\":210,\n       \"y\":217.5,\n       \"name\":\"h14\"\n    },\n    {\n       \"x\":225,\n       \"y\":97.5,\n       \"name\":\"c15\"\n    },\n    {\n       \"x\":225,\n       \"y\":217.5,\n       \"name\":\"h15\"\n    },\n    {\n       \"x\":240,\n       \"y\":97.5,\n       \"name\":\"c16\"\n    },\n    {\n       \"x\":240,\n       \"y\":217.5,\n       \"name\":\"h16\"\n    },\n    {\n       \"x\":255,\n       \"y\":97.5,\n       \"name\":\"c17\"\n    },\n    {\n       \"x\":255,\n       \"y\":217.5,\n       \"name\":\"h17\"\n    },\n    {\n       \"x\":270,\n       \"y\":97.5,\n       \"name\":\"c18\"\n    },\n    {\n       \"x\":270,\n       \"y\":217.5,\n       \"name\":\"h18\"\n    },\n    {\n       \"x\":285,\n       \"y\":97.5,\n       \"name\":\"c19\"\n    },\n    {\n       \"x\":285,\n       \"y\":217.5,\n       \"name\":\"h19\"\n    },\n    {\n       \"x\":300,\n       \"y\":97.5,\n       \"name\":\"c20\"\n    },\n    {\n       \"x\":300,\n       \"y\":217.5,\n       \"name\":\"h20\"\n    },\n    {\n       \"x\":315,\n       \"y\":97.5,\n       \"name\":\"c21\"\n    },\n    {\n       \"x\":315,\n       \"y\":217.5,\n       \"name\":\"h21\"\n    },\n    {\n       \"x\":330,\n       \"y\":97.5,\n       \"name\":\"c22\"\n    },\n    {\n       \"x\":330,\n       \"y\":217.5,\n       \"name\":\"h22\"\n    },\n    {\n       \"x\":345,\n       \"y\":97.5,\n       \"name\":\"c23\"\n    },\n    {\n       \"x\":345,\n       \"y\":217.5,\n       \"name\":\"h23\"\n    },\n    {\n       \"x\":360,\n       \"y\":97.5,\n       \"name\":\"c24\"\n    },\n    {\n       \"x\":360,\n       \"y\":217.5,\n       \"name\":\"h24\"\n    },\n    {\n       \"x\":375,\n       \"y\":97.5,\n       \"name\":\"c25\"\n    },\n    {\n       \"x\":375,\n       \"y\":217.5,\n       \"name\":\"h25\"\n    },\n    {\n       \"x\":390,\n       \"y\":97.5,\n       \"name\":\"c26\"\n    },\n    {\n       \"x\":390,\n       \"y\":217.5,\n       \"name\":\"h26\"\n    },\n    {\n       \"x\":405,\n       \"y\":97.5,\n       \"name\":\"c27\"\n    },\n    {\n       \"x\":405,\n       \"y\":217.5,\n       \"name\":\"h27\"\n    },\n    {\n       \"x\":420,\n       \"y\":97.5,\n       \"name\":\"c28\"\n    },\n    {\n       \"x\":420,\n       \"y\":217.5,\n       \"name\":\"h28\"\n    },\n    {\n       \"x\":435,\n       \"y\":97.5,\n       \"name\":\"c29\"\n    },\n    {\n       \"x\":435,\n       \"y\":217.5,\n       \"name\":\"h29\"\n    },\n    {\n       \"x\":450,\n       \"y\":97.5,\n       \"name\":\"c30\"\n    },\n    {\n       \"x\":450,\n       \"y\":217.5,\n       \"name\":\"h30\"\n    },\n    {\n       \"x\":15,\n       \"y\":112.5,\n       \"name\":\"d1\"\n    },\n    {\n       \"x\":15,\n       \"y\":232.5,\n       \"name\":\"i1\"\n    },\n    {\n       \"x\":30,\n       \"y\":112.5,\n       \"name\":\"d2\"\n    },\n    {\n       \"x\":30,\n       \"y\":232.5,\n       \"name\":\"i2\"\n    },\n    {\n       \"x\":45,\n       \"y\":112.5,\n       \"name\":\"d3\"\n    },\n    {\n       \"x\":45,\n       \"y\":232.5,\n       \"name\":\"i3\"\n    },\n    {\n       \"x\":60,\n       \"y\":112.5,\n       \"name\":\"d4\"\n    },\n    {\n       \"x\":60,\n       \"y\":232.5,\n       \"name\":\"i4\"\n    },\n    {\n       \"x\":75,\n       \"y\":112.5,\n       \"name\":\"d5\"\n    },\n    {\n       \"x\":75,\n       \"y\":232.5,\n       \"name\":\"i5\"\n    },\n    {\n       \"x\":90,\n       \"y\":112.5,\n       \"name\":\"d6\"\n    },\n    {\n       \"x\":90,\n       \"y\":232.5,\n       \"name\":\"i6\"\n    },\n    {\n       \"x\":105,\n       \"y\":112.5,\n       \"name\":\"d7\"\n    },\n    {\n       \"x\":105,\n       \"y\":232.5,\n       \"name\":\"i7\"\n    },\n    {\n       \"x\":120,\n       \"y\":112.5,\n       \"name\":\"d8\"\n    },\n    {\n       \"x\":120,\n       \"y\":232.5,\n       \"name\":\"i8\"\n    },\n    {\n       \"x\":135,\n       \"y\":112.5,\n       \"name\":\"d9\"\n    },\n    {\n       \"x\":135,\n       \"y\":232.5,\n       \"name\":\"i9\"\n    },\n    {\n       \"x\":150,\n       \"y\":112.5,\n       \"name\":\"d10\"\n    },\n    {\n       \"x\":150,\n       \"y\":232.5,\n       \"name\":\"i10\"\n    },\n    {\n       \"x\":165,\n       \"y\":112.5,\n       \"name\":\"d11\"\n    },\n    {\n       \"x\":165,\n       \"y\":232.5,\n       \"name\":\"i11\"\n    },\n    {\n       \"x\":180,\n       \"y\":112.5,\n       \"name\":\"d12\"\n    },\n    {\n       \"x\":180,\n       \"y\":232.5,\n       \"name\":\"i12\"\n    },\n    {\n       \"x\":195,\n       \"y\":112.5,\n       \"name\":\"d13\"\n    },\n    {\n       \"x\":195,\n       \"y\":232.5,\n       \"name\":\"i13\"\n    },\n    {\n       \"x\":210,\n       \"y\":112.5,\n       \"name\":\"d14\"\n    },\n    {\n       \"x\":210,\n       \"y\":232.5,\n       \"name\":\"i14\"\n    },\n    {\n       \"x\":225,\n       \"y\":112.5,\n       \"name\":\"d15\"\n    },\n    {\n       \"x\":225,\n       \"y\":232.5,\n       \"name\":\"i15\"\n    },\n    {\n       \"x\":240,\n       \"y\":112.5,\n       \"name\":\"d16\"\n    },\n    {\n       \"x\":240,\n       \"y\":232.5,\n       \"name\":\"i16\"\n    },\n    {\n       \"x\":255,\n       \"y\":112.5,\n       \"name\":\"d17\"\n    },\n    {\n       \"x\":255,\n       \"y\":232.5,\n       \"name\":\"i17\"\n    },\n    {\n       \"x\":270,\n       \"y\":112.5,\n       \"name\":\"d18\"\n    },\n    {\n       \"x\":270,\n       \"y\":232.5,\n       \"name\":\"i18\"\n    },\n    {\n       \"x\":285,\n       \"y\":112.5,\n       \"name\":\"d19\"\n    },\n    {\n       \"x\":285,\n       \"y\":232.5,\n       \"name\":\"i19\"\n    },\n    {\n       \"x\":300,\n       \"y\":112.5,\n       \"name\":\"d20\"\n    },\n    {\n       \"x\":300,\n       \"y\":232.5,\n       \"name\":\"i20\"\n    },\n    {\n       \"x\":315,\n       \"y\":112.5,\n       \"name\":\"d21\"\n    },\n    {\n       \"x\":315,\n       \"y\":232.5,\n       \"name\":\"i21\"\n    },\n    {\n       \"x\":330,\n       \"y\":112.5,\n       \"name\":\"d22\"\n    },\n    {\n       \"x\":330,\n       \"y\":232.5,\n       \"name\":\"i22\"\n    },\n    {\n       \"x\":345,\n       \"y\":112.5,\n       \"name\":\"d23\"\n    },\n    {\n       \"x\":345,\n       \"y\":232.5,\n       \"name\":\"i23\"\n    },\n    {\n       \"x\":360,\n       \"y\":112.5,\n       \"name\":\"d24\"\n    },\n    {\n       \"x\":360,\n       \"y\":232.5,\n       \"name\":\"i24\"\n    },\n    {\n       \"x\":375,\n       \"y\":112.5,\n       \"name\":\"d25\"\n    },\n    {\n       \"x\":375,\n       \"y\":232.5,\n       \"name\":\"i25\"\n    },\n    {\n       \"x\":390,\n       \"y\":112.5,\n       \"name\":\"d26\"\n    },\n    {\n       \"x\":390,\n       \"y\":232.5,\n       \"name\":\"i26\"\n    },\n    {\n       \"x\":405,\n       \"y\":112.5,\n       \"name\":\"d27\"\n    },\n    {\n       \"x\":405,\n       \"y\":232.5,\n       \"name\":\"i27\"\n    },\n    {\n       \"x\":420,\n       \"y\":112.5,\n       \"name\":\"d28\"\n    },\n    {\n       \"x\":420,\n       \"y\":232.5,\n       \"name\":\"i28\"\n    },\n    {\n       \"x\":435,\n       \"y\":112.5,\n       \"name\":\"d29\"\n    },\n    {\n       \"x\":435,\n       \"y\":232.5,\n       \"name\":\"i29\"\n    },\n    {\n       \"x\":450,\n       \"y\":112.5,\n       \"name\":\"d30\"\n    },\n    {\n       \"x\":450,\n       \"y\":232.5,\n       \"name\":\"i30\"\n    },\n    {\n       \"x\":15,\n       \"y\":127.5,\n       \"name\":\"e1\"\n    },\n    {\n       \"x\":15,\n       \"y\":247.5,\n       \"name\":\"j1\"\n    },\n    {\n       \"x\":30,\n       \"y\":127.5,\n       \"name\":\"e2\"\n    },\n    {\n       \"x\":30,\n       \"y\":247.5,\n       \"name\":\"j2\"\n    },\n    {\n       \"x\":45,\n       \"y\":127.5,\n       \"name\":\"e3\"\n    },\n    {\n       \"x\":45,\n       \"y\":247.5,\n       \"name\":\"j3\"\n    },\n    {\n       \"x\":60,\n       \"y\":127.5,\n       \"name\":\"e4\"\n    },\n    {\n       \"x\":60,\n       \"y\":247.5,\n       \"name\":\"j4\"\n    },\n    {\n       \"x\":75,\n       \"y\":127.5,\n       \"name\":\"e5\"\n    },\n    {\n       \"x\":75,\n       \"y\":247.5,\n       \"name\":\"j5\"\n    },\n    {\n       \"x\":90,\n       \"y\":127.5,\n       \"name\":\"e6\"\n    },\n    {\n       \"x\":90,\n       \"y\":247.5,\n       \"name\":\"j6\"\n    },\n    {\n       \"x\":105,\n       \"y\":127.5,\n       \"name\":\"e7\"\n    },\n    {\n       \"x\":105,\n       \"y\":247.5,\n       \"name\":\"j7\"\n    },\n    {\n       \"x\":120,\n       \"y\":127.5,\n       \"name\":\"e8\"\n    },\n    {\n       \"x\":120,\n       \"y\":247.5,\n       \"name\":\"j8\"\n    },\n    {\n       \"x\":135,\n       \"y\":127.5,\n       \"name\":\"e9\"\n    },\n    {\n       \"x\":135,\n       \"y\":247.5,\n       \"name\":\"j9\"\n    },\n    {\n       \"x\":150,\n       \"y\":127.5,\n       \"name\":\"e10\"\n    },\n    {\n       \"x\":150,\n       \"y\":247.5,\n       \"name\":\"j10\"\n    },\n    {\n       \"x\":165,\n       \"y\":127.5,\n       \"name\":\"e11\"\n    },\n    {\n       \"x\":165,\n       \"y\":247.5,\n       \"name\":\"j11\"\n    },\n    {\n       \"x\":180,\n       \"y\":127.5,\n       \"name\":\"e12\"\n    },\n    {\n       \"x\":180,\n       \"y\":247.5,\n       \"name\":\"j12\"\n    },\n    {\n       \"x\":195,\n       \"y\":127.5,\n       \"name\":\"e13\"\n    },\n    {\n       \"x\":195,\n       \"y\":247.5,\n       \"name\":\"j13\"\n    },\n    {\n       \"x\":210,\n       \"y\":127.5,\n       \"name\":\"e14\"\n    },\n    {\n       \"x\":210,\n       \"y\":247.5,\n       \"name\":\"j14\"\n    },\n    {\n       \"x\":225,\n       \"y\":127.5,\n       \"name\":\"e15\"\n    },\n    {\n       \"x\":225,\n       \"y\":247.5,\n       \"name\":\"j15\"\n    },\n    {\n       \"x\":240,\n       \"y\":127.5,\n       \"name\":\"e16\"\n    },\n    {\n       \"x\":240,\n       \"y\":247.5,\n       \"name\":\"j16\"\n    },\n    {\n       \"x\":255,\n       \"y\":127.5,\n       \"name\":\"e17\"\n    },\n    {\n       \"x\":255,\n       \"y\":247.5,\n       \"name\":\"j17\"\n    },\n    {\n       \"x\":270,\n       \"y\":127.5,\n       \"name\":\"e18\"\n    },\n    {\n       \"x\":270,\n       \"y\":247.5,\n       \"name\":\"j18\"\n    },\n    {\n       \"x\":285,\n       \"y\":127.5,\n       \"name\":\"e19\"\n    },\n    {\n       \"x\":285,\n       \"y\":247.5,\n       \"name\":\"j19\"\n    },\n    {\n       \"x\":300,\n       \"y\":127.5,\n       \"name\":\"e20\"\n    },\n    {\n       \"x\":300,\n       \"y\":247.5,\n       \"name\":\"j20\"\n    },\n    {\n       \"x\":315,\n       \"y\":127.5,\n       \"name\":\"e21\"\n    },\n    {\n       \"x\":315,\n       \"y\":247.5,\n       \"name\":\"j21\"\n    },\n    {\n       \"x\":330,\n       \"y\":127.5,\n       \"name\":\"e22\"\n    },\n    {\n       \"x\":330,\n       \"y\":247.5,\n       \"name\":\"j22\"\n    },\n    {\n       \"x\":345,\n       \"y\":127.5,\n       \"name\":\"e23\"\n    },\n    {\n       \"x\":345,\n       \"y\":247.5,\n       \"name\":\"j23\"\n    },\n    {\n       \"x\":360,\n       \"y\":127.5,\n       \"name\":\"e24\"\n    },\n    {\n       \"x\":360,\n       \"y\":247.5,\n       \"name\":\"j24\"\n    },\n    {\n       \"x\":375,\n       \"y\":127.5,\n       \"name\":\"e25\"\n    },\n    {\n       \"x\":375,\n       \"y\":247.5,\n       \"name\":\"j25\"\n    },\n    {\n       \"x\":390,\n       \"y\":127.5,\n       \"name\":\"e26\"\n    },\n    {\n       \"x\":390,\n       \"y\":247.5,\n       \"name\":\"j26\"\n    },\n    {\n       \"x\":405,\n       \"y\":127.5,\n       \"name\":\"e27\"\n    },\n    {\n       \"x\":405,\n       \"y\":247.5,\n       \"name\":\"j27\"\n    },\n    {\n       \"x\":420,\n       \"y\":127.5,\n       \"name\":\"e28\"\n    },\n    {\n       \"x\":420,\n       \"y\":247.5,\n       \"name\":\"j28\"\n    },\n    {\n       \"x\":435,\n       \"y\":127.5,\n       \"name\":\"e29\"\n    },\n    {\n       \"x\":435,\n       \"y\":247.5,\n       \"name\":\"j29\"\n    },\n    {\n       \"x\":450,\n       \"y\":127.5,\n       \"name\":\"e30\"\n    },\n    {\n       \"x\":450,\n       \"y\":247.5,\n       \"name\":\"j30\"\n    }\n ],\n  \"draw\": [\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/Breadboard.svg\",\n      \"width\": 495,\n      \"height\": 330,\n      \"x\": 0,\n      \"y\": 0\n    }\n  ],\n  \"simulation\": {},\n  \"data\" : {\n   \"groupings\" : [[\"a\",\"b\",\"c\",\"d\",\"e\"],[\"f\",\"g\",\"h\",\"i\",\"j\"]]\n  },\n  \"info\": {\n      \"properties\" : {\n         \"isBreadBoardPlaceable\" : 0\n      }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/Buzzer.json",
    "content": "{\n  \"name\": \"Buzzer\",\n  \"className\": \"Buzzer\",\n  \"pins\": [\n    {\n      \"x\": 11,\n      \"y\": 76,\n      \"name\": \"POSITIVE\"\n    },\n    {\n      \"x\": 41,\n      \"y\": 76,\n      \"name\": \"Negative\"\n    }\n  ],\n  \"pointHalf\": 5,\n  \"draw\": [\n    {\n      \"type\": \"path\",\n      \"value\": \"M15,50L15,80\",\n      \"stroke\": \"#000000\"\n    },\n    {\n      \"type\": \"path\",\n      \"value\": \"M45,50L45,80\",\n      \"stroke\": \"#000000\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 30,\n      \"x\": 30,\n      \"y\": 30,\n      \"fill\": \"#383838\",\n      \"stroke\": \"#383838\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 5,\n      \"x\": 30,\n      \"y\": 30,\n      \"fill\": \"#aaa9ad\",\n      \"stroke\": \"#aaa9ad\"\n    }\n  ],\n  \"simulation\": {\n    \"minVolage\": 4,\n    \"maxVolage\": 8,\n    \"current\": 0.03,\n    \"frequency\": 2300\n  },\n  \"info\": {\n    \"name\": \"Piezoelectric Buzzer\",\n    \"image\": \"https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Electromagnetic_buzzer_03.jpg/640px-Electromagnetic_buzzer_03.jpg\",\n    \"Datasheet\": \"http://www.ti.com/lit/ug/tidu994a/tidu994a.pdf?ts=1588677870521\",\n    \"description\": \"A piezo buzzer is a type of electronic device that’s used to produce a tone, alarm or sound. It’s lightweight with a simple construction, and it’s typically a low-cost product. Yet at the same time, depending on the piezo ceramic buzzer specifications, it’s also reliable and can be constructed in a wide range of sizes that work across varying frequencies to produce different sound outputs.\",\n    \"properties\": {\n      \"Minimum Voltage\": \"4V\",\n      \"Maximum Voltage\": \"8V\",\n      \"Maximum Current\": \"0.03A\",\n      \"Frequency\": \"2300Hz\",\n      \"isBreadBoardPlaceable\" : 1 \n    }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/CoinCell.json",
    "content": "{\n    \"name\": \"Coin Cell 3V\",\n    \"className\": \"CoinCell\",\n    \"pins\": [\n        {\n            \"x\": 25,\n            \"y\": -2,\n            \"name\": \"POSITIVE\"\n        },\n        {\n            \"x\": 25,\n            \"y\": 70,\n            \"name\": \"NEGATIVE\"\n        }\n    ],\n    \"pointHalf\": 5,\n    \"draw\": [\n        {\n            \"type\": \"image\",\n            \"url\": \"assets/images/components/CoinCell.svg\",\n            \"width\": 58,\n            \"height\": 74,\n            \"x\": 0,\n            \"y\": 0\n        }\n    ],\n    \"simulation\": {},\n    \"info\": {\n        \"name\": \"3V Coincell\",\n        \"image\": \"https://upload.wikimedia.org/wikipedia/commons/6/65/RouteJD%27s_Coin_cell%28Coin_type_Lithium-ion_Rechargeable_Battery%29.jpg\",\n        \"Datasheet\": \"http://www.ti.com/lit/ds/symlink/bq29312.pdf?ts=1588678253793\",\n        \"description\": \"Coin cell batteries like CR2032 are generally used for small portable electronics devices such as wrist watches, pocket calculators, automobile key less entry transmitter and hearing aids. Typically they are of compact size, 5-25mm in diameter and 1-6mm in height. The name defines the size of the battery like for CR2032, the first two digits stands for diameter and second for height or thickness in tenths of mm.\",\n        \"properties\": {\n            \"Voltage - Rated\": \"3V\",\n            \"Capacity\": \"240mAh @ 190µA\",\n            \"isBreadBoardPlaceable\" : 1 \n        }\n    }\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/Component.sample.json",
    "content": "{\n    \"name\": \"\",\n    \"className\": \"\",\n    \"pins\": [\n        {\n            \"x\": 10,\n            \"y\": 10,\n            \"name\": \"ena\"\n        }\n    ],\n    \"nodeSize\": 4,\n    \"draw\": [\n        {\n            \"type\": \"image\",\n            \"url\": \"\",\n            \"width\": 100,\n            \"height\": 100,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"type\": \"polygon\",\n            \"points\": [\n                []\n            ]\n        },\n        {\n            \"type\": \"rectange\",\n            \"width\": 100,\n            \"height\": 100,\n            \"x\": 11,\n            \"y\": 111\n        },\n        {\n            \"type\": \"circle\",\n            \"radius\": 100,\n            \"x\": 11,\n            \"y\": 111\n        },\n        {\n            \"type\": \"path\",\n            \"value\": \"\"\n        }\n    ],\n    \"simulation\": {\n        \"volage\": 5,\n        \"current\": 0.01\n    }\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/L293D.json",
    "content": "{\r\n  \"name\": \"L293D Motor Driver IC\",\r\n  \"className\": \"L293D\",\r\n  \"pins\": [\r\n    {\r\n      \"x\": 0,\r\n      \"y\": -4,\r\n      \"name\": \"VSS\"\r\n    },\r\n    {\r\n      \"x\": 16,\r\n      \"y\": -4,\r\n      \"name\": \"IN4\"\r\n    },\r\n    {\r\n      \"x\": 30,\r\n      \"y\": -4,\r\n      \"name\": \"OUT4\"\r\n    },\r\n    {\r\n      \"x\": 44,\r\n      \"y\": -4,\r\n      \"name\": \"GND4\"\r\n    },\r\n    {\r\n      \"x\": 59,\r\n      \"y\": -4,\r\n      \"name\": \"GND3\"\r\n    },\r\n    {\r\n      \"x\": 74,\r\n      \"y\": -4,\r\n      \"name\": \"OUT3\"\r\n    },\r\n    {\r\n      \"x\": 91,\r\n      \"y\": -4,\r\n      \"name\": \"IN3\"\r\n    },\r\n    {\r\n      \"x\": 107,\r\n      \"y\": -4,\r\n      \"name\": \"EN2\"\r\n    },\r\n    {\r\n      \"x\": 0,\r\n      \"y\": 54,\r\n      \"name\": \"EN1\"\r\n    },\r\n    {\r\n      \"x\": 16,\r\n      \"y\": 54,\r\n      \"name\": \"IN1\"\r\n    },\r\n    {\r\n      \"x\": 32,\r\n      \"y\": 54,\r\n      \"name\": \"OUT1\"\r\n    },\r\n    {\r\n      \"x\": 47,\r\n      \"y\": 54,\r\n      \"name\": \"GND1\"\r\n    },\r\n    {\r\n      \"x\": 62,\r\n      \"y\": 54,\r\n      \"name\": \"GND2\"\r\n    },\r\n    {\r\n      \"x\": 76,\r\n      \"y\": 54,\r\n      \"name\": \"OUT2\"\r\n    },\r\n    {\r\n      \"x\": 91,\r\n      \"y\": 54,\r\n      \"name\": \"IN2\"\r\n    },\r\n    {\r\n      \"x\": 107,\r\n      \"y\": 54,\r\n      \"name\": \"VS\"\r\n    }\r\n  ],\r\n  \"pointHalf\": 4,\r\n  \"draw\": [\r\n    {\r\n      \"type\": \"image\",\r\n      \"url\": \"assets/images/components/L293D.svg\",\r\n      \"width\": 115,\r\n      \"height\": 55,\r\n      \"x\": 0,\r\n      \"y\": 0\r\n    }\r\n  ],\r\n  \"simulation\": {},\r\n  \"info\": {\r\n    \"name\": \"L293D Dual Motor Driver\",\r\n    \"image\": \"https://www.mouser.in/ProductDetail/STMicroelectronics/L293D?qs=gr8Zi5OG3MgMJ1ICDzLQbg%3D%3D\",\r\n    \"Datasheet\": [\r\n      \"https://www.arduino.cc/documents/datasheets/H-bridge_motor_driver.PDF \",\r\n      \"https://www.ti.com/lit/ds/symlink/l293.pdf\",\r\n      \"many google sites\"\r\n    ],\r\n    \"Description\": \"L293D is a typical Motor driver or Motor Driver IC which allows DC motor to drive on either direction. L293D is a 16-pin IC which can control a set of two DC motors simultaneously in any direction. It means that you can control two DC motor with a single L293D IC. \",\r\n    \"properties\": {\r\n      \"Double Motor Drive Chip\": \"L293D\",\r\n      \"Supply voltage, VCC1\": \"36V\",\r\n      \"Output supply voltage, VCC2\": \"36V\",\r\n      \"Maximum junction temperature\": \"150°C\",\r\n      \"Input voltage, V1 \": \"7V\",\r\n      \"Logical Current\": \"0-36mA\",\r\n      \"Output current\": \"1.2A \",\r\n      \"OUTPUT CURRENT CAPABILITY PER CHANNEL\": \"600mA\",\r\n      \"Operation temp. range\": \"0-70°C\",\r\n      \"Max Power at t=90°C \": \"4W\",\r\n      \"Dimensions\": \"19.8 x 9.14 \",\r\n      \"Weight\": \"20g\",\r\n      \"isBreadBoardPlaceable\" : 1 \r\n    }\r\n  }\r\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/L298N.json",
    "content": "{\n  \"name\": \"Motor Driver L298N\",\n  \"className\": \"L298N\",\n  \"pins\": [\n    {\n      \"x\": 118,\n      \"y\": 9,\n      \"name\": \"ENB\"\n    },\n    {\n      \"x\": 118,\n      \"y\": 19,\n      \"name\": \"IN4\"\n    },\n    {\n      \"x\": 118,\n      \"y\": 29,\n      \"name\": \"IN3\"\n    },\n    {\n      \"x\": 118,\n      \"y\": 39,\n      \"name\": \"IN2\"\n    },\n    {\n      \"x\": 118,\n      \"y\": 49,\n      \"name\": \"IN1\"\n    },\n    {\n      \"x\": 118,\n      \"y\": 59,\n      \"name\": \"ENA\"\n    },\n    {\n      \"x\": 69,\n      \"y\": 3,\n      \"name\": \"Terminal 1\"\n    },\n    {\n      \"x\": 82,\n      \"y\": 3,\n      \"name\": \"Terminal 2\"\n    },\n    {\n      \"x\": 72,\n      \"y\": 117,\n      \"name\": \"Terminal 3\"\n    },\n    {\n      \"x\": 84,\n      \"y\": 117,\n      \"name\": \"Terminal 4\"\n    },\n    {\n      \"x\": 115,\n      \"y\": 77,\n      \"name\": \"5V IN\"\n    },\n    {\n      \"x\": 115,\n      \"y\": 97,\n      \"name\": \"V IN\"\n    },\n    {\n      \"x\": 115,\n      \"y\": 87,\n      \"name\": \"GND\"\n    }\n  ],\n  \"pointHalf\": 4,\n  \"draw\": [\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/L298N.svg\",\n      \"width\": 128,\n      \"height\": 128,\n      \"x\": 0,\n      \"y\": 0\n    }\n  ],\n  \"simulation\": {},\n  \"info\": {\n    \"name\": \"L298N Dual H Bridge Motor Driver\",\n    \"image\": \"https://cdn.shopify.com/s/files/1/0014/4313/5560/products/1_bc581b8e-00ce-4f4a-b625-04273597fe3d_700x700.jpg?v=1577794110\",\n    \"Datasheet\": \"https://www.sparkfun.com/datasheets/Robotics/L298_H_Bridge.pdf\",\n    \"description\": \"L298N Dual H Bridge Motor Driver is a motor controller breakout board which is typically used for controlling speed and direction of motors. It can also be used to control the brightness of certain lighting projects such as high powered LED arrays.\",\n    \"properties\": {\n      \"Double H Bridge Drive Chip\": \"L298N\",\n      \"Logical Voltage\": \"5V\",\n      \"Drive Voltage\": \"5V-35V\",\n      \"Logical Current\": \"0-36mA\",\n      \"Drive current\": \"2A (MAX single bridge)\",\n      \"Max Power\": \"25W\",\n      \"Dimensions\": \"43 x 43 x 26mm\",\n      \"Weight\": \"26g\"\n    }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/LCD16X2.json",
    "content": "{\n    \"name\": \"LCD 16x2\",\n    \"className\": \"LCD16X2\",\n    \"pointHalf\": 3,\n    \"pins\": [\n        {\n            \"x\": 39,\n            \"y\": 5,\n            \"name\": \"GND\"\n        },\n        {\n            \"x\": 54,\n            \"y\": 5,\n            \"name\": \"VCC\"\n        },\n        {\n            \"x\": 69,\n            \"y\": 5,\n            \"name\": \"V0\"\n        },\n        {\n            \"x\": 84,\n            \"y\": 5,\n            \"name\": \"RS\"\n        },\n        {\n            \"x\": 99,\n            \"y\": 5,\n            \"name\": \"RW\"\n        },\n        {\n            \"x\": 114,\n            \"y\": 5,\n            \"name\": \"E\"\n        },\n        {\n            \"x\": 129,\n            \"y\": 5,\n            \"name\": \"DB0\"\n        },\n        {\n            \"x\": 144,\n            \"y\": 5,\n            \"name\": \"DB1\"\n        },\n        {\n            \"x\": 159,\n            \"y\": 5,\n            \"name\": \"DB2\"\n        },\n        {\n            \"x\": 174,\n            \"y\": 5,\n            \"name\": \"DB3\"\n        },\n        {\n            \"x\": 189,\n            \"y\": 5,\n            \"name\": \"DB4\"\n        },\n        {\n            \"x\": 204,\n            \"y\": 5,\n            \"name\": \"DB5\"\n        },\n        {\n            \"x\": 219,\n            \"y\": 5,\n            \"name\": \"DB6\"\n        },\n        {\n            \"x\": 234,\n            \"y\": 5,\n            \"name\": \"DB7\"\n        },\n        {\n            \"x\": 249,\n            \"y\": 5,\n            \"name\": \"LED ANODE(+VE)\"\n        },\n        {\n            \"x\": 264,\n            \"y\": 5,\n            \"name\": \"LED CATHODE(-VE)\"\n        }\n    ],\n    \"draw\": [\n        {\n            \"type\": \"image\",\n            \"url\": \"assets/images/components/LCD16X2.svg\",\n            \"width\": 476,\n            \"height\": 210,\n            \"x\": 0,\n            \"y\": 0\n        }\n    ],\n    \"simulation\": {},\n    \"data\": {\n        \"barColor\": \"#A0C533\",\n        \"barGlowColor\": \"#000000\",\n        \"columns\": 16,\n        \"rows\": 2,\n        \"gridRows\": 8,\n        \"gridColumns\": 5,\n        \"gridWidth\": 3,\n        \"gridHeight\": 3,\n        \"interSpacing\": 5,\n        \"intraSpacing\": 0.5,\n        \"startX\": 75,\n        \"startY\": 78\n    },\n    \"info\": {\n        \"name\": \"LCD(16X8)\",\n        \"image\": \"https://commons.wikimedia.org/wiki/File:16x2_Character_LCD_Display.jpg\",\n        \"description\": \"LCD modules are very commonly used in most embedded projects, the reason being its cheap price, availability and programmer friendly. Most of us would have come across these displays in our day to day life, either at PCO’s or calculators. The appearance and the pinouts have already been visualized above now let us get a bit technical.\",\n        \"properties\": {\n            \"Operating Voltage\": \"4.7V to 5.3V\",\n            \"Current consumption\": \"1mA (without backlight)\",\n            \"Work Mode\": \" 8-bit and 4-bit mode\",\n            \"Voltage Rated\": \"3V-5V\",\n            \"isBreadBoardPlaceable\" : 1 \n        }\n    }\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/LED.json",
    "content": "{\n  \"name\": \"LED\",\n  \"className\": \"LED\",\n  \"pointHalf\": 4,\n  \"pins\": [\n    {\n      \"x\": -15,\n      \"y\": 64,\n      \"name\": \"POSITIVE\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 64,\n      \"name\": \"NEGATIVE\"\n    }\n  ],\n  \"draw\": [\n    {\n      \"type\": \"path\",\n      \"value\": \"M-10,10C-10,0,10,0,10,10L10,30L14,30L14,35L-14,35L-14,30L-10,30z\",\n      \"fill\": \"#802020\"\n    },\n    {\n      \"type\": \"path\",\n      \"value\": \"M-5,35L-5,40L-10,45L-10,70\",\n      \"stroke\": \"#000000\"\n    },\n    {\n      \"type\": \"path\",\n      \"value\": \"M5,35L5,70\",\n      \"stroke\": \"#000000\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 30,\n      \"x\": 0,\n      \"y\": 5\n    }\n  ],\n  \"simulation\": {},\n  \"data\": {\n    \"colorNames\": [\n      \"Red\",\n      \"Green\",\n      \"Yellow\",\n      \"Orange\",\n      \"Blue\",\n      \"White\"\n    ],\n    \"colors\": [\n      \"#802020\",\n      \"#208028\",\n      \"#806f20\",\n      \"#8f5100\",\n      \"#206080\",\n      \"#808080\"\n    ],\n    \"glowcolors\": [\n      \"rgba(255,0,0,0.9)-rgba(255,0,0,0.2)\",\n      \"rgba(8, 255, 90,0.9)-rgba(8, 255, 90,0.2)\",\n      \"rgba(255, 247, 8,0.9)-rgba(255, 247, 8,0.2)\",\n      \"rgba(255, 148, 8,0.9)-rgba(255, 148, 8,0.2)\",\n      \"rgba(66, 135, 245,0.9)-rgba(66, 135, 245,0.2)\",\n      \"rgba(214, 214, 214,0.9)-rgba(214, 214, 214,0.2)\"\n    ]\n  },\n  \"info\": {\n    \"name\": \"LED\",\n    \"image\": \"https://upload.wikimedia.org/wikipedia/commons/e/e8/LEDs.jpg\",\n    \"description\": \"A light-emitting diode (LED) is a semiconductor light source that emits light when current flows through it.\",\n    \"properties\": {\n      \"Light Color\": \"White, Yellow, Red, Green & Blue\",\n      \"Voltage \": \"DC 3V - 5V\",\n      \"isBreadBoardPlaceable\" : 1\n    }\n  }\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/MQ2.json",
    "content": "{\n  \"name\": \"Gas Sensor MQ2\",\n  \"className\": \"MQ2\",\n  \"pins\": [\n    {\n      \"x\": 19,\n      \"y\": 163,\n      \"name\": \"VCC\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 163,\n      \"name\": \"GND\"\n    },\n    {\n      \"x\": 48,\n      \"y\": 163,\n      \"name\": \"D0\"\n    },\n    {\n      \"x\": 64,\n      \"y\": 163,\n      \"name\": \"A0\"\n    }\n  ],\n  \"pointHalf\": 4,\n  \"draw\": [\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/GasSensor.svg\",\n      \"width\": 96,\n      \"height\": 170,\n      \"x\": 0,\n      \"y\": 0\n    },\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/smokingEffect.svg\",\n      \"width\": 327,\n      \"height\": 290,\n      \"x\": -163.5,\n      \"y\": -300\n    }\n  ],\n  \"simulation\": {},\n  \"info\": {\n    \"name\": \"Smoke/Gas Sensor MQ2\",\n    \"image\": \"https://5.imimg.com/data5/FL/NR/GJ/SELLER-3595257/mq2-gas-sensor-module-500x500.jpg\",\n    \"Datasheet\": \"https://www.pololu.com/file/0J309/MQ2.pdf\",\n    \"description\": \"The MQ-2 Gas sensor can detect or measure gasses like LPG, Alcohol, Propane, Hydrogen, CO and even methane. The module version of this sensor comes with a Digital Pin which makes this sensor to operate even without a microcontroller and that comes in handy when you are only trying to detect one particular gas. When it comes to measuring the gas in ppm the analog pin has to be used, the analog pin also TTL driven and works on 5V and hence can be used with most common microcontrollers.\",\n    \"properties\": {\n      \"Operating voltage\": \"+5V\",\n      \"Analog output voltage\": \"0V to 5V\",\n      \"Digital Output Voltage\": \"0V or 5V (TTL Logic)\",\n      \"Preheat duration\": \"20 seconds\",\n      \"Measuring angle covered\": \"<15°\",\n      \"power consumption \": \"65mA\",\n      \"Operating Temperature\": \"-20° to +80° Celsius\",\n      \"isBreadBoardPlaceable\" : 1 \n    }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/Motor.json",
    "content": "{\n  \"name\": \"Motor\",\n  \"className\": \"Motor\",\n  \"pins\": [\n    {\n      \"x\": 24,\n      \"y\": 51,\n      \"name\": \"Negative\"\n    },\n    {\n      \"x\": 40,\n      \"y\": 51,\n      \"name\": \"Positive\"\n    }\n  ],\n  \"pointHalf\": 4,\n  \"draw\": [\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/Motor.svg\",\n      \"width\": 69,\n      \"height\": 56,\n      \"x\": 0,\n      \"y\": 0\n    },\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/MotorAbove.svg\",\n      \"width\": 21,\n      \"height\": 21,\n      \"x\": 24,\n      \"y\": 17.5\n    }\n  ],\n  \"simulation\": {},\n  \"info\": {\n    \"name\": \"Motor\",\n    \"image\": \"https://upload.wikimedia.org/wikipedia/commons/f/f4/DC_Motor.jpg\",\n    \"description\": \"A normal DC motor would have only two terminals. Since these terminals are connected together only through a coil they have not polarity. Revering the connection will only reverse the direction of the motor.\",\n    \"properties\": {\n      \"Type\": \"DC Motor\",\n      \"Operating Voltage\": \"4.5V to 9V\",\n      \"Recommended/Rated Voltage\": \"6V\",\n      \"Current at No load\": \"70mA (max)\",\n      \"No-load Speed\": \" 9000 rpm\",\n      \"Loaded current\": \"250mA (approx)\",\n      \"Rated Load\": \"10g*cm\",\n      \"Motor Size\": \"27.5mm x 20mm x 15mm\",\n      \"Weight\": \"17 grams\",\n      \"isBreadBoardPlaceable\" : 1 \n    }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/PIRSensor.json",
    "content": "{\n  \"name\": \"PIR Sensor\",\n  \"className\": \"PIRSensor\",\n  \"pins\": [\n    {\n      \"x\": 81,\n      \"y\": 161,\n      \"name\": \"SIGNAL\"\n    },\n    {\n      \"x\": 96,\n      \"y\": 161,\n      \"name\": \"VCC\"\n    },\n    {\n      \"x\": 110,\n      \"y\": 161,\n      \"name\": \"GND\"\n    }\n  ],\n  \"pointHalf\": 4,\n  \"draw\": [\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/PIRSensor.svg\",\n      \"width\": 198,\n      \"height\": 168,\n      \"x\": 0,\n      \"y\": 0\n    },\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/hand.svg\",\n      \"width\": 39,\n      \"height\": 49,\n      \"x\": 79,\n      \"y\": -120\n    }\n  ],\n  \"data\": {\n    \"handImg\": \"assets/images/hand.svg\",\n    \"backCurve\": \"M-44-106a115,115 0,0,1 88,0l136,-234a385,385 0,0,0 -360,0z\",\n    \"curve\": [\n      [\n        55,\n        -26\n      ],\n      [\n        99,\n        -36\n      ],\n      [\n        143,\n        -26\n      ],\n      [\n        279,\n        -260\n      ],\n      [\n        99,\n        -305\n      ],\n      [\n        -81,\n        -260\n      ]\n    ],\n    \"hand\": [\n      [\n        118,\n        -120\n      ],\n      [\n        118,\n        -71\n      ],\n      [\n        79,\n        -71\n      ],\n      [\n        79,\n        -98\n      ],\n      [\n        89,\n        -98\n      ],\n      [\n        89,\n        -120\n      ]\n    ]\n  },\n  \"simulation\": {},\n  \"info\": {\n    \"name\": \"PIR Sensor HC-SR501\",\n    \"image\": \"https://upload.wikimedia.org/wikipedia/commons/a/a5/PIR_Motion_Detector.jpg\",\n    \"Datasheet\": \"https://www.mpja.com/download/31227sc.pdf\",\n    \"description\": \"The PIR sensor stands for Passive Infrared sensor. It is a low cost sensor which can detect the presence of Human beings or animals. This sensor has three output pins Vcc, Output and Ground as shown in the pin diagram above. Since the output pin is 3.3V TTL logic it can be used with any platforms like Arduino, Raspberry, PIC, ARM, 8051 etc..\",\n    \"properties\": {\n      \"Input voltage\": \"4.V to 12V (+5V recommended)\",\n      \"Output Voltage\": \"3.3V TTL\",\n      \"Modes\": \"Repeatable(H) and Non- Repeatable(H)\",\n      \"Covers Distance\": \"120° and 7 meters\",\n      \"Measuring angle covered\": \"<15°\",\n      \"power consumption \": \"65mA\",\n      \"Operating Temperature\": \"-20° to +80° Celsius\",\n      \"isBreadBoardPlaceable\" : 1 \n    }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/PhotoResistor.json",
    "content": "{\n    \"name\": \"Photo Resistor\",\n    \"className\": \"PhotoResistor\",\n    \"pins\": [\n        {\n            \"x\": 13,\n            \"y\": 56,\n            \"name\": \"Terminal 1\"\n        },\n        {\n            \"x\": 28,\n            \"y\": 56,\n            \"name\": \"Terminal 2\"\n        }\n    ],\n    \"pointHalf\": 4,\n    \"draw\": [\n        {\n            \"type\": \"image\",\n            \"url\": \"assets/images/components/PhotoResistor.svg\",\n            \"width\": 50,\n            \"height\": 60,\n            \"x\": 0,\n            \"y\": 0\n        }\n    ],\n    \"sliderIcons\": {\n        \"moonPath\": \"M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z\",\n        \"sunPath\": \"M15.502,7.504c-4.35,0-7.873,3.523-7.873,7.873c0,4.347,3.523,7.872,7.873,7.872c4.346,0,7.871-3.525,7.871-7.872C23.374,11.027,19.85,7.504,15.502,7.504zM15.502,21.25c-3.244-0.008-5.866-2.63-5.874-5.872c0.007-3.243,2.63-5.866,5.874-5.874c3.242,0.008,5.864,2.631,5.871,5.874C21.366,18.62,18.744,21.242,15.502,21.25zM15.502,6.977c0.553,0,1-0.448,1-1.001V1.125c-0.002-0.553-0.448-1-1-1c-0.553,0-1.001,0.449-1,1.002v4.85C14.502,6.528,14.949,6.977,15.502,6.977zM18.715,7.615c0.125,0.053,0.255,0.076,0.382,0.077c0.394,0,0.765-0.233,0.925-0.618l1.856-4.483c0.21-0.511-0.031-1.095-0.541-1.306c-0.511-0.211-1.096,0.031-1.308,0.541L18.174,6.31C17.963,6.82,18.205,7.405,18.715,7.615zM21.44,9.436c0.195,0.194,0.451,0.293,0.707,0.293s0.512-0.098,0.707-0.293l3.43-3.433c0.391-0.39,0.39-1.023,0-1.415c-0.392-0.39-1.025-0.39-1.415,0.002L21.44,8.021C21.049,8.412,21.049,9.045,21.44,9.436zM23.263,12.16c0.158,0.385,0.531,0.617,0.923,0.617c0.127,0,0.257-0.025,0.383-0.078l4.48-1.857c0.511-0.211,0.753-0.797,0.541-1.307s-0.796-0.752-1.307-0.54l-4.481,1.857C23.292,11.064,23.051,11.65,23.263,12.16zM29.752,14.371l-4.851,0.001c-0.552,0-1,0.448-0.998,1.001c0,0.553,0.447,0.999,0.998,0.999l4.852-0.002c0.553,0,0.999-0.449,0.999-1C30.752,14.817,30.304,14.369,29.752,14.371zM29.054,19.899l-4.482-1.854c-0.512-0.212-1.097,0.03-1.307,0.541c-0.211,0.511,0.031,1.096,0.541,1.308l4.482,1.854c0.126,0.051,0.256,0.075,0.383,0.075c0.393,0,0.765-0.232,0.925-0.617C29.806,20.695,29.563,20.109,29.054,19.899zM22.86,21.312c-0.391-0.391-1.023-0.391-1.414,0.001c-0.391,0.39-0.39,1.022,0,1.413l3.434,3.429c0.195,0.195,0.45,0.293,0.706,0.293s0.513-0.098,0.708-0.293c0.391-0.392,0.389-1.025,0-1.415L22.86,21.312zM20.029,23.675c-0.211-0.511-0.796-0.752-1.307-0.541c-0.51,0.212-0.752,0.797-0.54,1.308l1.86,4.48c0.159,0.385,0.531,0.617,0.925,0.617c0.128,0,0.258-0.024,0.383-0.076c0.511-0.211,0.752-0.797,0.54-1.309L20.029,23.675zM15.512,23.778c-0.553,0-1,0.448-1,1l0.004,4.851c0,0.553,0.449,0.999,1,0.999c0.553,0,1-0.448,0.998-1l-0.003-4.852C16.511,24.226,16.062,23.777,15.512,23.778zM12.296,23.142c-0.51-0.21-1.094,0.031-1.306,0.543l-1.852,4.483c-0.21,0.511,0.033,1.096,0.543,1.307c0.125,0.052,0.254,0.076,0.382,0.076c0.392,0,0.765-0.234,0.924-0.619l1.853-4.485C13.051,23.937,12.807,23.353,12.296,23.142zM9.57,21.325c-0.392-0.391-1.025-0.389-1.415,0.002L4.729,24.76c-0.391,0.392-0.389,1.023,0.002,1.415c0.195,0.194,0.45,0.292,0.706,0.292c0.257,0,0.513-0.098,0.708-0.293l3.427-3.434C9.961,22.349,9.961,21.716,9.57,21.325zM7.746,18.604c-0.213-0.509-0.797-0.751-1.307-0.54L1.96,19.925c-0.511,0.212-0.752,0.798-0.54,1.308c0.16,0.385,0.531,0.616,0.924,0.616c0.127,0,0.258-0.024,0.383-0.076l4.479-1.861C7.715,19.698,7.957,19.113,7.746,18.604zM7.1,15.392c0-0.553-0.447-0.999-1-0.999l-4.851,0.006c-0.553,0-1.001,0.448-0.999,1.001c0.001,0.551,0.449,1,1,0.998l4.852-0.006C6.654,16.392,7.102,15.942,7.1,15.392zM1.944,10.869l4.485,1.85c0.125,0.053,0.254,0.076,0.381,0.076c0.393,0,0.766-0.232,0.925-0.618c0.212-0.511-0.032-1.097-0.544-1.306L2.708,9.021c-0.511-0.21-1.095,0.032-1.306,0.542C1.19,10.074,1.435,10.657,1.944,10.869zM8.137,9.451c0.195,0.193,0.449,0.291,0.705,0.291s0.513-0.098,0.709-0.295c0.391-0.389,0.389-1.023-0.004-1.414L6.113,4.609C5.723,4.219,5.088,4.221,4.699,4.612c-0.391,0.39-0.389,1.024,0.002,1.414L8.137,9.451zM10.964,7.084c0.16,0.384,0.532,0.615,0.923,0.615c0.128,0,0.258-0.025,0.384-0.077c0.51-0.212,0.753-0.798,0.54-1.307l-1.864-4.479c-0.212-0.51-0.798-0.751-1.308-0.539C9.129,1.51,8.888,2.096,9.1,2.605L10.964,7.084z\"\n    },\n    \"simulation\": {},\n    \"info\": {\n        \"name\": \"PhotoResistor\",\n        \"image\": \"https://upload.wikimedia.org/wikipedia/commons/3/33/Photoresistor_2.jpg\",\n        \"description\": \"Light dependent resistors, LDRs or photoresistors are often used in circuits where it is necessary to detect the presence or the level of light.\",\n        \"Datasheet\": \"https://cdn.sparkfun.com/datasheets/Sensors/LightImaging/SEN-09088.pdf\",\n        \"properties\": {\n            \"Max power dissipation\": \"200mW\",\n            \"Max voltage\": \"200V (@0lux)\",\n            \"Peak wavelength\": \"600nm\",\n            \"Min. resistance @ 10lux\": \"1.8kΩ(@ 10lux)\",\n            \"Max. resistance @ 10lux\": \"4.5kΩ(@ 10lux)\",\n            \"Typ. resistance @ 100lux\": \"0.7kΩ(@ 100lux)\",\n            \"Dark resistance after 1 sec \": \"0.03MΩ\",\n            \"Dark resistance after 5 sec\": \"0.25MΩ\",\n            \"isBreadBoardPlaceable\" : 1 \n        }\n    }\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/Potentiometer.json",
    "content": "{\n  \"name\": \"Potentiometer\",\n  \"className\": \"Potentiometer\",\n  \"pins\": [\n    {\n      \"x\": 16.5,\n      \"y\": 75.025,\n      \"name\": \"Terminal 1\"\n    },\n    {\n      \"x\": 31.2,\n      \"y\": 75.025,\n      \"name\": \"WIPER\"\n    },\n    {\n      \"x\": 45.4,\n      \"y\": 75.025,\n      \"name\": \"Terminal 2\"\n    }\n  ],\n  \"pointHalf\": 4,\n  \"draw\": [\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/Potentiometer.svg\",\n      \"width\": 71.1,\n      \"height\": 80,\n      \"x\": 0,\n      \"y\": 0\n    },\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/PotentiometerAbove.svg\",\n      \"width\": 55.6,\n      \"height\": 55.6,\n      \"x\": 7.3,\n      \"y\": 7.5\n    }\n  ],\n  \"simulation\": {},\n  \"data\": {\n    \"variants\": [\n      \"500\",\n      \"1K\",\n      \"2K\",\n      \"5K\",\n      \"10K\",\n      \"22K\",\n      \"47K\",\n      \"50K\",\n      \"100K\",\n      \"220K\",\n      \"470K\",\n      \"500K\",\n      \"1M\"\n    ],\n    \"value\": [\n      500,\n      1000,\n      2000,\n      5000,\n      10000,\n      22000,\n      47000,\n      50000,\n      100000,\n      220000,\n      470000,\n      500000,\n      1000000\n    ]\n  },\n  \"info\": {\n    \"name\": \"Pontientiometer\",\n    \"image\": \"https://upload.wikimedia.org/wikipedia/commons/0/0a/Electronic-Component-Potentiometer.jpg\",\n    \"description\": \"Potentiometers also known as POT, are nothing but variable resistors. They can provide a variable resistance by simply varying the knob on top of its head. It can be classified based on two main parameters. One is their Resistance (R-ohms) itself and the other is its Power (P-Watts) rating.\",\n    \"properties\": {\n      \"Type\": \"Rotary(Radio POT)\",\n      \"Resistance values\": \"500Ω, 1K, 2K, 5K, 10K, 22K, 47K, 50K, 100K, 220K, 470K, 500K, 1 M\",\n      \"Peak wavelength\": \"600nm\",\n      \"Power Rating\": \"0.3W\",\n      \"Maximum Input Voltage\": \"200Vdc\",\n      \"Rotational Life\": \" 2000K cycles\",\n      \"isBreadBoardPlaceable\" : 1 \n    }\n  }\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/PushButton.json",
    "content": "{\n  \"name\": \"Push Button\",\n  \"className\": \"PushButton\",\n  \"pins\": [\n    {\n      \"x\": 9,\n      \"y\": -19,\n      \"name\": \"Terminal 1b\"\n    },\n    {\n      \"x\": 24,\n      \"y\": -19,\n      \"name\": \"Terminal 2b\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 35,\n      \"name\": \"Terminal 1a\"\n    },\n    {\n      \"x\": 24,\n      \"y\": 35,\n      \"name\": \"Terminal 2a\"\n    }\n  ],\n  \"pointHalf\": 4,\n  \"draw\": [\n    {\n      \"type\": \"rectangle\",\n      \"width\": 2.5,\n      \"height\": 13,\n      \"x\": 10,\n      \"y\": -18,\n      \"radius\": 5,\n      \"stroke\": \"#737373\",\n      \"fill\": \"#737373\"\n    },\n    {\n      \"type\": \"rectangle\",\n      \"width\": 2.5,\n      \"height\": 13,\n      \"x\": 25,\n      \"y\": -18,\n      \"radius\": 5,\n      \"stroke\": \"#737373\",\n      \"fill\": \"#737373\"\n    },\n    {\n      \"type\": \"rectangle\",\n      \"width\": 2.5,\n      \"height\": 13,\n      \"x\": 10,\n      \"y\": 29,\n      \"radius\": 5,\n      \"stroke\": \"#737373\",\n      \"fill\": \"#737373\"\n    },\n    {\n      \"type\": \"rectangle\",\n      \"width\": 2.5,\n      \"height\": 13,\n      \"x\": 25,\n      \"y\": 29,\n      \"radius\": 5,\n      \"stroke\": \"#737373\",\n      \"fill\": \"#737373\"\n    },\n    {\n      \"type\": \"rectangle\",\n      \"width\": 40,\n      \"height\": 34,\n      \"x\": 0,\n      \"y\": -6,\n      \"radius\": 10,\n      \"stroke\": \"#969696\",\n      \"fill\": \"#bfbfbf\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 3,\n      \"x\": 10,\n      \"y\": 3,\n      \"fill\": \"#383838\",\n      \"stroke\": \"#383838\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 3,\n      \"x\": 10,\n      \"y\": 22,\n      \"fill\": \"#383838\",\n      \"stroke\": \"#383838\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 3,\n      \"x\": 32,\n      \"y\": 3,\n      \"fill\": \"#383838\",\n      \"stroke\": \"#383838\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 3,\n      \"x\": 32,\n      \"y\": 22,\n      \"fill\": \"#383838\",\n      \"stroke\": \"#383838\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 5,\n      \"x\": 20,\n      \"y\": 13,\n      \"fill\": \"#383838\",\n      \"stroke\": \"#383838\"\n    }\n  ],\n  \"simulation\": {},\n  \"info\": {\n    \"name\": \"Push Button Switch\",\n    \"image\": \"https://upload.wikimedia.org/wikipedia/commons/6/63/Micro_switch.jpg\",\n    \"Datasheet\": \"https://www.ti.com/lit/ds/symlink/tps3420.pdf?ts=1588677114740\",\n    \"description\": \"Push-Buttons are normally-open tactile switches. Push buttons allow us to power the circuit or make any particular connection only when we press the button. Simply, it makes the circuit connected when pressed and breaks when released. A push button is also used for triggering of the SCR by gate terminal. These are the most common buttons which we see in our daily life electronic equipment’s.\",\n    \"properties\": {\n      \"Mode of Operation\": \"Tactile feedback\",\n      \"Power Rating\": \"MAX 50mA 24V DC\",\n      \"Insulation Resistance\": \"100Mohm at 100v\",\n      \"Operating Force\": \"2.55±0.69 N\",\n      \"Contact Resistance\": \"MAX 100 mOhm\",\n      \"Operating Temperature Range\": \" -20 to +70 ℃\",\n      \"Storage Temperature Range\": \"-20 to +70 ℃\",\n      \"isBreadBoardPlaceable\" : 1 \n    }\n  }\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/RGBLED.json",
    "content": "{\n  \"name\": \"RGB LED\",\n  \"className\": \"RGBLED\",\n  \"pointHalf\": 6,\n  \"pins\": [\n    {\n      \"x\": -3,\n      \"y\": 95,\n      \"name\": \"RED\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 95,\n      \"name\": \"CATHODE\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 95,\n      \"name\": \"BLUE\"\n    },\n    {\n      \"x\": 46,\n      \"y\": 95,\n      \"name\": \"GREEN\"\n    }\n  ],\n  \"draw\": [\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/RGBLED.svg\",\n      \"width\": 50,\n      \"height\": 104,\n      \"x\": 0,\n      \"y\": 0\n    },\n    {\n      \"type\": \"path\",\n      \"value\": \"M38.9,33.3V15c0-8.3-6.4-15-14.4-15S10.2,6.7,10.2,15v18.3v4.5v7.4c2.9,2.5,8.2,4.2,14.4,4.2c9.2,0,16.7-3.8,16.7-8.6c0-0.5,0-2.5,0-3.1C41.2,36.1,40.4,34.6,38.9,33.3z\",\n      \"stroke\": \"#8C8C8C\"\n    }\n  ],\n  \"simulation\": {},\n  \"info\": {\n    \"name\": \"RGB LED\",\n    \"image\": \"https://upload.wikimedia.org/wikipedia/commons/3/3d/RGB-Led-projection.jpg\",\n    \"description\": \"RGB LED contains all three colors Red, Green, Blue. These 5mm size LEDs have four pins - Cathode is the longest pin. One for each color and a common cathode. Use this one LED for three status indicators or pulse width modulate all three and get mixed colors. So any combination of color can be generated.\",\n    \"DataSheet\": \"https://www.sparkfun.com/datasheets/Components/YSL-R596CR3G4B5C-C10.pdf\",\n    \"properties\": {\n      \"Size\": \"5mm LED RGB - Common Cathode\",\n      \"Lens Type\": \"Diffused\",\n      \"Emitting Color\": \"Red, Green and Blue\",\n      \"Voltage Rated\": \"3V-5V\",\n      \"isBreadBoardPlaceable\" : 1 \n    }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/Relay.json",
    "content": "{\n  \"name\": \"Relay Module\",\n  \"className\": \"RelayModule\",\n  \"pins\": [\n    {\n      \"x\": 33,\n      \"y\": 18,\n      \"name\": \"Normally Closed\"\n    },\n    {\n      \"x\": 56,\n      \"y\": 18,\n      \"name\": \"COMMON\"\n    },\n    {\n      \"x\": 81,\n      \"y\": 18,\n      \"name\": \"Normally Open\"\n    },\n    {\n      \"x\": 54,\n      \"y\": 197,\n      \"name\": \"SIG\"\n    },\n    {\n      \"x\": 68,\n      \"y\": 197,\n      \"name\": \"VCC\"\n    },\n    {\n      \"x\": 84,\n      \"y\": 197,\n      \"name\": \"GND\"\n    }\n  ],\n  \"pointHalf\": 5,\n  \"draw\": [\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/1ChannelRelay.svg\",\n      \"width\": 118,\n      \"height\": 204,\n      \"x\": 0,\n      \"y\": 0\n    }\n  ],\n  \"simulation\": {},\n  \"info\": {\n    \"name\": \"Relay Module 4-Channel\",\n    \"image\": \"https://cdn.sparkfun.com//assets/parts/1/1/4/0/5/13815-04a.jpg\",\n    \"description\": \"The 4 Channel Relay Module is a convenient board which can be used to control high voltage, high current load such as motor, solenoid valves, lamps and AC load. It is designed to interface with microcontroller such as Arduino, PIC and etc. The relays terminal (COM, NO and NC) is being brought out with screw terminal. It also comes with a LED to indicate the status of relay.\",\n    \"Datasheet\": \"https://www.curtocircuito.com.br/datasheet/modulo/rele-1canal.pdf\",\n    \"properties\": {\n      \"channel\": \"4\",\n      \"Rated through-current\": \"10A (NO) 5A (NC)\",\n      \"Control signal\": \"TTL level\",\n      \"Max. switching current\": \"10A\",\n      \"isBreadBoardPlaceable\" : 1 \n    }\n  }\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/Resistor.json",
    "content": "{\n  \"name\": \"RGB LED\",\n  \"className\": \"RGBLED\",\n  \"pointHalf\": 4,\n  \"pins\": [\n    {\n      \"x\": 7,\n      \"y\": 0,\n      \"name\": \"POWER\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 91,\n      \"name\": \"VOUT\"\n    }\n  ],\n  \"draw\": [\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/Resistor.svg\",\n      \"width\": 24,\n      \"height\": 100,\n      \"x\": 0,\n      \"y\": 0\n    },\n    {\n      \"type\": \"path\",\n      \"value\": \"M21.2,46.3H2.8c0,1.3,0,3.7,0,6.1h18.5C21.2,50,21.2,47.7,21.2,46.3z\"\n    },\n    {\n      \"type\": \"path\",\n      \"value\": \"M21.2,59.4c0-0.6,0-1.8,0-3.3H2.8c0,1.5,0,2.7,0,3.3c0,1.2-0.1,2.2-0.4,3.1h19.2C21.4,61.6,21.2,60.6,21.2,59.4z\"\n    },\n    {\n      \"type\": \"path\",\n      \"value\": \"M24,72.3c0-1.8-0.2-3.1-0.4-4.3H0.4C0.2,69.1,0,70.5,0,72.3c0,0.8,0.1,1.4,0.3,2.1h23.5C23.9,73.7,24,73,24,72.3z\"\n    },\n    {\n      \"type\": \"path\",\n      \"value\": \"M0,27c0,0.5,0,1,0.1,1.5h23.8c0-0.5,0.1-1,0.1-1.5c0-0.3,0-0.6-0.1-0.9H0.1C0,26.4,0,26.7,0,27z\"\n    },\n    {\n      \"type\": \"path\",\n      \"value\": \"M21.6,36.7H2.4c0.2,0.9,0.4,1.9,0.4,3.1c0,0.6,0,1.8,0,3.3h18.5c0-1.5,0-2.7,0-3.3C21.2,38.6,21.4,37.6,21.6,36.7z\"\n    }\n  ],\n  \"simulation\": {},\n  \"data\": {\n    \"initial\": 1000,\n    \"initialToleranceIndex\": 10,\n    \"toleranceValues\": [\n      \"1\",\n      \"2\",\n      \"3\",\n      \"4\",\n      \"0.5\",\n      \"0.25\",\n      \"0.1\",\n      \"0.05\",\n      \"5\",\n      \"10\"\n    ],\n    \"tolColorMap\": [\n      1,\n      2,\n      3,\n      4,\n      5,\n      6,\n      7,\n      8,\n      10,\n      11\n    ],\n    \"colorTable\": [\n      \"#000000\",\n      \"#A52A2A\",\n      \"#FF0000\",\n      \"#FFA500\",\n      \"#FFFF00\",\n      \"#008000\",\n      \"#0000FF\",\n      \"#4B0082\",\n      \"#808080\",\n      \"#FFFFFF\",\n      \"#FFD700\",\n      \"#C0C0C0\"\n    ],\n    \"unitLabels\": [\n      \"\",\n      \"K\",\n      \"M\",\n      \"G\"\n    ],\n    \"unitValues\": [\n      1,\n      1000,\n      1000000,\n      1000000000\n    ]\n  },\n  \"info\" : {\n      \"properties\" : {\n        \"isBreadBoardPlaceable\" : 1 \n      }\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/ServoMotor.json",
    "content": "{\n    \"name\": \"Servo Motor\",\n    \"className\": \"ServoMotor\",\n    \"pins\": [\n        {\n            \"x\": 17,\n            \"y\": 6,\n            \"name\": \"GND\"\n        },\n        {\n            \"x\": 33,\n            \"y\": 6,\n            \"name\": \"POWER\"\n        },\n        {\n            \"x\": 47,\n            \"y\": 6,\n            \"name\": \"Signal\"\n        }\n    ],\n    \"pointHalf\": 4,\n    \"draw\": [\n        {\n            \"type\": \"image\",\n            \"url\": \"assets/images/components/Servo.svg\",\n            \"width\": 73.5,\n            \"height\": 274,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"type\": \"image\",\n            \"url\": \"assets/images/components/ServoAbove.svg\",\n            \"width\": 98,\n            \"height\": 204,\n            \"x\": -12,\n            \"y\": 40\n        }\n    ],\n    \"simulation\": {},\n    \"info\": {\n        \"name\": \"SG90 9G Micro Servo Motor\",\n        \"image\": \"https://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Micro_servo.jpg/640px-Micro_servo.jpg\",\n        \"Datasheet\": \"http://www.ee.ic.ac.uk/pcheung/teaching/DE1_EE/stores/sg90_datasheet.pdf\",\n        \"description\": \"The TowerPro SG90 mini servo is lightweight, high-quality and lightning-fast. The servo is designed to work with almost all radio control systems. The SG90 mini servo with accessories is perfect for R/C helicopter, plane, car, boat and truck use.\",\n        \"properties\": {\n            \"Type\": \"Micro Size Servo\",\n            \"Speed \": \"0.10/4.8V(sec/60deg)\",\n            \"Torque \": \"1.80/4.8V(Kg-cm)\",\n            \"Size \": \"23.1mm x 12.2mm x 29mm\",\n            \"Pulse Width\": \"500-2400 µs\",\n            \"Rotation Angle\": \"180 degree\",\n            \"isBreadBoardPlaceable\" : 1 \n        }\n    }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/SevenSegment.json",
    "content": "{\n  \"name\": \"Seven Segment Display\",\n  \"className\": \"SevenSegment\",\n  \"pointHalf\": 4,\n  \"pins\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"name\": \"g\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 7,\n      \"name\": \"f\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 7,\n      \"name\": \"COMMON\"\n    },\n    {\n      \"x\": 48,\n      \"y\": 7,\n      \"name\": \"a\"\n    },\n    {\n      \"x\": 64,\n      \"y\": 7,\n      \"name\": \"b\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 98,\n      \"name\": \"e\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 98,\n      \"name\": \"d\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 98,\n      \"name\": \"COMMON\"\n    },\n    {\n      \"x\": 48,\n      \"y\": 98,\n      \"name\": \"C\"\n    },\n    {\n      \"x\": 64,\n      \"y\": 98,\n      \"name\": \"DP\"\n    }\n  ],\n  \"draw\": [\n    {\n      \"type\": \"rectangle\",\n      \"width\": 76,\n      \"height\": 113,\n      \"x\": 0,\n      \"y\": 0,\n      \"radius\": 3,\n      \"fill\": \"#252626\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 4,\n      \"x\": 62,\n      \"y\": 91,\n      \"fill\": \"#B2B2B2\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 2,\n      \"x\": 7,\n      \"y\": 11,\n      \"fill\": \"#505355\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 2,\n      \"x\": 22,\n      \"y\": 11,\n      \"fill\": \"#505355\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 2,\n      \"x\": 37,\n      \"y\": 11,\n      \"fill\": \"#505355\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 2,\n      \"x\": 52,\n      \"y\": 11,\n      \"fill\": \"#505355\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 2,\n      \"x\": 68,\n      \"y\": 11,\n      \"fill\": \"#505355\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 2,\n      \"x\": 7,\n      \"y\": 102,\n      \"fill\": \"#505355\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 2,\n      \"x\": 22,\n      \"y\": 102,\n      \"fill\": \"#505355\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 2,\n      \"x\": 37,\n      \"y\": 102,\n      \"fill\": \"#505355\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 2,\n      \"x\": 52,\n      \"y\": 102,\n      \"fill\": \"#505355\"\n    },\n    {\n      \"type\": \"circle\",\n      \"radius\": 2,\n      \"x\": 68,\n      \"y\": 102,\n      \"fill\": \"#505355\"\n    },\n    {\n      \"type\": \"polygon\",\n      \"points\": [\n        [\n          24.1,\n          22.6\n        ],\n        [\n          20.9,\n          25.3\n        ],\n        [\n          16.3,\n          51.7\n        ],\n        [\n          19.3,\n          55.3\n        ],\n        [\n          23.8,\n          51.5\n        ],\n        [\n          28.1,\n          27.3\n        ]\n      ]\n    },\n    {\n      \"type\": \"polygon\",\n      \"points\": [\n        [\n          52.2,\n          52.9\n        ],\n        [\n          25,\n          52.9\n        ],\n        [\n          20.4,\n          56.7\n        ],\n        [\n          23.4,\n          60.3\n        ],\n        [\n          51.1,\n          60.3\n        ],\n        [\n          55.4,\n          56.7\n        ]\n      ]\n    },\n    {\n      \"type\": \"polygon\",\n      \"points\": [\n        [\n          19,\n          57.9\n        ],\n        [\n          14.5,\n          61.6\n        ],\n        [\n          10,\n          87.1\n        ],\n        [\n          10,\n          87.1\n        ],\n        [\n          9.9,\n          87.7\n        ],\n        [\n          12.5,\n          90.9\n        ],\n        [\n          17.6,\n          86.6\n        ],\n        [\n          22,\n          61.5\n        ]\n      ]\n    },\n    {\n      \"type\": \"polygon\",\n      \"points\": [\n        [\n          47.6,\n          94.5\n        ],\n        [\n          50.4,\n          92.1\n        ],\n        [\n          46.2,\n          87.1\n        ],\n        [\n          19.9,\n          87.1\n        ],\n        [\n          13.7,\n          92.3\n        ],\n        [\n          15.5,\n          94.5\n        ]\n      ]\n    },\n    {\n      \"type\": \"polygon\",\n      \"points\": [\n        [\n          54.2,\n          89\n        ],\n        [\n          59.1,\n          61.2\n        ],\n        [\n          56.6,\n          58.1\n        ],\n        [\n          51.4,\n          62.5\n        ],\n        [\n          47.3,\n          85.5\n        ],\n        [\n          51.9,\n          91\n        ]\n      ]\n    },\n    {\n      \"type\": \"polygon\",\n      \"points\": [\n        [\n          60.7,\n          52.4\n        ],\n        [\n          65.7,\n          24\n        ],\n        [\n          64.5,\n          22.6\n        ],\n        [\n          57.4,\n          28.5\n        ],\n        [\n          53.4,\n          51.4\n        ],\n        [\n          56.8,\n          55.5\n        ]\n      ]\n    },\n    {\n      \"type\": \"polygon\",\n      \"points\": [\n        [\n          28.6,\n          18.9\n        ],\n        [\n          25.6,\n          21.4\n        ],\n        [\n          29.6,\n          26.3\n        ],\n        [\n          57.2,\n          26.3\n        ],\n        [\n          63.3,\n          21.2\n        ],\n        [\n          61.4,\n          18.9\n        ]\n      ]\n    }\n  ],\n  \"simulation\": {},\n  \"data\": {\n    \"mapping\": [\n      18,\n      17,\n      16,\n      15,\n      14,\n      12,\n      13,\n      1\n    ],\n    \"barColor\": \"#B2B2B2\",\n    \"barGlowColor\": \"#FFA500\"\n  },\n  \"info\": {\n    \"name\": \"Seven Segment Module\",\n    \"image\": \"https://upload.wikimedia.org/wikipedia/commons/a/ad/Seven_segment_02_Pengo.jpg\",\n    \"description\": \"LCD modules are very commonly used in most embedded projects, the reason being its cheap price, availability and programmer friendly. Most of us would have come across these displays in our day to day life, either at PCO’s or calculators. The appearance and the pinouts have already been visualized above now let us get a bit technical.\",\n    \"Datasheet\": \"https://www.sparkfun.com/datasheets/Components/LED/7-Segment/SFE-0012-DS-7segmentSerial-v41.pdf\",\n    \"properties\": {\n      \"sizes\": \"9.14mm,14.20mm,20.40mm,38.10mm,57.0mm and 100mm (Commonly used/available size is 14.20mm)\",\n      \"Current consumption\": \"30mA / segment\",\n      \"Peak current \": \"70mA\",\n      \"Voltage Rated\": \"3V-5V\",\n      \"isBreadBoardPlaceable\" : 1 \n    }\n  }\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/SlideSwitch.json",
    "content": "{\n  \"name\": \"Slide Switch\",\n  \"className\": \"SlideSwitch\",\n  \"pins\": [\n    {\n      \"x\": 8,\n      \"y\": 23,\n      \"name\": \"TERMINAL 1\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 23,\n      \"name\": \"COMMON\"\n    },\n    {\n      \"x\": 38,\n      \"y\": 23,\n      \"name\": \"TERMINAL 2\"\n    }\n  ],\n  \"pointHalf\": 4,\n  \"draw\": [\n    {\n      \"type\": \"image\",\n      \"url\": \"assets/images/components/SlideSwitch.svg\",\n      \"width\": 50.4911,\n      \"height\": 27.0178,\n      \"x\": 0,\n      \"y\": 0\n    },\n    {\n      \"type\": \"rectangle\",\n      \"width\": 17,\n      \"height\": 12,\n      \"x\": 9,\n      \"y\": 3,\n      \"radius\": 0,\n      \"fill\": \"#8c8c8c\"\n    }\n  ],\n  \"simulation\": {},\n  \"info\": {\n    \"name\": \"SlideSwitch\",\n    \"image\": \"https://upload.wikimedia.org/wikipedia/commons/0/05/Mountable_Slide_Switch_%2835529389702%29.jpg\",\n    \"Datasheet\": \"http://www.ti.com/lit/ds/symlink/sn74lvc1g3157.pdf?ts=1588676642180\",\n    \"description\": \"Slide switches are mechanical switches using a slider that moves (slides) from the open (off) position to the closed (on) position. They allow control over current flow in a circuit without having to manually cut or splice wire. This type of switch is best used for controlling current flow in small projects.\",\n    \"properties\": {\n      \"Contact rating\": \"12 V DC, 200 mA\",\n      \"Contact resistance\": \"<50 mOhms\",\n      \"Insulation resistance\": \"> 100 MOhms at 500 V DC\",\n      \"Dielectric strength\": \"500 V, 50 Hz for the duration of 1 minute\",\n      \"Operating temperature\": \" -10 Degree Celsius to + 60 Degree Celsius\",\n      \"Mechanical life\": \" minimum 5000 operations\",\n      \"Contacts\": \"phosphor bronze, silver-plated\",\n      \"Terminals\": \"brass silver-plated\",\n      \"Contact timing\": \"non-shorting\",\n      \"isBreadBoardPlaceable\" : 1 \n    }\n  }\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/TMP36.json",
    "content": "{\n    \"name\": \"'Temperature Sensor TMP36\",\n    \"className\": \"TMP36\",\n    \"pins\": [\n        {\n            \"x\": 0,\n            \"y\": 70,\n            \"name\": \"Power\"\n        },\n        {\n            \"x\": 15,\n            \"y\": 70,\n            \"name\": \"Vout\"\n        },\n        {\n            \"x\": 30,\n            \"y\": 70,\n            \"name\": \"GND\"\n        }\n    ],\n    \"pointHalf\": 4,\n    \"draw\": [\n        {\n            \"type\": \"image\",\n            \"url\": \"assets/images/components/TMP36.svg\",\n            \"width\": 38,\n            \"height\": 76,\n            \"x\": 0,\n            \"y\": 0\n        }\n    ],\n    \"simulation\": {},\n    \"info\": {\n        \"name\": \"Temperature sensor TMP36\",\n        \"image\": \"https://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/Temperature_Sensor_%28TMP36%29.jpg/640px-Temperature_Sensor_%28TMP36%29.jpg\",\n        \"Datasheet\": \"https://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf\",\n        \"description\": \"TThe TMP35/TMP36/TMP37 are low voltage, precision centi- grade temperature sensors. They provide a voltage output that is linearly proportional to the Celsius (centigrade) temperature.\",\n        \"properties\": {\n            \"Supply Voltage\": \"2.7V to 5.5V\",\n            \"Ramp-Up Rate\": \"3°C/sec\",\n            \"Ramp-Down Rate \": \"−6°C/sec\",\n            \"Operating Temperature Range\": \" -55°C to 150°C \",\n            \"Storage Temperature Range\": \"−65°C to +160°C\",\n            \"Offset Voltage\": \"0.5V\",\n            \"Output voltage \": \"750mV/25°C\",\n            \"Accuracy\": \"±2°C \",\n            \"Supply Current\": \"less than 50uA\",\n            \"Shutdown current\": \"0.5 µA max\",\n            \"isBreadBoardPlaceable\" : 1 \n        }\n    }\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/Thermistor.json",
    "content": "{\n    \"name\": \"Thermistor\",\n    \"className\": \"Thermistor\",\n    \"pins\": [\n        {\n            \"x\": 6,\n            \"y\": 86,\n            \"name\": \"Terminal 1\"\n        },\n        {\n            \"x\": 24,\n            \"y\": 86,\n            \"name\": \"Terminal 2\"\n        }\n    ],\n    \"pointHalf\": 4,\n    \"draw\": [\n        {\n            \"type\": \"image\",\n            \"url\": \"assets/images/components/Thermistor.svg\",\n            \"width\": 38,\n            \"height\": 88,\n            \"x\": 0,\n            \"y\": 0\n        }\n    ],\n    \"simulation\": {},\n    \"info\": {\n        \"name\": \"Thermistor\",\n        \"image\": \"https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/NTC_bead.jpg/400px-NTC_bead.jpg\",\n        \"description\": \"Thermistor is an electronic component used to calculate the temperature.This is a type of resistor whose resistance varies with change in temperature.\",\n        \"Datasheet\": \"https://components101.com/sites/default/files/component_datasheet/NTC%20Thermistor%20datasheet.pdf\",\n        \"properties\": {\n            \"Minimum Temprature\": \"0 degree C\",\n            \"Maximum Temprature\": \"1000 degree C\",\n            \"Voltage Range\": \"0V-6V\",\n            \"isBreadBoardPlaceable\" : 1 \n        },\n        \"innerHTMLContent\": \"<br> <h4>Formula:</h4> <b>Beta:</b> ß = ln(R1/R2)/((1/T1)-(1/T2)) <br> <b>Internal Resistance:</b> Rt = 10000 * e<sup>ß*( (<sup>1</sup>/<sub>T1</sub>)-(<sup>1</sup>/<sub>T2</sub>) )</sup> <br> <b>Voltage Out:</b> V<sub>out</sub> = (Rs / (Rs + Rt)) * V<sub>in</sub> <br> <h4>References</h4> <b>Thermistors - NTC & PTC:</b> <a href='https://www.youtube.com/watch?v=nXmkkyw8v5A' target='_blank' rel='noopener noreferrer'>Video</a> <br> <b>Voltage out formula:</b> <a href='https://www.petervis.com/electronics%20guides/calculators/thermistor/thermistor.html' target='_blank' rel='noopener noreferrer'>Document</a> <br> <h4>Resistance vs Temprature chart</h4> <img src='https://www.arroyoinstruments.com/images/cms/sized/Thermistor%20RT%20Chart.gif' alt='' style='width:100%;'> \"\n    }\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/UltrasonicSensor.json",
    "content": "{\n    \"name\": \"Ultrasonic Distance Sensor\",\n    \"className\": \"UltrasonicSensor\",\n    \"pins\": [\n        {\n            \"x\": 75,\n            \"y\": 100,\n            \"name\": \"VCC\"\n        },\n        {\n            \"x\": 90,\n            \"y\": 100,\n            \"name\": \"TRIG\"\n        },\n        {\n            \"x\": 105,\n            \"y\": 100,\n            \"name\": \"ECHO\"\n        },\n        {\n            \"x\": 120,\n            \"y\": 100,\n            \"name\": \"GND\"\n        }\n    ],\n    \"pointHalf\": 4,\n    \"draw\": [\n        {\n            \"type\": \"image\",\n            \"url\": \"assets/images/components/UltrasonicSensor.svg\",\n            \"width\": 203,\n            \"height\": 103.5,\n            \"x\": 0,\n            \"y\": 0\n        }\n    ],\n    \"simulation\": {},\n    \"info\": {\n        \"name\": \"Ultrasonic Sensor HC-SR04\",\n        \"image\": \"https://upload.wikimedia.org/wikipedia/commons/thumb/2/20/HC_SR04_Ultrasonic_sensor_1480322_3_4_HDR_Enhancer.jpg/640px-HC_SR04_Ultrasonic_sensor_1480322_3_4_HDR_Enhancer.jpg\",\n        \"Datasheet\": \"https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf\",\n        \"description\": \"HC-SR04 Ultrasonic (US) sensor is a 4 pin module, whose pin names are Vcc, Trigger, Echo and Ground respectively. This sensor is a very popular sensor used in many applications where measuring distance or sensing objects are required. The module has two eyes like projects in the front which forms the Ultrasonic transmitter and Receiver.\",\n        \"properties\": {\n            \"Operating voltage\": \"+5V\",\n            \"Theoretical  Measuring Distance\": \"2cm to 450cm\",\n            \"Practical Measuring Distance\": \"2cm to 80cm\",\n            \"Accuracy\": \"3mm\",\n            \"Measuring angle covered\": \"<15°\",\n            \"Operating Current\": \"<15mA\",\n            \"Operating Frequency\": \"40Hz\",\n            \"isBreadBoardPlaceable\" : 1 \n        }\n    }\n}"
  },
  {
    "path": "ArduinoFrontend/src/assets/jsons/help.json",
    "content": "[\n  {\n    \"title\": \"Drag and Drop Elements\",\n    \"descriptiom\": \"\",\n    \"image\": \"\"\n  }\n]\n"
  },
  {
    "path": "ArduinoFrontend/src/assets/samples/Samples.json",
    "content": "[\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Blink Example\",\n    \"description\": \"This is an Introduction to Arduino.\",\n    \"base64_image\": \"33659ff0-f762-4061-aeb0-fdbfdbbeeda2.png\",\n    \"create_time\": \"2020-06-16T04:10:17.969217Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":0,\\\"y\\\":-0.25,\\\"scale\\\":1},\\\"wires\\\":[{\\\"points\\\":[[319.625,115],[320.31944274902344,168]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592280640444,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592280616845,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2}},{\\\"points\\\":[[335.625,115],[582.625,114],[585.625,479],[399.625,483],[400.31944274902344,442]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592280640444,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592280616845,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20}}],\\\"LED\\\":[{\\\"x\\\":313.625,\\\"y\\\":67,\\\"tx\\\":17,\\\"ty\\\":-20,\\\"id\\\":1592280640444,\\\"data\\\":{\\\"color\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":193.31944274902344,\\\"y\\\":183,\\\"tx\\\":-89,\\\"ty\\\":-45,\\\"id\\\":1592280616845,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(LED_BUILTIN, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(LED_BUILTIN, HIGH);\\\\n    delay(1000);\\\\n\\\\tdigitalWrite(LED_BUILTIN, LOW);\\\\n    delay(1000);\\\\n}\\\"}}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Buzzer\",\n    \"description\": \"This is an Example of Buzzer.\",\n    \"shared\": true,\n    \"base64_image\": \"0154dacc-f03d-46b9-9e15-ab79d7a73d60.png\",\n    \"create_time\": \"2020-06-16T04:04:47.685811Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-15,\\\"y\\\":2.5,\\\"scale\\\":1},\\\"wires\\\":[{\\\"points\\\":[[410.3194580078125,138],[411.31944274902344,201]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592280227638,\\\"keyName\\\":\\\"Buzzer\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592280217174,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2}},{\\\"points\\\":[[440.3194580078125,138],[690.3194580078125,134],[690.3194580078125,512],[491.3194580078125,515],[491.31944274902344,475]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592280227638,\\\"keyName\\\":\\\"Buzzer\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592280217174,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20}}],\\\"ArduinoUno\\\":[{\\\"x\\\":251.31944274902344,\\\"y\\\":204,\\\"tx\\\":-56,\\\"ty\\\":-33,\\\"id\\\":1592280217174,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(LED_BUILTIN, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(LED_BUILTIN, HIGH);\\\\n    delay(1000);\\\\n\\\\tdigitalWrite(LED_BUILTIN, LOW);\\\\n    delay(1000);\\\\n}\\\"}}],\\\"Buzzer\\\":[{\\\"x\\\":417.3194580078125,\\\"y\\\":97,\\\"tx\\\":-23,\\\"ty\\\":-40,\\\"id\\\":1592280227638}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Seven Segment\",\n    \"description\": \"This is an Example of Seven Segment.\",\n    \"base64_image\": \"39fddd0e-16c4-49b1-9690-76d9af1f4baf.png\",\n    \"create_time\": \"2020-06-13T05:56:05.481143Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-74.75,\\\"y\\\":109.75,\\\"scale\\\":1.1},\\\"wires\\\":[{\\\"points\\\":[[750.3194580078125,248],[749.3194580078125,116],[545.3194580078125,112],[543.3194427490234,157]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":3},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":13}},{\\\"points\\\":[[766.3194580078125,248],[769.3194580078125,93],[530.3194580078125,92],[529.3194427490234,157]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":4},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":12}},{\\\"points\\\":[[750.3194580078125,339],[749.3194580078125,379],[788.3194580078125,377],[788.3194580078125,65],[514.3194580078125,62],[515.3194427490234,157]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":8},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":11}},{\\\"points\\\":[[720.3194580078125,339],[719.3194580078125,392],[815.3194580078125,394],[817.3194580078125,42],[504.3194580078125,43],[501.31944274902344,157]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":6},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":10}},{\\\"points\\\":[[705.3194580078125,339],[704.3194580078125,412],[849.3194580078125,411],[841.3194580078125,12],[489.3194580078125,18],[487.31944274902344,157]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":5},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":9}},{\\\"points\\\":[[720.3194580078125,248],[720.3194580078125,203],[678.3194580078125,204],[679.3194580078125,428],[867.3194580078125,434],[863.3194580078125,-8],[475.3194580078125,-3],[473.31944274902344,157]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8}},{\\\"points\\\":[[705.3194580078125,248],[652.8194580078125,248],[658.8194580078125,452],[890.8194580078125,454],[885.8194580078125,-28],[448.8194580078125,-25],[449.31944274902344,157]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":7}},{\\\"points\\\":[[735.3194580078125,248],[735.8194580078125,156],[635.8194580078125,153],[636.8194580078125,490],[456.8194580078125,489],[457.31944274902344,431]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20}}],\\\"SevenSegment\\\":[{\\\"x\\\":753.3194580078125,\\\"y\\\":332,\\\"tx\\\":-55,\\\"ty\\\":-95,\\\"id\\\":1591347187858}],\\\"ArduinoUno\\\":[{\\\"x\\\":236.31944274902344,\\\"y\\\":186,\\\"tx\\\":-75,\\\"ty\\\":-59,\\\"id\\\":1591347180843,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"int outs[10][7] = {\\\\n\\\\t{ 1,1,1,1,1,1,0 },    // 0\\\\n    { 0,1,1,0,0,0,0 },    // 1\\\\n    { 1,1,0,1,1,0,1 },    // 2\\\\n    { 1,1,1,1,0,0,1 },    // 3\\\\n    { 0,1,1,0,0,1,1 },    // 4\\\\n    { 1,0,1,1,0,1,1 },    // 5\\\\n    { 1,0,1,1,1,1,1 },    // 6\\\\n    { 1,1,1,0,0,0,0 },    // 7\\\\n    { 1,1,1,1,1,1,1 },    // 8\\\\n    { 1,1,1,0,0,1,1 }   // 9\\\\n};\\\\n\\\\nvoid setup(){\\\\n\\\\tpinMode(2,OUTPUT);\\\\n\\\\tpinMode(3,OUTPUT);\\\\n\\\\tpinMode(4,OUTPUT);\\\\n\\\\tpinMode(5,OUTPUT);\\\\n\\\\tpinMode(6,OUTPUT);\\\\n\\\\tpinMode(7,OUTPUT);\\\\n\\\\tpinMode(8,OUTPUT);\\\\t\\\\n}\\\\nint dig = 0;\\\\nvoid loop(){\\\\n\\\\tint pin = 2;\\\\n\\\\tfor(int i=0;i<7;++i){\\\\n\\\\t\\\\tdigitalWrite(pin,outs[dig][i]);\\\\n\\\\t\\\\t++pin;\\\\n\\\\t}\\\\t\\\\n    delay(1000);\\\\n    ++dig;\\\\n    if(dig >= 10)\\\\n        dig -= 10;\\\\n}\\\"}}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"RGB LED\",\n    \"description\": \"This is an Example of RGB LED.\",\n    \"base64_image\": \"2998f117-6253-4947-af78-dfacf9ff0344.png\",\n    \"create_time\": \"2020-06-20T02:57:40.024924Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":0.25,\\\"y\\\":0,\\\"scale\\\":1},\\\"wires\\\":[{\\\"points\\\":[[685.3194580078125,149],[687.3194580078125,176],[409.3194580078125,177],[410.3194580078125,538],[698.3194580078125,536],[696.3194580078125,510]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592621634830,\\\"keyName\\\":\\\"RGBLED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592621629068,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18}},{\\\"points\\\":[[670.3194580078125,149],[672.3194580078125,236]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592621634830,\\\"keyName\\\":\\\"RGBLED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592621629068,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":4}},{\\\"points\\\":[[702.3194580078125,149],[702.3194580078125,236]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592621634830,\\\"keyName\\\":\\\"RGBLED\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1592621629068,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":6}},{\\\"points\\\":[[719.3194580078125,149],[739.3194580078125,150],[740.3194580078125,236]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592621634830,\\\"keyName\\\":\\\"RGBLED\\\",\\\"pid\\\":3},\\\"end\\\":{\\\"id\\\":1592621629068,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8}}],\\\"RGBLED\\\":[{\\\"x\\\":670.3194580078125,\\\"y\\\":73,\\\"tx\\\":-3,\\\"ty\\\":-25,\\\"id\\\":1592621634830}],\\\"ArduinoUno\\\":[{\\\"x\\\":428.3194580078125,\\\"y\\\":206,\\\"tx\\\":0,\\\"ty\\\":0,\\\"id\\\":1592621629068,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(11, OUTPUT);\\\\n\\\\tpinMode(9, OUTPUT);\\\\n\\\\tpinMode(7, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tfor(int i=1;i<=7;++i){\\\\n        digitalWrite(11, i&1);\\\\n        digitalWrite(9, (i>>1)&1);\\\\n        digitalWrite(7, (i>>2)&1);\\\\n        delay(1000);\\\\n    }\\\\n}\\\"}}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Push Button Example\",\n    \"description\": null,\n    \"base64_image\": \"304ff01c-ed3a-4861-a183-e25483f623a1.png\",\n    \"create_time\": \"2020-06-16T03:56:57.802580Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-15.75,\\\"y\\\":-75,\\\"scale\\\":1},\\\"wires\\\":[{\\\"points\\\":[[415,213],[416,313]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592279848489,\\\"keyName\\\":\\\"Buzzer\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":7}},{\\\"points\\\":[[697,387],[694,261],[440,263],[440,313]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592279863383,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8}},{\\\"points\\\":[[445,213],[734,212],[737,663],[421,666],[424,587]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592279848489,\\\"keyName\\\":\\\"Buzzer\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20}},{\\\"points\\\":[[662,487],[662,607],[394,608],[396,587]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592279863383,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18}},{\\\"points\\\":[[697,487],[696,624],[408,631],[410,587]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592279863383,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":3},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19}},{\\\"points\\\":[[340.75,252.75],[344,313]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592279950865,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2}},{\\\"points\\\":[[356.75,252.75],[383.75,251.75],[382.75,144.75],[303.75,146.75],[304.75,252.75],[328.75,251.75],[330,313]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592279950865,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":1}}],\\\"LED\\\":[{\\\"x\\\":348.75,\\\"y\\\":176.75,\\\"tx\\\":3,\\\"ty\\\":8,\\\"id\\\":1592279950865,\\\"data\\\":{\\\"color\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":177,\\\"y\\\":290,\\\"tx\\\":-49,\\\"ty\\\":-7,\\\"id\\\":1592279815399,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(LED_BUILTIN, OUTPUT);\\\\n\\\\tpinMode(8, OUTPUT);\\\\n\\\\tpinMode(7, INPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n    if(digitalRead(7) == HIGH){\\\\n    \\\\tdigitalWrite(LED_BUILTIN, HIGH);\\\\n    \\\\tdigitalWrite(8, HIGH);\\\\n    }else{\\\\n        digitalWrite(LED_BUILTIN, LOW);\\\\n        digitalWrite(8, LOW);\\\\n    }\\\\n}\\\"}}],\\\"PushButton\\\":[{\\\"x\\\":640,\\\"y\\\":392,\\\"tx\\\":8,\\\"ty\\\":15,\\\"id\\\":1592279863383}],\\\"Buzzer\\\":[{\\\"x\\\":418,\\\"y\\\":73,\\\"tx\\\":-19,\\\"ty\\\":59,\\\"id\\\":1592279848489}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Counter\",\n    \"description\": \"This is an Example of Seven Segment and Push Button.\",\n    \"base64_image\": \"d165c639-d0ad-46bf-a391-2d61f21d235e.png\",\n    \"create_time\": \"2020-06-16T03:27:21.485125Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":0,\\\"y\\\":0.5,\\\"scale\\\":1},\\\"wires\\\":[{\\\"points\\\":[[238.31944274902344,274],[238.31944274902344,86],[532.3194580078125,82],[530.3194580078125,218]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592277596751,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":3}},{\\\"points\\\":[[273.31944274902344,374],[269.3194580078125,545],[568.3194580078125,543],[568.3194580078125,492]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592277596751,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":3},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18}},{\\\"points\\\":[[238.31944274902344,374],[236.31944274902344,569],[583.3194580078125,567],[582.3194580078125,492]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592277596751,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19}},{\\\"points\\\":[[880.3194580078125,290],[878.3194580078125,160],[683.3194580078125,161],[682.3194580078125,218]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":3},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":13}},{\\\"points\\\":[[896.3194580078125,290],[895.3194580078125,142],[668.3194580078125,144],[668.3194580078125,218]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":4},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":12}},{\\\"points\\\":[[880.3194580078125,381],[881.3194580078125,410],[918.3194580078125,410],[915.3194580078125,122],[654.3194580078125,124],[654.3194580078125,218]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":8},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":11}},{\\\"points\\\":[[850.3194580078125,381],[851.3194580078125,428],[939.3194580078125,428],[933.3194580078125,101],[638.3194580078125,104],[640.3194580078125,218]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":6},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":10}},{\\\"points\\\":[[835.3194580078125,381],[836.3194580078125,446],[961.3194580078125,447],[953.3194580078125,85],[624.3194580078125,88],[626.3194580078125,218]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":5},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":9}},{\\\"points\\\":[[850.3194580078125,290],[851.3194580078125,258],[818.3194580078125,258],[818.3194580078125,465],[971.3194580078125,466],[966.3194580078125,62],[611.3194580078125,70],[612.3194580078125,218]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8}},{\\\"points\\\":[[835.3194580078125,290],[795.3194580078125,290],[800.3194580078125,480],[991.3194580078125,479],[987.3194580078125,47],[587.3194580078125,52],[588.3194580078125,218]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":7}},{\\\"points\\\":[[865.3194580078125,290],[861.3194580078125,213],[769.3194580078125,214],[774.3194580078125,562],[598.3194580078125,563],[596.3194580078125,492]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20}}],\\\"SevenSegment\\\":[{\\\"x\\\":816.3194580078125,\\\"y\\\":346,\\\"tx\\\":12,\\\"ty\\\":-67,\\\"id\\\":1592277590862}],\\\"ArduinoUno\\\":[{\\\"x\\\":376.3194580078125,\\\"y\\\":252,\\\"tx\\\":-76,\\\"ty\\\":-64,\\\"id\\\":1592277587638,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"int outs[10][7] = {\\\\n\\\\t{ 1,1,1,1,1,1,0 },    // 0\\\\n    { 0,1,1,0,0,0,0 },    // 1\\\\n    { 1,1,0,1,1,0,1 },    // 2\\\\n    { 1,1,1,1,0,0,1 },    // 3\\\\n    { 0,1,1,0,0,1,1 },    // 4\\\\n    { 1,0,1,1,0,1,1 },    // 5\\\\n    { 1,0,1,1,1,1,1 },    // 6\\\\n    { 1,1,1,0,0,0,0 },    // 7\\\\n    { 1,1,1,1,1,1,1 },    // 8\\\\n    { 1,1,1,0,0,1,1 }   // 9\\\\n};\\\\n\\\\nvoid setup(){\\\\n\\\\tpinMode(2,OUTPUT);\\\\n\\\\tpinMode(3,OUTPUT);\\\\n\\\\tpinMode(4,OUTPUT);\\\\n\\\\tpinMode(5,OUTPUT);\\\\n\\\\tpinMode(6,OUTPUT);\\\\n\\\\tpinMode(7,OUTPUT);\\\\n\\\\tpinMode(8,OUTPUT);\\\\n\\\\tpinMode(12,INPUT);\\\\n}\\\\nint dig = 0;\\\\nvoid loop(){\\\\n\\\\tif(digitalRead(12) == HIGH){\\\\n\\\\t\\\\tint pin = 2;\\\\n\\\\t\\\\tfor(int i=0;i<7;++i){\\\\n\\\\t\\\\t\\\\tdigitalWrite(pin,outs[dig][i]);\\\\n\\\\t\\\\t\\\\t++pin;\\\\n\\\\t\\\\t}\\\\t\\\\t\\\\t\\\\n\\\\t\\\\t++dig;\\\\n        delay(100);\\\\n\\\\t}\\\\n    if(dig >= 10)\\\\n        dig -= 10;\\\\n}\\\"}}],\\\"PushButton\\\":[{\\\"x\\\":252.31944274902344,\\\"y\\\":310,\\\"tx\\\":-28,\\\"ty\\\":-16,\\\"id\\\":1592277596751}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Motors\",\n    \"description\": \"This is an Example of Motor.\",\n    \"base64_image\": \"833c1e66-32a7-4992-8207-53ecdb5f0174.png\",\n    \"create_time\": \"2020-06-16T02:26:23.832247Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-31,\\\"y\\\":-28.25,\\\"scale\\\":1.1},\\\"wires\\\":[{\\\"points\\\":[[664.3194580078125,292],[623.3194580078125,290],[621.3194580078125,201]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592274238321,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592274215230,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":1}},{\\\"points\\\":[[605.3194580078125,201],[606.3194580078125,334],[664.3194580078125,334]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592274215230,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592274238321,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":1}},{\\\"points\\\":[[393.3194580078125,209],[394.3194580078125,330],[409.3194580078125,329]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592274211174,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592274258222,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":1}},{\\\"points\\\":[[377.3194580078125,209],[376.3194580078125,288],[409.3194580078125,287]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592274211174,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592274258222,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":0}},{\\\"points\\\":[[262.31944274902344,203],[259.31944274902344,286]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592274209424,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592274294529,\\\"keyName\\\":\\\"CoinCell\\\",\\\"pid\\\":0}},{\\\"points\\\":[[246.31944274902344,203],[246.5858612060547,269.25],[215.6767578125,271.06817626953125],[212.94949340820312,378.3409118652344],[259.7676696777344,380.06817626953125],[259.31944274902344,358]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592274209424,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592274294529,\\\"keyName\\\":\\\"CoinCell\\\",\\\"pid\\\":1}}],\\\"CoinCell\\\":[{\\\"x\\\":227.31944274902344,\\\"y\\\":314,\\\"tx\\\":2,\\\"ty\\\":-31,\\\"id\\\":1592274294529}],\\\"Motor\\\":[{\\\"x\\\":218.31944274902344,\\\"y\\\":148,\\\"tx\\\":0,\\\"ty\\\":0,\\\"id\\\":1592274209424},{\\\"x\\\":390.3194580078125,\\\"y\\\":172,\\\"tx\\\":-41,\\\"ty\\\":-18,\\\"id\\\":1592274211174},{\\\"x\\\":583.3194580078125,\\\"y\\\":184,\\\"tx\\\":-6,\\\"ty\\\":-38,\\\"id\\\":1592274215230}],\\\"Battery9v\\\":[{\\\"x\\\":640.3194580078125,\\\"y\\\":280,\\\"tx\\\":24,\\\"ty\\\":-19,\\\"id\\\":1592274238321},{\\\"x\\\":478.3194580078125,\\\"y\\\":293,\\\"tx\\\":-69,\\\"ty\\\":-37,\\\"id\\\":1592274258222}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Temperature Sensor\",\n    \"description\": \"This is an Example of \\nTemperature Sensor\",\n    \"base64_image\": \"a4833249-fbe7-4513-b541-ccd7c5cdd7bc.png\",\n    \"create_time\": \"2020-06-13T05:56:16.922680Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":78.75,\\\"y\\\":22,\\\"scale\\\":1},\\\"wires\\\":[{\\\"points\\\":[[362.3194580078125,126],[577.3194580078125,124],[580.3194580078125,493],[404.3194580078125,494],[406.3194580078125,449]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1591458433019,\\\"keyName\\\":\\\"TMP36\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1591458428806,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20}},{\\\"points\\\":[[339.3194580078125,126],[91.31944274902344,128],[89.31944274902344,491],[378.3194580078125,495],[378.3194580078125,449]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1591458433019,\\\"keyName\\\":\\\"TMP36\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1591458428806,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18}},{\\\"points\\\":[[350.3194580078125,126],[353.3194580078125,318],[449.3194580078125,317],[450.3194580078125,449]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1591458433019,\\\"keyName\\\":\\\"TMP36\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1591458428806,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":22}}],\\\"TMP36\\\":[{\\\"x\\\":273.3194580078125,\\\"y\\\":81,\\\"tx\\\":63,\\\"ty\\\":-23,\\\"id\\\":1591458433019}],\\\"ArduinoUno\\\":[{\\\"x\\\":340.3194580078125,\\\"y\\\":188,\\\"tx\\\":-230,\\\"ty\\\":-43,\\\"id\\\":1591458428806,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup()\\\\n{\\\\n  Serial.begin(9600);\\\\n}\\\\n \\\\nvoid loop() {\\\\n int reading = analogRead(A0);   \\\\n float voltage = reading * 5.0;\\\\n voltage /= 1023.0; \\\\n  \\\\n float temperatureC = (voltage - 0.5) * 100;\\\\n Serial.print(temperatureC); \\\\n Serial.println(\\\\\\\" degrees C\\\\\\\");  \\\\n delay(1000);\\\\n}\\\"}}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Gas Sensor\",\n    \"description\": \"This is an Example of MQ2.\",\n    \"base64_image\": \"2151140f-9f34-4607-b3b3-184bee3f5d3f.png\",\n    \"create_time\": \"2020-06-16T02:39:55.484551Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":13.25,\\\"y\\\":284.25,\\\"scale\\\":0.6799999999999997},\\\"wires\\\":[{\\\"points\\\":[[423.3194580078125,304],[424.3194580078125,343]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592275089685,\\\"keyName\\\":\\\"MQ2\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592275094732,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":1}},{\\\"points\\\":[[448.3194580078125,304],[667.3194580078125,304],[668.3194580078125,655],[562.3194580078125,656],[562.3194580078125,617]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592275089685,\\\"keyName\\\":\\\"MQ2\\\",\\\"pid\\\":3},\\\"end\\\":{\\\"id\\\":1592275094732,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":22}},{\\\"points\\\":[[411.3194580078125,304],[209.31944274902344,303],[204.31944274902344,662],[491.3194580078125,659],[490.3194580078125,617]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592275089685,\\\"keyName\\\":\\\"MQ2\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592275094732,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18}}],\\\"MQ2\\\":[{\\\"x\\\":265.3194580078125,\\\"y\\\":217,\\\"tx\\\":118,\\\"ty\\\":-77,\\\"id\\\":1592275089685}],\\\"ArduinoUno\\\":[{\\\"x\\\":372.3194580078125,\\\"y\\\":475,\\\"tx\\\":-150,\\\"ty\\\":-162,\\\"id\\\":1592275094732,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tSerial.begin(9600);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tSerial.println(analogRead(A0));\\\\n    delay(1000);\\\\n}\\\"}}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"PIR Sensor\",\n    \"description\": \"This is an Example of PIR Sensor.\",\n    \"base64_image\": \"2255a330-a797-467b-8a08-403e6c6c6840.png\",\n    \"create_time\": \"2020-06-16T03:37:24.004404Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":19,\\\"y\\\":687.75,\\\"scale\\\":0.49999999999999956},\\\"wires\\\":[{\\\"points\\\":[[529.3194580078125,199.22222900390625],[529.3194580078125,251.22222900390625]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592278156916,\\\"keyName\\\":\\\"PIRSensor\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592278149628,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8}},{\\\"points\\\":[[544.3194580078125,199.22222900390625],[545.3194580078125,222.22222900390625],[685.3194580078125,221.22222900390625],[688.3194580078125,565.2222290039062],[483.3194580078125,565.2222290039062],[485.3194580078125,525.2222290039062]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592278156916,\\\"keyName\\\":\\\"PIRSensor\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592278149628,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18}},{\\\"points\\\":[[558.3194580078125,199.22222900390625],[707.3194580078125,198.22222900390625],[709.3194580078125,581.2222290039062],[499.3194580078125,583.2222290039062],[499.3194580078125,525.2222290039062]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592278156916,\\\"keyName\\\":\\\"PIRSensor\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1592278149628,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19}},{\\\"points\\\":[[340.31944274902344,166.22222137451172],[387.3194580078125,166.22222900390625],[385.3194580078125,46.22222137451172],[188.31944274902344,47.22222137451172],[182.31944274902344,608.2222290039062],[519.3194580078125,606.2222290039062],[513.3194580078125,525.2222290039062]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592278168268,\\\"keyName\\\":\\\"Buzzer\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592278149628,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20}},{\\\"points\\\":[[310.31944274902344,166.22222137451172],[310.3194580078125,197.22222900390625],[432.3194580078125,199.22222900390625],[433.3194580078125,251.22222900390625]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592278168268,\\\"keyName\\\":\\\"Buzzer\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592278149628,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2}}],\\\"PIRSensor\\\":[{\\\"x\\\":555.3194580078125,\\\"y\\\":131.22222900390625,\\\"tx\\\":-111,\\\"ty\\\":-97,\\\"id\\\":1592278156916}],\\\"ArduinoUno\\\":[{\\\"x\\\":359.3194580078125,\\\"y\\\":243.22222900390625,\\\"tx\\\":-142,\\\"ty\\\":-22,\\\"id\\\":1592278149628,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n    pinMode(12, OUTPUT);\\\\n    pinMode(13, OUTPUT);\\\\n    pinMode(7, INPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tif(digitalRead(7) == HIGH){\\\\n        digitalWrite(13, HIGH);\\\\n        digitalWrite(12, HIGH);\\\\n    }else{\\\\n        digitalWrite(13, LOW);\\\\n        digitalWrite(12, LOW);\\\\n    }\\\\n}\\\"}}],\\\"Buzzer\\\":[{\\\"x\\\":226.31944274902344,\\\"y\\\":74.22222137451172,\\\"tx\\\":68,\\\"ty\\\":11,\\\"id\\\":1592278168268}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Ultrasonic Sensor\",\n    \"description\": \"This is an Example of Ultrasonic sensor.\",\n    \"base64_image\": \"fa89e565-1b66-4f41-bf18-14c392198fd5.png\",\n    \"create_time\": \"2020-06-16T03:00:58.298956Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":46.5,\\\"y\\\":496,\\\"scale\\\":0.5799999999999996},\\\"wires\\\":[{\\\"points\\\":[[369.71881103515625,267.02040100097656],[128.51473999023438,265.2040710449219],[122.39228820800781,631.7142944335938],[402.984130859375,631.9183349609375],[403.31944274902344,602]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592276283186,\\\"keyName\\\":\\\"UltrasonicSensor\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592276266793,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18}},{\\\"points\\\":[[401.71881103515625,267.02040100097656],[595.5147094726562,263.6071472167969],[595.4534912109375,630.5458984375],[416.1065673828125,634.5867309570312],[417.31944274902344,602]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592276283186,\\\"keyName\\\":\\\"UltrasonicSensor\\\",\\\"pid\\\":3},\\\"end\\\":{\\\"id\\\":1592276266793,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19}},{\\\"points\\\":[[379.71881103515625,267.02040100097656],[379.2902526855469,287.8163146972656],[446.5759582519531,289.83673095703125],[447.31944274902344,328]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592276283186,\\\"keyName\\\":\\\"UltrasonicSensor\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592276266793,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8}},{\\\"points\\\":[[391.71881103515625,267.02040100097656],[390.5147399902344,276.5918273925781],[460.8004455566406,276.5918273925781],[461.31944274902344,328]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592276283186,\\\"keyName\\\":\\\"UltrasonicSensor\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1592276266793,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":9}}],\\\"UltrasonicSensor\\\":[{\\\"x\\\":286.71881103515625,\\\"y\\\":185.02040100097656,\\\"tx\\\":1,\\\"ty\\\":-22,\\\"id\\\":1592276283186}],\\\"ArduinoUno\\\":[{\\\"x\\\":239.31944274902344,\\\"y\\\":356,\\\"tx\\\":-104,\\\"ty\\\":-58,\\\"id\\\":1592276266793,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"const int pingPin = 7; // Trigger Pin of Ultrasonic Sensor\\\\nconst int echoPin = 6; // Echo Pin of Ultrasonic Sensor\\\\n\\\\nvoid setup() {\\\\n   pinMode(pingPin, OUTPUT);\\\\n   pinMode(echoPin, INPUT);\\\\n   Serial.begin(9600); // Starting Serial Terminal\\\\n}\\\\n\\\\nvoid loop() {\\\\n   long duration, inches, cm;\\\\n   digitalWrite(pingPin, LOW);\\\\n   delayMicroseconds(2);\\\\n   digitalWrite(pingPin, HIGH);\\\\n   delayMicroseconds(10);\\\\n   digitalWrite(pingPin, LOW);\\\\n   duration = pulseIn(echoPin, HIGH);\\\\n  //Serial.println(duration);\\\\n//    inches = microsecondsToInches(duration);\\\\n   cm = duration / 29 / 2;\\\\n   //Serial.print(inches);\\\\n   //Serial.print(\\\\\\\"in, \\\\\\\");\\\\n   Serial.print(cm);\\\\n   Serial.print(\\\\\\\"cm\\\\\\\");\\\\n   Serial.println();\\\\n   delay(1000);\\\\n}\\\\n\\\\n// long microsecondsToInches(long microseconds) {\\\\n//    return microseconds / 74 / 2;\\\\n// }\\\\n\\\\n// long microsecondsToCentimeters(long microseconds) {\\\\n//    return microseconds / 29 / 2;\\\\n// }\\\"}}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Servo\",\n    \"description\": \"This is an Example of Servo Motor.\",\n    \"base64_image\": \"852448da-507f-4759-ae81-5c91bef705a9.png\",\n    \"create_time\": \"2020-06-17T04:45:28.940345Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":0.25,\\\"y\\\":0.25,\\\"scale\\\":1},\\\"wires\\\":[{\\\"points\\\":[[778.75,151.75],[571.75,148.75],[577.75,412.75],[578.75,476.75],[414.75,479.75],[410.31944274902344,447]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592405259001,\\\"keyName\\\":\\\"ServoMotor\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592368525114,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20}},{\\\"points\\\":[[793.75,151.75],[793.75,115.75],[987.75,115.75],[987.75,490.75],[384.75,499.75],[382.31944274902344,447]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592405259001,\\\"keyName\\\":\\\"ServoMotor\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592368525114,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18}},{\\\"points\\\":[[808.75,151.75],[810.75,71.75],[486.75,78.75],[482.31944274902344,173]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592405259001,\\\"keyName\\\":\\\"ServoMotor\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1592368525114,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":12}}],\\\"ServoMotor\\\":[{\\\"x\\\":657.75,\\\"y\\\":287.75,\\\"tx\\\":102,\\\"ty\\\":-142,\\\"id\\\":1592405259001}],\\\"ArduinoUno\\\":[{\\\"x\\\":172.31944274902344,\\\"y\\\":146,\\\"tx\\\":-58,\\\"ty\\\":-3,\\\"id\\\":1592368525114,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"#include <Servo.h>\\\\nServo myservo;\\\\nint pos = 0;\\\\n\\\\nvoid setup() {\\\\n   myservo.attach(3);\\\\n}\\\\n\\\\nvoid loop() {\\\\n    for (pos = 0; pos <= 180; pos += 1) {\\\\n      myservo.write(pos);\\\\n      delay(15);\\\\n    }\\\\n    for (pos = 180; pos >= 0; pos -= 1) {\\\\n        myservo.write(pos);\\\\n        delay(15);\\\\n    }\\\\n}\\\\n\\\\n\\\"}}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Slide Switch\",\n    \"description\": \"This is an Example of Slide Switch.\",\n    \"base64_image\": \"78043b5e-9b82-441a-adbc-b2dfa54da645.png\",\n    \"create_time\": \"2020-06-15T07:04:13.189316Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":20.75,\\\"y\\\":116,\\\"scale\\\":0.9199999999999999},\\\"wires\\\":[{\\\"points\\\":[[784.3194580078125,213],[789.3327026367188,499.9166564941406],[494.04107666015625,498.9999694824219],[497.3194580078125,424]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592204238583,\\\"keyName\\\":\\\"SlideSwitch\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18}},{\\\"points\\\":[[801.3194580078125,213],[845.1243896484375,209.37498474121094],[839.9160766601562,76.04166412353516],[541.4577026367188,73.375],[541.3194580078125,150]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592204238583,\\\"keyName\\\":\\\"SlideSwitch\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8}},{\\\"points\\\":[[766.3194580078125,213],[715.9577026367188,211.4583282470703],[715.9577026367188,104.16666412353516],[556.7910766601562,102.16666412353516],[555.3194580078125,150]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592204238583,\\\"keyName\\\":\\\"SlideSwitch\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":9}},{\\\"points\\\":[[530.7910766601562,40.41666126251221],[511.3194580078125,424]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592204398406,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19}},{\\\"points\\\":[[514.7910766601562,40.41666126251221],[503.3194580078125,150]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592204398406,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":6}},{\\\"points\\\":[[446.6243896484375,100.95832824707031],[445.3194580078125,150]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592204396689,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2}},{\\\"points\\\":[[462.6243896484375,100.95832824707031],[490.8194580078125,100],[494.8194580078125,-10],[430.8194580078125,-9],[431.3194580078125,150]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592204396689,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":1}}],\\\"SlideSwitch\\\":[{\\\"x\\\":798.3194580078125,\\\"y\\\":294,\\\"tx\\\":-39,\\\"ty\\\":-108,\\\"id\\\":1592204238583}],\\\"LED\\\":[{\\\"x\\\":429.6243896484375,\\\"y\\\":-19.041671752929688,\\\"tx\\\":28,\\\"ty\\\":52,\\\"id\\\":1592204396689,\\\"data\\\":{\\\"color\\\":0}},{\\\"x\\\":483.79107666015625,\\\"y\\\":-7.583338737487793,\\\"tx\\\":42,\\\"ty\\\":-20,\\\"id\\\":1592204398406,\\\"data\\\":{\\\"color\\\":1}}],\\\"ArduinoUno\\\":[{\\\"x\\\":328.3194580078125,\\\"y\\\":225,\\\"tx\\\":-99,\\\"ty\\\":-105,\\\"id\\\":1592204233256,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(7, INPUT);\\\\n    pinMode(6, INPUT);\\\\n    pinMode(9, OUTPUT);\\\\n    pinMode(13, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tif(digitalRead(7) == HIGH){\\\\n        digitalWrite(13, HIGH);\\\\n        digitalWrite(9, LOW);\\\\n    }\\\\n    if(digitalRead(6) == HIGH){\\\\n        digitalWrite(13, LOW);\\\\n        digitalWrite(9, HIGH);\\\\n    }\\\\n}\\\"}}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Relay\",\n    \"description\": \"This is an Example of Relay.\",\n    \"base64_image\": \"bcbd0273-3a5c-4077-9d59-317f23f0c195.png\",\n    \"create_time\": \"2020-06-16T02:36:50.617778Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":7,\\\"y\\\":162.25,\\\"scale\\\":0.9199999999999999},\\\"wires\\\":[{\\\"points\\\":[[390.3194580078125,340],[386.66607666015625,576.2916259765625],[739.3743896484375,569.375],[737.3194580078125,526]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592274709494,\\\"keyName\\\":\\\"RelayModule\\\",\\\"pid\\\":4},\\\"end\\\":{\\\"id\\\":1592274680021,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18}},{\\\"points\\\":[[406.3194580078125,340],[467.79107666015625,338.6666564941406],[469.8743896484375,209.5],[669.8743896484375,208.4583282470703],[671.3194580078125,252]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592274709494,\\\"keyName\\\":\\\"RelayModule\\\",\\\"pid\\\":5},\\\"end\\\":{\\\"id\\\":1592274680021,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":1}},{\\\"points\\\":[[376.3194580078125,340],[372.65155029296875,436.9456481933594],[452.2167663574219,436.0325927734375],[455.65155029296875,188.68478393554688],[685.1732788085938,185.68478393554688],[685.3194580078125,252]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592274709494,\\\"keyName\\\":\\\"RelayModule\\\",\\\"pid\\\":3},\\\"end\\\":{\\\"id\\\":1592274680021,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2}},{\\\"points\\\":[[403.3194580078125,161],[563.7493896484375,156.22825622558594],[565.9232788085938,93.18477630615234],[581.7928466796875,91.88043022155762]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592274709494,\\\"keyName\\\":\\\"RelayModule\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1592274925181,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":1}},{\\\"points\\\":[[380.0537414550781,75.09782218933105],[378.3194580078125,161]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592274941280,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592274709494,\\\"keyName\\\":\\\"RelayModule\\\",\\\"pid\\\":1}},{\\\"points\\\":[[364.0537414550781,75.09782218933105],[317.26025390625,74.70651245117188],[317.26025390625,-37.250003814697266],[554.216796875,-39.42391586303711],[555.3037109375,52.967384338378906],[581.7928466796875,49.88043022155762]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592274941280,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592274925181,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":0}}],\\\"RelayModule\\\":[{\\\"x\\\":267.3194580078125,\\\"y\\\":208,\\\"tx\\\":50,\\\"ty\\\":-70,\\\"id\\\":1592274709494}],\\\"LED\\\":[{\\\"x\\\":380.0537414550781,\\\"y\\\":-7.902177810668945,\\\"tx\\\":-5,\\\"ty\\\":15,\\\"id\\\":1592274941280,\\\"data\\\":{\\\"color\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":449.3194580078125,\\\"y\\\":217,\\\"tx\\\":20,\\\"ty\\\":5,\\\"id\\\":1592274680021,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(LED_BUILTIN, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(LED_BUILTIN, HIGH);\\\\n    delay(1000);\\\\n\\\\tdigitalWrite(LED_BUILTIN, LOW);\\\\n    delay(1000);\\\\n}\\\"}}],\\\"Battery9v\\\":[{\\\"x\\\":601.7928466796875,\\\"y\\\":-23.119569778442383,\\\"tx\\\":-20,\\\"ty\\\":42,\\\"id\\\":1592274925181}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"create_time\": \"2020-06-26T13:09:09.786644Z\",\n    \"name\": \"Two Arduinos\",\n    \"description\": \"Blink Example For using two Arduino in workspace.\",\n    \"base64_image\": \"e61852b4-3f8f-4b74-8ca3-4505f5a5b752.png\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-113.25,\\\"y\\\":54,\\\"scale\\\":1.1800000000000002},\\\"wires\\\":[{\\\"points\\\":[[336.375,213],[336.375,271]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593176474698,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593176471875,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2}},{\\\"points\\\":[[352.375,213],[369.375,214],[621.375,216],[614.375,608],[416.375,611],[416.375,545]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593176474698,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593176471875,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20}},{\\\"points\\\":[[973,229],[973.375,268]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593176480662,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593176476626,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":3}},{\\\"points\\\":[[989,229],[1216.375,233],[1222.375,573],[1041.375,573],[1039.375,542]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593176480662,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593176476626,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20}}],\\\"LED\\\":[{\\\"x\\\":363.375,\\\"y\\\":146,\\\"tx\\\":-16,\\\"ty\\\":-1,\\\"id\\\":1593176474698,\\\"data\\\":{\\\"color\\\":4}},{\\\"x\\\":100,\\\"y\\\":100,\\\"tx\\\":884,\\\"ty\\\":61,\\\"id\\\":1593176480662,\\\"data\\\":{\\\"color\\\":1}}],\\\"ArduinoUno\\\":[{\\\"x\\\":135.375,\\\"y\\\":237,\\\"tx\\\":-15,\\\"ty\\\":4,\\\"id\\\":1593176471875,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(LED_BUILTIN, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(LED_BUILTIN, HIGH);\\\\n    delay(1000);\\\\n\\\\tdigitalWrite(LED_BUILTIN, LOW);\\\\n    delay(1000);\\\\n}\\\"}},{\\\"x\\\":939.375,\\\"y\\\":338,\\\"tx\\\":-196,\\\"ty\\\":-100,\\\"id\\\":1593176476626,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 2\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(12, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(12, HIGH);\\\\n    delay(300);\\\\n\\\\tdigitalWrite(12, LOW);\\\\n    delay(300);\\\\n}\\\"}}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Play With Serial Input\",\n    \"description\": \"Glow LED Using Serial Input.\",\n    \"base64_image\": \"5721d871-3393-4d66-afe3-bfa0612178d2.png\",\n    \"create_time\": \"2020-06-26T15:17:59.743679Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-355.25,\\\"y\\\":-3,\\\"scale\\\":1},\\\"wires\\\":[{\\\"points\\\":[[659.375,179],[656.375,273]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593183905780,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593183899067,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":3}},{\\\"points\\\":[[675.375,179],[947.375,179],[956.375,611],[719.375,610],[722.375,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593183905780,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593183899067,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20}}],\\\"Label\\\":[{\\\"x\\\":1084.375,\\\"y\\\":183,\\\"tx\\\":-59,\\\"ty\\\":2,\\\"id\\\":1593184554578,\\\"data\\\":{\\\"text\\\":\\\"Note\\\",\\\"size\\\":58,\\\"color\\\":\\\"#ff0000\\\",\\\"weight\\\":\\\"Bold\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":1059.625,\\\"y\\\":254,\\\"tx\\\":197,\\\"ty\\\":-18,\\\"id\\\":1593184582898,\\\"data\\\":{\\\"text\\\":\\\"Send G to Glow LED and any other alphabet to stop the glow.\\\",\\\"size\\\":23,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}}],\\\"LED\\\":[{\\\"x\\\":665.375,\\\"y\\\":186,\\\"tx\\\":5,\\\"ty\\\":-75,\\\"id\\\":1593183905780,\\\"data\\\":{\\\"color\\\":4}}],\\\"ArduinoUno\\\":[{\\\"x\\\":443.375,\\\"y\\\":277,\\\"tx\\\":-17,\\\"ty\\\":-34,\\\"id\\\":1593183899067,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n    Serial.begin(9600);\\\\n\\\\tpinMode(12, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n    if(Serial.available() > 0){\\\\n        char c = Serial.read();\\\\n        if(c == 'G')\\\\n        \\\\tdigitalWrite(12, HIGH);\\\\n        else\\\\n        \\\\tdigitalWrite(12, LOW);\\\\n    }\\\\n}\\\"}}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Motor Driver\",\n    \"description\": \"Send Commands to w,s,a,d in serial input to start motor.\",\n    \"base64_image\": \"3bf01a9d-803b-4907-bacd-b7ad1765df8d.png\",\n    \"create_time\": \"2020-06-23T07:28:38.653666Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":34.75,\\\"y\\\":60.25,\\\"scale\\\":1.04},\\\"wires\\\":[{\\\"points\\\":[[158.2432403564453,180.05404663085938],[158.6666717529297,200.44444274902344]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592897349163,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":6}},{\\\"points\\\":[[174.2432403564453,180.05404663085938],[171.6666717529297,200.44444274902344]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592897349163,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":7}},{\\\"points\\\":[[56.59459686279297,288.70269775390625],[175,292.1071472167969],[173.6666717529297,314.44444274902344]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592897371331,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":9}},{\\\"points\\\":[[40.59459686279297,288.70269775390625],[41.11111068725586,318.297607421875],[161.6666717529297,314.44444274902344]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592897371331,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":8}},{\\\"points\\\":[[202.375,527.5],[204.6666717529297,294.44444274902344]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593055552928,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":11}},{\\\"points\\\":[[596.3783874511719,431.0810852050781],[597.477294921875,462.1590881347656],[822.375,460.5]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20},\\\"end\\\":{\\\"id\\\":1593055525879,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":3}},{\\\"points\\\":[[204.6666717529297,284.44444274902344],[263.0227355957031,285.1590881347656],[265.0227355957031,488.3863525390625],[839.3409423828125,493.8409118652344],[837.375,460.5]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":12},\\\"end\\\":{\\\"id\\\":1593055525879,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":7}},{\\\"points\\\":[[202.375,569.5],[166.15908813476562,571.25],[166.15908813476562,639.4318237304688],[883.2045288085938,645.1136474609375],[867.375,460.5]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593055552928,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593055525879,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":15}},{\\\"points\\\":[[207.6666717529297,206.44444274902344],[211.61363220214844,52.477272033691406],[669.79541015625,49.749996185302734],[668.3783874511719,157.08108520507812]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":12}},{\\\"points\\\":[[207.6666717529297,256.44444274902344],[308.646240234375,256.73114013671875],[308.646240234375,135.0330352783203],[575.6273803710938,135.0330352783203],[574.3783874511719,157.08108520507812]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":5},\\\"end\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":6}},{\\\"points\\\":[[207.6666717529297,246.44444274902344],[300.1556701660156,248.24058532714844],[300.1556701660156,126.54246520996094],[586.6651000976562,127.76887512207031],[588.3783874511719,157.08108520507812]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":4},\\\"end\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":7}},{\\\"points\\\":[[207.6666717529297,236.44444274902344],[291.66510009765625,240.6934051513672],[291.66510009765625,116.16510009765625],[612.4764404296875,117.27831268310547],[612.3783874511719,157.08108520507812]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":3},\\\"end\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8}},{\\\"points\\\":[[207.6666717529297,226.44444274902344],[284.1179504394531,231.2594451904297],[284.1179504394531,104.84434509277344],[626.57080078125,105.7877426147461],[626.3783874511719,157.08108520507812]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":9}},{\\\"points\\\":[[207.6666717529297,216.44444274902344],[272.0235900878906,215.05189514160156],[273.7405700683594,86.9198226928711],[639.6085205078125,89.69340515136719],[640.3783874511719,157.08108520507812]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":10}}],\\\"BreadBoard\\\":[{\\\"x\\\":807.375,\\\"y\\\":127.5,\\\"tx\\\":-4,\\\"ty\\\":26,\\\"id\\\":1593055525879}],\\\"L298N\\\":[{\\\"x\\\":156.6666717529297,\\\"y\\\":214.44444274902344,\\\"tx\\\":-71,\\\"ty\\\":-21,\\\"id\\\":1592897236003}],\\\"Motor\\\":[{\\\"x\\\":143.2432403564453,\\\"y\\\":129.05404663085938,\\\"tx\\\":-13,\\\"ty\\\":-4,\\\"id\\\":1592897349163},{\\\"x\\\":119.59459686279297,\\\"y\\\":352.70269775390625,\\\"tx\\\":-107,\\\"ty\\\":-119,\\\"id\\\":1592897371331}],\\\"ArduinoUno\\\":[{\\\"x\\\":378.3783874511719,\\\"y\\\":206.08108520507812,\\\"tx\\\":-78,\\\"ty\\\":-79,\\\"id\\\":1592897315035,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n    Serial.begin(9600);\\\\n    pinMode(3, OUTPUT);\\\\n\\\\tpinMode(5, OUTPUT);\\\\n\\\\tpinMode(6, OUTPUT);\\\\n\\\\tpinMode(7, OUTPUT);\\\\n\\\\tpinMode(8, OUTPUT);\\\\n\\\\tpinMode(9, OUTPUT);\\\\n    analogWrite(3, 127);\\\\n    analogWrite(9, 127);\\\\n}\\\\nvoid loop(){\\\\n\\\\tif(Serial.available() > 0){\\\\n        char ch = Serial.read();\\\\n        Serial.println(ch);\\\\n        if(ch == 'w'){\\\\n            // Move Forward\\\\n            digitalWrite(5, LOW);\\\\n            digitalWrite(6, HIGH);\\\\n            digitalWrite(7, LOW);\\\\n            digitalWrite(8, HIGH);\\\\n        }else if(ch == 's'){\\\\n            // Move Backward\\\\n            digitalWrite(5, HIGH);\\\\n            digitalWrite(6, LOW);\\\\n            digitalWrite(7, HIGH);\\\\n            digitalWrite(8, LOW);\\\\n        }else if(ch == 'a'){\\\\n            // Move Left\\\\n            digitalWrite(5, LOW);\\\\n            digitalWrite(6, HIGH);\\\\n            digitalWrite(7, LOW);\\\\n            digitalWrite(8, LOW);\\\\n        }else if(ch == 'd'){\\\\n            // Move Right\\\\n            digitalWrite(5, LOW);\\\\n            digitalWrite(6, LOW);\\\\n            digitalWrite(7, LOW);\\\\n            digitalWrite(8, HIGH);\\\\n        }\\\\n    }\\\\n}\\\"}}],\\\"Battery9v\\\":[{\\\"x\\\":865.375,\\\"y\\\":610.5,\\\"tx\\\":-663,\\\"ty\\\":-114,\\\"id\\\":1593055552928}]}\"\n  },\n  {\n    \"author\": \"Navonil Das\",\n    \"name\": \"Blink With BreadBoard.\",\n    \"description\": \"\",\n    \"base64_image\": \"2e9514c6-69ac-495e-9c4f-09f90c0ca182.png\",\n    \"create_time\": \"2020-06-30T15:22:50.922533Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":1,\\\"y\\\":12.5,\\\"scale\\\":1},\\\"wires\\\":[{\\\"points\\\":[[427.375,521],[429.375,583],[656.375,584],[658.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530174651,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":3}},{\\\"points\\\":[[688.375,244],[688.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530226379,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":11}},{\\\"points\\\":[[672.375,244],[673.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530226379,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":5}},{\\\"points\\\":[[703.375,245],[703.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530229859,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":13}},{\\\"points\\\":[[719.375,245],[718.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530229859,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":19}},{\\\"points\\\":[[749.375,246],[751.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530234619,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":21}},{\\\"points\\\":[[765.375,246],[766.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530234619,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":27}},{\\\"points\\\":[[779.625,242.5],[781.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530303771,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":29}},{\\\"points\\\":[[795.625,242.5],[796.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530303771,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":35}},{\\\"points\\\":[[485.375,247],[493.625,171.5],[601.625,170.5],[602.625,250.5],[658.375,246]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593530174651,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":11},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":1}},{\\\"points\\\":[[843.625,244.5],[844.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530333499,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":41}},{\\\"points\\\":[[859.625,244.5],[859.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530333499,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":47}},{\\\"points\\\":[[875.625,244.5],[874.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530382683,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":49}},{\\\"points\\\":[[891.625,244.5],[889.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530382683,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":55}},{\\\"points\\\":[[951.625,243.5],[952.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530403714,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":65}},{\\\"points\\\":[[967.625,243.5],[967.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530403714,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":71}},{\\\"points\\\":[[982.625,243.5],[982.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530416251,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":73}},{\\\"points\\\":[[998.625,243.5],[997.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530416251,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":79}},{\\\"points\\\":[[1045.625,242.5],[1045.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530441994,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":85}},{\\\"points\\\":[[1061.625,242.5],[1060.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530441994,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":91}},{\\\"points\\\":[[1073.625,242.5],[1075.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530458634,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":93}},{\\\"points\\\":[[1089.625,242.5],[1090.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530458634,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":99}}],\\\"BreadBoard\\\":[{\\\"x\\\":794.375,\\\"y\\\":282,\\\"tx\\\":-155,\\\"ty\\\":-73,\\\"id\\\":1593530197683}],\\\"LED\\\":[{\\\"x\\\":711.375,\\\"y\\\":147,\\\"tx\\\":-28,\\\"ty\\\":29,\\\"id\\\":1593530226379,\\\"data\\\":{\\\"color\\\":0}},{\\\"x\\\":761.375,\\\"y\\\":133,\\\"tx\\\":-47,\\\"ty\\\":44,\\\"id\\\":1593530229859,\\\"data\\\":{\\\"color\\\":4}},{\\\"x\\\":799.375,\\\"y\\\":145,\\\"tx\\\":-39,\\\"ty\\\":33,\\\"id\\\":1593530234619,\\\"data\\\":{\\\"color\\\":1}},{\\\"x\\\":844.625,\\\"y\\\":160.5,\\\"tx\\\":-54,\\\"ty\\\":14,\\\"id\\\":1593530303771,\\\"data\\\":{\\\"color\\\":2}},{\\\"x\\\":854.625,\\\"y\\\":135.5,\\\"tx\\\":0,\\\"ty\\\":41,\\\"id\\\":1593530333499,\\\"data\\\":{\\\"color\\\":3}},{\\\"x\\\":900.625,\\\"y\\\":159.5,\\\"tx\\\":-14,\\\"ty\\\":17,\\\"id\\\":1593530382683,\\\"data\\\":{\\\"color\\\":4}},{\\\"x\\\":923.625,\\\"y\\\":153.5,\\\"tx\\\":39,\\\"ty\\\":22,\\\"id\\\":1593530403714,\\\"data\\\":{\\\"color\\\":5}},{\\\"x\\\":1007.625,\\\"y\\\":160.5,\\\"tx\\\":-14,\\\"ty\\\":15,\\\"id\\\":1593530416251,\\\"data\\\":{\\\"color\\\":0}},{\\\"x\\\":1078.625,\\\"y\\\":167.5,\\\"tx\\\":-22,\\\"ty\\\":7,\\\"id\\\":1593530441994,\\\"data\\\":{\\\"color\\\":1}},{\\\"x\\\":1098.625,\\\"y\\\":194.5,\\\"tx\\\":-14,\\\"ty\\\":-20,\\\"id\\\":1593530458634,\\\"data\\\":{\\\"color\\\":3}}],\\\"ArduinoUno\\\":[{\\\"x\\\":369.375,\\\"y\\\":340,\\\"tx\\\":-238,\\\"ty\\\":-123,\\\"id\\\":1593530174651,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(4, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(4, HIGH);\\\\n    delay(1000);\\\\n\\\\tdigitalWrite(4, LOW);\\\\n    delay(1000);\\\\n}\\\"}}]}\"\n  },\n  {\n    \"author\": \"Meet_Shah9224\",\n    \"name\": \"Arduino-Servo Motor controlled by Potentiometer\",\n    \"description\": \"This example shows how Servo-Motor is triggered by Potentiometer according to Potentiometer's Output values\",\n    \"base64_image\": \"b27a5b15-486e-4483-ae61-f5762749b315.png\",\n    \"create_time\": \"2020-07-03T19:17:29.676350Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":0,\\\"y\\\":0,\\\"scale\\\":1},\\\"wires\\\":[{\\\"points\\\":[[441.53125,417],[442.53125,507],[723.53125,508],[722.53125,160],[753.53125,159]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593795977808,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18},\\\"end\\\":{\\\"id\\\":1593795986033,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":1}},{\\\"points\\\":[[469.53125,417],[471.53125,492],[691.53125,492],[692.53125,133]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593795977808,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20},\\\"end\\\":{\\\"id\\\":1593796000275,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":2}},{\\\"points\\\":[[669.53125,133],[669.53125,472],[512.53125,474],[513.53125,417]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1593796000275,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593795977808,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":22}},{\\\"points\\\":[[646.53125,133],[645.53125,179],[768.53125,180],[768.53125,159]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593796000275,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593795986033,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":5}},{\\\"points\\\":[[108.53125,219],[107.53125,10],[784.53125,9],[783.53125,159]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593796008196,\\\"keyName\\\":\\\"ServoMotor\\\",\\\"pid\\\":1},\\\"end\\\":{\\\"id\\\":1593795986033,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":9}},{\\\"points\\\":[[122.53125,219],[121.53125,66],[448.53125,68],[447.53125,143]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1593796008196,\\\"keyName\\\":\\\"ServoMotor\\\",\\\"pid\\\":2},\\\"end\\\":{\\\"id\\\":1593795977808,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":6}},{\\\"points\\\":[[92.53125,219],[91.53125,193],[29.53125,193],[35.53125,534],[457.53125,542],[455.53125,417]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593796008196,\\\"keyName\\\":\\\"ServoMotor\\\",\\\"pid\\\":0},\\\"end\\\":{\\\"id\\\":1593795977808,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19}}],\\\"BreadBoard\\\":[{\\\"x\\\":419.53125,\\\"y\\\":195,\\\"tx\\\":315,\\\"ty\\\":-73,\\\"id\\\":1593795986033}],\\\"ServoMotor\\\":[{\\\"x\\\":76.53125,\\\"y\\\":346,\\\"tx\\\":-5,\\\"ty\\\":-137,\\\"id\\\":1593796008196}],\\\"PotentioMeter\\\":[{\\\"x\\\":641.53125,\\\"y\\\":55,\\\"tx\\\":-27,\\\"ty\\\":-40,\\\"id\\\":1593796000275,\\\"data\\\":{\\\"value\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":369.53125,\\\"y\\\":288,\\\"tx\\\":-196,\\\"ty\\\":-175,\\\"id\\\":1593795977808,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"#include <Servo.h>\\\\n\\\\nServo myServo;  // create servo object to control a servo\\\\n\\\\nvoid setup() {\\\\n  // initialize serial communication at 9600 bits per second:\\\\n  Serial.begin(9600);\\\\n  \\\\n  myServo.attach(9);  // attaches the servo on pin 9 to the servo object\\\\n}\\\\n\\\\nvoid loop() {\\\\n  // reads the value of the potentiometer (value between 0 and 1023)\\\\n  int analogValue = analogRead(A0);\\\\n\\\\n  // scales it to use it with the servo (value between 0 and 180)\\\\n  int angle = map(analogValue, 0, 1023, 0, 180);\\\\n\\\\n  // sets the servo position according to the scaled value\\\\n  myServo.write(angle); \\\\n\\\\n  // print out the value\\\\n  Serial.print(\\\\\\\"Analog: \\\\\\\");\\\\n  Serial.print(analogValue);\\\\n  Serial.print(\\\\\\\", Angle: \\\\\\\");\\\\n  Serial.println(angle);\\\\n  delay(100);\\\\n}\\\\n\\\"}}]}\"\n  },\n  {\n    \"author\": \"Sample\",\n    \"name\": \"LCD with BreadBoard\",\n    \"description\": \"Display text on LCD\",\n    \"base64_image\": \"56009d15-6216-4bd2-935a-0ab76596ae76.png\",\n    \"create_time\": \"2020-09-14T19:17:29.676350Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-27.5,\\\"y\\\":126.5,\\\"scale\\\":0.98},\\\"wires\\\":[{\\\"points\\\":[[344.2916717529297,424],[344.2916717529297,462.75],[510.5416564941406,462.75],[510.5416564941406,184.75],[642.5416870117188,184.75],[642.2916870117188,197.5]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":106,\\\"isSoldered\\\":false}},{\\\"points\\\":[[316.2916717529297,424],[316.2916717529297,486.75],[535.5416870117188,486.75],[535.5416870117188,111.75],[655.5416870117188,111.75],[657.2916870117188,197.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":108,\\\"isSoldered\\\":false}},{\\\"points\\\":[[250.2916717529297,150],[250.2916717529297,-78.5625],[868.2904052734375,-76.5625],[867.2916870117188,197.5]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":136,\\\"isSoldered\\\":false}},{\\\"points\\\":[[264.2916717529297,150],[264.2916717529297,-60.593753814697266],[703.2904052734375,-60.593753814697266],[702.2916870117188,197.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":114,\\\"isSoldered\\\":false}},{\\\"points\\\":[[278.2916717529297,150],[278.2916717529297,-44.96875],[686.1029052734375,-44.96875],[687.2916870117188,197.5]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":112,\\\"isSoldered\\\":false}},{\\\"points\\\":[[292.2916717529297,150],[292.2916717529297,-25.968751907348633],[719.6966552734375,-25.968751907348633],[717.2916870117188,197.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":116,\\\"isSoldered\\\":false}},{\\\"points\\\":[[374.2916717529297,150],[374.2916717529297,89.65625],[669.6966552734375,89.65625],[672.2916870117188,197.5]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":110,\\\"isSoldered\\\":false}},{\\\"points\\\":[[388.2916717529297,150],[388.2916717529297,74.03125],[791.2279052734375,76.03125],[792.2916870117188,197.5]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":10,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":126,\\\"isSoldered\\\":false}},{\\\"points\\\":[[402.2916717529297,150],[402.2916717529297,57.625],[803.5404052734375,57.625],[807.2916870117188,197.5]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":11,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":128,\\\"isSoldered\\\":false}},{\\\"points\\\":[[416.2916717529297,150],[416.2916717529297,37.3125],[817.6029052734375,37.3125],[822.2916870117188,197.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":130,\\\"isSoldered\\\":false}},{\\\"points\\\":[[430.2916717529297,150],[430.2916717529297,13.875],[832.4466552734375,13.875],[837.2916870117188,197.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":13,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":132,\\\"isSoldered\\\":false}},{\\\"points\\\":[[642.2916870117188,242.5],[642.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":286,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"points\\\":[[657.2916870117188,242.5],[657.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":288,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"points\\\":[[672.2916870117188,242.5],[672.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":290,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"points\\\":[[687.2916870117188,242.5],[687.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":292,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false}},{\\\"points\\\":[[702.2916870117188,242.5],[702.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":294,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false}},{\\\"points\\\":[[717.2916870117188,242.5],[717.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":296,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":5,\\\"isSoldered\\\":false}},{\\\"points\\\":[[732.2916870117188,242.5],[732.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":298,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":6,\\\"isSoldered\\\":false}},{\\\"points\\\":[[747.2916870117188,242.5],[747.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":300,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":7,\\\"isSoldered\\\":false}},{\\\"points\\\":[[762.2916870117188,242.5],[762.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":302,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"points\\\":[[777.2916870117188,242.5],[777.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":304,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false}},{\\\"points\\\":[[792.2916870117188,242.5],[792.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":306,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":10,\\\"isSoldered\\\":false}},{\\\"points\\\":[[807.2916870117188,242.5],[807.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":308,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":11,\\\"isSoldered\\\":false}},{\\\"points\\\":[[822.2916870117188,242.5],[822.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":310,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false}},{\\\"points\\\":[[837.2916870117188,242.5],[837.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":312,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":13,\\\"isSoldered\\\":false}},{\\\"points\\\":[[852.2916870117188,242.5],[852.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":314,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":14,\\\"isSoldered\\\":false}},{\\\"points\\\":[[867.2916870117188,242.5],[867.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":316,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":15,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":963.2916870117188,\\\"y\\\":126,\\\"tx\\\":-385,\\\"ty\\\":0,\\\"id\\\":1599924379959}],\\\"LCD16X2\\\":[{\\\"x\\\":468.2916564941406,\\\"y\\\":528,\\\"tx\\\":132,\\\"ty\\\":-294,\\\"id\\\":1599924401381}],\\\"ArduinoUno\\\":[{\\\"x\\\":162.2916717529297,\\\"y\\\":209,\\\"tx\\\":-114,\\\"ty\\\":-89,\\\"id\\\":1599924382841,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"#include<LiquidCrystal.h>\\\\nLiquidCrystal lcd(12, 13, 11, 5, 4, 3, 2);\\\\n\\\\nbyte human[8] = {0b01110,0b01110,0b00100,0b01110,0b10101,0b00100,0b01010,0b01010};\\\\nbyte rocket[8] = {0b00100,0b01110,0b11111,0b11111,0b01110,0b01110,0b01010,0b01010};\\\\n\\\\nvoid setup() {\\\\n    lcd.begin(16, 2);\\\\n    lcd.createChar(1, human);\\\\n    lcd.createChar(2, rocket);\\\\n} \\\\nvoid loop() { \\\\n\\\\n    lcd.setCursor(1,0);\\\\n    lcd.write(byte(1));\\\\n\\\\n    lcd.setCursor(3, 0);\\\\n    lcd.print(\\\\\\\"Simulations\\\\\\\");    \\\\n\\\\n    lcd.setCursor(4, 1);\\\\n    lcd.print(\\\\\\\"on Cloud\\\\\\\");\\\\n\\\\n    lcd.setCursor(13,1);\\\\n    lcd.write(byte(2));\\\\n\\\\n    delay(1000);\\\\n    lcd.clear();\\\\n    delay(1000);\\\\n}\\\"}}]}\"\n  },\n  {\n    \"author\": \"Kartik Gautam\",\n    \"name\": \"LED with Potentiometer\",\n    \"description\": \"Change LED's intensity using Potentiometer\",\n    \"base64_image\": \"56009d15-6216-4bd2-935a-0ab76596ae77.png\",\n    \"create_time\": \"2021-07-14T19:17:29.676350Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":198.75,\\\"y\\\":-90.25,\\\"scale\\\":0.9199999999999999},\\\"wires\\\":[{\\\"id\\\":1626289935711,\\\"points\\\":[[529,400.5],[529.5,399.275]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":116,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626289433076,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1626289935712,\\\"points\\\":[[544,400.5],[544.2,399.275]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":118,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626289433076,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1626289935713,\\\"points\\\":[[559,400.5],[558.4,399.275]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":120,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626289433076,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1626290844787,\\\"points\\\":[[634,400.5],[633,398.25]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":130,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626289441941,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1626289935714,\\\"points\\\":[[649,400.5],[649,398.25]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":132,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626289441941,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1626290352346,\\\"points\\\":[[301,356],[301,311],[379,311],[379,430.5],[409,430.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626289295708,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":13,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":220,\\\"isSoldered\\\":false}},{\\\"id\\\":1626289935716,\\\"points\\\":[[201,630],[201,675],[379,675],[379,460.5],[454,460.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626289295708,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":346,\\\"isSoldered\\\":false}},{\\\"id\\\":1626289935717,\\\"points\\\":[[409,415.5],[529,415.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":160,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":176,\\\"isSoldered\\\":false}},{\\\"id\\\":1626289935718,\\\"points\\\":[[544,415.5],[634,415.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":178,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":190,\\\"isSoldered\\\":false}},{\\\"id\\\":1626290239976,\\\"points\\\":[[454,445.5],[649,445.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":286,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":312,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":119,\\\"y\\\":154,\\\"tx\\\":271,\\\"ty\\\":175,\\\"id\\\":1626289288122}],\\\"PotentioMeter\\\":[{\\\"x\\\":419,\\\"y\\\":188.25,\\\"tx\\\":90,\\\"ty\\\":132,\\\"id\\\":1626289433076,\\\"data\\\":{\\\"value\\\":0}}],\\\"Label\\\":[{\\\"x\\\":559.9444580078125,\\\"y\\\":214.7777862548828,\\\"tx\\\":-22,\\\"ty\\\":58,\\\"id\\\":1626289675883,\\\"data\\\":{\\\"text\\\":\\\"Rotatepotentiometer'sknob\\\",\\\"size\\\":15,\\\"color\\\":\\\"#6a0dad\\\",\\\"weight\\\":\\\"Lighter\\\",\\\"style\\\":\\\"Normal\\\"}},{\\\"x\\\":389.9444580078125,\\\"y\\\":223.6666717529297,\\\"tx\\\":147,\\\"ty\\\":70,\\\"id\\\":1626289761249,\\\"data\\\":{\\\"text\\\":\\\"tochangeintensityofLED\\\",\\\"size\\\":15,\\\"color\\\":\\\"#6a0dad\\\",\\\"weight\\\":\\\"Lighter\\\",\\\"style\\\":\\\"normal\\\"}}],\\\"LED\\\":[{\\\"x\\\":281,\\\"y\\\":154.25,\\\"tx\\\":363,\\\"ty\\\":176,\\\"id\\\":1626289441941,\\\"data\\\":{\\\"color\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":43,\\\"y\\\":352,\\\"tx\\\":-124,\\\"ty\\\":-26,\\\"id\\\":1626289295708,\\\"data\\\":{\\\"name\\\":\\\"ArduinoUNOR31\\\",\\\"code\\\":\\\"int PIN = 2;\\\\n\\\\nvoid setup(){\\\\n    // set PIN mode to output\\\\n\\\\tpinMode(PIN, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n    // set output to High\\\\n\\\\tdigitalWrite(PIN, HIGH);\\\\n}\\\"}}]}\"\n  },\n  {\n    \"author\": \"Kartik Gautam\",\n    \"name\": \"L293D Motor Driver\",\n    \"description\": \"Change motor direction and speed using Potentiometer & push buttons\",\n    \"base64_image\": \"31145g15-6216-4bd2-935a-0ab79296ae67.png\",\n    \"create_time\": \"2021-07-21T19:17:29.676350Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-501.25,\\\"y\\\":-69.75,\\\"scale\\\":1.08},\\\"wires\\\":[{\\\"id\\\":1626834621571,\\\"points\\\":[[1168.5,486.5],[1167.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":360,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834632190,\\\"points\\\":[[1183.5,486.5],[1183.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":362,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835359414,\\\"points\\\":[[1198.5,486.5],[1197.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":364,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621572,\\\"points\\\":[[1213.5,486.5],[1211.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":366,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834997733,\\\"points\\\":[[1228.5,486.5],[1226.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":368,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835211366,\\\"points\\\":[[1243.5,486.5],[1241.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":370,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":5,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835599596,\\\"points\\\":[[1258.5,486.5],[1258.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":372,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":6,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621573,\\\"points\\\":[[1273.5,486.5],[1274.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":374,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":7,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834728555,\\\"points\\\":[[1168.5,546.5],[1167.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":121,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835461947,\\\"points\\\":[[1183.5,546.5],[1183.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":123,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835137530,\\\"points\\\":[[1198.5,546.5],[1199.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":125,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":10,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835122828,\\\"points\\\":[[1213.5,546.5],[1214.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":127,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":11,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621574,\\\"points\\\":[[1228.5,546.5],[1229.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":129,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835329676,\\\"points\\\":[[1243.5,546.5],[1243.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":131,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":13,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834638354,\\\"points\\\":[[1258.5,546.5],[1258.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":133,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":14,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834717794,\\\"points\\\":[[1273.5,546.5],[1274.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":135,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":15,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621575,\\\"points\\\":[[1438.5,426.5],[1440,425.75]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":156,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626370960254,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834659767,\\\"points\\\":[[1453.5,426.5],[1456,425.75]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":158,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626370960254,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835069551,\\\"points\\\":[[1198.5,471.5],[1438.5,471.5]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":304,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":336,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835239707,\\\"points\\\":[[1243.5,456.5],[1453.5,456.5]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":250,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":278,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621576,\\\"points\\\":[[1273.5,426.5],[1297.5,392]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":134,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":61,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835037989,\\\"points\\\":[[1168.5,426.5],[1171.5,392]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":120,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":37,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834683162,\\\"points\\\":[[1273.5,606.5],[1311,608.75],[1312.5,392]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":375,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":65,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621577,\\\"points\\\":[[1213.5,426.5],[1219.5,377]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":126,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":44,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834759996,\\\"points\\\":[[1228.5,426.5],[1234.5,377]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":128,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":48,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834963362,\\\"points\\\":[[1063.5,561.5],[1063.5,561.775]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":167,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626370943992,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835605609,\\\"points\\\":[[1078.5,561.5],[1078.2,561.775]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":169,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626370943992,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621578,\\\"points\\\":[[1093.5,561.5],[1092.4,561.775]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":171,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626370943992,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834766427,\\\"points\\\":[[881.9166870117188,652.1944427490234],[883.0556030273438,697.138916015625],[1077.9444580078125,697.4722290039062],[1078.5,606.5]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":22,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":349,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835234361,\\\"points\\\":[[1063.5,606.5],[1063.5,647]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":347,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":14,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621579,\\\"points\\\":[[1093.5,606.5],[1111.5,662]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":351,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":23,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835481281,\\\"points\\\":[[1342.5,392],[1342.5,647]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":73,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":74,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835533224,\\\"points\\\":[[1357.5,377],[1357.5,662]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":76,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":79,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835314887,\\\"points\\\":[[1258.5,426.5],[1260.8333740234375,317.1388854980469],[783.0556030273438,316.02777099609375],[785.9166870117188,378.19444274902344]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":132,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621580,\\\"points\\\":[[799.9166870117188,378.19444274902344],[798.6111450195312,329.3611145019531],[1185.27783203125,330.47222900390625],[1183.5,426.5]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":5,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":122,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835593564,\\\"points\\\":[[757.9166870117188,378.19444274902344],[759.7222290039062,271.5833435058594],[1035.8333740234375,271.1388854980469]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626371450798,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834825529,\\\"points\\\":[[1070.8333740234375,271.1388854980469],[1078.5,377]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626371450798,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":16,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834893206,\\\"points\\\":[[771.9166870117188,378.19444274902344],[774.1666870117188,290.47222900390625],[1144.166748046875,287.1388854980469],[1147.166748046875,267.80555725097656]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626371452788,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621581,\\\"points\\\":[[1182.166748046875,267.80555725097656],[1204.5,392]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626371452788,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":41,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834810430,\\\"points\\\":[[823.9166870117188,652.1944427490234],[826.7777709960938,720.75],[1403.4444580078125,721.8611450195312],[1405.5,662]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":87,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834958934,\\\"points\\\":[[809.9166870117188,652.1944427490234],[817.888916015625,741.8611450195312],[1424.5555419921875,737.4166870117188],[1420.5,647]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":90,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":1089.5,\\\"y\\\":470,\\\"tx\\\":-90,\\\"ty\\\":-115,\\\"id\\\":1626370927984}],\\\"PotentioMeter\\\":[{\\\"x\\\":1132,\\\"y\\\":263.75,\\\"tx\\\":-89,\\\"ty\\\":219,\\\"id\\\":1626370943992,\\\"data\\\":{\\\"value\\\":0}}],\\\"Label\\\":[{\\\"x\\\":1289.0555419921875,\\\"y\\\":115,\\\"tx\\\":-125,\\\"ty\\\":18,\\\"id\\\":1626834625520,\\\"data\\\":{\\\"text\\\":\\\"Push to rotate\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":1325.7222900390625,\\\"y\\\":117.22222137451172,\\\"tx\\\":-160,\\\"ty\\\":36,\\\"id\\\":1626834655604,\\\"data\\\":{\\\"text\\\":\\\"Anti-Clockwise\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":783.5,\\\"y\\\":116.11111450195312,\\\"tx\\\":259,\\\"ty\\\":19,\\\"id\\\":1626834670688,\\\"data\\\":{\\\"text\\\":\\\"Push to rotate\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":881.2777709960938,\\\"y\\\":142.7777862548828,\\\"tx\\\":163,\\\"ty\\\":13,\\\"id\\\":1626834672616,\\\"data\\\":{\\\"text\\\":\\\"Clockwise\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":1023.5,\\\"y\\\":856.1111450195312,\\\"tx\\\":77,\\\"ty\\\":-86,\\\"id\\\":1626834704194,\\\"data\\\":{\\\"text\\\":\\\"Rotate potentiometer to change motor's RPM\\\",\\\"size\\\":24,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}}],\\\"Motor\\\":[{\\\"x\\\":1051,\\\"y\\\":175.75,\\\"tx\\\":361,\\\"ty\\\":195,\\\"id\\\":1626370960254}],\\\"ArduinoUno\\\":[{\\\"x\\\":952.9166870117188,\\\"y\\\":153.19444274902344,\\\"tx\\\":-411,\\\"ty\\\":195,\\\"id\\\":1626371174393,\\\"data\\\":{\\\"name\\\":\\\"ArduinoUNOR32\\\",\\\"code\\\":\\\"const int potPin = A0;\\\\nconst int fwdbuttonPin = 13;\\\\nconst int bckbuttonPin = 12;\\\\nconst int ICpin2 = 11;\\\\nconst int ICpin7 = 10;\\\\n\\\\nint potValue = 0;\\\\nint motorValue = 0;\\\\nint fwdbuttonState = 0;\\\\nint bckbuttonState = 0;\\\\n\\\\nvoid setup()\\\\n{\\\\npinMode(fwdbuttonPin, INPUT_PULLUP);\\\\npinMode(bckbuttonPin,INPUT_PULLUP);\\\\n\\\\npinMode(ICpin2, OUTPUT);\\\\npinMode(ICpin7, OUTPUT);\\\\n}\\\\n\\\\nvoid loop()\\\\n{\\\\npotValue = analogRead(potPin);\\\\nmotorValue = map(potValue, 0, 1023, 0, 255);\\\\nfwdbuttonState = digitalRead(fwdbuttonPin);\\\\nbckbuttonState = digitalRead(bckbuttonPin);\\\\n\\\\ndelay (500);\\\\nif(fwdbuttonState == LOW || bckbuttonState == LOW)\\\\n{\\\\n    analogWrite(fwdbuttonState == LOW ? ICpin2 : ICpin7, motorValue);         \\\\n    digitalWrite(fwdbuttonState == LOW ? ICpin7 : ICpin2, LOW);\\\\n} else\\\\n{\\\\n    analogWrite(ICpin2, 1);\\\\n    analogWrite(ICpin7, 1);\\\\n}\\\\n}\\\\n\\\"}}],\\\"PushButton\\\":[{\\\"x\\\":970.8333740234375,\\\"y\\\":187.13888549804688,\\\"tx\\\":51,\\\"ty\\\":4,\\\"id\\\":1626371450798},{\\\"x\\\":1194.166748046875,\\\"y\\\":223.80555725097656,\\\"tx\\\":-61,\\\"ty\\\":-36,\\\"id\\\":1626371452788}],\\\"L293D\\\":[{\\\"x\\\":375.46875,\\\"y\\\":664,\\\"tx\\\":788,\\\"ty\\\":-175,\\\"id\\\":1626326054444}]}\"\n  },\n  {\n    \"author\": \"Kartik Gautam\",\n    \"name\": \"LED with LDR\",\n    \"description\": \"Change intensity of light from LED using LDR\",\n    \"base64_image\": \"31125g25-6216-4bd2-935a-0ab79296a123.png\",\n    \"create_time\": \"2021-07-26T19:17:29.676350Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":39.5,\\\"y\\\":-20,\\\"scale\\\":1.2200000000000002},\\\"wires\\\":[{\\\"id\\\":1627283225471,\\\"points\\\":[[259,560],[259,583.0701904296875],[488.881591796875,583.0701904296875],[488.881591796875,561.140380859375],[517,561]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626864742739,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false}},{\\\"id\\\":1627283225473,\\\"points\\\":[[652,355.5],[650,357]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":238,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626864757742,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1627283225474,\\\"points\\\":[[667,355.5],[666,357]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":240,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626864757742,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1627283225476,\\\"points\\\":[[667,385.5],[670,561]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":360,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":39,\\\"isSoldered\\\":false}},{\\\"id\\\":1627284170811,\\\"points\\\":[[562,370.5],[482.03509521484375,370.5],[482.03509521484375,233.9385986328125],[195.19297790527344,233.9385986328125],[193,286]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":286,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626864742739,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1627283225478,\\\"points\\\":[[577,370.5],[652,370.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":288,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":298,\\\"isSoldered\\\":false}},{\\\"id\\\":1627283262244,\\\"points\\\":[[562,325.5],[561.0833129882812,324.5833282470703]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":106,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627283259152,\\\"keyName\\\":\\\"PhotoResistor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1627283262246,\\\"points\\\":[[577,325.5],[576.0833129882812,324.5833282470703]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":108,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627283259152,\\\"keyName\\\":\\\"PhotoResistor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":254,\\\"y\\\":101,\\\"tx\\\":244,\\\"ty\\\":153,\\\"id\\\":1626864744564}],\\\"PhotoResistor\\\":[{\\\"x\\\":538.0833129882812,\\\"y\\\":175.5833282470703,\\\"tx\\\":6,\\\"ty\\\":89,\\\"id\\\":1627283259152}],\\\"Label\\\":[{\\\"x\\\":528.9893188476562,\\\"y\\\":119.62232971191406,\\\"tx\\\":22,\\\"ty\\\":44,\\\"id\\\":1627283306260,\\\"data\\\":{\\\"text\\\":\\\"Move slider to change LED's brightness\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}}],\\\"LED\\\":[{\\\"x\\\":198,\\\"y\\\":64,\\\"tx\\\":463,\\\"ty\\\":225,\\\"id\\\":1626864757742,\\\"data\\\":{\\\"color\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":54,\\\"y\\\":259,\\\"tx\\\":-77,\\\"ty\\\":-3,\\\"id\\\":1626864742739,\\\"data\\\":{\\\"name\\\":\\\"ArduinoUNOR31\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(13, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(13, HIGH);\\\\n}\\\"}}]}\"\n  },\n  {\n    \"author\": \"Kartik Gautam\",\n    \"name\": \"Serial output with thermistor\",\n    \"description\": \"Show ADC value in serial output\",\n    \"base64_image\": \"33345g15-6216-4bd2-935a-0ab79296ae67.png\",\n    \"create_time\": \"2021-07-29T19:17:29.676350Z\",\n    \"data_dump\": \"{\\\"id\\\":1627499898093,\\\"canvas\\\":{\\\"x\\\":-410.25,\\\"y\\\":-131.25,\\\"scale\\\":1.1400000000000001},\\\"wires\\\":[{\\\"id\\\":1627499789361,\\\"points\\\":[[746.9415130615234,655.1282043457031],[746.9415130615234,708.2069091796875],[1043.7586669921875,708.2069091796875],[1044.300537109375,481.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1627148899389,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":350,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499789363,\\\"points\\\":[[680.9415130615234,381.1282043457031],[679.9415130615234,352.5172424316406],[939.5172729492188,351.5172424316406],[938.5172729492188,601.5517578125],[984.300537109375,601.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1627148899389,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":343,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499789364,\\\"points\\\":[[984.300537109375,436.5],[1029.300537109375,436.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":162,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":168,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500424552,\\\"points\\\":[[1029.300537109375,481.5],[1029.300537109375,688.2672729492188],[877.0344848632812,688.2672729492188],[874.9415130615234,655.1282043457031]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":348,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627148899389,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":26,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500012671,\\\"points\\\":[[1029.300537109375,421.5],[1028.27587890625,421.34483337402344]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":108,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627442453873,\\\"keyName\\\":\\\"Thermistor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499789365,\\\"points\\\":[[1044.300537109375,421.5],[1046.27587890625,421.34483337402344]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":110,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627442453873,\\\"keyName\\\":\\\"Thermistor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500261793,\\\"points\\\":[[984.300537109375,466.5],[982.1466674804688,468.20513916015625]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":282,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627148918352,\\\"keyName\\\":\\\"Resistor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499789366,\\\"points\\\":[[984.300537109375,556.5],[982.1466674804688,559.2051391601562]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":163,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627148918352,\\\"keyName\\\":\\\"Resistor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":950.300537109375,\\\"y\\\":350,\\\"tx\\\":0,\\\"ty\\\":0,\\\"id\\\":1627148894928}],\\\"Resistor\\\":[{\\\"x\\\":954.1466674804688,\\\"y\\\":178.20513916015625,\\\"tx\\\":17,\\\"ty\\\":286,\\\"id\\\":1627148918352,\\\"data\\\":{\\\"value\\\":1000,\\\"tolerance\\\":10}}],\\\"Label\\\":[{\\\"x\\\":1070.403564453125,\\\"y\\\":191,\\\"tx\\\":-38,\\\"ty\\\":41,\\\"id\\\":1627499818860,\\\"data\\\":{\\\"text\\\":\\\"Move slider to change ADC\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":740.5789794921875,\\\"y\\\":245.38597106933594,\\\"tx\\\":295,\\\"ty\\\":8,\\\"id\\\":1627499857054,\\\"data\\\":{\\\"text\\\":\\\"value in serial output\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}}],\\\"ArduinoUno\\\":[{\\\"x\\\":125.94151306152344,\\\"y\\\":305.1282043457031,\\\"tx\\\":353,\\\"ty\\\":46,\\\"id\\\":1627148899389,\\\"data\\\":{\\\"name\\\":\\\"ArduinoUNOR31\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tSerial.begin(9600);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tint val = analogRead(A4);\\\\n    Serial.println(val);\\\\n    delay (500);\\\\n}\\\"}}],\\\"Thermistor\\\":[{\\\"x\\\":716.27587890625,\\\"y\\\":146.34483337402344,\\\"tx\\\":302,\\\"ty\\\":185,\\\"id\\\":1627442453873}]}\"\n  },\n  {\n    \"author\": \"Kartik Gautam\",\n    \"name\": \"LED's brightness using Thermistor\",\n    \"description\": \"Change LED's brightness using Thermistor\",\n    \"base64_image\": \"32245g15-6216-4bd2-935a-0ab79296ae67.png\",\n    \"create_time\": \"2021-07-29T19:17:29.676350Z\",\n    \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-65,\\\"y\\\":-59,\\\"scale\\\":1.1400000000000001},\\\"wires\\\":[{\\\"id\\\":1627499922111,\\\"points\\\":[[814.5,349.5],[813.5,350]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":124,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627149645405,\\\"keyName\\\":\\\"Thermistor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499922112,\\\"points\\\":[[829.5,349.5],[831.5,350]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":126,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627149645405,\\\"keyName\\\":\\\"Thermistor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500886994,\\\"points\\\":[[814.5,409.5],[814.5,617],[506.5,617],[504.5,577]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":364,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149636154,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":26,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499922113,\\\"points\\\":[[709.5,409.5],[599.5,409.5],[599.5,596],[404.5,596],[404.5,577]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":350,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149636154,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499922114,\\\"points\\\":[[709.5,394.5],[708.5,396]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":290,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627149744110,\\\"keyName\\\":\\\"Resistor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500280552,\\\"points\\\":[[709.5,484.5],[708.5,487]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":171,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627149744110,\\\"keyName\\\":\\\"Resistor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500273198,\\\"points\\\":[[709.5,499.5],[762.5,499.5],[762.5,394],[814.5,394.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":231,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":304,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499922115,\\\"points\\\":[[829.5,409.5],[829.5,648],[374.5,648],[376.5,577]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":366,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149636154,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500494445,\\\"points\\\":[[476.5,303],[476.5,277.3918762207031],[564.8441772460938,277.3918762207031],[564.8441772460938,364.5540466308594],[739.5,364.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1627149636154,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":174,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499922116,\\\"points\\\":[[725.25,269],[725.25,331.4459533691406],[709.7026977539062,331.4459533691406],[709.5,349.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1627281921222,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":110,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499994233,\\\"points\\\":[[709.25,269],[709.25,307.79730224609375],[736.0540771484375,307.79730224609375],[739.5,349.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1627281921222,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":114,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":615.5,\\\"y\\\":278,\\\"tx\\\":0,\\\"ty\\\":0,\\\"id\\\":1627149633636}],\\\"Resistor\\\":[{\\\"x\\\":197.5,\\\"y\\\":126,\\\"tx\\\":500,\\\"ty\\\":266,\\\"id\\\":1627149744110,\\\"data\\\":{\\\"value\\\":1000,\\\"tolerance\\\":10}}],\\\"Label\\\":[{\\\"x\\\":450.96490478515625,\\\"y\\\":135.3157958984375,\\\"tx\\\":260,\\\"ty\\\":42,\\\"id\\\":1627499939355,\\\"data\\\":{\\\"text\\\":\\\"LED's brightness\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":472.8947448730469,\\\"y\\\":163.38597106933594,\\\"tx\\\":233,\\\"ty\\\":-9,\\\"id\\\":1627499941934,\\\"data\\\":{\\\"text\\\":\\\"Move slider to change\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}}],\\\"LED\\\":[{\\\"x\\\":720.25,\\\"y\\\":201,\\\"tx\\\":0,\\\"ty\\\":0,\\\"id\\\":1627281921222,\\\"data\\\":{\\\"color\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":-29.5,\\\"y\\\":311,\\\"tx\\\":138,\\\"ty\\\":-38,\\\"id\\\":1627149636154,\\\"data\\\":{\\\"name\\\":\\\"ArduinoUNOR31\\\",\\\"code\\\":\\\"int i;\\\\nint val;\\\\n\\\\nvoid setup(){\\\\n\\\\tpinMode(3, OUTPUT); \\\\n    Serial . begin (115200);\\\\n    \\\\n\\\\tfor(i = 1; i <= 20; i++) {\\\\n        val = analogRead(A4) ; // read value from \\\\n        Serial.println(val); //display\\\\n        if(val > 550) {\\\\n            digitalWrite(3,HIGH);\\\\n        }else{\\\\n            digitalWrite (3 , LOW);\\\\n        }\\\\n        delay (500) ;\\\\n    }\\\\n    digitalWrite (3 , LOW) ;\\\\n}\\\\n\\\\nvoid loop(){\\\\n}\\\"}}],\\\"Thermistor\\\":[{\\\"x\\\":307.5,\\\"y\\\":156,\\\"tx\\\":496,\\\"ty\\\":104,\\\"id\\\":1627149645405}]}\"\n  }\n]"
  },
  {
    "path": "ArduinoFrontend/src/browserslist",
    "content": "# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers\n# For additional information regarding the format and rule options, please see:\n# https://github.com/browserslist/browserslist#queries\n#\n# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed\n\n> 0.5%\nlast 2 versions\nFirefox ESR\nnot dead\nnot IE 9-11"
  },
  {
    "path": "ArduinoFrontend/src/environments/environment.prod.ts",
    "content": "/**\n * Environment variable For Production\n */\nexport const environment = {\n  production: true,\n  API_URL: '../../',\n  LOGIN_URL: `../../../eda/#/login?url=`,\n  DASHBOARD_URL: `../arduino/#/dashboard`,\n  CHANGED_PASSWORD_URL: `../../../eda/#/account/change_password?url=`,\n  IMG_URL: ''\n};\n"
  },
  {
    "path": "ArduinoFrontend/src/environments/environment.ts",
    "content": "// This file can be replaced during build by using the `fileReplacements` array.\n// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.\n// The list of file replacements can be found in `angular.json`.\n/**\n * Environment variable\n */\nexport const environment = {\n  production: false,\n  API_URL: 'http://localhost/',\n  LOGIN_URL: `${window.location.protocol}\\\\\\\\localhost/eda/#/login?url=`,\n  DASHBOARD_URL: `../#/dashboard`,\n  CHANGED_PASSWORD_URL: `${window.location.protocol}\\\\\\\\localhost/eda/#/account/change_password?url=`,\n  IMG_URL: 'http://localhost'\n};\n\n/*\n * For easier debugging in development mode, you can import the following file\n * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.\n *\n * This import should be commented out in production mode because it will have a negative impact\n * on performance if an error is thrown.\n */\n// import 'zone.js/dist/zone-error';  // Included with Angular CLI.\n"
  },
  {
    "path": "ArduinoFrontend/src/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"description\"\n    content=\"Arduino On Cloud. Connect virtual components to arduino boards, write code in your browser and witness it come alive!. Share Circuit with your friends.\">\n  <meta name=”robots” content=\"index, follow\">\n\n  <title>Arduino Circuit Designer</title>\n  <base href=\"/\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <link rel=\"icon\" type=\"image/x-icon\" href=\"favicon.ico\">\n  <script src=\"https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js\"\n    integrity=\"sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q\"\n    crossorigin=\"anonymous\"></script>\n\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css\">\n  <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css\"\n    integrity=\"sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm\" crossorigin=\"anonymous\">\n\n  <link href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n\n  <script src=\"./assets/js/jquery-3.5.0.slim.min.js\" crossorigin=\"anonymous\"></script>\n  <script src=\"https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js\"\n    integrity=\"sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM\"\n    crossorigin=\"anonymous\"></script>\n\n  <script src=\"./assets/js/raphael.min.js\"></script>\n  <script src=\"./assets/avr8js/index.js\"></script>\n  <script src=\"./assets/js/moment.min.js\"></script>\n  <script src=\"./assets/canvg/umd.js\"></script>\n\n  <script>\n    // Global function to display loading svg while simulation\n    window['showLoading'] = () => {\n      const showloader = document.getElementById('loadanim');\n      showloader.style.display = 'flex';\n    };\n    // Global function to hide loading svg after simulation\n    window['hideLoading'] = () => {\n      const hideloader = document.getElementById('loadanim');\n      hideloader.style.display = 'none';\n    };\n  </script>\n</head>\n\n<body>\n  <div id=\"loadanim\"\n    style=\"display: block;top: 44%; left: 52%; z-index: 100; position: absolute; width: 100vw; height: 100vh; background: transparent;\">\n    <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"140px\" height=\"140px\"\n      viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid\">\n      <path fill=\"none\" stroke=\"#6252c5\" stroke-width=\"8\" stroke-dasharray=\"42.76482137044271 42.76482137044271\"\n        d=\"M24.3 30C11.4 30 5 43.3 5 50s6.4 20 19.3 20c19.3 0 32.1-40 51.4-40 C88.6 30 95 43.3 95 50s-6.4 20-19.3 20C56.4 70 43.6 30 24.3 30z\"\n        stroke-linecap=\"round\" style=\"transform:scale(0.8);transform-origin:50px 50px\">\n        <animate attributeName=\"stroke-dashoffset\" repeatCount=\"indefinite\" dur=\"1s\" keyTimes=\"0;1\"\n          values=\"0;256.58892822265625\"></animate>\n      </path>\n\n    </svg>\n  </div>\n  <app-root></app-root>\n</body>\n\n</html>\n"
  },
  {
    "path": "ArduinoFrontend/src/karma.conf.js",
    "content": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-file.html\n\nmodule.exports = function (config) {\n  config.set({\n    basePath: '',\n    frameworks: ['jasmine', '@angular-devkit/build-angular'],\n    files: [\n      'assets/js/raphael.min.js',\n      'assets/js/moment.min.js',\n    ],\n    plugins: [\n      require('karma-jasmine'),\n      require('karma-chrome-launcher'),\n      require('karma-jasmine-html-reporter'),\n      require('karma-coverage-istanbul-reporter'),\n      require('@angular-devkit/build-angular/plugins/karma')\n    ],\n    client: {\n      clearContext: false // leave Jasmine Spec Runner output visible in browser\n    },\n    coverageIstanbulReporter: {\n      dir: require('path').join(__dirname, '../coverage/ArduinoFrontend'),\n      reports: ['html', 'lcovonly', 'text-summary'],\n      fixWebpackSourcePaths: true\n    },\n    reporters: ['progress', 'kjhtml'],\n    port: 9876,\n    colors: true,\n    logLevel: config.LOG_INFO,\n    autoWatch: true,\n    browsers: ['Chrome'],\n    singleRun: false,\n    customLaunchers: {\n      CIChromeHeadless: {\n        base: 'ChromeHeadless',\n        flags: ['--no-sandbox', '--disable-gpu']\n      }\n    }\n  });\n};\n"
  },
  {
    "path": "ArduinoFrontend/src/main.ts",
    "content": "import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app/app.module';\nimport { environment } from './environments/environment';\n\nif (environment.production) {\n  enableProdMode();\n}\n\nplatformBrowserDynamic().bootstrapModule(AppModule)\n  .catch(err => console.error(err));\n"
  },
  {
    "path": "ArduinoFrontend/src/polyfills.ts",
    "content": "/**\n * This file includes polyfills needed by Angular and is loaded before the app.\n * You can add your own extra polyfills to this file.\n *\n * This file is divided into 2 sections:\n *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.\n *   2. Application imports. Files imported after ZoneJS that should be loaded before your main\n *      file.\n *\n * The current setup is for so-called \"evergreen\" browsers; the last versions of browsers that\n * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),\n * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.\n *\n * Learn more in https://angular.io/guide/browser-support\n */\n\n/***************************************************************************************************\n * BROWSER POLYFILLS\n */\n\n/** IE10 and IE11 requires the following for NgClass support on SVG elements */\n// import 'classlist.js';  // Run `npm install --save classlist.js`.\n\n/**\n * Web Animations `@angular/platform-browser/animations`\n * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.\n * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).\n */\n// import 'web-animations-js';  // Run `npm install --save web-animations-js`.\n\n/**\n * By default, zone.js will patch all possible macroTask and DomEvents\n * user can disable parts of macroTask/DomEvents patch by setting following flags\n * because those flags need to be set before `zone.js` being loaded, and webpack\n * will put import in the top of bundle, so user need to create a separate file\n * in this directory (for example: zone-flags.ts), and put the following flags\n * into that file, and then add the following code before importing zone.js.\n * import './zone-flags.ts';\n *\n * The flags allowed in zone-flags.ts are listed here.\n *\n * The following flags will work for all browsers.\n *\n * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame\n * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick\n * (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames\n *\n *  in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js\n *  with the following flag, it will bypass `zone.js` patch for IE/Edge\n *\n *  (window as any).__Zone_enable_cross_context_check = true;\n *\n */\n\n/***************************************************************************************************\n * Zone JS is required by default for Angular itself.\n */\nimport 'zone.js/dist/zone';  // Included with Angular CLI.\n\n\n/***************************************************************************************************\n * APPLICATION IMPORTS\n */\n"
  },
  {
    "path": "ArduinoFrontend/src/styles.css",
    "content": "html,\nbody {\n  margin: 0;\n  font-family: Roboto, \"Helvetica Neue\", sans-serif;\n  overflow-x: hidden;\n  min-height: 100vh;\n}\n\ntextarea:hover,\ninput:hover,\ntextarea:active,\ninput:active,\ntextarea:focus,\ninput:focus,\nlabel:focus {\n  outline: 0px !important;\n  -webkit-appearance: none;\n}\ninput[type=\"text\"] {\n  box-shadow: none !important;\n}\nbutton:focus,\nbutton:active,\nbutton:hover {\n  outline: 0px !important;\n  -webkit-appearance: none;\n}\n\n.mat-tab-body-content {\n  overflow: hidden !important;\n}\n\n.head-title {\n  width: 100%;\n  line-height: 60px;\n  font-weight: bold;\n  margin-left: 1rem;\n  font-size: 1.3em;\n}\n\n.my-dropdown {\n  position: relative;\n  display: inline-block;\n  flex-basis: 100px;\n  /* line-height: 60px; */\n  z-index: 1000;\n}\n\n.dropdown-content {\n  display: none;\n  position: absolute;\n  background-color: whitesmoke;\n  width: 150px;\n  box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);\n  z-index: 1001;\n  right: 26%;\n  height: auto;\n}\n\n.dropdown-content > div {\n  position: relative;\n  height: 37px;\n  line-height: 37px;\n  padding-left: 5px;\n  font-family: \"Segoe UI\", Tahoma, Geneva, Verdana, sans-serif;\n  font-weight: 900;\n  font-size: small;\n  margin-top: 5px;\n}\n\n.dropdown-content a {\n  color: black;\n  text-decoration: none;\n}\n\n.dropdown-content div:hover {\n  background-color: #ddd;\n}\n\n.dropdown:hover .dropdown-content {\n  display: block;\n  transition: all 2s ease 0s;\n}\n\n.version-panel-class .mat-expansion-panel-body {\n  padding: 0 !important;\n}\n\n.mat-menu-panel {\n  max-width: unset !important;\n  margin: 12px !important;\n}\n.cdk-global-scrollblock {\n  position:inherit;\n  width: 100%;\n  overflow-y: scroll;\n}\n/* Avatar image */\n/* avatar  */\n.circles {\n  height: 40px;\n  width: 40px;\n  border-radius: 50%;\n  background: #673ab7;\n  border: 2px solid #fff;\n  text-align: center;\n  line-height: 39px;\n  margin-right: 1rem;\n  color: white;\n}\n.mat-drawer-content {\n  position:initial !important;\n}"
  },
  {
    "path": "ArduinoFrontend/src/test.ts",
    "content": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js/dist/zone-testing';\nimport { getTestBed } from '@angular/core/testing';\nimport {\n  BrowserDynamicTestingModule,\n  platformBrowserDynamicTesting\n} from '@angular/platform-browser-dynamic/testing';\n\n/**\n * Prevent from throwing error for require function\n */\ndeclare const require: any;\n\n/**\n * First, initialize the Angular testing environment.\n */\ngetTestBed().initTestEnvironment(\n  BrowserDynamicTestingModule,\n  platformBrowserDynamicTesting()\n);\n/**\n * Then we find all the tests.\n */\nconst context = require.context('./', true, /\\.spec\\.ts$/);\n/**\n * And load the modules.\n */\ncontext.keys().map(context);\n"
  },
  {
    "path": "ArduinoFrontend/src/tsconfig.app.json",
    "content": "{\n  \"extends\": \"../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../out-tsc/app\",\n    \"types\": [],\n  },\n  \"exclude\": [\n    \"test.ts\",\n    \"**/*.spec.ts\"\n  ]\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/tsconfig.spec.json",
    "content": "{\n  \"extends\": \"../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../out-tsc/spec\",\n    \"types\": [\n      \"jasmine\",\n      \"node\"\n    ]\n  },\n  \"files\": [\n    \"test.ts\",\n    \"polyfills.ts\"\n  ],\n  \"include\": [\n    \"**/*.spec.ts\",\n    \"**/*.d.ts\"\n  ]\n}\n"
  },
  {
    "path": "ArduinoFrontend/src/tslint.json",
    "content": "{\n  \"extends\": \"../tslint.json\",\n  \"rules\": {\n    \"directive-selector\": [\n      true,\n      \"attribute\",\n      \"app\",\n      \"camelCase\"\n    ],\n    \"component-selector\": [\n      true,\n      \"element\",\n      \"app\",\n      \"kebab-case\"\n    ]\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/tsconfig.json",
    "content": "{\n  \"compileOnSave\": false,\n  \"exclude\": [\n    \"./src/assets/**/*.ts\"\n  ],\n  \"compilerOptions\": {\n    \"baseUrl\": \"./\",\n    \"outDir\": \"./dist/out-tsc\",\n    \"sourceMap\": true,\n    \"declaration\": false,\n    \"module\": \"esNext\",\n    \"moduleResolution\": \"node\",\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true,\n    \"importHelpers\": true,\n    \"target\": \"es5\",\n    \"typeRoots\": [\n      \"node_modules/@types\"\n    ],\n    \"lib\": [\n      \"es2018\",\n      \"dom\"\n    ],\n    \"skipLibCheck\": true\n  }\n}\n"
  },
  {
    "path": "ArduinoFrontend/tslint.json",
    "content": "{\n  \"extends\": \"tslint:recommended\",\n  \"rulesDirectory\": [\n    \"codelyzer\"\n  ],\n  \"rules\": {\n    \"no-string-literal\": false,\n    \"array-type\": false,\n    \"arrow-parens\": false,\n    \"deprecation\": {\n      \"severity\": \"warn\"\n    },\n    \"import-blacklist\": [\n      true,\n      \"rxjs/Rx\"\n    ],\n    \"interface-name\": false,\n    \"max-classes-per-file\": false,\n    \"max-line-length\": [\n      true,\n      140\n    ],\n    \"member-access\": false,\n    \"member-ordering\": [\n      true,\n      {\n        \"order\": [\n          \"static-field\",\n          \"instance-field\",\n          \"static-method\",\n          \"instance-method\"\n        ]\n      }\n    ],\n    \"no-consecutive-blank-lines\": false,\n    \"no-console\": [\n      true,\n      \"debug\",\n      \"info\",\n      \"time\",\n      \"timeEnd\",\n      \"trace\"\n    ],\n    \"no-bitwise\": false,\n    \"no-empty\": false,\n    \"no-inferrable-types\": [\n      true,\n      \"ignore-params\"\n    ],\n    \"no-non-null-assertion\": true,\n    \"no-redundant-jsdoc\": true,\n    \"no-switch-case-fall-through\": true,\n    \"no-use-before-declare\": true,\n    \"no-var-requires\": false,\n    \"object-literal-key-quotes\": [\n      true,\n      \"as-needed\"\n    ],\n    \"object-literal-sort-keys\": false,\n    \"ordered-imports\": false,\n    \"quotemark\": [\n      true,\n      \"single\"\n    ],\n    \"trailing-comma\": false,\n    \"no-output-on-prefix\": true,\n    \"use-input-property-decorator\": true,\n    \"use-output-property-decorator\": true,\n    \"use-host-property-decorator\": true,\n    \"no-input-rename\": true,\n    \"no-output-rename\": true,\n    \"use-life-cycle-interface\": true,\n    \"use-pipe-transform-interface\": true,\n    \"component-class-suffix\": true,\n    \"directive-class-suffix\": true\n  }\n}\n"
  },
  {
    "path": "Assembly_support.md",
    "content": "# Assembly Support for the .ino files\nSubmission for screening task 6<br>\nBy :-<br>\n**Deepam Priyadarshi**<br>\ndeepam.priyadarshi2019@vitstudent.ac.in  \ndeepam.odhisha@gmail.com (personal)\n\n## Approach\nSince the initial django docker image present at `docker.pkg.github.com/frg-fossee/esim-cloud/django:dev` has only `avr-gcc` toolchain support, so I can only implement `C inline Assembly` programming in which the `avr-gcc` compiles `.c` files. For using `.asm` file we require `avra` assembler, for which I have to rebuild the comtainer images.  \n\nFor the swithcing between the programming languages, the users have the liberty to select the type of programming language from the editor' drop down menu as shown in the figure:- \n\n<p align=\"center\">\n  <kbd>\n  <img src=\"https://user-images.githubusercontent.com/65447610/155759550-de0a8c07-3c53-4b23-b057-a0de3b4fc95b.png\" alt=\"Selecting Laguage\" width=\"265\" height=\"248\" style=\"border: 5px solid #555\">\n    </kbd>\n</p>\n\n### avr-gcc compilation procedure\n1. To compile the `.c` file received from the frontend we use the command `avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o {obj_name} {ino_name}`\n2. The above step generates an object file `sketch.o` which is then converted to a binary file named `sketch` using the command `avr-gcc -mmcu=atmega328p {obj_name} -o {bin_name}`\n3. The binary file is then converted to IntelHEX format using the command `avr-objcopy -O ihex -R .eeprom {bin_name} {out_name}`\n\n## Steps taken to add assembly support\n1. A new form element was added in the `code-editor.component.html` file which takes the input of the desired programming laguage in the form of a drop down menu.\n2. A new property `progLang` was introduced in the `window` object which keeps the track of programming language used.\n3. A new function `CompileInlineASM` is introduced in the `task.py` file which compiles the C Inline assembly code using `avr-gcc`.\n4. A new class `CompileSketchInlineASM` in introduced in the `views.py` file\n5. New routes and urls are added in the `urls.py` and `api.service.ts` files. And the respective apis are called in the `workspace.ts` file according to the requirement.\n\n## Files Changed\n1.  `eSim-Cloud/esim-cloud-backend/arduinoAPI/tasks.py`\n2.  `eSim-Cloud/esim-cloud-backend/arduinoAPI/views.py`\n3.  `eSim-Cloud/esim-cloud-backend/arduinoAPI/urls.py`\n4.  `eSim-Cloud/ArduinoFrontend/src/app/Libs/Workspace.ts`\n5.  `eSim-Cloud/ArduinoFrontend/src/app/Libs/Workspace.ts`\n6.  `eSim-Cloud/ArduinoFrontend/src/app/code-editor/code-editor.component.ts`\n7.  `eSim-Cloud/ArduinoFrontend/src/app/code-editor/code-editor.component.html`\n\n## Video Demostration\n\n\n\n\nhttps://user-images.githubusercontent.com/65447610/155765289-da379d63-d570-468a-8235-6e8e1967c7bf.mp4\n\n\n"
  },
  {
    "path": "CONFIG.md",
    "content": "# Configuring the workflow API\n\n**Make sure your migrations are all setup and you can see workflow API in the Django admin panel**\n\nFollow the order to setup the workflow [There is already a sample workflow setup up]\n \n ### Setting up states:\n \nAttributes:\n\n - Name [Has to be unique]\n - Description \n - *boolean* Public: Used for making all the projects public for that particular state (eg. Published state should have this true)\n - *boolean* Report: Used for making a state which represents \"Reported\" (Make sure only one state has this value set to true)\n \n Suggested States:\n \n - Draft\n - Review \n - Published\n - Review\n\n### Setting up Groups:\nEvery group has a custom group model attached to it which lets you define the following parameters:\n\nAttributes:\n - Other Circuit Accessible States: This is a many select field which specifies the states which can be accessed by that specific group (For example, for Contributor, it can only access other user's projects which are published and for reviewer, it can access Review, Reported and Published as well)\n -  *boolean*  Is Arduino: Specifies whether the role is for arduino or e-sim (True for arduino and false for esim)\n - *boolean*  Is Type Reviewer: This gives that group the ability to review the reported circuits.\n - *boolean* Is Default: This defines which roles should be assigned to a new user.\nSuggested Roles:\n\n - Contributor [Arduino]\n - Contributor [E-Sim]\n - Reviewer [Arduino]\n - Reviewer [E-Sim]\n\n### Setting up Transitions:\n\nAttributes:\n\n - Name\n - Role: Multi-select for who can make the transitions\n - From-State\n - To-State\n - *boolean*  Allowed for creator: Whether the creator itself should be able to do the transition (For example from Draft to Review, it is allowed but for Review to Published, it should not be allowed)\n - *boolean* Only for creator: Restrict the transition only to the creator (For example, only the creator should be able to make the transition from Draft to Review)\n \n Suggested Transitions\n - Draft to Review\n - Review to Published\n - Published to Reported\n - Reported to Draft\n - Reported to Published\n\n \n \n### Things to note:\n\n - The workflow API is being tested on E-Sim cloud and not on the Arduino Simulator as of yet.\n\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing \n\nWant to contribute? Great to know! eSim and Arduino on Cloud is an open source project and we welcome contributions from all. We would be very happy to collaborate with you. To contribute to this project please make sure that you first discuss with us and follow the guidelines given.\n\n## Types of contributions\nContributions can be of different types. Some are listed below.\n* Report a bug\n* Suggest a feature\n* Fix a bug\n* Improve UI\n* Contribute a new feature\n* Update documentation\n\n## Reporting Bug / Suggesting Features\nIf you just want to report a bug in our system or want to suggest a new feature or improve UI, etc., then first browse through our existing issues to check whether this has been addressed or not. If not, feel free to create a new issue. Please read the  [new issue guidelines](https://esim-cloud.readthedocs.io/en/latest/contribute/NewIssue.html) given.\n\n## Step 1: Assign/Create Issues\n\n### Existing issues\n* Before you start contributing, first browse through the existing issues and pull requests to know whether someone else has already fixed or is already working on it.\n* If an issue is already created but no one is assigned to it, create a comment 'Assignee: @YourGitHubUsername'. This will let the community know that you are addressing this issue.\n* Just a suggestion: If you are a new contributor you can look at issues tagged as 'good first issue' tag. These are comparatively smaller and easier to address than the other ones.\n\n### New issues\n* Before you create a new issue on GitHub, first discuss your ideas about the new feature or notify the bug on our appropriate Discord channels. Our contributors will interact with you and help you take it further. \n* Once the feature is approved or the bug is confirmed, based on your discussion with the contributors on our discord channel, create a new issue on GitHub. Please read the [guidelines](https://esim-cloud.readthedocs.io/en/latest/contribute/NewIssue.html) for creating a new issue.\n\n### Inactivity Period\n* If you have assigned the issue to yourself (existing or new), we request you to be active on your forked repository.\n* There might be a situation when you have other priorities or sometimes you might be taking a break, etc., wherein you may not be able to contribute to your forked repo for more than 3 weeks. \n* In such a case, we request you to just ping us on Discord and inform us about it also mentioning your inactivity period.\n* An inactivity of over 3 weeks in your repo or no discussion on Discord, without prior intimation, will be considered that you are no longer interested. In such a case the assignee name will be removed so that the issue can be solved by someone else. You are however free to assign it to yourself again when you are available, if the issue is not assigned to someone else.\n\n## Step 2: Fork Repository \n* The first step is to fork the repository so that you have your own repository in which you can work on.\n* Create a **new branch** (feature or bugfix) from the **Develop** branch and work on the newly created branch. This way if we make some changes to the Develop branch in our repo, you can upstream it at anytime for maintaining the updated codebase.\n\n## Step 3: Contribute\n* Once the branch created, you can start contributing (coding, documentation, test cases, etc.). Make sure that you follow the [contributing guidelines](https://esim-cloud.readthedocs.io/en/latest/contribute/ContributingGuidelines.html).\n* We use GitHub Actions for continuous integrations that runs linting and testing operations.\n* There might be some changes to the original repository which will not reflect in your forked repository automatically. If you want to update it, sync it using the steps given in the link: https://help.github.com/articles/syncing-a-fork/\n\n## Step 4: Make a pull request\n* When you feel that you are ready to merge your contributions into our repository, create a pull request **from your feature/bugfix branch to our Develop** branch.\n* Select an appropriate label from the list E.g. enhancement, bug fix, etc.\n* Please go through the [pull request guidelines](https://esim-cloud.readthedocs.io/en/latest/contribute/PullRequest.html).\n* Our reviewing team will review your pull request made and will interact with you by posting comments. You may be asked to modify incase there is any issue.\n* We request you to be active in responding to our comments so as to merge/close the issue.\n* Incase you do not respond to our comments within a week, we will close it. Feel free to open it again when you are ready to interact.\n"
  },
  {
    "path": "Enhancements/Arduino/Assembly_support.md",
    "content": "# Assembly Support for the .ino files\nSubmission for screening task 6<br>\nBy :-<br>\n**Deepam Priyadarshi**<br>\ndeepam.priyadarshi2019@vitstudent.ac.in  \ndeepam.odhisha@gmail.com (personal)\n\n## Approach\nSince the initial django docker image present at `docker.pkg.github.com/frg-fossee/esim-cloud/django:dev` has only `avr-gcc` toolchain support, so I can only implement `C inline Assembly` programming in which the `avr-gcc` compiles `.c` files. For using `.asm` file we require `avra` assembler, for which I have to rebuild the comtainer images.  \n\nFor the swithcing between the programming languages, the users have the liberty to select the type of programming language from the editor' drop down menu as shown in the figure:- \n\n<p align=\"center\">\n  <kbd>\n  <img src=\"https://user-images.githubusercontent.com/65447610/155759550-de0a8c07-3c53-4b23-b057-a0de3b4fc95b.png\" alt=\"Selecting Laguage\" width=\"265\" height=\"248\" style=\"border: 5px solid #555\">\n    </kbd>\n</p>\n\n### avr-gcc compilation procedure\n1. To compile the `.c` file received from the frontend we use the command `avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o {obj_name} {ino_name}`\n2. The above step generates an object file `sketch.o` which is then converted to a binary file named `sketch` using the command `avr-gcc -mmcu=atmega328p {obj_name} -o {bin_name}`\n3. The binary file is then converted to IntelHEX format using the command `avr-objcopy -O ihex -R .eeprom {bin_name} {out_name}`\n\n## Steps taken to add assembly support\n1. A new form element was added in the `code-editor.component.html` file which takes the input of the desired programming laguage in the form of a drop down menu.\n2. A new property `progLang` was introduced in the `window` object which keeps the track of programming language used.\n3. A new function `CompileInlineASM` is introduced in the `task.py` file which compiles the C Inline assembly code using `avr-gcc`.\n4. A new class `CompileSketchInlineASM` in introduced in the `views.py` file\n5. New routes and urls are added in the `urls.py` and `api.service.ts` files. And the respective apis are called in the `workspace.ts` file according to the requirement.\n\n## Files Changed\n1.  `eSim-Cloud/esim-cloud-backend/arduinoAPI/tasks.py`\n2.  `eSim-Cloud/esim-cloud-backend/arduinoAPI/views.py`\n3.  `eSim-Cloud/esim-cloud-backend/arduinoAPI/urls.py`\n4.  `eSim-Cloud/ArduinoFrontend/src/app/Libs/Workspace.ts`\n5.  `eSim-Cloud/ArduinoFrontend/src/app/Libs/Workspace.ts`\n6.  `eSim-Cloud/ArduinoFrontend/src/app/code-editor/code-editor.component.ts`\n7.  `eSim-Cloud/ArduinoFrontend/src/app/code-editor/code-editor.component.html`\n\n## Video Demostration\n\n\n\n\nhttps://user-images.githubusercontent.com/65447610/155765289-da379d63-d570-468a-8235-6e8e1967c7bf.mp4\n\n\n\n"
  },
  {
    "path": "JMeter/README.md",
    "content": "# JMeter Performance Test\n\nSpecs: ``` macOS Catalina , 8GB of 2133MHz LPDDR3 RAM, 1.4GHz quad‑core Intel Core i5, Turbo Boost up to 3.9GHz, with 128MB of eDRAM ```\n\nBranch: ``` Develop ```\n\nCommand Used: ``` docker-compose -f docker-compose.prod.yml --env-file .env.prod up ```\n\nNetlist Used: ``` RC.cir ``` Sample located in the helpers folder\n\nDon't forget to change the path to the netlist in the post request for uplaod netlist to the path in your system.\n"
  },
  {
    "path": "JMeter/libAPI.csv",
    "content": "timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect\n1590051155629,36,Fetch Specific Image,200,OK,Fetch Specific Image 1-5,text,true,,5816,168,13,13,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,35,0,15\n1590051155632,38,Fetch Specific Image,200,OK,Fetch Specific Image 1-9,text,true,,5816,168,13,13,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,38,0,12\n1590051155629,48,Fetch Specific Image,200,OK,Fetch Specific Image 1-6,text,true,,5816,168,14,14,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,48,0,15\n1590051155640,41,Fetch Specific Image,200,OK,Fetch Specific Image 1-10,text,true,,5816,168,15,15,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,41,0,4\n1590051155630,57,Fetch Specific Image,200,OK,Fetch Specific Image 1-2,text,true,,5816,168,16,16,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,57,0,14\n1590051155630,61,Fetch Specific Image,200,OK,Fetch Specific Image 1-1,text,true,,5816,168,16,16,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,61,0,14\n1590051155631,63,Fetch Specific Image,200,OK,Fetch Specific Image 1-3,text,true,,5816,168,17,17,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,63,0,13\n1590051155631,75,Fetch Specific Image,200,OK,Fetch Specific Image 1-8,text,true,,5816,168,18,18,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,75,0,13\n1590051155630,84,Fetch Specific Image,200,OK,Fetch Specific Image 1-7,text,true,,5816,168,19,19,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,84,0,15\n1590051155630,90,Fetch Specific Image,200,OK,Fetch Specific Image 1-4,text,true,,5816,168,20,20,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,90,0,14\n1590051155667,66,Fetch Specific Image,200,OK,Fetch Specific Image 1-5,text,true,,5816,168,22,22,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,66,0,0\n1590051155671,63,Fetch Specific Image,200,OK,Fetch Specific Image 1-9,text,true,,5816,168,22,22,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,63,0,0\n1590051155678,66,Fetch Specific Image,200,OK,Fetch Specific Image 1-6,text,true,,5816,168,21,21,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,66,0,0\n1590051155682,69,Fetch Specific Image,200,OK,Fetch Specific Image 1-10,text,true,,5816,168,21,21,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,69,0,0\n1590051155688,72,Fetch Specific Image,200,OK,Fetch Specific Image 1-2,text,true,,5816,168,21,21,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,72,0,0\n1590051155691,73,Fetch Specific Image,200,OK,Fetch Specific Image 1-1,text,true,,5816,168,21,21,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,73,0,0\n1590051155695,78,Fetch Specific Image,200,OK,Fetch Specific Image 1-3,text,true,,5816,168,21,21,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,78,0,0\n1590051155706,73,Fetch Specific Image,200,OK,Fetch Specific Image 1-8,text,true,,5816,168,21,21,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,73,0,0\n1590051155715,72,Fetch Specific Image,200,OK,Fetch Specific Image 1-7,text,true,,5816,168,21,21,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,72,0,0\n1590051155649,144,Fetch Specific Image,200,OK,Fetch Specific Image 1-11,text,true,,5816,168,21,21,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,144,0,0\n1590051155657,150,Fetch Specific Image,200,OK,Fetch Specific Image 1-12,text,true,,5816,168,22,22,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,150,0,0\n1590051155721,93,Fetch Specific Image,200,OK,Fetch Specific Image 1-4,text,true,,5816,168,23,23,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,93,0,0\n1590051155665,160,Fetch Specific Image,200,OK,Fetch Specific Image 1-13,text,true,,5816,168,23,23,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,160,0,0\n1590051155794,38,Fetch Specific Image,200,OK,Fetch Specific Image 1-11,text,true,,5816,168,24,24,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,38,0,0\n1590051155807,36,Fetch Specific Image,200,OK,Fetch Specific Image 1-12,text,true,,5816,168,25,25,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,36,0,0\n1590051155672,178,Fetch Specific Image,200,OK,Fetch Specific Image 1-14,text,true,,5816,168,25,25,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,178,0,1\n1590051155825,33,Fetch Specific Image,200,OK,Fetch Specific Image 1-13,text,true,,5816,168,26,26,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,33,0,0\n1590051155680,190,Fetch Specific Image,200,OK,Fetch Specific Image 1-15,text,true,,5816,168,26,26,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,190,0,1\n1590051155850,27,Fetch Specific Image,200,OK,Fetch Specific Image 1-14,text,true,,5816,168,27,27,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,27,0,0\n1590051155688,197,Fetch Specific Image,200,OK,Fetch Specific Image 1-16,text,true,,5816,168,27,27,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,197,0,0\n1590051155871,22,Fetch Specific Image,200,OK,Fetch Specific Image 1-15,text,true,,5816,168,28,28,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,21,0,0\n1590051155695,205,Fetch Specific Image,200,OK,Fetch Specific Image 1-17,text,true,,5816,168,28,28,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,205,0,1\n1590051155886,24,Fetch Specific Image,200,OK,Fetch Specific Image 1-16,text,true,,5816,168,30,30,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,24,0,0\n1590051155703,213,Fetch Specific Image,200,OK,Fetch Specific Image 1-18,text,true,,5816,168,30,30,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,213,0,0\n1590051155901,25,Fetch Specific Image,200,OK,Fetch Specific Image 1-17,text,true,,5816,168,31,31,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,25,0,0\n1590051155710,222,Fetch Specific Image,200,OK,Fetch Specific Image 1-19,text,true,,5816,168,31,31,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,222,0,1\n1590051155917,27,Fetch Specific Image,200,OK,Fetch Specific Image 1-18,text,true,,5816,168,33,33,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,27,0,0\n1590051155726,226,Fetch Specific Image,200,OK,Fetch Specific Image 1-21,text,true,,5816,168,33,33,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,226,0,0\n1590051155933,26,Fetch Specific Image,200,OK,Fetch Specific Image 1-19,text,true,,5816,168,34,34,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,26,0,0\n1590051155718,246,Fetch Specific Image,200,OK,Fetch Specific Image 1-20,text,true,,5816,168,34,34,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,246,0,1\n1590051155952,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-21,text,true,,5816,168,35,35,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,16,0,0\n1590051155733,241,Fetch Specific Image,200,OK,Fetch Specific Image 1-22,text,true,,5816,168,34,34,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,241,0,1\n1590051155964,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-20,text,true,,5816,168,35,35,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051155740,244,Fetch Specific Image,200,OK,Fetch Specific Image 1-23,text,true,,5816,168,35,35,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,244,0,1\n1590051155974,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-22,text,true,,5816,168,36,36,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051155748,244,Fetch Specific Image,200,OK,Fetch Specific Image 1-24,text,true,,5816,168,35,35,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,244,0,1\n1590051155984,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-23,text,true,,5816,168,36,36,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051155756,248,Fetch Specific Image,200,OK,Fetch Specific Image 1-25,text,true,,5816,168,36,36,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,248,0,0\n1590051155992,21,Fetch Specific Image,200,OK,Fetch Specific Image 1-24,text,true,,5816,168,37,37,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,21,0,0\n1590051155764,255,Fetch Specific Image,200,OK,Fetch Specific Image 1-26,text,true,,5816,168,37,37,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,255,0,1\n1590051156005,22,Fetch Specific Image,200,OK,Fetch Specific Image 1-25,text,true,,5816,168,38,38,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,22,0,0\n1590051155772,259,Fetch Specific Image,200,OK,Fetch Specific Image 1-27,text,true,,5816,168,38,38,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,259,0,0\n1590051156020,18,Fetch Specific Image,200,OK,Fetch Specific Image 1-26,text,true,,5816,168,39,39,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,18,0,0\n1590051155779,264,Fetch Specific Image,200,OK,Fetch Specific Image 1-28,text,true,,5816,168,39,39,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,264,0,1\n1590051156032,20,Fetch Specific Image,200,OK,Fetch Specific Image 1-27,text,true,,5816,168,40,40,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,20,0,0\n1590051155787,270,Fetch Specific Image,200,OK,Fetch Specific Image 1-29,text,true,,5816,168,40,40,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,269,0,1\n1590051156043,21,Fetch Specific Image,200,OK,Fetch Specific Image 1-28,text,true,,5816,168,41,41,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,21,0,0\n1590051155794,275,Fetch Specific Image,200,OK,Fetch Specific Image 1-30,text,true,,5816,168,41,41,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,275,0,0\n1590051156057,19,Fetch Specific Image,200,OK,Fetch Specific Image 1-29,text,true,,5816,168,42,42,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,19,0,0\n1590051155801,281,Fetch Specific Image,200,OK,Fetch Specific Image 1-31,text,true,,5816,168,42,42,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,281,0,1\n1590051156069,21,Fetch Specific Image,200,OK,Fetch Specific Image 1-30,text,true,,5816,168,43,43,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,21,0,0\n1590051155809,285,Fetch Specific Image,200,OK,Fetch Specific Image 1-32,text,true,,5816,168,43,43,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,285,0,0\n1590051156082,22,Fetch Specific Image,200,OK,Fetch Specific Image 1-31,text,true,,5816,168,44,44,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,22,0,0\n1590051155819,290,Fetch Specific Image,200,OK,Fetch Specific Image 1-33,text,true,,5816,168,44,44,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,290,0,0\n1590051156095,21,Fetch Specific Image,200,OK,Fetch Specific Image 1-32,text,true,,5816,168,45,45,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,21,0,0\n1590051155826,296,Fetch Specific Image,200,OK,Fetch Specific Image 1-34,text,true,,5816,168,45,45,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,296,0,1\n1590051156109,22,Fetch Specific Image,200,OK,Fetch Specific Image 1-33,text,true,,5816,168,46,46,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,22,0,0\n1590051155834,303,Fetch Specific Image,200,OK,Fetch Specific Image 1-35,text,true,,5816,168,46,46,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,303,0,1\n1590051156124,21,Fetch Specific Image,200,OK,Fetch Specific Image 1-34,text,true,,5816,168,47,47,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,21,0,0\n1590051155841,308,Fetch Specific Image,200,OK,Fetch Specific Image 1-36,text,true,,5816,168,47,47,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,308,0,1\n1590051156138,20,Fetch Specific Image,200,OK,Fetch Specific Image 1-35,text,true,,5816,168,48,48,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,20,0,0\n1590051155849,312,Fetch Specific Image,200,OK,Fetch Specific Image 1-37,text,true,,5816,168,48,48,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,312,0,0\n1590051156150,21,Fetch Specific Image,200,OK,Fetch Specific Image 1-36,text,true,,5816,168,49,49,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,21,0,0\n1590051155857,315,Fetch Specific Image,200,OK,Fetch Specific Image 1-38,text,true,,5816,168,49,49,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,315,0,0\n1590051156162,17,Fetch Specific Image,200,OK,Fetch Specific Image 1-37,text,true,,5816,168,50,50,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,17,0,0\n1590051155864,317,Fetch Specific Image,200,OK,Fetch Specific Image 1-39,text,true,,5816,168,49,49,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,317,0,1\n1590051156174,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-38,text,true,,5816,168,50,50,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051155871,319,Fetch Specific Image,200,OK,Fetch Specific Image 1-40,text,true,,5816,168,49,49,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,318,0,1\n1590051156183,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-39,text,true,,5816,168,50,50,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051155879,317,Fetch Specific Image,200,OK,Fetch Specific Image 1-41,text,true,,5816,168,49,49,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,317,0,1\n1590051156191,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-40,text,true,,5816,168,50,50,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051155887,318,Fetch Specific Image,200,OK,Fetch Specific Image 1-42,text,true,,5816,168,50,50,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,318,0,1\n1590051156197,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-41,text,true,,5816,168,50,50,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051155895,318,Fetch Specific Image,200,OK,Fetch Specific Image 1-43,text,true,,5816,168,50,50,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,318,0,1\n1590051156207,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-42,text,true,,5816,168,50,50,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051155902,319,Fetch Specific Image,200,OK,Fetch Specific Image 1-44,text,true,,5816,168,50,50,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,319,0,0\n1590051156214,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-43,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051155908,321,Fetch Specific Image,200,OK,Fetch Specific Image 1-45,text,true,,5816,168,50,50,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,321,0,1\n1590051156222,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-44,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051155914,325,Fetch Specific Image,200,OK,Fetch Specific Image 1-46,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,325,0,1\n1590051156231,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-45,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051155921,324,Fetch Specific Image,200,OK,Fetch Specific Image 1-47,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,324,0,0\n1590051156240,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-46,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051155928,325,Fetch Specific Image,200,OK,Fetch Specific Image 1-48,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,324,0,1\n1590051156247,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-47,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051155934,325,Fetch Specific Image,200,OK,Fetch Specific Image 1-49,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,325,0,0\n1590051156254,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-48,text,true,,5816,168,52,52,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051155941,325,Fetch Specific Image,200,OK,Fetch Specific Image 1-50,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,325,0,0\n1590051156260,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-49,text,true,,5816,168,52,52,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051155947,326,Fetch Specific Image,200,OK,Fetch Specific Image 1-51,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,326,0,0\n1590051156268,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-50,text,true,,5816,168,52,52,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051155955,325,Fetch Specific Image,200,OK,Fetch Specific Image 1-52,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,325,0,0\n1590051156274,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-51,text,true,,5816,168,52,52,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051155961,328,Fetch Specific Image,200,OK,Fetch Specific Image 1-53,text,true,,5816,168,52,52,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,328,0,1\n1590051156282,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-52,text,true,,5816,168,52,52,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051155968,329,Fetch Specific Image,200,OK,Fetch Specific Image 1-54,text,true,,5816,168,52,52,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,329,0,0\n1590051156291,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-53,text,true,,5816,168,53,53,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051155975,332,Fetch Specific Image,200,OK,Fetch Specific Image 1-55,text,true,,5816,168,52,52,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,331,0,1\n1590051156298,17,Fetch Specific Image,200,OK,Fetch Specific Image 1-54,text,true,,5816,168,53,53,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,17,0,0\n1590051155981,337,Fetch Specific Image,200,OK,Fetch Specific Image 1-56,text,true,,5816,168,53,53,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,337,0,1\n1590051156308,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-55,text,true,,5816,168,54,54,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,16,0,0\n1590051155988,342,Fetch Specific Image,200,OK,Fetch Specific Image 1-57,text,true,,5816,168,54,54,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,342,0,0\n1590051156320,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-56,text,true,,5816,168,55,55,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,16,0,0\n1590051155994,348,Fetch Specific Image,200,OK,Fetch Specific Image 1-58,text,true,,5816,168,55,55,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,348,0,1\n1590051156331,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-57,text,true,,5816,168,56,56,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,16,0,0\n1590051156001,350,Fetch Specific Image,200,OK,Fetch Specific Image 1-59,text,true,,5816,168,55,55,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,349,0,1\n1590051156344,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-58,text,true,,5816,168,56,56,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156007,354,Fetch Specific Image,200,OK,Fetch Specific Image 1-60,text,true,,5816,168,56,56,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,354,0,1\n1590051156352,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-59,text,true,,5816,168,57,57,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,16,0,0\n1590051156014,361,Fetch Specific Image,200,OK,Fetch Specific Image 1-61,text,true,,5816,168,57,57,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,361,0,1\n1590051156362,18,Fetch Specific Image,200,OK,Fetch Specific Image 1-60,text,true,,5816,168,58,58,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,18,0,0\n1590051156021,364,Fetch Specific Image,200,OK,Fetch Specific Image 1-62,text,true,,5816,168,57,57,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,364,0,1\n1590051156376,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-61,text,true,,5816,168,58,58,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,16,0,0\n1590051156029,369,Fetch Specific Image,200,OK,Fetch Specific Image 1-63,text,true,,5816,168,59,59,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,369,0,0\n1590051156386,17,Fetch Specific Image,200,OK,Fetch Specific Image 1-62,text,true,,5816,168,59,59,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,17,0,0\n1590051156035,373,Fetch Specific Image,200,OK,Fetch Specific Image 1-64,text,true,,5816,168,59,59,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,373,0,1\n1590051156400,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-63,text,true,,5816,168,60,60,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051156042,376,Fetch Specific Image,200,OK,Fetch Specific Image 1-65,text,true,,5816,168,60,60,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,376,0,0\n1590051156410,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-64,text,true,,5816,168,61,61,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051156048,379,Fetch Specific Image,200,OK,Fetch Specific Image 1-66,text,true,,5816,168,60,60,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,379,0,0\n1590051156419,18,Fetch Specific Image,200,OK,Fetch Specific Image 1-65,text,true,,5816,168,61,61,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,18,0,0\n1590051156055,384,Fetch Specific Image,200,OK,Fetch Specific Image 1-67,text,true,,5816,168,61,61,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,384,0,1\n1590051156429,18,Fetch Specific Image,200,OK,Fetch Specific Image 1-66,text,true,,5816,168,62,62,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,18,0,0\n1590051156062,395,Fetch Specific Image,200,OK,Fetch Specific Image 1-68,text,true,,5816,168,63,63,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,395,0,0\n1590051156441,29,Fetch Specific Image,200,OK,Fetch Specific Image 1-67,text,true,,5816,168,64,64,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,29,0,0\n1590051156068,405,Fetch Specific Image,200,OK,Fetch Specific Image 1-69,text,true,,5816,168,64,64,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,405,0,0\n1590051156458,24,Fetch Specific Image,200,OK,Fetch Specific Image 1-68,text,true,,5816,168,65,65,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,24,0,0\n1590051156074,409,Fetch Specific Image,200,OK,Fetch Specific Image 1-70,text,true,,5816,168,65,65,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,409,0,1\n1590051156475,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-69,text,true,,5816,168,66,66,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156081,416,Fetch Specific Image,200,OK,Fetch Specific Image 1-71,text,true,,5816,168,66,66,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,416,0,1\n1590051156485,24,Fetch Specific Image,200,OK,Fetch Specific Image 1-70,text,true,,5816,168,67,67,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,24,0,0\n1590051156088,428,Fetch Specific Image,200,OK,Fetch Specific Image 1-72,text,true,,5816,168,68,68,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,428,0,0\n1590051156498,28,Fetch Specific Image,200,OK,Fetch Specific Image 1-71,text,true,,5816,168,69,69,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,28,0,0\n1590051156094,440,Fetch Specific Image,200,OK,Fetch Specific Image 1-73,text,true,,5816,168,69,69,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,440,0,1\n1590051156517,24,Fetch Specific Image,200,OK,Fetch Specific Image 1-72,text,true,,5816,168,70,70,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,24,0,0\n1590051156101,446,Fetch Specific Image,200,OK,Fetch Specific Image 1-74,text,true,,5816,168,70,70,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,446,0,1\n1590051156536,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-73,text,true,,5816,168,71,71,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,16,0,0\n1590051156107,451,Fetch Specific Image,200,OK,Fetch Specific Image 1-75,text,true,,5816,168,71,71,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,451,0,1\n1590051156548,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-74,text,true,,5816,168,72,72,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156115,454,Fetch Specific Image,200,OK,Fetch Specific Image 1-76,text,true,,5816,168,71,71,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,454,0,0\n1590051156559,17,Fetch Specific Image,200,OK,Fetch Specific Image 1-75,text,true,,5816,168,73,73,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,17,0,0\n1590051156121,459,Fetch Specific Image,200,OK,Fetch Specific Image 1-77,text,true,,5816,168,72,72,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,459,0,1\n1590051156569,19,Fetch Specific Image,200,OK,Fetch Specific Image 1-76,text,true,,5816,168,73,73,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,19,0,0\n1590051156128,464,Fetch Specific Image,200,OK,Fetch Specific Image 1-78,text,true,,5816,168,73,73,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,464,0,1\n1590051156581,17,Fetch Specific Image,200,OK,Fetch Specific Image 1-77,text,true,,5816,168,74,74,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,17,0,0\n1590051156135,469,Fetch Specific Image,200,OK,Fetch Specific Image 1-79,text,true,,5816,168,74,74,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,468,0,0\n1590051156592,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-78,text,true,,5816,168,74,74,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156141,473,Fetch Specific Image,200,OK,Fetch Specific Image 1-80,text,true,,5816,168,74,74,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,473,0,1\n1590051156604,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-79,text,true,,5816,168,75,75,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156147,476,Fetch Specific Image,200,OK,Fetch Specific Image 1-81,text,true,,5816,168,75,75,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,476,0,1\n1590051156614,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-80,text,true,,5816,168,76,76,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156154,479,Fetch Specific Image,200,OK,Fetch Specific Image 1-82,text,true,,5816,168,75,75,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,479,0,0\n1590051156624,20,Fetch Specific Image,200,OK,Fetch Specific Image 1-81,text,true,,5816,168,77,77,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,20,0,0\n1590051156160,488,Fetch Specific Image,200,OK,Fetch Specific Image 1-83,text,true,,5816,168,77,77,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,488,0,1\n1590051156634,20,Fetch Specific Image,200,OK,Fetch Specific Image 1-82,text,true,,5816,168,78,78,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,20,0,0\n1590051156167,494,Fetch Specific Image,200,OK,Fetch Specific Image 1-84,text,true,,5816,168,78,78,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,494,0,0\n1590051156648,23,Fetch Specific Image,200,OK,Fetch Specific Image 1-83,text,true,,5816,168,79,79,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,23,0,0\n1590051156173,501,Fetch Specific Image,200,OK,Fetch Specific Image 1-85,text,true,,5816,168,78,78,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,501,0,0\n1590051156661,17,Fetch Specific Image,200,OK,Fetch Specific Image 1-84,text,true,,5816,168,79,79,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,17,0,0\n1590051156179,505,Fetch Specific Image,200,OK,Fetch Specific Image 1-86,text,true,,5816,168,79,79,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,505,0,1\n1590051156674,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-85,text,true,,5816,168,80,80,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156186,509,Fetch Specific Image,200,OK,Fetch Specific Image 1-87,text,true,,5816,168,80,80,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,509,0,1\n1590051156684,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-86,text,true,,5816,168,80,80,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051156192,511,Fetch Specific Image,200,OK,Fetch Specific Image 1-88,text,true,,5816,168,80,80,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,511,0,1\n1590051156695,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-87,text,true,,5816,168,81,81,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156199,515,Fetch Specific Image,200,OK,Fetch Specific Image 1-89,text,true,,5816,168,81,81,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,515,0,0\n1590051156703,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-88,text,true,,5816,168,82,82,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,16,0,0\n1590051156206,517,Fetch Specific Image,200,OK,Fetch Specific Image 1-90,text,true,,5816,168,81,81,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,517,0,0\n1590051156714,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-89,text,true,,5816,168,82,82,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051156212,523,Fetch Specific Image,200,OK,Fetch Specific Image 1-91,text,true,,5816,168,82,82,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,522,0,1\n1590051156723,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-90,text,true,,5816,168,83,83,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,16,0,0\n1590051156219,524,Fetch Specific Image,200,OK,Fetch Specific Image 1-92,text,true,,5816,168,82,82,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,524,0,0\n1590051156735,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-91,text,true,,5816,168,83,83,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051156225,527,Fetch Specific Image,200,OK,Fetch Specific Image 1-93,text,true,,5816,168,83,83,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,527,0,1\n1590051156744,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-92,text,true,,5816,168,83,83,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156232,527,Fetch Specific Image,200,OK,Fetch Specific Image 1-94,text,true,,5816,168,83,83,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,527,0,0\n1590051156752,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-93,text,true,,5816,168,84,84,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051156238,534,Fetch Specific Image,200,OK,Fetch Specific Image 1-95,text,true,,5816,168,84,84,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,534,0,1\n1590051156760,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-94,text,true,,5816,168,84,84,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156245,533,Fetch Specific Image,200,OK,Fetch Specific Image 1-96,text,true,,5816,168,84,84,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,533,0,0\n1590051156772,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-95,text,true,,5816,168,85,85,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156251,537,Fetch Specific Image,200,OK,Fetch Specific Image 1-97,text,true,,5816,168,84,84,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,537,0,0\n1590051156779,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-96,text,true,,5816,168,85,85,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051156257,541,Fetch Specific Image,200,OK,Fetch Specific Image 1-98,text,true,,5816,168,85,85,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,541,0,1\n1590051156788,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-97,text,true,,5816,168,85,85,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051156264,541,Fetch Specific Image,200,OK,Fetch Specific Image 1-99,text,true,,5816,168,85,85,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,541,0,0\n1590051156798,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-98,text,true,,5816,168,86,86,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156270,544,Fetch Specific Image,200,OK,Fetch Specific Image 1-100,text,true,,5816,168,85,85,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,544,0,1\n1590051156805,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-99,text,true,,5816,168,86,86,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051156277,547,Fetch Specific Image,200,OK,Fetch Specific Image 1-101,text,true,,5816,168,86,86,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,547,0,0\n1590051156815,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-100,text,true,,5816,168,87,87,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051156283,552,Fetch Specific Image,200,OK,Fetch Specific Image 1-102,text,true,,5816,168,87,87,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,552,0,0\n1590051156824,18,Fetch Specific Image,200,OK,Fetch Specific Image 1-101,text,true,,5816,168,87,87,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,18,0,0\n1590051156289,561,Fetch Specific Image,200,OK,Fetch Specific Image 1-103,text,true,,5816,168,88,88,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,561,0,1\n1590051156836,18,Fetch Specific Image,200,OK,Fetch Specific Image 1-102,text,true,,5816,168,88,88,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,18,0,0\n1590051156296,564,Fetch Specific Image,200,OK,Fetch Specific Image 1-104,text,true,,5816,168,88,88,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,564,0,1\n1590051156850,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-103,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156303,566,Fetch Specific Image,200,OK,Fetch Specific Image 1-105,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,566,0,1\n1590051156861,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-104,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051156309,569,Fetch Specific Image,200,OK,Fetch Specific Image 1-106,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,569,0,1\n1590051156870,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-105,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156316,571,Fetch Specific Image,200,OK,Fetch Specific Image 1-107,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,571,0,0\n1590051156878,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-106,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156322,571,Fetch Specific Image,200,OK,Fetch Specific Image 1-108,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,571,0,0\n1590051156887,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-107,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156328,572,Fetch Specific Image,200,OK,Fetch Specific Image 1-109,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,572,0,1\n1590051156894,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-108,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156335,573,Fetch Specific Image,200,OK,Fetch Specific Image 1-110,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,573,0,0\n1590051156901,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-109,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156341,572,Fetch Specific Image,200,OK,Fetch Specific Image 1-111,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,572,0,0\n1590051156908,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-110,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156348,572,Fetch Specific Image,200,OK,Fetch Specific Image 1-112,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,572,0,0\n1590051156914,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-111,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156353,573,Fetch Specific Image,200,OK,Fetch Specific Image 1-113,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,573,0,1\n1590051156921,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-112,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051156360,573,Fetch Specific Image,200,OK,Fetch Specific Image 1-114,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,573,0,1\n1590051156926,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-113,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156367,573,Fetch Specific Image,200,OK,Fetch Specific Image 1-115,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,573,0,0\n1590051156933,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-114,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156373,580,Fetch Specific Image,200,OK,Fetch Specific Image 1-116,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,580,0,1\n1590051156941,18,Fetch Specific Image,200,OK,Fetch Specific Image 1-115,text,true,,5816,168,91,91,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,18,0,0\n1590051156380,585,Fetch Specific Image,200,OK,Fetch Specific Image 1-117,text,true,,5816,168,91,91,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,585,0,0\n1590051156953,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-116,text,true,,5816,168,92,92,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,16,0,0\n1590051156386,589,Fetch Specific Image,200,OK,Fetch Specific Image 1-118,text,true,,5816,168,92,92,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,589,0,1\n1590051156965,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-117,text,true,,5816,168,92,92,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156393,591,Fetch Specific Image,200,OK,Fetch Specific Image 1-119,text,true,,5816,168,92,92,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,591,0,0\n1590051156975,19,Fetch Specific Image,200,OK,Fetch Specific Image 1-118,text,true,,5816,168,94,94,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,19,0,0\n1590051156399,598,Fetch Specific Image,200,OK,Fetch Specific Image 1-120,text,true,,5816,168,93,93,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,598,0,0\n1590051156984,19,Fetch Specific Image,200,OK,Fetch Specific Image 1-119,text,true,,5816,168,94,94,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,19,0,0\n1590051156405,604,Fetch Specific Image,200,OK,Fetch Specific Image 1-121,text,true,,5816,168,94,94,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,604,0,1\n1590051156997,18,Fetch Specific Image,200,OK,Fetch Specific Image 1-120,text,true,,5816,168,95,95,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,18,0,0\n1590051156412,607,Fetch Specific Image,200,OK,Fetch Specific Image 1-122,text,true,,5816,168,94,94,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,607,0,0\n1590051157010,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-121,text,true,,5816,168,95,95,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051156418,609,Fetch Specific Image,200,OK,Fetch Specific Image 1-123,text,true,,5816,168,95,95,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,609,0,1\n1590051157019,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-122,text,true,,5816,168,96,96,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156424,616,Fetch Specific Image,200,OK,Fetch Specific Image 1-124,text,true,,5816,168,96,96,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,616,0,1\n1590051157027,17,Fetch Specific Image,200,OK,Fetch Specific Image 1-123,text,true,,5816,168,96,96,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,17,0,0\n1590051156431,617,Fetch Specific Image,200,OK,Fetch Specific Image 1-125,text,true,,5816,168,96,96,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,617,0,1\n1590051157040,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-124,text,true,,5816,168,97,97,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051156438,619,Fetch Specific Image,200,OK,Fetch Specific Image 1-126,text,true,,5816,168,96,96,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,619,0,1\n1590051157049,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-125,text,true,,5816,168,97,97,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156444,624,Fetch Specific Image,200,OK,Fetch Specific Image 1-127,text,true,,5816,168,97,97,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,624,0,1\n1590051157057,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-126,text,true,,5816,168,98,98,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156452,627,Fetch Specific Image,200,OK,Fetch Specific Image 1-128,text,true,,5816,168,98,98,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,627,0,0\n1590051157068,20,Fetch Specific Image,200,OK,Fetch Specific Image 1-127,text,true,,5816,168,99,99,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,20,0,0\n1590051156458,637,Fetch Specific Image,200,OK,Fetch Specific Image 1-129,text,true,,5816,168,99,99,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,637,0,0\n1590051157080,24,Fetch Specific Image,200,OK,Fetch Specific Image 1-128,text,true,,5816,168,101,101,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,24,0,0\n1590051156465,644,Fetch Specific Image,200,OK,Fetch Specific Image 1-130,text,true,,5816,168,100,100,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,644,0,0\n1590051157095,23,Fetch Specific Image,200,OK,Fetch Specific Image 1-129,text,true,,5816,168,102,102,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,23,0,0\n1590051156471,656,Fetch Specific Image,200,OK,Fetch Specific Image 1-131,text,true,,5816,168,102,102,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,656,0,1\n1590051157110,24,Fetch Specific Image,200,OK,Fetch Specific Image 1-130,text,true,,5816,168,103,103,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,24,0,0\n1590051156477,663,Fetch Specific Image,200,OK,Fetch Specific Image 1-132,text,true,,5816,168,103,103,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,663,0,1\n1590051157127,18,Fetch Specific Image,200,OK,Fetch Specific Image 1-131,text,true,,5816,168,104,104,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,18,0,0\n1590051156484,665,Fetch Specific Image,200,OK,Fetch Specific Image 1-133,text,true,,5816,168,103,103,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,665,0,1\n1590051157140,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-132,text,true,,5816,168,104,104,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051156491,666,Fetch Specific Image,200,OK,Fetch Specific Image 1-134,text,true,,5816,168,103,103,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,666,0,0\n1590051157149,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-133,text,true,,5816,168,104,104,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051156497,669,Fetch Specific Image,200,OK,Fetch Specific Image 1-135,text,true,,5816,168,104,104,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,669,0,1\n1590051157157,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-134,text,true,,5816,168,104,104,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156504,670,Fetch Specific Image,200,OK,Fetch Specific Image 1-136,text,true,,5816,168,104,104,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,670,0,1\n1590051157166,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-135,text,true,,5816,168,105,105,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051156510,673,Fetch Specific Image,200,OK,Fetch Specific Image 1-137,text,true,,5816,168,104,104,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,673,0,1\n1590051157174,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-136,text,true,,5816,168,106,106,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,16,0,0\n1590051156518,677,Fetch Specific Image,200,OK,Fetch Specific Image 1-138,text,true,,5816,168,105,105,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,677,0,0\n1590051157183,16,Fetch Specific Image,200,OK,Fetch Specific Image 1-137,text,true,,5816,168,106,106,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,16,0,0\n1590051156525,681,Fetch Specific Image,200,OK,Fetch Specific Image 1-139,text,true,,5816,168,106,106,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,681,0,1\n1590051157195,17,Fetch Specific Image,200,OK,Fetch Specific Image 1-138,text,true,,5816,168,107,107,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,17,0,0\n1590051156531,685,Fetch Specific Image,200,OK,Fetch Specific Image 1-140,text,true,,5816,168,106,106,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,685,0,1\n1590051157206,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-139,text,true,,5816,168,107,107,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156538,688,Fetch Specific Image,200,OK,Fetch Specific Image 1-141,text,true,,5816,168,107,107,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,687,0,0\n1590051157217,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-140,text,true,,5816,168,107,107,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156544,690,Fetch Specific Image,200,OK,Fetch Specific Image 1-142,text,true,,5816,168,107,107,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,690,0,0\n1590051157226,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-141,text,true,,5816,168,108,108,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156550,691,Fetch Specific Image,200,OK,Fetch Specific Image 1-143,text,true,,5816,168,107,107,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,691,0,1\n1590051157234,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-142,text,true,,5816,168,108,108,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156557,695,Fetch Specific Image,200,OK,Fetch Specific Image 1-144,text,true,,5816,168,108,108,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,695,0,1\n1590051157241,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-143,text,true,,5816,168,108,108,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156563,696,Fetch Specific Image,200,OK,Fetch Specific Image 1-145,text,true,,5816,168,108,108,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,696,0,1\n1590051157252,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-144,text,true,,5816,168,109,109,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156569,698,Fetch Specific Image,200,OK,Fetch Specific Image 1-146,text,true,,5816,168,108,108,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,698,0,1\n1590051157259,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-145,text,true,,5816,168,109,109,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156576,701,Fetch Specific Image,200,OK,Fetch Specific Image 1-147,text,true,,5816,168,108,108,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,701,0,0\n1590051157267,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-146,text,true,,5816,168,109,109,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156582,704,Fetch Specific Image,200,OK,Fetch Specific Image 1-148,text,true,,5816,168,109,109,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,704,0,1\n1590051157277,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-147,text,true,,5816,168,109,109,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051156589,707,Fetch Specific Image,200,OK,Fetch Specific Image 1-149,text,true,,5816,168,109,109,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,707,0,0\n1590051157287,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-148,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156596,709,Fetch Specific Image,200,OK,Fetch Specific Image 1-150,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,709,0,0\n1590051157296,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-149,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051156602,710,Fetch Specific Image,200,OK,Fetch Specific Image 1-151,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,710,0,0\n1590051157305,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-150,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156609,710,Fetch Specific Image,200,OK,Fetch Specific Image 1-152,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,710,0,0\n1590051157312,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-151,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156615,710,Fetch Specific Image,200,OK,Fetch Specific Image 1-153,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,710,0,1\n1590051157319,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-152,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156621,711,Fetch Specific Image,200,OK,Fetch Specific Image 1-154,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,711,0,1\n1590051157325,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-153,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156628,713,Fetch Specific Image,200,OK,Fetch Specific Image 1-155,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,713,0,1\n1590051157332,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-154,text,true,,5816,168,111,111,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051156635,717,Fetch Specific Image,200,OK,Fetch Specific Image 1-156,text,true,,5816,168,111,111,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,717,0,0\n1590051157341,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-155,text,true,,5816,168,111,111,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156641,720,Fetch Specific Image,200,OK,Fetch Specific Image 1-157,text,true,,5816,168,111,111,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,720,0,1\n1590051157352,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-156,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051156647,722,Fetch Specific Image,200,OK,Fetch Specific Image 1-158,text,true,,5816,168,111,111,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,722,0,1\n1590051157361,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-157,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156654,722,Fetch Specific Image,200,OK,Fetch Specific Image 1-159,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,722,0,0\n1590051157369,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-158,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156660,723,Fetch Specific Image,200,OK,Fetch Specific Image 1-160,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,723,0,1\n1590051157377,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-159,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156668,723,Fetch Specific Image,200,OK,Fetch Specific Image 1-161,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,723,0,0\n1590051157383,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-160,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156675,723,Fetch Specific Image,200,OK,Fetch Specific Image 1-162,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,723,0,0\n1590051157391,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-161,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156681,724,Fetch Specific Image,200,OK,Fetch Specific Image 1-163,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,724,0,0\n1590051157398,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-162,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156687,724,Fetch Specific Image,200,OK,Fetch Specific Image 1-164,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,724,0,1\n1590051157405,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-163,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156693,725,Fetch Specific Image,200,OK,Fetch Specific Image 1-165,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,725,0,1\n1590051157412,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-164,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156700,727,Fetch Specific Image,200,OK,Fetch Specific Image 1-166,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,727,0,0\n1590051157419,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-165,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156707,726,Fetch Specific Image,200,OK,Fetch Specific Image 1-167,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,726,0,0\n1590051157427,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-166,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156713,729,Fetch Specific Image,200,OK,Fetch Specific Image 1-168,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,729,0,1\n1590051157434,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-167,text,true,,5816,168,114,114,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156719,731,Fetch Specific Image,200,OK,Fetch Specific Image 1-169,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,731,0,1\n1590051157442,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-168,text,true,,5816,168,114,114,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156726,732,Fetch Specific Image,200,OK,Fetch Specific Image 1-170,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,732,0,1\n1590051157451,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-169,text,true,,5816,168,114,114,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156732,734,Fetch Specific Image,200,OK,Fetch Specific Image 1-171,text,true,,5816,168,114,114,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,734,0,1\n1590051157458,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-170,text,true,,5816,168,114,114,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156739,734,Fetch Specific Image,200,OK,Fetch Specific Image 1-172,text,true,,5816,168,114,114,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,734,0,0\n1590051157466,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-171,text,true,,5816,168,114,114,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156745,737,Fetch Specific Image,200,OK,Fetch Specific Image 1-173,text,true,,5816,168,114,114,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,736,0,1\n1590051157474,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-172,text,true,,5816,168,115,115,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156752,736,Fetch Specific Image,200,OK,Fetch Specific Image 1-174,text,true,,5816,168,114,114,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,736,0,0\n1590051157482,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-173,text,true,,5816,168,115,115,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156758,738,Fetch Specific Image,200,OK,Fetch Specific Image 1-175,text,true,,5816,168,114,114,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,737,0,0\n1590051157489,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-174,text,true,,5816,168,115,115,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156764,739,Fetch Specific Image,200,OK,Fetch Specific Image 1-176,text,true,,5816,168,115,115,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,739,0,1\n1590051157496,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-175,text,true,,5816,168,115,115,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156771,742,Fetch Specific Image,200,OK,Fetch Specific Image 1-177,text,true,,5816,168,115,115,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,742,0,0\n1590051157504,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-176,text,true,,5816,168,115,115,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156777,742,Fetch Specific Image,200,OK,Fetch Specific Image 1-178,text,true,,5816,168,115,115,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,742,0,1\n1590051157513,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-177,text,true,,5816,168,116,116,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051156783,751,Fetch Specific Image,200,OK,Fetch Specific Image 1-179,text,true,,5816,168,117,117,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,751,0,1\n1590051157520,43,Fetch Specific Image,200,OK,Fetch Specific Image 1-178,text,true,,5816,168,122,122,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,43,0,0\n1590051156790,783,Fetch Specific Image,200,OK,Fetch Specific Image 1-180,text,true,,5816,168,122,122,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,783,0,0\n1590051157534,44,Fetch Specific Image,200,OK,Fetch Specific Image 1-179,text,true,,5816,168,122,122,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,44,0,0\n1590051156796,788,Fetch Specific Image,200,OK,Fetch Specific Image 1-181,text,true,,5816,168,121,121,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,788,0,0\n1590051157574,15,Fetch Specific Image,200,OK,Fetch Specific Image 1-180,text,true,,5816,168,121,121,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,15,0,0\n1590051156803,792,Fetch Specific Image,200,OK,Fetch Specific Image 1-182,text,true,,5816,168,120,120,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,792,0,0\n1590051157585,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-181,text,true,,5816,168,120,120,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051156809,794,Fetch Specific Image,200,OK,Fetch Specific Image 1-183,text,true,,5816,168,119,119,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,794,0,1\n1590051157595,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-182,text,true,,5816,168,119,119,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051156816,796,Fetch Specific Image,200,OK,Fetch Specific Image 1-184,text,true,,5816,168,118,118,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,796,0,0\n1590051157604,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-183,text,true,,5816,168,118,118,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156822,797,Fetch Specific Image,200,OK,Fetch Specific Image 1-185,text,true,,5816,168,117,117,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,797,0,0\n1590051157613,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-184,text,true,,5816,168,117,117,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156828,799,Fetch Specific Image,200,OK,Fetch Specific Image 1-186,text,true,,5816,168,116,116,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,799,0,1\n1590051157620,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-185,text,true,,5816,168,116,116,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156836,797,Fetch Specific Image,200,OK,Fetch Specific Image 1-187,text,true,,5816,168,115,115,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,797,0,0\n1590051157627,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-186,text,true,,5816,168,115,115,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051156843,796,Fetch Specific Image,200,OK,Fetch Specific Image 1-188,text,true,,5816,168,114,114,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,796,0,1\n1590051157633,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-187,text,true,,5816,168,114,114,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156850,796,Fetch Specific Image,200,OK,Fetch Specific Image 1-189,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,796,0,0\n1590051157639,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-188,text,true,,5816,168,113,113,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156856,796,Fetch Specific Image,200,OK,Fetch Specific Image 1-190,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,796,0,1\n1590051157646,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-189,text,true,,5816,168,112,112,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156862,797,Fetch Specific Image,200,OK,Fetch Specific Image 1-191,text,true,,5816,168,111,111,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,797,0,1\n1590051157653,38,Fetch Specific Image,200,OK,Fetch Specific Image 1-190,text,true,,5816,168,111,111,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,38,0,0\n1590051156870,824,Fetch Specific Image,200,OK,Fetch Specific Image 1-192,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,824,0,1\n1590051157659,38,Fetch Specific Image,200,OK,Fetch Specific Image 1-191,text,true,,5816,168,110,110,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,38,0,0\n1590051156875,826,Fetch Specific Image,200,OK,Fetch Specific Image 1-193,text,true,,5816,168,109,109,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,826,0,1\n1590051157694,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-192,text,true,,5816,168,109,109,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156882,827,Fetch Specific Image,200,OK,Fetch Specific Image 1-194,text,true,,5816,168,108,108,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,827,0,0\n1590051157701,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-193,text,true,,5816,168,108,108,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156888,826,Fetch Specific Image,200,OK,Fetch Specific Image 1-195,text,true,,5816,168,107,107,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,826,0,0\n1590051157709,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-194,text,true,,5816,168,107,107,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156894,827,Fetch Specific Image,200,OK,Fetch Specific Image 1-196,text,true,,5816,168,106,106,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,827,0,1\n1590051157715,8,Fetch Specific Image,200,OK,Fetch Specific Image 1-195,text,true,,5816,168,106,106,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,8,0,0\n1590051156901,825,Fetch Specific Image,200,OK,Fetch Specific Image 1-197,text,true,,5816,168,105,105,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,825,0,1\n1590051157721,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-196,text,true,,5816,168,105,105,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051156908,825,Fetch Specific Image,200,OK,Fetch Specific Image 1-198,text,true,,5816,168,104,104,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,825,0,0\n1590051157726,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-197,text,true,,5816,168,104,104,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051156914,824,Fetch Specific Image,200,OK,Fetch Specific Image 1-199,text,true,,5816,168,103,103,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,824,0,1\n1590051157733,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-198,text,true,,5816,168,103,103,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051156920,837,Fetch Specific Image,200,OK,Fetch Specific Image 1-200,text,true,,5816,168,102,102,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,837,0,1\n1590051157739,22,Fetch Specific Image,200,OK,Fetch Specific Image 1-199,text,true,,5816,168,102,102,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,22,0,0\n1590051156928,836,Fetch Specific Image,200,OK,Fetch Specific Image 1-201,text,true,,5816,168,101,101,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,836,0,0\n1590051157758,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-200,text,true,,5816,168,101,101,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051156934,837,Fetch Specific Image,200,OK,Fetch Specific Image 1-202,text,true,,5816,168,100,100,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,837,0,1\n1590051157764,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-201,text,true,,5816,168,100,100,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051156942,835,Fetch Specific Image,200,OK,Fetch Specific Image 1-203,text,true,,5816,168,99,99,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,835,0,0\n1590051157771,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-202,text,true,,5816,168,99,99,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051156948,834,Fetch Specific Image,200,OK,Fetch Specific Image 1-204,text,true,,5816,168,98,98,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,834,0,0\n1590051157777,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-203,text,true,,5816,168,98,98,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051156956,833,Fetch Specific Image,200,OK,Fetch Specific Image 1-205,text,true,,5816,168,97,97,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,833,0,0\n1590051157782,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-204,text,true,,5816,168,97,97,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051156962,833,Fetch Specific Image,200,OK,Fetch Specific Image 1-206,text,true,,5816,168,96,96,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,833,0,0\n1590051157789,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-205,text,true,,5816,168,96,96,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051156968,833,Fetch Specific Image,200,OK,Fetch Specific Image 1-207,text,true,,5816,168,95,95,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,833,0,1\n1590051157795,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-206,text,true,,5816,168,95,95,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051156975,831,Fetch Specific Image,200,OK,Fetch Specific Image 1-208,text,true,,5816,168,94,94,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,831,0,0\n1590051157801,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-207,text,true,,5816,168,94,94,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051156981,837,Fetch Specific Image,200,OK,Fetch Specific Image 1-209,text,true,,5816,168,93,93,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,837,0,0\n1590051157806,17,Fetch Specific Image,200,OK,Fetch Specific Image 1-208,text,true,,5816,168,93,93,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,17,0,0\n1590051156987,840,Fetch Specific Image,200,OK,Fetch Specific Image 1-210,text,true,,5816,168,92,92,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,840,0,1\n1590051157818,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-209,text,true,,5816,168,92,92,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051156994,842,Fetch Specific Image,200,OK,Fetch Specific Image 1-211,text,true,,5816,168,91,91,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,842,0,0\n1590051157828,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-210,text,true,,5816,168,91,91,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157000,843,Fetch Specific Image,200,OK,Fetch Specific Image 1-212,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,843,0,0\n1590051157837,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-211,text,true,,5816,168,90,90,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157007,844,Fetch Specific Image,200,OK,Fetch Specific Image 1-213,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,844,0,0\n1590051157843,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-212,text,true,,5816,168,89,89,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157013,845,Fetch Specific Image,200,OK,Fetch Specific Image 1-214,text,true,,5816,168,88,88,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,845,0,1\n1590051157851,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-213,text,true,,5816,168,88,88,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157019,845,Fetch Specific Image,200,OK,Fetch Specific Image 1-215,text,true,,5816,168,87,87,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,845,0,1\n1590051157859,8,Fetch Specific Image,200,OK,Fetch Specific Image 1-214,text,true,,5816,168,87,87,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,8,0,0\n1590051157026,845,Fetch Specific Image,200,OK,Fetch Specific Image 1-216,text,true,,5816,168,86,86,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,845,0,1\n1590051157864,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-215,text,true,,5816,168,86,86,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157032,848,Fetch Specific Image,200,OK,Fetch Specific Image 1-217,text,true,,5816,168,85,85,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,848,0,1\n1590051157871,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-216,text,true,,5816,168,85,85,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051157039,846,Fetch Specific Image,200,OK,Fetch Specific Image 1-218,text,true,,5816,168,84,84,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,846,0,0\n1590051157880,8,Fetch Specific Image,200,OK,Fetch Specific Image 1-217,text,true,,5816,168,84,84,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,8,0,0\n1590051157045,845,Fetch Specific Image,200,OK,Fetch Specific Image 1-219,text,true,,5816,168,83,83,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,845,0,0\n1590051157886,7,Fetch Specific Image,200,OK,Fetch Specific Image 1-218,text,true,,5816,168,83,83,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,7,0,0\n1590051157051,846,Fetch Specific Image,200,OK,Fetch Specific Image 1-220,text,true,,5816,168,82,82,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,846,0,1\n1590051157890,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-219,text,true,,5816,168,82,82,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157058,843,Fetch Specific Image,200,OK,Fetch Specific Image 1-221,text,true,,5816,168,81,81,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,843,0,0\n1590051157897,7,Fetch Specific Image,200,OK,Fetch Specific Image 1-220,text,true,,5816,168,81,81,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,7,0,0\n1590051157064,843,Fetch Specific Image,200,OK,Fetch Specific Image 1-222,text,true,,5816,168,80,80,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,843,0,0\n1590051157901,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-221,text,true,,5816,168,80,80,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157071,841,Fetch Specific Image,200,OK,Fetch Specific Image 1-223,text,true,,5816,168,79,79,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,841,0,0\n1590051157907,8,Fetch Specific Image,200,OK,Fetch Specific Image 1-222,text,true,,5816,168,79,79,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,8,0,0\n1590051157078,840,Fetch Specific Image,200,OK,Fetch Specific Image 1-224,text,true,,5816,168,78,78,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,840,0,1\n1590051157912,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-223,text,true,,5816,168,78,78,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157085,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-225,text,true,,5816,168,77,77,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,0\n1590051157918,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-224,text,true,,5816,168,77,77,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157091,842,Fetch Specific Image,200,OK,Fetch Specific Image 1-226,text,true,,5816,168,76,76,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,842,0,0\n1590051157924,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-225,text,true,,5816,168,76,76,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051157098,841,Fetch Specific Image,200,OK,Fetch Specific Image 1-227,text,true,,5816,168,75,75,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,841,0,0\n1590051157933,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-226,text,true,,5816,168,75,75,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157104,842,Fetch Specific Image,200,OK,Fetch Specific Image 1-228,text,true,,5816,168,74,74,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,842,0,0\n1590051157939,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-227,text,true,,5816,168,74,74,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157110,841,Fetch Specific Image,200,OK,Fetch Specific Image 1-229,text,true,,5816,168,73,73,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,841,0,1\n1590051157946,8,Fetch Specific Image,200,OK,Fetch Specific Image 1-228,text,true,,5816,168,73,73,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,8,0,0\n1590051157116,842,Fetch Specific Image,200,OK,Fetch Specific Image 1-230,text,true,,5816,168,72,72,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,842,0,1\n1590051157951,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-229,text,true,,5816,168,72,72,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157125,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-231,text,true,,5816,168,71,71,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,0\n1590051157958,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-230,text,true,,5816,168,71,71,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157131,840,Fetch Specific Image,200,OK,Fetch Specific Image 1-232,text,true,,5816,168,70,70,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,840,0,0\n1590051157964,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-231,text,true,,5816,168,70,70,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157137,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-233,text,true,,5816,168,69,69,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,0\n1590051157971,8,Fetch Specific Image,200,OK,Fetch Specific Image 1-232,text,true,,5816,168,69,69,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,8,0,0\n1590051157144,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-234,text,true,,5816,168,68,68,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,1\n1590051157977,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-233,text,true,,5816,168,68,68,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157150,840,Fetch Specific Image,200,OK,Fetch Specific Image 1-235,text,true,,5816,168,67,67,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,840,0,1\n1590051157983,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-234,text,true,,5816,168,67,67,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157158,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-236,text,true,,5816,168,66,66,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,0\n1590051157990,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-235,text,true,,5816,168,66,66,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157164,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-237,text,true,,5816,168,65,65,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,1\n1590051157997,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-236,text,true,,5816,168,65,65,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157171,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-238,text,true,,5816,168,64,64,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,0\n1590051158003,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-237,text,true,,5816,168,64,64,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157178,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-239,text,true,,5816,168,63,63,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,1\n1590051158011,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-238,text,true,,5816,168,63,63,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157184,840,Fetch Specific Image,200,OK,Fetch Specific Image 1-240,text,true,,5816,168,62,62,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,840,0,1\n1590051158017,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-239,text,true,,5816,168,62,62,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157191,838,Fetch Specific Image,200,OK,Fetch Specific Image 1-241,text,true,,5816,168,61,61,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,838,0,0\n1590051158024,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-240,text,true,,5816,168,61,61,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157197,838,Fetch Specific Image,200,OK,Fetch Specific Image 1-242,text,true,,5816,168,60,60,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,838,0,1\n1590051158029,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-241,text,true,,5816,168,60,60,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157204,840,Fetch Specific Image,200,OK,Fetch Specific Image 1-243,text,true,,5816,168,59,59,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,840,0,1\n1590051158036,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-242,text,true,,5816,168,59,59,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157211,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-244,text,true,,5816,168,58,58,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,1\n1590051158044,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-243,text,true,,5816,168,58,58,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157218,838,Fetch Specific Image,200,OK,Fetch Specific Image 1-245,text,true,,5816,168,57,57,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,838,0,0\n1590051158050,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-244,text,true,,5816,168,57,57,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157224,837,Fetch Specific Image,200,OK,Fetch Specific Image 1-246,text,true,,5816,168,56,56,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,837,0,0\n1590051158056,8,Fetch Specific Image,200,OK,Fetch Specific Image 1-245,text,true,,5816,168,56,56,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,8,0,0\n1590051157230,836,Fetch Specific Image,200,OK,Fetch Specific Image 1-247,text,true,,5816,168,55,55,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,836,0,1\n1590051158061,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-246,text,true,,5816,168,55,55,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157236,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-248,text,true,,5816,168,54,54,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,1\n1590051158066,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-247,text,true,,5816,168,54,54,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051157243,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-249,text,true,,5816,168,53,53,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,0\n1590051158075,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-248,text,true,,5816,168,53,53,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157250,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-250,text,true,,5816,168,52,52,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,1\n1590051158082,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-249,text,true,,5816,168,52,52,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157257,839,Fetch Specific Image,200,OK,Fetch Specific Image 1-251,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,839,0,0\n1590051158089,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-250,text,true,,5816,168,51,51,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157264,840,Fetch Specific Image,200,OK,Fetch Specific Image 1-252,text,true,,5816,168,50,50,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,840,0,0\n1590051158096,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-251,text,true,,5816,168,50,50,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051157271,843,Fetch Specific Image,200,OK,Fetch Specific Image 1-253,text,true,,5816,168,49,49,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,843,0,0\n1590051158105,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-252,text,true,,5816,168,49,49,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051157278,843,Fetch Specific Image,200,OK,Fetch Specific Image 1-254,text,true,,5816,168,48,48,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,843,0,1\n1590051158114,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-253,text,true,,5816,168,48,48,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157285,842,Fetch Specific Image,200,OK,Fetch Specific Image 1-255,text,true,,5816,168,47,47,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,842,0,0\n1590051158121,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-254,text,true,,5816,168,47,47,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157291,843,Fetch Specific Image,200,OK,Fetch Specific Image 1-256,text,true,,5816,168,46,46,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,843,0,1\n1590051158127,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-255,text,true,,5816,168,46,46,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157298,843,Fetch Specific Image,200,OK,Fetch Specific Image 1-257,text,true,,5816,168,45,45,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,843,0,0\n1590051158134,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-256,text,true,,5816,168,45,45,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051157305,845,Fetch Specific Image,200,OK,Fetch Specific Image 1-258,text,true,,5816,168,44,44,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,845,0,1\n1590051158141,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-257,text,true,,5816,168,44,44,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051157312,848,Fetch Specific Image,200,OK,Fetch Specific Image 1-259,text,true,,5816,168,43,43,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,848,0,0\n1590051158150,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-258,text,true,,5816,168,43,43,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051157318,849,Fetch Specific Image,200,OK,Fetch Specific Image 1-260,text,true,,5816,168,42,42,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,849,0,0\n1590051158160,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-259,text,true,,5816,168,42,42,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051157325,852,Fetch Specific Image,200,OK,Fetch Specific Image 1-261,text,true,,5816,168,41,41,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,852,0,0\n1590051158167,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-260,text,true,,5816,168,41,41,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051157331,852,Fetch Specific Image,200,OK,Fetch Specific Image 1-262,text,true,,5816,168,40,40,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,852,0,0\n1590051158177,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-261,text,true,,5816,168,40,40,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157337,854,Fetch Specific Image,200,OK,Fetch Specific Image 1-263,text,true,,5816,168,39,39,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,854,0,1\n1590051158183,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-262,text,true,,5816,168,39,39,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051157344,856,Fetch Specific Image,200,OK,Fetch Specific Image 1-264,text,true,,5816,168,38,38,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,856,0,0\n1590051158191,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-263,text,true,,5816,168,38,38,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051157350,856,Fetch Specific Image,200,OK,Fetch Specific Image 1-265,text,true,,5816,168,37,37,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,856,0,0\n1590051158200,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-264,text,true,,5816,168,37,37,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157357,857,Fetch Specific Image,200,OK,Fetch Specific Image 1-266,text,true,,5816,168,36,36,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,857,0,0\n1590051158206,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-265,text,true,,5816,168,36,36,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157363,858,Fetch Specific Image,200,OK,Fetch Specific Image 1-267,text,true,,5816,168,35,35,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,858,0,0\n1590051158214,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-266,text,true,,5816,168,35,35,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051157369,860,Fetch Specific Image,200,OK,Fetch Specific Image 1-268,text,true,,5816,168,34,34,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,860,0,1\n1590051158221,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-267,text,true,,5816,168,34,34,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051157376,863,Fetch Specific Image,200,OK,Fetch Specific Image 1-269,text,true,,5816,168,33,33,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,863,0,0\n1590051158229,14,Fetch Specific Image,200,OK,Fetch Specific Image 1-268,text,true,,5816,168,33,33,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,14,0,0\n1590051157382,865,Fetch Specific Image,200,OK,Fetch Specific Image 1-270,text,true,,5816,168,32,32,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,865,0,0\n1590051158239,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-269,text,true,,5816,168,32,32,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,12,0,0\n1590051157388,867,Fetch Specific Image,200,OK,Fetch Specific Image 1-271,text,true,,5816,168,31,31,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,867,0,0\n1590051158247,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-270,text,true,,5816,168,31,31,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157394,870,Fetch Specific Image,200,OK,Fetch Specific Image 1-272,text,true,,5816,168,30,30,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,870,0,1\n1590051158255,12,Fetch Specific Image,200,OK,Fetch Specific Image 1-271,text,true,,5816,168,30,30,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157400,870,Fetch Specific Image,200,OK,Fetch Specific Image 1-273,text,true,,5816,168,29,29,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,870,0,1\n1590051158264,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-272,text,true,,5816,168,29,29,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157407,870,Fetch Specific Image,200,OK,Fetch Specific Image 1-274,text,true,,5816,168,28,28,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,870,0,0\n1590051158270,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-273,text,true,,5816,168,28,28,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157413,870,Fetch Specific Image,200,OK,Fetch Specific Image 1-275,text,true,,5816,168,27,27,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,870,0,0\n1590051158277,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-274,text,true,,5816,168,27,27,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157420,870,Fetch Specific Image,200,OK,Fetch Specific Image 1-276,text,true,,5816,168,26,26,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,870,0,1\n1590051158283,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-275,text,true,,5816,168,26,26,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157427,869,Fetch Specific Image,200,OK,Fetch Specific Image 1-277,text,true,,5816,168,25,25,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,869,0,0\n1590051158290,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-276,text,true,,5816,168,25,25,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157433,871,Fetch Specific Image,200,OK,Fetch Specific Image 1-278,text,true,,5816,168,24,24,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,871,0,1\n1590051158297,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-277,text,true,,5816,168,24,24,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157439,871,Fetch Specific Image,200,OK,Fetch Specific Image 1-279,text,true,,5816,168,23,23,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,871,0,1\n1590051158304,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-278,text,true,,5816,168,23,23,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157446,871,Fetch Specific Image,200,OK,Fetch Specific Image 1-280,text,true,,5816,168,22,22,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,871,0,0\n1590051158311,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-279,text,true,,5816,168,22,22,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157452,870,Fetch Specific Image,200,OK,Fetch Specific Image 1-281,text,true,,5816,168,21,21,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,870,0,0\n1590051158317,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-280,text,true,,5816,168,21,21,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157458,871,Fetch Specific Image,200,OK,Fetch Specific Image 1-282,text,true,,5816,168,20,20,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,871,0,1\n1590051158323,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-281,text,true,,5816,168,20,20,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157465,871,Fetch Specific Image,200,OK,Fetch Specific Image 1-283,text,true,,5816,168,19,19,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,871,0,0\n1590051158329,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-282,text,true,,5816,168,19,19,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157471,871,Fetch Specific Image,200,OK,Fetch Specific Image 1-284,text,true,,5816,168,18,18,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,871,0,0\n1590051158336,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-283,text,true,,5816,168,18,18,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157478,870,Fetch Specific Image,200,OK,Fetch Specific Image 1-285,text,true,,5816,168,17,17,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,870,0,0\n1590051158342,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-284,text,true,,5816,168,17,17,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157484,872,Fetch Specific Image,200,OK,Fetch Specific Image 1-286,text,true,,5816,168,16,16,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,872,0,1\n1590051158348,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-285,text,true,,5816,168,16,16,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157491,872,Fetch Specific Image,200,OK,Fetch Specific Image 1-287,text,true,,5816,168,15,15,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,872,0,1\n1590051158356,10,Fetch Specific Image,200,OK,Fetch Specific Image 1-286,text,true,,5816,168,15,15,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,10,0,0\n1590051157497,872,Fetch Specific Image,200,OK,Fetch Specific Image 1-288,text,true,,5816,168,14,14,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,872,0,1\n1590051158363,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-287,text,true,,5816,168,14,14,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157504,882,Fetch Specific Image,200,OK,Fetch Specific Image 1-289,text,true,,5816,168,13,13,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,882,0,0\n1590051158369,21,Fetch Specific Image,200,OK,Fetch Specific Image 1-288,text,true,,5816,168,13,13,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,21,0,0\n1590051157511,883,Fetch Specific Image,200,OK,Fetch Specific Image 1-290,text,true,,5816,168,12,12,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,883,0,0\n1590051158386,13,Fetch Specific Image,200,OK,Fetch Specific Image 1-289,text,true,,5816,168,12,12,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,13,0,0\n1590051157517,891,Fetch Specific Image,200,OK,Fetch Specific Image 1-291,text,true,,5816,168,11,11,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,891,0,0\n1590051158394,17,Fetch Specific Image,200,OK,Fetch Specific Image 1-290,text,true,,5816,168,11,11,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,17,0,0\n1590051157522,893,Fetch Specific Image,200,OK,Fetch Specific Image 1-292,text,true,,5816,168,10,10,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,893,0,1\n1590051158408,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-291,text,true,,5816,168,10,10,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157528,894,Fetch Specific Image,200,OK,Fetch Specific Image 1-293,text,true,,5816,168,9,9,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,893,0,0\n1590051158415,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-292,text,true,,5816,168,9,9,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157533,893,Fetch Specific Image,200,OK,Fetch Specific Image 1-294,text,true,,5816,168,8,8,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,893,0,1\n1590051158422,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-293,text,true,,5816,168,8,8,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157539,894,Fetch Specific Image,200,OK,Fetch Specific Image 1-295,text,true,,5816,168,7,7,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,894,0,0\n1590051158426,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-294,text,true,,5816,168,7,7,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157545,897,Fetch Specific Image,200,OK,Fetch Specific Image 1-296,text,true,,5816,168,6,6,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,897,0,1\n1590051158433,11,Fetch Specific Image,200,OK,Fetch Specific Image 1-295,text,true,,5816,168,6,6,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,11,0,0\n1590051157550,897,Fetch Specific Image,200,OK,Fetch Specific Image 1-297,text,true,,5816,168,5,5,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,897,0,1\n1590051158442,8,Fetch Specific Image,200,OK,Fetch Specific Image 1-296,text,true,,5816,168,5,5,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,8,0,0\n1590051157556,896,Fetch Specific Image,200,OK,Fetch Specific Image 1-298,text,true,,5816,168,4,4,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,896,0,1\n1590051158447,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-297,text,true,,5816,168,4,4,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051157562,897,Fetch Specific Image,200,OK,Fetch Specific Image 1-299,text,true,,5816,168,3,3,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,897,0,0\n1590051158453,8,Fetch Specific Image,200,OK,Fetch Specific Image 1-298,text,true,,5816,168,3,3,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,8,0,0\n1590051157565,900,Fetch Specific Image,200,OK,Fetch Specific Image 1-300,text,true,,5816,168,2,2,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,900,0,1\n1590051158459,9,Fetch Specific Image,200,OK,Fetch Specific Image 1-299,text,true,,5816,168,2,2,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,9,0,0\n1590051158465,5,Fetch Specific Image,200,OK,Fetch Specific Image 1-300,text,true,,5816,168,1,1,http://localhost/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg,5,0,0\n1590051176142,127,Fetch Specific Library,200,OK,Fetch Specific Library 1-2,text,true,,4817,149,18,18,http://localhost/api/components/?component_library=1,127,0,0\n1590051176264,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-18,text,true,,4816,149,18,18,http://localhost/api/components/?component_library=1,6,0,1\n1590051176270,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-2,text,true,,4816,149,19,19,http://localhost/api/components/?component_library=1,4,0,0\n1590051176272,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-18,text,true,,4816,149,18,18,http://localhost/api/components/?component_library=1,4,0,0\n1590051176273,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-19,text,true,,4816,149,17,17,http://localhost/api/components/?component_library=1,6,0,1\n1590051176280,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-19,text,true,,4816,149,18,18,http://localhost/api/components/?component_library=1,2,0,0\n1590051176281,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-20,text,true,,4816,149,17,17,http://localhost/api/components/?component_library=1,6,0,1\n1590051176287,8,Fetch Specific Library,200,OK,Fetch Specific Library 1-20,text,true,,4816,149,18,18,http://localhost/api/components/?component_library=1,8,0,0\n1590051176135,163,Fetch Specific Library,200,OK,Fetch Specific Library 1-1,text,true,,4817,149,17,17,http://localhost/api/components/?component_library=1,163,0,0\n1590051176290,12,Fetch Specific Library,200,OK,Fetch Specific Library 1-21,text,true,,4816,149,18,18,http://localhost/api/components/?component_library=1,12,0,2\n1590051176298,8,Fetch Specific Library,200,OK,Fetch Specific Library 1-1,text,true,,4816,149,18,18,http://localhost/api/components/?component_library=1,8,0,0\n1590051176302,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-21,text,true,,4816,149,18,18,http://localhost/api/components/?component_library=1,5,0,0\n1590051176300,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-22,text,true,,4816,149,17,17,http://localhost/api/components/?component_library=1,9,0,1\n1590051176166,146,Fetch Specific Library,200,OK,Fetch Specific Library 1-5,text,true,,4817,149,17,17,http://localhost/api/components/?component_library=1,146,0,0\n1590051176309,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-22,text,true,,4816,149,17,17,http://localhost/api/components/?component_library=1,6,0,0\n1590051176307,8,Fetch Specific Library,200,OK,Fetch Specific Library 1-23,text,true,,4816,149,17,17,http://localhost/api/components/?component_library=1,8,0,1\n1590051176312,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-5,text,true,,4816,149,17,17,http://localhost/api/components/?component_library=1,6,0,0\n1590051176316,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-23,text,true,,4816,149,16,16,http://localhost/api/components/?component_library=1,5,0,0\n1590051176316,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-24,text,true,,4816,149,16,16,http://localhost/api/components/?component_library=1,7,0,0\n1590051176323,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-24,text,true,,4816,149,16,16,http://localhost/api/components/?component_library=1,4,0,0\n1590051176323,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-25,text,true,,4816,149,15,15,http://localhost/api/components/?component_library=1,6,0,1\n1590051176329,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-25,text,true,,4816,149,16,16,http://localhost/api/components/?component_library=1,4,0,0\n1590051176331,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-26,text,true,,4816,149,15,15,http://localhost/api/components/?component_library=1,6,0,1\n1590051176337,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-26,text,true,,4816,149,16,16,http://localhost/api/components/?component_library=1,3,0,0\n1590051176339,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-27,text,true,,4816,149,16,16,http://localhost/api/components/?component_library=1,9,0,0\n1590051176348,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-27,text,true,,4816,149,16,16,http://localhost/api/components/?component_library=1,3,0,0\n1590051176347,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-28,text,true,,4816,149,16,16,http://localhost/api/components/?component_library=1,7,0,0\n1590051176355,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-28,text,true,,4816,149,16,16,http://localhost/api/components/?component_library=1,3,0,0\n1590051176354,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-29,text,true,,4816,149,15,15,http://localhost/api/components/?component_library=1,7,0,1\n1590051176361,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-29,text,true,,4816,149,16,16,http://localhost/api/components/?component_library=1,3,0,0\n1590051176157,209,Fetch Specific Library,200,OK,Fetch Specific Library 1-4,text,true,,4817,149,15,15,http://localhost/api/components/?component_library=1,209,0,0\n1590051176362,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-30,text,true,,4816,149,15,15,http://localhost/api/components/?component_library=1,5,0,0\n1590051176149,222,Fetch Specific Library,200,OK,Fetch Specific Library 1-3,text,true,,4817,149,16,16,http://localhost/api/components/?component_library=1,222,0,1\n1590051176367,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-4,text,true,,4816,149,16,16,http://localhost/api/components/?component_library=1,5,0,0\n1590051176368,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-30,text,true,,4816,149,15,15,http://localhost/api/components/?component_library=1,5,0,0\n1590051176371,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-3,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,4,0,0\n1590051176369,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-31,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,7,0,2\n1590051176376,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-31,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,5,0,0\n1590051176378,8,Fetch Specific Library,200,OK,Fetch Specific Library 1-32,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,8,0,1\n1590051176386,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-32,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,5,0,0\n1590051176386,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-33,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,6,0,1\n1590051176392,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-33,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,3,0,0\n1590051176394,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-34,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,7,0,1\n1590051176401,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-34,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,2,0,0\n1590051176402,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-35,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,6,0,1\n1590051176408,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-35,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,3,0,0\n1590051176411,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-36,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,4,0,0\n1590051176415,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-36,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,2,0,0\n1590051176418,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-37,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,6,0,0\n1590051176424,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-37,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,5,0,0\n1590051176425,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-38,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,9,0,1\n1590051176434,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-38,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,3,0,0\n1590051176433,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-39,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,6,0,1\n1590051176439,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-39,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,4,0,0\n1590051176441,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-40,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,5,0,1\n1590051176446,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-40,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,4,0,0\n1590051176173,290,Fetch Specific Library,200,OK,Fetch Specific Library 1-6,text,true,,4817,149,14,14,http://localhost/api/components/?component_library=1,290,0,0\n1590051176448,18,Fetch Specific Library,200,OK,Fetch Specific Library 1-41,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,18,0,1\n1590051176181,286,Fetch Specific Library,200,OK,Fetch Specific Library 1-7,text,true,,4817,149,14,14,http://localhost/api/components/?component_library=1,286,0,0\n1590051176464,11,Fetch Specific Library,200,OK,Fetch Specific Library 1-6,text,true,,4816,149,15,15,http://localhost/api/components/?component_library=1,11,0,0\n1590051176461,15,Fetch Specific Library,200,OK,Fetch Specific Library 1-42,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,15,0,0\n1590051176466,12,Fetch Specific Library,200,OK,Fetch Specific Library 1-41,text,true,,4816,149,15,15,http://localhost/api/components/?component_library=1,12,0,0\n1590051176468,10,Fetch Specific Library,200,OK,Fetch Specific Library 1-7,text,true,,4816,149,15,15,http://localhost/api/components/?component_library=1,10,0,0\n1590051176468,13,Fetch Specific Library,200,OK,Fetch Specific Library 1-43,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,13,0,3\n1590051176477,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-42,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,7,0,0\n1590051176481,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-43,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,5,0,0\n1590051176477,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-44,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,9,0,1\n1590051176490,11,Fetch Specific Library,200,OK,Fetch Specific Library 1-46,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,11,0,0\n1590051176485,19,Fetch Specific Library,200,OK,Fetch Specific Library 1-45,text,true,,4816,149,15,15,http://localhost/api/components/?component_library=1,19,0,0\n1590051176497,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-47,text,true,,4816,149,15,15,http://localhost/api/components/?component_library=1,7,0,0\n1590051176486,18,Fetch Specific Library,200,OK,Fetch Specific Library 1-44,text,true,,4816,149,15,15,http://localhost/api/components/?component_library=1,18,0,0\n1590051176501,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-46,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,5,0,0\n1590051176504,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-45,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,3,0,0\n1590051176504,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-47,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,7,0,0\n1590051176503,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-48,text,true,,4816,149,12,12,http://localhost/api/components/?component_library=1,9,0,1\n1590051176512,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-48,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,5,0,0\n1590051176509,8,Fetch Specific Library,200,OK,Fetch Specific Library 1-49,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,8,0,1\n1590051176517,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-49,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,5,0,0\n1590051176516,11,Fetch Specific Library,200,OK,Fetch Specific Library 1-50,text,true,,4816,149,12,12,http://localhost/api/components/?component_library=1,11,0,0\n1590051176189,340,Fetch Specific Library,200,OK,Fetch Specific Library 1-8,text,true,,4817,149,13,13,http://localhost/api/components/?component_library=1,340,0,1\n1590051176527,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-50,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,9,0,0\n1590051176530,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-8,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,6,0,0\n1590051176522,14,Fetch Specific Library,200,OK,Fetch Specific Library 1-51,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,14,0,0\n1590051176528,13,Fetch Specific Library,200,OK,Fetch Specific Library 1-52,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,13,0,1\n1590051176535,13,Fetch Specific Library,200,OK,Fetch Specific Library 1-53,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,13,0,0\n1590051176536,12,Fetch Specific Library,200,OK,Fetch Specific Library 1-51,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,12,0,0\n1590051176197,358,Fetch Specific Library,200,OK,Fetch Specific Library 1-9,text,true,,4817,149,14,14,http://localhost/api/components/?component_library=1,358,0,0\n1590051176541,17,Fetch Specific Library,200,OK,Fetch Specific Library 1-52,text,true,,4816,149,14,14,http://localhost/api/components/?component_library=1,17,0,0\n1590051176548,10,Fetch Specific Library,200,OK,Fetch Specific Library 1-53,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,10,0,0\n1590051176555,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-9,text,true,,4816,149,12,12,http://localhost/api/components/?component_library=1,4,0,0\n1590051176541,22,Fetch Specific Library,200,OK,Fetch Specific Library 1-54,text,true,,4816,149,12,12,http://localhost/api/components/?component_library=1,22,0,1\n1590051176548,15,Fetch Specific Library,200,OK,Fetch Specific Library 1-55,text,true,,4816,149,12,12,http://localhost/api/components/?component_library=1,15,0,0\n1590051176554,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-56,text,true,,4816,149,12,12,http://localhost/api/components/?component_library=1,9,0,0\n1590051176563,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-54,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,5,0,0\n1590051176563,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-56,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,5,0,0\n1590051176563,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-55,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,5,0,0\n1590051176560,8,Fetch Specific Library,200,OK,Fetch Specific Library 1-57,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,8,0,0\n1590051176567,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-58,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,7,0,0\n1590051176568,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-57,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,7,0,0\n1590051176574,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-58,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,5,0,0\n1590051176573,8,Fetch Specific Library,200,OK,Fetch Specific Library 1-59,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,8,0,0\n1590051176581,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-59,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,4,0,0\n1590051176579,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-60,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,7,0,1\n1590051176586,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-60,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,4,0,0\n1590051176586,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-61,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,6,0,0\n1590051176592,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-61,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,5,0,0\n1590051176593,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-62,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,7,0,0\n1590051176204,398,Fetch Specific Library,200,OK,Fetch Specific Library 1-10,text,true,,4817,149,10,10,http://localhost/api/components/?component_library=1,398,0,0\n1590051176600,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-62,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,3,0,0\n1590051176599,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-63,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,6,0,1\n1590051176602,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-10,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,5,0,0\n1590051176606,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-63,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,5,0,0\n1590051176606,11,Fetch Specific Library,200,OK,Fetch Specific Library 1-64,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,11,0,1\n1590051176613,8,Fetch Specific Library,200,OK,Fetch Specific Library 1-65,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,8,0,0\n1590051176618,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-64,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,8,0,0\n1590051176621,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-65,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,6,0,0\n1590051176619,11,Fetch Specific Library,200,OK,Fetch Specific Library 1-66,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,11,0,0\n1590051176625,10,Fetch Specific Library,200,OK,Fetch Specific Library 1-67,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,10,0,1\n1590051176631,11,Fetch Specific Library,200,OK,Fetch Specific Library 1-66,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,11,0,0\n1590051176635,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-67,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,7,0,0\n1590051176632,12,Fetch Specific Library,200,OK,Fetch Specific Library 1-68,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,11,0,0\n1590051176638,11,Fetch Specific Library,200,OK,Fetch Specific Library 1-69,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,11,0,1\n1590051176644,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-68,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,6,0,0\n1590051176645,15,Fetch Specific Library,200,OK,Fetch Specific Library 1-70,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,15,0,0\n1590051176649,12,Fetch Specific Library,200,OK,Fetch Specific Library 1-69,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,12,0,0\n1590051176651,14,Fetch Specific Library,200,OK,Fetch Specific Library 1-71,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,14,0,1\n1590051176660,8,Fetch Specific Library,200,OK,Fetch Specific Library 1-70,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,8,0,0\n1590051176665,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-71,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,4,0,0\n1590051176664,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-73,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,6,0,0\n1590051176671,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-73,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,3,0,0\n1590051176670,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-74,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,5,0,1\n1590051176657,24,Fetch Specific Library,200,OK,Fetch Specific Library 1-72,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,24,0,1\n1590051176676,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-74,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,5,0,0\n1590051176676,11,Fetch Specific Library,200,OK,Fetch Specific Library 1-75,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,11,0,1\n1590051176681,11,Fetch Specific Library,200,OK,Fetch Specific Library 1-72,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,11,0,0\n1590051176687,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-75,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,6,0,0\n1590051176683,11,Fetch Specific Library,200,OK,Fetch Specific Library 1-76,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,11,0,0\n1590051176689,10,Fetch Specific Library,200,OK,Fetch Specific Library 1-77,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,10,0,1\n1590051176695,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-76,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,6,0,0\n1590051176700,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-77,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,6,0,0\n1590051176702,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-79,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,7,0,0\n1590051176695,14,Fetch Specific Library,200,OK,Fetch Specific Library 1-78,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,14,0,1\n1590051176709,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-78,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,4,0,0\n1590051176709,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-79,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,4,0,0\n1590051176708,8,Fetch Specific Library,200,OK,Fetch Specific Library 1-80,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,8,0,1\n1590051176716,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-80,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,4,0,0\n1590051176714,30,Fetch Specific Library,200,OK,Fetch Specific Library 1-81,text,true,,4816,149,12,12,http://localhost/api/components/?component_library=1,30,0,1\n1590051176212,534,Fetch Specific Library,200,OK,Fetch Specific Library 1-11,text,true,,4817,149,12,12,http://localhost/api/components/?component_library=1,534,0,1\n1590051176741,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-85,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,9,0,1\n1590051176735,15,Fetch Specific Library,200,OK,Fetch Specific Library 1-84,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,15,0,0\n1590051176746,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-11,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,4,0,0\n1590051176744,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-81,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,6,0,0\n1590051176721,29,Fetch Specific Library,200,OK,Fetch Specific Library 1-82,text,true,,4816,149,13,13,http://localhost/api/components/?component_library=1,29,0,0\n1590051176728,24,Fetch Specific Library,200,OK,Fetch Specific Library 1-83,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,24,0,1\n1590051176750,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-85,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,3,0,0\n1590051176750,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-84,text,true,,4816,149,11,11,http://localhost/api/components/?component_library=1,3,0,0\n1590051176750,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-82,text,true,,4816,149,10,10,http://localhost/api/components/?component_library=1,5,0,0\n1590051176749,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-86,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,7,0,0\n1590051176752,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-83,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,5,0,0\n1590051176756,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-86,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,9,0,0\n1590051176755,10,Fetch Specific Library,200,OK,Fetch Specific Library 1-87,text,true,,4816,149,8,8,http://localhost/api/components/?component_library=1,10,0,0\n1590051176761,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-88,text,true,,4816,149,8,8,http://localhost/api/components/?component_library=1,5,0,1\n1590051176766,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-88,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,5,0,0\n1590051176765,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-87,text,true,,4816,149,8,8,http://localhost/api/components/?component_library=1,9,0,0\n1590051176219,557,Fetch Specific Library,200,OK,Fetch Specific Library 1-12,text,true,,4817,149,8,8,http://localhost/api/components/?component_library=1,557,0,1\n1590051176767,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-89,text,true,,4816,149,8,8,http://localhost/api/components/?component_library=1,9,0,1\n1590051176776,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-12,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,5,0,0\n1590051176774,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-90,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,7,0,1\n1590051176781,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-91,text,true,,4816,149,8,8,http://localhost/api/components/?component_library=1,4,0,0\n1590051176781,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-90,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,7,0,0\n1590051176776,12,Fetch Specific Library,200,OK,Fetch Specific Library 1-89,text,true,,4816,149,9,9,http://localhost/api/components/?component_library=1,12,0,0\n1590051176786,11,Fetch Specific Library,200,OK,Fetch Specific Library 1-91,text,true,,4816,149,8,8,http://localhost/api/components/?component_library=1,11,0,0\n1590051176787,10,Fetch Specific Library,200,OK,Fetch Specific Library 1-92,text,true,,4816,149,8,8,http://localhost/api/components/?component_library=1,10,0,0\n1590051176793,10,Fetch Specific Library,200,OK,Fetch Specific Library 1-93,text,true,,4816,149,8,8,http://localhost/api/components/?component_library=1,10,0,1\n1590051176798,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-92,text,true,,4816,149,8,8,http://localhost/api/components/?component_library=1,5,0,0\n1590051176799,7,Fetch Specific Library,200,OK,Fetch Specific Library 1-94,text,true,,4816,149,8,8,http://localhost/api/components/?component_library=1,7,0,1\n1590051176803,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-93,text,true,,4816,149,8,8,http://localhost/api/components/?component_library=1,3,0,0\n1590051176806,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-94,text,true,,4816,149,7,7,http://localhost/api/components/?component_library=1,5,0,0\n1590051176227,587,Fetch Specific Library,200,OK,Fetch Specific Library 1-13,text,true,,4817,149,7,7,http://localhost/api/components/?component_library=1,587,0,1\n1590051176806,8,Fetch Specific Library,200,OK,Fetch Specific Library 1-95,text,true,,4816,149,7,7,http://localhost/api/components/?component_library=1,8,0,1\n1590051176813,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-96,text,true,,4816,149,7,7,http://localhost/api/components/?component_library=1,4,0,0\n1590051176814,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-95,text,true,,4816,149,7,7,http://localhost/api/components/?component_library=1,3,0,0\n1590051176814,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-13,text,true,,4816,149,7,7,http://localhost/api/components/?component_library=1,3,0,0\n1590051176817,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-96,text,true,,4816,149,6,6,http://localhost/api/components/?component_library=1,4,0,0\n1590051176819,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-97,text,true,,4816,149,6,6,http://localhost/api/components/?component_library=1,6,0,0\n1590051176826,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-97,text,true,,4816,149,6,6,http://localhost/api/components/?component_library=1,2,0,0\n1590051176825,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-98,text,true,,4816,149,5,5,http://localhost/api/components/?component_library=1,5,0,1\n1590051176830,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-98,text,true,,4816,149,6,6,http://localhost/api/components/?component_library=1,2,0,0\n1590051176831,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-99,text,true,,4816,149,5,5,http://localhost/api/components/?component_library=1,5,0,1\n1590051176836,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-99,text,true,,4816,149,6,6,http://localhost/api/components/?component_library=1,3,0,0\n1590051176838,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-100,text,true,,4816,149,5,5,http://localhost/api/components/?component_library=1,3,0,1\n1590051176841,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-100,text,true,,4816,149,5,5,http://localhost/api/components/?component_library=1,2,0,0\n1590051176845,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-101,text,true,,4816,149,5,5,http://localhost/api/components/?component_library=1,3,0,0\n1590051176234,615,Fetch Specific Library,200,OK,Fetch Specific Library 1-14,text,true,,4817,149,5,5,http://localhost/api/components/?component_library=1,615,0,1\n1590051176849,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-101,text,true,,4816,149,5,5,http://localhost/api/components/?component_library=1,1,0,0\n1590051176849,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-14,text,true,,4816,149,5,5,http://localhost/api/components/?component_library=1,2,0,0\n1590051176852,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-102,text,true,,4816,149,4,4,http://localhost/api/components/?component_library=1,3,0,0\n1590051176855,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-102,text,true,,4816,149,4,4,http://localhost/api/components/?component_library=1,2,0,0\n1590051176242,618,Fetch Specific Library,200,OK,Fetch Specific Library 1-15,text,true,,4817,149,4,4,http://localhost/api/components/?component_library=1,618,0,0\n1590051176860,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-15,text,true,,4816,149,4,4,http://localhost/api/components/?component_library=1,2,0,0\n1590051176858,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-103,text,true,,4816,149,4,4,http://localhost/api/components/?component_library=1,4,0,1\n1590051176863,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-103,text,true,,4816,149,4,4,http://localhost/api/components/?component_library=1,1,0,0\n1590051176865,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-104,text,true,,4816,149,4,4,http://localhost/api/components/?component_library=1,6,0,0\n1590051176872,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-104,text,true,,4816,149,4,4,http://localhost/api/components/?component_library=1,1,0,0\n1590051176871,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-105,text,true,,4816,149,4,4,http://localhost/api/components/?component_library=1,3,0,0\n1590051176874,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-105,text,true,,4816,149,3,3,http://localhost/api/components/?component_library=1,3,0,0\n1590051176878,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-106,text,true,,4816,149,3,3,http://localhost/api/components/?component_library=1,3,0,1\n1590051176882,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-106,text,true,,4816,149,3,3,http://localhost/api/components/?component_library=1,1,0,0\n1590051176249,641,Fetch Specific Library,200,OK,Fetch Specific Library 1-16,text,true,,4817,149,3,3,http://localhost/api/components/?component_library=1,641,0,1\n1590051176884,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-107,text,true,,4816,149,3,3,http://localhost/api/components/?component_library=1,6,0,1\n1590051176257,638,Fetch Specific Library,200,OK,Fetch Specific Library 1-17,text,true,,4817,149,4,4,http://localhost/api/components/?component_library=1,638,0,0\n1590051176890,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-107,text,true,,4816,149,4,4,http://localhost/api/components/?component_library=1,5,0,0\n1590051176890,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-16,text,true,,4816,149,3,3,http://localhost/api/components/?component_library=1,6,0,0\n1590051176891,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-108,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,5,0,0\n1590051176895,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-17,text,true,,4816,149,3,3,http://localhost/api/components/?component_library=1,3,0,0\n1590051176896,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-108,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,5,0,0\n1590051176897,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-109,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,6,0,0\n1590051176903,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-109,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,3,0,0\n1590051176904,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-110,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051176908,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-110,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,3,0,0\n1590051176911,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-111,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176913,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-111,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176917,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-112,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,1\n1590051176919,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-112,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176925,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-113,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176927,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-113,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051176932,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-114,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176934,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-114,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176939,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-115,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176941,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-115,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176946,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-116,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051176949,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-116,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051176952,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-117,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051176955,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-117,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051176959,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-118,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051176962,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-118,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051176965,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-119,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051176968,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-119,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176972,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-120,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176974,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-120,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176978,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-121,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176981,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-121,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176984,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-122,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051176987,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-122,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176991,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-123,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176993,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-123,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051176997,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-124,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177000,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-124,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177004,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-125,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177007,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-125,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177010,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-126,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177013,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-126,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177016,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-127,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177019,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-127,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177022,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-128,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177025,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-128,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177030,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-129,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177032,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-129,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177037,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-130,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177039,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-130,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177044,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-131,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177046,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-131,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177050,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-132,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177053,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-132,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177056,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-133,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177059,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-133,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177062,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-134,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177065,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-134,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177069,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-135,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177071,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-135,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177076,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-136,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177079,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-136,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177082,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-137,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177085,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-137,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177089,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-138,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177092,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-138,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177096,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-139,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177098,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-139,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177103,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-140,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177106,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-140,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177110,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-141,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177113,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-141,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177116,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-142,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177119,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-142,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177122,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-143,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177125,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-143,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177129,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-144,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177132,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-144,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177136,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-145,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177138,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-145,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177142,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-146,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177145,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-146,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177148,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-147,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177151,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-147,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177155,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-148,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177158,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-148,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177162,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-149,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177164,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-149,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177168,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-150,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177172,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-150,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177174,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-151,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,5,0,1\n1590051177179,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-151,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,2,0,0\n1590051177180,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-152,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,9,0,1\n1590051177187,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-153,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,4,0,1\n1590051177189,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-152,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,2,0,0\n1590051177191,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-153,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177194,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-154,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177197,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-154,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177201,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-155,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,0\n1590051177205,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-155,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,3,0,0\n1590051177207,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-156,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177210,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-156,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177214,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-157,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177217,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-157,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177220,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-158,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177224,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-158,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177226,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-159,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177229,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-159,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177233,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-160,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177236,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-160,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177239,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-161,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177241,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-161,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177246,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-162,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177249,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-162,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177252,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-163,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177255,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-163,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177258,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-164,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177262,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-164,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177265,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-165,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177268,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-165,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177271,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-166,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,6,0,0\n1590051177277,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-166,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,4,0,0\n1590051177278,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-167,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177282,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-167,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177285,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-168,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177289,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-168,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177291,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-169,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177295,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-169,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,3,0,0\n1590051177298,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-170,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,0\n1590051177302,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-170,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,2,0,0\n1590051177304,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-171,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177307,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-171,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177310,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-172,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177313,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-172,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177316,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-173,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177319,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-173,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177323,8,Fetch Specific Library,200,OK,Fetch Specific Library 1-174,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,8,0,1\n1590051177331,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-174,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,2,0,0\n1590051177330,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-175,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,0\n1590051177334,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-175,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,2,0,0\n1590051177336,6,Fetch Specific Library,200,OK,Fetch Specific Library 1-176,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,6,0,0\n1590051177342,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-176,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,3,0,0\n1590051177342,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-177,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177346,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-177,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177350,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-178,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177353,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-178,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177356,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-179,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,5,0,0\n1590051177361,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-179,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,2,0,0\n1590051177363,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-180,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177367,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-180,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,3,0,0\n1590051177370,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-181,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,0\n1590051177374,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-181,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,2,0,0\n1590051177376,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-182,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,5,0,0\n1590051177381,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-182,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177383,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-183,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177386,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-183,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177389,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-184,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177393,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-184,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177396,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-185,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177398,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-185,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177402,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-186,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177405,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-186,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177408,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-187,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177411,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-187,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177415,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-188,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177418,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-188,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177422,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-189,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177425,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-189,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177429,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-190,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177432,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-190,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177435,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-191,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177438,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-191,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177442,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-192,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177444,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-192,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177448,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-193,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177450,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-193,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177455,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-194,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177457,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-194,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177462,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-195,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177465,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-195,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177468,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-196,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177471,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-196,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177474,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-197,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177477,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-197,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177482,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-198,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177484,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-198,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177488,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-199,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177490,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-199,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177494,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-200,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177497,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-200,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177502,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-201,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177505,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-201,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177508,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-202,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177511,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-202,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177515,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-203,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177518,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-203,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177521,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-204,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177524,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-204,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177528,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-205,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177531,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-205,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177535,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-206,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177538,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-206,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177542,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-207,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177544,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-207,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177548,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-208,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177551,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-208,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177554,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-209,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177557,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-209,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177561,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-210,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177565,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-210,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177568,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-211,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177571,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-211,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177574,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-212,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177577,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-212,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177581,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-213,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177584,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-213,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177588,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-214,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177590,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-214,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177594,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-215,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177597,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-215,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177602,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-216,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177605,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-216,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177609,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-217,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,0\n1590051177613,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-217,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,2,0,0\n1590051177616,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-218,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177619,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-218,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,3,0,0\n1590051177622,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-219,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177625,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-219,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177629,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-220,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177632,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-220,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177635,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-221,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177637,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-221,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177641,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-222,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177644,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-222,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177648,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-223,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177651,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-223,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177654,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-224,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,0\n1590051177658,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-224,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177661,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-225,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177665,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-225,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177668,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-226,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177672,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-226,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177675,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-227,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177678,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-227,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177681,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-228,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177684,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-228,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177688,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-229,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177691,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-229,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177695,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-230,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177697,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-230,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177701,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-231,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177704,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-231,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177708,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-232,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177711,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-232,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,4,0,0\n1590051177714,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-233,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,0\n1590051177718,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-233,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177721,9,Fetch Specific Library,200,OK,Fetch Specific Library 1-234,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,9,0,0\n1590051177728,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-235,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,4,0,0\n1590051177731,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-234,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,2,0,0\n1590051177732,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-235,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,3,0,0\n1590051177734,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-236,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,5,0,0\n1590051177739,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-236,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,2,0,0\n1590051177740,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-237,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177743,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-237,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177746,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-238,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177750,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-238,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177753,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-239,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177756,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-239,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177759,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-240,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177762,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-240,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177765,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-241,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177769,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-241,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,3,0,0\n1590051177772,10,Fetch Specific Library,200,OK,Fetch Specific Library 1-242,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,10,0,0\n1590051177778,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-243,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,4,0,0\n1590051177782,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-242,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,2,0,0\n1590051177782,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-243,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,3,0,0\n1590051177784,5,Fetch Specific Library,200,OK,Fetch Specific Library 1-244,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,5,0,1\n1590051177789,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-244,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,1,0,0\n1590051177791,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-245,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177794,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-245,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177797,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-246,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177800,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-246,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177803,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-247,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177806,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-247,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177809,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-248,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177813,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-248,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177816,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-249,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177819,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-249,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177822,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-250,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177826,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-250,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177828,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-251,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177831,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-251,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177835,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-252,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177838,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-252,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177841,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-253,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177844,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-253,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177848,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-254,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177851,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-254,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177854,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-255,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177857,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-255,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177860,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-256,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177865,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-256,text,true,,4816,149,2,2,http://localhost/api/components/?component_library=1,2,0,0\n1590051177866,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-257,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177869,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-257,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177873,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-258,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177877,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-258,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177880,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-259,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177883,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-259,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177886,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-260,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177890,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-260,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177892,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-261,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177895,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-261,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177898,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-262,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177902,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-262,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177905,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-263,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177908,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-263,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177911,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-264,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051177915,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-264,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177918,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-265,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177921,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-265,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177925,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-266,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177928,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-266,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177931,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-267,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177934,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-267,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177938,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-268,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177941,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-268,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177944,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-269,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177947,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-269,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177950,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-270,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051177953,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-270,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177957,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-271,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177960,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-271,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177964,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-272,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177966,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-272,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177971,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-273,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177973,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-273,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177978,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-274,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177981,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-274,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177984,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-275,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177987,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-275,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051177990,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-276,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051177993,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-276,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177997,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-277,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051177999,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-277,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178004,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-278,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051178007,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-278,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051178011,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-279,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051178014,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-279,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178018,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-280,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051178021,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-280,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178024,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-281,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051178027,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-281,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178031,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-282,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051178035,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-282,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178038,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-283,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,1\n1590051178042,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-283,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051178044,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-284,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051178047,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-284,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178050,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-285,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051178053,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-285,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051178057,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-286,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178059,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-286,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178064,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-287,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178066,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-287,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178069,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-288,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051178072,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-288,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051178075,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-289,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178077,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-289,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178080,4,Fetch Specific Library,200,OK,Fetch Specific Library 1-290,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,4,0,0\n1590051178084,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-290,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178086,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-291,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051178089,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-291,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178091,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-292,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051178094,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-292,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178097,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-293,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178099,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-293,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051178102,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-294,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178104,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-294,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178108,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-295,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178110,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-295,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178113,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-296,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051178116,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-296,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051178118,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-297,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,1\n1590051178121,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-297,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051178124,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-298,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178127,1,Fetch Specific Library,200,OK,Fetch Specific Library 1-298,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,1,0,0\n1590051178130,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-299,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051178133,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-299,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051178136,3,Fetch Specific Library,200,OK,Fetch Specific Library 1-300,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,3,0,0\n1590051178139,2,Fetch Specific Library,200,OK,Fetch Specific Library 1-300,text,true,,4816,149,1,1,http://localhost/api/components/?component_library=1,2,0,0\n1590051196371,83,Fetch All Libraries,200,OK,Fetch Library List 1-1,text,true,,1185,128,12,12,http://localhost/api/libraries/,83,0,2\n1590051196444,11,Fetch All Libraries,200,OK,Fetch Library List 1-11,text,true,,1185,128,12,12,http://localhost/api/libraries/,11,0,1\n1590051196403,53,Fetch All Libraries,200,OK,Fetch Library List 1-5,text,true,,1185,128,12,12,http://localhost/api/libraries/,53,0,1\n1590051196434,23,Fetch All Libraries,200,OK,Fetch Library List 1-10,text,true,,1185,128,12,12,http://localhost/api/libraries/,23,0,1\n1590051196393,64,Fetch All Libraries,200,OK,Fetch Library List 1-4,text,true,,1185,128,12,12,http://localhost/api/libraries/,64,0,0\n1590051196379,77,Fetch All Libraries,200,OK,Fetch Library List 1-2,text,true,,1185,128,12,12,http://localhost/api/libraries/,77,0,0\n1590051196428,30,Fetch All Libraries,200,OK,Fetch Library List 1-9,text,true,,1185,128,12,12,http://localhost/api/libraries/,30,0,0\n1590051196420,38,Fetch All Libraries,200,OK,Fetch Library List 1-8,text,true,,1185,128,12,12,http://localhost/api/libraries/,38,0,0\n1590051196417,41,Fetch All Libraries,200,OK,Fetch Library List 1-7,text,true,,1185,128,12,12,http://localhost/api/libraries/,41,0,0\n1590051196386,72,Fetch All Libraries,200,OK,Fetch Library List 1-3,text,true,,1185,128,12,12,http://localhost/api/libraries/,72,0,0\n1590051196407,51,Fetch All Libraries,200,OK,Fetch Library List 1-6,text,true,,1185,128,12,12,http://localhost/api/libraries/,51,0,1\n1590051196454,4,Fetch All Libraries,200,OK,Fetch Library List 1-1,text,true,,1185,128,12,12,http://localhost/api/libraries/,4,0,0\n1590051196451,7,Fetch All Libraries,200,OK,Fetch Library List 1-12,text,true,,1185,128,12,12,http://localhost/api/libraries/,7,0,0\n1590051196458,2,Fetch All Libraries,200,OK,Fetch Library List 1-7,text,true,,1185,128,12,12,http://localhost/api/libraries/,2,0,0\n1590051196458,2,Fetch All Libraries,200,OK,Fetch Library List 1-12,text,true,,1185,128,12,12,http://localhost/api/libraries/,2,0,0\n1590051196458,3,Fetch All Libraries,200,OK,Fetch Library List 1-9,text,true,,1185,128,10,10,http://localhost/api/libraries/,3,0,0\n1590051196458,3,Fetch All Libraries,200,OK,Fetch Library List 1-5,text,true,,1185,128,10,10,http://localhost/api/libraries/,3,0,0\n1590051196458,4,Fetch All Libraries,200,OK,Fetch Library List 1-10,text,true,,1185,128,8,8,http://localhost/api/libraries/,4,0,0\n1590051196458,4,Fetch All Libraries,200,OK,Fetch Library List 1-4,text,true,,1185,128,8,8,http://localhost/api/libraries/,4,0,0\n1590051196458,4,Fetch All Libraries,200,OK,Fetch Library List 1-3,text,true,,1185,128,8,8,http://localhost/api/libraries/,4,0,0\n1590051196458,4,Fetch All Libraries,200,OK,Fetch Library List 1-11,text,true,,1185,128,8,8,http://localhost/api/libraries/,4,0,0\n1590051196458,4,Fetch All Libraries,200,OK,Fetch Library List 1-6,text,true,,1185,128,8,8,http://localhost/api/libraries/,4,0,0\n1590051196458,4,Fetch All Libraries,200,OK,Fetch Library List 1-8,text,true,,1185,128,8,8,http://localhost/api/libraries/,4,0,0\n1590051196458,4,Fetch All Libraries,200,OK,Fetch Library List 1-2,text,true,,1185,128,7,7,http://localhost/api/libraries/,4,0,0\n1590051196459,6,Fetch All Libraries,200,OK,Fetch Library List 1-13,text,true,,1185,128,2,2,http://localhost/api/libraries/,6,0,1\n1590051196465,3,Fetch All Libraries,200,OK,Fetch Library List 1-13,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051196463,5,Fetch All Libraries,200,OK,Fetch Library List 1-14,text,true,,1185,128,2,2,http://localhost/api/libraries/,5,0,1\n1590051196468,2,Fetch All Libraries,200,OK,Fetch Library List 1-14,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051196469,3,Fetch All Libraries,200,OK,Fetch Library List 1-15,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051196472,2,Fetch All Libraries,200,OK,Fetch Library List 1-15,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196478,4,Fetch All Libraries,200,OK,Fetch Library List 1-16,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,1\n1590051196482,2,Fetch All Libraries,200,OK,Fetch Library List 1-16,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196485,2,Fetch All Libraries,200,OK,Fetch Library List 1-17,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196488,1,Fetch All Libraries,200,OK,Fetch Library List 1-17,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196491,2,Fetch All Libraries,200,OK,Fetch Library List 1-18,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196493,2,Fetch All Libraries,200,OK,Fetch Library List 1-18,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196501,3,Fetch All Libraries,200,OK,Fetch Library List 1-19,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196504,1,Fetch All Libraries,200,OK,Fetch Library List 1-19,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196509,3,Fetch All Libraries,200,OK,Fetch Library List 1-20,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051196512,1,Fetch All Libraries,200,OK,Fetch Library List 1-20,text,true,,1185,128,2,2,http://localhost/api/libraries/,1,0,0\n1590051196511,3,Fetch All Libraries,200,OK,Fetch Library List 1-21,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196514,2,Fetch All Libraries,200,OK,Fetch Library List 1-21,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196521,3,Fetch All Libraries,200,OK,Fetch Library List 1-22,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051196524,2,Fetch All Libraries,200,OK,Fetch Library List 1-22,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196528,2,Fetch All Libraries,200,OK,Fetch Library List 1-23,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196530,1,Fetch All Libraries,200,OK,Fetch Library List 1-23,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196533,2,Fetch All Libraries,200,OK,Fetch Library List 1-24,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196535,1,Fetch All Libraries,200,OK,Fetch Library List 1-24,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196541,3,Fetch All Libraries,200,OK,Fetch Library List 1-25,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196544,2,Fetch All Libraries,200,OK,Fetch Library List 1-25,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196547,2,Fetch All Libraries,200,OK,Fetch Library List 1-26,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196549,2,Fetch All Libraries,200,OK,Fetch Library List 1-26,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196559,2,Fetch All Libraries,200,OK,Fetch Library List 1-27,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196561,2,Fetch All Libraries,200,OK,Fetch Library List 1-27,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051196563,2,Fetch All Libraries,200,OK,Fetch Library List 1-28,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196565,2,Fetch All Libraries,200,OK,Fetch Library List 1-28,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196567,3,Fetch All Libraries,200,OK,Fetch Library List 1-29,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196570,2,Fetch All Libraries,200,OK,Fetch Library List 1-29,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196579,3,Fetch All Libraries,200,OK,Fetch Library List 1-30,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051196582,2,Fetch All Libraries,200,OK,Fetch Library List 1-30,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196585,2,Fetch All Libraries,200,OK,Fetch Library List 1-31,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196587,2,Fetch All Libraries,200,OK,Fetch Library List 1-31,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196590,2,Fetch All Libraries,200,OK,Fetch Library List 1-32,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,1\n1590051196592,2,Fetch All Libraries,200,OK,Fetch Library List 1-32,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196595,3,Fetch All Libraries,200,OK,Fetch Library List 1-33,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196598,2,Fetch All Libraries,200,OK,Fetch Library List 1-33,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196606,3,Fetch All Libraries,200,OK,Fetch Library List 1-34,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196609,1,Fetch All Libraries,200,OK,Fetch Library List 1-34,text,true,,1185,128,2,2,http://localhost/api/libraries/,1,0,0\n1590051196610,3,Fetch All Libraries,200,OK,Fetch Library List 1-35,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196613,2,Fetch All Libraries,200,OK,Fetch Library List 1-35,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196616,2,Fetch All Libraries,200,OK,Fetch Library List 1-36,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196618,1,Fetch All Libraries,200,OK,Fetch Library List 1-36,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196628,2,Fetch All Libraries,200,OK,Fetch Library List 1-37,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196630,2,Fetch All Libraries,200,OK,Fetch Library List 1-37,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196634,3,Fetch All Libraries,200,OK,Fetch Library List 1-38,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196637,2,Fetch All Libraries,200,OK,Fetch Library List 1-38,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051196638,3,Fetch All Libraries,200,OK,Fetch Library List 1-39,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196641,2,Fetch All Libraries,200,OK,Fetch Library List 1-39,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196649,3,Fetch All Libraries,200,OK,Fetch Library List 1-40,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051196652,2,Fetch All Libraries,200,OK,Fetch Library List 1-40,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051196652,3,Fetch All Libraries,200,OK,Fetch Library List 1-41,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051196655,2,Fetch All Libraries,200,OK,Fetch Library List 1-41,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196661,2,Fetch All Libraries,200,OK,Fetch Library List 1-42,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196664,2,Fetch All Libraries,200,OK,Fetch Library List 1-42,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196666,4,Fetch All Libraries,200,OK,Fetch Library List 1-43,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,1\n1590051196670,2,Fetch All Libraries,200,OK,Fetch Library List 1-43,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196678,3,Fetch All Libraries,200,OK,Fetch Library List 1-44,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051196681,2,Fetch All Libraries,200,OK,Fetch Library List 1-44,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051196680,4,Fetch All Libraries,200,OK,Fetch Library List 1-45,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,1\n1590051196684,3,Fetch All Libraries,200,OK,Fetch Library List 1-45,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051196687,4,Fetch All Libraries,200,OK,Fetch Library List 1-46,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,0\n1590051196691,2,Fetch All Libraries,200,OK,Fetch Library List 1-46,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196694,3,Fetch All Libraries,200,OK,Fetch Library List 1-47,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051196697,2,Fetch All Libraries,200,OK,Fetch Library List 1-47,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196702,2,Fetch All Libraries,200,OK,Fetch Library List 1-48,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196704,1,Fetch All Libraries,200,OK,Fetch Library List 1-48,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196710,3,Fetch All Libraries,200,OK,Fetch Library List 1-49,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196713,2,Fetch All Libraries,200,OK,Fetch Library List 1-49,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196718,3,Fetch All Libraries,200,OK,Fetch Library List 1-50,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196721,2,Fetch All Libraries,200,OK,Fetch Library List 1-50,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051196721,3,Fetch All Libraries,200,OK,Fetch Library List 1-51,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051196724,2,Fetch All Libraries,200,OK,Fetch Library List 1-51,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196729,2,Fetch All Libraries,200,OK,Fetch Library List 1-52,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196731,2,Fetch All Libraries,200,OK,Fetch Library List 1-52,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196736,2,Fetch All Libraries,200,OK,Fetch Library List 1-53,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196738,2,Fetch All Libraries,200,OK,Fetch Library List 1-53,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196747,2,Fetch All Libraries,200,OK,Fetch Library List 1-54,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196749,1,Fetch All Libraries,200,OK,Fetch Library List 1-54,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196753,2,Fetch All Libraries,200,OK,Fetch Library List 1-55,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196755,1,Fetch All Libraries,200,OK,Fetch Library List 1-55,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196761,2,Fetch All Libraries,200,OK,Fetch Library List 1-56,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196763,2,Fetch All Libraries,200,OK,Fetch Library List 1-56,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051196765,2,Fetch All Libraries,200,OK,Fetch Library List 1-57,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196767,1,Fetch All Libraries,200,OK,Fetch Library List 1-57,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196773,2,Fetch All Libraries,200,OK,Fetch Library List 1-58,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196775,1,Fetch All Libraries,200,OK,Fetch Library List 1-58,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196782,2,Fetch All Libraries,200,OK,Fetch Library List 1-59,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196784,2,Fetch All Libraries,200,OK,Fetch Library List 1-59,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051196785,3,Fetch All Libraries,200,OK,Fetch Library List 1-60,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051196788,2,Fetch All Libraries,200,OK,Fetch Library List 1-60,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196792,2,Fetch All Libraries,200,OK,Fetch Library List 1-61,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196794,1,Fetch All Libraries,200,OK,Fetch Library List 1-61,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196801,2,Fetch All Libraries,200,OK,Fetch Library List 1-62,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196803,2,Fetch All Libraries,200,OK,Fetch Library List 1-62,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196809,2,Fetch All Libraries,200,OK,Fetch Library List 1-63,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196811,2,Fetch All Libraries,200,OK,Fetch Library List 1-63,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196815,2,Fetch All Libraries,200,OK,Fetch Library List 1-64,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196818,1,Fetch All Libraries,200,OK,Fetch Library List 1-64,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196820,2,Fetch All Libraries,200,OK,Fetch Library List 1-65,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196822,2,Fetch All Libraries,200,OK,Fetch Library List 1-65,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196829,2,Fetch All Libraries,200,OK,Fetch Library List 1-66,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196831,1,Fetch All Libraries,200,OK,Fetch Library List 1-66,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196837,2,Fetch All Libraries,200,OK,Fetch Library List 1-67,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196839,1,Fetch All Libraries,200,OK,Fetch Library List 1-67,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196842,3,Fetch All Libraries,200,OK,Fetch Library List 1-68,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051196845,1,Fetch All Libraries,200,OK,Fetch Library List 1-68,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196852,2,Fetch All Libraries,200,OK,Fetch Library List 1-69,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196854,2,Fetch All Libraries,200,OK,Fetch Library List 1-69,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196859,2,Fetch All Libraries,200,OK,Fetch Library List 1-70,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196861,2,Fetch All Libraries,200,OK,Fetch Library List 1-70,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051196862,3,Fetch All Libraries,200,OK,Fetch Library List 1-71,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051196865,2,Fetch All Libraries,200,OK,Fetch Library List 1-71,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196873,2,Fetch All Libraries,200,OK,Fetch Library List 1-72,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196875,2,Fetch All Libraries,200,OK,Fetch Library List 1-72,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196878,3,Fetch All Libraries,200,OK,Fetch Library List 1-73,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051196881,2,Fetch All Libraries,200,OK,Fetch Library List 1-73,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051196883,6,Fetch All Libraries,200,OK,Fetch Library List 1-74,text,true,,1185,128,1,1,http://localhost/api/libraries/,6,0,0\n1590051196889,2,Fetch All Libraries,200,OK,Fetch Library List 1-74,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196893,4,Fetch All Libraries,200,OK,Fetch Library List 1-75,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,1\n1590051196897,3,Fetch All Libraries,200,OK,Fetch Library List 1-75,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051196902,3,Fetch All Libraries,200,OK,Fetch Library List 1-76,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196905,2,Fetch All Libraries,200,OK,Fetch Library List 1-76,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196908,3,Fetch All Libraries,200,OK,Fetch Library List 1-77,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051196911,2,Fetch All Libraries,200,OK,Fetch Library List 1-77,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196915,3,Fetch All Libraries,200,OK,Fetch Library List 1-78,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196918,2,Fetch All Libraries,200,OK,Fetch Library List 1-78,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196922,2,Fetch All Libraries,200,OK,Fetch Library List 1-79,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196924,2,Fetch All Libraries,200,OK,Fetch Library List 1-79,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196928,3,Fetch All Libraries,200,OK,Fetch Library List 1-80,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196931,1,Fetch All Libraries,200,OK,Fetch Library List 1-80,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196936,2,Fetch All Libraries,200,OK,Fetch Library List 1-81,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196938,1,Fetch All Libraries,200,OK,Fetch Library List 1-81,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196943,2,Fetch All Libraries,200,OK,Fetch Library List 1-82,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196945,1,Fetch All Libraries,200,OK,Fetch Library List 1-82,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196949,3,Fetch All Libraries,200,OK,Fetch Library List 1-83,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196952,1,Fetch All Libraries,200,OK,Fetch Library List 1-83,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196956,2,Fetch All Libraries,200,OK,Fetch Library List 1-84,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,1\n1590051196959,1,Fetch All Libraries,200,OK,Fetch Library List 1-84,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196964,2,Fetch All Libraries,200,OK,Fetch Library List 1-85,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196966,1,Fetch All Libraries,200,OK,Fetch Library List 1-85,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196971,2,Fetch All Libraries,200,OK,Fetch Library List 1-86,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196973,1,Fetch All Libraries,200,OK,Fetch Library List 1-86,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196978,2,Fetch All Libraries,200,OK,Fetch Library List 1-87,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051196980,1,Fetch All Libraries,200,OK,Fetch Library List 1-87,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196984,3,Fetch All Libraries,200,OK,Fetch Library List 1-88,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196987,1,Fetch All Libraries,200,OK,Fetch Library List 1-88,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051196991,3,Fetch All Libraries,200,OK,Fetch Library List 1-89,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051196994,1,Fetch All Libraries,200,OK,Fetch Library List 1-89,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197001,2,Fetch All Libraries,200,OK,Fetch Library List 1-90,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197003,1,Fetch All Libraries,200,OK,Fetch Library List 1-90,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197007,2,Fetch All Libraries,200,OK,Fetch Library List 1-91,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197009,2,Fetch All Libraries,200,OK,Fetch Library List 1-91,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197012,3,Fetch All Libraries,200,OK,Fetch Library List 1-92,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197015,2,Fetch All Libraries,200,OK,Fetch Library List 1-92,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197021,2,Fetch All Libraries,200,OK,Fetch Library List 1-93,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197024,1,Fetch All Libraries,200,OK,Fetch Library List 1-93,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197028,2,Fetch All Libraries,200,OK,Fetch Library List 1-94,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197030,2,Fetch All Libraries,200,OK,Fetch Library List 1-94,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197031,3,Fetch All Libraries,200,OK,Fetch Library List 1-95,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197034,2,Fetch All Libraries,200,OK,Fetch Library List 1-95,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197041,3,Fetch All Libraries,200,OK,Fetch Library List 1-96,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197044,1,Fetch All Libraries,200,OK,Fetch Library List 1-96,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197047,2,Fetch All Libraries,200,OK,Fetch Library List 1-97,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197050,1,Fetch All Libraries,200,OK,Fetch Library List 1-97,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197059,3,Fetch All Libraries,200,OK,Fetch Library List 1-98,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051197060,4,Fetch All Libraries,200,OK,Fetch Library List 1-99,text,true,,1185,128,2,2,http://localhost/api/libraries/,4,0,1\n1590051197062,2,Fetch All Libraries,200,OK,Fetch Library List 1-98,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197064,2,Fetch All Libraries,200,OK,Fetch Library List 1-99,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197067,2,Fetch All Libraries,200,OK,Fetch Library List 1-100,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197069,2,Fetch All Libraries,200,OK,Fetch Library List 1-100,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197072,2,Fetch All Libraries,200,OK,Fetch Library List 1-101,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,1\n1590051197074,2,Fetch All Libraries,200,OK,Fetch Library List 1-101,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197082,3,Fetch All Libraries,200,OK,Fetch Library List 1-102,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197085,1,Fetch All Libraries,200,OK,Fetch Library List 1-102,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197089,2,Fetch All Libraries,200,OK,Fetch Library List 1-103,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197091,1,Fetch All Libraries,200,OK,Fetch Library List 1-103,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197096,2,Fetch All Libraries,200,OK,Fetch Library List 1-104,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197098,2,Fetch All Libraries,200,OK,Fetch Library List 1-104,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197099,3,Fetch All Libraries,200,OK,Fetch Library List 1-105,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197102,1,Fetch All Libraries,200,OK,Fetch Library List 1-105,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197110,3,Fetch All Libraries,200,OK,Fetch Library List 1-106,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197114,1,Fetch All Libraries,200,OK,Fetch Library List 1-106,text,true,,1185,128,2,2,http://localhost/api/libraries/,1,0,0\n1590051197115,3,Fetch All Libraries,200,OK,Fetch Library List 1-107,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197118,1,Fetch All Libraries,200,OK,Fetch Library List 1-107,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197124,2,Fetch All Libraries,200,OK,Fetch Library List 1-108,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197126,2,Fetch All Libraries,200,OK,Fetch Library List 1-108,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197128,2,Fetch All Libraries,200,OK,Fetch Library List 1-109,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,1\n1590051197131,1,Fetch All Libraries,200,OK,Fetch Library List 1-109,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197138,3,Fetch All Libraries,200,OK,Fetch Library List 1-110,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197141,2,Fetch All Libraries,200,OK,Fetch Library List 1-110,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197142,3,Fetch All Libraries,200,OK,Fetch Library List 1-111,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197145,1,Fetch All Libraries,200,OK,Fetch Library List 1-111,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197153,3,Fetch All Libraries,200,OK,Fetch Library List 1-112,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197156,1,Fetch All Libraries,200,OK,Fetch Library List 1-112,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197160,2,Fetch All Libraries,200,OK,Fetch Library List 1-113,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,1\n1590051197163,1,Fetch All Libraries,200,OK,Fetch Library List 1-113,text,true,,1185,128,2,2,http://localhost/api/libraries/,1,0,0\n1590051197163,2,Fetch All Libraries,200,OK,Fetch Library List 1-114,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197165,2,Fetch All Libraries,200,OK,Fetch Library List 1-114,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197170,3,Fetch All Libraries,200,OK,Fetch Library List 1-115,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197173,1,Fetch All Libraries,200,OK,Fetch Library List 1-115,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197180,3,Fetch All Libraries,200,OK,Fetch Library List 1-116,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197183,2,Fetch All Libraries,200,OK,Fetch Library List 1-116,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197184,3,Fetch All Libraries,200,OK,Fetch Library List 1-117,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197187,2,Fetch All Libraries,200,OK,Fetch Library List 1-117,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197191,2,Fetch All Libraries,200,OK,Fetch Library List 1-118,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197193,2,Fetch All Libraries,200,OK,Fetch Library List 1-118,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197199,4,Fetch All Libraries,200,OK,Fetch Library List 1-119,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,1\n1590051197203,1,Fetch All Libraries,200,OK,Fetch Library List 1-119,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197208,2,Fetch All Libraries,200,OK,Fetch Library List 1-120,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197210,3,Fetch All Libraries,200,OK,Fetch Library List 1-120,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051197213,3,Fetch All Libraries,200,OK,Fetch Library List 1-121,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197216,1,Fetch All Libraries,200,OK,Fetch Library List 1-121,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197219,2,Fetch All Libraries,200,OK,Fetch Library List 1-122,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197221,2,Fetch All Libraries,200,OK,Fetch Library List 1-122,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197229,3,Fetch All Libraries,200,OK,Fetch Library List 1-123,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197233,1,Fetch All Libraries,200,OK,Fetch Library List 1-123,text,true,,1185,128,2,2,http://localhost/api/libraries/,1,0,0\n1590051197233,3,Fetch All Libraries,200,OK,Fetch Library List 1-124,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197236,1,Fetch All Libraries,200,OK,Fetch Library List 1-124,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197243,2,Fetch All Libraries,200,OK,Fetch Library List 1-125,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197246,1,Fetch All Libraries,200,OK,Fetch Library List 1-125,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197251,3,Fetch All Libraries,200,OK,Fetch Library List 1-126,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197254,2,Fetch All Libraries,200,OK,Fetch Library List 1-126,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197259,2,Fetch All Libraries,200,OK,Fetch Library List 1-127,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197262,1,Fetch All Libraries,200,OK,Fetch Library List 1-127,text,true,,1185,128,2,2,http://localhost/api/libraries/,1,0,0\n1590051197263,3,Fetch All Libraries,200,OK,Fetch Library List 1-128,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197266,1,Fetch All Libraries,200,OK,Fetch Library List 1-128,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197271,3,Fetch All Libraries,200,OK,Fetch Library List 1-129,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197274,1,Fetch All Libraries,200,OK,Fetch Library List 1-129,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197279,2,Fetch All Libraries,200,OK,Fetch Library List 1-130,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197281,2,Fetch All Libraries,200,OK,Fetch Library List 1-130,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197285,2,Fetch All Libraries,200,OK,Fetch Library List 1-131,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197287,2,Fetch All Libraries,200,OK,Fetch Library List 1-131,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197293,3,Fetch All Libraries,200,OK,Fetch Library List 1-132,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051197296,2,Fetch All Libraries,200,OK,Fetch Library List 1-132,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197296,2,Fetch All Libraries,200,OK,Fetch Library List 1-133,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197298,2,Fetch All Libraries,200,OK,Fetch Library List 1-133,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197306,3,Fetch All Libraries,200,OK,Fetch Library List 1-134,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197309,1,Fetch All Libraries,200,OK,Fetch Library List 1-134,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197313,3,Fetch All Libraries,200,OK,Fetch Library List 1-135,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197316,2,Fetch All Libraries,200,OK,Fetch Library List 1-135,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197321,3,Fetch All Libraries,200,OK,Fetch Library List 1-136,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197324,1,Fetch All Libraries,200,OK,Fetch Library List 1-136,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197328,2,Fetch All Libraries,200,OK,Fetch Library List 1-137,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197330,1,Fetch All Libraries,200,OK,Fetch Library List 1-137,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197334,2,Fetch All Libraries,200,OK,Fetch Library List 1-138,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197336,2,Fetch All Libraries,200,OK,Fetch Library List 1-138,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197338,2,Fetch All Libraries,200,OK,Fetch Library List 1-139,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197340,1,Fetch All Libraries,200,OK,Fetch Library List 1-139,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197345,2,Fetch All Libraries,200,OK,Fetch Library List 1-140,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197347,1,Fetch All Libraries,200,OK,Fetch Library List 1-140,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197354,3,Fetch All Libraries,200,OK,Fetch Library List 1-141,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197357,1,Fetch All Libraries,200,OK,Fetch Library List 1-141,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197362,3,Fetch All Libraries,200,OK,Fetch Library List 1-142,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197365,2,Fetch All Libraries,200,OK,Fetch Library List 1-142,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197365,4,Fetch All Libraries,200,OK,Fetch Library List 1-143,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,1\n1590051197369,1,Fetch All Libraries,200,OK,Fetch Library List 1-143,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197376,3,Fetch All Libraries,200,OK,Fetch Library List 1-144,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197379,3,Fetch All Libraries,200,OK,Fetch Library List 1-144,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051197380,3,Fetch All Libraries,200,OK,Fetch Library List 1-145,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197383,2,Fetch All Libraries,200,OK,Fetch Library List 1-145,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197387,4,Fetch All Libraries,200,OK,Fetch Library List 1-146,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,1\n1590051197391,3,Fetch All Libraries,200,OK,Fetch Library List 1-146,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051197394,4,Fetch All Libraries,200,OK,Fetch Library List 1-147,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,0\n1590051197398,3,Fetch All Libraries,200,OK,Fetch Library List 1-147,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197402,3,Fetch All Libraries,200,OK,Fetch Library List 1-148,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197405,4,Fetch All Libraries,200,OK,Fetch Library List 1-148,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,0\n1590051197412,2,Fetch All Libraries,200,OK,Fetch Library List 1-149,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197414,1,Fetch All Libraries,200,OK,Fetch Library List 1-149,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197416,2,Fetch All Libraries,200,OK,Fetch Library List 1-150,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197418,2,Fetch All Libraries,200,OK,Fetch Library List 1-150,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197426,2,Fetch All Libraries,200,OK,Fetch Library List 1-151,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197428,2,Fetch All Libraries,200,OK,Fetch Library List 1-151,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197428,3,Fetch All Libraries,200,OK,Fetch Library List 1-152,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197431,2,Fetch All Libraries,200,OK,Fetch Library List 1-152,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197437,3,Fetch All Libraries,200,OK,Fetch Library List 1-153,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197440,1,Fetch All Libraries,200,OK,Fetch Library List 1-153,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197443,5,Fetch All Libraries,200,OK,Fetch Library List 1-154,text,true,,1185,128,1,1,http://localhost/api/libraries/,5,0,1\n1590051197448,4,Fetch All Libraries,200,OK,Fetch Library List 1-154,text,true,,1185,128,2,2,http://localhost/api/libraries/,4,0,0\n1590051197449,4,Fetch All Libraries,200,OK,Fetch Library List 1-155,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,0\n1590051197453,1,Fetch All Libraries,200,OK,Fetch Library List 1-155,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197459,3,Fetch All Libraries,200,OK,Fetch Library List 1-156,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197462,2,Fetch All Libraries,200,OK,Fetch Library List 1-156,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197467,3,Fetch All Libraries,200,OK,Fetch Library List 1-157,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197470,2,Fetch All Libraries,200,OK,Fetch Library List 1-157,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197475,3,Fetch All Libraries,200,OK,Fetch Library List 1-158,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197478,2,Fetch All Libraries,200,OK,Fetch Library List 1-158,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197481,3,Fetch All Libraries,200,OK,Fetch Library List 1-159,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197484,1,Fetch All Libraries,200,OK,Fetch Library List 1-159,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197487,2,Fetch All Libraries,200,OK,Fetch Library List 1-160,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197489,2,Fetch All Libraries,200,OK,Fetch Library List 1-160,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197491,2,Fetch All Libraries,200,OK,Fetch Library List 1-161,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197493,2,Fetch All Libraries,200,OK,Fetch Library List 1-161,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197502,3,Fetch All Libraries,200,OK,Fetch Library List 1-162,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197505,1,Fetch All Libraries,200,OK,Fetch Library List 1-162,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197509,3,Fetch All Libraries,200,OK,Fetch Library List 1-163,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197512,1,Fetch All Libraries,200,OK,Fetch Library List 1-163,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197515,2,Fetch All Libraries,200,OK,Fetch Library List 1-164,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,1\n1590051197517,2,Fetch All Libraries,200,OK,Fetch Library List 1-164,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197523,3,Fetch All Libraries,200,OK,Fetch Library List 1-165,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197526,1,Fetch All Libraries,200,OK,Fetch Library List 1-165,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197529,3,Fetch All Libraries,200,OK,Fetch Library List 1-166,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197532,2,Fetch All Libraries,200,OK,Fetch Library List 1-166,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197539,3,Fetch All Libraries,200,OK,Fetch Library List 1-167,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197542,1,Fetch All Libraries,200,OK,Fetch Library List 1-167,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197545,3,Fetch All Libraries,200,OK,Fetch Library List 1-168,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197548,2,Fetch All Libraries,200,OK,Fetch Library List 1-168,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197551,3,Fetch All Libraries,200,OK,Fetch Library List 1-169,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197554,2,Fetch All Libraries,200,OK,Fetch Library List 1-169,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197559,3,Fetch All Libraries,200,OK,Fetch Library List 1-170,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197562,2,Fetch All Libraries,200,OK,Fetch Library List 1-170,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197565,2,Fetch All Libraries,200,OK,Fetch Library List 1-171,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197567,1,Fetch All Libraries,200,OK,Fetch Library List 1-171,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197572,2,Fetch All Libraries,200,OK,Fetch Library List 1-172,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197575,1,Fetch All Libraries,200,OK,Fetch Library List 1-172,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197579,3,Fetch All Libraries,200,OK,Fetch Library List 1-173,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197582,1,Fetch All Libraries,200,OK,Fetch Library List 1-173,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197585,3,Fetch All Libraries,200,OK,Fetch Library List 1-174,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197588,2,Fetch All Libraries,200,OK,Fetch Library List 1-174,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197593,2,Fetch All Libraries,200,OK,Fetch Library List 1-175,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197595,2,Fetch All Libraries,200,OK,Fetch Library List 1-175,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197601,2,Fetch All Libraries,200,OK,Fetch Library List 1-176,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197603,2,Fetch All Libraries,200,OK,Fetch Library List 1-176,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197609,2,Fetch All Libraries,200,OK,Fetch Library List 1-177,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197611,2,Fetch All Libraries,200,OK,Fetch Library List 1-177,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197611,3,Fetch All Libraries,200,OK,Fetch Library List 1-178,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197614,1,Fetch All Libraries,200,OK,Fetch Library List 1-178,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197617,2,Fetch All Libraries,200,OK,Fetch Library List 1-179,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197619,2,Fetch All Libraries,200,OK,Fetch Library List 1-179,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197628,4,Fetch All Libraries,200,OK,Fetch Library List 1-180,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,0\n1590051197632,2,Fetch All Libraries,200,OK,Fetch Library List 1-180,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197635,5,Fetch All Libraries,200,OK,Fetch Library List 1-181,text,true,,1185,128,2,2,http://localhost/api/libraries/,5,0,0\n1590051197638,3,Fetch All Libraries,200,OK,Fetch Library List 1-182,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051197640,1,Fetch All Libraries,200,OK,Fetch Library List 1-181,text,true,,1185,128,2,2,http://localhost/api/libraries/,1,0,0\n1590051197641,2,Fetch All Libraries,200,OK,Fetch Library List 1-182,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197645,3,Fetch All Libraries,200,OK,Fetch Library List 1-183,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197648,2,Fetch All Libraries,200,OK,Fetch Library List 1-183,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197654,2,Fetch All Libraries,200,OK,Fetch Library List 1-184,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197657,1,Fetch All Libraries,200,OK,Fetch Library List 1-184,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197662,3,Fetch All Libraries,200,OK,Fetch Library List 1-185,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197665,2,Fetch All Libraries,200,OK,Fetch Library List 1-185,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197669,3,Fetch All Libraries,200,OK,Fetch Library List 1-186,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197672,1,Fetch All Libraries,200,OK,Fetch Library List 1-186,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197678,2,Fetch All Libraries,200,OK,Fetch Library List 1-187,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197680,2,Fetch All Libraries,200,OK,Fetch Library List 1-187,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197681,3,Fetch All Libraries,200,OK,Fetch Library List 1-188,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197684,2,Fetch All Libraries,200,OK,Fetch Library List 1-188,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197687,3,Fetch All Libraries,200,OK,Fetch Library List 1-189,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197690,1,Fetch All Libraries,200,OK,Fetch Library List 1-189,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197694,4,Fetch All Libraries,200,OK,Fetch Library List 1-190,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,0\n1590051197698,2,Fetch All Libraries,200,OK,Fetch Library List 1-190,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197701,9,Fetch All Libraries,200,OK,Fetch Library List 1-191,text,true,,1185,128,2,2,http://localhost/api/libraries/,9,0,0\n1590051197710,26,Fetch All Libraries,200,OK,Fetch Library List 1-191,text,true,,1185,128,5,5,http://localhost/api/libraries/,26,0,0\n1590051197730,8,Fetch All Libraries,200,OK,Fetch Library List 1-195,text,true,,1185,128,5,5,http://localhost/api/libraries/,8,0,0\n1590051197709,29,Fetch All Libraries,200,OK,Fetch Library List 1-192,text,true,,1185,128,5,5,http://localhost/api/libraries/,29,0,1\n1590051197723,15,Fetch All Libraries,200,OK,Fetch Library List 1-194,text,true,,1185,128,5,5,http://localhost/api/libraries/,15,0,1\n1590051197719,19,Fetch All Libraries,200,OK,Fetch Library List 1-193,text,true,,1185,128,5,5,http://localhost/api/libraries/,19,0,2\n1590051197738,2,Fetch All Libraries,200,OK,Fetch Library List 1-195,text,true,,1185,128,5,5,http://localhost/api/libraries/,2,0,0\n1590051197738,3,Fetch All Libraries,200,OK,Fetch Library List 1-192,text,true,,1185,128,4,4,http://localhost/api/libraries/,3,0,0\n1590051197738,3,Fetch All Libraries,200,OK,Fetch Library List 1-194,text,true,,1185,128,4,4,http://localhost/api/libraries/,3,0,0\n1590051197738,4,Fetch All Libraries,200,OK,Fetch Library List 1-193,text,true,,1185,128,2,2,http://localhost/api/libraries/,4,0,0\n1590051197737,6,Fetch All Libraries,200,OK,Fetch Library List 1-196,text,true,,1185,128,2,2,http://localhost/api/libraries/,6,0,1\n1590051197743,5,Fetch All Libraries,200,OK,Fetch Library List 1-197,text,true,,1185,128,2,2,http://localhost/api/libraries/,5,0,0\n1590051197743,5,Fetch All Libraries,200,OK,Fetch Library List 1-196,text,true,,1185,128,2,2,http://localhost/api/libraries/,5,0,0\n1590051197748,2,Fetch All Libraries,200,OK,Fetch Library List 1-197,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197754,5,Fetch All Libraries,200,OK,Fetch Library List 1-198,text,true,,1185,128,1,1,http://localhost/api/libraries/,5,0,0\n1590051197759,2,Fetch All Libraries,200,OK,Fetch Library List 1-198,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197760,3,Fetch All Libraries,200,OK,Fetch Library List 1-199,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197763,2,Fetch All Libraries,200,OK,Fetch Library List 1-199,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197764,3,Fetch All Libraries,200,OK,Fetch Library List 1-200,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197767,4,Fetch All Libraries,200,OK,Fetch Library List 1-200,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,0\n1590051197775,3,Fetch All Libraries,200,OK,Fetch Library List 1-201,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197779,2,Fetch All Libraries,200,OK,Fetch Library List 1-201,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197780,3,Fetch All Libraries,200,OK,Fetch Library List 1-202,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197783,2,Fetch All Libraries,200,OK,Fetch Library List 1-202,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197786,3,Fetch All Libraries,200,OK,Fetch Library List 1-203,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197790,2,Fetch All Libraries,200,OK,Fetch Library List 1-203,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197794,4,Fetch All Libraries,200,OK,Fetch Library List 1-204,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,1\n1590051197798,2,Fetch All Libraries,200,OK,Fetch Library List 1-204,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197803,3,Fetch All Libraries,200,OK,Fetch Library List 1-205,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197806,1,Fetch All Libraries,200,OK,Fetch Library List 1-205,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197809,5,Fetch All Libraries,200,OK,Fetch Library List 1-206,text,true,,1185,128,1,1,http://localhost/api/libraries/,5,0,0\n1590051197814,3,Fetch All Libraries,200,OK,Fetch Library List 1-206,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051197815,4,Fetch All Libraries,200,OK,Fetch Library List 1-207,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,0\n1590051197819,1,Fetch All Libraries,200,OK,Fetch Library List 1-207,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197821,3,Fetch All Libraries,200,OK,Fetch Library List 1-208,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197824,2,Fetch All Libraries,200,OK,Fetch Library List 1-208,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197829,3,Fetch All Libraries,200,OK,Fetch Library List 1-209,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197832,1,Fetch All Libraries,200,OK,Fetch Library List 1-209,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197835,2,Fetch All Libraries,200,OK,Fetch Library List 1-210,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197837,1,Fetch All Libraries,200,OK,Fetch Library List 1-210,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197845,2,Fetch All Libraries,200,OK,Fetch Library List 1-211,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197848,1,Fetch All Libraries,200,OK,Fetch Library List 1-211,text,true,,1185,128,2,2,http://localhost/api/libraries/,1,0,0\n1590051197848,3,Fetch All Libraries,200,OK,Fetch Library List 1-212,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197851,1,Fetch All Libraries,200,OK,Fetch Library List 1-212,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197859,2,Fetch All Libraries,200,OK,Fetch Library List 1-213,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197861,2,Fetch All Libraries,200,OK,Fetch Library List 1-213,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197863,2,Fetch All Libraries,200,OK,Fetch Library List 1-214,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197865,1,Fetch All Libraries,200,OK,Fetch Library List 1-214,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197869,3,Fetch All Libraries,200,OK,Fetch Library List 1-215,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197872,1,Fetch All Libraries,200,OK,Fetch Library List 1-215,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197879,3,Fetch All Libraries,200,OK,Fetch Library List 1-216,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197882,1,Fetch All Libraries,200,OK,Fetch Library List 1-216,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197884,4,Fetch All Libraries,200,OK,Fetch Library List 1-217,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,0\n1590051197888,2,Fetch All Libraries,200,OK,Fetch Library List 1-217,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197890,3,Fetch All Libraries,200,OK,Fetch Library List 1-218,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197893,2,Fetch All Libraries,200,OK,Fetch Library List 1-218,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197897,4,Fetch All Libraries,200,OK,Fetch Library List 1-219,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,1\n1590051197901,2,Fetch All Libraries,200,OK,Fetch Library List 1-219,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197909,3,Fetch All Libraries,200,OK,Fetch Library List 1-220,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197912,2,Fetch All Libraries,200,OK,Fetch Library List 1-220,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197912,3,Fetch All Libraries,200,OK,Fetch Library List 1-221,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051197915,1,Fetch All Libraries,200,OK,Fetch Library List 1-221,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197919,2,Fetch All Libraries,200,OK,Fetch Library List 1-222,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197921,1,Fetch All Libraries,200,OK,Fetch Library List 1-222,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197928,2,Fetch All Libraries,200,OK,Fetch Library List 1-223,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197930,1,Fetch All Libraries,200,OK,Fetch Library List 1-223,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197932,2,Fetch All Libraries,200,OK,Fetch Library List 1-224,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,1\n1590051197935,1,Fetch All Libraries,200,OK,Fetch Library List 1-224,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197940,2,Fetch All Libraries,200,OK,Fetch Library List 1-225,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197942,1,Fetch All Libraries,200,OK,Fetch Library List 1-225,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197949,2,Fetch All Libraries,200,OK,Fetch Library List 1-226,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197951,1,Fetch All Libraries,200,OK,Fetch Library List 1-226,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197956,2,Fetch All Libraries,200,OK,Fetch Library List 1-227,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197958,1,Fetch All Libraries,200,OK,Fetch Library List 1-227,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197964,2,Fetch All Libraries,200,OK,Fetch Library List 1-228,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197966,1,Fetch All Libraries,200,OK,Fetch Library List 1-228,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197969,2,Fetch All Libraries,200,OK,Fetch Library List 1-229,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197971,1,Fetch All Libraries,200,OK,Fetch Library List 1-229,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197979,3,Fetch All Libraries,200,OK,Fetch Library List 1-230,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051197982,2,Fetch All Libraries,200,OK,Fetch Library List 1-230,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051197982,3,Fetch All Libraries,200,OK,Fetch Library List 1-231,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051197985,1,Fetch All Libraries,200,OK,Fetch Library List 1-231,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197988,2,Fetch All Libraries,200,OK,Fetch Library List 1-232,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051197991,1,Fetch All Libraries,200,OK,Fetch Library List 1-232,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051197998,2,Fetch All Libraries,200,OK,Fetch Library List 1-233,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198000,2,Fetch All Libraries,200,OK,Fetch Library List 1-233,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198005,3,Fetch All Libraries,200,OK,Fetch Library List 1-234,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198008,1,Fetch All Libraries,200,OK,Fetch Library List 1-234,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198013,3,Fetch All Libraries,200,OK,Fetch Library List 1-235,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198016,1,Fetch All Libraries,200,OK,Fetch Library List 1-235,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198020,2,Fetch All Libraries,200,OK,Fetch Library List 1-236,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198022,1,Fetch All Libraries,200,OK,Fetch Library List 1-236,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198028,3,Fetch All Libraries,200,OK,Fetch Library List 1-237,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198031,1,Fetch All Libraries,200,OK,Fetch Library List 1-237,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198034,2,Fetch All Libraries,200,OK,Fetch Library List 1-238,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198037,1,Fetch All Libraries,200,OK,Fetch Library List 1-238,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198039,3,Fetch All Libraries,200,OK,Fetch Library List 1-239,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198042,1,Fetch All Libraries,200,OK,Fetch Library List 1-239,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198048,2,Fetch All Libraries,200,OK,Fetch Library List 1-240,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198051,1,Fetch All Libraries,200,OK,Fetch Library List 1-240,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198053,2,Fetch All Libraries,200,OK,Fetch Library List 1-241,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198056,1,Fetch All Libraries,200,OK,Fetch Library List 1-241,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198062,3,Fetch All Libraries,200,OK,Fetch Library List 1-242,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198065,1,Fetch All Libraries,200,OK,Fetch Library List 1-242,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198069,2,Fetch All Libraries,200,OK,Fetch Library List 1-243,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198071,1,Fetch All Libraries,200,OK,Fetch Library List 1-243,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198076,3,Fetch All Libraries,200,OK,Fetch Library List 1-244,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198079,1,Fetch All Libraries,200,OK,Fetch Library List 1-244,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198083,3,Fetch All Libraries,200,OK,Fetch Library List 1-245,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198086,1,Fetch All Libraries,200,OK,Fetch Library List 1-245,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198091,2,Fetch All Libraries,200,OK,Fetch Library List 1-246,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198093,1,Fetch All Libraries,200,OK,Fetch Library List 1-246,text,true,,1185,128,2,2,http://localhost/api/libraries/,1,0,0\n1590051198094,2,Fetch All Libraries,200,OK,Fetch Library List 1-247,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,1\n1590051198097,1,Fetch All Libraries,200,OK,Fetch Library List 1-247,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198102,2,Fetch All Libraries,200,OK,Fetch Library List 1-248,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198104,2,Fetch All Libraries,200,OK,Fetch Library List 1-248,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198110,2,Fetch All Libraries,200,OK,Fetch Library List 1-249,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,1\n1590051198113,1,Fetch All Libraries,200,OK,Fetch Library List 1-249,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198114,3,Fetch All Libraries,200,OK,Fetch Library List 1-250,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198117,1,Fetch All Libraries,200,OK,Fetch Library List 1-250,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198125,3,Fetch All Libraries,200,OK,Fetch Library List 1-251,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198128,1,Fetch All Libraries,200,OK,Fetch Library List 1-251,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198133,2,Fetch All Libraries,200,OK,Fetch Library List 1-252,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198135,1,Fetch All Libraries,200,OK,Fetch Library List 1-252,text,true,,1185,128,2,2,http://localhost/api/libraries/,1,0,0\n1590051198136,2,Fetch All Libraries,200,OK,Fetch Library List 1-253,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,1\n1590051198138,2,Fetch All Libraries,200,OK,Fetch Library List 1-253,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198145,2,Fetch All Libraries,200,OK,Fetch Library List 1-254,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198147,1,Fetch All Libraries,200,OK,Fetch Library List 1-254,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198155,2,Fetch All Libraries,200,OK,Fetch Library List 1-255,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198157,1,Fetch All Libraries,200,OK,Fetch Library List 1-255,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198160,3,Fetch All Libraries,200,OK,Fetch Library List 1-256,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198163,1,Fetch All Libraries,200,OK,Fetch Library List 1-256,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198166,3,Fetch All Libraries,200,OK,Fetch Library List 1-257,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198169,1,Fetch All Libraries,200,OK,Fetch Library List 1-257,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198174,3,Fetch All Libraries,200,OK,Fetch Library List 1-258,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198178,1,Fetch All Libraries,200,OK,Fetch Library List 1-258,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198180,3,Fetch All Libraries,200,OK,Fetch Library List 1-259,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198183,2,Fetch All Libraries,200,OK,Fetch Library List 1-259,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198186,3,Fetch All Libraries,200,OK,Fetch Library List 1-260,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198189,2,Fetch All Libraries,200,OK,Fetch Library List 1-260,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198195,2,Fetch All Libraries,200,OK,Fetch Library List 1-261,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198198,1,Fetch All Libraries,200,OK,Fetch Library List 1-261,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198200,3,Fetch All Libraries,200,OK,Fetch Library List 1-262,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198203,2,Fetch All Libraries,200,OK,Fetch Library List 1-262,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198209,2,Fetch All Libraries,200,OK,Fetch Library List 1-263,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198211,2,Fetch All Libraries,200,OK,Fetch Library List 1-263,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198214,2,Fetch All Libraries,200,OK,Fetch Library List 1-264,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,1\n1590051198217,1,Fetch All Libraries,200,OK,Fetch Library List 1-264,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198220,3,Fetch All Libraries,200,OK,Fetch Library List 1-265,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198223,2,Fetch All Libraries,200,OK,Fetch Library List 1-265,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198228,3,Fetch All Libraries,200,OK,Fetch Library List 1-266,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198231,2,Fetch All Libraries,200,OK,Fetch Library List 1-266,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051198233,3,Fetch All Libraries,200,OK,Fetch Library List 1-267,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198236,3,Fetch All Libraries,200,OK,Fetch Library List 1-267,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198244,3,Fetch All Libraries,200,OK,Fetch Library List 1-268,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198247,1,Fetch All Libraries,200,OK,Fetch Library List 1-268,text,true,,1185,128,2,2,http://localhost/api/libraries/,1,0,0\n1590051198248,3,Fetch All Libraries,200,OK,Fetch Library List 1-269,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198251,1,Fetch All Libraries,200,OK,Fetch Library List 1-269,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198259,3,Fetch All Libraries,200,OK,Fetch Library List 1-270,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051198262,2,Fetch All Libraries,200,OK,Fetch Library List 1-270,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051198262,3,Fetch All Libraries,200,OK,Fetch Library List 1-271,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198265,2,Fetch All Libraries,200,OK,Fetch Library List 1-271,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198268,2,Fetch All Libraries,200,OK,Fetch Library List 1-272,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198271,1,Fetch All Libraries,200,OK,Fetch Library List 1-272,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198278,2,Fetch All Libraries,200,OK,Fetch Library List 1-273,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198280,3,Fetch All Libraries,200,OK,Fetch Library List 1-273,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198285,4,Fetch All Libraries,200,OK,Fetch Library List 1-274,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,1\n1590051198289,2,Fetch All Libraries,200,OK,Fetch Library List 1-274,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051198291,3,Fetch All Libraries,200,OK,Fetch Library List 1-275,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198295,2,Fetch All Libraries,200,OK,Fetch Library List 1-275,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051198296,5,Fetch All Libraries,200,OK,Fetch Library List 1-276,text,true,,1185,128,1,1,http://localhost/api/libraries/,5,0,0\n1590051198301,2,Fetch All Libraries,200,OK,Fetch Library List 1-276,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051198303,3,Fetch All Libraries,200,OK,Fetch Library List 1-277,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198306,4,Fetch All Libraries,200,OK,Fetch Library List 1-277,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,0\n1590051198310,3,Fetch All Libraries,200,OK,Fetch Library List 1-278,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198313,2,Fetch All Libraries,200,OK,Fetch Library List 1-278,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198318,3,Fetch All Libraries,200,OK,Fetch Library List 1-279,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198321,1,Fetch All Libraries,200,OK,Fetch Library List 1-279,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198328,3,Fetch All Libraries,200,OK,Fetch Library List 1-280,text,true,,1185,128,2,2,http://localhost/api/libraries/,3,0,0\n1590051198331,2,Fetch All Libraries,200,OK,Fetch Library List 1-280,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051198331,4,Fetch All Libraries,200,OK,Fetch Library List 1-281,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,0\n1590051198335,1,Fetch All Libraries,200,OK,Fetch Library List 1-281,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198338,3,Fetch All Libraries,200,OK,Fetch Library List 1-282,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198341,1,Fetch All Libraries,200,OK,Fetch Library List 1-282,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198348,3,Fetch All Libraries,200,OK,Fetch Library List 1-283,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198351,2,Fetch All Libraries,200,OK,Fetch Library List 1-283,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051198352,2,Fetch All Libraries,200,OK,Fetch Library List 1-284,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198354,2,Fetch All Libraries,200,OK,Fetch Library List 1-284,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198359,2,Fetch All Libraries,200,OK,Fetch Library List 1-285,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198361,2,Fetch All Libraries,200,OK,Fetch Library List 1-285,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198369,3,Fetch All Libraries,200,OK,Fetch Library List 1-286,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198372,1,Fetch All Libraries,200,OK,Fetch Library List 1-286,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198378,2,Fetch All Libraries,200,OK,Fetch Library List 1-287,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198380,2,Fetch All Libraries,200,OK,Fetch Library List 1-287,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198382,3,Fetch All Libraries,200,OK,Fetch Library List 1-288,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198385,2,Fetch All Libraries,200,OK,Fetch Library List 1-288,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198392,3,Fetch All Libraries,200,OK,Fetch Library List 1-289,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198395,2,Fetch All Libraries,200,OK,Fetch Library List 1-289,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198397,4,Fetch All Libraries,200,OK,Fetch Library List 1-290,text,true,,1185,128,1,1,http://localhost/api/libraries/,4,0,0\n1590051198401,2,Fetch All Libraries,200,OK,Fetch Library List 1-290,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198405,3,Fetch All Libraries,200,OK,Fetch Library List 1-291,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198408,1,Fetch All Libraries,200,OK,Fetch Library List 1-291,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198412,3,Fetch All Libraries,200,OK,Fetch Library List 1-292,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198415,2,Fetch All Libraries,200,OK,Fetch Library List 1-292,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051198417,3,Fetch All Libraries,200,OK,Fetch Library List 1-293,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198420,2,Fetch All Libraries,200,OK,Fetch Library List 1-293,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198423,2,Fetch All Libraries,200,OK,Fetch Library List 1-294,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198425,2,Fetch All Libraries,200,OK,Fetch Library List 1-294,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n1590051198430,3,Fetch All Libraries,200,OK,Fetch Library List 1-295,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,1\n1590051198433,3,Fetch All Libraries,200,OK,Fetch Library List 1-295,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198440,3,Fetch All Libraries,200,OK,Fetch Library List 1-296,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198443,1,Fetch All Libraries,200,OK,Fetch Library List 1-296,text,true,,1185,128,1,1,http://localhost/api/libraries/,1,0,0\n1590051198446,15,Fetch All Libraries,200,OK,Fetch Library List 1-297,text,true,,1185,128,3,3,http://localhost/api/libraries/,15,0,0\n1590051198451,10,Fetch All Libraries,200,OK,Fetch Library List 1-298,text,true,,1185,128,3,3,http://localhost/api/libraries/,10,0,0\n1590051198457,6,Fetch All Libraries,200,OK,Fetch Library List 1-299,text,true,,1185,128,3,3,http://localhost/api/libraries/,6,0,0\n1590051198461,2,Fetch All Libraries,200,OK,Fetch Library List 1-297,text,true,,1185,128,3,3,http://localhost/api/libraries/,2,0,0\n1590051198461,2,Fetch All Libraries,200,OK,Fetch Library List 1-298,text,true,,1185,128,3,3,http://localhost/api/libraries/,2,0,0\n1590051198463,2,Fetch All Libraries,200,OK,Fetch Library List 1-299,text,true,,1185,128,2,2,http://localhost/api/libraries/,2,0,0\n1590051198464,3,Fetch All Libraries,200,OK,Fetch Library List 1-300,text,true,,1185,128,1,1,http://localhost/api/libraries/,3,0,0\n1590051198467,2,Fetch All Libraries,200,OK,Fetch Library List 1-300,text,true,,1185,128,1,1,http://localhost/api/libraries/,2,0,0\n"
  },
  {
    "path": "JMeter/libAPI.jmx",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<jmeterTestPlan version=\"1.2\" properties=\"5.0\" jmeter=\"5.2.1\">\n  <hashTree>\n    <TestPlan guiclass=\"TestPlanGui\" testclass=\"TestPlan\" testname=\"libAPI\" enabled=\"true\">\n      <stringProp name=\"TestPlan.comments\"></stringProp>\n      <boolProp name=\"TestPlan.functional_mode\">false</boolProp>\n      <boolProp name=\"TestPlan.tearDown_on_shutdown\">true</boolProp>\n      <boolProp name=\"TestPlan.serialize_threadgroups\">false</boolProp>\n      <elementProp name=\"TestPlan.user_defined_variables\" elementType=\"Arguments\" guiclass=\"ArgumentsPanel\" testclass=\"Arguments\" testname=\"User Defined Variables\" enabled=\"true\">\n        <collectionProp name=\"Arguments.arguments\"/>\n      </elementProp>\n      <stringProp name=\"TestPlan.user_define_classpath\"></stringProp>\n    </TestPlan>\n    <hashTree>\n      <ThreadGroup guiclass=\"ThreadGroupGui\" testclass=\"ThreadGroup\" testname=\"Fetch Library List\" enabled=\"true\">\n        <stringProp name=\"ThreadGroup.on_sample_error\">continue</stringProp>\n        <elementProp name=\"ThreadGroup.main_controller\" elementType=\"LoopController\" guiclass=\"LoopControlPanel\" testclass=\"LoopController\" testname=\"Loop Controller\" enabled=\"true\">\n          <boolProp name=\"LoopController.continue_forever\">false</boolProp>\n          <stringProp name=\"LoopController.loops\">2</stringProp>\n        </elementProp>\n        <stringProp name=\"ThreadGroup.num_threads\">300</stringProp>\n        <stringProp name=\"ThreadGroup.ramp_time\">2</stringProp>\n        <boolProp name=\"ThreadGroup.scheduler\">false</boolProp>\n        <stringProp name=\"ThreadGroup.duration\"></stringProp>\n        <stringProp name=\"ThreadGroup.delay\"></stringProp>\n        <boolProp name=\"ThreadGroup.same_user_on_next_iteration\">true</boolProp>\n      </ThreadGroup>\n      <hashTree>\n        <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"Fetch All Libraries\" enabled=\"true\">\n          <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"User Defined Variables\" enabled=\"true\">\n            <collectionProp name=\"Arguments.arguments\"/>\n          </elementProp>\n          <stringProp name=\"HTTPSampler.domain\">localhost</stringProp>\n          <stringProp name=\"HTTPSampler.port\">80</stringProp>\n          <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n          <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n          <stringProp name=\"HTTPSampler.path\">/api/libraries/</stringProp>\n          <stringProp name=\"HTTPSampler.method\">GET</stringProp>\n          <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n          <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n          <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n          <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n          <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n          <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n          <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n        </HTTPSamplerProxy>\n        <hashTree/>\n        <ResultCollector guiclass=\"TableVisualizer\" testclass=\"ResultCollector\" testname=\"View Results in Table\" enabled=\"false\">\n          <boolProp name=\"ResultCollector.error_logging\">false</boolProp>\n          <objProp>\n            <name>saveConfig</name>\n            <value class=\"SampleSaveConfiguration\">\n              <time>true</time>\n              <latency>true</latency>\n              <timestamp>true</timestamp>\n              <success>true</success>\n              <label>true</label>\n              <code>true</code>\n              <message>true</message>\n              <threadName>true</threadName>\n              <dataType>true</dataType>\n              <encoding>false</encoding>\n              <assertions>true</assertions>\n              <subresults>true</subresults>\n              <responseData>false</responseData>\n              <samplerData>false</samplerData>\n              <xml>false</xml>\n              <fieldNames>true</fieldNames>\n              <responseHeaders>false</responseHeaders>\n              <requestHeaders>false</requestHeaders>\n              <responseDataOnError>false</responseDataOnError>\n              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>\n              <assertionsResultsToSave>0</assertionsResultsToSave>\n              <bytes>true</bytes>\n              <sentBytes>true</sentBytes>\n              <url>true</url>\n              <threadCounts>true</threadCounts>\n              <idleTime>true</idleTime>\n              <connectTime>true</connectTime>\n            </value>\n          </objProp>\n          <stringProp name=\"filename\"></stringProp>\n        </ResultCollector>\n        <hashTree/>\n        <ResultCollector guiclass=\"SummaryReport\" testclass=\"ResultCollector\" testname=\"Summary Report\" enabled=\"true\">\n          <boolProp name=\"ResultCollector.error_logging\">false</boolProp>\n          <objProp>\n            <name>saveConfig</name>\n            <value class=\"SampleSaveConfiguration\">\n              <time>true</time>\n              <latency>true</latency>\n              <timestamp>true</timestamp>\n              <success>true</success>\n              <label>true</label>\n              <code>true</code>\n              <message>true</message>\n              <threadName>true</threadName>\n              <dataType>true</dataType>\n              <encoding>false</encoding>\n              <assertions>true</assertions>\n              <subresults>true</subresults>\n              <responseData>false</responseData>\n              <samplerData>false</samplerData>\n              <xml>false</xml>\n              <fieldNames>true</fieldNames>\n              <responseHeaders>false</responseHeaders>\n              <requestHeaders>false</requestHeaders>\n              <responseDataOnError>false</responseDataOnError>\n              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>\n              <assertionsResultsToSave>0</assertionsResultsToSave>\n              <bytes>true</bytes>\n              <sentBytes>true</sentBytes>\n              <url>true</url>\n              <threadCounts>true</threadCounts>\n              <idleTime>true</idleTime>\n              <connectTime>true</connectTime>\n            </value>\n          </objProp>\n          <stringProp name=\"filename\"></stringProp>\n        </ResultCollector>\n        <hashTree/>\n      </hashTree>\n      <ThreadGroup guiclass=\"ThreadGroupGui\" testclass=\"ThreadGroup\" testname=\"Fetch Specific Library\" enabled=\"false\">\n        <stringProp name=\"ThreadGroup.on_sample_error\">continue</stringProp>\n        <elementProp name=\"ThreadGroup.main_controller\" elementType=\"LoopController\" guiclass=\"LoopControlPanel\" testclass=\"LoopController\" testname=\"Loop Controller\" enabled=\"true\">\n          <boolProp name=\"LoopController.continue_forever\">false</boolProp>\n          <stringProp name=\"LoopController.loops\">2</stringProp>\n        </elementProp>\n        <stringProp name=\"ThreadGroup.num_threads\">300</stringProp>\n        <stringProp name=\"ThreadGroup.ramp_time\">2</stringProp>\n        <boolProp name=\"ThreadGroup.scheduler\">false</boolProp>\n        <stringProp name=\"ThreadGroup.duration\"></stringProp>\n        <stringProp name=\"ThreadGroup.delay\"></stringProp>\n        <boolProp name=\"ThreadGroup.same_user_on_next_iteration\">true</boolProp>\n        <boolProp name=\"ThreadGroup.delayedStart\">true</boolProp>\n      </ThreadGroup>\n      <hashTree>\n        <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"Fetch Specific Library\" enabled=\"true\">\n          <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"User Defined Variables\" enabled=\"true\">\n            <collectionProp name=\"Arguments.arguments\"/>\n          </elementProp>\n          <stringProp name=\"HTTPSampler.domain\">localhost</stringProp>\n          <stringProp name=\"HTTPSampler.port\">80</stringProp>\n          <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n          <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n          <stringProp name=\"HTTPSampler.path\">/api/components/?component_library=1</stringProp>\n          <stringProp name=\"HTTPSampler.method\">GET</stringProp>\n          <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n          <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n          <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n          <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n          <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n          <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n          <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n        </HTTPSamplerProxy>\n        <hashTree/>\n        <ResultCollector guiclass=\"SummaryReport\" testclass=\"ResultCollector\" testname=\"Summary Report\" enabled=\"true\">\n          <boolProp name=\"ResultCollector.error_logging\">false</boolProp>\n          <objProp>\n            <name>saveConfig</name>\n            <value class=\"SampleSaveConfiguration\">\n              <time>true</time>\n              <latency>true</latency>\n              <timestamp>true</timestamp>\n              <success>true</success>\n              <label>true</label>\n              <code>true</code>\n              <message>true</message>\n              <threadName>true</threadName>\n              <dataType>true</dataType>\n              <encoding>false</encoding>\n              <assertions>true</assertions>\n              <subresults>true</subresults>\n              <responseData>false</responseData>\n              <samplerData>false</samplerData>\n              <xml>false</xml>\n              <fieldNames>true</fieldNames>\n              <responseHeaders>false</responseHeaders>\n              <requestHeaders>false</requestHeaders>\n              <responseDataOnError>false</responseDataOnError>\n              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>\n              <assertionsResultsToSave>0</assertionsResultsToSave>\n              <bytes>true</bytes>\n              <sentBytes>true</sentBytes>\n              <url>true</url>\n              <threadCounts>true</threadCounts>\n              <idleTime>true</idleTime>\n              <connectTime>true</connectTime>\n            </value>\n          </objProp>\n          <stringProp name=\"filename\"></stringProp>\n        </ResultCollector>\n        <hashTree/>\n      </hashTree>\n      <ThreadGroup guiclass=\"ThreadGroupGui\" testclass=\"ThreadGroup\" testname=\"Fetch Specific Image\" enabled=\"false\">\n        <stringProp name=\"ThreadGroup.on_sample_error\">continue</stringProp>\n        <elementProp name=\"ThreadGroup.main_controller\" elementType=\"LoopController\" guiclass=\"LoopControlPanel\" testclass=\"LoopController\" testname=\"Loop Controller\" enabled=\"true\">\n          <boolProp name=\"LoopController.continue_forever\">false</boolProp>\n          <stringProp name=\"LoopController.loops\">2</stringProp>\n        </elementProp>\n        <stringProp name=\"ThreadGroup.num_threads\">300</stringProp>\n        <stringProp name=\"ThreadGroup.ramp_time\">2</stringProp>\n        <boolProp name=\"ThreadGroup.scheduler\">false</boolProp>\n        <stringProp name=\"ThreadGroup.duration\"></stringProp>\n        <stringProp name=\"ThreadGroup.delay\"></stringProp>\n        <boolProp name=\"ThreadGroup.same_user_on_next_iteration\">true</boolProp>\n        <boolProp name=\"ThreadGroup.delayedStart\">true</boolProp>\n      </ThreadGroup>\n      <hashTree>\n        <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"Fetch Specific Image\" enabled=\"true\">\n          <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"User Defined Variables\" enabled=\"true\">\n            <collectionProp name=\"Arguments.arguments\"/>\n          </elementProp>\n          <stringProp name=\"HTTPSampler.domain\">localhost</stringProp>\n          <stringProp name=\"HTTPSampler.port\">80</stringProp>\n          <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n          <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n          <stringProp name=\"HTTPSampler.path\">/kicad-symbols/symbol_svgs/Analog/U-MLX90320xFR-1-A.svg</stringProp>\n          <stringProp name=\"HTTPSampler.method\">GET</stringProp>\n          <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n          <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n          <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n          <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n          <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n          <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n          <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n        </HTTPSamplerProxy>\n        <hashTree/>\n        <ResultCollector guiclass=\"SummaryReport\" testclass=\"ResultCollector\" testname=\"Summary Report\" enabled=\"true\">\n          <boolProp name=\"ResultCollector.error_logging\">false</boolProp>\n          <objProp>\n            <name>saveConfig</name>\n            <value class=\"SampleSaveConfiguration\">\n              <time>true</time>\n              <latency>true</latency>\n              <timestamp>true</timestamp>\n              <success>true</success>\n              <label>true</label>\n              <code>true</code>\n              <message>true</message>\n              <threadName>true</threadName>\n              <dataType>true</dataType>\n              <encoding>false</encoding>\n              <assertions>true</assertions>\n              <subresults>true</subresults>\n              <responseData>false</responseData>\n              <samplerData>false</samplerData>\n              <xml>false</xml>\n              <fieldNames>true</fieldNames>\n              <responseHeaders>false</responseHeaders>\n              <requestHeaders>false</requestHeaders>\n              <responseDataOnError>false</responseDataOnError>\n              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>\n              <assertionsResultsToSave>0</assertionsResultsToSave>\n              <bytes>true</bytes>\n              <sentBytes>true</sentBytes>\n              <url>true</url>\n              <threadCounts>true</threadCounts>\n              <idleTime>true</idleTime>\n              <connectTime>true</connectTime>\n            </value>\n          </objProp>\n          <stringProp name=\"filename\"></stringProp>\n        </ResultCollector>\n        <hashTree/>\n      </hashTree>\n      <ResultCollector guiclass=\"TableVisualizer\" testclass=\"ResultCollector\" testname=\"View Results in Table\" enabled=\"true\">\n        <boolProp name=\"ResultCollector.error_logging\">false</boolProp>\n        <objProp>\n          <name>saveConfig</name>\n          <value class=\"SampleSaveConfiguration\">\n            <time>true</time>\n            <latency>true</latency>\n            <timestamp>true</timestamp>\n            <success>true</success>\n            <label>true</label>\n            <code>true</code>\n            <message>true</message>\n            <threadName>true</threadName>\n            <dataType>true</dataType>\n            <encoding>false</encoding>\n            <assertions>true</assertions>\n            <subresults>true</subresults>\n            <responseData>false</responseData>\n            <samplerData>false</samplerData>\n            <xml>false</xml>\n            <fieldNames>true</fieldNames>\n            <responseHeaders>false</responseHeaders>\n            <requestHeaders>false</requestHeaders>\n            <responseDataOnError>false</responseDataOnError>\n            <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>\n            <assertionsResultsToSave>0</assertionsResultsToSave>\n            <bytes>true</bytes>\n            <sentBytes>true</sentBytes>\n            <url>true</url>\n            <threadCounts>true</threadCounts>\n            <idleTime>true</idleTime>\n            <connectTime>true</connectTime>\n          </value>\n        </objProp>\n        <stringProp name=\"filename\">/Users/darsh/github/eSim-Cloud/eSim-Cloud/JMeter/libAPI.csv</stringProp>\n      </ResultCollector>\n      <hashTree/>\n    </hashTree>\n  </hashTree>\n</jmeterTestPlan>\n"
  },
  {
    "path": "JMeter/simulationAPI.jmx",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<jmeterTestPlan version=\"1.2\" properties=\"5.0\" jmeter=\"5.2.1\">\n  <hashTree>\n    <TestPlan guiclass=\"TestPlanGui\" testclass=\"TestPlan\" testname=\"SimulationAPI\" enabled=\"true\">\n      <stringProp name=\"TestPlan.comments\"></stringProp>\n      <boolProp name=\"TestPlan.functional_mode\">false</boolProp>\n      <boolProp name=\"TestPlan.tearDown_on_shutdown\">true</boolProp>\n      <boolProp name=\"TestPlan.serialize_threadgroups\">false</boolProp>\n      <elementProp name=\"TestPlan.user_defined_variables\" elementType=\"Arguments\" guiclass=\"ArgumentsPanel\" testclass=\"Arguments\" testname=\"User Defined Variables\" enabled=\"true\">\n        <collectionProp name=\"Arguments.arguments\"/>\n      </elementProp>\n      <stringProp name=\"TestPlan.user_define_classpath\"></stringProp>\n    </TestPlan>\n    <hashTree>\n      <ThreadGroup guiclass=\"ThreadGroupGui\" testclass=\"ThreadGroup\" testname=\"Test Polling\" enabled=\"false\">\n        <stringProp name=\"ThreadGroup.on_sample_error\">continue</stringProp>\n        <elementProp name=\"ThreadGroup.main_controller\" elementType=\"LoopController\" guiclass=\"LoopControlPanel\" testclass=\"LoopController\" testname=\"Loop Controller\" enabled=\"true\">\n          <boolProp name=\"LoopController.continue_forever\">false</boolProp>\n          <stringProp name=\"LoopController.loops\">1</stringProp>\n        </elementProp>\n        <stringProp name=\"ThreadGroup.num_threads\">200</stringProp>\n        <stringProp name=\"ThreadGroup.ramp_time\">1</stringProp>\n        <boolProp name=\"ThreadGroup.scheduler\">false</boolProp>\n        <stringProp name=\"ThreadGroup.duration\"></stringProp>\n        <stringProp name=\"ThreadGroup.delay\"></stringProp>\n        <boolProp name=\"ThreadGroup.same_user_on_next_iteration\">true</boolProp>\n      </ThreadGroup>\n      <hashTree>\n        <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"Upload Netlist \" enabled=\"false\">\n          <elementProp name=\"HTTPsampler.Files\" elementType=\"HTTPFileArgs\">\n            <collectionProp name=\"HTTPFileArgs.files\">\n              <elementProp name=\"/Users/darsh/github/eSim-Cloud/eSim-Cloud/esim-cloud-backend/simulationAPI/helpers/sample_files/RC.cir\" elementType=\"HTTPFileArg\">\n                <stringProp name=\"File.path\">/Users/darsh/github/eSim-Cloud/eSim-Cloud/esim-cloud-backend/simulationAPI/helpers/sample_files/RC.cir</stringProp>\n                <stringProp name=\"File.paramname\">file</stringProp>\n                <stringProp name=\"File.mimetype\">text/plain</stringProp>\n              </elementProp>\n            </collectionProp>\n          </elementProp>\n          <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"User Defined Variables\" enabled=\"true\">\n            <collectionProp name=\"Arguments.arguments\"/>\n          </elementProp>\n          <stringProp name=\"HTTPSampler.domain\">localhost</stringProp>\n          <stringProp name=\"HTTPSampler.port\"></stringProp>\n          <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n          <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n          <stringProp name=\"HTTPSampler.path\">/api/simulation/upload</stringProp>\n          <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n          <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n          <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n          <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n          <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n          <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n          <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n          <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n        </HTTPSamplerProxy>\n        <hashTree/>\n        <JSONPostProcessor guiclass=\"JSONPostProcessorGui\" testclass=\"JSONPostProcessor\" testname=\"JSON Extractor\" enabled=\"false\">\n          <stringProp name=\"JSONPostProcessor.referenceNames\">task_id</stringProp>\n          <stringProp name=\"JSONPostProcessor.jsonPathExprs\">$.details.task_id</stringProp>\n          <stringProp name=\"JSONPostProcessor.match_numbers\">1</stringProp>\n          <stringProp name=\"Scope.variable\">task_id</stringProp>\n        </JSONPostProcessor>\n        <hashTree/>\n        <DebugSampler guiclass=\"TestBeanGUI\" testclass=\"DebugSampler\" testname=\"Debug Sampler\" enabled=\"false\">\n          <boolProp name=\"displayJMeterProperties\">false</boolProp>\n          <boolProp name=\"displayJMeterVariables\">true</boolProp>\n          <boolProp name=\"displaySystemProperties\">false</boolProp>\n        </DebugSampler>\n        <hashTree/>\n        <TestAction guiclass=\"TestActionGui\" testclass=\"TestAction\" testname=\"Think Time\" enabled=\"false\">\n          <intProp name=\"ActionProcessor.action\">1</intProp>\n          <intProp name=\"ActionProcessor.target\">0</intProp>\n          <stringProp name=\"ActionProcessor.duration\">0</stringProp>\n        </TestAction>\n        <hashTree>\n          <UniformRandomTimer guiclass=\"UniformRandomTimerGui\" testclass=\"UniformRandomTimer\" testname=\"Pause\" enabled=\"true\">\n            <stringProp name=\"ConstantTimer.delay\">1000</stringProp>\n            <stringProp name=\"RandomTimer.range\">5000</stringProp>\n          </UniformRandomTimer>\n          <hashTree/>\n        </hashTree>\n        <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"Fetch Result\" enabled=\"true\">\n          <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"User Defined Variables\" enabled=\"true\">\n            <collectionProp name=\"Arguments.arguments\"/>\n          </elementProp>\n          <stringProp name=\"HTTPSampler.domain\">localhost</stringProp>\n          <stringProp name=\"HTTPSampler.port\"></stringProp>\n          <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n          <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n          <stringProp name=\"HTTPSampler.path\">/api/simulation/status/439e8630-dc01-4e4b-a6b9-5132307a6587</stringProp>\n          <stringProp name=\"HTTPSampler.method\">GET</stringProp>\n          <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n          <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n          <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n          <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n          <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n          <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n          <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n        </HTTPSamplerProxy>\n        <hashTree>\n          <JSONPostProcessor guiclass=\"JSONPostProcessorGui\" testclass=\"JSONPostProcessor\" testname=\"JSON Extractor\" enabled=\"true\">\n            <stringProp name=\"JSONPostProcessor.referenceNames\">state</stringProp>\n            <stringProp name=\"JSONPostProcessor.jsonPathExprs\">$.state</stringProp>\n            <stringProp name=\"JSONPostProcessor.match_numbers\">1</stringProp>\n            <stringProp name=\"Scope.variable\">task_id</stringProp>\n          </JSONPostProcessor>\n          <hashTree/>\n          <JSONPathAssertion guiclass=\"JSONPathAssertionGui\" testclass=\"JSONPathAssertion\" testname=\"Status should be success\" enabled=\"true\">\n            <stringProp name=\"JSON_PATH\">$.state</stringProp>\n            <stringProp name=\"EXPECTED_VALUE\">SUCCESS</stringProp>\n            <boolProp name=\"JSONVALIDATION\">false</boolProp>\n            <boolProp name=\"EXPECT_NULL\">false</boolProp>\n            <boolProp name=\"INVERT\">false</boolProp>\n            <boolProp name=\"ISREGEX\">true</boolProp>\n          </JSONPathAssertion>\n          <hashTree/>\n        </hashTree>\n        <TestAction guiclass=\"TestActionGui\" testclass=\"TestAction\" testname=\"Think Time\" enabled=\"false\">\n          <intProp name=\"ActionProcessor.action\">1</intProp>\n          <intProp name=\"ActionProcessor.target\">0</intProp>\n          <stringProp name=\"ActionProcessor.duration\">0</stringProp>\n        </TestAction>\n        <hashTree>\n          <UniformRandomTimer guiclass=\"UniformRandomTimerGui\" testclass=\"UniformRandomTimer\" testname=\"Pause\" enabled=\"true\">\n            <stringProp name=\"ConstantTimer.delay\">1000</stringProp>\n            <stringProp name=\"RandomTimer.range\">100</stringProp>\n          </UniformRandomTimer>\n          <hashTree/>\n        </hashTree>\n        <ResultCollector guiclass=\"TableVisualizer\" testclass=\"ResultCollector\" testname=\"View Results in Table\" enabled=\"true\">\n          <boolProp name=\"ResultCollector.error_logging\">false</boolProp>\n          <objProp>\n            <name>saveConfig</name>\n            <value class=\"SampleSaveConfiguration\">\n              <time>true</time>\n              <latency>true</latency>\n              <timestamp>true</timestamp>\n              <success>true</success>\n              <label>true</label>\n              <code>true</code>\n              <message>true</message>\n              <threadName>true</threadName>\n              <dataType>true</dataType>\n              <encoding>false</encoding>\n              <assertions>true</assertions>\n              <subresults>true</subresults>\n              <responseData>false</responseData>\n              <samplerData>false</samplerData>\n              <xml>false</xml>\n              <fieldNames>true</fieldNames>\n              <responseHeaders>false</responseHeaders>\n              <requestHeaders>false</requestHeaders>\n              <responseDataOnError>false</responseDataOnError>\n              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>\n              <assertionsResultsToSave>0</assertionsResultsToSave>\n              <bytes>true</bytes>\n              <sentBytes>true</sentBytes>\n              <url>true</url>\n              <threadCounts>true</threadCounts>\n              <idleTime>true</idleTime>\n              <connectTime>true</connectTime>\n            </value>\n          </objProp>\n          <stringProp name=\"filename\"></stringProp>\n        </ResultCollector>\n        <hashTree/>\n      </hashTree>\n      <ThreadGroup guiclass=\"ThreadGroupGui\" testclass=\"ThreadGroup\" testname=\"Thread Group\" enabled=\"true\">\n        <stringProp name=\"ThreadGroup.on_sample_error\">continue</stringProp>\n        <elementProp name=\"ThreadGroup.main_controller\" elementType=\"LoopController\" guiclass=\"LoopControlPanel\" testclass=\"LoopController\" testname=\"Loop Controller\" enabled=\"true\">\n          <boolProp name=\"LoopController.continue_forever\">false</boolProp>\n          <stringProp name=\"LoopController.loops\">1</stringProp>\n        </elementProp>\n        <stringProp name=\"ThreadGroup.num_threads\">200</stringProp>\n        <stringProp name=\"ThreadGroup.ramp_time\">1</stringProp>\n        <boolProp name=\"ThreadGroup.scheduler\">false</boolProp>\n        <stringProp name=\"ThreadGroup.duration\"></stringProp>\n        <stringProp name=\"ThreadGroup.delay\"></stringProp>\n        <boolProp name=\"ThreadGroup.same_user_on_next_iteration\">true</boolProp>\n        <boolProp name=\"ThreadGroup.delayedStart\">true</boolProp>\n      </ThreadGroup>\n      <hashTree>\n        <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"Upload Netlist \" enabled=\"true\">\n          <elementProp name=\"HTTPsampler.Files\" elementType=\"HTTPFileArgs\">\n            <collectionProp name=\"HTTPFileArgs.files\">\n              <elementProp name=\"/Users/darsh/github/eSim-Cloud/eSim-Cloud/esim-cloud-backend/simulationAPI/helpers/sample_files/RC.cir\" elementType=\"HTTPFileArg\">\n                <stringProp name=\"File.path\">/Users/darsh/github/eSim-Cloud/eSim-Cloud/esim-cloud-backend/simulationAPI/helpers/sample_files/RC.cir</stringProp>\n                <stringProp name=\"File.paramname\">file</stringProp>\n                <stringProp name=\"File.mimetype\">text/plain</stringProp>\n              </elementProp>\n            </collectionProp>\n          </elementProp>\n          <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"User Defined Variables\" enabled=\"true\">\n            <collectionProp name=\"Arguments.arguments\"/>\n          </elementProp>\n          <stringProp name=\"HTTPSampler.domain\">localhost</stringProp>\n          <stringProp name=\"HTTPSampler.port\"></stringProp>\n          <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n          <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n          <stringProp name=\"HTTPSampler.path\">/api/simulation/upload</stringProp>\n          <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n          <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n          <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n          <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n          <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n          <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n          <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n          <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n        </HTTPSamplerProxy>\n        <hashTree/>\n        <JSONPostProcessor guiclass=\"JSONPostProcessorGui\" testclass=\"JSONPostProcessor\" testname=\"JSON Extractor\" enabled=\"true\">\n          <stringProp name=\"JSONPostProcessor.referenceNames\">task_id</stringProp>\n          <stringProp name=\"JSONPostProcessor.jsonPathExprs\">$.details.task_id</stringProp>\n          <stringProp name=\"JSONPostProcessor.match_numbers\">1</stringProp>\n          <stringProp name=\"Scope.variable\">task_id</stringProp>\n        </JSONPostProcessor>\n        <hashTree/>\n        <DebugSampler guiclass=\"TestBeanGUI\" testclass=\"DebugSampler\" testname=\"Debug Sampler\" enabled=\"false\">\n          <boolProp name=\"displayJMeterProperties\">false</boolProp>\n          <boolProp name=\"displayJMeterVariables\">true</boolProp>\n          <boolProp name=\"displaySystemProperties\">false</boolProp>\n        </DebugSampler>\n        <hashTree/>\n        <TestAction guiclass=\"TestActionGui\" testclass=\"TestAction\" testname=\"Think Time\" enabled=\"true\">\n          <intProp name=\"ActionProcessor.action\">1</intProp>\n          <intProp name=\"ActionProcessor.target\">0</intProp>\n          <stringProp name=\"ActionProcessor.duration\">0</stringProp>\n        </TestAction>\n        <hashTree>\n          <UniformRandomTimer guiclass=\"UniformRandomTimerGui\" testclass=\"UniformRandomTimer\" testname=\"Pause\" enabled=\"true\">\n            <stringProp name=\"ConstantTimer.delay\">1000</stringProp>\n            <stringProp name=\"RandomTimer.range\">5000</stringProp>\n          </UniformRandomTimer>\n          <hashTree/>\n        </hashTree>\n        <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"Fetch Result\" enabled=\"true\">\n          <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"User Defined Variables\" enabled=\"true\">\n            <collectionProp name=\"Arguments.arguments\"/>\n          </elementProp>\n          <stringProp name=\"HTTPSampler.domain\">localhost</stringProp>\n          <stringProp name=\"HTTPSampler.port\"></stringProp>\n          <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n          <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n          <stringProp name=\"HTTPSampler.path\">/api/simulation/status/${task_id}</stringProp>\n          <stringProp name=\"HTTPSampler.method\">GET</stringProp>\n          <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n          <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n          <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n          <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n          <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n          <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n          <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n        </HTTPSamplerProxy>\n        <hashTree>\n          <JSONPostProcessor guiclass=\"JSONPostProcessorGui\" testclass=\"JSONPostProcessor\" testname=\"JSON Extractor\" enabled=\"true\">\n            <stringProp name=\"JSONPostProcessor.referenceNames\">state</stringProp>\n            <stringProp name=\"JSONPostProcessor.jsonPathExprs\">$.state</stringProp>\n            <stringProp name=\"JSONPostProcessor.match_numbers\">1</stringProp>\n            <stringProp name=\"Scope.variable\">task_id</stringProp>\n          </JSONPostProcessor>\n          <hashTree/>\n          <JSONPathAssertion guiclass=\"JSONPathAssertionGui\" testclass=\"JSONPathAssertion\" testname=\"Status should be success\" enabled=\"true\">\n            <stringProp name=\"JSON_PATH\">$.state</stringProp>\n            <stringProp name=\"EXPECTED_VALUE\">SUCCESS</stringProp>\n            <boolProp name=\"JSONVALIDATION\">false</boolProp>\n            <boolProp name=\"EXPECT_NULL\">false</boolProp>\n            <boolProp name=\"INVERT\">false</boolProp>\n            <boolProp name=\"ISREGEX\">true</boolProp>\n          </JSONPathAssertion>\n          <hashTree/>\n        </hashTree>\n        <ResultCollector guiclass=\"ViewResultsFullVisualizer\" testclass=\"ResultCollector\" testname=\"View Results Tree\" enabled=\"false\">\n          <boolProp name=\"ResultCollector.error_logging\">false</boolProp>\n          <objProp>\n            <name>saveConfig</name>\n            <value class=\"SampleSaveConfiguration\">\n              <time>true</time>\n              <latency>true</latency>\n              <timestamp>true</timestamp>\n              <success>true</success>\n              <label>true</label>\n              <code>true</code>\n              <message>true</message>\n              <threadName>true</threadName>\n              <dataType>true</dataType>\n              <encoding>false</encoding>\n              <assertions>true</assertions>\n              <subresults>true</subresults>\n              <responseData>false</responseData>\n              <samplerData>false</samplerData>\n              <xml>false</xml>\n              <fieldNames>true</fieldNames>\n              <responseHeaders>false</responseHeaders>\n              <requestHeaders>false</requestHeaders>\n              <responseDataOnError>false</responseDataOnError>\n              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>\n              <assertionsResultsToSave>0</assertionsResultsToSave>\n              <bytes>true</bytes>\n              <sentBytes>true</sentBytes>\n              <url>true</url>\n              <threadCounts>true</threadCounts>\n              <idleTime>true</idleTime>\n              <connectTime>true</connectTime>\n            </value>\n          </objProp>\n          <stringProp name=\"filename\"></stringProp>\n        </ResultCollector>\n        <hashTree/>\n        <ResultCollector guiclass=\"TableVisualizer\" testclass=\"ResultCollector\" testname=\"View Results in Table\" enabled=\"true\">\n          <boolProp name=\"ResultCollector.error_logging\">false</boolProp>\n          <objProp>\n            <name>saveConfig</name>\n            <value class=\"SampleSaveConfiguration\">\n              <time>true</time>\n              <latency>true</latency>\n              <timestamp>true</timestamp>\n              <success>true</success>\n              <label>true</label>\n              <code>true</code>\n              <message>true</message>\n              <threadName>true</threadName>\n              <dataType>true</dataType>\n              <encoding>false</encoding>\n              <assertions>true</assertions>\n              <subresults>true</subresults>\n              <responseData>false</responseData>\n              <samplerData>false</samplerData>\n              <xml>false</xml>\n              <fieldNames>true</fieldNames>\n              <responseHeaders>false</responseHeaders>\n              <requestHeaders>false</requestHeaders>\n              <responseDataOnError>false</responseDataOnError>\n              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>\n              <assertionsResultsToSave>0</assertionsResultsToSave>\n              <bytes>true</bytes>\n              <sentBytes>true</sentBytes>\n              <url>true</url>\n              <threadCounts>true</threadCounts>\n              <idleTime>true</idleTime>\n              <connectTime>true</connectTime>\n            </value>\n          </objProp>\n          <stringProp name=\"filename\">/Users/darsh/Downloads/apache-jmeter-5.2.1/2_django_5_celery_200.csv</stringProp>\n        </ResultCollector>\n        <hashTree/>\n      </hashTree>\n    </hashTree>\n  </hashTree>\n</jmeterTestPlan>\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "Nginx/conf.d/local.conf",
    "content": "\nupstream django_server {\n    # will resolve to the correct address\n    server django:8000;\n}\n\nproxy_cache_path /tmp/image_cache levels=1:2 keys_zone=image_cache:10m max_size=100M inactive=48h use_temp_path=off;\nproxy_cache_path /tmp/cache levels=1:2 keys_zone=default_cache:10m max_size=100m inactive=120m use_temp_path=off;\n\nproxy_cache_key \"$scheme$request_method$host$request_uri\";\nproxy_cache_valid 200 302 60m;\nproxy_cache_methods GET HEAD;\n\nmap $sent_http_content_type $expires {\n    default off;\n    text/html epoch;\n    text/css 3d;\n    application/javascript 3d;\n    ~image/ 3d;\n}\n\nserver {\n    listen 80;\n    expires $expires;\n    root /usr/share/nginx/static_pages/index;\n    server_tokens off;\n\n    location / {\n        # try_files $uri$args $uri$args/ index.html;\n        proxy_hide_header X-Frame-Options;\n        add_header X-Content-Type-Options nosniff always;\n        add_header X-XSS-Protection \"1; mode=block\" always;\n        index index.htm index.html;\n    }\n\n    location /api {\n        # proxy_cache default_cache;\n        proxy_buffering on;\n\n        proxy_ignore_headers Expires;\n        proxy_ignore_headers X-Accel-Expires;\n        proxy_ignore_headers Cache-Control;\n        proxy_ignore_headers Set-Cookie;\n\n        proxy_hide_header X-Accel-Expires;\n        proxy_hide_header Expires;\n        proxy_hide_header Cache-Control;\n        proxy_hide_header Pragma;\n        proxy_hide_header X-Frame-Options;\n        add_header X-Content-Type-Options nosniff always;\n        add_header X-XSS-Protection \"1; mode=block\" always;\n        add_header Access-Control-Allow-Origin *;\n        add_header X-Proxy-Cache $upstream_cache_status;\n        add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_redirect off;\n        client_max_body_size 200M;\n        proxy_pass http://django:8000;\n    }\n\n    location /api/docs {\n        return 404;\n    }\n\n    location /eda {\n        alias /usr/share/nginx/eda;\n        proxy_hide_header X-Frame-Options;\n        add_header X-Content-Type-Options nosniff always;\n        add_header X-XSS-Protection \"1; mode=block\" always;\n        try_files $uri$args $uri$args/ /index.html;\n    }\n\n    location /arduino {\n        alias /usr/share/nginx/arduino-build/ArduinoFrontend/;\n        proxy_hide_header X-Frame-Options;\n        add_header X-Content-Type-Options nosniff always;\n        add_header X-XSS-Protection \"1; mode=block\" always;\n        try_files $uri$args $uri$args/ /index.html?$args;\n    }\n\n    location /kicad-symbols {\n        alias /usr/share/nginx/kicad-libs;\n        proxy_cache image_cache;\n        log_not_found off;\n        access_log off;\n        add_header X-Cache-Status $upstream_cache_status;\n        index index.html index.htm;\n        try_files $uri$args $uri$args/ /index.html;\n    }\n\n    location /django_static/ {\n        alias /usr/share/nginx/django_static/;\n        proxy_cache image_cache;\n        log_not_found off;\n        access_log off;\n        add_header X-Cache-Status $upstream_cache_status;\n    }\n    location /files/ {\n        alias /usr/share/nginx/django_file_storage/;\n        proxy_cache image_cache;\n        log_not_found off;\n        access_log off;\n        add_header X-Cache-Status $upstream_cache_status;\n    }\n}\n"
  },
  {
    "path": "Nginx/dev.conf.d/local.conf",
    "content": "\nupstream django_server {\n    # will resolve to the correct address\n    server django:8000;\n}\nupstream eda_frontend {\n    # will resolve to the correct address\n    server eda-frontend:3000;\n}\n\nupstream arduino_frontend {\n    # will resolve to the correct address\n    server arduino-frontend:4200;\n}\n\nserver {\n    listen 80;\n    server_name localhost;\n\n    location / {\n    root   /usr/share/nginx/static_pages/index;\n    index  index.html index.htm;\n    try_files $uri $uri/ /index.html;\n    }\n\n    location /api {\n        proxy_hide_header X-Frame-Options;\n        proxy_pass http://django_server;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header Host $host;\n        proxy_redirect off;\n        client_max_body_size 200M;\n    }\n       location /eda/ {\n        proxy_hide_header X-Frame-Options;\n        proxy_pass http://eda_frontend;\n    }\n       location /arduino/ {\n        proxy_hide_header X-Frame-Options;\n        proxy_pass http://arduino_frontend;\n    }\n\n  location /kicad-symbols {\n    alias   /usr/share/nginx/kicad-libs;\n    index  index.html index.htm;\n    try_files $uri $uri/ /index.html;\n  }\n\n    location /django_static/ {\n        alias /usr/share/nginx/django_static/;\n    }\n\n    location /files/ {\n        alias /usr/share/nginx/django_file_storage/;\n    }\n    \n    location /sockjs-node {\n        proxy_set_header X-Real-IP  $remote_addr;\n        proxy_set_header X-Forwarded-For $remote_addr;\n        proxy_set_header Host $host;\n\n        proxy_pass http://eda_frontend; \n\n        proxy_redirect off;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n    }\n}\n"
  },
  {
    "path": "Nginx/static_pages/index/css/normalize.css",
    "content": "/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n *    user zoom.\n */\n\nhtml {\n  font-family: sans-serif; /* 1 */\n  -ms-text-size-adjust: 100%; /* 2 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n  margin: 0;\n}\n\n/* HTML5 display definitions\n   ========================================================================== */\n\n/**\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\n * Correct `block` display not defined for `details` or `summary` in IE 10/11\n * and Firefox.\n * Correct `block` display not defined for `main` in IE 11.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; /* 1 */\n  vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9/10.\n * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n/* Links\n   ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n  background-color: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n  outline: 0;\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n */\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n */\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari and Chrome.\n */\n\ndfn {\n  font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari, and Chrome.\n */\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n  font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9/10.\n */\n\nimg {\n  border: 0;\n}\n\n/**\n * Correct overflow not hidden in IE 9/10/11.\n */\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari.\n */\n\nfigure {\n  margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n  overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n *    Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; /* 1 */\n  font: inherit; /* 2 */\n  margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\n */\n\nbutton {\n  overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n *    and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n *    `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; /* 2 */\n  cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n  line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n *    (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; /* 1 */\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box; /* 2 */\n  box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n  border: 0; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9/10/11.\n */\n\ntextarea {\n  overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n  font-weight: bold;\n}\n\n/* Tables\n   ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n\n.footer-wrapper {\nposition: relative;\nmargin-top: 0;\nbackground-color: #e5e5e5;\nborder-top: 1px solid #fff;\nbottom: -10px;\nheight: 40px;\nwidth: 100%;}\n\n.footer-wrapper footer { margin: 0 auto; }\n"
  },
  {
    "path": "Nginx/static_pages/index/css/skeleton.css",
    "content": "/*\n* Skeleton V2.0.4\n* Copyright 2014, Dave Gamache\n* www.getskeleton.com\n* Free to use under the MIT license.\n* http://www.opensource.org/licenses/mit-license.php\n* 12/29/2014\n*/\n\n\n/* Table of contents\n––––––––––––––––––––––––––––––––––––––––––––––––––\n- Grid\n- Base Styles\n- Typography\n- Links\n- Buttons\n- Forms\n- Lists\n- Code\n- Tables\n- Spacing\n- Utilities\n- Clearing\n- Media Queries\n*/\n\n\n/* Grid\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n.container {\n  position: relative;\n  width: 100%;\n  max-width: 960px;\n  margin: 0 auto;\n  padding: 0 20px;\n  box-sizing: border-box; }\n.column,\n.columns {\n  width: 100%;\n  float: left;\n  box-sizing: border-box; }\n\n/* For devices larger than 400px */\n@media (min-width: 400px) {\n  .container {\n    width: 85%;\n    padding: 0; }\n}\n\n/* For devices larger than 550px */\n@media (min-width: 550px) {\n  .container {\n    width: 80%; }\n  .column,\n  .columns {\n    margin-left: 4%; }\n  .column:first-child,\n  .columns:first-child {\n    margin-left: 0; }\n\n  .one.column,\n  .one.columns                    { width: 4.66666666667%; }\n  .two.columns                    { width: 13.3333333333%; }\n  .three.columns                  { width: 22%;            }\n  .four.columns                   { width: 30.6666666667%; }\n  .five.columns                   { width: 39.3333333333%; }\n  .six.columns                    { width: 48%;            }\n  .seven.columns                  { width: 56.6666666667%; }\n  .eight.columns                  { width: 65.3333333333%; }\n  .nine.columns                   { width: 74.0%;          }\n  .ten.columns                    { width: 82.6666666667%; }\n  .eleven.columns                 { width: 91.3333333333%; }\n  .twelve.columns                 { width: 100%; margin-left: 0; }\n\n  .one-third.column               { width: 30.6666666667%; }\n  .two-thirds.column              { width: 65.3333333333%; }\n\n  .one-half.column                { width: 48%; }\n\n  /* Offsets */\n  .offset-by-one.column,\n  .offset-by-one.columns          { margin-left: 8.66666666667%; }\n  .offset-by-two.column,\n  .offset-by-two.columns          { margin-left: 17.3333333333%; }\n  .offset-by-three.column,\n  .offset-by-three.columns        { margin-left: 26%;            }\n  .offset-by-four.column,\n  .offset-by-four.columns         { margin-left: 34.6666666667%; }\n  .offset-by-five.column,\n  .offset-by-five.columns         { margin-left: 43.3333333333%; }\n  .offset-by-six.column,\n  .offset-by-six.columns          { margin-left: 52%;            }\n  .offset-by-seven.column,\n  .offset-by-seven.columns        { margin-left: 60.6666666667%; }\n  .offset-by-eight.column,\n  .offset-by-eight.columns        { margin-left: 69.3333333333%; }\n  .offset-by-nine.column,\n  .offset-by-nine.columns         { margin-left: 78.0%;          }\n  .offset-by-ten.column,\n  .offset-by-ten.columns          { margin-left: 86.6666666667%; }\n  .offset-by-eleven.column,\n  .offset-by-eleven.columns       { margin-left: 95.3333333333%; }\n\n  .offset-by-one-third.column,\n  .offset-by-one-third.columns    { margin-left: 34.6666666667%; }\n  .offset-by-two-thirds.column,\n  .offset-by-two-thirds.columns   { margin-left: 69.3333333333%; }\n\n  .offset-by-one-half.column,\n  .offset-by-one-half.columns     { margin-left: 52%; }\n\n}\n\n\n/* Base Styles\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n/* NOTE\nhtml is set to 62.5% so that all the REM measurements throughout Skeleton\nare based on 10px sizing. So basically 1.5rem = 15px :) */\nhtml {\n  font-size: 62.5%; }\nbody {\n  font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */\n  line-height: 1.6;\n  font-weight: 400;\n  font-family: \"Raleway\", \"HelveticaNeue\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  color: #222; }\n\n\n/* Typography\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 2rem;\n  font-weight: 300; }\nh1 { font-size: 4.0rem; line-height: 1.2;  letter-spacing: -.1rem;}\nh2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; }\nh3 { font-size: 3.0rem; line-height: 1.3;  letter-spacing: -.1rem; }\nh4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; }\nh5 { font-size: 1.8rem; line-height: 1.5;  letter-spacing: -.05rem; }\nh6 { font-size: 1.5rem; line-height: 1.6;  letter-spacing: 0; }\n\n/* Larger than phablet */\n@media (min-width: 550px) {\n  h1 { font-size: 5.0rem; }\n  h2 { font-size: 4.2rem; }\n  h3 { font-size: 3.6rem; }\n  h4 { font-size: 3.0rem; }\n  h5 { font-size: 2.4rem; }\n  h6 { font-size: 1.5rem; }\n}\n\np {\n  margin-top: 0; }\n\n\n/* Links\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\na {\n  color: #1EAEDB; }\na:hover {\n  color: #0FA0CE; }\n\n\n/* Buttons\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n.button,\nbutton,\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  display: inline-block;\n  height: 38px;\n  padding: 0 30px;\n  color: #555;\n  text-align: center;\n  font-size: 11px;\n  font-weight: 600;\n  line-height: 38px;\n  letter-spacing: .1rem;\n  text-transform: uppercase;\n  text-decoration: none;\n  white-space: nowrap;\n  background-color: transparent;\n  border-radius: 4px;\n  border: 1px solid #bbb;\n  cursor: pointer;\n  box-sizing: border-box; }\n.button:hover,\nbutton:hover,\ninput[type=\"submit\"]:hover,\ninput[type=\"reset\"]:hover,\ninput[type=\"button\"]:hover,\n.button:focus,\nbutton:focus,\ninput[type=\"submit\"]:focus,\ninput[type=\"reset\"]:focus,\ninput[type=\"button\"]:focus {\n  color: #333;\n  border-color: #888;\n  outline: 0; }\n.button.button-primary,\nbutton.button-primary,\ninput[type=\"submit\"].button-primary,\ninput[type=\"reset\"].button-primary,\ninput[type=\"button\"].button-primary {\n  color: #FFF;\n  background-color: #33C3F0;\n  border-color: #33C3F0; }\n.button.button-primary:hover,\nbutton.button-primary:hover,\ninput[type=\"submit\"].button-primary:hover,\ninput[type=\"reset\"].button-primary:hover,\ninput[type=\"button\"].button-primary:hover,\n.button.button-primary:focus,\nbutton.button-primary:focus,\ninput[type=\"submit\"].button-primary:focus,\ninput[type=\"reset\"].button-primary:focus,\ninput[type=\"button\"].button-primary:focus {\n  color: #FFF;\n  background-color: #1EAEDB;\n  border-color: #1EAEDB; }\n\n\n/* Forms\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\ninput[type=\"email\"],\ninput[type=\"number\"],\ninput[type=\"search\"],\ninput[type=\"text\"],\ninput[type=\"tel\"],\ninput[type=\"url\"],\ninput[type=\"password\"],\ntextarea,\nselect {\n  height: 38px;\n  padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */\n  background-color: #fff;\n  border: 1px solid #D1D1D1;\n  border-radius: 4px;\n  box-shadow: none;\n  box-sizing: border-box; }\n/* Removes awkward default styles on some inputs for iOS */\ninput[type=\"email\"],\ninput[type=\"number\"],\ninput[type=\"search\"],\ninput[type=\"text\"],\ninput[type=\"tel\"],\ninput[type=\"url\"],\ninput[type=\"password\"],\ntextarea {\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none; }\ntextarea {\n  min-height: 65px;\n  padding-top: 6px;\n  padding-bottom: 6px; }\ninput[type=\"email\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"password\"]:focus,\ntextarea:focus,\nselect:focus {\n  border: 1px solid #33C3F0;\n  outline: 0; }\nlabel,\nlegend {\n  display: block;\n  margin-bottom: .5rem;\n  font-weight: 600; }\nfieldset {\n  padding: 0;\n  border-width: 0; }\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  display: inline; }\nlabel > .label-body {\n  display: inline-block;\n  margin-left: .5rem;\n  font-weight: normal; }\n\n\n/* Lists\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nul {\n  list-style: circle inside; }\nol {\n  list-style: decimal inside; }\nol, ul {\n  padding-left: 0;\n  margin-top: 0; }\nul ul,\nul ol,\nol ol,\nol ul {\n  margin: 1.5rem 0 1.5rem 3rem;\n  font-size: 90%; }\nli {\n  margin-bottom: 1rem; }\n\n\n/* Code\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\ncode {\n  padding: .2rem .5rem;\n  margin: 0 .2rem;\n  font-size: 90%;\n  white-space: nowrap;\n  background: #F1F1F1;\n  border: 1px solid #E1E1E1;\n  border-radius: 4px; }\npre > code {\n  display: block;\n  padding: 1rem 1.5rem;\n  white-space: pre; }\n\n\n/* Tables\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nth,\ntd {\n  padding: 12px 15px;\n  text-align: left;\n  border-bottom: 1px solid #E1E1E1; }\nth:first-child,\ntd:first-child {\n  padding-left: 0; }\nth:last-child,\ntd:last-child {\n  padding-right: 0; }\n\n\n/* Spacing\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nbutton,\n.button {\n  margin-bottom: 1rem; }\ninput,\ntextarea,\nselect,\nfieldset {\n  margin-bottom: 1.5rem; }\npre,\nblockquote,\ndl,\nfigure,\ntable,\np,\nul,\nol,\nform {\n  margin-bottom: 2.5rem; }\n\n\n/* Utilities\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n.u-full-width {\n  width: 100%;\n  box-sizing: border-box; }\n.u-max-full-width {\n  max-width: 100%;\n  box-sizing: border-box; }\n.u-pull-right {\n  float: right; }\n.u-pull-left {\n  float: left; }\n\n\n/* Misc\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nhr {\n  margin-top: 3rem;\n  margin-bottom: 3.5rem;\n  border-width: 0;\n  border-top: 1px solid #E1E1E1; }\n\n\n/* Clearing\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n\n/* Self Clearing Goodness */\n.container:after,\n.row:after,\n.u-cf {\n  content: \"\";\n  display: table;\n  clear: both; }\n\n\n/* Media Queries\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n/*\nNote: The best way to structure the use of media queries is to create the queries\nnear the relevant code. For example, if you wanted to change the styles for buttons\non small devices, paste the mobile query code up in the buttons section and style it\nthere.\n*/\n\n\n/* Larger than mobile */\n@media (min-width: 400px) {}\n\n/* Larger than phablet (also point when grid becomes active) */\n@media (min-width: 550px) {}\n\n/* Larger than tablet */\n@media (min-width: 750px) {}\n\n/* Larger than desktop */\n@media (min-width: 1000px) {}\n\n/* Larger than Desktop HD */\n@media (min-width: 1200px) {}\n"
  },
  {
    "path": "Nginx/static_pages/index/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n  <!-- Basic Page Needs\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n  <meta charset=\"utf-8\">\n  <title>eSim and Arduino on Cloud</title>\n  <meta name=\"description\" content=\"eSim and Arduino on Cloud Simulator : FRG-FOSSEE Team\">\n\n  <!-- Mobile Specific Metas\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n  <!-- FONT\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n  <link href=\"//fonts.googleapis.com/css?family=Raleway:400,300,600\" rel=\"stylesheet\" type=\"text/css\">\n\n\n  <!-- CSS\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n  <link rel=\"stylesheet\" href=\"css/normalize.css\">\n  <link rel=\"stylesheet\" href=\"css/skeleton.css\">\n  <style>\n    html,\n    body {\n      min-height: 100%;\n      /* font-size: 1.5em; */\n      line-height: 1.6;\n      font-weight: 400;\n      font-family: \"Raleway\", \"HelveticaNeue\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n      color: #222;\n    }\n    .button {\n      border-color: #33C3F0;\n    }\n    footer {\n      width: 100%;\n      display: flex;\n      font-size: 1.2em;\n      align-items: center;\n      justify-content: center;\n      margin-top: 30vh;\n    }\n\n    .row {\n      margin-top: 40vh;\n    }\n\n    @media (max-width: 550px) {\n      footer {\n        flex-direction: column;\n      }\n\n      .row {\n        margin-top: 10vh;\n      }\n\n      .column {\n        margin-bottom: 2em;\n      }\n    }\n  </style>\n  <!-- Favicon\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n  <!-- <link rel=\"icon\" type=\"image/png\" href=\"images/favicon.png\"> -->\n</head>\n<body>\n  <!-- Primary Page Layout\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n  <div class=\"container\">\n    <div class=\"row\">\n      <div class=\"one-half column\" style=\"padding-right: 2em;\">\n        <h2>Arduino on Cloud</h4>\n          <p>Connect virtual components to arduino boards, write code in your browser and witness it come alive!</p>\n          <a class=\"button\" href=\"./arduino\">Launch</a>\n      </div>\n      <div class=\"one-half column\">\n        <div>\n          <h2>eSim on Cloud</h4>\n            <p>Build digital circuits using KiCAD components, tinker with simulation parameters and visualize it all\n              with pretty graphs!</p>\n            <a class=\"button\" href=\"./eda\">Launch</a>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div>\n    <footer>\n      This work is licensed under &nbsp;<a href=\"https://www.gnu.org/licenses/gpl-3.0.en.html\">GNU General Public\n        License\n        v3.0</a>. Contribute us at\n      <a href=\"https://github.com/frg-fossee/eSim-Cloud\" style=\"margin-left: 8px;\">\n        <img src=\"./GitHub-Mark-32px.png\" alt=\"Github eSim on Cloud\">\n      </a>\n    </footer>\n  </div> <!-- end footer div.container -->\n  </div>\n  <!-- End Document\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n</body>\n</html>"
  },
  {
    "path": "README.md",
    "content": "<h1 align=\"center\"> \neSim and Arduino on Cloud \n</h1>\n<h6 align=\"center\"> \n\n<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->\n[![All Contributors](https://img.shields.io/badge/all_contributors-13-orange.svg?style=flat-square)](#contributors-)\n<!-- ALL-CONTRIBUTORS-BADGE:END -->\n\n[![Documentation Status](https://readthedocs.org/projects/esim-cloud/badge/?version=latest)](https://esim-cloud.readthedocs.io/en/latest/?badge=latest)\n[![Discord](https://img.shields.io/discord/737767491266281583?color=blue&label=chat%20with%20us&logo=discord)](https://discord.gg/cZbDD8K)\n\n[![CodeFactor](https://www.codefactor.io/repository/github/frg-fossee/esim-cloud/badge)](https://www.codefactor.io/repository/github/frg-fossee/esim-cloud)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-important)](https://img.shields.io/badge/PRs-welcome-important)\n![GitHub repo size](https://img.shields.io/github/repo-size/frg-fossee/eSim-Cloud?color=ff69b4&logo=git&logoColor=ff69b4)\n![Django Build and Tests](https://github.com/frg-fossee/eSim-Cloud/workflows/Django%20Build%20and%20Tests/badge.svg?branch=develop)\n![Angular Build and Tests](https://github.com/frg-fossee/eSim-Cloud/workflows/Angular%20Build%20and%20Tests/badge.svg?branch=develop)\n![React Build and Tests](https://github.com/frg-fossee/eSim-Cloud/workflows/React%20Build%20and%20Tests/badge.svg?branch=develop)\n![Containers](https://github.com/frg-fossee/eSim-Cloud/workflows/Containers/badge.svg)\n![ESLint eda-frontend](https://github.com/frg-fossee/eSim-Cloud/workflows/ESLint%20eda-frontend/badge.svg?branch=develop)\n\n[Contributing](#Contributing) | [Credits](#Credits)\n</h6>\n\n---\n\n## eSim on Cloud\nThis system allows the users to draw analog and digital circuits and simulate them. The users have a facility to drag and drop components from the left pane onto the schematic grid on the right pane. The components on the grid are connected using wires. The circuit can then be simulated using the different simulation parameters (DC Solver, DC Sweep, Transient analysis, and AC analysis). The basic ERC check enables the users to find out errors if any. The size of the schematic grid can be changed from A1 to A5 paper sizes along with portrait and landscape modes. The users can also print the circuit or save it in pdf format for documentation purposes. A demo is shown below.\n\n![eSim Demo](demo/demo-esim.gif)\n\n## Arduino on Cloud\nThis system allows the users to drag and drop Arduino components from the left pane onto the working space on the right. The pins of the Arduino board can be connected to various input/output devices like LED, motor, push button, etc using wires. There is also a facility to change the color of wires, LEDs, and such components, so as to differentiate the easily. The users can then proceed to write their code in the code window which is then simulated. There is an option for the users to print or save it in pdf format for documentation purposes. The basic ERC check enables the users to find out errors if any. A demo is shown below.\n\n![Arduino Demo](demo/demo-arduino.gif)\n\n## Installation\n* This is only a one time process\n* Ubuntu (Requirements)\n   * Install [Docker](https://docs.docker.com/desktop/install/ubuntu/)\n   * Install docker compose: ```sudo apt get install docker-compose``` \n* Windows (Requirements)\n   * Install WSL (Windows Subsystem for Linux)\n     * Open PowerShell or Windows Command Prompt in administrator mode by right-clicking and selecting \"Run as administrator\"\n     * ```wsl --install```\n     * Restart your machine.\n   * Install [Docker](https://docs.docker.com/desktop/install/windows-install/)\n   * Start the docker desktop application\n* Mac (Requirements)\n   * Install [Docker](https://docs.docker.com/desktop/install/mac-install/)\n   * Start the docker desktop application\n* Setting up\n   * Fork this repository. Make sure that you fork all the branches.\n   * Windows users: Use the Ubuntu App to start the terminal and then proceed ahead. Do not user PowerShell.\n   * Clone your forked repo on your machine: ```git clone https://github.com/<yourGitHubUserName>/eSim-Cloud.git```\n   * ```cd eSim-Cloud```\n   * ```git checkout develop```: This will switch to the develop branch\n   * ```/bin/bash first_run.dev.sh```: This will set up and install all the necessary packages and docker images. Depending on your connection it would take around 40 to 45 minutes\n\n## Starting the system\n* Before proceeding ahead, start your Docker Desktop application (Windows and Mac users only)\n* Open (terminal - Ubuntu/Mac users) (WSL ubuntu app - Windows users)\n\n### Development Environment (for coders/developers)\n* ```docker-compose -f docker-compose.dev.yml --env-file .env up ```\n* eSim: Browse http://localhost/ and click the Launch button under eSim\n* Login credentials\n  * Username: admin\n  * Password: admin\n* Arduino: Browse http://localhost:4200/\n\n### Production Environment\n* ```cp .env .env.prod ```: Only for the first time\n* ```docker-compose -f docker-compose.prod.yml --env-file .env.prod up```\n* Browse http://localhost/ and click the launch button for eSim and Arduino, respectively\n* Login credentials\n  * Username: admin\n  * Password: admin\n\n### Applying Migrations (Only if needed)\n* At times, while setting up the system, the database might not get set up as required. In such a case, when you visit the gallery of eSim or Arduino, you will not find the sample circuits. Moreover, in eSim, the components in the left pane will not be loaded. In such a case, do the following\n   * Make sure that the dockers are running i.e. you have started either the development or production environment\n   * Open up a new terminal.  \n   * ```docker ps```  This command displays the container ids of all running docker containers.\n   * Look for Django's container ID. It would be something like 'c4ac75dd1937'\n   * ```docker exec -it <ContainerID> /bin/bash```\n   * ```sh migrations.sh```\n\n## Other Commands\n* To view Django admin panel\n  * Browse http://localhost/api/admin and login with the following credentials\n    * Username: admin\n    * Password: admin\n* If port 80 is already being used on your system, due which nginx is unable to start for this system and throws an error, you can kill the existing process that uses port 80\n   * ```sudo kill -9 $(sudo lsof -t -i:80)``` \n* To start dockers on the server \n   * ``` docker-compose -f docker-compose.prod.yml --env-file .env.prod up --scale django=2 --scale celery=3 -d```\n   * Note: -d option runs the dockers in the background. To view the logs in the terminal, remove this option\n   * Scale django and celerey as required. Remove them, if the server is unable to take the load\n* Restart nginx\n  * Development environment: ``` docker-compose -f docker-compose.dev.yml --env-file .env restart nginx```\n  * Production environment: ``` docker-compose -f docker-compose.prod.yml --env-file .env.prod restart nginx``` \n* Manually build containers\n  * ```docker-compose -f docker-compose.dev.yml --env-file .env build```\n* Run backend container only\n  * ```docker-compose -f docker-compose.dev.yml --env-file .env up django```\n* Run eSim along with backend\n  * ``` docker-compose -f docker-compose.dev.yml --env-file .env up eda-frontend ```\n* Run Arduino along with backend\n  * ``` docker-compose -f docker-compose.dev.yml --env-file .env up arduino-frontend ```\n\n## Documentation \nThe latest version of documentation for the project is maintained on [esim-cloud.readthedocs.io](https://esim-cloud.readthedocs.io/)\n\n## Tech stack\n* Simulation backend\n  * ngspice (eSim)\n  * Arduino compiler \n* Middleware\n  * Django \n  * REST APIs \n  * Celery \n  * Redis \n* Frontend\n  * React\n  * mxgraph\n  * Angular\n  * RaphaelJS\n  * [AVR8js simulator - MIT License](https://github.com/wokwi/avr8js) Credits to [Uri Shaked](https://github.com/urish)\n* Database\n  * MySQL\n  * Postgres\n  * MongoDB\n* Production\n  * nginx\n  * dockers\n* Testing\n  * GitHub actions  \n\n## Docker Containers\n![Docker Containers](docs/images/docker.png)\n\n## Contributing \nWant to contribute? See our [contributing guidelines](CONTRIBUTING.md). Contributions in any form are welcome.\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"http://darshkpatel.com\"><img src=\"https://avatars.githubusercontent.com/u/11258286?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Darsh Patel</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=darshkpatel\" title=\"Code\">💻</a> <a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=darshkpatel\" title=\"Documentation\">📖</a> <a href=\"#infra-darshkpatel\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n    <td align=\"center\"><a href=\"https://www.linkedin.com/in/darshan-sudake-a640ba1b1/\"><img src=\"https://avatars.githubusercontent.com/u/42094875?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Darshan Sudake</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=dssudake\" title=\"Code\">💻</a> <a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=dssudake\" title=\"Documentation\">📖</a> <a href=\"#design-dssudake\" title=\"Design\">🎨</a></td>\n    <td align=\"center\"><a href=\"https://felixfaisal.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/42486737?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>felixfaisal</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=felixfaisal\" title=\"Code\">💻</a> <a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=felixfaisal\" title=\"Documentation\">📖</a> <a href=\"#design-felixfaisal\" title=\"Design\">🎨</a></td>\n    <td align=\"center\"><a href=\"https://github.com/rohitgeddam\"><img src=\"https://avatars.githubusercontent.com/u/48797475?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>rohitgeddam</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=rohitgeddam\" title=\"Code\">💻</a> <a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=rohitgeddam\" title=\"Documentation\">📖</a> <a href=\"#design-rohitgeddam\" title=\"Design\">🎨</a></td>\n    <td align=\"center\"><a href=\"http://navonildas.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/29132316?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Navonil Das</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=NavonilDas\" title=\"Code\">💻</a> <a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=NavonilDas\" title=\"Documentation\">📖</a> <a href=\"#design-NavonilDas\" title=\"Design\">🎨</a></td>\n    <td align=\"center\"><a href=\"https://github.com/meet-10\"><img src=\"https://avatars.githubusercontent.com/u/61341284?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Meet10</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=meet-10\" title=\"Code\">💻</a> <a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=meet-10\" title=\"Documentation\">📖</a> <a href=\"#design-meet-10\" title=\"Design\">🎨</a></td>\n    <td align=\"center\"><a href=\"https://github.com/gupta-arpit\"><img src=\"https://avatars.githubusercontent.com/u/12170429?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>gupta-arpit</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=gupta-arpit\" title=\"Code\">💻</a> <a href=\"#design-gupta-arpit\" title=\"Design\">🎨</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"http://ikartikgautam.web.app/\"><img src=\"https://avatars.githubusercontent.com/u/39825660?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kartik Gautam</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=ikartikgautam\" title=\"Code\">💻</a> <a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=ikartikgautam\" title=\"Documentation\">📖</a> <a href=\"#design-ikartikgautam\" title=\"Design\">🎨</a></td>\n    <td align=\"center\"><a href=\"https://github.com/kumanik5661\"><img src=\"https://avatars.githubusercontent.com/u/42597251?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Nikhil Kumar</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=kumanik5661\" title=\"Code\">💻</a> <a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=kumanik5661\" title=\"Documentation\">📖</a> <a href=\"#design-kumanik5661\" title=\"Design\">🎨</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Kaustuv942\"><img src=\"https://avatars.githubusercontent.com/u/56028031?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaustuv K Chattopadhyay</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=Kaustuv942\" title=\"Code\">💻</a> <a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=Kaustuv942\" title=\"Documentation\">📖</a> <a href=\"#design-Kaustuv942\" title=\"Design\">🎨</a></td>\n    <td align=\"center\"><a href=\"https://akshat-sharma.me\"><img src=\"https://avatars.githubusercontent.com/u/35724794?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Akshat Sharma</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=akshat2602\" title=\"Code\">💻</a> <a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=akshat2602\" title=\"Documentation\">📖</a> <a href=\"#design-akshat2602\" title=\"Design\">🎨</a></td>\n    <td align=\"center\"><a href=\"http://rugvedsomwanshi.me\"><img src=\"https://avatars.githubusercontent.com/u/16833604?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Rugved Somwanshi</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=Rugz007\" title=\"Code\">💻</a> <a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=Rugz007\" title=\"Documentation\">📖</a> <a href=\"#design-Rugz007\" title=\"Design\">🎨</a></td>\n    <td align=\"center\"><a href=\"https://rajatmaheshwari.me/\"><img src=\"https://avatars.githubusercontent.com/u/54249328?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Rajat Maheshwari</b></sub></a><br /><a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=rajatmaheshwari2512\" title=\"Code\">💻</a> <a href=\"https://github.com/frg-fossee/eSim-Cloud/commits?author=rajatmaheshwari2512\" title=\"Documentation\">📖</a> <a href=\"#design-rajatmaheshwari2512\" title=\"Design\">🎨</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n"
  },
  {
    "path": "ansible/ansible-playbook.yml",
    "content": "---\n- import_playbook: configure-instance.yml\n- import_playbook: configure-containers.yml\n\n"
  },
  {
    "path": "ansible/configure-containers.yml",
    "content": "- name: Configure Docker\n  hosts: all\n  become: true\n  tasks:\n      - name: Stop service httpd, if running\n        service:\n          name: httpd\n          state: stopped\n          enabled: no\n        ignore_errors: yes\n\n      - name: Stop service apache2, if running\n        service:\n          name: apache2\n          state: stopped\n          enabled: no\n        ignore_errors: yes\n\n      - name: Clone eSim Repo\n        git:\n          repo: https://github.com/frg-fossee/eSim-Cloud.git\n          dest: /home/{{ansible_user_id}}/eSim-Cloud\n          version: develop\n\n      # - name: Run First Run Script\n      #   shell: cd /home/{{ansible_user_id}}/eSim-Cloud && ./first_run.dev.sh\n      - name: Stop Existing Containers\n        docker_compose:\n          project_src: /home/{{ansible_user_id}}/eSim-Cloud\n          files: docker-compose.dev.yml\n          state: absent\n        register: docker_output\n      - name: Check State\n        debug:\n         var: docker_output\n\n      - name: Start DB Container\n        docker_compose:\n          project_src: /home/{{ansible_user_id}}/eSim-Cloud\n          files: docker-compose.dev.yml\n          services: db\n          state: present\n      - name: Check db running\n        assert:\n          that:\n            - \"db['esim-cloud_db_1'].state.running\"\n\n      - name: Start Django Container\n        docker_compose:\n          project_src: /home/{{ansible_user_id}}/eSim-Cloud\n          files: docker-compose.dev.yml\n          services: django\n          state: present\n      - name: Check django running\n        assert:\n          that:\n            - \"django['esim-cloud_django_1'].state.running\"\n"
  },
  {
    "path": "ansible/configure-instance.yml",
    "content": "- name: Configue Docker\n  hosts: all\n  become: true\n\n  tasks:\n\n      - name: Install aptitude using apt\n        apt: name=aptitude state=latest update_cache=yes force_apt_get=yes\n\n      - name: Install required system packages\n        apt:\n         state: latest\n         update_cache: yes\n         pkg:\n          - apt-transport-https\n          - ca-certificates\n          - curl\n          - software-properties-common\n          - python3-pip\n          - virtualenv\n          - python3-setuptools\n\n      - name: Add Docker GPG apt Key\n        apt_key:\n          url: https://download.docker.com/linux/{{ansible_distribution|lower}}/gpg\n          state: present\n\n      - name: Add Docker Repository\n        apt_repository:\n          repo: deb [arch=amd64] https://download.docker.com/linux/{{ansible_distribution|lower}} {{ansible_distribution_release}} stable\n          state: present\n\n      - name: Update apt and install docker-ce\n        apt: update_cache=yes name=docker-ce state=latest\n\n      - name: Install Docker Module for Python\n        pip:\n          name: docker\n      - name: Install Docker-Compose Module for Python\n        pip:\n          name: docker-compose\n\n      - name: add user mod\n        command: usermod -aG docker {{ansible_user_id}}\n\n      - name: download docker-compose\n        get_url:\n          url: \"https://github.com/docker/compose/releases/download/1.25.5/docker-compose-{{ ansible_system }}-{{ ansible_userspace_architecture }}\"\n          dest: /usr/local/bin/docker-compose\n          mode: 'u+x,g+x'\n\n      - name: Docker-compose permissions\n        file:\n          src: /usr/local/bin/docker-compose\n          dest: /usr/bin/docker-compose\n          state: link\n\n"
  },
  {
    "path": "docker-compose.dev.yml",
    "content": "version: '3'\nservices:\n\n  nginx:\n    image: nginx\n    ports:\n      - 80:80\n    volumes:\n      - tmp_vol:/tmp\n      - ./Nginx/dev.conf.d:/etc/nginx/conf.d\n      - ./Nginx/static_pages:/usr/share/nginx/static_pages\n      - ./esim-cloud-backend/static:/usr/share/nginx/django_static\n      - ./esim-cloud-backend/file_storage:/usr/share/nginx/django_file_storage\n      - ./esim-cloud-backend/kicad-symbols/:/usr/share/nginx/kicad-libs\n    depends_on:\n      - django\n      - eda-frontend\n      - arduino-frontend\n\n  eda-frontend:\n    image: \"docker.pkg.github.com/frg-fossee/esim-cloud/eda-frontend:dev\"\n    build: ./eda-frontend/\n    command: >\n      sh -c \"npm install &&\n             npm start\"\n    ports:\n      - \"3000:3000\"\n    volumes:\n      - ./eda-frontend:/code\n    environment:\n      - NODE_ENV=development\n      - \"PUBLIC_URL=${EDA_PUBLIC_URL}\"\n    stdin_open: true\n    depends_on:\n      - django\n      - celery\n      - redis\n      - db\n\n  arduino-frontend:\n    image: \"docker.pkg.github.com/frg-fossee/esim-cloud/arduino-frontend:dev\"\n    build: ./ArduinoFrontend/\n    command: >\n      sh -c \"npm install &&\n             npm start\"\n\n    ports:\n      - \"4200:4200\"\n\n    volumes:\n      - ./ArduinoFrontend:/code\n    environment:\n      - NODE_ENV=development\n    depends_on:\n      - django\n      - celery\n      - redis\n      - db\n\n  django:\n    image: \"docker.pkg.github.com/frg-fossee/esim-cloud/django:dev\"\n    build: ./esim-cloud-backend/\n    command: \"python3 manage.py runserver 0.0.0.0:8000\"\n    ports:\n      - \"8000:8000\"\n    volumes:\n      - ./esim-cloud-backend:/code\n      - run_vol:/var/run\n      - cache_vol:/var/cache\n      - tmp_vol:/tmp\n    depends_on:\n        - redis\n        - db\n        - celery\n\n    env_file:\n      - .env\n\n    links:\n        - \"redis:redis_cache\"\n        - \"db:mysql\"\n\n  celery:\n    image: \"docker.pkg.github.com/frg-fossee/esim-cloud/celery:dev\"\n    build: ./esim-cloud-backend/\n    command: celery -A esimCloud.celery worker -l info --concurrency=1\n    links:\n        - \"redis:redis_cache\"\n        - \"db:postgres\"\n    env_file:\n          - .env\n\n    volumes:\n      - ./esim-cloud-backend:/code\n      - run_vol:/var/run\n      - cache_vol:/var/cache\n      - tmp_vol:/tmp\n    depends_on:\n        - redis\n        - db\n\n  redis:\n      image: \"redis:${TAG_REDIS}\"\n      environment:\n        - ALLOW_EMPTY_PASSWORD=yes\n        - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL\n      volumes:\n          - ./redis_data:/data\n\n  # Uncomment this and Change appropriate env variables to switch to mysql\n  # db:\n  #   image: \"mysql:${TAG_MYSQL}\"\n  #   command: --default-authentication-plugin=mysql_native_password\n  #   env_file:\n  #     - .env\n  #   volumes:\n  #     - ./mysql_data:/var/lib/mysql\n\n  db:\n    image: postgres\n    volumes:\n      - ./postgres_data:/var/lib/postgresql/data/\n    env_file:\n      - .env\n\nvolumes:\n  run_vol:\n    driver_opts:\n      type: tmpfs\n      device: tmpfs\n  cache_vol:\n    driver_opts:\n      type: tmpfs\n      device: tmpfs\n  tmp_vol:\n    driver_opts:\n      type: tmpfs\n      device: tmpfs\n"
  },
  {
    "path": "docker-compose.prod.yml",
    "content": "version: '3'\nservices:\n\n  nginx:\n    image: nginx\n    ports:\n      - 80:80\n    volumes:\n      - tmp_vol:/tmp\n      - ./Nginx/conf.d:/etc/nginx/conf.d\n      - ./Nginx/static_pages:/usr/share/nginx/static_pages\n      - ./eda-frontend/build:/usr/share/nginx/eda\n      - ./ArduinoFrontend/dist:/usr/share/nginx/arduino-build\n      - ./esim-cloud-backend/static:/usr/share/nginx/django_static\n      - ./esim-cloud-backend/file_storage:/usr/share/nginx/django_file_storage\n      - ./esim-cloud-backend/kicad-symbols/:/usr/share/nginx/kicad-libs\n    depends_on:\n      - django\n      - eda-frontend\n      - arduino-frontend\n\n  eda-frontend:\n    image: \"docker.pkg.github.com/frg-fossee/esim-cloud/eda-frontend:master\"\n    build: ./eda-frontend/\n    command: >\n      sh -c \"npm install &&\n           npm run build\"\n    environment:\n      - \"PUBLIC_URL=${EDA_PUBLIC_URL}\"\n    volumes:\n      - ./eda-frontend:/code\n\n\n\n  arduino-frontend:\n    image: \"docker.pkg.github.com/frg-fossee/esim-cloud/arduino-frontend:master\"\n    build: ./ArduinoFrontend/\n    command: >\n      sh -c \"npm install &&\n             npm run ng -- build --prod --aot --base-href ${ARDUINO_BASE_HREF}\"\n    # environment:\n    #   - NODE_ENV=production\n    volumes:\n      - ./ArduinoFrontend:/code\n\n\n\n  django:\n    image: \"docker.pkg.github.com/frg-fossee/esim-cloud/django:master\"\n    build: ./esim-cloud-backend/\n    command: >\n      sh -c \"gunicorn -w ${GUNICORN_WORKERS} --reload -b 0.0.0.0:8000 --log-level info esimCloud.wsgi\"\n    volumes:\n      - ./esim-cloud-backend:/code\n      - run_vol:/var/run\n      - cache_vol:/var/cache\n      - tmp_vol:/tmp\n    depends_on:\n        - redis\n        - db\n        - celery\n    env_file:\n      - .env.prod\n    environment:\n      - DJANGO_DEBUG=True\n    links:\n      - \"redis:redis\"\n      - \"db:db\"\n\n\n  celery:\n    image: \"docker.pkg.github.com/frg-fossee/esim-cloud/celery:master\"\n    build: ./esim-cloud-backend/\n    command: \"celery -A esimCloud.celery worker -l info --concurrency=${CELERY_WORKERS}\"\n    links:\n        - \"redis:redis_cache\"\n        - \"db:postgres\"\n    env_file:\n          - .env.prod\n    environment:\n          - DJANGO_DEBUG=True\n    volumes:\n      - ./esim-cloud-backend:/code\n      - run_vol:/var/run\n      - cache_vol:/var/cache\n      - tmp_vol:/tmp\n    depends_on:\n      - redis\n      - db\n    links:\n      - \"redis:redis\"\n      - \"db:db\"\n\n    deploy:\n      replicas: 3\n\n  redis:\n      image: \"redis:${TAG_REDIS}\"\n      environment:\n        - ALLOW_EMPTY_PASSWORD=yes\n        - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL\n      volumes:\n          - ./redis_data:/data\n\n  # Uncomment this and Change appropriate env variables to switch to mysql\n  # db:\n  #   image: \"mysql:${TAG_MYSQL}\"\n  #   command: --default-authentication-plugin=mysql_native_password\n  #   env_file:\n  #     - .env.prod\n  #   volumes:\n  #     - ./mysql_data:/var/lib/mysql\n\n  db:\n    image: postgres\n    volumes:\n      - ./postgres_data:/var/lib/postgresql/data/\n    env_file:\n      - .env.prod\n\nvolumes:\n  run_vol:\n    driver_opts:\n      type: tmpfs\n      device: tmpfs\n  cache_vol:\n    driver_opts:\n      type: tmpfs\n      device: tmpfs\n  tmp_vol:\n    driver_opts:\n      type: tmpfs\n      device: tmpfs\n"
  },
  {
    "path": "docs/arduino/components.rst",
    "content": "Creating an Component for Simulator\n=============================================\n\n\n.. toctree::\n    :numbered:\n    :maxdepth: 2\n    :caption: Contents:"
  },
  {
    "path": "docs/arduino/index.rst",
    "content": "Arduino Frontend Guide\n=============================================\n************************\nServe on a Local Machine\n************************\n**Note: Required Node JS and Angular 7**\n \n * For installing nodejs and npm visit ( https://nodejs.org/en/download/)\n \n  Open Command prompt (or powershell) and enter the following:\n  ::\n    \t\n    npm install -g @angular/cli\n\t\n    ng --version \n \n \n\nWithout Docker\n###############\n\nPlease Follow the Steps.\n\n1. Open Command promt\n\n2. Navigate to folder **dist/eSim-cloud/ArduinoFrontend/**\n\n3. Execute the following command to start Angular server:\n   ::\n\t\n\tng serve\n4. For more serve commands visit (https://angular.io/cli/serve)\n\n5. To build the app and deploy your Angular application to a remote server:\n   ::\n      \n        ng build --prod \n\t\n\t\n\n\nWith Docker\n###########\n\nConfiguring Production Environment\n==================================\n\n* Install Docker and docker-compose for server OS\n* ``git clone git@github.com:frg-fossee/eSim-Cloud.git && cd eSim-Cloud``\n* ``cp .env .env.prod`` **(PLEASE CHANGE DEFAULT CREDENTIALS IN THE .env.prod FILE)**\n* ``docker-compose -f docker-compose.prod.yml --env-file .env.prod up --scale django=2 --scale celery=3 -d``\n\nConfiguring Development Environment\n===================================\n\nSetting up docker containers\n----------------------------\n\n* Install docker-ce and docker-compose for your OS\n* To Build/ReBuild necessary containers using\n\n  ``docker-compose -f docker-compose.dev.yml build``\n\nFor Frontend Containers and backend containers\n----------------------------------------------\n\n**( Please note these containers are only for dev environment, in production compiled files will be served by nginx)**\n\n* To run arduino-frontend along with all backend containers\n  \n  ``docker-compose -f docker-compose.dev.yml up arduino-frontend``\n  \n\nSupported Browsers\n******************\nOur Web Application is supported by the following browsers:\n\n* Google Chrome\n* Mozilla Firefox\n* Opera\n* Microsoft Edge\n* Safari\n\n\n\n.. toctree::\n    :maxdepth: 2\n    :titlesonly: \n    :glob:\n\n    components.rst "
  },
  {
    "path": "docs/arduinoCloud/features.rst",
    "content": "========\nFeatures\n========\n\nThe Arduino circuit designer is divided into 2 panes. The left pane consists of the components, while the right pane consists of a workspace on which the components will be dropped and the circuit will be designed. More details are given below.\n\nComponent categories\n####################\nThe components are categorized as follows:\n\n+----------------+---------------------------------------------------------------------------------------------------------------------------------+\n| Categories     | Components                                                                                                                      |\n+================+=================================================================================================================================+\n| General        | Resistor, Breadboard                                                                                                            |\n+----------------+---------------------------------------------------------------------------------------------------------------------------------+\n| Controllers    | Arduino UNO                                                                                                                     |\n+----------------+---------------------------------------------------------------------------------------------------------------------------------+\n| Output         | Buzzer, LED, Motor, LCD, Servo Motor, 7 segment display, RGB LED                                                                | \n+----------------+---------------------------------------------------------------------------------------------------------------------------------+\n| Input          | Push button, Ultrasonic Distance Sensor, PIR Sensor, Slide switch, Photo sensor, Temperature Sensor, Potentiometer, Gas Sensor  |\n+----------------+---------------------------------------------------------------------------------------------------------------------------------+\n| Sources        | 9v Battery, Coin cell 3v                                                                                                        |\n+----------------+---------------------------------------------------------------------------------------------------------------------------------+\n| Drivers        | Motor driver L298N                                                                                                              |\n+----------------+---------------------------------------------------------------------------------------------------------------------------------+\n| Miscellaneous  | Label, Relay module                                                                                                             |\n+----------------+---------------------------------------------------------------------------------------------------------------------------------+\n\nWorkspace\n#########\nA workspace is a place where the user can drop the components and design the arduino circuit by connecting the components using wires. \n\nComponent Info / Properties\n###########################\nThe properties for each component can be set by clicking on the component and changing/setting the desired value in the box on the right. For example, one can change the color of LED, set resistence value, etc. To know more information about the component,  one can click the ``View Info`` button.\n\nERC Check\n#########\nBasic ERC check is done for simulating a circuit. For example, if the wires are connected or not.\n\nView/Download Component List\n############################\nThe list of components and its quantity which are present on the workspace can be viewed or downloaded in CSV format. This come handy for maintaining a check list or a buying list, when one switches from the web based arduino designer to a physical one.\n\nExport \n######\nThe circuit can be exported as ``jpeg``, ``png``, and ``svg``. This is useful for documenting and printing.\n\nCode editor\n###########\nA code editor is a place where the users will write the code (logic) for simulation. This is nothing but ``ino`` file, which can be downloaded for use in Arduino IDE. There is also a facility to include the supported header files like EEPROM, LiquidCrystal, Servo, SoftwareSerial, Wire, and SPI.\n\nSimulator\n#########\nThe Simulation toggle button starts/stops the simulation. The console window displays the logs and output if any for the simulation.\n\nSaving and Re-opening\n#####################\nThe circuits are saved only of an authenticated user and are displayed on the user dashboard. The same can be reopened as well for further editing.\n\nDashboard\n#########\nA place where the authenticated user can view the different circuits designed by him/her.\n\nGallery\n#######\nA set of example projects (circuit design and code) which can be referred by the users. This is an addon material helpful for the novice users who need to get a feel of the system and the circuit design.\n"
  },
  {
    "path": "docs/arduinoCloud/flow.rst",
    "content": "========================\nArduino Development Flow\n========================\n\nDrawing Components and Rendering in Browser\n###########################################\n\n* Each component is drawn in Inkscape which is exported as ``.png`` and ``.svg``. These files are stored in ``/ArduinoFrontend/src/assets/images/components/``. This is a one time process. \n* The ``png`` files (components) are rendered in the components pane (left pane) in the browser.\n* When the components are dropped onto the workspace on the right, the components are rendered using \n\n  * ``SVG`` if that component does not have any animation, i.e. they remain static during entire the simulation process \n  * ``Raphael``: if that component produces some animation during the simulation. A basic example would be: glowing of LED. \n\n* The details of these components like ``name``, ``pins``, ``drawing path``, ``voltage``, ``current``, ``frequency``, ``color of LED``, etc., are stored in respective json files ``/ArduinoFrontend/src/assets/jsons/``\n\nCapturing Arduino Project Schematic\n###################################\n\n* The components from the left pane are dropped onto the workspace. The components and their connections are stored in JSON format. \n\nSimulation\n##########\n\n* At first, a basic check is done whether the required components are connected or not.\n* The code written is then compiled by ``Arduino CLI`` which generates a ``hex code``. \n* This hex code is then passed to ``AVR8js`` which simulates the components in the browser. \n\n\n"
  },
  {
    "path": "docs/arduinoCloud/index.rst",
    "content": "=================\nIntroduction to Arduino on Cloud\n=================\n\n\n.. toctree::\n    :maxdepth: 2\n    :titlesonly:\n    :glob:\n\n    flow.rst\n    features.rst\n    screenshots.rst"
  },
  {
    "path": "docs/arduinoCloud/screenshots.rst",
    "content": "=================\nScreenshots\n================="
  },
  {
    "path": "docs/conf.py",
    "content": "# -*- coding: utf-8 -*-\n#\n# Configuration file for the Sphinx documentation builder.\n#\n# This file does only contain a selection of the most common options. For a\n# full list see the documentation:\n# http://www.sphinx-doc.org/en/master/config\n\n# -- Path setup --------------------------------------------------------------\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#\n# import os\n# import sys\n# sys.path.insert(0, os.path.abspath('.'))\n\nimport sphinx_rtd_theme\n\n# -- Project information -----------------------------------------------------\n\nproject = 'eSim and Arduino on Cloud'\nauthor = 'FRG-FOSSEE-Team'\n\n# The short X.Y version\nversion = ''\n# The full version, including alpha/beta/rc tags\nrelease = '1'\n\n\n# -- General configuration ---------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n#\n# needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n    'sphinx.ext.autodoc',\n    'sphinx.ext.doctest',\n    'sphinx.ext.coverage',\n    'sphinx_rtd_theme',\n    'sphinxcontrib.openapi',\n    'm2r2',\n]\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# The suffix(es) of source filenames.\n# You can specify multiple suffix as a list of string:\n#\nsource_suffix = ['.rst', '.md']\n# source_suffix = '.rst'\n\n# The master toctree document.\nmaster_doc = 'index'\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#\n# This is also used if you do content translation via gettext catalogs.\n# Usually you set \"language\" from the command line for these cases.\nlanguage = None\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This pattern also affects html_static_path and html_extra_path .\nexclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = 'sphinx'\n\n\n# -- Options for HTML output -------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = 'sphinx_rtd_theme'\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n#\n# html_theme_options = {}\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = ['_static']\n\n# Custom sidebar templates, must be a dictionary that maps document names\n# to template names.\n#\n# The default sidebars (for documents that don't match any pattern) are\n# defined by theme itself.  Builtin themes are using these templates by\n# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',\n# 'searchbox.html']``.\n#\n# html_sidebars = {}\n\n\n# -- Options for HTMLHelp output ---------------------------------------------\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = 'eSimAndArduinoOnClouddoc'\n\n\n# -- Options for LaTeX output ------------------------------------------------\n\nlatex_elements = {\n    # The paper size ('letterpaper' or 'a4paper').\n    #\n    # 'papersize': 'letterpaper',\n\n    # The font size ('10pt', '11pt' or '12pt').\n    #\n    # 'pointsize': '10pt',\n\n    # Additional stuff for the LaTeX preamble.\n    #\n    # 'preamble': '',\n\n    # Latex figure (float) alignment\n    #\n    # 'figure_align': 'htbp',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title,\n#  author, documentclass [howto, manual, or own class]).\nlatex_documents = [\n    (master_doc, 'eSimAndArduinoOnClouddoc.tex', 'eSim and Arudino on Cloud Documentation',\n     'FRG-FOSSEE-Team', 'manual'),\n]\n\n\n# -- Options for manual page output ------------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [\n    (master_doc, 'esimandarduinooncloud', 'eSim and Arduino on Cloud Documentation',\n     [author], 1)\n]\n\n\n# -- Options for Texinfo output ----------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n    (master_doc, 'eSimAndArduinoOnClouddoc', 'eSim and Arduino on Cloud Documentation',\n     author, 'eSimAndArduinoOnClouddoc', 'One line description of project.',\n     'Miscellaneous'),\n]\n\n\n# -- Extension configuration -------------------------------------------------\n"
  },
  {
    "path": "docs/contribute/Contributing.rst",
    "content": ".. mdinclude:: ../../CONTRIBUTING.md\n"
  },
  {
    "path": "docs/contribute/ContributingGuidelines.rst",
    "content": ".. mdinclude:: ../../guidelines-checklist/contributing-guidelines.md\n"
  },
  {
    "path": "docs/contribute/NewIssue.rst",
    "content": ".. mdinclude:: ../../guidelines-checklist/new-issue-guidelines.md\n"
  },
  {
    "path": "docs/contribute/PullRequest.rst",
    "content": ".. mdinclude:: ../../guidelines-checklist/pullrequest-guidelines.md\n"
  },
  {
    "path": "docs/contribute/index.rst",
    "content": "=================\nContributing\n=================\n\n.. toctree::\n    :maxdepth: 2\n    :titlesonly:\n    :glob:\n\n    Contributing.rst\n    ContributingGuidelines.rst\n    NewIssue.rst\n    PullRequest.rst"
  },
  {
    "path": "docs/contributors/index.rst",
    "content": "=================\nCredits\n=================\n\neSim on the Cloud\n#################\n\n* `Darsh Patel <https://github.com/darshkpatel>`_\n* `Darshan Sudake <https://github.com/dssudake>`_\n* `Faisal Ahmed <https://github.com/felixfaisal>`_\n* `Rohit Geddam <https://github.com/rohitgeddam>`_\n\n\nArduino on the Cloud\n#################\n\n* `Navonil Das <https://github.com/NavonilDas>`_\n* `Meet Shah <https://github.com/meet-10>`_\n"
  },
  {
    "path": "docs/developerDocs/apidocs.rst",
    "content": "====\nAPIs\n====\n\nList of APIs used in this system\n\n.. openapi:: ../specs/swagger_openapi.yml\n"
  },
  {
    "path": "docs/developerDocs/dbswitch.rst",
    "content": "=========================\nDB Switching Instructions\n=========================\n\n* To switch between databases, follow the instructions below\n* Please note all data in the database will be lost\n* Turn off existing containers ``docker-compose -f docker-compose.dev.yml down``\n* Switch to the needed config inside .env then copy it to prod config ``cp .env .env.prod``, make needed changes ( if required) in the prod config\n* Uncomment the appropriate DB Block inside docker-compse.(dev/prod).yml, please note only one db block should be present\n* Build Containers and run db migrations again ``./first_run.dev.sh``"
  },
  {
    "path": "docs/developerDocs/index.rst",
    "content": "=================\nDeveloper docs\n=================\n\n.. toctree::\n    :maxdepth: 2\n    :titlesonly:\n    :glob:\n\n    apidocs.rst\n    dbswitch.rst"
  },
  {
    "path": "docs/docker/env_variables.rst",
    "content": "=====================\nEnvironment Variables\n=====================\n\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| Variable                  | Description                                                       |       Default          |\n+===========================+===================================================================+========================+\n| PYTHONUNBUFFERED          | allows for log messages to be immediately dumped witout buffering |  True                  |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| SQL_ENGINE                | SQL Engine used by Django                                         |django.db.backends.mysql|\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| SQL_HOST                  | Hostname for database server                                      | db                     |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| SQL_PORT                  | Port for database server                                          | 3306                   |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| DJANGO_DEBUG              | Debug mode setting for Django                                     | True                   |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| MYSQL_ROOT_PASSWORD       | Root password for MYSQL                                           | password               |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| MYSQL_DATABASE            | Default database name for MYSQL                                   | esimcloud_db           |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| MYSQL_USER                | Username for MYSQL Server                                         | user                   |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| MYSQL_PASSWORD            | password for MYSQL Server                                         | password               |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| MONGO_INITDB_ROOT_USERNAME| Username for MongoDB Initial Database                             | user                   |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| MONGO_INITDB_ROOT_PASSWORD| Password for MongoDB Initial Database                             | password               |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| MONGO_INITDB_DATABASE     | MongoDB Initial Database name                                     | esimcloud_db           |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| TAG_MYSQL                 | MYSQL Docker Image Tag to pull ( Version )                        | 8.0                    |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| TAG_REDIS                 | Redis Docker Image Tag to pull ( Version )                        | alpine3.11             |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| TAG_MONGO                 | Mongodb Docker Image Tag to pull ( Version )                      | 4.2.6                  |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| GUNICORN_WORKERS          | Number of Gunicorn workers to spawn per container                 | 5                      |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| CELERY_WORKERS            | Number of Celery workers to spawn per container                   | 5                      |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| EDA_PUBLIC_URL            | public url used to build react frontend files                     | http://localhost/eda   |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n| ARDUINO_BASE_HREF         | public path used to build angular frontend files                  | /arduino/              |\n+---------------------------+-------------------------------------------------------------------+------------------------+\n\n.. note:: Please change the default passwords in the **.env.prod** file to secure your instance against attackers.\n"
  },
  {
    "path": "docs/docker/index.rst",
    "content": "=================\nArchitecture and Installation\n=================\n\nThe production environment consist of the following docker containers:\n\n+-----------------+------------------------------------------------------------------------------------+\n| Container Name  | Description                                                                        |\n+=================+====================================================================================+\n| nginx           |Used as a reverse proxy to route requests to appropriate endpoints and loadbalancing|\n+-----------------+------------------------------------------------------------------------------------+\n| celery          |Used as a reverse proxy to route requests to appropriate endpoints and loadbalancing|\n+-----------------+------------------------------------------------------------------------------------+\n| redis           |Used as a cache and a task queue for Celery                                         |\n+-----------------+------------------------------------------------------------------------------------+\n| mongodb         |Container running MongoDB Database                                                  |\n+-----------------+------------------------------------------------------------------------------------+\n| db              |Container running MYSQL Database                                                    |\n+-----------------+------------------------------------------------------------------------------------+\n| django          |Container running the main Django Backend serving all APIs                          |\n+-----------------+------------------------------------------------------------------------------------+\n| arduino-frontend|Container running node 10 helping build  Angular app for Arduino Simulation Webapp  |\n+-----------------+------------------------------------------------------------------------------------+\n| eda-frontend    |Container running node 10 helping build  React app for EDA CircuitSimulation Webapp |\n+-----------------+------------------------------------------------------------------------------------+\n\n.. note:: These containers depend on **.env.prod** file, configuration details can be reffered from :doc:`env_variables`.\n\n.. image:: ../images/docker.png\n   :width: 600\n\n.. toctree::\n    :maxdepth: 2\n    :titlesonly:\n    :glob:\n\n    installation.rst\n    env_variables.rst\n\n"
  },
  {
    "path": "docs/docker/installation.rst",
    "content": "======================\nInstallation and Usage\n======================\n\nIt is essential that `docker <https://docker.com/>`_ and `docker-compose <https://github.com/docker/compose/releases>`_ are installed on a system before following the steps.\n\n\nProduction  Environment\n#######################\n\n* git clone git@github.com:frg-fossee/eSim-Cloud.git && cd eSim-Cloud\n\n* cp .env .env.prod\n\n* docker-compose -f docker-compose.prod.yml --env-file .env.prod up --scale django=1 --scale celery=3 -d\n\n\n.. note:: Please change the default passwords in the **.env.prod** file to secure your instance against attackers.\n\n\nDevelopment Environment\n#######################\n\n* git clone git@github.com:frg-fossee/eSim-Cloud.git && cd eSim-Cloud\n* git checkout develop\n* Configure docker with github packages for pulling pre built images\n* echo $GITHUB_TOKEN | docker login docker.pkg.github.com --username [github_username] --password-stdin\n* /bin/bash first_run.dev.sh\n\n\nFor running only the backend containers\n***************************************\n\n\n* docker-compose -f docker-compose.dev.yml up django\n\nFor running only the eda-frontend container with backend\n********************************************************\n\n* docker-compose -f docker-compose.dev.yml up eda-frontend\n\nFor running only the arduino-frontend container with backend\n************************************************************\n\n* docker-compose -f docker-compose.dev.yml up arduino-frontend\n\n\nUseful Commands\n###############\n\n* docker exec -it <container ID> <command>\n* eg. docker exec -it b7e7acf2283e /bin/sh\n* sh migrations.sh inside a docker container to apply db migrations manually\n* To seed libraries - python manage.py seed_libs --location kicad-symbols/ inside container\n* To remove seeded libraries - python manage.py seed_libs --clear inside container\n"
  },
  {
    "path": "docs/eSim_on_Cloud/eSimGallery.rst",
    "content": "=====================\neSim Gallery Examples\n=====================\n\neSim gallery has 6 example circuits. You can open, re-design, save, and simulate them. These are listed below.\n\nVoltage Divider\n###############\n\n.. image:: images/Voltage_Divider.png\n\n* Simulation Type: DC Solver\n* Simulation Parameters: None\n* Simulation\n\n    .. image:: images/Voltage_Divider_Simulation.png\n\n\nRC Circuit\n##########\n\n.. image:: images/RC_Circuit.png\n\n* Simulation Type: Transient Analysis\n* Simulation Parameters\n    * Start Time: 0\n    * Stop Time: 100m\n    * Step Time: 10m\n* Simulation\n\n    .. image:: images/RC_Circuit_Simulation.png\n\n\nDual RC Ladder\n##############\n\n.. image:: images/Dual_RC_Ladder.png\n\n* Simulation Type: Transient Analysis\n* Simulation Parameters\n    * Start Time: 0\n    * Stop Time: 50m\n    * Step Time: 50u\n* Simulation\n\n    .. image:: images/Dual_RC_Ladder_Simulation.png\n\n\nBipolar Amplifier\n#################\n\n.. image:: images/Bipolar_Amplifier.png\n\n* Simulation Type: Transient Analysis\n* Simulation Parameters\n    * Start Time: 0\n    * Stop Time: 10m\n    * Step Time: 10u\n* Simulation\n\n    .. image:: images/Bipolar_Amplifier_Simulation1.png\n\n* Simulation Type: AC Analysis\n* Simulation Parameters\n    * Type: Decade\n    * Points: 10\n    * Start frequency: 10\n    * Stop frequency: 10Meg\n* Simulation\n\n    .. image:: images/Bipolar_Amplifier_Simulation2.png\n\n\nShunt Clipper\n#############\n\n.. image:: images/Shunt_Clipper.png\n\n* Simulation Type: DC Sweep\n* Simulation Parameters\n    * Component: V1\n    * Start Voltage: 0\n    * Stop Voltage: 1\n    * Step Voltage: 1m\n* Add Expression: -v1#branch\n* Simulation\n\n    .. image:: images/Shunt_Clipper_Simulation.png\n\n\nRC Circuit Parallel\n###############\n\n.. image:: images/RC_Circuit_Parallel.png\n\n* Simulation Type: Transient Analysis\n* Simulation Parameters\n    * Start Time: 0\n    * Stop Time: 30m\n    * Step Time: 10u\n* Simulation\n\n    .. image:: images/RC_Circuit_Parallel_Simulation.png\n\n"
  },
  {
    "path": "docs/eSim_on_Cloud/features.rst",
    "content": "=================\nFeatures\n=================\n\nThe schematic editor is divided into 3 panes. The left pane consists of the ``Component List`` and a facility to search components. The middle pane consists of the grid on which the components will be dropped and the circuit will be designed. The right pane consists of the grid properties, description of the circuit, and components position. More details are given below.\n\nComponent categories\n####################\nThe kicad components are categorized as follows, where each component has ``Name``, ``Description``, ``Keywords``, and ``Datasheet``. \n\n* Analog\t\n* Device\n* Triac_Thyristor\n* Transistor_IGBT\n* Diode\n* Transistor_FET\n* pspice\n* Oscillator\n* eSim_Sources\n* eSim_Hybrid\n* Motor\n* LED\n* Transistor_BJT\n* power\n* 4xxx\n\nSearching Component\n###################\nRather than going through categories and locating the component symbol, one can also search a component by typing in the textbox given, using the filters like ``Name``, ``Keyword``, ``Description``, ``Component Library``, and ``Prefix``.\n\nGrid size and Orientation\n#########################\nThe size of the grid can be changed from A1 to A5 and offers Portrait and Landscape mode\n\nComponents Position\n###################\nUsing the this box, one can access and view the circuit which do not fit onto the specified grid size. Its like accessing another page. This situation arises when one has a large circuit and changes the grid from a larger size to a smaller one. \n\nSchematic Description\n#####################\nA text area in which one can write the description about the circuit.\n\nBasic Editor Operations\n#######################\nThe following basic editor functions are supported:\n\n* Undo \n* Redo \n* Delete\n* Zoom in \n* Zoom out \n* Default size \n* Rotate\n* Print\n* Clear All: Clear the schematic drawn\n\nGallery\n#######\nSample circuits are available in the gallery for anyone to refer and use. These circuits can be opened, saved, and simulated.\n\nSaving and Re-Opening\n#####################\nThe circuits are saved only of an authenticated user and are viewed on the user dashboard. The same can be reopened as well for further editing.\n\nDashboard\n#########\nA  place  where  the  authenticated  user  can  view  the  different  circuits  designed  by him/her. Then user can open the saved circuit into the editor by clicking on ``Launch in Editor``.\n\nExport \n######\n\n* Image: The circuit can be exported as ``jpeg``, ``png``, and ``svg``. This is useful for documenting and printing.\n* JSON: The circuit can be exported as ``JSON`` so as to open it again using the Upload feature.  \n\nOpen Schematic\n##############\nThe schematic can be opened using the following methods:\n\n* Uploading file: One needs to upload the file in ``JSON`` format i.e. which was exported using this tool.\n* Local: The circuits saved by the authenticated user.\n* Gallery: The sample circuits available in the gallery for anyone to refer.\n\n\nERC Check\n#########\nBasic ERC check is done for simulating a circuit. For example, if the wires are connected or not.\n\nGenerate Netlist\n################\nBased on the circuit a netlist is generated. The internal process of generating a netlist was described in the previous section.\n\nSimulate\n########\nThere are four simulation modes as follows\n\n* DC Solver: A DC simulation attempts to find a stable DC solution of your circuit.\n\n* DC Sweep: A DC Sweep will plot the DC solution of your circuit across different values of a parameter of a circuit element. You can sweep any numerical parameter of any circuit element in your circuit.\n\n* Transient Analysis: A Transient analysis does a Time-Domain Simulation of your circuit over a certain period of time.\n\n* AC Analysis: AC Analysis does a small signal analysis of your circuit. The input can be any voltage source or current source.\n\nSharing\n#######\nUsing the ``Share`` button one can share the circuit with others using the link generated by the system. The link can be opened and viewed by anyone. However, to make changes one would need to login and the changes saved will be associated with the new user.\n\nSpice simulator\n###############\nUsing the spice simulator one can type the netlist in the code editor box and simulate it. Simulation result window will popup displaying the result.\n\nNote: Add ``> data.txt`` at the end of the control line.\n\n    .. code::\n\n        .control\n        run\n        print all > data.txt\n        .endc\n        .end\n"
  },
  {
    "path": "docs/eSim_on_Cloud/flow.rst",
    "content": "=====================\neSim Development Flow\n=====================\n\n.. image:: ../images/flow_lib_to_svg.png\n\n.. image:: ../images/flow_schematic_to_simulation.png\n\n\nReading Component Symbol Library files and Rendering in the Browser\n###################################################################\nThe Kicad symbol libraries '.lib' and '.dcm' (https://github.com/KiCad/kicad-symbols) are parsed to generate SVG files that are compatible with the mxgraph (javascript graph library). These components are generated only once and are cached. These generated SVG files are read and rendered in the component list (left pane) using mxgraph. \n\n\nGenerating XML files\n####################\nThe components from the left pane are dropped onto the schematic grid. By default, the size of the grid is A4, which can be changed from A5 to A1. The components connected by wires are converted to XML format using mxgraph, whenever the circuit is saved by the user. This XML is used to save and re-open the saved circuits. This XML is also used to auto annotate the circuit, and in performing ERC checks as well.\n\n\nGenerating Netlist \n##################\nUsing the mxgraph object, a netlist is generated (compatible with ngspice simulator) when the user clicks on the 'Simulation' or 'generate netlist' button. The simulation parameters are supplied by the user based on the simulation type chosen by the user. The following are the different parts of netlist generation:\n\n* Title: title of the schematic diagram\n\n    .. code::\n\n      RC Circuit\n\n\n* Model: All spice models given by users will be listed here. These are extra parameters which are not delivered with ngspice. They are device manufacturer specific and may be obtained from their web sites or from other sites\n\n    .. code::\n\n        .model BC546B npn ( IS=7.59E-15 VAF=73.4 .........)\n\n* Netlist: Text description of circuit. It has all components listed with connecting nodes, parameters and spice model (if specified by the user). This is generated with the help of mxgraph object. An example is shown below\n\n    .. code::\n\n        r1  in out 1k\n        c1  out gnd 10u\n        v1  in gnd pwl(0m 0 0.5m 5 50m 5 50.5m 0 100m 0)\n        Q1 intc intb 0 BC546B\n\n* Control Line: It has all simulation parameters. It is generated depending on the type of simulation and the parameters specified by user\n\n    .. code::\n\n        .tran 10e-03 100e-03 0e-03    // Transient analysis\n        .ac dec 10 10 1Meg            // AC Analysis\n\n* Control Block: All Interactive commands to actually produce output for given schematic.\n\n    .. code::\n\n        .control\n        run\n        print all > data.txt\n        .endc\n        .end\n\n\nSimulation\n##########\n\n* When the 'Simulate' button is clicked, the ERC checks are performed. If all goes well then the netlist is generated. If not, the error(s) are shown to the user. \n* This netlist is sent to the backend services. Using the distributed queueing mechanism of Celery, asynchronous requests (netlist files) are kept in queue and passed onto Ngspice. \n* Ngspice then outputs a text file with all the coordinates required to plot the graph.  \n* This textfile is then parsed using an inhouse parser to convert the data of the text file into an organised data structures (``JSON``). The simulation graph is then plotted and rendered based on the data returned by this ``JSON`` using ``chartjs``.\n\n\nJSON format returned by parser\n##############################\n\nAs mentioned above, the output produced by ngspice is converted to ``JSON``. The format is given below:\n\n    .. code::\n\n        {\n            total_number_of_tables: <int>,\n            isGraph: <bool>,\n            data:[\n                {\n                    labels : [ ], x : [ ], y : [ [ ] , [ ] ] ,\n                } \n            ]\n        }\n\n* total-number-of-tables: The number of tables present.\n* isGraph: ``True``, if the data is a graph, ``False`` if the data is just a table.\n* data: An array which contains one or more objects depending on the input provided to the parser.\n* labels: An array which contains all the labels that have to be present on the graph. Eg. [\"time\", \"vin\", \"vout\"].\n* x: An array containing all the ``x`` co-ordinates for a set of graph. E.g. Time on x-axis. This is a linear array as the ``x`` coordinates will be the same for different set of ``y`` coordinates.\n* y: A 2D array containing ``y`` co-ordinates for different graphs.\n"
  },
  {
    "path": "docs/eSim_on_Cloud/index.rst",
    "content": "=================\nIntroduction to eSim on Cloud\n=================\n\n.. toctree::\n    :maxdepth: 2\n    :titlesonly:\n    :glob:\n\n    flow.rst\n    features.rst\n    eSimGallery.rst\n    screenshots.rst"
  },
  {
    "path": "docs/eSim_on_Cloud/screenshots.rst",
    "content": "=================\nScreenshots\n================="
  },
  {
    "path": "docs/index.rst",
    "content": "Welcome to eSim and Arduino on Cloud's documentation!\r\n=====================================================\r\n\r\nThe project aims to provide a facility for a user to design different types of electronic circuits and arduino projects and simulate them by providing simulation parameters on the web. The detailed features will be updated soon.\r\n\r\n.. toctree::\r\n    :numbered:\r\n    :maxdepth: 2\r\n    :caption: Contents:\r\n\r\n    overview/index\r\n    docker/index\r\n    eSim_on_Cloud/index\r\n    arduinoCloud/index\r\n    developerDocs/index\r\n    contribute/index\r\n    contributors/index\r\n    schematic/index\r\n    arduino/index\r\n\r\nIndices and tables\r\n==================\r\n\r\n* :ref:`genindex`\r\n* :ref:`search`\r\n"
  },
  {
    "path": "docs/overview/index.rst",
    "content": "======================\nOverview\n======================\n\neSim on Cloud\n#############\n\nThis system allows the users to draw analog and digital circuits and simulate them. The users have a facility to drag and drop components from the left pane onto the schematic grid on the right pane. The components on the grid are connected using wires. The circuit can then be simulated using the different simulation parameters (DC Solver, DC Sweep, Transient analysis, and AC analysis). The basic ERC check enables the users to find out errors if any. The size of the schematic grid can be changed from A1 to A5 paper sizes along with portrait and landscape modes. The users can also print the circuit or save it in pdf format for documentation purposes.\n\n\nArduino on Cloud\n#############\n\nThis system allows the users to drag and drop Arduino components from the left pane onto the working space on the right. The pins of the Arduino board can be connected to various input/output devices like LED, motor, push button, etc using wires. There is also a facility to change the color of wires, LEDs, and such components, so as to differentiate the easily. The users can then proceed to write their code in the code window which is then  simulated. There is an option for the users to print or save it in pdf format for documentation purposes. The basic ERC check enables the users to find out errors if any. \n\n.. note:: This docs is created using Read the docs and we will be glad to receive pull requests for updating the same. Please go through the Contribute section to know more."
  },
  {
    "path": "docs/requirements.txt",
    "content": "sphinxcontrib-openapi\nm2r2\n\n"
  },
  {
    "path": "docs/specs/swagger_openapi.yml",
    "content": "{\"swagger\": \"2.0\", \"info\": {\"title\": \"eSim Cloud API\", \"description\": \"Public API Endpoints for eSim Cloud\", \"license\": {\"name\": \"GPLv3 License\"}, \"version\": \"v1\"}, \"host\": \"localhost\", \"schemes\": [\"http\"], \"basePath\": \"/api\", \"consumes\": [\"application/json\"], \"produces\": [\"application/json\"], \"securityDefinitions\": {\"Bearer\": {\"type\": \"apiKey\", \"name\": \"Authorization\", \"in\": \"header\"}}, \"security\": [{\"Bearer\": []}], \"paths\": {\"/arduino/compile\": {\"post\": {\"operationId\": \"arduino_compile_create\", \"description\": \"Compile list of Arduino Sketch File\", \"parameters\": [], \"responses\": {\"201\": {\"description\": \"\"}}, \"tags\": [\"arduino\"]}, \"parameters\": []}, \"/arduino/compile/status\": {\"get\": {\"operationId\": \"arduino_compile_status_list\", \"description\": \"Returns Compilation Status\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\"}}, \"tags\": [\"arduino\"]}, \"parameters\": []}, \"/auth/google-callback\": {\"get\": {\"operationId\": \"auth_google-callback_list\", \"description\": \"Creates user if OAuth token valid\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\"}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/o/{provider}/\": {\"get\": {\"operationId\": \"auth_o_read\", \"description\": \"\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/ProviderAuth\"}}}, \"tags\": [\"auth\"]}, \"post\": {\"operationId\": \"auth_o_create\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/ProviderAuth\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/ProviderAuth\"}}}, \"tags\": [\"auth\"]}, \"parameters\": [{\"name\": \"provider\", \"in\": \"path\", \"required\": true, \"type\": \"string\"}]}, \"/auth/token/login/\": {\"post\": {\"operationId\": \"auth_token_login_create\", \"description\": \"Use this endpoint to obtain user authentication token.\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/TokenCreate\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/TokenCreate\"}}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/token/logout/\": {\"post\": {\"operationId\": \"auth_token_logout_create\", \"description\": \"Use this endpoint to logout user (remove user authentication token).\", \"parameters\": [], \"responses\": {\"201\": {\"description\": \"\"}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/users/\": {\"get\": {\"operationId\": \"auth_users_list\", \"description\": \"\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/definitions/User\"}}}}, \"tags\": [\"auth\"]}, \"post\": {\"operationId\": \"auth_users_create\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/UserCreate\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/UserCreate\"}}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/users/activation/\": {\"post\": {\"operationId\": \"auth_users_activation\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/Activation\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/Activation\"}}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/users/me/\": {\"get\": {\"operationId\": \"auth_users_me_read\", \"description\": \"\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/definitions/User\"}}}}, \"tags\": [\"auth\"]}, \"put\": {\"operationId\": \"auth_users_me_update\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/User\"}}], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/User\"}}}, \"tags\": [\"auth\"]}, \"patch\": {\"operationId\": \"auth_users_me_partial_update\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/User\"}}], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/User\"}}}, \"tags\": [\"auth\"]}, \"delete\": {\"operationId\": \"auth_users_me_delete\", \"description\": \"\", \"parameters\": [], \"responses\": {\"204\": {\"description\": \"\"}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/users/resend_activation/\": {\"post\": {\"operationId\": \"auth_users_resend_activation\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/SendEmailReset\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/SendEmailReset\"}}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/users/reset_password/\": {\"post\": {\"operationId\": \"auth_users_reset_password\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/SendEmailReset\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/SendEmailReset\"}}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/users/reset_password_confirm/\": {\"post\": {\"operationId\": \"auth_users_reset_password_confirm\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/PasswordResetConfirm\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/PasswordResetConfirm\"}}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/users/reset_username/\": {\"post\": {\"operationId\": \"auth_users_reset_username\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/SendEmailReset\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/SendEmailReset\"}}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/users/reset_username_confirm/\": {\"post\": {\"operationId\": \"auth_users_reset_username_confirm\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/UsernameResetConfirm\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/UsernameResetConfirm\"}}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/users/set_password/\": {\"post\": {\"operationId\": \"auth_users_set_password\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/SetPassword\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/SetPassword\"}}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/users/set_username/\": {\"post\": {\"operationId\": \"auth_users_set_username\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/SetUsername\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/SetUsername\"}}}, \"tags\": [\"auth\"]}, \"parameters\": []}, \"/auth/users/{id}/\": {\"get\": {\"operationId\": \"auth_users_read\", \"description\": \"\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/User\"}}}, \"tags\": [\"auth\"]}, \"put\": {\"operationId\": \"auth_users_update\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/User\"}}], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/User\"}}}, \"tags\": [\"auth\"]}, \"patch\": {\"operationId\": \"auth_users_partial_update\", \"description\": \"\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/User\"}}], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/User\"}}}, \"tags\": [\"auth\"]}, \"delete\": {\"operationId\": \"auth_users_delete\", \"description\": \"\", \"parameters\": [], \"responses\": {\"204\": {\"description\": \"\"}}, \"tags\": [\"auth\"]}, \"parameters\": [{\"name\": \"id\", \"in\": \"path\", \"description\": \"A unique integer value identifying this user.\", \"required\": true, \"type\": \"integer\"}]}, \"/circuits/\": {\"get\": {\"operationId\": \"circuits_list\", \"description\": \"Listing Published Circuits\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/definitions/Circuit\"}}}}, \"tags\": [\"circuits\"]}, \"parameters\": []}, \"/circuits/{circuit_id}/\": {\"get\": {\"operationId\": \"circuits_read\", \"description\": \"Listing Published Circuits\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/Circuit\"}}}, \"tags\": [\"circuits\"]}, \"parameters\": [{\"name\": \"circuit_id\", \"in\": \"path\", \"description\": \"A UUID string identifying this circuit.\", \"required\": true, \"type\": \"string\", \"format\": \"uuid\"}]}, \"/components/\": {\"get\": {\"operationId\": \"components_list\", \"description\": \"Listing All Library Details\", \"parameters\": [{\"name\": \"name__icontains\", \"in\": \"query\", \"description\": \"\", \"required\": false, \"type\": \"string\"}, {\"name\": \"keyword__icontains\", \"in\": \"query\", \"description\": \"\", \"required\": false, \"type\": \"string\"}, {\"name\": \"description__icontains\", \"in\": \"query\", \"description\": \"\", \"required\": false, \"type\": \"string\"}, {\"name\": \"component_library__library_name__icontains\", \"in\": \"query\", \"description\": \"\", \"required\": false, \"type\": \"string\"}, {\"name\": \"component_library\", \"in\": \"query\", \"description\": \"\", \"required\": false, \"type\": \"string\"}, {\"name\": \"symbol_prefix\", \"in\": \"query\", \"description\": \"\", \"required\": false, \"type\": \"string\"}], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/definitions/LibraryComponent\"}}}}, \"tags\": [\"components\"]}, \"parameters\": []}, \"/components/{id}/\": {\"get\": {\"operationId\": \"components_read\", \"description\": \"Listing All Library Details\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/LibraryComponent\"}}}, \"tags\": [\"components\"]}, \"parameters\": [{\"name\": \"id\", \"in\": \"path\", \"description\": \"A unique integer value identifying this library component.\", \"required\": true, \"type\": \"integer\"}]}, \"/libraries/\": {\"get\": {\"operationId\": \"libraries_list\", \"description\": \"Listing All Library Details\", \"parameters\": [{\"name\": \"library_name\", \"in\": \"query\", \"description\": \"\", \"required\": false, \"type\": \"string\"}], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/definitions/Library\"}}}}, \"tags\": [\"libraries\"]}, \"parameters\": []}, \"/libraries/{id}/\": {\"get\": {\"operationId\": \"libraries_read\", \"description\": \"Listing All Library Details\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/Library\"}}}, \"tags\": [\"libraries\"]}, \"parameters\": [{\"name\": \"id\", \"in\": \"path\", \"description\": \"A unique integer value identifying this library.\", \"required\": true, \"type\": \"integer\"}]}, \"/publish/circuit/\": {\"get\": {\"operationId\": \"publish_circuit_list\", \"description\": \"CRUD  for viewing unpublished / published circuits ( Permission Groups )\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/definitions/Circuit\"}}}}, \"tags\": [\"publish\"]}, \"post\": {\"operationId\": \"publish_circuit_create\", \"description\": \"CRUD  for viewing unpublished / published circuits ( Permission Groups )\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/Circuit\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/Circuit\"}}}, \"tags\": [\"publish\"]}, \"parameters\": []}, \"/publish/circuit/{circuit_id}/\": {\"get\": {\"operationId\": \"publish_circuit_read\", \"description\": \"CRUD  for viewing unpublished / published circuits ( Permission Groups )\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/Circuit\"}}}, \"tags\": [\"publish\"]}, \"put\": {\"operationId\": \"publish_circuit_update\", \"description\": \"CRUD  for viewing unpublished / published circuits ( Permission Groups )\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/Circuit\"}}], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/Circuit\"}}}, \"tags\": [\"publish\"]}, \"patch\": {\"operationId\": \"publish_circuit_partial_update\", \"description\": \"CRUD  for viewing unpublished / published circuits ( Permission Groups )\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/Circuit\"}}], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/Circuit\"}}}, \"tags\": [\"publish\"]}, \"delete\": {\"operationId\": \"publish_circuit_delete\", \"description\": \"CRUD  for viewing unpublished / published circuits ( Permission Groups )\", \"parameters\": [], \"responses\": {\"204\": {\"description\": \"\"}}, \"tags\": [\"publish\"]}, \"parameters\": [{\"name\": \"circuit_id\", \"in\": \"path\", \"description\": \"A UUID string identifying this circuit.\", \"required\": true, \"type\": \"string\", \"format\": \"uuid\"}]}, \"/publish/publishing/\": {\"get\": {\"operationId\": \"publish_publishing_list\", \"description\": \"Publishing CRUD Operations\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/definitions/Publish\"}}}}, \"tags\": [\"publish\"]}, \"post\": {\"operationId\": \"publish_publishing_create\", \"description\": \"Publishing CRUD Operations\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/Publish\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/Publish\"}}}, \"tags\": [\"publish\"]}, \"parameters\": []}, \"/publish/publishing/{id}/\": {\"get\": {\"operationId\": \"publish_publishing_read\", \"description\": \"Publishing CRUD Operations\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/Publish\"}}}, \"tags\": [\"publish\"]}, \"put\": {\"operationId\": \"publish_publishing_update\", \"description\": \"Publishing CRUD Operations\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/Publish\"}}], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/Publish\"}}}, \"tags\": [\"publish\"]}, \"patch\": {\"operationId\": \"publish_publishing_partial_update\", \"description\": \"Publishing CRUD Operations\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/Publish\"}}], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/Publish\"}}}, \"tags\": [\"publish\"]}, \"delete\": {\"operationId\": \"publish_publishing_delete\", \"description\": \"Publishing CRUD Operations\", \"parameters\": [], \"responses\": {\"204\": {\"description\": \"\"}}, \"tags\": [\"publish\"]}, \"parameters\": [{\"name\": \"id\", \"in\": \"path\", \"description\": \"A unique integer value identifying this publish.\", \"required\": true, \"type\": \"integer\"}]}, \"/save\": {\"post\": {\"operationId\": \"save_create\", \"description\": \"API to save the state of project to db which can be loaded or shared later\", \"parameters\": [{\"name\": \"save_id\", \"in\": \"formData\", \"required\": false, \"type\": \"string\", \"format\": \"uuid\"}, {\"name\": \"data_dump\", \"in\": \"formData\", \"required\": true, \"type\": \"string\", \"minLength\": 1}, {\"name\": \"name\", \"in\": \"formData\", \"required\": false, \"type\": \"string\", \"maxLength\": 200, \"minLength\": 1, \"x-nullable\": true}, {\"name\": \"description\", \"in\": \"formData\", \"required\": false, \"type\": \"string\", \"maxLength\": 400, \"minLength\": 1, \"x-nullable\": true}, {\"name\": \"owner\", \"in\": \"formData\", \"required\": false, \"type\": \"integer\", \"x-nullable\": true}, {\"name\": \"shared\", \"in\": \"formData\", \"required\": false, \"type\": \"boolean\"}, {\"name\": \"base64_image\", \"in\": \"formData\", \"required\": true, \"type\": \"file\"}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/StateSave\"}}}, \"consumes\": [\"application/x-www-form-urlencoded\"], \"tags\": [\"save\"]}, \"parameters\": []}, \"/save/list\": {\"get\": {\"operationId\": \"save_list_list\", \"description\": \"Returns Saved data for given username,\\nOnly user who saved the state can access it\\nTHIS WILL ESCAPE DOUBLE QUOTES\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/StateSave\"}}}, \"tags\": [\"save\"]}, \"parameters\": []}, \"/save/{save_id}\": {\"get\": {\"operationId\": \"save_read\", \"description\": \"Returns Saved data for given save id ,\\nOnly user who saved the state can access / update it\\nTHIS WILL ESCAPE DOUBLE QUOTES\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/StateSave\"}}}, \"tags\": [\"save\"]}, \"post\": {\"operationId\": \"save_create\", \"description\": \"Returns Saved data for given save id ,\\nOnly user who saved the state can access / update it\\nTHIS WILL ESCAPE DOUBLE QUOTES\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/StateSave\"}}}, \"tags\": [\"save\"]}, \"parameters\": [{\"name\": \"save_id\", \"in\": \"path\", \"required\": true, \"type\": \"string\"}]}, \"/save/{save_id}/sharing/{sharing}\": {\"post\": {\"operationId\": \"save_sharing_create\", \"description\": \"Enables sharing for the given saved state\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/StateSave\"}}}, \"tags\": [\"save\"]}, \"parameters\": [{\"name\": \"save_id\", \"in\": \"path\", \"required\": true, \"type\": \"string\"}, {\"name\": \"sharing\", \"in\": \"path\", \"required\": true, \"type\": \"string\"}]}, \"/simulation/status/{task_id}\": {\"get\": {\"operationId\": \"simulation_status_read\", \"description\": \"Returns Simulation results for 'task_id' provided after\\nuploading the netlist\\n/api/task/<uuid>\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\"}}, \"tags\": [\"simulation\"]}, \"parameters\": [{\"name\": \"task_id\", \"in\": \"path\", \"required\": true, \"type\": \"string\"}]}, \"/simulation/upload\": {\"post\": {\"operationId\": \"simulation_upload_create\", \"summary\": \"API for NetlistUpload\", \"description\": \"Requires a multipart/form-data  POST Request with netlist file in the\\n'file' parameter\", \"parameters\": [], \"responses\": {\"201\": {\"description\": \"\"}}, \"consumes\": [\"multipart/form-data\", \"application/x-www-form-urlencoded\"], \"tags\": [\"simulation\"]}, \"parameters\": []}, \"/tags/\": {\"get\": {\"operationId\": \"tags_list\", \"description\": \"CRUD for Tags\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/definitions/CircuitTag\"}}}}, \"tags\": [\"tags\"]}, \"post\": {\"operationId\": \"tags_create\", \"description\": \"CRUD for Tags\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/CircuitTag\"}}], \"responses\": {\"201\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/CircuitTag\"}}}, \"tags\": [\"tags\"]}, \"parameters\": []}, \"/tags/{id}/\": {\"get\": {\"operationId\": \"tags_read\", \"description\": \"CRUD for Tags\", \"parameters\": [], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/CircuitTag\"}}}, \"tags\": [\"tags\"]}, \"put\": {\"operationId\": \"tags_update\", \"description\": \"CRUD for Tags\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/CircuitTag\"}}], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/CircuitTag\"}}}, \"tags\": [\"tags\"]}, \"patch\": {\"operationId\": \"tags_partial_update\", \"description\": \"CRUD for Tags\", \"parameters\": [{\"name\": \"data\", \"in\": \"body\", \"required\": true, \"schema\": {\"$ref\": \"#/definitions/CircuitTag\"}}], \"responses\": {\"200\": {\"description\": \"\", \"schema\": {\"$ref\": \"#/definitions/CircuitTag\"}}}, \"tags\": [\"tags\"]}, \"delete\": {\"operationId\": \"tags_delete\", \"description\": \"CRUD for Tags\", \"parameters\": [], \"responses\": {\"204\": {\"description\": \"\"}}, \"tags\": [\"tags\"]}, \"parameters\": [{\"name\": \"id\", \"in\": \"path\", \"description\": \"A unique integer value identifying this circuit tag.\", \"required\": true, \"type\": \"integer\"}]}}, \"definitions\": {\"ProviderAuth\": {\"type\": \"object\", \"properties\": {\"access\": {\"title\": \"Access\", \"type\": \"string\", \"readOnly\": true, \"minLength\": 1}, \"refresh\": {\"title\": \"Refresh\", \"type\": \"string\", \"readOnly\": true, \"minLength\": 1}, \"user\": {\"title\": \"User\", \"type\": \"string\", \"readOnly\": true, \"minLength\": 1}}}, \"TokenCreate\": {\"type\": \"object\", \"properties\": {\"password\": {\"title\": \"Password\", \"type\": \"string\", \"minLength\": 1}, \"username\": {\"title\": \"Username\", \"type\": \"string\", \"minLength\": 1}}}, \"User\": {\"type\": \"object\", \"properties\": {\"email\": {\"title\": \"Email address\", \"type\": \"string\", \"format\": \"email\", \"maxLength\": 254}, \"id\": {\"title\": \"ID\", \"type\": \"integer\", \"readOnly\": true}, \"username\": {\"title\": \"Username\", \"description\": \"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.\", \"type\": \"string\", \"readOnly\": true, \"minLength\": 1}}}, \"UserCreate\": {\"required\": [\"username\", \"password\"], \"type\": \"object\", \"properties\": {\"email\": {\"title\": \"Email address\", \"type\": \"string\", \"format\": \"email\", \"maxLength\": 254}, \"username\": {\"title\": \"Username\", \"description\": \"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.\", \"type\": \"string\", \"pattern\": \"^[\\\\w.@+-]+$\", \"maxLength\": 150, \"minLength\": 1}, \"id\": {\"title\": \"ID\", \"type\": \"integer\", \"readOnly\": true}, \"password\": {\"title\": \"Password\", \"type\": \"string\", \"minLength\": 1}}}, \"Activation\": {\"required\": [\"uid\", \"token\"], \"type\": \"object\", \"properties\": {\"uid\": {\"title\": \"Uid\", \"type\": \"string\", \"minLength\": 1}, \"token\": {\"title\": \"Token\", \"type\": \"string\", \"minLength\": 1}}}, \"SendEmailReset\": {\"required\": [\"email\"], \"type\": \"object\", \"properties\": {\"email\": {\"title\": \"Email\", \"type\": \"string\", \"format\": \"email\", \"minLength\": 1}}}, \"PasswordResetConfirm\": {\"required\": [\"uid\", \"token\", \"new_password\"], \"type\": \"object\", \"properties\": {\"uid\": {\"title\": \"Uid\", \"type\": \"string\", \"minLength\": 1}, \"token\": {\"title\": \"Token\", \"type\": \"string\", \"minLength\": 1}, \"new_password\": {\"title\": \"New password\", \"type\": \"string\", \"minLength\": 1}}}, \"UsernameResetConfirm\": {\"required\": [\"new_username\"], \"type\": \"object\", \"properties\": {\"new_username\": {\"title\": \"Username\", \"description\": \"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.\", \"type\": \"string\", \"pattern\": \"^[\\\\w.@+-]+$\", \"maxLength\": 150, \"minLength\": 1}}}, \"SetPassword\": {\"required\": [\"new_password\", \"current_password\"], \"type\": \"object\", \"properties\": {\"new_password\": {\"title\": \"New password\", \"type\": \"string\", \"minLength\": 1}, \"current_password\": {\"title\": \"Current password\", \"type\": \"string\", \"minLength\": 1}}}, \"SetUsername\": {\"required\": [\"new_username\"], \"type\": \"object\", \"properties\": {\"new_username\": {\"title\": \"Username\", \"description\": \"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.\", \"type\": \"string\", \"pattern\": \"^[\\\\w.@+-]+$\", \"maxLength\": 150, \"minLength\": 1}}}, \"Circuit\": {\"required\": [\"title\", \"data_dump\", \"description\"], \"type\": \"object\", \"properties\": {\"circuit_id\": {\"title\": \"Circuit id\", \"type\": \"string\", \"format\": \"uuid\", \"readOnly\": true}, \"title\": {\"title\": \"Title\", \"type\": \"string\", \"maxLength\": 200, \"minLength\": 1}, \"sub_title\": {\"title\": \"Sub title\", \"type\": \"string\", \"maxLength\": 200}, \"data_dump\": {\"title\": \"Data dump\", \"type\": \"string\", \"minLength\": 1}, \"author\": {\"title\": \"Author\", \"type\": \"integer\", \"x-nullable\": true}, \"description\": {\"title\": \"Description\", \"type\": \"string\", \"minLength\": 1}, \"last_updated\": {\"title\": \"Last updated\", \"type\": \"string\", \"format\": \"date-time\", \"readOnly\": true}, \"publish_request_time\": {\"title\": \"Publish request time\", \"type\": \"string\", \"format\": \"date-time\", \"readOnly\": true}, \"base64_image\": {\"title\": \"Base64 image\", \"type\": \"string\", \"readOnly\": true, \"format\": \"uri\"}}}, \"ComponentAlternate\": {\"required\": [\"dmg\", \"part\", \"full_name\", \"svg_path\"], \"type\": \"object\", \"properties\": {\"dmg\": {\"title\": \"Dmg\", \"type\": \"integer\", \"maximum\": 32767, \"minimum\": 0}, \"part\": {\"title\": \"Part\", \"type\": \"string\", \"maxLength\": 1, \"minLength\": 1}, \"full_name\": {\"title\": \"Full name\", \"type\": \"string\", \"maxLength\": 200, \"minLength\": 1}, \"svg_path\": {\"title\": \"Svg path\", \"type\": \"string\", \"maxLength\": 400, \"minLength\": 1}, \"id\": {\"title\": \"ID\", \"type\": \"integer\", \"readOnly\": true}}}, \"LibraryComponent\": {\"required\": [\"name\", \"svg_path\", \"thumbnail_path\", \"symbol_prefix\", \"component_library\", \"description\", \"data_link\", \"full_name\", \"keyword\"], \"type\": \"object\", \"properties\": {\"id\": {\"title\": \"ID\", \"type\": \"integer\", \"readOnly\": true}, \"name\": {\"title\": \"Name\", \"type\": \"string\", \"maxLength\": 200, \"minLength\": 1}, \"svg_path\": {\"title\": \"Svg path\", \"type\": \"string\", \"maxLength\": 400, \"minLength\": 1}, \"thumbnail_path\": {\"title\": \"Thumbnail path\", \"type\": \"string\", \"maxLength\": 400, \"minLength\": 1}, \"symbol_prefix\": {\"title\": \"Symbol prefix\", \"type\": \"string\", \"maxLength\": 10, \"minLength\": 1}, \"component_library\": {\"title\": \"Component library\", \"type\": \"string\", \"format\": \"uri\"}, \"description\": {\"title\": \"Description\", \"type\": \"string\", \"maxLength\": 400, \"minLength\": 1}, \"data_link\": {\"title\": \"Data link\", \"type\": \"string\", \"format\": \"uri\", \"maxLength\": 200, \"minLength\": 1}, \"full_name\": {\"title\": \"Full name\", \"type\": \"string\", \"maxLength\": 200, \"minLength\": 1}, \"keyword\": {\"title\": \"Keyword\", \"type\": \"string\", \"maxLength\": 200, \"minLength\": 1}, \"alternate_component\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/definitions/ComponentAlternate\"}, \"readOnly\": true}}}, \"Library\": {\"required\": [\"library_name\"], \"type\": \"object\", \"properties\": {\"library_name\": {\"title\": \"Library name\", \"type\": \"string\", \"maxLength\": 200, \"minLength\": 1}, \"saved_on\": {\"title\": \"Saved on\", \"type\": \"string\", \"format\": \"date-time\", \"readOnly\": true}, \"id\": {\"title\": \"ID\", \"type\": \"integer\", \"readOnly\": true}}}, \"CircuitTag\": {\"required\": [\"tag\", \"description\"], \"type\": \"object\", \"properties\": {\"tag\": {\"title\": \"Tag\", \"type\": \"string\", \"maxLength\": 100, \"minLength\": 1}, \"description\": {\"title\": \"Description\", \"type\": \"string\", \"maxLength\": 200, \"minLength\": 1}, \"id\": {\"title\": \"ID\", \"type\": \"integer\", \"readOnly\": true}}}, \"Publish\": {\"type\": \"object\", \"properties\": {\"published\": {\"title\": \"Published\", \"type\": \"boolean\"}, \"reviewed_by\": {\"title\": \"Reviewed by\", \"type\": \"string\", \"format\": \"uri\", \"x-nullable\": true}, \"circuit\": {\"$ref\": \"#/definitions/Circuit\"}, \"tags\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/definitions/CircuitTag\"}, \"readOnly\": true}}}, \"StateSave\": {\"required\": [\"data_dump\"], \"type\": \"object\", \"properties\": {\"save_time\": {\"title\": \"Save time\", \"type\": \"string\", \"format\": \"date-time\", \"readOnly\": true}, \"save_id\": {\"title\": \"Save id\", \"type\": \"string\", \"format\": \"uuid\"}, \"data_dump\": {\"title\": \"Data dump\", \"type\": \"string\", \"minLength\": 1}, \"name\": {\"title\": \"Name\", \"type\": \"string\", \"maxLength\": 200, \"minLength\": 1, \"x-nullable\": true}, \"description\": {\"title\": \"Description\", \"type\": \"string\", \"maxLength\": 400, \"minLength\": 1, \"x-nullable\": true}, \"owner\": {\"title\": \"Owner\", \"type\": \"integer\", \"x-nullable\": true}, \"shared\": {\"title\": \"Shared\", \"type\": \"boolean\"}, \"base64_image\": {\"title\": \"Base64 image\", \"type\": \"string\", \"readOnly\": true, \"format\": \"uri\"}, \"create_time\": {\"title\": \"Create time\", \"type\": \"string\", \"format\": \"date-time\", \"readOnly\": true}}}}}\n"
  },
  {
    "path": "eda-frontend/.dockerignore",
    "content": "node_modules/\n"
  },
  {
    "path": "eda-frontend/.eslintignore",
    "content": "\n/build/**\n/coverage/**\n/docs/**\n/jsdoc/**\n/templates/**\n/tests/bench/**\n/tests/fixtures/**\n/tests/performance/**\n/tmp/**\n/tools/internal-rules/node_modules/**\ntest.js\n!.eslintrc.js\nnode_modules/**\n/node_modules/**\n"
  },
  {
    "path": "eda-frontend/.eslintrc.json",
    "content": "{\n    \"parser\": \"babel-eslint\",\n    \"env\": {\n        \"browser\": true,\n        \"es6\": true,\n        \"commonjs\": true\n    },\n    \"extends\": [\n        \"plugin:react/recommended\",\n        \"standard\"\n    ],\n    \"globals\": {\n        \"Atomics\": \"readonly\",\n        \"SharedArrayBuffer\": \"readonly\"\n    },\n    \"parserOptions\": {\n        \"ecmaFeatures\": {\n            \"jsx\": true\n        },\n        \"ecmaVersion\": 2018,\n        \"sourceType\": \"module\"\n    },\n    \"plugins\": [\n        \"react\"\n    ],\n    \"rules\": {\n        \"react/prop-types\": \"warn\"\n    },\n\n    \"settings\": {\n        \"react\": {\n            \"version\": \"latest\"\n        }\n    }\n}\n"
  },
  {
    "path": "eda-frontend/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# production\n/build\n.svg\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n.env.prod\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n#bundle-parcel\n/dist\n/.cache\n"
  },
  {
    "path": "eda-frontend/Dockerfile",
    "content": "FROM node:10-alpine3.11\n\nRUN mkdir /code\nWORKDIR /code\n\nCOPY package.json /code/package.json\nCOPY package-lock.json /code/package-lock.json\n"
  },
  {
    "path": "eda-frontend/README.md",
    "content": "# EDA Frontend\n\n### React application for EDA frontend\n\n<hr>\n\n## Prerequisites\n\n#### Install Node JS\nRefer to https://nodejs.org/en/ to install nodejs\n\n<hr>\n\n## Cloning and Running the Application in local\n\nClone the project into local\n\n#### Install all the npm packages. \nGo into the project folder and type the following command to install all npm packages and dependencies\n\n```bash\nnpm install\n```\n\nIn order to run the application Type the following command\n\n```bash\nnpm start\n```\nRuns the application in the development mode.<br />\nOpen **[localhost:3000](http://localhost:3000)** to view it in the browser.\n\nThe page will reload if you make edits.<br />\nYou will also see any lint errors in the console.\n"
  },
  {
    "path": "eda-frontend/package.json",
    "content": "{\n  \"name\": \"eda-frontend\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@material-ui/core\": \"^4.11.4\",\n    \"@material-ui/icons\": \"^4.11.2\",\n    \"@material-ui/lab\": \"^4.0.0-alpha.58\",\n    \"@testing-library/jest-dom\": \"^4.2.4\",\n    \"@testing-library/react\": \"^9.5.0\",\n    \"@testing-library/user-event\": \"^7.2.1\",\n    \"axios\": \"^0.21.1\",\n    \"brace\": \"^0.11.1\",\n    \"canvg\": \"^3.0.7\",\n    \"chart.js\": \"^2.9.4\",\n    \"chartjs-plugin-colorschemes\": \"^0.4.0\",\n    \"file-saver\": \"^2.0.5\",\n    \"material-ui-popup-state\": \"^1.8.4\",\n    \"multiselect-react-dropdown\": \"^1.7.0\",\n    \"mxgraph\": \"^4.2.2\",\n    \"query-string\": \"^6.14.1\",\n    \"randomstring\": \"^1.2.1\",\n    \"react\": \"^16.14.0\",\n    \"react-ace\": \"^9.4.1\",\n    \"react-brace\": \"^3.6.6\",\n    \"react-chartjs-2\": \"^2.11.2\",\n    \"react-dom\": \"^16.14.0\",\n    \"react-draggable\": \"^4.4.3\",\n    \"react-loader-spinner\": \"^3.1.14\",\n    \"react-redux\": \"^7.2.4\",\n    \"react-router-dom\": \"^5.1.2\",\n    \"react-scripts\": \"3.4.1\",\n    \"redux\": \"^4.1.0\",\n    \"redux-logger\": \"^3.0.6\",\n    \"redux-thunk\": \"^2.3.0\",\n    \"typescript\": \"^3.9.10\",\n    \"spinners-react\": \"^1.0.4\"\n  },\n  \"scripts\": {\n    \"start\": \"react-scripts start\",\n    \"build\": \"export TOOL_NODE_FLAGS='--max_old_space_size=8192' && react-scripts build\",\n    \"test\": \"react-scripts test\",\n    \"eject\": \"react-scripts eject\",\n    \"lint\": \"eslint src\"\n  },\n  \"eslintConfig\": {\n    \"extends\": \"react-app\"\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.3%\",\n      \"not ie 11\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \">0.3%\",\n      \"not ie 11\",\n      \"not dead\",\n      \"not op_mini all\"\n    ]\n  },\n  \"devDependencies\": {\n    \"babel-eslint\": \"^10.1.0\",\n    \"eslint\": \"^6.6.0\",\n    \"eslint-config-standard\": \"^14.1.1\",\n    \"eslint-plugin-import\": \"^2.23.4\",\n    \"eslint-plugin-node\": \"^11.1.0\",\n    \"eslint-plugin-promise\": \"^4.3.1\",\n    \"eslint-plugin-react\": \"^7.24.0\",\n    \"eslint-plugin-standard\": \"^4.1.0\",\n    \"react-test-renderer\": \"^16.14.0\"\n  }\n}\n"
  },
  {
    "path": "eda-frontend/public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <link rel=\"icon\" href=\"%PUBLIC_URL%/favicon.ico\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <meta name=\"theme-color\" content=\"#000000\" />\n     <!-- Fonts to support Material Design -->\n     <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap\" />\n     <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" />\n    <!--\n      manifest.json provides metadata used when your web app is installed on a\n      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n    -->\n    <link rel=\"manifest\" href=\"%PUBLIC_URL%/manifest.json\" />\n    <!--\n      Notice the use of %PUBLIC_URL% in the tags above.\n      It will be replaced with the URL of the `public` folder during the build.\n      Only files inside the `public` folder can be referenced from the HTML.\n\n      Unlike \"/favicon.ico\" or \"favicon.ico\", \"%PUBLIC_URL%/favicon.ico\" will\n      work correctly both with client-side routing and a non-root public URL.\n      Learn how to configure a non-root public URL by running `npm run build`.\n    -->\n    <title>EDA</title>\n  </head>\n  <body>\n    <noscript>You need to enable JavaScript to run this app.</noscript>\n    <div id=\"root\"></div>\n    <!--\n      This HTML file is a template.\n      If you open it directly in the browser, you will see an empty page.\n\n      You can add webfonts, meta tags, or analytics to this file.\n      The build step will place the bundled scripts into the <body> tag.\n\n      To begin the development, run `npm start` or `yarn start`.\n      To create a production bundle, use `npm run build` or `yarn build`.\n    -->\n  </body>\n</html>\n"
  },
  {
    "path": "eda-frontend/public/manifest.json",
    "content": "{\n  \"short_name\": \"React App\",\n  \"name\": \"Create React App Sample\",\n  \"icons\": [\n    {\n      \"src\": \"favicon.ico\",\n      \"sizes\": \"64x64 32x32 24x24 16x16\",\n      \"type\": \"image/x-icon\"\n    }\n  ],\n  \"start_url\": \".\",\n  \"display\": \"standalone\",\n  \"theme_color\": \"#000000\",\n  \"background_color\": \"#ffffff\"\n}\n"
  },
  {
    "path": "eda-frontend/src/App.js",
    "content": "/* eslint-disable react/prop-types */\nimport React, { useEffect, useState } from 'react'\nimport { HashRouter, Switch, Route, Redirect } from 'react-router-dom'\nimport CircularProgress from '@material-ui/core/CircularProgress'\n\nimport Navbar from './components/Shared/Navbar'\nimport Home from './pages/Home'\nimport Login from './pages/Login'\nimport NotFound from './pages/NotFound'\nimport SchematicEditor from './pages/SchematiEditor'\n\nimport Simulator from './pages/Simulator'\nimport Gallery from './pages/Gallery'\nimport PublicProjects from './pages/Projects'\nimport Dashboard from './pages/Dashboard'\nimport SignUp from './pages/signUp'\nimport ResetPassword from './pages/ResetPassword/Initiation'\nimport ResetPasswordConfirm from './pages/ResetPassword/Confirmation'\nimport ChangePassword from './pages/Account/ChangePassword'\nimport Submissions from './pages/SubmissionPage'\nimport LTISetup from './pages/LTISetup'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { loadUser } from './redux/actions/index'\nimport ProjectPage from './pages/ProjectPage'\n\n// Controls Private routes, this are accessible for authenticated users.  [ e.g : dashboard ]\n// and restricted routes disabled for authenticated users. [ e.g : login , signup ]\nfunction PrivateRoute ({ component: Component, ...rest }) {\n  const auth = useSelector(state => state.authReducer)\n  const [count, setcount] = useState(0)\n  const dispatch = useDispatch()\n  useEffect(() => {\n    dispatch(loadUser())\n  }, [dispatch])\n\n  if (count === 0) {\n    setcount(1)\n    dispatch(loadUser())\n  }\n\n  return <Route {...rest} render={props => {\n    if (auth.isLoading) {\n      return <CircularProgress style={{ margin: '50vh 50vw' }} />\n    } else if (!auth.isAuthenticated) {\n      return <Redirect to=\"/login\" />\n    } else {\n      return <Component {...props} />\n    }\n  }} />\n}\n\n// Public routes accessible to all users. [ e.g. editor, gallery ]\nfunction PublicRoute ({ component: Component, restricted, nav, ...rest }) {\n  const auth = useSelector(state => state.authReducer)\n  const dispatch = useDispatch()\n\n  useEffect(() => dispatch(loadUser()), [dispatch])\n\n  return <Route {...rest} render={props => {\n    if (auth.isLoading) {\n      return <CircularProgress style={{ margin: '50vh 50vw' }} />\n    } else if (auth.isAuthenticated && restricted) {\n      return <Redirect to=\"/dashboard\" />\n    } else if (nav) {\n      return (<><Navbar /><Component {...props} /></>)\n    } else {\n      return <Component {...props} />\n    }\n  }} />\n}\n\nfunction App () {\n  return (\n    // Handles Routing for an application\n    <HashRouter>\n      <Switch>\n        <PublicRoute exact path=\"/login\" restricted={true} nav={false} component={Login} />\n        <PublicRoute exact path=\"/signup\" restricted={true} nav={false} component={SignUp} />\n        <PublicRoute exact path=\"/reset-password\" restricted={true} nav={false} component={ResetPassword} />\n        <PublicRoute exact path=\"/password/reset/confirm/:id/:token\" restricted={true} nav={false} component={ResetPasswordConfirm} />\n        <PublicRoute exact path=\"/\" restricted={false} nav={true} component={Home} />\n        {localStorage.getItem('esim_token') !== null\n          ? <PublicRoute exact path=\"/editor\" restricted={false} nav={false} component={SchematicEditor} />\n          : <Route path=\"/editor\" component={SchematicEditor} />\n        }\n        <PublicRoute exact path=\"/project\" restricted={false} nav={true} component={ProjectPage} />\n        <PublicRoute exact path=\"/simulator/ngspice\" restricted={false} nav={true} component={Simulator} />\n        <PublicRoute exact path=\"/gallery\" restricted={false} nav={true} component={Gallery} />\n        <PublicRoute exact path=\"/projects\" restricted={false} nav={true} component={PublicProjects} />\n        <PrivateRoute path=\"/dashboard\" component={Dashboard} />\n        <PrivateRoute path=\"/submission\" component={Submissions} />\n        <PrivateRoute path=\"/lti\" component = {LTISetup} />\n        <PrivateRoute path=\"/account/change_password\" component={ChangePassword} />\n        <PublicRoute restricted={false} nav={true} component={NotFound} />\n      </Switch>\n    </HashRouter>\n  )\n}\n\nexport default App\n"
  },
  {
    "path": "eda-frontend/src/App.test.js",
    "content": "// Basic unit test for React application.\n/* eslint-disable no-undef */\nimport React from 'react'\nimport { create } from 'react-test-renderer'\n\nfunction Button (props) {\n  return <button>Nothing to do for now</button>\n}\n\ndescribe('Button component', () => {\n  test('Matches the snapshot', () => {\n    const button = create(<Button />)\n    expect(button.toJSON()).toMatchSnapshot()\n  })\n})\n"
  },
  {
    "path": "eda-frontend/src/__snapshots__/App.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Button component Matches the snapshot 1`] = `\n<button>\n  Nothing to do for now\n</button>\n`;\n"
  },
  {
    "path": "eda-frontend/src/components/Dashboard/DashboardHome.js",
    "content": "import React from 'react'\nimport PropTypes from 'prop-types'\nimport {\n  Card,\n  Grid,\n  Button,\n  Typography,\n  CardActions,\n  CardContent\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { Link as RouterLink } from 'react-router-dom'\nimport { useSelector } from 'react-redux'\n\nimport ProgressPanel from './ProgressPanel'\n\nconst useStyles = makeStyles((theme) => ({\n  mainHead: {\n    width: '100%',\n    backgroundColor: '#404040',\n    color: '#fff'\n  },\n  title: {\n    fontSize: 14,\n    color: '#80ff80'\n  }\n}))\n\n// Card displaying user dashboard home page header.\nfunction MainCard () {\n  const classes = useStyles()\n  const auth = useSelector(state => state.authReducer)\n\n  return (\n    <Card className={classes.mainHead}>\n      <CardContent>\n        <Typography className={classes.title} gutterBottom>\n          Welcome to your EDA Dashboard\n        </Typography>\n        <Typography variant=\"h5\" component=\"h2\">\n          Welcome {auth.user.username}...\n        </Typography>\n      </CardContent>\n      <CardActions>\n        <Button\n          component={RouterLink}\n          to=\"/dashboard/schematics\"\n          color=\"primary\"\n          size=\"small\"\n        >\n          My Schematics\n        </Button>\n      </CardActions>\n    </Card>\n  )\n}\n\nexport default function DashboardHome ({ ltiDetails = null }) {\n  const classes = useStyles()\n  const auth = useSelector(state => state.authReducer)\n\n  return (\n    <>\n      <Grid\n        container\n        direction=\"row\"\n        justify=\"flex-start\"\n        alignItems=\"flex-start\"\n        alignContent=\"center\"\n        spacing={3}\n      >\n        {/* User Dashboard Home Header */}\n        <Grid item xs={12}>\n          <MainCard />\n        </Grid>\n\n        <Grid item xs={12}>\n          <Card style={{ padding: '7px 15px' }} className={classes.mainHead}>\n            <Typography variant=\"subtitle1\" gutterBottom>\n              Hey {auth.user.username} , Track your schematics status here...\n            </Typography>\n          </Card>\n        </Grid>\n\n        {/* List recent schematics saved by user */}\n        <Grid item xs={12}>\n          <Card>\n            <ProgressPanel ltiDetails={ltiDetails} />\n          </Card>\n        </Grid>\n      </Grid>\n    </>\n  )\n}\n\nDashboardHome.propTypes = {\n  ltiDetails: PropTypes.string\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Dashboard/DashboardOtherProjects.js",
    "content": "import React, { useEffect } from 'react'\nimport {\n  Card,\n  Grid,\n  Typography,\n  CardContent,\n  Input,\n  IconButton,\n  Popover,\n  FormControl,\n  Tabs,\n  Tab,\n  AppBar,\n  Select,\n  MenuItem,\n  InputLabel\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { useDispatch, useSelector } from 'react-redux'\nimport ProjectCard from './ProjectCard'\nimport FilterListIcon from '@material-ui/icons/FilterList'\nimport PropTypes from 'prop-types'\nimport { fetchOtherProjects } from '../../redux/actions/index'\n\nconst useStyles = makeStyles({\n  mainHead: {\n    width: '100%',\n    backgroundColor: '#404040',\n    color: '#fff'\n  },\n  title: {\n    fontSize: 14,\n    color: '#80ff80'\n  }\n})\n\nfunction TabPanel (props) {\n  const { children, value, index } = props\n\n  return (\n    <>\n      {value === index && (\n        <>{children}</>\n      )}\n    </>\n  )\n}\n\nTabPanel.propTypes = {\n  children: PropTypes.node,\n  index: PropTypes.any.isRequired,\n  value: PropTypes.any.isRequired\n}\nfunction DashboardOtherProjects () {\n  const projects = useSelector(state => state.dashboardReducer.otherProjects)\n  const classes = useStyles()\n  const auth = useSelector(state => state.authReducer)\n  const dispatch = useDispatch()\n  const [value, setValue] = React.useState(0)\n  const [sort, setSort] = React.useState('')\n  const [order, setOrder] = React.useState('ascending')\n  const [filteredProjects, setFilteredProjects] = React.useState(projects)\n  const [anchorEl, setAnchorEl] = React.useState(null)\n  const open = Boolean(anchorEl)\n  useEffect(() => {\n    setFilteredProjects(projects)\n  }, [projects])\n  useEffect(() => {\n    dispatch(fetchOtherProjects())\n  }, [dispatch])\n  const handleFilterOpen = (e) => {\n    if (anchorEl) {\n      setAnchorEl(null)\n    } else {\n      setAnchorEl(e.currentTarget)\n    }\n  }\n  const handleChange = (event, newValue) => {\n    setValue(newValue)\n  }\n  const sortSaves = (sorting, order) => {\n    if (order === 'ascending') {\n      if (sorting === 'name') {\n        setFilteredProjects(filteredProjects.sort((a, b) => a.title > b.title))\n      } else if (sorting === 'author') {\n        setFilteredProjects(filteredProjects.sort((a, b) => a.author > b.author))\n      } else if (sorting === 'status') {\n        setFilteredProjects(filteredProjects.sort((a, b) => a.status_name > b.status_name))\n      }\n    } else {\n      if (sorting === 'name') {\n        setFilteredProjects(filteredProjects.sort((a, b) => a.title < b.title))\n      } else if (sorting === 'author') {\n        setFilteredProjects(filteredProjects.sort((a, b) => a.author < b.author))\n      } else if (sorting === 'status') {\n        setFilteredProjects(filteredProjects.sort((a, b) => a.status_name < b.status_name))\n      }\n    }\n  }\n  const handleSort = (e) => {\n    sortSaves(e.target.value, order)\n    setSort(e.target.value)\n  }\n  const handleOrder = (e) => {\n    setOrder(e.target.value)\n    if (sort !== '') {\n      sortSaves(sort, e.target.value)\n    }\n  }\n  const onSearch = (e) => {\n    setFilteredProjects(projects.filter((o) =>\n      // eslint-disable-next-line\n      Object.keys(o).some((k) => {\n        if ((k === 'title' || k === 'description' || k === 'author' || k === 'status_name') && String(o[k]).toLowerCase().includes(e.target.value.toLowerCase())) {\n          return String(o[k]).toLowerCase().includes(e.target.value.toLowerCase())\n        }\n      }\n      )\n    ))\n  }\n  return (\n    <>\n      <Grid\n        container\n        direction=\"row\"\n        justify=\"flex-start\"\n        alignItems=\"space-between\"\n        alignContent=\"center\"\n        spacing={3}>\n        <Grid item xs={12}>\n          <Card className={classes.mainHead}>\n            <CardContent>\n              <Typography className={classes.title} gutterBottom>\n                All the projects which are pending for a review are Listed Below\n              </Typography>\n              <Typography variant=\"h5\" component=\"h2\">\n                Review Projects\n              </Typography>\n            </CardContent>\n          </Card>\n        </Grid>\n        <Grid item xs={12}>\n          {filteredProjects && <IconButton onClick={handleFilterOpen} style={{ float: 'right' }} ><FilterListIcon /></IconButton>}\n          {filteredProjects && <Input style={{ float: 'right' }} onChange={(e) => onSearch(e)} placeholder='Search' />}\n          <Popover\n            open={open}\n            onClose={handleFilterOpen}\n            anchorOrigin={{\n              vertical: 'bottom',\n              horizontal: 'center'\n            }}\n            transformOrigin={{\n              vertical: 'top',\n              horizontal: 'center'\n            }}\n            anchorEl={anchorEl}\n          >\n            <FormControl style={{ width: ' 200px', padding: '2%' }}>\n              <InputLabel>Select Sort</InputLabel>\n              <Select className={classes.popover} value={sort} onChange={handleSort} >\n                <MenuItem key='name' value='name'>Name</MenuItem>\n                <MenuItem key='author' value='author'>Author</MenuItem>\n                <MenuItem key='status' value='status'>Status</MenuItem>\n              </Select>\n            </FormControl>\n            <FormControl style={{ width: ' 200px', padding: '2%' }}>\n              <InputLabel>Select Order</InputLabel>\n              <Select className={classes.popover} value={order} onChange={handleOrder} >\n                <MenuItem key='ascending' value='ascending'>Ascending</MenuItem>\n                <MenuItem key='descending' value='descending'>Descending</MenuItem>\n              </Select>\n            </FormControl>\n          </Popover>\n        </Grid>\n        <AppBar position='static'>\n          <Tabs value={value} onChange={handleChange}>\n            <Tab label='Projects to be reviewed' />\n            <Tab label='Reported Projects' />\n          </Tabs>\n        </AppBar>\n        <TabPanel style={{ width: '100%' }} value={value} index={0}>\n          {filteredProjects.filter(x => { return !x.is_reported }).length !== 0\n            ? <>\n              {filteredProjects.filter(x => { return !x.is_reported }).map(\n                (project) => {\n                  return (\n                    <Grid item xs={12} sm={6} lg={3} key={project.project_id}>\n                      <ProjectCard pub={project} is_review={true} />\n                    </Grid>\n                  )\n                }\n              )}\n            </>\n            : <Grid item xs={12}>\n              <Card style={{ padding: '7px 15px' }} className={classes.mainHead}>\n                <Typography variant=\"subtitle1\" gutterBottom>\n                  Hey {auth.user.username} , You don&apos;t have any projects to review...\n                </Typography>\n              </Card>\n            </Grid>\n          }\n        </TabPanel>\n        <TabPanel style={{ width: '100%' }} value={value} index={1}>\n          {filteredProjects.filter(x => { return x.is_reported }).length !== 0\n            ? <>\n              {filteredProjects.filter(x => { return x.is_reported }).map(\n                (project) => {\n                  return (\n                    <Grid item xs={12} sm={6} lg={3} key={project.project_id}>\n                      <ProjectCard pub={project} is_review={true} />\n                    </Grid>\n                  )\n                }\n              )}\n            </>\n            : <Grid item xs={12}>\n              <Card style={{ padding: '7px 15px' }} className={classes.mainHead}>\n                <Typography variant=\"subtitle1\" gutterBottom>\n                  Hey {auth.user.username} , You dont have any reported projects to review...\n                </Typography>\n              </Card>\n            </Grid>\n          }\n        </TabPanel>\n      </Grid>\n    </>\n  )\n}\n\nexport default DashboardOtherProjects\n"
  },
  {
    "path": "eda-frontend/src/components/Dashboard/DashboardSidebar.js",
    "content": "import React, { useEffect } from 'react'\nimport {\n  Hidden,\n  Divider,\n  Avatar,\n  List,\n  Typography,\n  ListItem,\n  ListItemText,\n  ListItemAvatar\n} from '@material-ui/core'\nimport { Link as RouterLink } from 'react-router-dom'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { deepPurple } from '@material-ui/core/colors'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { fetchSchematics, fetchOtherProjects, fetchRole } from '../../redux/actions/index'\nconst useStyles = makeStyles((theme) => ({\n  toolbar: {\n    minHeight: '45px'\n  },\n  purple: {\n    color: theme.palette.getContrastText(deepPurple[500]),\n    backgroundColor: deepPurple[500]\n  },\n  sideItem: {\n    padding: theme.spacing(1.5, 2)\n  },\n  nested: {\n    paddingLeft: theme.spacing(2),\n    overflow: 'auto',\n    width: '100%',\n    maxHeight: 200\n  },\n  nestedSearch: {\n    padding: theme.spacing(0),\n    border: '1px solid #cccccc',\n    margin: theme.spacing(1, 2),\n    borderRadius: '5px'\n  },\n  input: {\n    marginLeft: theme.spacing(1),\n    flex: 1\n  }\n}))\n\n// Vertical Navbar for user dashboard\nexport default function DashSidebar (props) {\n  const classes = useStyles()\n  const auth = useSelector(state => state.authReducer)\n  const dispatch = useDispatch()\n  // For Fetching Saved Schematics\n  useEffect(() => {\n    dispatch(fetchSchematics())\n    dispatch(fetchOtherProjects())\n    dispatch(fetchRole())\n  }, [dispatch])\n\n  return (\n    <>\n      <Hidden smDown>\n        <div className={classes.toolbar} />\n      </Hidden>\n      <List>\n        <ListItem\n          alignItems=\"flex-start\"\n          component={RouterLink}\n          to=\"/dashboard\"\n          style={{ marginTop: '15px' }}\n          className={classes.sideItem}\n          button\n          divider\n        >\n          <ListItemAvatar>\n            <Avatar className={classes.purple}>\n              {auth.user.username.charAt(0).toUpperCase()}\n            </Avatar>\n          </ListItemAvatar>\n          <ListItemText\n            primary={auth.user.username}\n            secondary={\n              <React.Fragment>\n                <Typography\n                  component=\"span\"\n                  variant=\"body2\"\n                  color=\"textSecondary\"\n                >\n                  {auth.roles !== null && auth.roles.group.map((value, key) => (<h3 key={value}>{value}</h3>))}\n                </Typography>\n              </React.Fragment>\n            }\n          />\n        </ListItem>\n\n        <ListItem\n          component={RouterLink}\n          to=\"/dashboard/profile\"\n          className={classes.sideItem}\n          button\n          divider\n        >\n          <ListItemText primary='My Profile' />\n        </ListItem>\n        <ListItem\n          component={RouterLink}\n          to=\"/dashboard/schematics\"\n          className={classes.sideItem}\n          button\n        >\n          <ListItemText primary='My Schematics' />\n        </ListItem>\n        <Divider />\n        {auth.roles && auth.roles.e_sim_reviewer &&\n          <ListItem\n            component={RouterLink}\n            to=\"/dashboard/review_projects\"\n            className={classes.sideItem}\n            button\n          >\n            <ListItemText primary='Review Projects' />\n          </ListItem>}\n\n      </List>\n    </>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Dashboard/ProgressPanel.js",
    "content": "/* eslint-disable react/no-unescaped-entities */\nimport React, { useEffect } from 'react'\nimport { Tab, Box, Tabs, AppBar, Typography, Grid } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport PropTypes from 'prop-types'\n\nimport SchematicCard from './SchematicCard'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { fetchSchematics } from '../../redux/actions/index'\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n    flexGrow: 1,\n    width: '100%',\n    backgroundColor: theme.palette.background.paper\n  }\n}))\n\nfunction TabPanel (props) {\n  const { children, value, index, ...other } = props\n\n  return (\n    <div\n      role=\"tabpanel\"\n      hidden={value !== index}\n      id={`scrollable-auto-tabpanel-${index}`}\n      aria-labelledby={`scrollable-auto-tab-${index}`}\n      {...other}\n    >\n      {value === index && (\n        <Box p={3}>\n          <Typography>{children}</Typography>\n        </Box>\n      )}\n    </div>\n  )\n}\n\nTabPanel.propTypes = {\n  children: PropTypes.node,\n  index: PropTypes.any.isRequired,\n  value: PropTypes.any.isRequired\n}\n\nfunction a11yProps (index) {\n  return {\n    id: `scrollable-auto-tab-${index}`,\n    'aria-controls': `scrollable-auto-tabpanel-${index}`\n  }\n}\n\nexport default function ProgressPanel ({ ltiDetails = null }) {\n  const classes = useStyles()\n  const [value, setValue] = React.useState(0)\n\n  const handleChange = (event, newValue) => {\n    setValue(newValue)\n  }\n\n  const schematics = useSelector(state => state.dashboardReducer.schematics)\n\n  const dispatch = useDispatch()\n\n  // For Fetching Saved Schematics\n  useEffect(() => {\n    dispatch(fetchSchematics())\n  }, [dispatch])\n\n  return (\n    <div className={classes.root}>\n      <AppBar position=\"static\">\n        <Tabs\n          value={value}\n          onChange={handleChange}\n          variant=\"scrollable\"\n          scrollButtons=\"auto\"\n          aria-label=\"scrollable auto tabs example\"\n        >\n          <Tab label=\"Recent Schematics\" {...a11yProps(0)} />\n          {/* <Tab label=\"Under Reviewer\" {...a11yProps(1)} />\n          <Tab label=\"Under Domain Expert\" {...a11yProps(2)} /> */}\n        </Tabs>\n      </AppBar>\n\n      {/* Display overview of recently 4 saved schematics */}\n      <TabPanel value={value} index={0}>\n        {schematics.length !== 0\n          ? <Grid\n            container\n            direction=\"row\"\n            justify=\"flex-start\"\n            alignItems=\"flex-start\"\n            alignContent=\"center\"\n            spacing={3}\n          >\n            {schematics.slice(0, 4).map(\n              (sch) => {\n                var actual = null\n                var flag = null\n                ltiDetails.map(\n                  // eslint-disable-next-line\n                  (lti) => {\n                    if (lti.model_schematic === sch.save_id || lti.initial_schematic === sch.save_id) {\n                      flag = 1\n                      actual = lti.consumer_key\n                      // eslint-disable-next-line\n                      return\n                    }\n                  }\n                )\n                if (flag) {\n                  return (\n                    <Grid item xs={12} sm={6} lg={3} key={sch.save_id}>\n                      <SchematicCard sch={sch} consKey={actual} />\n                    </Grid>\n                  )\n                } else {\n                  return (\n                    <Grid item xs={12} sm={6} lg={3} key={sch.save_id}>\n                      <SchematicCard sch={sch} />\n                    </Grid>\n                  )\n                }\n                // return (\n                //   <Grid item xs={12} sm={6} lg={3} key={sch.save_id}>\n                //     <SchematicCard sch={sch} />\n                //   </Grid>\n                // )\n              }\n            )}\n          </Grid>\n          : <Typography variant=\"button\" display=\"block\" gutterBottom>\n            You have not created any schematic , Create your first one now...\n          </Typography>\n        }\n      </TabPanel>\n\n      {/* Listing Schematics Under Review */}\n      {/* <TabPanel value={value} index={1}>\n        <Typography variant=\"button\" display=\"block\" gutterBottom>\n          Start publishing circuit , You don't have any schematics under review...\n        </Typography>\n      </TabPanel> */}\n\n      {/* Listing Reviewed Schematics */}\n      {/* <TabPanel value={value} index={2}>\n        <Typography variant=\"button\" display=\"block\" gutterBottom>\n          Start publishing circuit , You don't have any schematics to be tagged by\n          domain expert...\n        </Typography>\n      </TabPanel> */}\n    </div>\n  )\n}\n\nProgressPanel.propTypes = {\n  ltiDetails: PropTypes.string\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Dashboard/ProjectCard.js",
    "content": "/* eslint-disable camelcase */\nimport {\n  ButtonBase,\n  Card,\n  CardActionArea,\n  CardContent,\n  CardHeader,\n  CardMedia,\n  Typography\n} from '@material-ui/core'\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { Link as RouterLink } from 'react-router-dom'\nconst useStyles = makeStyles((theme) => ({\n  media: {\n    height: 0,\n    paddingTop: '56.25%' // 16:9\n  },\n  rating: {\n    marginTop: theme.spacing(1),\n    marginLeft: 'auto'\n  },\n  no: {\n    color: 'red',\n    marginLeft: '10px'\n  }\n}))\n\nexport default function ProjectCard ({ pub, is_review }) {\n  const classes = useStyles()\n  return (\n    <>\n      <Card>\n        <ButtonBase\n          target=\"_blank\"\n          component={RouterLink}\n          to={'/project?save_id=' + pub.save_id + '&version=' + pub.active_version + '&branch=' + pub.active_branch + '&project_id=' + pub.project_id}\n          style={{ width: '100%' }}>\n          <CardActionArea>\n            <CardHeader title={pub.title} />\n            <CardMedia\n              className={classes.media}\n              image={pub.active_save.base64_image} />\n            <CardContent>\n              <Typography variant=\"body2\" component=\"p\" noWrap={true}>\n                {pub.description}\n              </Typography>\n              <br/>\n              <Typography variant='body2' color='textSecondary' component='p'>\n              Status: {pub.status_name}\n              </Typography>\n              {/* <Typography variant='body2' component='p' color='textSecondary' style={{ margin: '5px 0px 0px 0px' }}>\n              Updated at {timeSince(pub.save_time)} ago...\n            </Typography> */}\n            </CardContent>\n          </CardActionArea>\n        </ButtonBase>\n      </Card>\n    </>\n  )\n}\nProjectCard.propTypes = {\n  pub: PropTypes.object,\n  is_review: PropTypes.bool\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Dashboard/SchematicCard.js",
    "content": "import React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n  Button,\n  Typography,\n  Card,\n  CardActionArea,\n  CardActions,\n  CardContent,\n  CardMedia,\n  CardHeader,\n  Tooltip,\n  ButtonBase,\n  Chip,\n  IconButton\n} from '@material-ui/core'\nimport ScreenShareRoundedIcon from '@material-ui/icons/ScreenShareRounded'\nimport ShareIcon from '@material-ui/icons/Share'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { Link as RouterLink } from 'react-router-dom'\nimport { deleteSchematic, fetchSchematics } from '../../redux/actions/index'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport { useDispatch } from 'react-redux'\nimport ReportProblemIcon from '@material-ui/icons/ReportProblem'\nimport SimpleSnackbar from '../Shared/Snackbar'\n\nconst useStyles = makeStyles((theme) => ({\n  media: {\n    height: 0,\n    paddingTop: '56.25%' // 16:9\n  },\n  rating: {\n    marginTop: theme.spacing(1),\n    marginLeft: 'auto'\n  },\n  no: {\n    color: 'red',\n    marginLeft: '10px'\n  },\n  paper: {\n    position: 'absolute',\n    width: 400,\n    backgroundColor: theme.palette.background.paper,\n    border: '2px solid #000',\n    boxShadow: theme.shadows[5],\n    padding: theme.spacing(2, 4, 3)\n  },\n  config: {\n    backgroundColor: theme.palette.background.paper,\n    padding: theme.spacing(1)\n  },\n  delete: {\n    backgroundColor: 'red',\n    color: 'white'\n  },\n  formControl: {\n    margin: theme.spacing(1),\n    maxWidth: 150\n  }\n}))\n\n// Display schematic updated status (e.g : updated 2 hours ago...)\nfunction timeSince (jsonDate) {\n  const json = jsonDate\n\n  const date = new Date(json)\n\n  const seconds = Math.floor((new Date() - date) / 1000)\n\n  let interval = Math.floor(seconds / 31536000)\n\n  if (interval > 1) {\n    return interval + ' years'\n  }\n  interval = Math.floor(seconds / 2592000)\n  if (interval > 1) {\n    return interval + ' months'\n  }\n  interval = Math.floor(seconds / 86400)\n  if (interval > 1) {\n    return interval + ' days'\n  }\n  interval = Math.floor(seconds / 3600)\n  if (interval > 1) {\n    return interval + ' hours'\n  }\n  interval = Math.floor(seconds / 60)\n  if (interval > 1) {\n    return interval + ' minutes'\n  }\n  return Math.floor(seconds) + ' seconds'\n}\n\n// Display schematic created date (e.g : Created On 29 Jun 2020)\nfunction getDate (jsonDate) {\n  const json = jsonDate\n  const date = new Date(json)\n  const dateTimeFormat = new Intl.DateTimeFormat('en', { year: 'numeric', month: 'short', day: '2-digit' })\n  const [{ value: month }, , { value: day }, , { value: year }] = dateTimeFormat.formatToParts(date)\n  return `${day}-${month}-${year}`\n}\n\n// Card displaying overview of onCloud saved schematic.\nexport default function SchematicCard ({ sch }) {\n  const classes = useStyles()\n  const dispatch = useDispatch()\n\n  useEffect(() => {\n    dispatch(fetchSchematics())\n  }, [dispatch])\n\n  // To handle delete schematic snackbar\n  const [snacOpen, setSnacOpen] = React.useState(false)\n\n  const handleSnacClick = () => {\n    setSnacOpen(true)\n  }\n  const handleSnacClose = (event, reason) => {\n    if (reason === 'clickaway') {\n      return\n    }\n    setSnacOpen(false)\n  }\n  const clickViewProject = () => {\n    const win = window.open()\n    win.location.href = '/eda/#/project?save_id=' + sch.save_id + '&version=' + sch.project_version + '&branch=' + sch.project_branch + '&project_id=' + sch.project_id\n    win.focus()\n  }\n\n  const clickViewLTI = () => {\n    window.location.href = `/eda/#/lti?id=${sch.save_id}&version=${sch.version}&branch=${sch.branch}`\n  }\n\n  return (\n    <>\n      {/* User saved Schematic Overview Card */}\n\n      <Card>\n        <ButtonBase\n          target=\"_blank\"\n          component={RouterLink}\n          to={sch.lti_id ? `/editor?id=${sch.save_id}&version=${sch.version}&lti_id=${sch.lti_id}&branch=${sch.branch}` : `/editor?id=${sch.save_id}&version=${sch.version}&branch=${sch.branch}`}\n          // to={'/editor?id=' + sch.save_id + '&version=' + sch.version + '&branch=' + sch.branch}\n          style={{ width: '100%' }}\n        >\n          <CardActionArea>\n            <CardHeader\n              title={sch.name}\n              subheader={'Created On ' + getDate(sch.create_time)}\n              action={sch.project_id && sch.is_reported === true && <Tooltip title='Project is reported!' arrow><ReportProblemIcon style={{ color: 'red' }} /></Tooltip>}\n            />\n            <CardMedia\n              className={classes.media}\n              image={sch.base64_image}\n              title={sch.name}\n            />\n            <CardContent>\n              <Typography variant=\"body2\" component=\"p\">\n                {sch.description}\n              </Typography>\n              {/* Display updated status */}\n              <Typography variant=\"body2\" color=\"textSecondary\" component=\"p\" style={{ margin: '5px 0px 0px 0px' }}>\n\n              </Typography>\n            </CardContent>\n          </CardActionArea>\n        </ButtonBase>\n        <CardActions>\n          <Chip color='primary' variant='outlined' label={`Updated ${timeSince(sch.save_time)} ago...`} />\n          {sch.project_id && <Chip variant='outlined' clickable={true} onClick={clickViewProject} label='Project' />}\n          {sch.lti_id && <Chip variant='outlined' clickable={true} onClick={clickViewLTI} label='LTI' />}\n          {/* Display create LTI app option  */}\n          {!sch.lti_id && <Tooltip title='Create LTI app' placement=\"bottom\" arrow>\n            <IconButton\n              component={RouterLink}\n              color='secondary'\n              // style={{ marginLeft: 'auto' }}\n              // fontSize=\"small\"\n              to={`/lti?id=${sch.save_id}&version=${sch.version}&branch=${sch.branch}`} >\n              <ScreenShareRoundedIcon fontSize=\"small\" />\n            </IconButton>\n          </Tooltip>}\n          {/* Display delete option */}\n          {!sch.project_id &&\n          <Button onClick={() => { handleSnacClick() }}>\n            <Tooltip title=\"Delete\" placement=\"bottom\" arrow>\n              <DeleteIcon\n                color=\"secondary\"\n                fontSize=\"small\"\n              // style={{ marginLeft: 'auto' }}\n              />\n            </Tooltip>\n          </Button>}\n          <SimpleSnackbar open={snacOpen} close={handleSnacClose} sch={sch} confirmation={deleteSchematic} />\n\n          {/* Display share status */}\n          <Tooltip\n            title={!sch.shared ? 'SHARE OFF' : 'SHARE ON'}\n            placement=\"bottom\"\n            arrow\n          >\n            <ShareIcon\n              color={!sch.shared ? 'disabled' : 'primary'}\n              fontSize=\"small\"\n              style={{ marginRight: '10px' }}\n            />\n          </Tooltip>\n        </CardActions>\n      </Card>\n\n    </>\n  )\n}\n\nSchematicCard.propTypes = {\n  sch: PropTypes.object,\n  createCircuit: PropTypes.func,\n  consKey: PropTypes.string\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Dashboard/SchematicsList.js",
    "content": "import React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n  Card,\n  Grid,\n  Button,\n  Typography,\n  CardActions,\n  CardContent,\n  Input,\n  IconButton,\n  Popover,\n  FormControl,\n  Tabs,\n  Tab,\n  AppBar,\n  Select,\n  MenuItem,\n  InputLabel\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { Link as RouterLink } from 'react-router-dom'\nimport SchematicCard from './SchematicCard'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { fetchSchematics } from '../../redux/actions/index'\nimport FilterListIcon from '@material-ui/icons/FilterList'\nconst useStyles = makeStyles((theme) => ({\n  mainHead: {\n    width: '100%',\n    backgroundColor: '#404040',\n    color: '#fff'\n  },\n  title: {\n    fontSize: 14,\n    color: '#80ff80'\n  },\n  typography: {\n    padding: theme.spacing(2)\n  },\n  popover: {\n    paddingRight: '10px'\n  }\n}))\n\nfunction TabPanel (props) {\n  const { children, value, index } = props\n\n  return (\n    <React.Fragment\n    >\n      {value === index && (\n        <>{children}</>\n      )}\n    </React.Fragment>\n  )\n}\n\nTabPanel.propTypes = {\n  children: PropTypes.node,\n  index: PropTypes.any.isRequired,\n  value: PropTypes.any.isRequired\n}\n\n// Card displaying user my schematics page header.\nfunction MainCard () {\n  const classes = useStyles()\n\n  return (\n    <Card className={classes.mainHead}>\n      <CardContent>\n        <Typography className={classes.title} gutterBottom>\n          All schematics are Listed Below\n        </Typography>\n        <Typography variant=\"h5\" component=\"h2\">\n          My Schematics\n        </Typography>\n      </CardContent>\n      <CardActions>\n        <Button\n          target=\"_blank\"\n          component={RouterLink}\n          to=\"/editor\"\n          size=\"small\"\n          color=\"primary\"\n        >\n          Create New\n        </Button>\n        <Button size=\"small\" color=\"secondary\">\n          Load More\n        </Button>\n      </CardActions>\n    </Card>\n  )\n}\n\nexport default function SchematicsList ({ ltiDetails = null }) {\n  const classes = useStyles()\n  const auth = useSelector(state => state.authReducer)\n  const schematics = useSelector(state => state.dashboardReducer.schematics)\n  const [saves, setSaves] = React.useState(schematics)\n  const dispatch = useDispatch()\n  const [anchorEl, setAnchorEl] = React.useState(null)\n  const open = Boolean(anchorEl)\n  const [value, setValue] = React.useState(0)\n  const [sort, setSort] = React.useState('')\n  const [order, setOrder] = React.useState('ascending')\n  // For Fetching Saved Schematics\n  useEffect(() => {\n    dispatch(fetchSchematics())\n  }, [dispatch])\n  useEffect(() => {\n    setSaves(schematics)\n  }, [schematics])\n  const onSearch = (e) => {\n    setSaves(schematics.filter((o) =>\n      // eslint-disable-next-line\n      Object.keys(o).some((k) => {\n        if ((k === 'name' || k === 'description' || k === 'owner' || k === 'save_time' || k === 'create_time') && String(o[k]).toLowerCase().includes(e.target.value.toLowerCase())) {\n          return String(o[k]).toLowerCase().includes(e.target.value.toLowerCase())\n        }\n      }\n      )\n    ))\n  }\n  const handleFilterOpen = (e) => {\n    if (anchorEl) {\n      setAnchorEl(null)\n    } else {\n      setAnchorEl(e.currentTarget)\n    }\n  }\n  const sortSaves = (sorting, order) => {\n    if (order === 'ascending') {\n      if (sorting === 'name') {\n        setSaves(saves.sort((a, b) => (a.name > b.name) ? 1 : -1))\n      } else if (sorting === 'created_at') {\n        setSaves(saves.sort((a, b) => (a.create_time > b.create_time) ? 1 : -1))\n      } else if (sorting === 'updated_at') {\n        setSaves(saves.sort((a, b) => (a.save_time < b.save_time) ? 1 : -1))\n      }\n    } else {\n      if (sorting === 'name') {\n        setSaves(saves.sort((a, b) => (a.name < b.name) ? 1 : -1))\n      } else if (sorting === 'created_at') {\n        setSaves(saves.sort((a, b) => (a.create_time < b.create_time) ? 1 : -1))\n      } else if (sorting === 'updated_at') {\n        setSaves(saves.sort((a, b) => (a.save_time > b.save_time) ? 1 : -1))\n      }\n    }\n  }\n  const handleSort = (e) => {\n    sortSaves(e.target.value, order)\n    setSort(e.target.value)\n  }\n  const handleOrder = (e) => {\n    setOrder(e.target.value)\n    if (sort !== '') {\n      sortSaves(sort, e.target.value)\n    }\n  }\n  const handleChange = (event, newValue) => {\n    setValue(newValue)\n  }\n  return (\n    <>\n      <Grid\n        container\n        direction=\"row\"\n        justify=\"flex-start\"\n        alignItems=\"flex-start\"\n        alignContent=\"center\"\n        spacing={3}\n      >\n        {/* User Dashboard My Schematic Header */}\n        <Grid item xs={12}>\n          <MainCard />\n        </Grid>\n        <Grid item xs={12}>\n          {schematics && <IconButton onClick={handleFilterOpen} style={{ float: 'right' }} ><FilterListIcon /></IconButton>}\n          {schematics && <Input style={{ float: 'right' }} onChange={(e) => onSearch(e)} placeholder='Search' />}\n          <Popover\n            open={open}\n            onClose={handleFilterOpen}\n            anchorOrigin={{\n              vertical: 'bottom',\n              horizontal: 'center'\n            }}\n            transformOrigin={{\n              vertical: 'top',\n              horizontal: 'center'\n            }}\n            anchorEl={anchorEl}\n          >\n            <FormControl style={{ width: ' 200px', padding: '2%' }}>\n              <InputLabel>Select Sort</InputLabel>\n              <Select className={classes.popover} value={sort} onChange={handleSort} >\n                <MenuItem key='name' value='name'>Name</MenuItem>\n                <MenuItem key='created_at' value='created_at'>Created</MenuItem>\n                <MenuItem key='updated_at' value='updated_at'>Updated</MenuItem>\n              </Select>\n            </FormControl>\n            <FormControl style={{ width: ' 200px', padding: '2%' }}>\n              <InputLabel>Select Order</InputLabel>\n              <Select className={classes.popover} value={order} onChange={handleOrder} >\n                <MenuItem key='ascending' value='ascending'>Ascending</MenuItem>\n                <MenuItem key='descending' value='descending'>Descending</MenuItem>\n              </Select>\n            </FormControl>\n          </Popover>\n        </Grid>\n        <AppBar position='static'>\n          <Tabs value={value} onChange={handleChange}>\n            <Tab label='Schematics' />\n            <Tab label='Projects' />\n            <Tab label='LTI Apps' />\n            <Tab label='LTI Submissions' />\n          </Tabs>\n        </AppBar>\n        <TabPanel style={{ width: '100%' }} value={value} index={0}>\n          {saves.filter(x => { return (x.project_id == null && x.lti_id == null && x.is_submission == null) }).length !== 0\n            ? <>\n              {saves.filter(x => { return (x.project_id == null && x.lti_id == null && x.is_submission == null) }).map(\n                (sch) => {\n                  return (\n                    <Grid item xs={12} sm={6} lg={3} key={sch.save_id}>\n                      <SchematicCard sch={sch} />\n                    </Grid>\n                  )\n                }\n              )}\n            </>\n            : <Grid item xs={12}>\n              <Card style={{ padding: '7px 15px' }} className={classes.mainHead}>\n                <Typography variant=\"subtitle1\" gutterBottom>\n                  Hey {auth.user.username} , You dont have any saved schematics...\n                </Typography>\n              </Card>\n            </Grid>\n          }\n        </TabPanel>\n        <TabPanel style={{ width: '100%' }} value={value} index={1}>\n          {saves.filter(x => { return x.project_id }).length !== 0\n            ? <>\n              {saves.filter(x => { return x.project_id }).map(\n                (sch) => {\n                  return (\n                    <Grid item xs={12} sm={6} lg={3} key={sch.save_id}>\n                      <SchematicCard sch={sch} />\n                    </Grid>\n                  )\n                }\n              )}\n            </>\n            : <Grid item xs={12}>\n              <Card style={{ padding: '7px 15px' }} className={classes.mainHead}>\n                <Typography variant=\"subtitle1\" gutterBottom>\n                  Hey {auth.user.username} , You dont have any saved projects...\n                </Typography>\n              </Card>\n            </Grid>\n          }\n        </TabPanel>\n        <TabPanel style={{ width: '100%' }} value={value} index={2}>\n          {saves.filter(x => { return x.lti_id }).length !== 0\n            ? <>\n              {saves.filter(x => { return x.lti_id }).map(\n                (sch) => {\n                  return (\n                    <Grid item xs={12} sm={6} lg={3} key={sch.save_id}>\n                      <SchematicCard sch={sch} />\n                    </Grid>\n                  )\n                }\n              )}\n            </>\n            : <Grid item xs={12}>\n              <Card style={{ padding: '7px 15px' }} className={classes.mainHead}>\n                <Typography variant=\"subtitle1\" gutterBottom>\n                  Hey {auth.user.username} , You dont have any saved projects...\n                </Typography>\n              </Card>\n            </Grid>\n          }\n        </TabPanel>\n        <TabPanel style={{ width: '100%' }} value={value} index={3}>\n          {saves.filter(x => { return x.is_submission }).length !== 0\n            ? <>\n              {saves.filter(x => { return x.is_submission }).map(\n                (sch) => {\n                  return (\n                    <Grid item xs={12} sm={6} lg={3} key={sch.save_id}>\n                      <SchematicCard sch={sch} />\n                    </Grid>\n                  )\n                }\n              )}\n            </>\n            : <Grid item xs={12}>\n              <Card style={{ padding: '7px 15px' }} className={classes.mainHead}>\n                <Typography variant=\"subtitle1\" gutterBottom>\n                  Hey {auth.user.username} , You dont have any saved projects...\n                </Typography>\n              </Card>\n            </Grid>\n          }\n        </TabPanel>\n\n      </Grid>\n    </>\n  )\n}\n\nSchematicsList.propTypes = {\n  ltiDetails: PropTypes.string\n}\n"
  },
  {
    "path": "eda-frontend/src/components/LTI/CompareGraph.js",
    "content": "import React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n  Typography,\n  Grid,\n  TextField,\n  Paper,\n  Container\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\n\nimport Graph from '../Shared/Graph'\n\nconst useStyles = makeStyles((theme) => ({\n  appBar: {\n    position: 'relative'\n  },\n  title: {\n    marginLeft: theme.spacing(2),\n    flex: 1\n  },\n  header: {\n    padding: theme.spacing(5, 0, 6),\n    color: '#fff'\n  },\n  paper: {\n    padding: theme.spacing(2),\n    textAlign: 'center',\n    backgroundColor: '#404040',\n    color: '#fff'\n  }\n}))\n// {details:{},title:''} simResults\nexport default function CompareGraph ({ expected, given }) {\n  const classes = useStyles()\n  const [xscale, setXScale] = React.useState('si')\n  const [yscale, setYScale] = React.useState('si')\n  const [expectedResult, setExpectedResult] = React.useState(null)\n  const [givenResult, setGivenResult] = React.useState(null)\n  const [precision, setPrecision] = React.useState(5)\n\n  const precisionArr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n\n  // eslint-disable-next-line\n  const scales = {\n    G: 1000000000,\n    M: 1000000,\n    K: 1000,\n    si: 1,\n    m: 0.001,\n    u: 0.000001,\n    n: 0.000000001,\n    p: 0.000000000001\n  }\n\n  useEffect(() => {\n    if (given) {\n      console.log('givenresult', handlePreProcess(given))\n      setGivenResult(handlePreProcess(given))\n    }\n    if (expected) {\n      console.log('expectedresult', handlePreProcess(expected))\n      setExpectedResult(handlePreProcess(expected))\n    }\n  // eslint-disable-next-line\n  }, [given, expected])\n\n  const handlePreProcess = (element) => {\n    let schematic = []\n    const data = element.data\n    if (element.graph === 'true') {\n      const simResultGraph = { labels: [], x_points: [], y_points: [] }\n      // populate the labels\n      for (let i = 0; i < data.length; i++) {\n        simResultGraph.labels[0] = data[i].labels[0]\n        const lab = data[i].labels\n        // lab is an array containeing labels names ['time','abc','def']\n        simResultGraph.x_points = data[0].x\n\n        // labels\n        for (let x = 1; x < lab.length; x++) {\n          simResultGraph.labels.push(lab[x])\n        }\n        // populate y_points\n        for (let z = 0; z < data[i].y.length; z++) {\n          simResultGraph.y_points.push(data[i].y[z])\n        }\n      }\n\n      simResultGraph.x_points = simResultGraph.x_points.map(d => parseFloat(d))\n\n      for (let i1 = 0; i1 < simResultGraph.y_points.length; i1++) {\n        simResultGraph.y_points[i1] = simResultGraph.y_points[i1].map(d => parseFloat(d))\n      }\n      schematic = simResultGraph\n      let val, idx\n      setScales(1, val, idx, null, null, schematic)\n    } else {\n      const simResultText = []\n      for (let i = 0; i < data.length; i++) {\n        let postfixUnit = ''\n        if (data[i][0].includes('#branch')) {\n          postfixUnit = 'A'\n        } else if (data[i][0].includes('transfer_function')) {\n          postfixUnit = ''\n        } else if (data[i][0].includes('impedance')) {\n          postfixUnit = 'Ohm'\n        } else {\n          if (data[i][0][0] !== 'V') {\n            data[i][0] = `V(${data[i][0]})`\n          }\n          postfixUnit = 'V'\n        }\n\n        simResultText.push(data[i][0] + ' ' + data[i][1] + ' ' + parseFloat(data[i][2]) + ' ' + postfixUnit + '\\n')\n      }\n      schematic = simResultText\n    }\n    return schematic\n  }\n  // DO NOT CHANGE THIS FUNCTION\n  const toFixed = (x) => {\n    let e = 0\n    if (Math.abs(x) < 1.0) {\n      e = parseInt(x.toString().split('e-')[1])\n      if (e) {\n        x *= Math.pow(10, e - 1)\n        x = '0.' + (new Array(e)).join('0') + x.toString().substring(2)\n      }\n    } else {\n      e = parseInt(x.toString().split('+')[1])\n      if (e > 20) {\n        e -= 20\n        x /= Math.pow(10, e)\n        x += (new Array(e + 1)).join('0')\n      }\n    }\n    return x\n  }\n\n  // DO NOT CHANGE\n  const decimalCount = (num1, num2) => {\n    const difference = toFixed(num1) - toFixed(num2)\n    const numStr = toFixed(difference).toString()\n    if (Math.abs(difference) < 1) {\n      if (numStr.includes('.')) {\n        return ['decimal', numStr.split('.')[1].length]\n      }\n    } else {\n      return ['notDecimal', numStr.split('.')[0].length]\n    }\n    return ['notDecimal', 1]\n  }\n\n  // DO NOT CHANGE\n  const decimalCountNonGraph = (num) => {\n    const numStr = num.toString()\n    if (Math.abs(num) < 1) {\n      if (numStr.includes('.')) {\n        const afterDeci = numStr.split('.')[1]\n        let count = 0\n        while (afterDeci[count] === '0') {\n          count++\n        }\n        return ['decimal', count + 2] // count + 2 to adjust with the scaling feature. 0.000xyz will become xyz.abc mUnit\n      }\n    } else {\n      return ['notDecimal', numStr.split('.')[0].length]\n    }\n    return ['notDecimal', 1]\n  }\n\n  const setScales = (g, val, idx, scale = null, setScaleFunc = null, data = null) => {\n    let countX, countY\n    if (g === 1) {\n      countX = decimalCount(Math.min(...data.x_points), Math.max(...data.x_points))\n      countY = decimalCount(Math.min(...data.y_points[0]), Math.max(...data.y_points[0]))\n    } else {\n      countX = decimalCountNonGraph(val)\n      countY = countX // not required. used only countX for nongraphical output\n    }\n    if (countX[0] === 'decimal') {\n      if (countX[1] > 0 && countX[1] <= 4) {\n        if (g === 1) {\n          setXScale('m')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('m')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'm'\n            setScaleFunc(scale)\n          }\n        }\n      } else if (countX[1] > 4 && countX[1] <= 7) {\n        if (g === 1) {\n          setXScale('u')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('u')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'u'\n            setScaleFunc(scale)\n          }\n        }\n      } else if (countX[1] > 7 && countX[1] <= 10) {\n        if (g === 1) {\n          setXScale('n')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('n')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'n'\n            setScaleFunc(scale)\n          }\n        }\n      } else if (countX[1] > 10 && countX[1] <= 12) {\n        if (g === 1) {\n          setXScale('p')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('p')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'p'\n            setScaleFunc(scale)\n          }\n        }\n      }\n    } else {\n      if (countX[1] > 0 && countX[1] <= 4) {\n        if (g === 1) {\n          setXScale('si')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('si')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'si'\n            setScaleFunc(scale)\n          }\n        }\n      } else if (countX[1] > 4 && countX[1] <= 7) {\n        if (g === 1) {\n          setXScale('K')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('K')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'K'\n            setScaleFunc(scale)\n          }\n        }\n      } else if (countX[1] > 7 && countX[1] <= 10) {\n        if (g === 1) {\n          setXScale('M')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('M')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'M'\n            setScaleFunc(scale)\n          }\n        }\n      } else if (countX[1] > 10) {\n        if (g === 1) {\n          setXScale('G')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('G')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'G'\n            setScaleFunc(scale)\n          }\n        }\n      }\n    }\n    if (countY[0] === 'decimal') {\n      if (countY[1] > 0 && countY[1] <= 4) {\n        setYScale('m')\n      } else if (countY[1] > 4 && countY[1] <= 7) {\n        setYScale('u')\n      } else if (countY[1] > 7 && countY[1] <= 10) {\n        setYScale('n')\n      } else if (countY[1] > 10 && countY[1] <= 12) {\n        setYScale('p')\n      }\n    } else {\n      if (countY[1] > 0 && countY[1] <= 4) {\n        setYScale('si')\n      } else if (countY[1] > 4 && countY[1] <= 7) {\n        setYScale('K')\n      } else if (countY[1] > 7 && countY[1] <= 10) {\n        setYScale('M')\n      } else if (countY[1] > 10) {\n        setYScale('G')\n      }\n    }\n  }\n  const handleXScale = (evt) => {\n    setXScale(evt.target.value)\n  }\n\n  const handleYScale = (evt) => {\n    setYScale(evt.target.value)\n  }\n  const handlePrecision = (evt) => {\n    setPrecision(evt.target.value)\n  }\n\n  return (\n    <div>\n      <Container maxWidth=\"lg\" className={classes.header}>\n        <Grid\n          container\n          spacing={3}\n          direction=\"row\"\n          justify=\"center\"\n          alignItems=\"center\"\n        >\n          {/* Card to display simualtion result screen header */}\n          <Grid item xs={12} sm={12}>\n            <Paper className={classes.paper}>\n              <Typography variant=\"h2\" align=\"center\" gutterBottom>\n                Your Result\n              </Typography>\n              <div style={{ padding: '15px 10px 10px 10px', margin: '20px 0px', backgroundColor: 'white', borderRadius: '5px' }}>\n                <TextField\n                  style={{ width: '20%' }}\n                  id=\"xscale\"\n                  size='small'\n                  variant=\"outlined\"\n                  select\n                  label=\"Select X Axis Scale\"\n                  value={xscale}\n                  onChange={handleXScale}\n                  SelectProps={{\n                    native: true\n                  }}\n                >\n                  <option value='G'>\n                    Giga (G)\n                  </option>\n                  <option value='M'>\n                    Mega (MEG)\n                  </option>\n                  <option value='K'>\n                    Kilo (K)\n                  </option>\n                  <option value='si'>\n                    SI UNIT\n                  </option>\n\n                  <option value='m'>\n                    Milli (m)\n                  </option>\n                  <option value='u'>\n                    Micro (u)\n                  </option>\n                  <option value='n'>\n                    Nano (n)\n                  </option>\n                  <option value='p'>\n                    Pico (p)\n                  </option>\n\n                </TextField>\n                <TextField\n                  style={{ width: '20%', marginLeft: '10px' }}\n                  id=\"yscale\"\n                  size='small'\n                  variant=\"outlined\"\n                  select\n                  label=\"Select Y Axis Scale\"\n                  value={yscale}\n                  onChange={handleYScale}\n                  SelectProps={{\n                    native: true\n                  }}\n                >\n                  <option value='G'>\n                    Giga (G)\n                  </option>\n                  <option value='M'>\n                    Mega (MEG)\n                  </option>\n                  <option value='K'>\n                    Kilo (K)\n                  </option>\n                  <option value='si'>\n                    SI UNIT\n                  </option>\n\n                  <option value='m'>\n                    Milli (m)\n                  </option>\n                  <option value='u'>\n                    Micro (u)\n                  </option>\n                  <option value='n'>\n                    Nano (n)\n                  </option>\n                  <option value='p'>\n                    Pico (p)\n                  </option>\n\n                </TextField>\n\n                <TextField\n                  style={{ width: '20%', marginLeft: '10px' }}\n                  id=\"precision\"\n                  size='small'\n                  variant=\"outlined\"\n                  select\n                  label=\"Select Precision\"\n                  value={precision}\n                  onChange={handlePrecision}\n                  SelectProps={{\n                    native: true\n                  }}\n                >\n                  {\n                    precisionArr.map((d, i) => {\n                      return (\n                        <option key={i} value={d}>\n                          {d}\n                        </option>\n                      )\n                    })\n                  }\n\n                </TextField>\n              </div>\n            </Paper>\n          </Grid>\n          <Grid item xs={12} sm={12}>\n            <Paper className={classes.paper}>\n              <Grid item xs={12} sm={12}>\n                {givenResult && <>\n                  <Graph\n                    labels={givenResult.labels}\n                    x={givenResult.x_points}\n                    y={givenResult.y_points}\n                    xscale={xscale}\n                    yscale={yscale}\n                    precision={precision}\n                  />\n                </>}\n              </Grid>\n              <Grid item xs={12} sm={12}>\n                {expectedResult && <>\n                  <Graph\n                    labels={expectedResult.labels}\n                    x={expectedResult.x_points}\n                    y={expectedResult.y_points}\n                    xscale={xscale}\n                    yscale={yscale}\n                    precision={precision}\n                  />\n                </>}\n              </Grid>\n            </Paper>\n          </Grid>\n\n        </Grid>\n      </Container>\n    </div >\n  )\n}\n\nCompareGraph.propTypes = {\n  expected: PropTypes.object,\n  given: PropTypes.object\n  // simResults: PropTypes.object\n}\n"
  },
  {
    "path": "eda-frontend/src/components/LTI/Helper/Testcase.js",
    "content": "/* eslint-disable no-unused-vars */\n/* eslint-disable camelcase */\n/* eslint-disable new-cap */\n/* eslint-disable */\nimport mxGraphFactory from 'mxgraph'\nimport store from '../../../redux/store'\nimport * as actions from '../../../redux/actions/actions'\nimport ComponentParameters from '../../SchematicEditor/Helper/ComponentParametersData'\nvar graph\n\nconst {\n  mxConstants,\n  mxUtils,\n  mxEvent,\n  mxCell,\n  mxMorphing,\n  mxPoint\n} = new mxGraphFactory()\n\n\n// ERC CHECK FOR SCHEMATIC\nexport function ErcCheck() {\n  var list = graph.getModel().cells // mapping the grid\n  var vertexCount = 0\n  var errorCount = 0\n  var PinNC = 0\n  var stypes = 0\n  var ground = 0\n  var wirec = 0\n  for (var property in list) {\n    var cell = list[property]\n    if (cell.Component === true) {\n      for (var child in cell.children) {\n        var childVertex = cell.children[child]\n        if (childVertex.Pin === true && childVertex.edges === null) { // Checking if connections exist from a given pin\n          ++PinNC\n          ++errorCount\n        } else {\n          for (var w in childVertex.edges) {\n            if (childVertex.edges[w].source === null || childVertex.edges[w].target === null) {\n              ++PinNC\n            } else {\n              if (childVertex.edges[w].source.edge === true || childVertex.edges[w].target.edge === true) {\n                ++wirec\n              }\n            }\n          }\n        }\n      }\n      ++vertexCount\n    }\n    if (cell.symbol === 'PWR') { // Checking for ground\n      console.log('Ground is present')\n      console.log(cell)\n      ++ground\n    }\n  }\n\n  if (vertexCount === 0) {\n    alert('No Component added')\n    ++errorCount\n  } else if (PinNC !== 0) {\n    alert('Pins not connected')\n  } else if (ground === 0) {\n    alert('Ground not connected')\n  } else {\n    if (errorCount === 0) {\n      alert('ERC Check completed')\n    }\n  }\n}\n// ERC Check for Netlist, It also returns a boolean value which is called in the Netlist Generator \nfunction ErcCheckNets(graph) {\n  var list = graph.getModel().cells // mapping the grid\n  var vertexCount = 0\n  var errorCount = 0\n  var PinNC = 0\n  var stypes = 0\n  var ground = 0\n  for (var property in list) {\n    var cell = list[property]\n    if (cell.Component === true) {\n      for (var child in cell.children) {\n        var childVertex = cell.children[child]\n        if (childVertex.Pin === true && childVertex.edges === null) {\n          graph.getSelectionCell(childVertex)\n          ++PinNC\n          ++errorCount\n        }\n      }\n      ++vertexCount\n    }\n    if (cell.symbol === 'PWR') {\n      ++ground\n    }\n  }\n  if (vertexCount === 0) {\n    alert('No Component added')\n    ++errorCount\n    return false\n  } else if (PinNC !== 0) {\n    alert('Pins not connected')\n    return false\n  } else if (ground === 0) {\n    alert('Ground not connected')\n    return false\n  } else {\n    if (errorCount === 0) {\n      return true\n    }\n  }\n}\n\n// Function to generate Netlist\nexport function GenerateNetList(graph=graph) {\n\n  var r = 1\n  var v = 1\n  var c = 1\n  var n = 1\n  var spiceModels = ''\n  var netlist = {\n    componentlist: [],\n    nodelist: []\n  }\n  var erc = ErcCheckNets(graph) // Checking for ERC Failures\n  var k = ''\n  if (erc === false) {\n    alert('ERC check failed')\n  } else {\n    var list = annotate(graph) // Fetching all the Cells on the GRID\n    for (var property in list) {\n      if (list[property].Component === true && list[property].symbol !== 'PWR') {\n        var compobj = {\n          name: '',\n          node1: '',\n          node2: '',\n          magnitude: ''\n        }\n        mxCell.prototype.ConnectedNode = null\n        var component = list[property]\n        if (component.symbol === 'R') {\n          k = k + component.symbol + r.toString()\n          component.value = component.symbol + r.toString()\n          component.properties.PREFIX = component.value\n\n          ++r\n        } else if (component.symbol === 'V') {\n          k = k + component.symbol + v.toString()\n          component.value = component.symbol + v.toString()\n          component.properties.PREFIX = component.value\n          ++v\n        } else {\n          k = k + component.symbol + c.toString()\n          component.value = component.symbol + c.toString()\n          component.properties.PREFIX = component.value\n          ++c\n        }\n\n        if (component.children !== null) {\n          for (var child in component.children) {\n            var pin = component.children[child]\n            if (pin.vertex === true) {\n              if (pin.edges !== null || pin.edges.length !== 0) {\n                for (var wire in pin.edges) {\n                  if (pin.edges[wire].source !== null && pin.edges[wire].target !== null) {\n                    // Wire to Pin Connection \n                    if (pin.edges[wire].source.edge === true) {\n                      pin.edges[wire].node = pin.edges[wire].source.node\n                      pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                      pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                      // Pin to Wire Connection \n                    } else if (pin.edges[wire].target.edge === true) {\n                      pin.edges[wire].node = pin.edges[wire].target.node\n                      pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                      pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                      pin.edges[wire].tarx = pin.edges[wire].geometry.targetPoint.x\n                      pin.edges[wire].tary = pin.edges[wire].geometry.targetPoint.y\n                      // Souce or Target is Ground \n                    } else if (pin.edges[wire].source.ParentComponent.symbol === 'PWR' || pin.edges[wire].target.ParentComponent.symbol === 'PWR') {\n                      pin.edges[wire].node = 0\n                      pin.edges[wire].value = 0\n                      pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                      pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                      // Pin to Pin Connection, Setting the Source to be the Node Value \n                    } else {\n                      pin.edges[wire].node = pin.edges[wire].source.ParentComponent.properties.PREFIX + '.' + pin.edges[wire].source.value\n                      pin.ConnectedNode = pin.edges[wire].source.ParentComponent.properties.PREFIX + '.' + pin.edges[wire].source.value\n                      pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                      pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                      pin.edges[wire].value = pin.edges[wire].node\n                    }\n                    pin.edges[wire].value = pin.edges[wire].node\n                  }\n                }\n                k = k + ' ' + pin.edges[0].node\n              }\n            }\n          }\n          compobj.name = component.symbol\n          compobj.node1 = component.children[0].edges[0].node\n          compobj.node2 = component.children[1].edges[0].node\n          compobj.magnitude = 10\n          netlist.componentlist.push(component.properties.PREFIX)\n          netlist.nodelist.push(compobj.node2, compobj.node1)\n        }\n        console.log('component properties', component.properties)\n        if (component.properties.MODEL.length > 0) {\n            k = k + ' ' + component.properties.MODEL.split(' ')[1]\n        }\n\n        if (component.properties.PREFIX.charAt(0) === 'V' || component.properties.PREFIX.charAt(0) === 'v' || component.properties.PREFIX.charAt(0) === 'I' || component.properties.PREFIX.charAt(0) === 'i') {\n          const comp = component.properties\n          if (comp.NAME === 'SINE') {\n            k = k + ` SIN(${comp.OFFSET} ${comp.AMPLITUDE} ${comp.FREQUENCY} ${comp.DELAY} ${comp.DAMPING_FACTOR} ${comp.PHASE} )`\n          } else if (comp.NAME === 'EXP') {\n            k = k + ` EXP(${comp.INITIAL_VALUE} ${comp.PULSED_VALUE} ${comp.FREQUENCY} ${comp.RISE_DELAY_TIME} ${comp.RISE_TIME_CONSTANT} ${comp.FALL_DELAY_TIME} ${comp.FALL_TIME_CONSTANT} )`\n          } else if (comp.NAME === 'DC') {\n            if (component.properties.VALUE !== undefined) {\n              k = k + ' DC ' + component.properties.VALUE\n              component.value = component.value + '\\n' + component.properties.VALUE\n            }\n          } else if (comp.NAME === 'PULSE') {\n            k = k + ` PULSE(${comp.INITIAL_VALUE} ${comp.PULSED_VALUE} ${comp.DELAY_TIME} ${comp.RISE_TIME} ${comp.FALL_TIME} ${comp.PULSE_WIDTH} ${comp.PERIOD} ${comp.PHASE} )`\n          } else {\n            if (component.properties.VALUE !== undefined) {\n              k = k + ' ' + component.properties.VALUE\n              component.value = component.value + '\\n' + component.properties.VALUE\n            }\n          }\n        }else if(component.properties.PREFIX.charAt(0) === 'C' || component.properties.PREFIX.charAt(0) === 'c'){\n            k = k + ' ' + component.properties.VALUE\n            if(component.properties.IC != 0){\n                k = k + ' IC=' + component.properties.IC\n            }\n            component.value = component.value + '\\n' + component.properties.VALUE\n        }else if(component.properties.PREFIX.charAt(0) === 'L' || component.properties.PREFIX.charAt(0) === 'l'){\n            k = k + ' ' + component.properties.VALUE\n            if(component.properties.IC != 0){\n                k = k + ' IC=' + component.properties.IC\n            }\n            if(component.properties.DTEMP != 27){\n                k = k + ' dtemp=' + component.properties.DTEMP\n            }            \n            component.value = component.value + '\\n' + component.properties.VALUE\n        }else if(component.properties.PREFIX.charAt(0) === 'M' || component.properties.PREFIX.charAt(0) === 'm'){\n            // k = k + ' ' + component.properties.VALUE   \n            if(component.properties.MULTIPLICITY_PARAMETER != 1){\n                k = k + ' m=' + component.properties.MULTIPLICITY_PARAMETER\n            }\n            if(component.properties.DTEMP != 27){\n                k = k + ' dtemp=' + component.properties.DTEMP\n            }            \n            // component.value = component.value + '\\n' + component.properties.VALUE\n        }else if(component.properties.PREFIX.charAt(0) === 'Q' || component.properties.PREFIX.charAt(0) === 'q'){\n            // k = k + ' ' + component.properties.VALUE\n            if(component.properties.MULTIPLICITY_PARAMETER != 1){\n                k = k + ' m=' + component.properties.MULTIPLICITY_PARAMETER\n            }\n            if(component.properties.DTEMP != 27){\n                k = k + ' dtemp=' + component.properties.DTEMP\n            }            \n            // component.value = component.value + '\\n' + component.properties.VALUE\n        }else if(component.properties.PREFIX.charAt(0) === 'R' || component.properties.PREFIX.charAt(0) === 'r'){\n            k = k + ' ' + component.properties.VALUE\n            if(component.properties.SHEET_RESISTANCE != 0){\n                k = k + ' RSH=' + component.properties.SHEET_RESISTANCE\n            }\n            if(component.properties.FIRST_ORDER_TEMPERATURE_COEFF != 0){\n                k = k + ' tc1=' + component.properties.FIRST_ORDER_TEMPERATURE_COEFF\n            }\n            if(component.properties.SECOND_ORDER_TEMPERATURE_COEFF != 0){\n                k = k + ' tc2=' + component.properties.SECOND_ORDER_TEMPERATURE_COEFF\n            }\n            if(component.properties.PARAMETER_MEASUREMENT_TEMPERATURE != 27){\n                k = k + ' TNOM=' + component.properties.PARAMETER_MEASUREMENT_TEMPERATURE\n            }\n            component.value = component.value + '\\n' + component.properties.VALUE\n        }else {\n          if (component.properties.VALUE !== undefined) {\n            k = k + ' ' + component.properties.VALUE\n            component.value = component.value + '\\n' + component.properties.VALUE\n          }\n        }\n\n        if (component.properties.EXTRA_EXPRESSION.length > 0) {\n          k = k + ' ' + component.properties.EXTRA_EXPRESSION\n          component.value = component.value + ' ' + component.properties.EXTRA_EXPRESSION\n        }\n        \n        if (component.properties.MODEL.length > 0) {\n          spiceModels += component.properties.MODEL + '\\n'\n        }\n\n        k = k + ' \\n'\n      }\n    }\n  }\n  store.dispatch({\n    type: actions.SET_MODEL,\n    payload: {\n      model: spiceModels\n    }\n  })\n  store.dispatch({\n    type: actions.SET_NETLIST,\n    payload: {\n      netlist: k\n    }\n  })\n  // Refresh the GRID to view the Node Values \n  graph.getModel().beginUpdate()\n  try {\n    graph.view.refresh()\n  } finally {\n    // Arguments are number of steps, ease and delay\n    var morph = new mxMorphing(graph, 20, 1.2, 20)\n    morph.addListener(mxEvent.DONE, function () {\n      graph.getModel().endUpdate()\n    })\n    morph.startAnimation()\n  }\n  var a = new Set(netlist.nodelist)\n  var netobj = {\n    models: spiceModels,\n    main: k\n  }\n  return netobj\n}\n// Function to Annotate, TODO! It needs some polishing \nfunction annotate(graph) {\n\n  var r = 1\n  var v = 1\n  var c = 1\n  var l = 1\n  var d = 1\n  var q = 1\n  var w = 1\n  var list = graph.getModel().cells\n  var n = 1\n  var netlist = {\n    componentlist: [],\n    nodelist: []\n  }\n  var erc = true\n  var k = ''\n  if (erc === false) {\n    alert('ERC check failed')\n  } else {\n    for (var property in list) {\n      if (list[property].Component === true && list[property].symbol !== 'PWR') {\n        var compobj = {\n          name: '',\n          node1: '',\n          node2: '',\n          magnitude: ''\n        }\n        mxCell.prototype.ConnectedNode = null\n        var component = list[property]\n        if (component.symbol === 'R') {\n          k = k + component.symbol + r.toString()\n          component.value = component.symbol + r.toString()\n          component.properties.PREFIX = component.value\n\n          ++r\n        } else if (component.symbol === 'V') {\n          k = k + component.symbol + v.toString()\n          component.value = component.symbol + v.toString()\n          component.properties.PREFIX = component.value\n          ++v\n        } else if (component.symbol === 'C') {\n          k = k + component.symbol + v.toString()\n          component.value = component.symbol + v.toString()\n          component.properties.PREFIX = component.value\n          ++c\n        } else if (component.symbol === 'D') {\n          k = k + component.symbol + v.toString()\n          component.value = component.symbol + v.toString()\n          component.properties.PREFIX = component.value\n          ++d\n        } else if (component.symbol === 'Q') {\n          k = k + component.symbol + v.toString()\n          component.value = component.symbol + v.toString()\n          component.properties.PREFIX = component.value\n          ++q\n        } else {\n          k = k + component.symbol + c.toString()\n          component.value = component.symbol + c.toString()\n          component.properties.PREFIX = component.value\n          ++w\n        }\n\n        if (component.children !== null) {\n          for (var child in component.children) {\n            var pin = component.children[child]\n            if (pin.vertex === true) {\n              if (pin.edges !== null || pin.edges.length !== 0) {\n                for (var wire in pin.edges) {\n                  if (pin.edges[wire].source !== null && pin.edges[wire].target !== null) {\n                    if (pin.edges[wire].source.edge === true) {\n                      // Not Performing any Action for Pin to Wire Connections \n                    } else if (pin.edges[wire].target.edge === true) {\n                      // Not Performing any Action for Pin to Wire Connections \n                    } else if (pin.edges[wire].source.ParentComponent.symbol === 'PWR' || pin.edges[wire].target.ParentComponent.symbol === 'PWR') {\n                      pin.edges[wire].node = 0\n                      pin.edges[wire].value = 0\n                    } else {\n                      pin.edges[wire].node = pin.edges[wire].source.ParentComponent.properties.PREFIX + '.' + pin.edges[wire].source.value\n                      pin.ConnectedNode = pin.edges[wire].source.ParentComponent.properties.PREFIX + '.' + pin.edges[wire].source.value\n                      pin.edges[wire].value = pin.edges[wire].node\n                    }\n                  }\n                }\n                k = k + ' ' + pin.edges[0].node\n              }\n            }\n          }\n          compobj.name = component.symbol\n          compobj.node1 = component.children[0].edges[0].node\n          compobj.node2 = component.children[1].edges[0].node\n          compobj.magnitude = 10\n          netlist.componentlist.push(component.properties.PREFIX)\n          netlist.nodelist.push(compobj.node2, compobj.node1)\n        }\n        if (component.properties.VALUE !== undefined) {\n          k = k + ' ' + component.properties.VALUE\n        }\n\n        if (component.properties.EXTRA_EXPRESSION.length > 0) {\n          k = k + ' ' + component.properties.EXTRA_EXPRESSION\n        }\n        if (component.properties.MODEL.length > 0) {\n          k = k + ' ' + component.properties.MODEL.split(' ')[1]\n        }\n        k = k + ' \\n'\n      }\n    }\n  }\n  return list\n}\n// Returns all the Nodes present in the Schematic, Used for Simulation \nexport function GenerateNodeList(graph=graph) {\n  var list = annotate(graph)\n  var a = []\n  // Using a Set to avoid duplicate Nodes \n  var netlist = new Set()\n  var k = 'Unitled netlist \\n'\n  for (var property in list) {\n    if (list[property].Component === true && list[property].symbol !== 'PWR') {\n      var compobj = {\n        name: '',\n        node1: '',\n        node2: '',\n        magnitude: ''\n      }\n      // Fetching all the nodes \n      var component = list[property]\n      if (component.children !== null) {\n        compobj.name = component.symbol\n        compobj.node1 = component.children[0].edges[0].node\n        compobj.node2 = component.children[1].edges[0].node\n        netlist.add(compobj.node1, compobj.node2)\n      }\n    }\n  }\n  return netlist\n}\n// Sends a list of components present in the netlist \nexport function GenerateCompList(graph=graph) {\n  var list = annotate(graph)\n  var a = []\n  var netlist = [] // This will contain the list of Component Prefix\n  var k = 'Unitled netlist \\n'\n  for (var property in list) {\n    if (list[property].Component === true && list[property].symbol !== 'PWR') {\n      var compobj = {\n        name: '',\n        node1: '',\n        node2: '',\n        magnitude: ''\n      }\n      var component = list[property]\n      compobj.name = component.symbol\n      compobj.node1 = component.children[0].edges[0].node\n      compobj.node2 = component.children[1].edges[0].node\n      netlist.push(component.properties.PREFIX)\n    }\n  }\n  return netlist\n}\n// Function to Render Circuit XML\nexport function renderXML() {\n  graph.view.refresh()\n  var xml = 'null'\n  var xmlDoc = mxUtils.parseXml(xml)\n  parseXmlToGraph(xmlDoc, graph)\n}\n// Function to Parse XML and Redraw on Grid\nexport function parseXmlToGraph(xmlDoc, graph) {\n  const cells = xmlDoc.documentElement.children[0].children\n  const parent = graph.getDefaultParent()\n  var v1\n  var yPos\n  var xPos\n  var props\n  var style = graph.getStylesheet().getDefaultVertexStyle()\n\n  style[mxConstants.STYLE_SHAPE] = 'label'\n  style[mxConstants.STYLE_VERTICAL_ALIGN] = 'bottom'\n  style[mxConstants.STYLE_IMAGE_VERTICAL_ALIGN] = 'bottom' // indicator v-alignment\n  style[mxConstants.STYLE_IMAGE_ALIGN] = 'bottom'\n  style[mxConstants.STYLE_INDICATOR_COLOR] = 'green'\n  style[mxConstants.STYLE_FONTCOLOR] = 'red'\n  style[mxConstants.STYLE_FONTSIZE] = '10'\n  delete style[mxConstants.STYLE_STROKECOLOR] // transparent\n  for (let i = 0; i < cells.length; i++) {\n    const cellAttrs = cells[i].attributes\n    if (cellAttrs.Component.value === '1') { // is component\n      const vertexName = cellAttrs.value.value\n      const style = cellAttrs.style.value\n      const vertexId = Number(cellAttrs.id.value)\n      const geom = cells[i].children[0].attributes\n      const xPos = Number(geom.x.value)\n      if (geom.y === undefined) {\n        yPos = 0\n      } else {\n        yPos = Number(geom.y.value)\n      }\n      const height = Number(geom.height.value)\n      const width = Number(geom.width.value)\n      v1 = graph.insertVertex(parent, vertexId, vertexName, xPos, yPos, width, height, style)\n      v1.symbol = cellAttrs.symbol.value\n      if (v1.symbol === 'V') {\n        try { props = Object.assign({}, ComponentParameters[v1.symbol][cells[i].children[2].attributes.NAME.value]) } catch (e) { props = Object.assign({}, ComponentParameters[v1.symbol][cells[i].children[1].attributes.NAME.value]) }\n      } else {\n        props = Object.assign({}, ComponentParameters[v1.symbol])\n      }\n      try { props.NAME = cells[i].children[2].attributes.NAME.value } catch (e) { props.NAME = cells[i].children[1].attributes.NAME.value }\n      v1.properties = props\n      v1.Component = true\n      v1.CellType = 'Component'\n      if (v1.properties.name === 'VSOURCE') {\n      }\n      for (var check in props) {\n        try { v1.properties[check] = cells[i].children[2].attributes[check].value } catch (e) { try { v1.properties[check] = cells[i].children[1].attributes[check].value } catch (e) { } }\n      }\n    } else if (cellAttrs.Pin.value === '1') {\n      const vertexName = cellAttrs.value.value\n      const style = cellAttrs.style.value\n      const vertexId = Number(cellAttrs.id.value)\n      const geom = cells[i].children[0].attributes\n      try { xPos = Number(geom.x.value) } catch (e) { xPos = 0 }\n      if (geom.y === undefined) {\n        yPos = 0\n      } else {\n        yPos = Number(geom.y.value)\n      }\n      const height = Number(geom.height.value)\n      const width = Number(geom.width.value)\n      var vp = graph.insertVertex(v1, vertexId, vertexName, xPos, yPos, 0.5, 0.5, style)\n      vp.ParentComponent = v1\n      vp.Pin = 1\n    } else if (cellAttrs.edge) { // is edge\n      const edgeId = Number(cellAttrs.id.value)\n      const source = Number(cellAttrs.sourceVertex.value)\n      const target = Number(cellAttrs.targetVertex.value)\n      var plist = cells[i].children[1].children\n      try {\n        var e = graph.insertEdge(parent, edgeId, null,\n          graph.getModel().getCell(source),\n          graph.getModel().getCell(target)\n        )\n        e.geometry.points = []\n        for (var a in cells[i].children[1].children) {\n          try {\n            e.geometry.points.push(new mxPoint(Number(plist[a].attributes.x.value), Number(plist[a].attributes.y.value)))\n          } catch (e) { }\n          graph.getModel().beginUpdate()\n          try {\n            graph.view.refresh()\n          } finally {\n            var morph = new mxMorphing(graph, 20, 1.2, 20)\n            morph.addListener(mxEvent.DONE, function () {\n              graph.getModel().endUpdate()\n            })\n            morph.startAnimation()\n          }\n        }\n        if (graph.getModel().getCell(target).edge === true) {\n          e.geometry.setTerminalPoint(new mxPoint(Number(cellAttrs.tarx.value), Number(cellAttrs.tary.value)), false)\n          graph.getModel().beginUpdate()\n          try {\n            graph.view.refresh()\n          } finally {\n            // Arguments are number of steps, ease and delay\n            morph = new mxMorphing(graph, 20, 1.2, 20)\n            morph.addListener(mxEvent.DONE, function () {\n              graph.getModel().endUpdate()\n            })\n            morph.startAnimation()\n          }\n        }\n      } catch (e) {\n      }\n    }\n  }\n}\n\n"
  },
  {
    "path": "eda-frontend/src/components/LTI/LTI.css",
    "content": ".lti-url:focus {\n  outline: none;\n}\n"
  },
  {
    "path": "eda-frontend/src/components/LTI/LTI.js",
    "content": "import React, { useEffect } from 'react'\nimport {\n  Button,\n  Typography,\n  TextField,\n  MenuItem,\n  Select,\n  FormControl,\n  FormControlLabel,\n  InputLabel,\n  CardMedia,\n  CardContent,\n  CardActionArea,\n  Card,\n  Checkbox,\n  Snackbar,\n  IconButton,\n  Chip,\n  Input\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport queryString from 'query-string'\nimport CloseIcon from '@material-ui/icons/Close'\nimport TextareaAutosize from '@material-ui/core/TextareaAutosize'\nimport api from '../../utils/Api'\nimport './LTI.css'\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n    minHeight: 300,\n    minWidth: 500\n  },\n  media: {\n    height: 0,\n    paddingTop: '56.25%' // 16:9\n  },\n  title: {\n    fontSize: 14,\n    color: '#80ff80'\n  },\n  paper: {\n    position: 'absolute',\n    width: 400,\n    backgroundColor: theme.palette.background.paper,\n    border: '2px solid #000',\n    boxShadow: theme.shadows[5],\n    padding: theme.spacing(2, 4, 3)\n  },\n  delete: {\n    backgroundColor: 'red',\n    color: 'white'\n  }\n}))\n\nexport default function LTIConfig () {\n  const classes = useStyles()\n\n  const [ltiDetails, setLTIDetails] = React.useState({\n    secretKey: '',\n    consumerKey: '',\n    configURL: '',\n    configExists: false,\n    consumerError: '',\n    score: '',\n    initialSchematic: '',\n    modelSchematic: '',\n    testCase: null,\n    scored: true,\n    id: ''\n  })\n\n  const { secretKey, consumerKey, configURL, configExists, score, modelSchematic } = ltiDetails\n  const [schematic, setSchematic] = React.useState('')\n  const [history, setHistory] = React.useState([])\n  const [historyId, setHistoryId] = React.useState('')\n  const [schematics, setSchematics] = React.useState([])\n  const [update, setUpdate] = React.useState(false)\n  const [submitMessage, setSubmitMessage] = React.useState('')\n  const [activeSim, setActiveSim] = React.useState(null)\n  const [simParam, setSimParam] = React.useState([])\n  const [graphSimParams, setGraphSimParams] = React.useState([])\n\n  useEffect(() => {\n    if (activeSim) {\n      var arr = []\n      if (activeSim.result.graph === 'true') {\n        // eslint-disable-next-line\n        activeSim.result.data.map((i) => {\n          // eslint-disable-next-line\n          i.labels.map((params) => {\n            if (!arr.includes(params)) {\n              arr.push(params)\n            }\n          })\n        })\n      }\n      setGraphSimParams(arr)\n    }\n  }, [activeSim])\n\n  useEffect(() => {\n    var url = queryString.parse(window.location.href.split('lti?')[1])\n    const token = localStorage.getItem('esim_token')\n    const config = {\n      headers: {\n        'Content-Type': 'application/json'\n      }\n    }\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    api.get(`save/versions/${url.id}`, config).then(res => {\n      res.data.map(ele => {\n        ele.save_time = new Date(ele.save_time)\n        return 0\n      })\n      setSchematics(res.data)\n    }).catch(err => {\n      console.log(err)\n    })\n    // eslint-disable-next-line\n  }, [])\n\n  useEffect(() => {\n    if (historyId !== 'None' && history !== []) {\n      var temp = history.find(ele => ele.id === historyId)\n      console.log('CHANGING ACTIVE SIM')\n      setActiveSim(temp)\n    }\n    // eslint-disable-next-line\n  }, [history, historyId])\n\n  useEffect(() => {\n    var url = queryString.parse(window.location.href.split('lti?')[1])\n    const token = localStorage.getItem('esim_token')\n    const config = {\n      headers: {\n        'Content-Type': 'application/json'\n      }\n    }\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    api.get(`lti/exist/${url.id}`, config).then(res => {\n      setLTIDetails(\n        {\n          modelSchematic: res.data.model_schematic,\n          secretKey: res.data.secret_key,\n          consumerKey: res.data.consumer_key,\n          configURL: res.data.config_url,\n          score: res.data.score,\n          configExists: true,\n          initialSchematic: res.data.model_schematic,\n          testCase: res.data.test_case,\n          scored: res.data.scored,\n          id: res.data.id\n        })\n      setSchematic(`${res.data.model_schematic.version}-${res.data.model_schematic.branch}`)\n      setSimParam(res.data.sim_params)\n      if (res.data.test_case === null) {\n        setHistoryId('None')\n      } else {\n        setHistoryId(res.data.test_case)\n      }\n    }).catch(err => {\n      console.log(err)\n      api.get(`save/${url.id}/${url.version}/${url.branch}`, config).then(res => {\n        setLTIDetails(\n          {\n            modelSchematic: res.data,\n            scored: true\n          })\n        setSchematic(`${res.data.version}-${res.data.branch}`)\n      })\n    })\n  }, [])\n  // to get test cases for LTI\n  useEffect(() => {\n    var url = queryString.parse(window.location.href.split('lti?')[1])\n    const token = localStorage.getItem('esim_token')\n    const config = {\n      headers: {\n        'Content-Type': 'application/json'\n      }\n    }\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    api.get(`simulation/history/lti/${url.id}/${schematic.split('-')[0]}/${schematic.split('-')[1]}/${null}`, config).then(res => {\n      res.data.map(ele => {\n        ele.simulation_time = new Date(ele.simulation_time)\n        return 0\n      })\n      console.log(res.data)\n      console.log('yes')\n      setHistory(res.data)\n    }).catch(err => {\n      console.log(err)\n    })\n  }, [schematic])\n\n  // eslint-disable-next-line\n  const handleLTIGenerate = () => {\n    var score = ''\n    if (!ltiDetails.scored) {\n      score = null\n    } else {\n      score = ltiDetails.score\n    }\n    const body = {\n      consumer_key: ltiDetails.consumerKey,\n      secret_key: ltiDetails.secretKey,\n      model_schematic: ltiDetails.modelSchematic.id,\n      score: score,\n      initial_schematic: ltiDetails.modelSchematic.id,\n      test_case: ltiDetails.testCase,\n      scored: ltiDetails.scored,\n      sim_params: simParam\n    }\n    console.log(body)\n    api.post('lti/build/', body)\n      .then(res => {\n        setLTIDetails({\n          ...ltiDetails,\n          configURL: res.data.config_url,\n          configExists: true,\n          consumerError: '',\n          score: res.data.score,\n          id: res.data.id\n        })\n        return res.data\n      })\n      .catch((err) => {\n        console.log(err.data)\n        setLTIDetails({ ...ltiDetails, consumerError: 'An error was encountered while setting the details!' })\n      })\n  }\n\n  const handleUpdateClose = () => {\n    setUpdate(false)\n  }\n\n  const handleDeleteLTIApp = () => {\n    api.delete(`lti/delete/${ltiDetails.modelSchematic.id}`)\n      .then(res => {\n        setLTIDetails({\n          secretKey: '',\n          consumerKey: '',\n          configURL: '',\n          configExists: false,\n          consumerError: '',\n          score: '',\n          initialSchematic: '',\n          modelSchematic: modelSchematic,\n          testCase: null,\n          id: ''\n        })\n        setHistoryId('')\n        setSimParam([])\n      })\n      .catch(error => console.log(error))\n  }\n\n  const handleConsumerKey = (e) => {\n    setLTIDetails({ ...ltiDetails, consumerKey: e.target.value })\n  }\n\n  const handleSecretKey = (e) => {\n    setLTIDetails({ ...ltiDetails, secretKey: e.target.value })\n  }\n\n  const handleScore = (e) => {\n    if (e.target.value > 1 || e.target.value < 0) {\n      // To-DO: Show error message\n    } else {\n      setLTIDetails({ ...ltiDetails, score: e.target.value })\n    }\n  }\n\n  const handleCheckChange = (e) => {\n    setLTIDetails({ ...ltiDetails, scored: e.target.checked })\n  }\n\n  const handleChange = (e) => {\n    var schematic = null\n    schematics.forEach(element => {\n      if (element.version === e.target.value.split('-')[0] && element.branch === e.target.value.split('-')[1]) {\n        schematic = element\n      }\n    })\n    setSchematic(e.target.value)\n    setLTIDetails({ ...ltiDetails, modelSchematic: schematic })\n  }\n\n  const handleChangeSim = (e) => {\n    setLTIDetails({ ...ltiDetails, testCase: e.target.value })\n    setHistoryId(e.target.value)\n    setSimParam([])\n  }\n\n  const handleSimParamChange = (event) => {\n    setSimParam(event.target.value)\n  }\n\n  const handleOnClick = () => {\n    var score = ''\n    if (!ltiDetails.scored) {\n      score = null\n    } else {\n      score = ltiDetails.score\n    }\n    const body = {\n      consumer_key: ltiDetails.consumerKey,\n      secret_key: ltiDetails.secretKey,\n      model_schematic: ltiDetails.modelSchematic.id,\n      score: score,\n      initial_schematic: ltiDetails.modelSchematic.id,\n      test_case: ltiDetails.testCase,\n      scored: ltiDetails.scored,\n      id: ltiDetails.id,\n      sim_params: simParam\n    }\n    console.log(body)\n    api.post('lti/update/', body)\n      .then(res => {\n        setLTIDetails({\n          ...ltiDetails,\n          configURL: res.data.config_url,\n          configExists: true,\n          consumerError: '',\n          score: res.data.score\n        })\n        setUpdate(true)\n        setSubmitMessage('Updated Successfully')\n        return res.data\n      })\n      .catch((err) => {\n        console.log(err.data)\n        setSubmitMessage('An error was encountered!')\n      })\n  }\n\n  const handleUrlCopy = () => {\n    var copyText = document.querySelector('.lti-url')\n    console.log(copyText)\n    copyText.select()\n    copyText.setSelectionRange(0, 99999)\n    document.execCommand('copy')\n  }\n  console.log(history)\n  return (\n    <>\n      {ltiDetails && <>\n        <div style={{ display: 'flex' }}>\n          <Card className={classes.root} style={{ marginLeft: '2%' }}>\n            <CardActionArea>\n              <CardMedia\n                className={classes.media}\n                image={ltiDetails.modelSchematic.base64_image}\n                title=\"Schematic\"\n              />\n              <CardContent>\n                <Typography gutterBottom variant=\"h5\" component=\"h2\">\n                  Schematic\n                </Typography>\n              </CardContent>\n            </CardActionArea>\n          </Card>\n          {/* {ltiDetails.initialSchematic && <Card className={classes.root} style={{ marginLeft: '2%' }}>\n            <CardActionArea>\n              <CardMedia\n                className={classes.media}\n                image={initial.base64_image}\n                title=\"Initial Schematic\"\n              />\n              <CardContent>\n                <Typography gutterBottom variant=\"h5\" component=\"h2\">\n                  Initial Schematic\n                </Typography>\n              </CardContent>\n            </CardActionArea>\n          </Card>} */}\n          <div style={{ minWidth: '500px', marginLeft: '2%', marginTop: '2%' }}>\n            {ltiDetails.consumerError && <h3>{ltiDetails.consumerError}</h3>}\n            <TextField id=\"standard-basic\" label=\"Consumer Key\" defaultValue={consumerKey} onChange={handleConsumerKey} value={consumerKey} />\n            <TextField style={{ marginLeft: '1%' }} id=\"standard-basic\" label=\"Secret Key\" defaultValue={secretKey} onChange={handleSecretKey} value={secretKey} />\n            <TextField style={{ marginLeft: '1%' }} id=\"standard-basic\" label=\"Score\" defaultValue={score} onChange={handleScore} value={score} disabled={!ltiDetails.scored} />\n            <FormControl style={{ marginTop: '1%' }} className={classes.formControl}>\n              <InputLabel htmlFor=\"outlined-age-native-simple\">Schematic</InputLabel>\n              <Select\n                labelId=\"demo-simple-select-placeholder-label-label\"\n                id=\"demo-simple-select-placeholder-label\"\n                value={schematic}\n                style={{ minWidth: '300px' }}\n                onChange={handleChange}\n                label=\"Schematic\"\n                className={classes.selectEmpty}\n              >\n                {schematics.map(schematic => {\n                  return <MenuItem key={schematic.version} value={`${schematic.version}-${schematic.branch}`}>{schematic.name} of variation {schematic.branch} saved at {schematic.save_time.toLocaleString()}</MenuItem>\n                })}\n              </Select>\n            </FormControl>\n            <FormControl style={{ marginLeft: '2%', marginTop: '1%' }} className={classes.formControl}>\n              <InputLabel htmlFor=\"outlined-age-native-simple\">Test Case</InputLabel>\n              {history && <Select\n                labelId=\"select-simulation-history\"\n                id=\"select-sim\"\n                value={historyId}\n                style={{ minWidth: '300px' }}\n                onChange={handleChangeSim}\n                label=\"Test Case\"\n                className={classes.historyselectEmpty}\n                inputProps={{ readOnly: !ltiDetails.scored }}\n              >\n\n                <MenuItem value={null}>\n                  None\n                </MenuItem>\n                {history.map(sim => {\n                  return <MenuItem key={sim.id} value={sim.id}>{sim.simulation_type} at {sim.simulation_time.toLocaleString()}</MenuItem>\n                })}\n              </Select>}\n            </FormControl>\n            <br />\n            {activeSim && <FormControl style={{ marginTop: '1%', minWidth: 200 }} className={classes.formControl}>\n              <InputLabel id=\"demo-mutiple-chip-label\">Comparison Parameter</InputLabel>\n              {history && <Select\n                labelId=\"select-comparison-parameter\"\n                id=\"demo-mutiple-chip\"\n                multiple\n                value={simParam}\n                onChange={handleSimParamChange}\n                input={<Input id=\"select-multiple-chip\" />}\n                inputProps={{ readOnly: !ltiDetails.scored }}\n                renderValue={(selected) => (\n                  <div className={classes.chips}>\n                    {selected.map((value) => (\n                      <Chip key={value} label={value} className={classes.chip} />\n                    ))}\n                  </div>\n                )}\n              >\n                {activeSim.result.graph === 'true'\n                  ? graphSimParams.map((params) => {\n                    return (\n                      <MenuItem key={`${params}-${Math.random()}`} value={params}>{params}</MenuItem>\n                    )\n                  })\n                  : activeSim.result.data.map((params) => {\n                    return (\n                      <MenuItem key={params[0]} value={params[0]}>\n                        {params[0]}\n                      </MenuItem>\n                    )\n                  })}\n              </Select>}\n            </FormControl>}\n            <FormControlLabel\n              style={{ marginLeft: '1%', marginTop: '2%' }}\n              control={\n                <Checkbox\n                  checked={ltiDetails.scored}\n                  onChange={handleCheckChange}\n                  name=\"scored\"\n                  color=\"primary\"\n                />\n              }\n              label=\"Scored?\"\n            />\n          </div>\n        </div>\n        <div>\n          <Button style={{ marginTop: '1%', marginLeft: '2%', minWidth: 300 }} disableElevation variant=\"contained\" color=\"primary\" href='/eda/#/dashboard' startIcon={<ArrowBackIcon />}>\n            Return to Dashboard\n          </Button>\n          <Button style={{ marginTop: '1%', marginLeft: '1%', minWidth: 300 }} disableElevation variant=\"contained\" color=\"primary\" disabled={configExists} onClick={handleLTIGenerate}>\n            Create LTI URL\n          </Button>\n          {configExists &&\n            <Button\n              style={{ marginLeft: '1%', marginTop: '1%', minWidth: 300 }}\n              disableElevation\n              color=\"primary\"\n              variant=\"contained\"\n              href={`#/submission?id=${ltiDetails.modelSchematic.save_id}&version=${ltiDetails.modelSchematic.version}&branch=${ltiDetails.modelSchematic.branch}`}\n            >\n              Submissions\n            </Button>}\n          {configExists && <Button\n            style={{ marginLeft: '1%', marginTop: '1%', minWidth: 297 }}\n            disableElevation\n            color=\"primary\"\n            variant=\"contained\"\n            onClick={handleOnClick} >\n            Update LTI App\n          </Button>}\n          {configExists &&\n            <Button\n              style={{ marginLeft: '1%', marginTop: '1%', minWidth: 300 }}\n              disableElevation\n              variant=\"contained\"\n              className={classes.delete}\n              startIcon={<DeleteIcon />}\n              onClick={() => handleDeleteLTIApp()}\n            >\n              Delete\n            </Button>}\n          {configURL && <div style={{ display: 'flex', marginTop: '1%', marginLeft: '2%' }}>\n            <h3 className={classes.config} style={{ float: 'left', marginTop: '1.1%' }}>URL for LTI Access:</h3>\n            <h3 className={classes.config} style={{ float: 'left' }}>\n              <TextareaAutosize className=\"lti-url\" value={configURL} maxRows={1} style={{ fontSize: '18px', width: 1200, maxWidth: 1200, border: 'none' }} />\n            </h3>\n            <Button style={{ float: 'right', height: '50%', marginTop: '0.7%', marginLeft: '1%', minWidth: 200 }} disableElevation variant=\"contained\" color=\"primary\" onClick={handleUrlCopy}>\n              Copy LTI URL\n            </Button>\n\n          </div>}\n        </div>\n        <Snackbar\n          anchorOrigin={{\n            vertical: 'bottom',\n            horizontal: 'left'\n          }}\n          open={update}\n          autoHideDuration={2000}\n          onClose={handleUpdateClose}\n          message={submitMessage}\n          action={\n            <>\n              <IconButton size=\"small\" aria-label=\"close\" color=\"inherit\" onClick={handleUpdateClose}>\n                <CloseIcon fontSize=\"small\" />\n              </IconButton>\n            </>\n          }\n        />\n      </>}\n    </>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/components/LTI/SubmissionTable.js",
    "content": "import React, { useEffect } from 'react'\nimport {\n  Button,\n  Typography,\n  IconButton,\n  Input,\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableRow,\n  TableContainer\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport ArrowUpwardIcon from '@material-ui/icons/ArrowUpward'\nimport ArrowDownwardIcon from '@material-ui/icons/ArrowDownward'\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack'\nimport FilterListIcon from '@material-ui/icons/FilterList'\nimport queryString from 'query-string'\nimport api from '../../utils/Api'\nimport Dialog from '@material-ui/core/Dialog'\nimport DialogContent from '@material-ui/core/DialogContent'\nimport DialogActions from '@material-ui/core/DialogActions'\nimport DialogTitle from '@material-ui/core/DialogTitle'\nimport CompareGraph from './CompareGraph'\n\nconst useStyles = makeStyles({\n  table: {\n    minWidth: 650\n  },\n  title: {\n    fontSize: 14,\n    color: '#80ff80'\n  }\n})\n\nconst sortOrder = {\n  Unsorted: 0,\n  Ascending: 1,\n  Descending: 2\n}\n\nexport default function SubmissionTable () {\n  const classes = useStyles()\n  const [responseData, setResponseData] = React.useState([])\n  const [sortData, setSortData] = React.useState([])\n  const [sortOrderUser, setSortOrderUser] = React.useState(sortOrder.Unsorted)\n  const [sortOrderTime, setSortOrderTime] = React.useState(sortOrder.Unsorted)\n  const [anchorEl, setAnchorEl] = React.useState(null)\n  const [open, setOpen] = React.useState(false)\n  const [simResult, setSimResult] = React.useState(null)\n\n  useEffect(() => {\n    setSortData(responseData)\n    console.log(responseData)\n  }, [responseData])\n\n  useEffect(() => {\n    console.log(simResult)\n  }, [simResult])\n\n  useEffect(() => {\n    var url = queryString.parse(window.location.href.split('submission')[1])\n    const token = localStorage.getItem('esim_token')\n    const config = {\n      headers: {\n        'Content-Type': 'application/json'\n      }\n    }\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    api.get(`/lti/submissions/${url.id}/${url.version}/${url.branch}`, config)\n      .then(\n        (res) => {\n          for (var i = 0; i < res.data.length; i++) {\n            res.data[i].schematic.save_time = new Date(res.data[i].schematic.save_time)\n            if (!res.data[i].student) {\n              res.data[i].student = {}\n              res.data[i].student.username = 'Anonymous User'\n            }\n          }\n          setResponseData(res.data)\n        }\n      )\n      .catch((err) => { console.error(err) })\n  }, [])\n\n  const handleUserSort = () => {\n    setSortOrderTime(0)\n    var temp = responseData.slice()\n    if (sortOrderUser === 0) {\n      temp.sort((a, b) => {\n        if (a.student.username > b.student.username) return -1\n        else if (a.student.username < b.student.username) return 1\n        return 0\n      })\n      setSortData(temp)\n      setSortOrderUser(1)\n    } else if (sortOrderUser === 1) {\n      temp.sort((a, b) => {\n        if (a.student.username < b.student.username) return -1\n        else if (a.student.username > b.student.username) return 1\n        return 0\n      })\n      setSortData(temp)\n      setSortOrderUser(2)\n    } else {\n      setSortData(responseData)\n      setSortOrderUser(0)\n    }\n  }\n\n  const handleTimeSort = () => {\n    setSortOrderUser(0)\n    var temp = responseData.slice()\n    if (sortOrderTime === 0) {\n      temp.sort((a, b) => {\n        if (a.schematic.save_time < b.schematic.save_time) return -1\n        else if (a.schematic.save_time > b.schematic.save_time) return 1\n        return 0\n      })\n      setSortData(temp)\n      setSortOrderTime(1)\n    } else if (sortOrderTime === 1) {\n      temp.sort((a, b) => {\n        if (a.schematic.save_time > b.schematic.save_time) return -1\n        else if (a.schematic.save_time < b.schematic.save_time) return 1\n        return 0\n      })\n      setSortData(temp)\n      setSortOrderTime(2)\n    } else {\n      setSortData(responseData)\n      setSortOrderTime(0)\n    }\n  }\n\n  const onSearch = (e) => {\n    setSortData(responseData.filter((o) =>\n      // eslint-disable-next-line\n      Object.keys(o).some((k) => {\n        if ((k === 'student') && String(o[k].username).toLowerCase().includes(e.target.value.toLowerCase())) {\n          return String(o[k].username).toLowerCase().includes(e.target.value.toLowerCase())\n        }\n      }\n      )\n    ))\n  }\n\n  const handleFilterOpen = (e) => {\n    if (anchorEl) {\n      setAnchorEl(null)\n    } else {\n      setAnchorEl(e.currentTarget)\n    }\n  }\n\n  const handleButtonClick = () => {\n    var url = queryString.parse(window.location.href.split('submission')[1])\n    window.location.href = `/eda/#/lti?id=${url.id}&version=${url.version}&branch=${url.branch}`\n  }\n\n  const handleSimOpen = (studentSim) => {\n    setSimResult(studentSim)\n    setOpen(true)\n  }\n  const handleClose = () => {\n    setOpen(false)\n  }\n\n  return (\n    <>\n      <IconButton onClick={handleFilterOpen} style={{ float: 'right' }} ><FilterListIcon /></IconButton>\n      <Input style={{ float: 'right' }} onChange={(e) => onSearch(e)} placeholder='Search' />\n      <Button style={{ float: 'left' }} disableElevation variant=\"contained\" color=\"primary\" onClick={handleButtonClick} startIcon={<ArrowBackIcon />}>\n        Return to LTI App\n      </Button>\n      <TableContainer>\n        {sortData.length !== 0 ? <>\n          <Table className={classes.table} aria-label=\"submission table\">\n            <TableHead>\n              <TableRow>\n                <TableCell onClick={handleUserSort}>User {sortOrderUser === 1 ? <ArrowUpwardIcon fontSize=\"small\" /> : sortOrderUser === 2 ? <ArrowDownwardIcon fontSize=\"small\" /> : <ArrowUpwardIcon color=\"disabled\" fontSize=\"small\" />}</TableCell>\n                <TableCell align=\"center\">User ID in LMS</TableCell>\n                <TableCell onClick={handleTimeSort} align=\"center\">Submitted at {sortOrderTime === 1 ? <ArrowUpwardIcon fontSize=\"small\" /> : sortOrderTime === 2 ? <ArrowDownwardIcon fontSize=\"small\" /> : <ArrowUpwardIcon color=\"disabled\" fontSize=\"small\" />}</TableCell>\n                <TableCell align=\"center\">Submitted From</TableCell>\n                <TableCell align=\"center\">Score</TableCell>\n                <TableCell align=\"center\">Submission Circuit</TableCell>\n                <TableCell align=\"center\">Submission Simulation</TableCell>\n                <TableCell align=\"center\">Teacher Simulation</TableCell>\n              </TableRow>\n            </TableHead>\n            <TableBody>\n              {sortData.map((student) => {\n                return <TableRow key={student.schematic.save_id}>\n                  <TableCell component=\"th\" scope=\"row\">\n                    {student.student.username}\n                  </TableCell>\n                  <TableCell align=\"center\">{student.ltisession.user_id}</TableCell>\n                  <TableCell align=\"center\">{student.schematic.save_time.toLocaleString()}</TableCell>\n                  <TableCell align=\"center\">{student.ltisession.lis_outcome_service_url ? student.ltisession.lis_outcome_service_url.split('/')[2] : <h1>None</h1>}</TableCell>\n                  <TableCell align=\"center\">{student.score}</TableCell>\n                  <TableCell align=\"center\">\n                    <Button disableElevation variant=\"contained\" color=\"primary\" href={`#/editor?id=${student.schematic.save_id}&version=${student.schematic.version}&branch=${student.schematic.branch}`}>\n                      Open Submission\n                    </Button>\n                  </TableCell>\n                  <TableCell align=\"center\">\n                    <Button disableElevation variant=\"contained\" color=\"primary\" onClick={() => handleSimOpen(student.student_simulation)}>\n                      Open Simulation Result\n                    </Button>\n                  </TableCell>\n                  <TableCell align=\"center\">\n                    <Button disableElevation variant=\"contained\" color=\"primary\" onClick={() => handleSimOpen(student.project.test_case)}>\n                      Open Teacher Simulation\n                    </Button>\n                  </TableCell>\n                </TableRow>\n              }\n              )}\n            </TableBody>\n          </Table>\n          <Dialog onClose={handleClose} aria-labelledby=\"customized-dialog-title\" open={open} fullScreen={simResult && simResult.result.graph === 'true'}>\n            <DialogTitle id=\"customized-dialog-title\" onClose={handleClose}>\n              Student Simulation\n            </DialogTitle>\n            <DialogContent dividers>\n              {simResult && simResult.result.graph === 'false' && simResult.result.data.map((ele, index) => (\n                // eslint-disable-next-line\n                <Typography>\n                  {index + 1}. {ele[0]} : {ele[2]}\n                </Typography>))}\n              {simResult && simResult.result.graph === 'true' &&\n                <CompareGraph given={simResult.result} />\n                // <h1> Simulation is graphical and cannot be displayed here</h1>\n              }\n            </DialogContent>\n            <DialogActions>\n              <Button autoFocus onClick={handleClose} color=\"primary\">\n                Close\n              </Button>\n            </DialogActions>\n          </Dialog>\n        </> : <Typography style={{ textAlign: 'center' }}><h1>No submissions for this assignment</h1></Typography>}\n      </TableContainer>\n    </>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/components/LTI/SubmitResults.js",
    "content": "import React from 'react'\nimport {\n  Paper,\n  Dialog,\n  Typography,\n  Grid,\n  Slide,\n  AppBar,\n  Toolbar,\n  IconButton,\n  Tooltip\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport PropTypes from 'prop-types'\nimport CancelIcon from '@material-ui/icons/Cancel'\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle'\nimport CloseIcon from '@material-ui/icons/Close'\nimport AdjustIcon from '@material-ui/icons/Adjust'\nimport CompareGraph from './CompareGraph'\n\nconst useStyles = makeStyles((theme) => ({\n  appBar: {\n    position: 'relative'\n  },\n  paper: {\n    padding: theme.spacing(2),\n    textAlign: 'left',\n    backgroundColor: '#404040',\n    color: '#fff'\n  }\n}))\n\nconst Transition = React.forwardRef(function Transition (props, ref) {\n  return <Slide direction=\"up\" ref={ref} {...props} />\n})\n\nfunction SubmitResults ({ show, setResults, results }) {\n  console.log(results)\n  const classes = useStyles()\n  const showIcons = (item) => {\n    if (results.sim_params.includes(item)) {\n      if (\n        results.comparison_result === 'Same Values' ||\n        results.comparison_result.same.includes(item)\n      ) {\n        return <Tooltip title=\"Correct\">\n          <CheckCircleIcon />\n        </Tooltip>\n      } else {\n        return <Tooltip title=\"Wrong\">\n          <CancelIcon />\n        </Tooltip>\n      }\n    } else {\n      return <Tooltip title=\"Not Graded\">\n        <AdjustIcon />\n      </Tooltip>\n    }\n  }\n  return (\n    <Dialog\n      open={show}\n      onClose={() => setResults(false)}\n      TransitionComponent={Transition}\n      fullScreen\n    >\n      <AppBar className={classes.appBar}>\n        <Toolbar>\n          <IconButton\n            edge=\"start\"\n            color=\"inherit\"\n            onClick={() => setResults(false)}\n            aria-label=\"close\"\n          >\n            <CloseIcon />\n          </IconButton>\n        </Toolbar>\n      </AppBar>\n      <Grid container>\n        <Grid item xs={12}>\n          <h1 style={{ textAlign: 'center' }}>Your Score: {results.score} /1 </h1>\n          {/* <h2>Teacher Values</h2> */}\n        </Grid>\n        {results.expected && results.given.graph !== 'true' && (\n          <>\n            <Grid item xs={5} style={{ padding: '2%' }}>\n              {// eslint-disable-next-line\n              <h2>Teacher's values:</h2>}\n              {results.expected.data.map((ele, index) => (\n                <Paper class={classes.paper} key={ele}>\n                  <Typography>\n                    {index + 1}. {ele[0]} : {ele[2]}\n                  </Typography>\n                </Paper>\n              ))}\n            </Grid>\n            <Grid item xs={2} />\n          </>\n        )}\n        <Grid\n          item\n          xs={results.expected && results.given.graph !== 'true' ? 5 : 12}\n          style={{ padding: '2%' }}\n        >\n          {results.given && results.given.graph !== 'true' ? (\n            <>\n              <h2>Your Submission Values: </h2>\n              {results.given.data.map((ele, index) => (\n                <Paper class={classes.paper} key={ele}>\n                  <Typography style={{\n                    display: 'flex',\n                    alignItems: 'center',\n                    flexWrap: 'wrap'\n                  }}\n                  >\n                    {showIcons(ele[0])}\n                    <p style={{ marginLeft: '2%' }}>{index + 1}. {ele[0]} : {ele[2]}</p>\n                  </Typography>\n                </Paper>\n              ))}\n            </>\n          ) : (\n            <CompareGraph expected={results.expected} given={results.given} />\n          )}\n        </Grid>\n      </Grid>\n    </Dialog >\n  )\n}\n\nexport default SubmitResults\n\nSubmitResults.propTypes = {\n  show: PropTypes.bool,\n  setResults: PropTypes.func,\n  results: PropTypes.object\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Project/ChangeStatus.js",
    "content": "/* eslint-disable camelcase */\nimport { Button, Paper, InputLabel, Select, MenuItem, TextField } from '@material-ui/core'\nimport React, { useEffect } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { getStatus, changeStatus } from '../../redux/actions'\nimport PropTypes from 'prop-types'\n\nfunction ChangeStatus ({ project, changedStatus }) {\n  const dispatch = useDispatch()\n  const [status, setStatus] = React.useState(null)\n  const [note, setNote] = React.useState('')\n  const handleSelectChange = (event) => {\n    setStatus(event.target.value)\n  }\n  const clickChangeStatus = () => {\n    dispatch(changeStatus(project.details.project_id, status, note))\n    changedStatus()\n  }\n  const onChangeNote = (e) => {\n    setNote(e.target.value)\n  }\n  useEffect(() => {\n    dispatch(getStatus(project.details?.project_id))\n  }, [dispatch, project.details])\n  return (\n    <Paper>\n      {project.states &&\n                <div style={{ padding: ' 0 1% 1% 1%', textAlign: 'left' }}>\n                  <br />\n                  <h3 style={{ marginTop: '0' }}>Review the project and change it&apos;s state</h3>\n                  <h3 style={{ marginTop: '0' }}>Current State : {project.details?.status_name}</h3>\n                  <TextField\n                    style={{ width: '50%', marginBottom: '2%' }}\n                    placeholder='Reviewer Notes'\n                    multiline\n                    value={note}\n                    onChange={onChangeNote}\n                    rows={2} />\n                  <InputLabel style={{ marginTop: '0' }}>Select and Change the status of this project</InputLabel>\n                  <Select\n                    labelId=\"demo-simple-select-label\"\n                    id=\"demo-simple-select\"\n                    style={{ width: '50%' }}\n                    onChange={handleSelectChange}\n                    value={status}\n                  >\n                    {project.states.map((item, index) =>\n                      (\n                        <MenuItem key={item} value={item}>{item}</MenuItem>\n                      ))}\n                  </Select>\n                  <Button style={{ float: 'right' }} variant='contained' color='primary' onClick={clickChangeStatus}>Change Status</Button>\n                </div>\n      }\n    </Paper>\n  )\n}\n\nChangeStatus.propTypes = {\n  project: PropTypes.object,\n  changedStatus: PropTypes.func\n}\n\nexport default ChangeStatus\n"
  },
  {
    "path": "eda-frontend/src/components/Project/CreateProject.js",
    "content": "/* eslint-disable camelcase */\nimport React, { useState, useEffect } from 'react'\nimport {\n  Button,\n  Toolbar,\n  IconButton,\n  Typography,\n  Slide,\n  AppBar,\n  Container,\n  Grid,\n  Paper,\n  TextField,\n  Tooltip,\n  Select,\n  MenuItem,\n  InputLabel,\n  List,\n  ListItem,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogContentText,\n  DialogTitle\n}\n  from '@material-ui/core'\nimport CloseIcon from '@material-ui/icons/Close'\nimport PostAddIcon from '@material-ui/icons/PostAdd'\nimport KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp'\nimport KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown'\nimport { makeStyles } from '@material-ui/core/styles'\nimport FormControl from '@material-ui/core/FormControl'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { changeStatus, createProject, deleteProject, getStatus } from '../../redux/actions'\nimport api from '../../utils/Api'\nimport ProjectTimeline from './ProjectTimeline'\nimport ProjectSimulationParameters from './ProjectSimulationParameters'\n\nconst useStyles = makeStyles((theme) => ({\n  appBar: {\n    position: 'relative'\n  },\n  title: {\n    marginLeft: theme.spacing(2),\n    flex: 1\n  },\n  header: {\n    padding: theme.spacing(5, 0, 6),\n    color: '#fff'\n  },\n  paper: {\n    padding: theme.spacing(2),\n    textAlign: 'left',\n    color: '#fff'\n  },\n  formControl: {\n    margin: theme.spacing(1),\n    minWidth: 120,\n    textAlign: 'left'\n  },\n  selectEmpty: {\n    marginTop: theme.spacing(2)\n  }\n}))\n\nconst Transition = React.forwardRef(function Transition (props, ref) {\n  return <Slide direction=\"up\" ref={ref} {...props} />\n})\n\nfunction CreateProject () {\n  const [open, setOpen] = useState(false)\n  const classes = useStyles()\n  const dispatch = useDispatch()\n  const project = useSelector(state => state.projectReducer)\n  const auth = useSelector(state => state.authReducer)\n  const save_id = useSelector(state => state.saveSchematicReducer.details.save_id)\n  const owner = useSelector(state => state.saveSchematicReducer.details.owner)\n  const [status, setStatus] = React.useState(null)\n  const [versions, setVersions] = React.useState(null)\n  const [activeVersion, setActiveVersion] = React.useState('')\n  const [activeName, setActiveName] = React.useState(null)\n  const [activeSaveTime, setActiveSaveTime] = React.useState(null)\n  const [activeSaveDate, setActiveSaveDate] = React.useState(null)\n  const [details, setDetails] = useState(\n    {\n      title: '',\n      description: '',\n      active_branch: '',\n      active_version: ''\n    })\n  const [fields, setFields] = useState([{ name: 'Procedure', text: '' }, { name: 'Observation', text: '' }, { name: 'Conclusion', text: '' }])\n  const [changed, setChanged] = useState(0)\n  const [deleteDialogue, setDeleteDialogue] = useState(false)\n  const [dcSweepcontrolLine, setDcSweepControlLine] = useState({\n    parameter: '',\n    sweepType: 'Linear',\n    start: '',\n    stop: '',\n    step: '',\n    parameter2: '',\n    start2: '',\n    stop2: '',\n    step2: ''\n  })\n  const [transientAnalysisControlLine, setTransientAnalysisControlLine] = useState({\n    start: '',\n    stop: '',\n    step: '',\n    skipInitial: false\n  })\n\n  const [acAnalysisControlLine, setAcAnalysisControlLine] = useState({\n    input: 'dec',\n    start: '',\n    stop: '',\n    pointsBydecade: ''\n  })\n\n  const [tfAnalysisControlLine, setTfAnalysisControlLine] = useState({\n    outputNodes: false,\n    outputVoltageSource: '',\n    inputVoltageSource: ''\n  })\n  const [selectedSimulation, setSelectedSimulation] = useState('')\n  useEffect(() => {\n    if (open && project.details?.project_id) {\n      dispatch(getStatus(project.details?.project_id))\n      setStatus(project.details?.status_name)\n    }\n    if (project.details) {\n      console.log(project.details)\n      setDetails({ title: project.details.title, description: project.details.description, active_version: project.details.active_version, active_branch: project.details.active_branch })\n      setFields(project.details.fields)\n      if (project.details.dc_sweep) {\n        setDcSweepControlLine(project.details.dc_sweep)\n      }\n      if (project.details.transient_analysis) {\n        setTransientAnalysisControlLine(project.details.transient_analysis)\n      }\n      if (project.details.tf_analysis) {\n        setTfAnalysisControlLine(project.details.tf_analysis)\n      }\n      if (project.details.ac_analysis) {\n        setAcAnalysisControlLine(project.details.ac_analysis)\n      }\n    }\n    if (!project.details) {\n      setDetails({\n        title: '',\n        description: '',\n        active_branch: '',\n        active_version: ''\n      })\n      setActiveVersion('')\n      setFields([{ name: 'Procedure', text: '' }, { name: 'Observation', text: '' }, { name: 'Conclusion', text: '' }])\n    }\n  }, [open, dispatch, project.details])\n  useEffect(() => {\n    const config = {\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded'\n      }\n    }\n    const token = localStorage.getItem('esim_token')\n    // If token available add to headers\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    if (window.location.href.split('?id=')[1]) {\n      api\n        .get(\n          'save/versions/' +\n          window.location.href.split('?id=')[1].substring(0, 36),\n          config\n        )\n        .then((resp) => {\n          for (var i = 0; i < resp.data.length; i++) {\n            var d = new Date(resp.data[i].save_time)\n            resp.data[i].date = d.getDate() + '/' + parseInt(d.getMonth() + 1) + '/' + d.getFullYear()\n            resp.data[i].time = d.getHours() + ':' + d.getMinutes()\n            if (d.getMinutes() < 10) {\n              resp.data[i].time = d.getHours() + ':0' + d.getMinutes()\n            }\n          }\n          var versionsAccordingFreq = {}\n          resp.data.forEach((value) => {\n            value.full_time = new Date(value.save_time)\n            versionsAccordingFreq[value.branch] ? versionsAccordingFreq[value.branch].push(value) : versionsAccordingFreq[value.branch] = [value]\n          })\n          var versionsArray = Object.entries(versionsAccordingFreq)\n          for (var k = 0; k < versionsArray.length; k++) {\n            versionsArray[k][1].sort((a, b) => {\n              return b.full_time - a.full_time\n            })\n          }\n          versionsArray.sort((a, b) => {\n            return b[1][b[1].length - 1].full_time - a[1][a[1].length - 1].full_time\n          })\n          var versionsTemp = []\n          for (var j = 0; j < versionsArray.length; j++) {\n            versionsTemp = versionsTemp.concat(versionsArray[j][1])\n          }\n          setVersions(versionsTemp)\n        })\n        .catch((err) => {\n          console.log(err)\n        })\n    }\n  }, [open])\n  useEffect(() => {\n    if (versions && project.details) {\n      for (var i = 0; i < versions.length; i++) {\n        if (versions[i].version === project.details.active_version && versions[i].branch === project.details.active_branch) {\n          setActiveVersion(`${versions[i].version}-${versions[i].branch}`)\n          setActiveName(versions[i].name)\n          setActiveSaveTime(versions[i].time)\n          setActiveSaveDate(versions[i].date)\n          break\n        }\n      }\n    }\n  }, [project.details, versions])\n  const handleActiveVersion = (e) => {\n    if (changed === 0) {\n      setChanged(1)\n    } else if (changed === 2) {\n      setChanged(3)\n    }\n    setActiveVersion(e.target.value)\n    setDetails({ ...details, active_branch: e.target.value.split('-')[1], active_version: e.target.value.split('-')[0] })\n  }\n  const handleSelectChange = (event) => {\n    if (event.target.value !== project.details.status_name) {\n      if (changed === 0) {\n        setChanged(2)\n      } else if (changed === 1) {\n        setChanged(3)\n      }\n    } else {\n      if (changed === 2) {\n        setChanged(0)\n      } else if (changed === 3) {\n        setChanged(1)\n      }\n    }\n    setStatus(event.target.value)\n  }\n  const changeFieldText = (e) => {\n    if (changed === 0) {\n      setChanged(1)\n    } else if (changed === 2) {\n      setChanged(3)\n    }\n    var temp = [...fields]\n    if (e.target.name === 'name') {\n      temp[e.target.id].name = e.target.value\n      setFields(temp)\n    } else if (e.target.name === 'text') {\n      temp[e.target.id].text = e.target.value\n      setFields(temp)\n    } else {\n      setDetails({ ...details, [e.target.name]: e.target.value })\n    }\n  }\n  const handleClick = () => {\n    setOpen(!open)\n  }\n  const createPub = () => {\n    if (details.title !== '' && details.description !== '' && activeVersion !== '') {\n      dispatch(createProject(save_id, [details, fields, '', dcSweepcontrolLine, transientAnalysisControlLine, acAnalysisControlLine, tfAnalysisControlLine]))\n    }\n  }\n  const clickChange = () => {\n    if (details.title !== '' && details.description !== '' && activeVersion !== '') {\n      if (changed === 1) {\n        dispatch(createProject(save_id, [details, fields, '', dcSweepcontrolLine, transientAnalysisControlLine, acAnalysisControlLine, tfAnalysisControlLine]))\n      } else if (changed === 2) {\n        if (status !== project.details.status_name) {\n          dispatch(changeStatus(project.details.project_id, status, ''))\n        }\n      } else if (changed === 3) {\n        if (status !== project.details.status_name) {\n          dispatch(createProject(save_id, [details, fields, status, dcSweepcontrolLine, transientAnalysisControlLine, acAnalysisControlLine, tfAnalysisControlLine]))\n        } else {\n          dispatch(createProject(save_id, [details, fields, '', dcSweepcontrolLine, transientAnalysisControlLine, acAnalysisControlLine, tfAnalysisControlLine]))\n        }\n      }\n      setChanged(0)\n    }\n  }\n  const clickPreview = () => {\n    const win = window.open()\n    win.location.href = '/eda/#/project?save_id=' + project.details.save_id + '&version=' + project.details.active_version + '&branch=' + project.details.active_branch + '&project_id=' + project.details.project_id\n    win.focus()\n  }\n  const addField = () => {\n    setFields([...fields, { name: '', text: '' }])\n    if (changed === 0) {\n      setChanged(1)\n    } else if (changed === 2) {\n      setChanged(3)\n    }\n  }\n  const onClickShift = (type, index) => {\n    if (type === 'above') {\n      const temporary = [...fields]\n      const current = temporary[index]\n      temporary[index] = temporary[index - 1]\n      temporary[index - 1] = current\n      setFields(temporary)\n    } else {\n      const temporary = [...fields]\n      const current = temporary[index]\n      temporary[index] = temporary[index + 1]\n      temporary[index + 1] = current\n      setFields(temporary)\n    }\n  }\n  const onRemove = (e) => {\n    var list = [...fields]\n    console.log(e)\n    list.splice(e, 1)\n    setFields(list)\n    if (changed === 0) {\n      setChanged(1)\n    } else if (changed === 2) {\n      setChanged(3)\n    }\n  }\n  const handleDeleteDialogue = () => {\n    setDeleteDialogue(!deleteDialogue)\n  }\n  const deleteProjectFunction = (id) => {\n    console.log(id)\n    dispatch(deleteProject(id))\n    setDeleteDialogue(!deleteDialogue)\n    setOpen(false)\n  }\n  return (\n    <div>\n      {(window.location.href.split('?id=')[1] && auth.user?.username === owner) &&\n        <IconButton\n          color='inherit'\n          aria-label='open drawer'\n          edge='end'\n          size=\"small\"\n          onClick={handleClick}>\n          <Tooltip title=\"Create Project\">\n            <PostAddIcon />\n          </Tooltip>\n        </IconButton>}\n      <Dialog fullScreen open={open} TransitionComponent={Transition} onClose={handleClick} PaperProps={{\n        style: {\n          backgroundColor: '#4d4d4d',\n          boxShadow: 'none'\n        }\n      }}>\n        <AppBar className={classes.appBar}>\n          <Toolbar>\n            <IconButton edge=\"start\" color=\"inherit\" onClick={handleClick} aria-label=\"close\">\n              <CloseIcon />\n            </IconButton>\n            <Typography variant=\"h6\" className={classes.title}>\n              Project Details\n            </Typography>\n\n            {!project.details && <Button color=\"inherit\" onClick={createPub}>\n              Create Project\n            </Button>}\n            {project.details && <Button color=\"inherit\" onClick={clickPreview}>\n              Preview\n            </Button>}\n            {project.details && changed !== 0 && <Button color=\"inherit\" onClick={clickChange}>\n              Update Project\n            </Button>}\n          </Toolbar>\n        </AppBar>\n\n        <Container maxWidth=\"lg\" className={classes.header}>\n          <Grid\n            container\n            spacing={3}\n            direction=\"row\"\n            justify=\"center\"\n            alignItems=\"flex-start\"\n          >\n            <Grid item xs={12} sm={12}>\n\n              {project.details && <Paper style={{ padding: '.2% 0%', marginBottom: '1%' }}>\n                <h3 style={{ textAlign: 'center' }}>Status of the project: {project.details.status_name}  </h3>\n                <h3 style={{ textAlign: 'center' }}>Active Version: {activeName} of variation {project.details.active_branch} saved on {activeSaveDate} at {activeSaveTime} hours</h3>\n                {project.details.history && project.details.history.slice(0).reverse()[0]?.reviewer_notes && <h4 style={{ textAlign: 'center' }}>Reviewer Notes: {project.details.history.slice(0).reverse()[0]?.reviewer_notes}</h4>}\n              </Paper>}\n              <Paper className={classes.paper}>\n                <h2 style={{ color: 'black' }}>Project Details</h2>\n                {versions != null &&\n                  ((project.details && project.details.can_edit) || !project.details) && <Grid item xs={12} sm={12}>\n                  <FormControl\n                    style={{ width: '100%' }}\n                    className={classes.formControl}\n                    error={!activeVersion}>\n                    <InputLabel id=\"demo-simple-select-label\">Select the version you want to use for your project.</InputLabel>\n                    <Select\n                      labelId=\"demo-simple-select-label\"\n                      id=\"demo-simple-select\"\n                      value={activeVersion}\n                      onChange={handleActiveVersion}\n                    >\n                      {versions.map(version => {\n                        return <MenuItem key={version.version} value={`${version.version}-${version.branch}`}>Version {version.name} from variation {version.branch} saved on {version.date} at {version.time}</MenuItem>\n                      })}\n                    </Select>\n                  </FormControl> </Grid>}\n                <TextField\n                  color='primary'\n                  autoFocus\n                  margin=\"dense\"\n                  id=\"title\"\n                  label=\"Title\"\n                  name='title'\n                  type=\"text\"\n                  fullWidth\n                  disabled={project.details && !project.details.can_edit}\n                  value={details.title}\n                  error={!details.title}\n                  onChange={changeFieldText}\n\n                />\n                <TextField\n                  color='primary'\n                  margin=\"dense\"\n                  multiline\n                  id=\"description\"\n                  label=\"Description\"\n                  name='description'\n                  rows={4}\n                  type=\"text\"\n                  disabled={project.details && !project.details.can_edit}\n                  value={details.description}\n                  error={!details.description}\n                  onChange={changeFieldText}\n                  fullWidth\n                />\n                {fields && fields.map((item, index) =>\n                  (\n                    <>\n                      <hr />\n                      {((project.details && project.details.can_edit) || !project.details) &&\n                      <>\n                        <Tooltip title=\"Delete Field\">\n                          <IconButton style={{ float: 'right' }} onClick={() => onRemove(index)}>\n                            <CloseIcon />\n                          </IconButton></Tooltip>\n                        {index !== fields.length - 1 && <IconButton style={{ float: 'right' }} onClick={() => onClickShift('below', index)}>\n                          <Tooltip title=\"Move Field Down\">\n                            <KeyboardArrowDownIcon />\n                          </Tooltip>\n                        </IconButton>}\n                        {index !== 0 && <IconButton style={{ float: 'right' }} onClick={() => onClickShift('above', index)}>\n                          <Tooltip title=\"Move Field Up\">\n                            <KeyboardArrowUpIcon />\n                          </Tooltip>\n                        </IconButton>}\n                      </>}\n                      <TextField\n                        color='primary'\n                        margin=\"dense\"\n                        id={index}\n                        label={'Title ' + index}\n                        type=\"text\"\n                        name='name'\n                        disabled={project.details && !project.details.can_edit}\n                        value={item.name}\n                        onChange={changeFieldText}\n                        fullWidth\n                      />\n                      <TextField\n                        color='primary'\n                        margin=\"dense\"\n                        multiline\n                        id={index}\n                        label={'Text ' + index}\n                        rows={4}\n                        type=\"text\"\n                        name='text'\n                        disabled={project.details && !project.details.can_edit}\n                        value={item.text}\n                        onChange={changeFieldText}\n                        fullWidth\n                      />\n                    </>\n                  ))}\n\n                <br />\n                {((project.states && project.details) || !project.details) && <Button onClick={addField}>+ Add Field</Button>}\n                <h2 style={{ color: 'black' }}>Simulation Parameters</h2>\n                <div>\n                  <FormControl className={classes.formControl} style={{ width: '100%' }}>\n                    <InputLabel id=\"demo-simple-select-label\">Select simulation mode parameters to enter:</InputLabel>\n                    <Select\n                      style={{ width: '50%' }}\n                      onChange={(e) => setSelectedSimulation(e.target.value)}\n                      value={selectedSimulation}>\n                      <MenuItem value=\"DC Sweep\">DC Sweep</MenuItem>\n                      <MenuItem value=\"Transient Analysis\">Transient Analysis</MenuItem>\n                      <MenuItem value=\"Transfer Function Analysis\">Transfer Function Analysis</MenuItem>\n                      <MenuItem value=\"AC Analysis\">AC Analysis</MenuItem>\n                    </Select>\n                  </FormControl>\n                </div>\n                <ProjectSimulationParameters\n                  dcSweepcontrolLine={dcSweepcontrolLine}\n                  setDcSweepControlLine={setDcSweepControlLine}\n                  transientAnalysisControlLine={transientAnalysisControlLine}\n                  setTransientAnalysisControlLine={setTransientAnalysisControlLine}\n                  acAnalysisControlLine={acAnalysisControlLine}\n                  setAcAnalysisControlLine={setAcAnalysisControlLine}\n                  tfAnalysisControlLine={tfAnalysisControlLine}\n                  setTfAnalysisControlLine={setTfAnalysisControlLine}\n                  changed={changed}\n                  setChanged={setChanged}\n                  selectedSimulation={selectedSimulation}\n                />\n                {project.details && <>{\n                  project.states &&\n                  <div style={{ textAlign: 'left' }}>\n                    <br />\n                    <InputLabel id=\"demo-simple-select-label\">Change Status</InputLabel>\n                    <Select\n                      labelId=\"demo-simple-select-label\"\n                      id=\"demo-simple-select\"\n                      style={{ width: '50%' }}\n                      onChange={handleSelectChange}\n                      value={status}\n                    >\n                      {project.states.map((item, index) =>\n                        (\n                          <MenuItem key={item} value={item}>{item}</MenuItem>\n                        ))}\n                      <MenuItem key={project.details.status_name} value={project.details.status_name}>{project.details.status_name}</MenuItem>\n                    </Select>\n                  </div>\n                }</>}\n              </Paper>\n            </Grid>\n            {project.details && <><Grid item xs={6} sm={6}>\n              <Paper style={{ paddingTop: '0%', padding: '2%' }}>\n                <List>\n                  <h3>List of Approved Reports</h3>\n                  {project.reports?.approved[0]\n                    ? <>\n                      {project.reports.approved.map((item, index) => (\n                        <ListItem key={index}>\n                          {index + 1}. {item.description}\n                        </ListItem>\n                      ))}\n                    </> : <h4>No approved reports.</h4>}\n                </List>\n                <List>\n                  <h3>List of Reports yet to be evaluated by a Reviewer.</h3>\n                  {project.reports?.open[0]\n                    ? <>\n                      {project.reports.open.map((item, index) => (\n                        <ListItem key={index}>\n                          {index + 1}. {item.description}\n                        </ListItem>\n                      ))}\n                    </> : <h4>No Unapproved reports.</h4>}\n                </List>\n              </Paper>\n            </Grid>\n            <Grid item xs={6} sm={6}>\n              <Paper style={{ padding: '2%' }}>\n                <List>\n                  <h3>History of this Project</h3>\n                  {(project.details?.history && project.details?.history[0])\n                    ? <>\n                      <ProjectTimeline history={project.details.history.slice(0).reverse()} isOwner={auth.user?.username === owner} />\n                    </>\n                    : <h4>No history of this project.</h4>\n                  }\n                </List>\n              </Paper>\n            </Grid></>}\n          </Grid>\n          {!project.details && <Button color=\"primary\" style={{ width: '100%', marginTop: '2%' }} variant='contained' onClick={createPub}>\n            Create Project\n          </Button>}\n          {project.details && project.details.can_delete && <Button onClick={handleDeleteDialogue} style={{ width: '100%', color: 'white', backgroundColor: 'red', margin: '2% auto auto auto' }}>Delete Project</Button>}\n          <Dialog\n            open={deleteDialogue}\n            onClose={handleDeleteDialogue}\n            aria-labelledby=\"alert-dialog-title\"\n            aria-describedby=\"alert-dialog-description\"\n          >\n            <DialogTitle id=\"alert-dialog-title\">{'Are you sure you want to delete the project?'}</DialogTitle>\n            <DialogContent>\n              <DialogContentText id=\"alert-dialog-description\">\n                You cannot revert this.\n              </DialogContentText>\n            </DialogContent>\n            <DialogActions>\n              <Button onClick={handleDeleteDialogue} color=\"primary\">\n                Disagree\n              </Button>\n              <Button onClick={() => deleteProjectFunction(project.details.project_id)} color=\"primary\" autoFocus>\n                Agree\n              </Button>\n            </DialogActions>\n          </Dialog>\n        </Container>\n      </Dialog>\n    </div>\n  )\n}\nexport default CreateProject\n"
  },
  {
    "path": "eda-frontend/src/components/Project/ProjectSimulationParameters.js",
    "content": "import React, { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n  Box,\n  Typography,\n  TextField,\n  List,\n  ListItem,\n  Divider,\n  Checkbox\n} from '@material-ui/core'\nimport { GenerateCompList } from '../SchematicEditor/Helper/ToolbarTools'\n\nfunction TabPanel (props) {\n  const { children, value, index, ...other } = props\n\n  return (\n    <div\n      role=\"tabpanel\"\n      hidden={value !== index}\n      id={`simple-tabpanel-${index}`}\n      aria-labelledby={`simple-tab-${index}`}\n      {...other}\n    >\n      {value === index && (\n        <Box p={3}>\n          <Typography>{children}</Typography>\n        </Box>\n      )}\n    </div>\n  )\n}\n\nTabPanel.propTypes = {\n  children: PropTypes.node,\n  index: PropTypes.any.isRequired,\n  value: PropTypes.any.isRequired\n}\n\nfunction ProjectSimulationParameters (props) {\n  const [componentsList, setComponentsList] = useState([])\n  const [disabled, setDisabled] = React.useState(false)\n\n  const handleDcSweepControlLine = (evt) => {\n    const value = evt.target.value\n\n    props.setDcSweepControlLine({\n      ...props.dcSweepcontrolLine,\n      [evt.target.id]: value\n    })\n    if (props.changed === 0) {\n      props.setChanged(1)\n    } else if (props.changed === 2) {\n      props.setChanged(3)\n    }\n  }\n  const handleTransientAnalysisControlLineUIC = (evt) => {\n    const value = evt.target.checked\n\n    props.setTransientAnalysisControlLine({\n      ...props.transientAnalysisControlLine,\n      [evt.target.id]: value\n    })\n    if (props.changed === 0) {\n      props.setChanged(1)\n    } else if (props.changed === 2) {\n      props.setChanged(3)\n    }\n  }\n\n  const handleTransientAnalysisControlLine = (evt) => {\n    const value = evt.target.value\n\n    props.setTransientAnalysisControlLine({\n      ...props.transientAnalysisControlLine,\n      [evt.target.id]: value\n    })\n    if (props.changed === 0) {\n      props.setChanged(1)\n    } else if (props.changed === 2) {\n      props.setChanged(3)\n    }\n  }\n  const handleAcAnalysisControlLine = (evt) => {\n    const value = evt.target.value\n\n    props.setAcAnalysisControlLine({\n      ...props.acAnalysisControlLine,\n      [evt.target.id]: value\n    })\n    if (props.changed === 0) {\n      props.setChanged(1)\n    } else if (props.changed === 2) {\n      props.setChanged(3)\n    }\n  }\n\n  const handleTfAnalysisControlLine = (evt) => {\n    const value = evt.target.value\n    props.setTfAnalysisControlLine({\n      ...props.tfAnalysisControlLine,\n      [evt.target.id]: value\n    })\n    if (props.changed === 0) {\n      props.setChanged(1)\n    } else if (props.changed === 2) {\n      props.setChanged(3)\n    }\n  }\n  const handleTfAnalysisControlLineNodes = (evt) => {\n    const value = evt.target.checked\n    props.setTfAnalysisControlLine({\n      ...props.tfAnalysisControlLine,\n      [evt.target.id]: value\n    })\n    if (props.changed === 0) {\n      props.setChanged(1)\n    } else if (props.changed === 2) {\n      props.setChanged(3)\n    }\n    setDisabled(props.tfAnalysisControlLine.outputNodes)\n  }\n  useEffect(() => {\n    if (props.selectedSimulation !== '') {\n      try {\n        setComponentsList(['', ...GenerateCompList()])\n      } catch (err) {\n        setComponentsList([])\n        alert('Circuit not complete. Please Check Connectons.')\n      }\n    }\n  }, [props.selectedSimulation])\n  return (\n    <>\n      <TabPanel value={props.selectedSimulation} index={'DC Sweep'} >\n        <List style={{ color: 'black' }}>\n          <h3 style={{ marginTop: '0' }}>DC Sweep</h3>\n          <ListItem>\n            <TextField\n              style={{ width: '100%' }}\n              id=\"parameter\"\n              size='small'\n              variant=\"outlined\"\n              select\n              label=\"Select Component\"\n              value={props.dcSweepcontrolLine.parameter}\n              onChange={handleDcSweepControlLine}\n              SelectProps={{\n                native: true\n              }}\n            >\n              {\n                componentsList.map((value, i) => {\n                  if (value.charAt(0) === 'V' || value.charAt(0) === 'v' || value.charAt(0) === 'I' || value.charAt(0) === 'i' || value === '') {\n                    return (<option key={i} value={value}>\n                      {value}\n                    </option>)\n                  } else {\n                    return null\n                  }\n                })\n              }\n\n            </TextField>\n          </ListItem>\n          <ListItem>\n            <TextField id=\"start\" label=\"Start Voltage\" size='small' variant=\"outlined\"\n              value={props.dcSweepcontrolLine.start}\n              onChange={handleDcSweepControlLine}\n            />\n            <span style={{ marginLeft: '10px' }}>V</span>\n          </ListItem>\n          <ListItem>\n            <TextField id=\"stop\" label=\"Stop Voltage\" size='small' variant=\"outlined\"\n              value={props.dcSweepcontrolLine.stop}\n              onChange={handleDcSweepControlLine}\n            />\n            <span style={{ marginLeft: '10px' }}>V</span>\n          </ListItem>\n          <ListItem>\n            <TextField id=\"step\" label=\"Step\" size='small' variant=\"outlined\"\n              value={props.dcSweepcontrolLine.step}\n              onChange={handleDcSweepControlLine}\n            />\n            <span style={{ marginLeft: '10px' }}>V</span>\n          </ListItem>\n\n          {/* SECONDARY PARAMETER FOR SWEEP */}\n          <Divider />\n          <ListItem>\n\n            <h4 style={{ marginLeft: '10px', color: 'black' }}>Secondary Parameters</h4>\n          </ListItem>\n\n          <ListItem>\n\n            <TextField\n              style={{ width: '100%' }}\n              id=\"parameter2\"\n              size='small'\n              variant=\"outlined\"\n              select\n              label=\"Select Component\"\n              value={props.dcSweepcontrolLine.parameter2}\n              onChange={handleDcSweepControlLine}\n              SelectProps={{\n                native: true\n              }}\n\n            >\n              {\n                componentsList.map((value, i) => {\n                  return <option key={i} value={value}>\n                    {value}\n                  </option>\n                })\n              }\n            </TextField>\n          </ListItem>\n          <ListItem>\n            <TextField id=\"start2\" label=\"Start Value\" size='small' variant=\"outlined\"\n              value={props.dcSweepcontrolLine.start2}\n              onChange={handleDcSweepControlLine}\n            />\n\n          </ListItem>\n          <ListItem>\n            <TextField id=\"stop2\" label=\"Stop Value\" size='small' variant=\"outlined\"\n              value={props.dcSweepcontrolLine.stop2}\n              onChange={handleDcSweepControlLine}\n            />\n\n          </ListItem>\n          <ListItem>\n            <TextField id=\"step2\" label=\"Step Value\" size='small' variant=\"outlined\"\n              value={props.dcSweepcontrolLine.step2}\n              onChange={handleDcSweepControlLine}\n            />\n\n          </ListItem>\n        </List>\n      </TabPanel>\n      <TabPanel value={props.selectedSimulation} index={'Transient Analysis'} >\n        <List style={{ color: 'black' }}>\n          <h3 style={{ marginTop: '0' }}>Transient Analysis</h3>\n          <ListItem>\n            <TextField id=\"start\" label=\"Start Time\" size='small' variant=\"outlined\"\n              value={props.transientAnalysisControlLine.start}\n              onChange={handleTransientAnalysisControlLine}\n            />\n            <span style={{ marginLeft: '10px' }}>S</span>\n          </ListItem>\n          <ListItem>\n            <TextField id=\"stop\" label=\"Stop Time\" size='small' variant=\"outlined\"\n              value={props.transientAnalysisControlLine.stop}\n              onChange={handleTransientAnalysisControlLine}\n            />\n            <span style={{ marginLeft: '10px' }}>S</span>\n          </ListItem>\n          <ListItem>\n            <TextField id=\"step\" label=\"Time Step\" size='small' variant=\"outlined\"\n              value={props.transientAnalysisControlLine.step}\n              onChange={handleTransientAnalysisControlLine}\n            />\n            <span style={{ marginLeft: '10px' }}>S</span>\n          </ListItem>\n          <ListItem>\n            <Checkbox id=\"skipInitial\" label=\"Use Initial Conditions\" size='small' variant=\"outlined\"\n              value={props.transientAnalysisControlLine.skipInitial}\n              checked={props.transientAnalysisControlLine.skipInitial}\n              onChange={handleTransientAnalysisControlLineUIC}\n            />\n            <span style={{ marginLeft: '10px' }}>Use Initial Conditions</span>\n          </ListItem>\n        </List>\n      </TabPanel>\n      <TabPanel value={props.selectedSimulation} index={'Transfer Function Analysis'} >\n        <List style={{ color: 'black' }}>\n          <h3 style={{ marginTop: '0' }}>Transfer Function Analysis</h3>\n          <ListItem>\n            <input\n              type=\"checkbox\"\n              name=\"Between Nodes\"\n              value={props.tfAnalysisControlLine.outputNodes}\n              checked={props.tfAnalysisControlLine.outputNodes}\n              onChange={handleTfAnalysisControlLineNodes}\n              id=\"outputNodes\"\n            // checked={tfAnalysisControlLine.outputNodes}\n            />\n            <span style={{ marginLeft: '10px' }}>Output By Nodes</span>\n\n          </ListItem>\n          <ListItem>\n            <TextField\n              style={{ width: '100%' }}\n              id=\"outputVoltageSource\"\n              size='small'\n              variant=\"outlined\"\n              select\n              label=\"Output Voltage SRC\"\n              value={props.tfAnalysisControlLine.outputVoltageSource}\n              onChange={handleTfAnalysisControlLine}\n              SelectProps={{\n                native: true\n              }}\n              disabled={!disabled}\n            >\n\n              {\n                componentsList.map((value, i) => {\n                  if (value.charAt(0) === 'V' || value.charAt(0) === 'v' || value.charAt(0) === 'I' || value.charAt(0) === 'i' || value === '') {\n                    return (<option key={i} value={value}>\n                      {value}\n                    </option>)\n                  } else {\n                    return null\n                  }\n                })\n              }\n\n            </TextField>\n\n          </ListItem>\n          <ListItem>\n            <TextField\n              style={{ width: '100%' }}\n              id=\"inputVoltageSource\"\n              size='small'\n              variant=\"outlined\"\n              select\n              label=\"Input Voltage SRC\"\n              value={props.tfAnalysisControlLine.inputVoltageSource}\n              onChange={handleTfAnalysisControlLine}\n              SelectProps={{\n                native: true\n              }}\n            >\n\n              {\n                componentsList.map((value, i) => {\n                  if (value.charAt(0) === 'V' || value.charAt(0) === 'v' || value.charAt(0) === 'I' || value.charAt(0) === 'i' || value === '') {\n                    return (<option key={i} value={value}>\n                      {value}\n                    </option>)\n                  } else {\n                    return null\n                  }\n                })\n              }\n\n            </TextField>\n          </ListItem>\n        </List>\n      </TabPanel>\n      <TabPanel value={props.selectedSimulation} index={'AC Analysis'} >\n        <List style={{ color: 'black' }}>\n          <h3 style={{ marginTop: '0' }}>AC Analysis</h3>\n          <ListItem>\n            <TextField\n              style={{ width: '100%' }}\n              id=\"input\"\n              size='small'\n              variant=\"outlined\"\n              select\n              label=\"Type\"\n              value={props.acAnalysisControlLine.input}\n              onChange={handleAcAnalysisControlLine}\n              SelectProps={{\n                native: true\n              }}\n\n            >\n              <option key=\"linear\" value=\"lin\">\n                Linear\n              </option>\n              <option key=\"decade\" value=\"dec\">\n                Decade\n              </option>\n              <option key=\"octave\" value=\"oct\">\n                Octave\n              </option>\n            </TextField>\n          </ListItem>\n\n          <ListItem>\n            <TextField id=\"pointsBydecade\" label=\"Points/ Decade\" size='small' variant=\"outlined\"\n              value={props.acAnalysisControlLine.pointsBydecade}\n              onChange={handleAcAnalysisControlLine}\n            />\n          </ListItem>\n          <ListItem>\n            <TextField id=\"start\" label=\"Start Frequency\" size='small' variant=\"outlined\"\n              value={props.acAnalysisControlLine.start}\n              onChange={handleAcAnalysisControlLine}\n            />\n            <span style={{ marginLeft: '10px' }}>Hz</span>\n          </ListItem>\n          <ListItem>\n            <TextField id=\"stop\" label=\"Stop Frequency\" size='small' variant=\"outlined\"\n              value={props.acAnalysisControlLine.stop}\n              onChange={handleAcAnalysisControlLine}\n            />\n            <span style={{ marginLeft: '10px' }}>Hz</span>\n          </ListItem>\n        </List>\n      </TabPanel>\n    </>\n  )\n}\n\nProjectSimulationParameters.propTypes = {\n  dcSweepcontrolLine: PropTypes.object,\n  transientAnalysisControlLine: PropTypes.object,\n  acAnalysisControlLine: PropTypes.object,\n  tfAnalysisControlLine: PropTypes.object,\n  setDcSweepControlLine: PropTypes.func,\n  setTransientAnalysisControlLine: PropTypes.func,\n  setAcAnalysisControlLine: PropTypes.func,\n  setTfAnalysisControlLine: PropTypes.func,\n  setChanged: PropTypes.func,\n  selectedSimulation: PropTypes.string,\n  changed: PropTypes.bool\n}\nexport default ProjectSimulationParameters\n"
  },
  {
    "path": "eda-frontend/src/components/Project/ProjectTimeline.js",
    "content": "/* eslint-disable camelcase */\nimport React, { useEffect, useState } from 'react'\nimport Timeline from '@material-ui/lab/Timeline'\nimport TimelineItem from '@material-ui/lab/TimelineItem'\nimport TimelineSeparator from '@material-ui/lab/TimelineSeparator'\nimport TimelineConnector from '@material-ui/lab/TimelineConnector'\nimport TimelineContent from '@material-ui/lab/TimelineContent'\nimport TimelineDot from '@material-ui/lab/TimelineDot'\nimport TimelineOppositeContent from '@material-ui/lab/TimelineOppositeContent'\nimport Typography from '@material-ui/core/Typography'\nimport PropTypes from 'prop-types'\nimport { useSelector } from 'react-redux'\nimport {\n  Tooltip,\n  Button,\n  Dialog,\n  DialogContent,\n  DialogActions,\n  DialogTitle\n} from '@material-ui/core'\nimport ImportExportIcon from '@material-ui/icons/ImportExport'\n\nfunction getDate (jsonDate) {\n  var json = jsonDate\n  var date = new Date(json)\n  var formattedDate\n  if (date.getMinutes() >= 10) {\n    formattedDate = date.getDate() + '-' + (date.getMonth() + 1) + '-' + date.getFullYear() + ' at ' + date.getHours() + ':' + date.getMinutes()\n  } else {\n    formattedDate = date.getDate() + '-' + (date.getMonth() + 1) + '-' + date.getFullYear() + ' at ' + date.getHours() + ':0' + date.getMinutes()\n  }\n  return `${formattedDate}`\n}\n\nfunction ProjectTimeline ({ history, isOwner }) {\n  const auth = useSelector(state => state.authReducer)\n  const [descending, setDescending] = useState(true)\n  const [notes, setNotes] = useState(false)\n  const [timeline, setTimeline] = useState(history)\n  useEffect(() => {\n    if (descending) {\n      setTimeline(history)\n    } else {\n      setTimeline(history.slice(0).reverse())\n    }\n  }, [descending, history])\n  return (\n    <>\n      <Button onClick={() => setNotes(true)}>Show Notes</Button>\n      <Tooltip title={`Ordered by: ${descending ? 'Descending' : 'Ascending'}`}>\n        <ImportExportIcon style={{ float: 'right' }} onClick={() => setDescending(!descending)} />\n      </Tooltip>\n      <Dialog fullWidth={true} maxWidth='sm' open={notes} onClose={() => setNotes(false)}>\n        <DialogTitle>Reviewer Notes List</DialogTitle>\n        <DialogContent>\n          <ol>\n            {history.map((item) => (\n              <>\n                {\n                  item.reviewer_notes && <li>\n                    &quot;{item.reviewer_notes}&quot; mentioned by {item.transition_author_name} at {getDate(item.transition_time)}\n                  </li>\n                }\n              </>\n            ))}\n          </ol>\n        </DialogContent>\n        <DialogActions>\n          <Button onClick={() => setNotes(false)}>Close</Button>\n        </DialogActions>\n      </Dialog>\n      {!descending ? <Timeline align=\"right\">\n        {isOwner\n          ? <>\n            {timeline.slice(0, -1).map((item) => (\n              <>\n                {item.transition.history_creator && <TimelineItem>\n                  <TimelineOppositeContent>\n                    <Typography color=\"textSecondary\">{getDate(item.transition_time)} by {item.transition_author_name}</Typography>\n                  </TimelineOppositeContent>\n                  <TimelineSeparator>\n                    <TimelineDot />\n                    <TimelineConnector />\n                  </TimelineSeparator>\n                  <TimelineContent>\n                    <Typography>{item.transition.history_creator}</Typography>\n                  </TimelineContent>\n                </TimelineItem>}\n              </>\n            ))}\n            {timeline[timeline.length - 1] && <TimelineItem>\n              <TimelineOppositeContent>\n                <Typography color=\"textSecondary\">{getDate(timeline[timeline.length - 1].transition_time)} by {timeline[timeline.length - 1].transition_author_name}</Typography>\n              </TimelineOppositeContent>\n              <TimelineSeparator>\n                {timeline[timeline.length - 1].transition.event_creator ? <TimelineDot /> : <TimelineDot color='primary' />}\n                <TimelineConnector />\n              </TimelineSeparator>\n              <TimelineContent>\n                <Typography>{timeline[timeline.length - 1].transition.history_creator}</Typography>\n              </TimelineContent>\n            </TimelineItem>}\n            {timeline[timeline.length - 1] && timeline[timeline.length - 1].transition.event_creator && <TimelineItem>\n              <TimelineSeparator>\n                <TimelineDot color='primary' />\n                <TimelineConnector />\n              </TimelineSeparator>\n              <TimelineContent>\n                <Typography color='primary'>{timeline[timeline.length - 1].transition.event_creator}</Typography>\n              </TimelineContent>\n            </TimelineItem>}\n\n          </>\n          : <>\n            {auth.roles?.is_type_reviewer ? timeline.slice(0, -1).map((item) => (\n              <>\n                {item.transition.history_reviewer && <TimelineItem>\n                  <TimelineOppositeContent>\n                    <Typography color=\"textSecondary\">{getDate(item.transition_time)} by {item.transition_author_name}</Typography>\n                  </TimelineOppositeContent>\n                  <TimelineSeparator>\n                    <TimelineDot />\n                    <TimelineConnector />\n                  </TimelineSeparator>\n                  <TimelineContent>\n                    <Typography>{item.transition.history_reviewer}</Typography>\n                  </TimelineContent>\n                </TimelineItem>}\n              </>\n            ))\n              : timeline.slice(0, -1).map((item) => (\n                <>\n                  {item.transition.history_other && <TimelineItem>\n                    <TimelineOppositeContent>\n                      <Typography color=\"textSecondary\">{getDate(item.transition_time)} by {item.transition_author_name}</Typography>\n                    </TimelineOppositeContent>\n                    <TimelineSeparator>\n                      <TimelineDot />\n                      <TimelineConnector />\n                    </TimelineSeparator>\n                    <TimelineContent>\n                      <Typography>{item.transition.history_other}</Typography>\n                    </TimelineContent>\n                  </TimelineItem>}\n                </>\n              ))\n            }\n            {timeline[timeline.length - 1] && <TimelineItem>\n              <TimelineOppositeContent>\n                <Typography color=\"textSecondary\">{getDate(timeline[timeline.length - 1].transition_time)} by {timeline[timeline.length - 1].transition_author_name}</Typography>\n              </TimelineOppositeContent>\n              <TimelineSeparator>\n                {(auth.roles?.is_type_reviewer && timeline[timeline.length - 1].transition.event_reviewer) || (timeline[timeline.length - 1].transition.event_other) ? <TimelineDot /> : <TimelineDot color='primary' />}\n                <TimelineConnector />\n              </TimelineSeparator>\n              <TimelineContent>\n                <Typography>{auth.roles?.is_type_reviewer ? timeline[timeline.length - 1].transition.history_reviewer : timeline[timeline.length - 1].transition.history_other}</Typography>\n              </TimelineContent>\n            </TimelineItem>}\n            {timeline[timeline.length - 1] && (auth.roles?.is_type_reviewer ? timeline[timeline.length - 1].transition.event_reviewer : timeline[timeline.length - 1].transition.event_other) && <TimelineItem>\n              <TimelineOppositeContent>\n                <Typography color=\"textSecondary\"></Typography>\n              </TimelineOppositeContent>\n              <TimelineSeparator>\n                <TimelineDot color='primary' />\n                <TimelineConnector />\n              </TimelineSeparator>\n              <TimelineContent>\n                <Typography color='primary'>{auth.roles?.is_type_reviewer ? timeline[timeline.length - 1].transition.event_reviewer : timeline[timeline.length - 1].transition.event_other}</Typography>\n              </TimelineContent>\n            </TimelineItem>}\n\n          </>}\n      </Timeline> : <Timeline align=\"right\">\n        {isOwner\n          ? <>\n            {timeline[0] && timeline[0].transition.event_creator && <TimelineItem>\n              <TimelineSeparator>\n                <TimelineDot color='primary' />\n                <TimelineConnector />\n              </TimelineSeparator>\n              <TimelineContent>\n                <Typography color='primary'>{timeline[0].transition.event_creator}</Typography>\n              </TimelineContent>\n            </TimelineItem>}\n            {timeline[0] && <TimelineItem>\n              <TimelineOppositeContent>\n                <Typography color=\"textSecondary\">{getDate(timeline[0].transition_time)} by {timeline[0].transition_author_name}</Typography>\n              </TimelineOppositeContent>\n              <TimelineSeparator>\n                {timeline[0].transition.event_creator ? <TimelineDot /> : <TimelineDot color='primary' />}\n                <TimelineConnector />\n              </TimelineSeparator>\n              <TimelineContent>\n                <Typography>{timeline[0].transition.history_creator}</Typography>\n              </TimelineContent>\n            </TimelineItem>}\n            {timeline.slice(1).map((item) => (\n              <>\n                {item.transition.history_creator && <TimelineItem>\n                  <TimelineOppositeContent>\n                    <Typography color=\"textSecondary\">{getDate(item.transition_time)} by {item.transition_author_name}</Typography>\n                  </TimelineOppositeContent>\n                  <TimelineSeparator>\n                    <TimelineDot />\n                    <TimelineConnector />\n                  </TimelineSeparator>\n                  <TimelineContent>\n                    <Typography>{item.transition.history_creator}</Typography>\n                  </TimelineContent>\n                </TimelineItem>}\n              </>\n            ))}\n          </>\n          : <>\n\n            {timeline[0] && (auth.roles?.is_type_reviewer ? timeline[0].transition.event_reviewer : timeline[0].transition.event_other) && <TimelineItem>\n              <TimelineOppositeContent>\n                <Typography color=\"textSecondary\"></Typography>\n              </TimelineOppositeContent>\n              <TimelineSeparator>\n                <TimelineDot color='primary' />\n                <TimelineConnector />\n              </TimelineSeparator>\n              <TimelineContent>\n                <Typography color='primary'>{auth.roles?.is_type_reviewer ? timeline[0].transition.event_reviewer : timeline[0].transition.event_other}</Typography>\n              </TimelineContent>\n            </TimelineItem>}\n            {timeline[0] && <TimelineItem>\n              <TimelineOppositeContent>\n                <Typography color=\"textSecondary\">{getDate(timeline[0].transition_time)} by {timeline[0].transition_author_name}</Typography>\n              </TimelineOppositeContent>\n              <TimelineSeparator>\n                {(auth.roles?.is_type_reviewer && timeline[0].transition.event_reviewer) || (timeline[0].transition.event_other) ? <TimelineDot /> : <TimelineDot color='primary' />}\n                <TimelineConnector />\n              </TimelineSeparator>\n              <TimelineContent>\n                <Typography>{auth.roles?.is_type_reviewer ? timeline[0].transition.history_reviewer : timeline[0].transition.history_other}</Typography>\n              </TimelineContent>\n            </TimelineItem>}\n            {auth.roles?.is_type_reviewer ? timeline.slice(1).map((item) => (\n              <>\n                {item.transition.history_reviewer && <TimelineItem>\n                  <TimelineOppositeContent>\n                    <Typography color=\"textSecondary\">{getDate(item.transition_time)} by {item.transition_author_name}</Typography>\n                  </TimelineOppositeContent>\n                  <TimelineSeparator>\n                    <TimelineDot />\n                    <TimelineConnector />\n                  </TimelineSeparator>\n                  <TimelineContent>\n                    <Typography>{item.transition.history_reviewer}</Typography>\n                  </TimelineContent>\n                </TimelineItem>}\n              </>\n            ))\n              : timeline.slice(1).map((item) => (\n                <>\n                  {item.transition.history_other && <TimelineItem>\n                    <TimelineOppositeContent>\n                      <Typography color=\"textSecondary\">{getDate(item.transition_time)} by {item.transition_author_name}</Typography>\n                    </TimelineOppositeContent>\n                    <TimelineSeparator>\n                      <TimelineDot />\n                      <TimelineConnector />\n                    </TimelineSeparator>\n                    <TimelineContent>\n                      <Typography>{item.transition.history_other}</Typography>\n                    </TimelineContent>\n                  </TimelineItem>}\n                </>\n              ))\n            }\n          </>}\n      </Timeline>}\n    </>\n  )\n}\n\nexport default ProjectTimeline\n\nProjectTimeline.propTypes = {\n  history: PropTypes.object,\n  isOwner: PropTypes.bool\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Project/ReportComponent.js",
    "content": "/* eslint-disable camelcase */\nimport React, { useEffect } from 'react'\nimport {\n  Button,\n  Typography,\n  Dialog,\n  DialogContent,\n  MenuItem,\n  Grid,\n  Select,\n  Paper,\n  DialogActions,\n  Tabs,\n  Tab,\n  Box\n} from '@material-ui/core'\nimport PropTypes from 'prop-types'\nimport { withStyles } from '@material-ui/core/styles'\nimport MuiDialogTitle from '@material-ui/core/DialogTitle'\nimport IconButton from '@material-ui/core/IconButton'\nimport CloseIcon from '@material-ui/icons/Close'\nimport { approveReports, fetchRole, getStatus, resolveReports } from '../../redux/actions/index'\nimport { useDispatch, useSelector } from 'react-redux'\n\nconst styles = (theme) => ({\n  root: {\n    margin: 0,\n    padding: theme.spacing(2)\n  },\n  closeButton: {\n    position: 'absolute',\n    right: theme.spacing(1),\n    top: theme.spacing(1),\n    color: theme.palette.grey[500]\n  }\n})\nfunction TabPanel (props) {\n  const { children, value, index, ...other } = props\n\n  return (\n    <div\n      role=\"tabpanel\"\n      hidden={value !== index}\n      id={`simple-tabpanel-${index}`}\n      aria-labelledby={`simple-tab-${index}`}\n      {...other}\n    >\n      {value === index && (\n        <Box p={3}>\n          <Typography>{children}</Typography>\n        </Box>\n      )}\n    </div>\n  )\n}\nTabPanel.propTypes = {\n  children: PropTypes.node,\n  index: PropTypes.any.isRequired,\n  value: PropTypes.any.isRequired\n}\nfunction a11yProps (index) {\n  return {\n    id: `simple-tab-${index}`,\n    'aria-controls': `simple-tabpanel-${index}`\n  }\n}\n\nfunction ReportComponent (props) {\n  const [reportDetailsOpen, setReportDetailsOpen] = React.useState(false)\n  const [status, setStatus] = React.useState(null)\n  const [reportStatus, setReportStatus] = React.useState(null)\n  const [tab, setTab] = React.useState(0)\n  const auth = useSelector(state => state.authReducer)\n  const stateList = useSelector(state => state.projectReducer.states)\n  const dispatch = useDispatch()\n\n  useEffect(() => {\n    const query = new URLSearchParams(props.location.search)\n    var project_id = query.get('project_id')\n    dispatch(fetchRole())\n    if (!reportDetailsOpen) {\n      dispatch(getStatus(project_id))\n    }\n  }, [props.location.search, dispatch, reportDetailsOpen])\n\n  const handleChangeTab = (event, newValue) => {\n    setTab(newValue)\n  }\n  const handleSelectChange = (event) => {\n    setStatus(event.target.value)\n  }\n\n  const handleReportDetailsOpen = (e) => {\n    if (reportDetailsOpen) {\n      setReportStatus(null)\n    }\n    setReportDetailsOpen(!reportDetailsOpen)\n  }\n  const onSelectReportStatus = (e, report_id) => {\n    if (reportStatus) {\n      var temp = [...reportStatus]\n    } else {\n      temp = []\n    }\n    var report = { id: report_id, approved: e.target.value }\n    temp.push(report)\n    setReportStatus(temp)\n  }\n  const onClick = (type) => {\n    const query = new URLSearchParams(props.location.search)\n    var project_id = query.get('project_id')\n    switch (type) {\n      case 'Change State':\n        dispatch(approveReports(project_id, reportStatus, status))\n        props.changedStatus()\n        handleReportDetailsOpen()\n        break\n      default:\n        break\n    }\n  }\n  const DialogTitle = withStyles(styles)((props) => {\n    const { children, classes, onClose, ...other } = props\n    return (\n      <MuiDialogTitle disableTypography className={classes.root} {...other}>\n        <Typography variant=\"h6\">{children}</Typography>\n        {onClose ? (\n          <IconButton aria-label=\"close\" className={classes.closeButton} onClick={onClose}>\n            <CloseIcon />\n          </IconButton>\n        ) : null}\n      </MuiDialogTitle>\n    )\n  })\n  return (\n    <>{auth.user && <Paper style={{ padding: '0.06% 1%' }}>\n\n      <h3 style={{ color: 'red' }}>This is a reported project\n        <Button style={{ float: 'right', verticalAlign: 'super' }} onClick={handleReportDetailsOpen}>View Reports</Button></h3>\n      <Dialog\n        open={reportDetailsOpen}\n        onClose={(handleReportDetailsOpen)}\n        fullWidth={true}\n        maxWidth={'md'}>\n        <DialogTitle style={{ paddingBottom: '0' }}><h1 style={{ marginBottom: '0', marginTop: '0' }}>Reports</h1></DialogTitle>\n        <DialogContent>\n          <Tabs value={tab} onChange={handleChangeTab}>\n            <Tab label=\"Open Reports\" {...a11yProps(0)} />\n            <Tab label=\"Approved Reports\" {...a11yProps(1)} />\n            {auth.user.username !== props.project.details.author_name && auth.roles?.is_type_reviewer && <Tab label=\"Closed Reports\" {...a11yProps(2)} />}\n          </Tabs>\n          <TabPanel value={tab} index={0}>\n            {(props.project.reports.open[0] && auth.user.username !== props.project.details.author_name && auth.roles?.is_type_reviewer) && <h3 style={{ marginTop: '0' }}>Do you want to approve any reports?</h3>}\n            {props.project.reports ? props.project.reports.open.map((item, index) => (\n              <Paper key={index} style={{ margin: '1% .2%', padding: '.5% .7%' }}>\n                <Grid container>\n                  <Grid item xs={6}>\n                    <p>\n                      {item.description}\n                    </p>\n                  </Grid>\n                  {auth.user.username !== props.project.details.author_name && auth.roles?.is_type_reviewer &&\n                    <Grid item xs={6}>\n                      <Select\n                        defaultValue={item.approved}\n                        variant='outlined'\n                        style={{ float: 'right' }}\n                        onChange={(e) => onSelectReportStatus(e, item.id)}\n                      >\n                        <MenuItem value={null}>None</MenuItem>\n                        <MenuItem value={true}>Approve</MenuItem>\n                        <MenuItem value={false}>Reject</MenuItem>\n                      </Select>\n                    </Grid>}\n                </Grid>\n              </Paper>\n            )) : <>No Open Reports</>}\n          </TabPanel>\n          <TabPanel value={tab} index={1}>\n            {props.project.reports.approved[0] ? props.project.reports.approved.map((item, index) => (\n              <Paper key={index} style={{ margin: '1% .2%', padding: '.5% .7%' }}>\n                <Grid container>\n                  <Grid item xs={6}>\n                    <p>\n                      {item.description}\n                    </p>\n                  </Grid>\n                  {auth.user.username !== props.project.details.author_name &&\n                    <Grid item xs={6}>\n                    </Grid>}\n                </Grid>\n              </Paper>\n            )) : <>No Approved Reports</>}\n          </TabPanel>\n          {auth.user.username !== props.project.details.author_name && <TabPanel value={tab} index={2}>\n            {props.project.reports && props.project.reports.closed.map((item, index) => (\n              <Paper key={index} style={{ margin: '1% .2%', padding: '.5% .7%' }}>\n                <Grid container>\n                  <Grid item xs={6}>\n                    <p>\n                      {item.description}\n                    </p>\n                  </Grid>{auth.user.username !== props.project.details.author_name &&\n                    <Grid item xs={6}>\n                    </Grid>}\n                </Grid>\n              </Paper>\n            ))}\n          </TabPanel>}\n          {stateList && ((tab === 1 && props.project.reports.approved[0]) || (tab === 0 && reportStatus)) && auth.roles?.is_type_reviewer && auth.user.username !== props.project.details.author_name &&\n            <Select\n              labelId=\"demo-simple-select-label\"\n              id=\"demo-simple-select\"\n              autoWidth\n              style={{ width: '50%' }}\n              onChange={handleSelectChange}\n              value={status}\n              variant='outlined'\n            >\n              {stateList.map((item, index) =>\n                (\n                  <MenuItem key={index} value={item}>{item}</MenuItem>\n                ))}\n            </Select>}\n        </DialogContent>\n        {auth.roles && <DialogActions>\n          {auth.user.username !== props.project.details.author_name && props.project.reports.approved[0] && auth.roles?.is_type_reviewer && tab === 1 && <Button onClick={() => {\n            dispatch(resolveReports(props.project.details.project_id, status))\n            handleReportDetailsOpen()\n          }}>Resolve All Reports</Button>}\n          {auth.roles?.is_type_reviewer && (reportStatus) &&\n            <Button onClick={() => {\n              onClick('Change State')\n            }}>Approve Reports</Button>}\n          <Button onClick={handleReportDetailsOpen}>Close</Button>\n        </DialogActions>}\n\n      </Dialog>\n    </Paper>}</>\n\n  )\n}\n\nReportComponent.propTypes = {\n  location: PropTypes.object,\n  children: PropTypes.node,\n  classes: PropTypes.object,\n  onClose: PropTypes.bool,\n  project: PropTypes.object,\n  changedStatus: PropTypes.func\n}\n\nexport default ReportComponent\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/ComponentProperties.js",
    "content": "/* eslint-disable brace-style */\nimport React, { useState, useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { setCompProperties } from '../../redux/actions/index'\nimport Draggable from 'react-draggable'\nimport { List, ListItem, ListItemText, Button, TextField, TextareaAutosize, Paper } from '@material-ui/core'\n\nexport default function ComponentProperties () {\n  // component properties that are displayed on the right side bar when user clicks on a component on the grid.\n\n  const properties = useSelector(state => state.componentPropertiesReducer.compProperties)\n  const isOpen = useSelector(state => state.componentPropertiesReducer.isPropertiesWindowOpen)\n  const id = useSelector(state => state.componentPropertiesReducer.id)\n  let x = useSelector(state => state.componentPropertiesReducer.x) + 50\n  let y = useSelector(state => state.componentPropertiesReducer.y)\n  const [height, setHeight] = useState(0)\n  const [width, setWidth] = useState(0)\n  const [val, setVal] = useState(properties)\n\n  useEffect(() => {\n    if (isOpen) {\n      const temp = document.getElementById('properties-modal').clientHeight\n      const temp2 = document.getElementById('properties-modal').clientWidth\n      console.log(window.screen.width, temp2)\n      console.log(x)\n      if (0.6 * window.screen.height - 260 - y < temp) {\n        if (temp + 100 >= y) {\n          // eslint-disable-next-line\n          y = 100 \n        }\n        else {\n          // eslint-disable-next-line\n          y = y - temp \n        }\n      }\n      if (x > window.screen.width - 547) {\n        // eslint-disable-next-line\n        x = x - 380\n      }\n      setHeight(y)\n      setWidth(x)\n    }\n  }, [isOpen])\n\n  const dispatch = useDispatch()\n\n  useEffect(() => {\n    setVal(properties)\n  }, [properties])\n\n  const getInputValues = (evt) => {\n    const value = evt.target.value\n    setVal({\n      ...val,\n      [evt.target.id]: value\n    })\n  }\n\n  const setProps = () => {\n    dispatch(setCompProperties(id, val))\n  }\n\n  return (\n    isOpen &&\n    <div id=\"properties-modal\" style={{ position: 'absolute', left: `${width}px`, top: `${height}px` }}>\n      <Draggable handle=\".handle\" bounds={{ left: 250 - width, right: window.screen.width - 550 - width, top: 100 - height, bottom: window.screen.height - 762 }}>\n        <Paper>\n          <List style={{ maxHeight: 500, maxWidth: 270, overflowY: 'scroll', overflowX: 'scroll' }}>\n            <ListItem className=\"handle\">\n              <ListItemText style={{ cursor: 'move' }} primary='Component Properties' secondary={properties.NAME} />\n            </ListItem>\n            {\n              Object.keys(properties).map((keyName, i) => {\n                if (keyName === 'MODEL') {\n                  return <ListItem key={i}>\n                    <TextareaAutosize rowsMax={4} id={keyName} label={keyName} value={val[keyName] || ''} rowsMin={4} aria-label={keyName} onChange={getInputValues} placeholder={keyName} style={{ width: '100%' }} />\n                  </ListItem>\n                  // eslint-disable-next-line brace-style\n                }\n                else if (keyName === 'EXTRA_EXPRESSION') {\n                  return <ListItem key={i}>\n                    <TextareaAutosize rowsMax={4} id={keyName} label={keyName} value={val[keyName] || ''} rowsMin={4} aria-label={keyName} onChange={getInputValues} placeholder={'EXPRESSION'} style={{ width: '100%' }} />\n                  </ListItem>\n                }\n                else if (keyName.charAt(0) === 'N' && keyName !== 'NAME') {\n                  return <span key={i} />\n                } else if (keyName.includes('UNIT')) {\n                  return <span key={i} />\n                }\n                else if (keyName === 'PREFIX') {\n                  return (\n                    <ListItem key={i}>\n                      <TextField id={keyName} label='LABEL' value={val[keyName] || ''} size='small' variant=\"outlined\" onChange={getInputValues} />\n                    </ListItem>)\n                }\n                else if (keyName === 'NAME') {\n                  return (\n                    <ListItem key={i}>\n                      <TextField disabled id={keyName} label='COMPONENT NAME' value={val[keyName] || ''} size='small' variant=\"outlined\" onChange={getInputValues} />\n                    </ListItem>)\n                }\n                return (\n                  <ListItem key={i}>\n                    <TextField id={keyName} label={keyName} value={val[keyName] || ''} size='small' variant=\"outlined\" onChange={getInputValues} />\n                    {val[`${keyName}_UNIT`] && <span style={{ marginLeft: '10px' }}>{val[`${keyName}_UNIT`] || ''}</span>}\n                  </ListItem>)\n              })\n            }\n            <ListItem>\n              <Button size='small' variant=\"contained\" color=\"primary\" onClick={setProps}>SET PARAMETERS</Button>\n            </ListItem>\n          </List>\n        </Paper>\n      </Draggable>\n    </div>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/ComponentSidebar.js",
    "content": "import React, { useEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport api from '../../utils/Api'\nimport {\n  Hidden,\n  List,\n  ListItem,\n  Collapse,\n  ListItemIcon,\n  IconButton,\n  Tooltip,\n  TextField,\n  InputAdornment,\n  Divider\n\n} from '@material-ui/core'\nimport Loader from 'react-loader-spinner'\nimport SearchIcon from '@material-ui/icons/Search'\n\nimport { makeStyles } from '@material-ui/core/styles'\nimport ExpandLess from '@material-ui/icons/ExpandLess'\nimport ExpandMore from '@material-ui/icons/ExpandMore'\nimport CloseIcon from '@material-ui/icons/Close'\n\nimport './Helper/SchematicEditor.css'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { fetchLibraries, toggleCollapse, fetchComponents, toggleSimulate } from '../../redux/actions/index'\nimport SideComp from './SideComp.js'\nimport SimulationProperties from './SimulationProperties'\nconst COMPONENTS_PER_ROW = 3\n\nconst useStyles = makeStyles((theme) => ({\n  toolbar: {\n    minHeight: '90px'\n  },\n  nested: {\n    paddingLeft: theme.spacing(2),\n    width: '100%'\n  },\n  head: {\n    marginRight: 'auto'\n  }\n}))\n\nconst searchOptions = {\n  NAME: 'name__icontains',\n  KEYWORD: 'keyword__icontains',\n  DESCRIPTION: 'description__icontains',\n  COMPONENT_LIBRARY: 'component_library__library_name__icontains',\n  PREFIX: 'symbol_prefix'\n}\n\n// var tempSearchTxt = ''\n\nconst searchOptionsList = ['NAME', 'KEYWORD', 'DESCRIPTION', 'COMPONENT_LIBRARY', 'PREFIX']\n\nexport default function ComponentSidebar ({ compRef, ltiSimResult, setLtiSimResult }) {\n  const classes = useStyles()\n  const libraries = useSelector(state => state.schematicEditorReducer.libraries)\n  const collapse = useSelector(state => state.schematicEditorReducer.collapse)\n  const components = useSelector(state => state.schematicEditorReducer.components)\n  const isSimulate = useSelector(state => state.schematicEditorReducer.isSimulate)\n  const auth = useSelector(state => state.authReducer)\n\n  const dispatch = useDispatch()\n  const [isSearchedResultsEmpty, setIssearchedResultsEmpty] = useState(false)\n  const [searchText, setSearchText] = useState('')\n  const [loading, setLoading] = useState(false)\n  const [favourite, setFavourite] = useState(null)\n  const [favOpen, setFavOpen] = useState(false)\n\n  const [searchedComponentList, setSearchedComponents] = useState([])\n  const [searchOption, setSearchOption] = useState('NAME')\n  const [uploaded, setuploaded] = useState(false)\n  const [def, setdef] = useState(false)\n  const [additional, setadditional] = useState(false)\n\n  // const searchedComponentList = React.useRef([])\n\n  const timeoutId = React.useRef()\n\n  const handleSearchOptionType = (evt) => {\n    setSearchedComponents([])\n    setSearchOption(evt.target.value)\n  }\n\n  const handleSearchText = (evt) => {\n    // tempSearchTxt = evt.target.value\n    if (searchText.length === 0) {\n      setSearchedComponents([])\n    }\n    setSearchText(evt.target.value)\n    setSearchedComponents([])\n    // mimic the value so we can access the latest value in our API call.\n\n    // call api from here. and set the result to searchedComponentList.\n  }\n\n  React.useEffect(() => {\n    if (auth.isAuthenticated) {\n      const token = localStorage.getItem('esim_token')\n      const config = {\n        headers: {\n          'Content-Type': 'application/json'\n        }\n      }\n      if (token) {\n        config.headers.Authorization = `Token ${token}`\n      }\n      api\n        .get('favouritecomponents', config)\n        .then((resp) => {\n          setFavourite(resp.data.component)\n        })\n        .catch((err) => {\n          console.log(err)\n        })\n    }\n  }, [auth])\n\n  React.useEffect(() => {\n    // if the user keeps typing, stop the API call!\n    clearTimeout(timeoutId.current)\n    // don't make an API call with no data\n    if (!searchText.trim()) return\n    // capture the timeoutId so we can\n    // stop the call if the user keeps typing\n    timeoutId.current = setTimeout(() => {\n      // call api here\n      setLoading(true)\n      let config = {}\n      const token = localStorage.getItem('esim_token')\n      if (token && token !== undefined) {\n        config = {\n          headers: {\n            Authorization: `Token ${token}`\n          }\n        }\n      }\n      api.get(`components/?${searchOptions[searchOption]}=${searchText}`, config)\n        .then(\n          (res) => {\n            if (res.data.length === 0) {\n              setIssearchedResultsEmpty(true)\n            } else {\n              setIssearchedResultsEmpty(false)\n              setSearchedComponents([...res.data])\n            }\n          }\n        )\n        .catch((err) => { console.error(err) })\n      setLoading(false)\n    }, 800)\n  }, [searchText, searchOption])\n\n  const handleCollapse = (id) => {\n    // Fetches Components for given library if not already fetched\n    if (collapse[id] === false && components[id].length === 0) {\n      dispatch(fetchComponents(id))\n    }\n\n    // Updates state of collapse to show/hide dropdown\n    dispatch(toggleCollapse(id))\n  }\n\n  // For Fetching Libraries\n  useEffect(() => {\n    dispatch(fetchLibraries())\n  }, [dispatch])\n\n  useEffect(() => {\n    if (libraries.filter((ob) => { return ob.default === true }).length !== 0) { setdef(true) } else { setdef(false) }\n    if (libraries.filter((ob) => { return ob.additional === true }).length !== 0) { setadditional(true) } else { setadditional(false) }\n    if (libraries.filter((ob) => { return (!ob.additional && !ob.default) }).length !== 0) { setuploaded(true) } else { setuploaded(false) }\n  }, [libraries])\n\n  // Used to chunk array\n  const chunk = (array, size) => {\n    return array.reduce((chunks, item, i) => {\n      if (i % size === 0) {\n        chunks.push([item])\n      } else {\n        chunks[chunks.length - 1].push(item)\n      }\n      return chunks\n    }, [])\n  }\n\n  const libraryDropDown = (library) => {\n    return (\n      <div key={library.id}>\n        <ListItem onClick={(e, id = library.id) => handleCollapse(id)} button divider>\n          <span className={classes.head}>{library.library_name.slice(0, -4)}</span>\n          {collapse[library.id] ? <ExpandLess /> : <ExpandMore />}\n        </ListItem>\n        <Collapse in={collapse[library.id]} timeout={'auto'} unmountOnExit mountOnEnter exit={false}>\n          <List component=\"div\" disablePadding dense >\n            {/* Chunked Components of Library */}\n            {chunk(components[library.id], COMPONENTS_PER_ROW).map((componentChunk) => {\n              return (\n                <ListItem key={componentChunk[0].svg_path} divider>\n                  {componentChunk.map((component) => {\n                    return (\n                      <ListItemIcon key={component.full_name}>\n                        <SideComp component={component} setFavourite={setFavourite} favourite={favourite} />\n                      </ListItemIcon>\n                    )\n                  })}\n                </ListItem>\n              )\n            })}\n          </List>\n        </Collapse>\n      </div>\n    )\n  }\n\n  const handleFavOpen = () => {\n    setFavOpen(!favOpen)\n  }\n\n  return (\n    <>\n      <Hidden smDown>\n        <div className={classes.toolbar} />\n      </Hidden>\n\n      <div style={isSimulate ? { display: 'none' } : {}}>\n        {/* Display List of categorized components */}\n        <List>\n          <ListItem button>\n            <h2 style={{ margin: '5px' }}>Components List</h2>\n          </ListItem>\n          <ListItem>\n\n            <TextField\n              id=\"standard-number\"\n              placeholder=\"Search Component\"\n              variant=\"outlined\"\n              size=\"small\"\n              value={searchText}\n              onChange={handleSearchText}\n              InputProps={{\n                startAdornment: (\n                  <InputAdornment position=\"start\">\n                    <SearchIcon />\n                  </InputAdornment>\n                )\n              }}\n            />\n\n          </ListItem>\n\n          <ListItem divider>\n            <TextField\n              style={{ width: '100%' }}\n              id=\"searchType\"\n              size='small'\n              variant=\"outlined\"\n              select\n              label=\"Search By\"\n              value={searchOption}\n              onChange={handleSearchOptionType}\n              SelectProps={{\n                native: true\n              }}\n            >\n\n              {\n                searchOptionsList.map((value, i) => {\n                  return (<option key={i} value={value}>\n                    {value}\n                  </option>)\n                })\n              }\n\n            </TextField>\n          </ListItem>\n          <div style={{ maxHeight: '70vh', overflowY: 'auto', overflowX: 'hidden' }} >\n            {searchText.length !== 0 && searchedComponentList.length !== 0 &&\n\n              searchedComponentList.map((component, i) => {\n                return (<ListItemIcon key={i}>\n                  <SideComp component={component} />\n                </ListItemIcon>)\n              }\n              )\n\n            }\n\n            <ListItem>\n\n              <Loader\n                type=\"TailSpin\"\n                color=\"#F44336\"\n                height={100}\n                width={100}\n                visible={loading}\n              />\n            </ListItem>\n\n            {!loading && searchText.length !== 0 && isSearchedResultsEmpty &&\n\n              <span style={{ margin: '20px' }}>No Components Found</span>\n\n            }\n\n            {/* Collapsing List Mapped by Libraries fetched by the API */}\n            {favourite && favourite.length > 0 &&\n              <>\n                <ListItem button onClick={handleFavOpen} divider>\n                  <span className={classes.head}>Favourite Components</span>\n                  <div>\n                    {favOpen ? <ExpandLess /> : <ExpandMore />}\n                  </div>\n                </ListItem>\n                <Collapse in={favOpen} timeout=\"auto\" unmountOnExit>\n                  <List component=\"div\" disablePadding>\n                    <ListItem>\n                      <div style={{ marginLeft: '-30px' }}>\n                        {chunk(favourite, 3).map((componentChunk) => {\n                          return (\n                            <div key={componentChunk[0].svg_path}>\n                              <ListItem key={componentChunk[0].svg_path} divider>\n                                {\n                                  componentChunk.map((component) => {\n                                    return (\n                                      <ListItemIcon key={component.full_name}>\n                                        <SideComp isFavourite={true} favourite={favourite} setFavourite={setFavourite} component={component} />\n                                      </ListItemIcon>\n                                    )\n                                  }\n                                  )\n                                }\n                              </ListItem>\n                            </div>\n                          )\n                        })}\n                      </div>\n                    </ListItem>\n                  </List>\n                </Collapse>\n              </>\n            }\n            {searchText.length === 0 &&\n            <>\n              <div style={!def ? { display: 'none' } : {}}>\n                <Divider />\n                <ListItem dense divider style={{ backgroundColor: '#e8e8e8' }}>\n                  <span>DEFAULT</span>\n                </ListItem>\n                <Divider />\n                { libraries.sort(function (a, b) {\n                  const textA = a.library_name.toUpperCase()\n                  const textB = b.library_name.toUpperCase()\n                  return (textA < textB) ? -1 : (textA > textB) ? 1 : 0\n                }).filter((library) => {\n                  if (library.default) { return 1 }\n                  return 0\n                }).map(\n                  (library) => {\n                    return (libraryDropDown(library))\n                  }\n                )}\n              </div>\n              <div style={!additional ? { display: 'none' } : {}}>\n                <ListItem dense divider style={{ backgroundColor: '#e8e8e8' }}>\n                  <span className={classes.head}>ADDITIONAL</span>\n                </ListItem>\n                { libraries.sort(function (a, b) {\n                  const textA = a.library_name.toUpperCase()\n                  const textB = b.library_name.toUpperCase()\n                  return (textA < textB) ? -1 : (textA > textB) ? 1 : 0\n                }).filter((library) => {\n                  if (library.additional) { return 1 }\n                  return 0\n                }).map(\n                  (library) => {\n                    return (libraryDropDown(library))\n                  }\n                )}\n              </div>\n              <div style={!uploaded ? { display: 'none' } : {}}>\n                <ListItem dense divider style={{ backgroundColor: '#e8e8e8' }}>\n                  <span className={classes.head}>UPLOADED</span>\n                </ListItem>\n                { libraries.sort(function (a, b) {\n                  const textA = a.library_name.toUpperCase()\n                  const textB = b.library_name.toUpperCase()\n                  return (textA < textB) ? -1 : (textA > textB) ? 1 : 0\n                }).filter((library) => {\n                  if (!library.default && !library.additional) { return 1 }\n                  return 0\n                }).map(\n                  (library) => {\n                    return (libraryDropDown(library))\n                  }\n                )}\n              </div>\n            </>\n            }\n          </div>\n        </List>\n      </div>\n      <div style={isSimulate ? {} : { display: 'none' }}>\n        {/* Display simulation modes parameters on left side pane */}\n        <List>\n          <ListItem button divider>\n            <h2 style={{ margin: '5px auto 5px 5px' }}>Simulation Modes</h2>\n            <Tooltip title=\"close\">\n              <IconButton color=\"inherit\" className={classes.tools} size=\"small\" onClick={() => { dispatch(toggleSimulate()) }}>\n                <CloseIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n          </ListItem>\n          <SimulationProperties ltiSimResult={ltiSimResult} setLtiSimResult={setLtiSimResult} />\n        </List>\n      </div>\n    </>\n  )\n}\n\nComponentSidebar.propTypes = {\n  compRef: PropTypes.object.isRequired,\n  ltiSimResult: PropTypes.string,\n  setLtiSimResult: PropTypes.string\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/Header.js",
    "content": "import React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { useHistory, Link as RouterLink } from 'react-router-dom'\nimport {\n  Toolbar,\n  Typography,\n  IconButton,\n  Button,\n  Input,\n  Hidden,\n  Link,\n  Avatar,\n  Menu,\n  Fade,\n  MenuItem,\n  ListItemText,\n  Dialog,\n  DialogTitle,\n  DialogContent,\n  DialogActions,\n  DialogContentText,\n  FormControlLabel,\n  Switch,\n  Snackbar\n} from '@material-ui/core'\nimport { useSelector, useDispatch } from 'react-redux'\nimport ShareIcon from '@material-ui/icons/Share'\nimport CloseIcon from '@material-ui/icons/Close'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { deepPurple } from '@material-ui/core/colors'\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline'\nimport * as actions from '../../redux/actions/actions'\nimport logo from '../../static/logo.png'\nimport { setTitle, logout, setSchTitle, setSchShared, loadMinUser, setSchDescription } from '../../redux/actions/index'\nimport { HomeDialog } from './ToolbarExtension'\nimport queryString from 'query-string'\n\nconst useStyles = makeStyles((theme) => ({\n  toolbarTitle: {\n    marginRight: theme.spacing(2)\n  },\n  input: {\n    marginLeft: theme.spacing(1),\n    width: '200px',\n    color: '#595959'\n  },\n  rightBlock: {\n    marginLeft: 'auto',\n    marginRight: theme.spacing(2)\n  },\n  button: {\n    marginRight: theme.spacing(0.7)\n  },\n  small: {\n    width: theme.spacing(3.7),\n    height: theme.spacing(3.7)\n  },\n  tools: {\n    padding: theme.spacing(1),\n    margin: theme.spacing(0, 0.8),\n    color: '#262626'\n  },\n  purple: {\n    width: theme.spacing(3.75),\n    height: theme.spacing(3.75),\n    color: theme.palette.getContrastText(deepPurple[500]),\n    backgroundColor: deepPurple[500],\n    fontSize: '17px'\n  },\n  backDrop: {\n    backdropFilter: 'blur(10px)'\n  }\n}))\n\n// Notification snackbar to give alert messages\nfunction SimpleSnackbar ({ open, close, message }) {\n  return (\n    <div>\n      <Snackbar\n        anchorOrigin={{\n          vertical: 'bottom',\n          horizontal: 'left'\n        }}\n        open={open}\n        autoHideDuration={6000}\n        onClose={close}\n        message={message}\n        action={\n          <React.Fragment>\n            <IconButton size=\"small\" aria-label=\"close\" color=\"inherit\" onClick={close}>\n              <CloseIcon fontSize=\"small\" />\n            </IconButton>\n          </React.Fragment>\n        }\n      />\n    </div>\n  )\n}\n\nSimpleSnackbar.propTypes = {\n  open: PropTypes.bool,\n  close: PropTypes.func,\n  message: PropTypes.string\n}\n\nfunction Header ({ gridRef }) {\n  const history = useHistory()\n  const classes = useStyles()\n  const auth = useSelector(state => state.authReducer)\n  const schSave = useSelector(state => state.saveSchematicReducer)\n  const [anchorEl, setAnchorEl] = React.useState(null)\n  const xyz = gridRef\n  const [loginDialog, setLoginDialog] = React.useState(false)\n  const [logoutConfirm, setLogoutConfirm] = React.useState(false)\n  const [reloginMessage, setReloginMessage] = React.useState('')\n\n  const [ltiId, setLtiId] = React.useState(null)\n  const [ltiNonce, setLtiNonce] = React.useState(null)\n\n  const dispatch = useDispatch()\n\n  const handleClick = (event) => {\n    setAnchorEl(event.currentTarget)\n  }\n\n  // Checks for localStore changess\n  useEffect(() => {\n    function checkUserData () {\n      const userToken = localStorage.getItem('esim_token')\n      if (userToken && userToken !== '') {\n        // esim_token was added by another tab\n        const newUser = parseInt(localStorage.getItem('user_id'))\n        if (auth.isAuthenticated === null) {\n          dispatch(loadMinUser())\n        } else if (auth.user && auth.user.id === newUser) {\n          dispatch(loadMinUser())\n          setLoginDialog(false)\n        } else {\n          setReloginMessage('You are logged in but the circuit belongs to a different user! Login again with the same credentials')\n        }\n      } else {\n        /* User logged out and esim_token removed from localstore\n        But redux store still has it */\n        if (auth.token && auth.token !== '') {\n          if (!loginDialog) {\n            setReloginMessage('You have been logged out of your account. Login again')\n            setLoginDialog(true)\n          }\n        }\n      }\n    }\n\n    window.addEventListener('storage', checkUserData)\n\n    return () => {\n      window.removeEventListener('storage', checkUserData)\n    }\n  })\n\n  useEffect(() => {\n    var url = queryString.parse(window.location.href.split('editor')[1])\n    if (url.lti_id) {\n      setLtiId(url.lti_id)\n    }\n    if (url.lti_nonce) {\n      setLtiNonce(url.lti_nonce)\n    }\n  }, [])\n\n  const handleClose = () => {\n    setAnchorEl(null)\n  }\n\n  const titleHandler = (e) => {\n    dispatch(setTitle(`* ${e.target.value}`))\n    dispatch(setSchTitle(`${e.target.value}`))\n  }\n\n  // handle notification snackbar open and close with message\n  const [snacOpen, setSnacOpen] = React.useState(false)\n  const [message, setMessage] = React.useState('')\n\n  const handleSnacClick = () => {\n    setSnacOpen(true)\n  }\n\n  const handleSnacClose = (event, reason) => {\n    if (reason === 'clickaway') {\n      return\n    }\n    setSnacOpen(false)\n  }\n\n  // handle schematic Share Dialog box\n  const [openShare, setShareOpen] = React.useState(false)\n\n  const handleShareOpen = () => {\n    setShareOpen(true)\n  }\n\n  const handleShareClose = () => {\n    setShareOpen(false)\n  }\n\n  // handle home dialog box\n  const [homeopen, setHomeOpen] = React.useState(false)\n  const [routeVal, setRouteVal] = React.useState(undefined)\n\n  const handleHomeOpen = (e) => {\n    e.preventDefault()\n\n    setRouteVal(e.target.attributes.value.value)\n    setHomeOpen(true)\n  }\n\n  const handleHomeClose = () => {\n    console.log(homeopen)\n    setHomeOpen(false)\n  }\n\n  // change saved schematic share status\n  const [shared, setShared] = React.useState(schSave.isShared)\n\n  useEffect(() => {\n    setShared(schSave.isShared)\n  }, [schSave.isShared])\n\n  useEffect(() => {\n    if (history.location.search === '') {\n      dispatch(setSchTitle('Untitled_Schematic'))\n      dispatch(setSchDescription(''))\n      dispatch({ type: actions.CLEAR_DETAILS })\n    }\n  }, [history.location.search, dispatch])\n\n  const handleShareChange = (event) => {\n    setShared(event.target.checked)\n    dispatch(setSchShared(event.target.checked))\n  }\n\n  const handleShare = () => {\n    if (auth.isAuthenticated !== true) {\n      setMessage('You are not Logged In')\n      handleSnacClick()\n    } else if (schSave.isSaved !== true) {\n      setMessage('You have not saved the circuit')\n      handleSnacClick()\n    } else {\n      handleShareOpen()\n    }\n  }\n\n  // handle display format of last saved status\n  function getDate (jsonDate) {\n    const json = jsonDate\n    const date = new Date(json)\n    const dateTimeFormat = new Intl.DateTimeFormat('en', { month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' })\n    const [{ value: month }, , { value: day }, , { value: hour }, , { value: minute }, , { value: second }] = dateTimeFormat.formatToParts(date)\n    return `${day} ${month} ${hour}:${minute}:${second}`\n  }\n\n  // handle Copy Share Url\n  const textAreaRef = React.useRef(null)\n\n  function copyToClipboard (e) {\n    textAreaRef.current.select()\n    document.execCommand('copy')\n    e.target.focus()\n    setMessage('Copied Successfully!')\n    handleSnacClick()\n  }\n\n  return (\n    <>\n      <Dialog\n        open={loginDialog}\n        BackdropProps={{\n          classes: {\n            root: classes.backDrop\n          }\n        }}\n        maxWidth='xs'\n        disableEscapeKeyDown\n        disableBackdropClick\n      >\n        <DialogTitle id=\"alert-dialog-title\" style={{ textAlign: 'center' }}>\n          <ErrorOutlineIcon style={{ color: 'red' }} fontSize=\"large\" /><br />\n          <Typography variant='h5' align='center'>\n            {'Login to continue working on the circuit'}\n          </Typography>\n        </DialogTitle>\n        <DialogContent>\n          <DialogContentText id=\"alert-dialog-description\">\n            <Typography variant='p'>\n              {reloginMessage}\n              {' to continue working on the circuit, otherwise all unsaved changes will be lost.'}\n            </Typography>\n          </DialogContentText>\n        </DialogContent>\n        <DialogActions>\n          <Button\n            onClick={() => { window.location.reload() }}\n            color=\"secondary\"\n          >\n            Start New Circuit\n          </Button>\n          <Button\n            component={RouterLink}\n            to=\"/login?close=close&logout=logout\"\n            color=\"primary\"\n            target=\"_blank\"\n          >\n            Login\n          </Button>\n        </DialogActions>\n      </Dialog>\n\n      <Dialog\n        open={logoutConfirm}\n        onClose={() => { setLogoutConfirm(false) }}\n      >\n        <DialogTitle id=\"alert-dialog-title\" style={{ textAlign: 'center' }}>\n          <ErrorOutlineIcon style={{ color: 'red' }} fontSize=\"large\" /><br />\n          <Typography variant='h5' align='center'>\n            {'Are you sure you want to logout?'}\n          </Typography>\n        </DialogTitle>\n        <DialogContent>\n          <DialogContentText id=\"alert-dialog-description\">\n            You will lose all unsaved changes if you logout now.\n          </DialogContentText>\n        </DialogContent>\n        <DialogActions>\n          <Button onClick={() => { setLogoutConfirm(false) }} color=\"secondary\">\n            Cancel\n          </Button>\n          <Button\n            style={{ color: '#ff1744' }}\n            onClick={() => {\n              dispatch(logout(history))\n            }}\n          >\n            Logout\n          </Button>\n        </DialogActions>\n      </Dialog>\n\n      <Toolbar variant=\"dense\" color=\"default\">\n        <SimpleSnackbar open={snacOpen} close={handleSnacClose} message={message} />\n\n        {/* Display logo */}\n        <IconButton edge=\"start\" className={classes.button} color=\"primary\">\n          <Avatar alt=\"esim logo\" src={logo} className={classes.small} />\n        </IconButton>\n        <Typography\n          variant=\"h6\"\n          color=\"inherit\"\n          noWrap\n          className={classes.toolbarTitle}\n        >\n          <Link color=\"inherit\" target='_blank' component={RouterLink} to=\"/\">\n            eSim\n          </Link>\n        </Typography>\n\n        {/* Input field for schematic title */}\n        <Hidden xsDown>\n          <Input\n            className={classes.input}\n            color=\"secondary\"\n            value={schSave.title === 'Untitled_Schematic' ? 'Untitled_Schematic' : schSave.title}\n            onChange={titleHandler}\n            inputProps={{ 'aria-label': 'SchematicTitle' }}\n          />\n        </Hidden>\n\n        {/* Display last saved and shared option for saved schematics */}\n        {(!ltiId || !ltiNonce) && auth.isAuthenticated === true\n          ? <>\n            {(schSave.isSaved === true && schSave.details.save_time !== undefined)\n              ? <Typography\n                variant=\"body2\"\n                style={{ margin: '0px 15px 0px auto', paddingTop: '5px', color: '#8c8c8c' }}\n              >\n                Last Saved : {getDate(schSave.details.save_time)} {/* Display last saved status for saved schematics */}\n              </Typography>\n              : <></>\n            }\n            <Button\n              size=\"small\"\n              variant={shared !== true ? 'outlined' : 'contained'}\n              color=\"primary\"\n              className={schSave.isSaved === true && schSave.details.save_time !== undefined ? classes.button : classes.rightBlock}\n              startIcon={<ShareIcon />}\n              onClick={handleShare}\n            >\n              <Hidden xsDown>Share</Hidden>\n            </Button>\n          </>\n          : <></>\n        }\n\n        {/* Share dialog box to get share url */}\n        <Dialog\n          open={openShare}\n          onClose={handleShareClose}\n          aria-labelledby=\"share-dialog-title\"\n          aria-describedby=\"share-dialog-description\"\n        >\n          <DialogTitle id=\"share-dialog-title\">{'Share Your Schematic'}</DialogTitle>\n          <DialogContent>\n            <DialogContentText id=\"share-dialog-description\">\n              <FormControlLabel\n                control={<Switch checked={shared} onChange={handleShareChange} name=\"shared\" />}\n                label=\": Sharing On\"\n              />\n            </DialogContentText>\n            <DialogContentText id=\"share-dialog-description\">\n              {shared === true\n                ? <input\n                  ref={textAreaRef}\n                  value={`${window.location.protocol}\\\\\\\\${window.location.host}/eda/#/editor?id=${schSave.details.save_id}`}\n                  readOnly\n                />\n                : <> Turn On sharing </>\n              }\n            </DialogContentText>\n\n          </DialogContent>\n          <DialogActions>\n            {shared === true && document.queryCommandSupported('copy')\n              ? <Button onClick={copyToClipboard} color=\"primary\" autoFocus>\n                Copy url\n              </Button>\n              : <></>\n            }\n            <Button onClick={handleShareClose} color=\"primary\" autoFocus>\n              close\n            </Button>\n          </DialogActions>\n        </Dialog>\n\n        {/* Display login option or user menu as per authenticated status */}\n        {(!ltiId || !ltiNonce) &&\n          (!auth.isAuthenticated\n            ? <>\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                onClick={handleHomeOpen}\n                component={RouterLink}\n                className={classes.link}\n                style={{ marginLeft: '61%', marginRight: '20px' }}\n                value=\"home\"\n              >\n                Home\n              </Link>\n\n              {gridRef && routeVal &&\n                <HomeDialog open={homeopen} gridRef={xyz} routeVal={routeVal} schSave={schSave} onClose={handleHomeClose} />\n              }\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                to=\"/editor\"\n                component={RouterLink}\n                style={{ marginRight: '20px' }}\n              >\n                Editor\n              </Link>\n\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                // to=\"/gallery\"\n                onClick={handleHomeOpen}\n                component={RouterLink}\n                value=\"gallery\"\n                style={{ marginRight: '20px' }}\n\n              >\n                Gallery\n              </Link>\n\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                onClick={handleHomeOpen}\n                component={RouterLink}\n                value=\"simulator/ngspice\"\n                style={{ marginRight: '20px' }}\n\n              >\n                Simulator\n              </Link>\n              <Button\n                size=\"small\"\n                component={RouterLink}\n                to=\"/login?close=close\"\n                style={{ marginLeft: 'auto' }}\n                color=\"primary\"\n                variant=\"outlined\"\n                target=\"_blank\"\n              >\n                Login\n              </Button>\n            </>\n            : (<>\n\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                onClick={handleHomeOpen}\n                component={RouterLink}\n                className={classes.link}\n                value=\"home\"\n                style={{ marginRight: '20px' }}\n              >\n                Home\n              </Link>\n              { gridRef && routeVal &&\n                <HomeDialog open={homeopen} gridRef={xyz} routeVal={routeVal} schSave={schSave} onClose={handleHomeClose} />\n              }\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                to=\"/editor\"\n                component={RouterLink}\n                style={{ marginRight: '20px' }}\n              >\n                Editor\n              </Link>\n\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                // to=\"/gallery\"\n                value= \"gallery\"\n                onClick={handleHomeOpen}\n                component={RouterLink}\n                style={{ marginRight: '20px' }}\n\n              >\n                Gallery\n              </Link>\n\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                onClick={handleHomeOpen}\n                component={RouterLink}\n                value=\"simulator/ngspice\"\n                style={{ marginRight: '20px' }}\n\n              >\n                Simulator\n              </Link>\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                onClick={handleHomeOpen}\n                value=\"dashboard\"\n                component={RouterLink}\n                style={{ marginRight: '20px' }}\n              >\n                Dashboard\n              </Link>\n\n              <IconButton\n                edge=\"start\"\n                color=\"primary\"\n                aria-controls=\"simple-menu\"\n                aria-haspopup=\"true\"\n                onClick={handleClick}\n                style={{ marginRight: '20px' }}\n              >\n                <Avatar className={classes.purple}>\n                  {auth.user.username.charAt(0).toUpperCase()}\n                </Avatar>\n              </IconButton>\n              <Menu\n                id=\"simple-menu\"\n                anchorEl={anchorEl}\n                keepMounted\n                open={Boolean(anchorEl)}\n                onClose={handleClose}\n                TransitionComponent={Fade}\n                style={{ marginTop: '25px' }}\n              >\n                <MenuItem\n                  target='_blank'\n                  component={RouterLink}\n                  to=\"/dashboard\"\n                  onClick={handleClose}\n                >\n                  <ListItemText primary={auth.user.username} secondary={auth.user.email} />\n                </MenuItem>\n                <MenuItem\n                  target='_blank'\n                  component={RouterLink}\n                  to=\"/dashboard/profile\"\n                  onClick={handleClose}\n                >\n                  My Profile\n                </MenuItem>\n                <MenuItem\n                  target='_blank'\n                  component={RouterLink}\n                  to=\"/dashboard/schematics\"\n                  onClick={handleClose}\n                >\n                  My Schematics\n                </MenuItem>\n                <MenuItem\n                  target='_blank'\n                  component={RouterLink}\n                  to=\"/account/change_password\"\n                  onClick={handleClose}\n                >\n                  Change password\n                </MenuItem>\n                <MenuItem onClick={() => {\n                  setLogoutConfirm(true)\n                }}>\n                  Logout\n                </MenuItem>\n              </Menu>\n            </>\n            )\n          )\n        }\n        {ltiId && ltiNonce && <Typography\n          variant=\"h6\"\n          color=\"inherit\"\n          noWrap\n          className={classes.toolbarTitle}\n          style={{ marginLeft: 'auto', color: 'red' }}\n        >\n          Assignment\n        </Typography>}\n      </Toolbar>\n    </>\n  )\n}\n\nHeader.propTypes = {\n  gridRef: PropTypes.object.isRequired\n}\n\nexport default Header\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/Helper/ComponentDrag.js",
    "content": "/* eslint-disable no-inner-declarations */\n/* eslint-disable no-new */\n/* eslint-disable new-cap */\n/* eslint-disable */\nimport mxGraphFactory from 'mxgraph'\nimport * as actions from '../../../redux/actions/actions'\nimport store from '../../../redux/store'\nimport dot from '../../../static/dot.gif'\n\n// import ClipBoardFunct from './ClipBoard.js'\n// import NetlistInfoFunct from './NetlistInfo.js'\nimport ToolbarTools from './ToolbarTools.js'\nimport KeyboardShorcuts from './KeyboardShorcuts.js'\nimport { SideBar } from './SideBar.js'\nimport KiCadFileUtils from './KiCadFileUtils'\n\nvar graph\n\nconst {\n  mxGraph,\n  mxRubberband,\n  mxClient,\n  mxUtils,\n  mxEvent,\n  mxOutline,\n  mxCell,\n  mxPoint,\n  mxGraphView,\n  mxCellEditor,\n  mxEdgeHandler,\n  mxConnectionConstraint,\n  mxEdgeSegmentHandler,\n  mxCellHighlight,\n  mxEdgeStyle,\n  mxStyleRegistry,\n  mxConnectionHandler,\n  mxConstants,\n  mxGraphHandler,\n  mxCylinder,\n  mxCellRenderer,\n  mxCodec,\n  mxEditor,\n  mxEditorUI,\n  mxConstraintHandler,\n  mxImage\n} = new mxGraphFactory()\n\nexport default function LoadGrid (container, sidebar, outline) {\n  // Checks if the browser is supported\n  if (!mxClient.isBrowserSupported()) {\n    // Displays an error message if the browser is not supported.\n    mxUtils.error('Browser is not supported!', 200, false)\n  } else {\n    // Disables the built-in context men\n    mxEvent.disableContextMenu(container)\n    // Tells if the cell is a component or a pin or a wire\n    mxCell.prototype.CellType = 'This is where you say what the vertex is'\n    // Tells the magnitude of a resistor/capacitor\n    mxCell.prototype.Magnitude = null\n    // Tells whether the pin is input/output\n    mxCell.prototype.pinType = ' '\n    // Tells if the cell is component, Default is false\n    mxCell.prototype.Component = false\n    // Tells if the cell is pin, Default is false\n    mxCell.prototype.Pin = false\n    // Pin number of the component, default is 0\n    mxCell.prototype.PinNumber = 0\n    // Parent component of a pin, default is null\n    mxCell.prototype.ParentComponent = null\n    mxCell.prototype.symbol = null\n    mxCell.prototype.node = null\n    mxCell.prototype.PinName = ''\n    mxCell.prototype.CompObject = null\n    mxCell.prototype.properties = {}\n    mxCell.prototype.sourceVertex = false\n    mxCell.prototype.targetVertex = false\n    mxCell.prototype.tarx = 0\n    mxCell.prototype.tary = 0\n    mxCell.prototype.PointsArray = null\n    // mxCell.prototype.ConnectedNode = null\n\n    // Enables guides\n    mxGraphHandler.prototype.guidesEnabled = true\n    mxEdgeHandler.prototype.snapToTerminals = true\n\n    // Enable cell Rotation\n    // mxVertexHandler.prototype.rotationEnabled = true\n\n    // Creates the graph inside the given container\n    graph = new mxGraph(container)\n   \n\n    mxConnectionHandler.prototype.movePreviewAway = false\n    mxConnectionHandler.prototype.waypointsEnabled = true\n    mxGraph.prototype.resetEdgesOnConnect = false\n    mxConstants.SHADOWCOLOR = '#C0C0C0'\n    var joinNodeSize = 7\n    var strokeWidth = 2\n\n    // Replaces the port image\n    mxConstraintHandler.prototype.pointImage = new mxImage(dot, 10, 10)\n\n    // Enables rubberband selection\n    new mxRubberband(graph)\n    if(outline !== null)\n    {\n      var outln = new mxOutline(graph, outline)\n      // To show the images in the outline, uncomment the following code\n      outln.outline.labelsVisible = true\n      outln.outline.setHtmlLabels(true)\n  \n  \n      graph.view.scale = 1\n      graph.setPanning(true)\n      graph.setConnectable(true)\n      graph.setConnectableEdges(true)\n      graph.setDisconnectOnMove(false)\n      graph.foldingEnabled = false\n  \n      // Panning handler consumed right click so this must be\n      // disabled if right click should stop connection handler.\n      graph.panningHandler.isPopupTrigger = function () { return false }\n  \n      // Enables return key to stop editing (use shift-enter for newlines)\n      graph.setEnterStopsCellEditing(true)\n  \n      // Adds rubberband selection\n      new mxRubberband(graph)\n  \n      // Alternative solution for implementing connection points without child cells.\n      // This can be extended as shown in portrefs.html example to allow for per-port\n      // incoming/outgoing direction.\n      graph.getAllConnectionConstraints = function (terminal) {\n        var geo = (terminal != null) ? this.getCellGeometry(terminal.cell) : null\n  \n        if ((geo != null ? !geo.relative : false) && this.getModel().isVertex(terminal.cell) && this.getModel().getChildCount(terminal.cell) === 0) {\n          return [new mxConnectionConstraint(new mxPoint(0, 0.5), false), new mxConnectionConstraint(new mxPoint(1, 0.5), false)]\n        }\n  \n        return null\n      }\n  \n      // Makes sure non-relative cells can only be connected via constraints\n      graph.connectionHandler.isConnectableCell = function (cell) {\n        if (this.graph.getModel().isEdge(cell)) {\n          return true\n        } else {\n          var geo = (cell != null) ? this.graph.getCellGeometry(cell) : null\n  \n          return (geo != null) ? geo.relative : false\n        }\n      }\n      mxEdgeHandler.prototype.isConnectableCell = function (cell) {\n        return graph.connectionHandler.isConnectableCell(cell)\n      }\n  \n      // Adds a special tooltip for edges\n      graph.setTooltips(true)\n  \n      var getTooltipForCell = graph.getTooltipForCell\n      graph.getTooltipForCell = function (cell) {\n        var tip = ''\n  \n        if (cell != null) {\n          var src = this.getModel().getTerminal(cell, true)\n  \n          if (src != null) {\n            tip += this.getTooltipForCell(src) + ' '\n          }\n  \n          var parent = this.getModel().getParent(cell)\n  \n          if (this.getModel().isVertex(parent)) {\n            tip += this.getTooltipForCell(parent) + '.'\n          }\n  \n          tip += getTooltipForCell.apply(this, arguments)\n  \n          var trg = this.getModel().getTerminal(cell, false)\n  \n          if (trg != null) {\n            tip += ' ' + this.getTooltipForCell(trg)\n          }\n        }\n  \n        return tip\n      }\n  \n    }\n    graph.addListener(mxEvent.DOUBLE_CLICK, function (sender, evt) {\n      var cell = evt.getProperty('cell')\n      // mxUtils.alert('Doubleclick: ' + ((cell != null) ? cell.symbol : 'Graph'))\n      if (cell !== undefined && cell.CellType === 'Component') {\n        store.dispatch({\n          type: actions.CLOSE_COMP_PROPERTIES_TEMP\n        })\n        store.dispatch({\n          type: actions.GET_COMP_PROPERTIES,\n          payload: {\n            id: cell.id,\n            compProperties: cell.properties,\n            x: sender.lastEvent.clientX,\n            y: sender.lastEvent.clientY\n          }\n        })\n      } else if (cell !== undefined && cell.CellType === 'This is where you say what the vertex is') {\n        store.dispatch({\n          type: actions.CLOSE_COMP_PROPERTIES\n        })\n      } else if (cell === undefined) {\n        store.dispatch({\n          type: actions.CLOSE_COMP_PROPERTIES\n        })\n      }\n      evt.consume()\n    })\n    // Creates the outline (navigator, overview) for moving\n    // around the graph in the top, right corner of the window.\n    \n    // Switch for black background and bright styles\n    var invert = false\n\n    if (invert) {\n      container.style.backgroundColor = 'black'\n\n      // White in-place editor text color\n      var mxCellEditorStartEditing = mxCellEditor.prototype.startEditing\n      mxCellEditor.prototype.startEditing = function (cell, trigger) {\n        mxCellEditorStartEditing.apply(this, arguments)\n\n        if (this.textarea != null) {\n          this.textarea.style.color = '#FFFFFF'\n        }\n      }\n\n      mxGraphHandler.prototype.previewColor = 'white'\n    }\n\n    var labelBackground = (invert) ? '#000000' : '#FFFFFF'\n    var fontColor = (invert) ? '#FFFFFF' : '#000000'\n    var strokeColor = (invert) ? '#C0C0C0' : '#000000'\n    // var fillColor = (invert) ? 'none' : '#FFFFFF'\n\n    var style = graph.getStylesheet().getDefaultEdgeStyle()\n    delete style.endArrow\n    style.strokeColor = strokeColor\n    style.labelBackgroundColor = labelBackground\n    style.edgeStyle = 'wireEdgeStyle'\n    style.fontColor = fontColor\n    style.fontSize = '9'\n    style.movable = '0'\n    style.strokeWidth = strokeWidth\n    // style['rounded'] = '1';\n\n    // Sets join node size\n    style.startSize = joinNodeSize\n    style.endSize = joinNodeSize\n\n    style = graph.getStylesheet().getDefaultVertexStyle()\n    style.gradientDirection = 'south'\n    // style['gradientColor'] = '#909090';\n    style.strokeColor = strokeColor\n    // style['fillColor'] = '#e0e0e0';\n    style.fillColor = 'none'\n    style.fontColor = fontColor\n    style.fontStyle = '1'\n    style.fontSize = '12'\n    style.resizable = '0'\n    style.rounded = '1'\n    style.strokeWidth = strokeWidth\n\n    // var parent = graph.getDefaultParent()\n    if(sidebar !== null)\n    {\n    }\n    SideBar(graph, sidebar)\n\n    KeyboardShorcuts(graph)\n    //NetlistInfoFunct(graph)\n    ToolbarTools(graph)\n    KiCadFileUtils(graph)\n\n    store.subscribe(() => {\n      var id = store.getState().componentPropertiesReducer.id\n      var props = store.getState().componentPropertiesReducer.compProperties\n      var cellList = graph.getModel().cells\n      var c = cellList[id]\n      if (c !== undefined) {\n        c.properties = props\n      }\n    })\n    var editor = new mxEditor()\n    /* var xml = '<mxGraphModel><root><mxCell id=\"0\" CellType=\"This is where you say what the vertex is\" pinType=\" \" Component=\"0\" Pin=\"0\" PinNumber=\"0\" PinName=\"\"><Object as=\"properties\"/></mxCell><mxCell id=\"1\" CellType=\"This is where you say what the vertex is\" pinType=\" \" Component=\"0\" Pin=\"0\" PinNumber=\"0\" PinName=\"\"><Object as=\"properties\"/></mxCell><mxCell value=\"PRI_LO\" style=\"shape=image;fontColor=blue;image=../kicad-symbols/symbol_svgs/power/PWR-PRI_LO-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\" id=\"2\" vertex=\"1\" connectable=\"0\" Component=\"1\" CellType=\"Component\" symbol=\"PWR\" pinType=\" \" Pin=\"0\" PinNumber=\"0\" PinName=\"\"><mxGeometry x=\"150\" y=\"70\" width=\"24\" height=\"80\" as=\"geometry\"/><Object id=\"46\" name=\"PRI_LO\" svg_path=\"kicad-symbols/symbol_svgs/power/PWR-PRI_LO-1-A.svg\" thumbnail_path=\"kicad-symbols/symbol_svgs/power/PWR-PRI_LO-1-A_thumbnail.svg\" symbol_prefix=\"PWR\" component_library=\"http://localhost/api/libraries/2/\" description=\"Power symbol creates a global label with name &quot;PRI_LO&quot;\" data_link=\"\" full_name=\"PWR-PRI_LO-1-A\" keyword=\"power-flag\" as=\"CompObject\"><Array as=\"alternate_component\"/></Object><Object NAME=\"PRI_LO\" as=\"properties\"/></mxCell><mxCell value=\"1\" style=\"align=right;verticalAlign=bottom;rotation=0\" id=\"3\" vertex=\"1\" Pin=\"1\" pinType=\"Output\" PinNumber=\"1\" CellType=\"This is where you say what the vertex is\" Component=\"0\" PinName=\"\"><mxGeometry x=\"12\" y=\"39\" width=\"0.5\" height=\"0.5\" as=\"geometry\"/><mxCell value=\"PRI_LO\" style=\"shape=image;fontColor=blue;image=../kicad-symbols/symbol_svgs/power/PWR-PRI_LO-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\" id=\"2\" vertex=\"1\" connectable=\"0\" Component=\"1\" CellType=\"Component\" symbol=\"PWR\" pinType=\" \" Pin=\"0\" PinNumber=\"0\" PinName=\"\" as=\"ParentComponent\"><mxGeometry x=\"150\" y=\"70\" width=\"24\" height=\"80\" as=\"geometry\"/><Object id=\"46\" name=\"PRI_LO\" svg_path=\"kicad-symbols/symbol_svgs/power/PWR-PRI_LO-1-A.svg\" thumbnail_path=\"kicad-symbols/symbol_svgs/power/PWR-PRI_LO-1-A_thumbnail.svg\" symbol_prefix=\"PWR\" component_library=\"http://localhost/api/libraries/2/\" description=\"Power symbol creates a global label with name &quot;PRI_LO&quot;\" data_link=\"\" full_name=\"PWR-PRI_LO-1-A\" keyword=\"power-flag\" as=\"CompObject\"><Array as=\"alternate_component\"/></Object><Object NAME=\"PRI_LO\" as=\"properties\"/></mxCell><Object as=\"properties\"/></mxCell></root></mxGraphModel>'\n     var doc = mxUtils.parseXml(xml);\n     var node = doc.documentElement;\n     editor.readGraphModel(node); */\n    graph.getModel().beginUpdate()\n    try {\n       /* var xml = '<mxGraphModel><root><mxCell id=\"0\" CellType=\"This is where you say what the vertex is\" pinType=\" \" Component=\"0\" Pin=\"0\" PinNumber=\"0\" PinName=\"\"><Object as=\"properties\"/></mxCell><mxCell id=\"1\" CellType=\"This is where you say what the vertex is\" pinType=\" \" Component=\"0\" Pin=\"0\" PinNumber=\"0\" PinName=\"\"><Object as=\"properties\"/></mxCell><mxCell value=\"PRI_LO\" style=\"shape=image;fontColor=blue;image=../kicad-symbols/symbol_svgs/power/PWR-PRI_LO-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\" id=\"2\" vertex=\"1\" connectable=\"0\" Component=\"1\" CellType=\"Component\" symbol=\"PWR\" pinType=\" \" Pin=\"0\" PinNumber=\"0\" PinName=\"\"><mxGeometry x=\"150\" y=\"70\" width=\"24\" height=\"80\" as=\"geometry\"/><Object id=\"46\" name=\"PRI_LO\" svg_path=\"kicad-symbols/symbol_svgs/power/PWR-PRI_LO-1-A.svg\" thumbnail_path=\"kicad-symbols/symbol_svgs/power/PWR-PRI_LO-1-A_thumbnail.svg\" symbol_prefix=\"PWR\" component_library=\"http://localhost/api/libraries/2/\" description=\"Power symbol creates a global label with name &quot;PRI_LO&quot;\" data_link=\"\" full_name=\"PWR-PRI_LO-1-A\" keyword=\"power-flag\" as=\"CompObject\"><Array as=\"alternate_component\"/></Object><Object NAME=\"PRI_LO\" as=\"properties\"/></mxCell><mxCell value=\"1\" style=\"align=right;verticalAlign=bottom;rotation=0\" id=\"3\" vertex=\"1\" Pin=\"1\" pinType=\"Output\" PinNumber=\"1\" CellType=\"This is where you say what the vertex is\" Component=\"0\" PinName=\"\"><mxGeometry x=\"12\" y=\"39\" width=\"0.5\" height=\"0.5\" as=\"geometry\"/><mxCell value=\"PRI_LO\" style=\"shape=image;fontColor=blue;image=../kicad-symbols/symbol_svgs/power/PWR-PRI_LO-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\" id=\"2\" vertex=\"1\" connectable=\"0\" Component=\"1\" CellType=\"Component\" symbol=\"PWR\" pinType=\" \" Pin=\"0\" PinNumber=\"0\" PinName=\"\" as=\"ParentComponent\"><mxGeometry x=\"150\" y=\"70\" width=\"24\" height=\"80\" as=\"geometry\"/><Object id=\"46\" name=\"PRI_LO\" svg_path=\"kicad-symbols/symbol_svgs/power/PWR-PRI_LO-1-A.svg\" thumbnail_path=\"kicad-symbols/symbol_svgs/power/PWR-PRI_LO-1-A_thumbnail.svg\" symbol_prefix=\"PWR\" component_library=\"http://localhost/api/libraries/2/\" description=\"Power symbol creates a global label with name &quot;PRI_LO&quot;\" data_link=\"\" full_name=\"PWR-PRI_LO-1-A\" keyword=\"power-flag\" as=\"CompObject\"><Array as=\"alternate_component\"/></Object><Object NAME=\"PRI_LO\" as=\"properties\"/></mxCell><Object as=\"properties\"/></mxCell></root></mxGraphModel>'\n       var xmlDoc = mxUtils.parseXml(xml)\n       var node = xmlDoc.documentElement\n       var dec = new mxCodec(node)\n       dec.decode(node, graph.getModel())\n       console.log(dec)*/\n       \n     \n    } finally {\n    // Updates the display\n      graph.getModel().endUpdate()\n    }\n\n    // Shows XML for debugging the actual modelSS\n\n    // Wire-mode\n    var checkbox = {\n      checked: false\n    }\n\n    //document.body.appendChild(checkbox)\n    //mxUtils.write(document.body, 'Wire Mode')\n\n    // Starts connections on the background in wire-mode\n    var connectionHandlerIsStartEvent = graph.connectionHandler.isStartEvent\n    graph.connectionHandler.isStartEvent = function (me) {\n      return checkbox.checked || connectionHandlerIsStartEvent.apply(this, arguments)\n    }\n\n    // Avoids any connections for gestures within tolerance except when in wire-mode\n    // or when over a port\n    var connectionHandlerMouseUp = graph.connectionHandler.mouseUp\n    graph.connectionHandler.mouseUp = function (sender, me) {\n      if (this.first != null && this.previous != null) {\n        var point = mxUtils.convertPoint(this.graph.container, me.getX(), me.getY())\n        var dx = Math.abs(point.x - this.first.x)\n        var dy = Math.abs(point.y - this.first.y)\n\n        if (dx < this.graph.tolerance && dy < this.graph.tolerance) {\n          // Selects edges in non-wire mode for single clicks, but starts\n          // connecting for non-edges regardless of wire-mode\n          if (!checkbox.checked && this.graph.getModel().isEdge(this.previous.cell)) {\n            this.reset()\n          }\n\n          return\n        }\n      }\n\n      connectionHandlerMouseUp.apply(this, arguments)\n    }\n\n    // Grid\n    /* var checkbox2 = document.createElement('input')\n    checkbox2.setAttribute('type', 'checkbox')\n    checkbox2.setAttribute('checked', 'true')\n\n    document.body.appendChild(checkbox2)\n    mxUtils.write(document.body, 'Grid')\n\n    mxEvent.addListener(checkbox2, 'click', function (evt) {\n      if (checkbox2.checked) {\n        container.style.background = 'url(\\'images/wires-grid.gif\\')'\n      } else {\n        container.style.background = ''\n      }\n\n      container.style.backgroundColor = (invert) ? 'black' : 'white'\n    }) */\n\n    mxEvent.disableContextMenu(container)\n  };\n\n  // Computes the position of edge to edge connection points.\n  mxGraphView.prototype.updateFixedTerminalPoint = function (edge, terminal, source, constraint) {\n    var pt = null\n\n    if (constraint != null) {\n      pt = this.graph.getConnectionPoint(terminal, constraint)\n    }\n\n    if (source) {\n      edge.sourceSegment = null\n    } else {\n      edge.targetSegment = null\n    }\n\n    try {\n      if (pt == null) {\n        var s = this.scale\n        var tr = this.translate\n        var orig = edge.origin\n        var geo = this.graph.getCellGeometry(edge.cell)\n        pt = geo.getTerminalPoint(source)\n\n        // Computes edge-to-edge connection point\n        if (pt != null) {\n          pt = new mxPoint(s * (tr.x + pt.x + orig.x),\n                    s * (tr.y + pt.y + orig.y))\n\n          // Finds nearest segment on edge and computes intersection\n          if (terminal != null && terminal.absolutePoints != null) {\n            var seg = mxUtils.findNearestSegment(terminal, pt.x, pt.y)\n\n            // Finds orientation of the segment\n            var p0 = terminal.absolutePoints[seg]\n            var pe = terminal.absolutePoints[seg + 1]\n            var horizontal = (p0.x - pe.x === 0)\n\n            // Stores the segment in the edge state\n            var key = (source) ? 'sourceConstraint' : 'targetConstraint'\n            var value = (horizontal) ? 'horizontal' : 'vertical'\n            edge.style[key] = value\n\n            // Keeps the coordinate within the segment bounds\n            if (horizontal) {\n              pt.x = p0.x\n              pt.y = Math.min(pt.y, Math.max(p0.y, pe.y))\n              pt.y = Math.max(pt.y, Math.min(p0.y, pe.y))\n            } else {\n              pt.y = p0.y\n              pt.x = Math.min(pt.x, Math.max(p0.x, pe.x))\n              pt.x = Math.max(pt.x, Math.min(p0.x, pe.x))\n            }\n          }\n        }\n        // Computes constraint connection points on vertices and ports\n        else if (terminal != null && terminal.cell.geometry.relative) {\n          pt = new mxPoint(this.getRoutingCenterX(terminal),\n            this.getRoutingCenterY(terminal))\n        }\n      }\n\n      edge.setAbsoluteTerminalPoint(pt, source)\n    }\n    catch (e) { console.log(e) }\n  }\n  // Sets source terminal point for edge-to-edge connections.\n  mxConnectionHandler.prototype.createEdgeState = function (me) {\n    var edge = this.graph.createEdge()\n\n    if (this.sourceConstraint != null && this.previous != null) {\n      edge.style = mxConstants.STYLE_EXIT_X + '=' + this.sourceConstraint.point.x + ';' +\n\t\t\t\t\tmxConstants.STYLE_EXIT_Y + '=' + this.sourceConstraint.point.y + ';'\n    } else if (this.graph.model.isEdge(me.getCell())) {\n      var scale = this.graph.view.scale\n      var tr = this.graph.view.translate\n      var pt = new mxPoint(this.graph.snap(me.getGraphX() / scale) - tr.x,\n        this.graph.snap(me.getGraphY() / scale) - tr.y)\n      edge.geometry.setTerminalPoint(pt, true)\n    }\n\n    return this.graph.view.createState(edge)\n  }\n\n  // Uses right mouse button to create edges on background (see also: lines 67 ff)\n  mxConnectionHandler.prototype.isStopEvent = function (me) {\n    return me.getState() != null || mxEvent.isRightMouseButton(me.getEvent())\n  }\n\n  // Updates target terminal point for edge-to-edge connections.\n  try {\n  var mxConnectionHandlerUpdateCurrentState = mxConnectionHandler.prototype.updateCurrentState\n  mxConnectionHandler.prototype.updateCurrentState = function (me) {\n    try { \n    mxConnectionHandlerUpdateCurrentState.apply(this, arguments)\n    }\n    catch(err) {\n      \n    }\n    if (this.edgeState != null) {\n      this.edgeState.cell.geometry.setTerminalPoint(null, false)\n\n      if (this.shape != null && this.currentState != null &&\n\t\t\t\t\tthis.currentState.view.graph.model.isEdge(this.currentState.cell)) {\n        var scale = this.graph.view.scale\n        var tr = this.graph.view.translate\n        var pt = new mxPoint(this.graph.snap(me.getGraphX() / scale) - tr.x,\n          this.graph.snap(me.getGraphY() / scale) - tr.y)\n        this.edgeState.cell.geometry.setTerminalPoint(pt, false)\n      }\n    }\n  } }\n  catch(e){\n    console\n  }\n\n  // Updates the terminal and control points in the cloned preview.\n  mxEdgeSegmentHandler.prototype.clonePreviewState = function (point, terminal) {\n    var clone = mxEdgeHandler.prototype.clonePreviewState.apply(this, arguments)\n    clone.cell = clone.cell.clone()\n\n    if (this.isSource || this.isTarget) {\n      clone.cell.geometry = clone.cell.geometry.clone()\n\n      // Sets the terminal point of an edge if we're moving one of the endpoints\n      if (this.graph.getModel().isEdge(clone.cell)) {\n        // TODO: Only set this if the target or source terminal is an edge\n        clone.cell.geometry.setTerminalPoint(point, this.isSource)\n      } else {\n        clone.cell.geometry.setTerminalPoint(null, this.isSource)\n      }\n    }\n\n    return clone\n  }\n\n  var mxEdgeHandlerConnect = mxEdgeHandler.prototype.connect\n  mxEdgeHandler.prototype.connect = function (edge, terminal, isSource, isClone, me) {\n    var result = null\n    var model = this.graph.getModel()\n    // var parent = model.getParent(edge)\n\n    model.beginUpdate()\n    try {\n      result = mxEdgeHandlerConnect.apply(this, arguments)\n      var geo = model.getGeometry(result)\n\n      if (geo != null) {\n        geo = geo.clone()\n        var pt = null\n\n        if (model.isEdge(terminal)) {\n          pt = this.abspoints[(this.isSource) ? 0 : this.abspoints.length - 1]\n          pt.x = pt.x / this.graph.view.scale - this.graph.view.translate.x\n          pt.y = pt.y / this.graph.view.scale - this.graph.view.translate.y\n\n          var pstate = this.graph.getView().getState(\n            this.graph.getModel().getParent(edge))\n\n          if (pstate != null) {\n            pt.x -= pstate.origin.x\n            pt.y -= pstate.origin.y\n          }\n\n          pt.x -= this.graph.panDx / this.graph.view.scale\n          pt.y -= this.graph.panDy / this.graph.view.scale\n        }\n\n        geo.setTerminalPoint(pt, isSource)\n        model.setGeometry(edge, geo)\n      }\n    } finally {\n      model.endUpdate()\n    }\n\n    return result\n  }\n\n  var mxConnectionHandlerCreateMarker = mxConnectionHandler.prototype.createMarker\n  mxConnectionHandler.prototype.createMarker = function () {\n    var marker = mxConnectionHandlerCreateMarker.apply(this, arguments)\n\n    // Uses complete area of cell for new connections (no hotspot)\n    marker.intersects = function (state, evt) {\n      return true\n    }\n\n    // Adds in-place highlighting\n    // eslint-disable-next-line no-unused-vars\n    var mxCellHighlightHighlight = mxCellHighlight.prototype.highlight\n    marker.highlight.highlight = function (state) {\n      if (this.state !== state) {\n        if (this.state != null) {\n          this.state.style = this.lastStyle\n\n          // Workaround for shape using current stroke width if no strokewidth defined\n          this.state.style.strokeWidth = this.state.style.strokeWidth || '1'\n          this.state.style.strokeColor = this.state.style.strokeColor || 'none'\n\n          if (this.state.shape != null) {\n            this.state.view.graph.cellRenderer.configureShape(this.state)\n            this.state.shape.redraw()\n          }\n        }\n\n        if (state != null) {\n          this.lastStyle = state.style\n          state.style = mxUtils.clone(state.style)\n          state.style.strokeColor = '#00ff00'\n          state.style.strokeWidth = '3'\n\n          if (state.shape != null) {\n            state.view.graph.cellRenderer.configureShape(state)\n            state.shape.redraw()\n          }\n        }\n\n        this.state = state\n      }\n    }\n\n    return marker\n  }\n\n  var mxEdgeHandlerCreateMarker = mxEdgeHandler.prototype.createMarker\n  mxEdgeHandler.prototype.createMarker = function () {\n    var marker = mxEdgeHandlerCreateMarker.apply(this, arguments)\n\n    // Adds in-place highlighting when reconnecting existing edges\n    marker.highlight.highlight = this.graph.connectionHandler.marker.highlight.highlight\n\n    return marker\n  }\n\n  var mxGraphGetCellStyle = mxGraph.prototype.getCellStyle\n  mxGraph.prototype.getCellStyle = function (cell) {\n    var style = mxGraphGetCellStyle.apply(this, arguments)\n\n    if (style != null && this.model.isEdge(cell)) {\n      style = mxUtils.clone(style)\n\n      if (this.model.isEdge(this.model.getTerminal(cell, true))) {\n        style.startArrow = 'oval'\n      }\n\n      if (this.model.isEdge(this.model.getTerminal(cell, false))) {\n        style.endArrow = 'oval'\n      }\n    }\n\n    return style\n  }\n\n  function ResistorShape () { };\n  ResistorShape.prototype = new mxCylinder()\n  ResistorShape.prototype.constructor = ResistorShape\n\n  ResistorShape.prototype.redrawPath = function (path, x, y, w, h, isForeground) {\n    var dx = w / 16\n\n    if (isForeground) {\n      path.moveTo(0, h / 2)\n      path.lineTo(2 * dx, h / 2)\n      path.lineTo(3 * dx, 0)\n      path.lineTo(5 * dx, h)\n      path.lineTo(7 * dx, 0)\n      path.lineTo(9 * dx, h)\n      path.lineTo(11 * dx, 0)\n      path.lineTo(13 * dx, h)\n      path.lineTo(14 * dx, h / 2)\n      path.lineTo(16 * dx, h / 2)\n\n      path.end()\n    }\n  }\n\n  mxCellRenderer.registerShape('resistor', ResistorShape)\n\n  mxEdgeStyle.WireConnector = function (state, source, target, hints, result) {\n    // Creates array of all way- and terminalpoints\n    var pts = state.absolutePoints\n    var horizontal = true\n    var hint = null\n\n    // Gets the initial connection from the source terminal or edge\n    if (source != null && state.view.graph.model.isEdge(source.cell)) {\n      horizontal = state.style.sourceConstraint === 'horizontal'\n    } else if (source != null) {\n      horizontal = source.style.portConstraint !== 'vertical'\n\n      // Checks the direction of the shape and rotates\n      var direction = source.style[mxConstants.STYLE_DIRECTION]\n\n      if (direction === 'north' || direction === 'south') {\n        horizontal = !horizontal\n      }\n    }\n\n    // Adds the first point\n    // TODO: Should move along connected segment\n    var pt = pts[0]\n\n    if (pt == null && source != null) {\n      pt = new mxPoint(state.view.getRoutingCenterX(source), state.view.getRoutingCenterY(source))\n    } else if (pt != null) {\n      pt = pt.clone()\n    }\n\n    var first = pt\n\n    // Adds the waypoints\n    if (hints != null && hints.length > 0) {\n      // FIXME: First segment not movable\n      /* hint = state.view.transformControlPoint(state, hints[0]);\n\t\t\tmxLog.show();\n\t\t\tmxLog.debug(hints.length,'hints0.y='+hint.y, pt.y)\n\n\t\t\tif (horizontal && Math.floor(hint.y) != Math.floor(pt.y))\n\t\t\t{\n\t\t\t\tmxLog.show();\n\t\t\t\tmxLog.debug('add waypoint');\n\n\t\t\t\tpt = new mxPoint(pt.x, hint.y);\n\t\t\t\tresult.push(pt);\n\t\t\t\tpt = pt.clone();\n\t\t\t\t//horizontal = !horizontal;\n\t\t\t} */\n\n      for (var i = 0; i < hints.length; i++) {\n        horizontal = !horizontal\n        hint = state.view.transformControlPoint(state, hints[i])\n\n        if (horizontal) {\n          if (pt.y !== hint.y) {\n            pt.y = hint.y\n            result.push(pt.clone())\n          }\n        } else if (pt.x !== hint.x) {\n          pt.x = hint.x\n          result.push(pt.clone())\n        }\n      }\n    } else {\n      hint = pt\n    }\n\n    // Adds the last point\n    pt = pts[pts.length - 1]\n\n    // TODO: Should move along connected segment\n    if (pt == null && target != null) {\n      pt = new mxPoint(state.view.getRoutingCenterX(target), state.view.getRoutingCenterY(target))\n    }\n\n    if (horizontal) {\n      if (pt.y !== hint.y && first.x !== pt.x) {\n        result.push(new mxPoint(pt.x, hint.y))\n      }\n    } else if (pt.x !== hint.x && first.y !== pt.y) {\n      result.push(new mxPoint(hint.x, pt.y))\n    }\n  }\n\n  mxStyleRegistry.putValue('wireEdgeStyle', mxEdgeStyle.WireConnector)\n\n  // This connector needs an mxEdgeSegmentHandler\n  var mxGraphCreateHandler = mxGraph.prototype.createHandler\n  mxGraph.prototype.createHandler = function (state) {\n    // eslint-disable-next-line no-unused-vars\n    var result = null\n\n    if (state != null) {\n      if (this.model.isEdge(state.cell)) {\n        var style = this.view.getEdgeStyle(state)\n\n        if (style === mxEdgeStyle.WireConnector) {\n          return new mxEdgeSegmentHandler(state)\n        }\n      }\n    }\n\n    return mxGraphCreateHandler.apply(this, arguments)\n  }\n}"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/Helper/ComponentParametersData.js",
    "content": "const ComponentParameters = {\n  // capacitor\n  C: {\n    PREFIX: 'C',\n    NAME: '',\n    N1: '',\n    N2: '',\n    VALUE: '',\n    EXTRA_EXPRESSION: '',\n    MODEL: '',\n    VALUE_UNIT: 'F',\n    IC: '0'\n  },\n\n  D: {\n    PREFIX: 'D',\n    NAME: '',\n    N1: '',\n    N2: '',\n    EXTRA_EXPRESSION: '',\n    MODEL: '.model mydiode D'\n  },\n\n  I: {\n\n    ISOURCE: {\n      PREFIX: 'I',\n      NAME: '',\n      N1: '',\n      N2: '',\n      VALUE: '0',\n      EXTRA_EXPRESSION: '',\n      MODEL: '',\n      VALUE_UNIT: 'A'\n    },\n    SINE: {\n      PREFIX: 'I',\n      NAME: '',\n      N1: '',\n      N2: '',\n\n      OFFSET: '1.0',\n      AMPLITUDE: '1.0',\n      FREQUENCY: '1K',\n      DELAY: '0.0',\n      DAMPING_FACTOR: '0.0',\n      PHASE: '0.0',\n\n      EXTRA_EXPRESSION: '',\n      MODEL: '',\n\n      OFFSET_UNIT: 'A',\n      AMPLITUDE_UNIT: 'A',\n      FREQUENCY_UNIT: 'Hz',\n      DELAY_UNIT: 'S',\n      DAMPING_FACTOR_UNIT: '1/S',\n      PHASE_UNIT: 'DEG'\n    },\n\n    PULSE: {\n      PREFIX: 'I',\n      NAME: '',\n      N1: '',\n      N2: '',\n\n      INITIAL_VALUE: '0',\n      PULSED_VALUE: '1',\n      DELAY_TIME: '1K',\n      RISE_TIME: '1u',\n      FALL_TIME: '1u',\n      PULSE_WIDTH: '1m',\n      PERIOD: '1m',\n      PHASE: '0.0',\n\n      EXTRA_EXPRESSION: '',\n      MODEL: '',\n\n      INITIAL_VALUE_UNIT: 'A',\n      PULSED_VALUE_UNIT: 'A',\n      DELAY_TIME_UNIT: 'S',\n      RISE_TIME_UNIT: 'S',\n      FALL_TIME_UNIT: 'S',\n      PULSE_WIDTH_UNIT: 'S',\n      PERIOD_UNIT: 'S',\n      PHASE_UNIT: 'DEG'\n    },\n\n    DC: {\n      PREFIX: 'I',\n      NAME: '',\n      N1: '',\n      N2: '',\n      VALUE: '0',\n\n      EXTRA_EXPRESSION: '',\n      MODEL: '',\n\n      VALUE_UNIT: 'A'\n    },\n\n    EXP: {\n      PREFIX: 'I',\n      NAME: '',\n      N1: '',\n      N2: '',\n\n      INITIAL_VALUE: '0',\n      PULSED_VALUE: '1',\n\n      RISE_DELAY_TIME: '100u',\n      RISE_TIME_CONSTANT: '20u',\n      FALL_DELAY_TIME: '500u',\n      FALL_TIME_CONSTANT: '60u',\n\n      EXTRA_EXPRESSION: '',\n      MODEL: '',\n\n      INITIAL_VALUE_UNIT: 'A',\n      PULSED_VALUE_UNIT: 'A',\n      RISE_DELAY_TIME_UNIT: 'S',\n      RISE_TIME_CONSTANT_UNIT: 'S',\n      FALL_DELAY_TIME_UNIT: 'S',\n      FALL_TIME_CONSTANT_UNIT: 'S'\n    }\n\n  },\n\n  G: {\n    PREFIX: 'G',\n    NAME: '',\n    N1: '',\n    N2: '',\n    NC1: '',\n    NC2: '',\n    VALUE: '',\n    EXTRA_EXPRESSION: '',\n    MODEL: '',\n    VALUE_UNIT: 'mho'\n  },\n\n  F: {\n    PREFIX: 'F',\n    NAME: '',\n    N1: '',\n    N2: '',\n    VNAM: '',\n    VALUE: '',\n    EXTRA_EXPRESSION: '',\n    MODEL: ''\n  },\n\n  H: {\n    PREFIX: 'H',\n    NAME: '',\n    N1: '',\n    N2: '',\n    VNAM: '',\n    VALUE: '',\n    EXTRA_EXPRESSION: '',\n    MODEL: ''\n  },\n\n  J: {\n    PREFIX: 'J',\n    NAME: '',\n    N1: '',\n    N2: '',\n    N3: '',\n    EXTRA_EXPRESSION: '',\n    MODEL: ''\n  },\n\n  O: {\n    PREFIX: 'O',\n    NAME: '',\n    N1: '',\n    N2: '',\n    N3: '',\n    N4: '',\n    EXTRA_EXPRESSION: '',\n    MODEL: ''\n  },\n\n  T: {\n    PREFIX: 'T',\n    NAME: '',\n    N1: '',\n    N2: '',\n    N3: '',\n    N4: '',\n    EXTRA_EXPRESSION: '',\n    MODEL: ''\n  },\n  // Inductor\n  L: {\n    PREFIX: 'L',\n    NAME: '',\n    N1: '',\n    N2: '',\n    VALUE: '',\n    EXTRA_EXPRESSION: '',\n    MODEL: '',\n    VALUE_UNIT: 'H',\n    IC: '0',\n    DTEMP: '27'\n  },\n\n  M: {\n    PREFIX: 'M',\n    NAME: '',\n    N1: '',\n    N2: '',\n    N3: '',\n    N4: '',\n    EXTRA_EXPRESSION: '',\n    MULTIPLICITY_PARAMETER: '1',\n    MODEL: '.model mymosfet NMOS',\n    DTEMP: '27'\n  },\n\n  Q: {\n    PREFIX: 'Q',\n    NAME: '',\n    N1: '',\n    N2: '',\n    N3: '',\n    EXTRA_EXPRESSION: '',\n    MODEL: '.model mybjt PNP',\n    MULTIPLICITY_PARAMETER: '1',\n    DTEMP: '27'\n  },\n\n  V: {\n    VSOURCE: {\n      PREFIX: 'V',\n      NAME: '',\n      N1: '',\n      N2: '',\n      VALUE: '0',\n      EXTRA_EXPRESSION: '',\n      MODEL: '',\n      VALUE_UNIT: 'V'\n    },\n    SINE: {\n      PREFIX: 'V',\n      NAME: '',\n      N1: '',\n      N2: '',\n\n      OFFSET: '1.0',\n      AMPLITUDE: '1.0',\n      FREQUENCY: '1K',\n      DELAY: '0.0',\n      DAMPING_FACTOR: '0.0',\n      PHASE: '0.0',\n\n      EXTRA_EXPRESSION: '',\n      MODEL: '',\n\n      OFFSET_UNIT: 'V',\n      AMPLITUDE_UNIT: 'V',\n      FREQUENCY_UNIT: 'Hz',\n      DELAY_UNIT: 'S',\n      DAMPING_FACTOR_UNIT: '1/S',\n      PHASE_UNIT: 'DEG'\n    },\n\n    PULSE: {\n      PREFIX: 'V',\n      NAME: '',\n      N1: '',\n      N2: '',\n\n      INITIAL_VALUE: '0',\n      PULSED_VALUE: '1',\n      DELAY_TIME: '1K',\n      RISE_TIME: '1u',\n      FALL_TIME: '1u',\n      PULSE_WIDTH: '1m',\n      PERIOD: '1m',\n      PHASE: '0.0',\n\n      EXTRA_EXPRESSION: '',\n      MODEL: '',\n\n      INITIAL_VALUE_UNIT: 'V',\n      PULSED_VALUE_UNIT: 'V',\n      DELAY_TIME_UNIT: 'S',\n      RISE_TIME_UNIT: 'S',\n      FALL_TIME_UNIT: 'S',\n      PULSE_WIDTH_UNIT: 'S',\n      PERIOD_UNIT: 'S',\n      PHASE_UNIT: 'DEG'\n    },\n\n    DC: {\n      PREFIX: 'V',\n      NAME: '',\n      N1: '',\n      N2: '',\n      VALUE: '0',\n\n      EXTRA_EXPRESSION: '',\n      MODEL: '',\n\n      VALUE_UNIT: 'V'\n    },\n\n    EXP: {\n      PREFIX: 'V',\n      NAME: '',\n      N1: '',\n      N2: '',\n\n      INITIAL_VALUE: '0',\n      PULSED_VALUE: '1',\n\n      RISE_DELAY_TIME: '100u',\n      RISE_TIME_CONSTANT: '20u',\n      FALL_DELAY_TIME: '500u',\n      FALL_TIME_CONSTANT: '60u',\n\n      EXTRA_EXPRESSION: '',\n      MODEL: '',\n\n      INITIAL_VALUE_UNIT: 'v',\n      PULSED_VALUE_UNIT: 'v',\n      RISE_DELAY_TIME_UNIT: 'S',\n      RISE_TIME_CONSTANT_UNIT: 'S',\n      FALL_DELAY_TIME_UNIT: 'S',\n      FALL_TIME_CONSTANT_UNIT: 'S'\n    }\n\n  },\n  // resistor\n  R: {\n    PREFIX: 'R',\n    NAME: '',\n    N1: '',\n    N2: '',\n    VALUE: '1',\n    EXTRA_EXPRESSION: '',\n    MODEL: '',\n    VALUE_UNIT: 'Ohm',\n    SHEET_RESISTANCE: '0',\n    FIRST_ORDER_TEMPERATURE_COEFF: '0',\n    SECOND_ORDER_TEMPERATURE_COEFF: '0',\n    PARAMETER_MEASUREMENT_TEMPERATURE: '27'\n  },\n\n  Z: {\n    PREFIX: 'Z',\n    NAME: '',\n    N1: '',\n    N2: '',\n    N3: '',\n    EXTRA_EXPRESSION: '',\n    MODEL: ''\n  },\n\n  SW: {\n    PREFIX: 'S',\n    NAME: '',\n    N1: '',\n    N2: '',\n    NC1: '',\n    NC2: '',\n    MODEL: '',\n    EXTRA_EXPRESSION: ''\n\n  },\n  W: {\n    PREFIX: 'W',\n    NAME: '',\n    N1: '',\n    N2: '',\n    VNAM: '',\n    MODEL: '',\n    EXTRA_EXPRESSION: ''\n\n  },\n  E: {\n    PREFIX: 'E',\n    NAME: '',\n    N1: '',\n    N2: '',\n    NC1: '',\n    NC2: '',\n    MODEL: '',\n    VALUE: '1',\n    EXTRA_EXPRESSION: ''\n  }\n\n}\n\nexport default ComponentParameters\n\n// K coupled inductor\n// SWITCHES\n\n// IF S,W show model\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/Helper/KeyboardShorcuts.js",
    "content": "/* eslint-disable new-cap */\nimport MxGraphFactory from 'mxgraph'\nimport { Undo, Redo, ZoomIn, ZoomOut, ZoomAct, DeleteComp, ClearGrid, Rotate, RotateACW } from './ToolbarTools'\n\nconst {\n  mxKeyHandler,\n  mxEvent,\n  mxClient\n} = new MxGraphFactory()\n\nexport default function KeyboardShortcuts (graph) {\n  var keyHandler = new mxKeyHandler(graph)\n\n  keyHandler.getFunction = function (evt) {\n    if (evt != null) {\n      return (mxEvent.isControlDown(evt) || (mxClient.IS_MAC && evt.metaKey)) ? this.controlKeys[evt.keyCode] : this.normalKeys[evt.keyCode]\n    }\n\n    return null\n  }\n\n  // Rotate Alt + (right arrow)\n  keyHandler.bindKey(39, function (evt) {\n    if (graph.isEnabled) {\n      if (evt.altKey) {\n        Rotate()\n      }\n    }\n  })\n\n  // Rotate Alt + (left Arrow)\n  keyHandler.bindKey(37, function (evt) {\n    if (graph.isEnabled) {\n      if (evt.altKey) {\n        RotateACW()\n      }\n    }\n  })\n\n  // Delete - Del / Clear All - Shift + Del\n  keyHandler.bindKey(46, function (evt) {\n    if (graph.isEnabled()) {\n      if (evt.shiftKey) {\n        ClearGrid()\n      } else {\n        DeleteComp()\n      }\n    }\n  })\n\n  // Undo - Ctrl + Z / Redo - Ctrl + Shift + Z\n  keyHandler.bindControlKey(90, function (evt) {\n    if (graph.isEnabled()) {\n      if (evt.ctrlKey && !evt.shiftKey) {\n        Undo()\n      } else if (evt.ctrlKey && evt.shiftKey) {\n        Redo()\n      }\n    }\n  })\n\n  // Zoom In - Ctrl + +\n  keyHandler.bindControlKey(187, function (evt) {\n    evt.preventDefault()\n    if (graph.isEnabled()) {\n      ZoomIn()\n    }\n  })\n  keyHandler.bindControlKey(107, function (evt) {\n    evt.preventDefault()\n    if (graph.isEnabled()) {\n      ZoomIn()\n    }\n  })\n\n  // Zoom Out - Ctrl + -\n  keyHandler.bindControlKey(189, function (evt) {\n    evt.preventDefault()\n    if (graph.isEnabled()) {\n      ZoomOut()\n    }\n  })\n  keyHandler.bindControlKey(109, function (evt) {\n    evt.preventDefault()\n    if (graph.isEnabled()) {\n      ZoomOut()\n    }\n  })\n\n  // Zoom Out - Ctrl + Y\n  keyHandler.bindControlKey(89, function (evt) {\n    if (graph.isEnabled()) {\n      ZoomAct()\n    }\n  })\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/Helper/KiCadFileUtils.js",
    "content": "/* eslint-disable new-cap */\n/* eslint-disable no-unused-vars */\nimport store from '../../../redux/store'\nimport api from '../../../utils/Api'\nimport { getSvgMetadata } from './SvgParser'\nimport mxGraphFactory from 'mxgraph'\nconst {\n  mxPoint\n} = new mxGraphFactory()\n\n// var edgeHandler\n// orientation matrix [x1, y1, x2, y2] (KiCad defined)\n// used for defining rotation and x mirrored states\n// Actually 12 values but 8 required others are represented as combinations of these 8\nconst orientations = [\n  [1, 0, 0, -1], [0, 1, 1, 0], [-1, 0, 0, 1], [0, -1, -1, 0],\n  [1, 0, 0, 1], [0, -1, 1, 0], [1, 0, 0, -1], [0, 1, -1, 0],\n  [-1, 0, 0, -1], [0, 1, -1, 0], [1, 0, 0, 1], [0, -1, 1, 0]\n]\n\nvar graph\nvar defaultParent\n\n// Scale for the graph\nconst defScale = 5\n\n// Graph config\nexport default function KiCadFileUtils (grid) {\n  graph = grid\n  defaultParent = graph.getDefaultParent()\n}\n\n// Reads Kicad .sch files and returns the schematic as instructions\nconst readKicadSchematic = (text) => {\n  const textSplit = text.split('\\n')\n  let i = 0\n  const instructions = {}\n\n  // Metadata and description of the schematic\n  for (i = 0; i < textSplit.length; i++) {\n    var brk = false\n    if (i === 0) {\n      var versionNum = parseInt(textSplit[i].split(' ')[4])\n    }\n    var splt = textSplit[i].split(' ')\n    switch (splt[0]) {\n      case '$Descr':\n        instructions.pageSize = splt[1]\n        instructions.oreientation = parseInt(splt[1]) > parseInt(splt[2]) ? 'L' : 'P'\n        break\n      case 'Title':\n        instructions.title = splt[1].substr(1, splt[1].length - 2)\n        break\n      case '$EndDescr':\n        brk = true\n        break\n      default:\n        break\n    }\n    if (brk) break\n  }\n\n  instructions.components = []\n  instructions.wires = []\n  instructions.connections = []\n  let component = {}\n  let wire = {}\n  let connection = {}\n  for (;i < textSplit.length; i++) {\n    let splt = textSplit[i].split(' ')\n    switch (splt[0]) {\n      case '$Comp':\n        i += 1\n        component = {}\n        splt = textSplit[i].split(' ')\n        if (splt[1].indexOf(':') !== -1) {\n          component.library = splt[1].split(':')[0].trim().toLowerCase()\n          component.componentName = splt[1].split(':')[1].trim().toLowerCase()\n        } else if (splt[1].indexOf('_') !== -1) {\n          component.componentName = splt[1].split('_')[0].toLowerCase()\n          component.library = splt[1].split('_')[1].toLowerCase()\n        } else {\n          component.componentName = splt[1].toLowerCase()\n        }\n        i += 2 // skips identifier line\n        splt = textSplit[i].split(' ')\n        component.x = parseInt(splt[1]) / defScale\n        component.y = parseInt(splt[2]) / defScale\n        i++\n        // skips F command lines\n        do {\n          i++\n        } while (textSplit[i].split(' ')[0] === 'F')\n        i += 1 // skips redundanmt x y position line\n        var compOrient = textSplit[i].split(' ')\n        compOrient[0] = compOrient[0].split('\\t')[1]\n        compOrient = compOrient.filter(e => e !== '').map(e => parseInt(e))\n        var rotation = 0\n        var mirrorX = false\n        var mirrorY = false\n        // checks which orientation matches\n        for (let index = 0; index < orientations.length; index++) {\n          if (compOrient[0] === orientations[index][0] && compOrient[1] === orientations[index][1] &&\n            compOrient[2] === orientations[index][2] && compOrient[3] === orientations[index][3]) {\n            rotation = (index % 4) * 90\n            if (index > 7) { mirrorY = true } else if (index > 3) { mirrorX = true }\n            break\n          }\n        }\n        component.rotation = rotation\n        component.mirrorX = mirrorX\n        component.mirrorY = mirrorY\n        while (textSplit[i].split(' ')[0] !== '$EndComp') {\n          i++\n        }\n        instructions.components.push(component)\n        break\n      case 'Wire':\n        if (splt[1] === 'Wire') {\n          i += 1\n          wire = {}\n          let posWire = textSplit[i].split(' ')\n          posWire = posWire.filter(e => e.length !== 0)\n          wire.startx = parseInt(posWire[0].split('\\t')[1]) / defScale\n          wire.starty = parseInt(posWire[1]) / defScale\n          wire.endx = parseInt(posWire[2]) / defScale\n          wire.endy = parseInt(posWire[3]) / defScale\n          instructions.wires.push(wire)\n        }\n        break\n      case 'Connection':\n        connection = {}\n        var posConn = splt\n        posConn = posConn.filter(e => e.length !== 0)\n        connection.x = parseInt(posConn[2]) / defScale\n        connection.y = parseInt(posConn[3]) / defScale\n        instructions.connections.push(connection)\n        break\n      default:\n        break\n    }\n  }\n  instructions.wireSegments = [...instructions.wires]\n  instructions.wires = reduceWires([...instructions.wires])\n  return instructions\n}\n\nconst loadComponents = async (components, wires, connections) => {\n  // API config\n  const token = store.getState().authReducer.token\n  var config = { headers: { 'Content-Type': 'application/json' } }\n  if (token) { config.headers.Authorization = `Token ${token}` }\n\n  // Graph config\n  var parent = graph.getDefaultParent()\n  var model = graph.getModel()\n\n  const insertComponent = async (comp, compData) => {\n    model.beginUpdate()\n    try {\n      var compCell = await getSvgMetadata(graph, parent, null, null, comp.x,\n        comp.y, compData, comp.rotation, true)\n      graph.refresh()\n    } catch (e) { console.log(e) }\n    model.endUpdate()\n    return compCell\n  }\n\n  const findApprComp = (compDataList, key) => {\n    for (let i = 0; i < compDataList.length; i++) {\n      // console.log(compDataList[i].name)\n      if (compDataList[i].name.toLowerCase() === key.toLowerCase()) {\n        return compDataList[i]\n      }\n    }\n    return compDataList[0]\n  }\n\n  // Load all components\n  for (let i = 0; i < components.length; i++) {\n    // Get component data\n    var url\n    if (components[i].componentName && components[i].library) {\n      url = `components/?component_library__library_name__icontains=${components[i].library}&name__icontains=${components[i].componentName}`\n    } else if (!components[i].library) {\n      url = `components/?name__icontains=${components[i].componentName}`\n    }\n    var compCell = await api.get(url, config)\n      .then((res) => {\n        if (res.data) {\n          const compData = findApprComp(res.data, components[i].componentName)\n          return insertComponent(components[i], compData)\n        } else return null\n      })\n    components[i].mxCell = compCell\n  }\n  joinComponents(components, wires, connections)\n}\n\nconst joinComponents = (components, wires, connections) => {\n  var model = graph.getModel()\n\n  const drawConnection = (wire, source, target, connection) => {\n    if (wire.startTerminal && wire.endTerminal) {\n      model.beginUpdate()\n      // console.log(wire.startTerminal, wire.endTerminal)\n      var v = graph.insertEdge(defaultParent, null, null, wire.startTerminal, wire.endTerminal)\n      if (wire.points) {\n        v.geometry.points = wire.points.map(p => { return new mxPoint(p.x, p.y) })\n      }\n      if (source) {\n        v.geometry.sourcePoint = new mxPoint(connection.x, connection.y)\n      }\n      if (target) {\n        v.geometry.targetPoint = new mxPoint(connection.x, connection.y)\n      }\n      model.endUpdate()\n    }\n    return v\n  }\n\n  const findWire = (w, x, y) => {\n    for (const c in connections) {\n      if (connections[c].x === x && connections[c].y === y) {\n        for (let wi = 0; wi < wires.length && wi !== w; wi++) {\n          if (wires[wi].startx === connections[c].x && wires[wi].starty === connections[c].y) {\n            if (wires[wi].mxCell) { return [wires[wi].mxCell, connections[c]] }\n          }\n          if (wires[wi].endx === connections[c].x && wires[wi].endy === connections[c].y) {\n            if (wires[wi].mxCell) { return [wires[wi].mxCell, connections[c]] }\n          }\n          if (wires[wi].points) {\n            for (const p in wires[wi].points) {\n              if (wires[wi].points[p].x === connections[c].x && connections[c].y === wires[wi].points[p].y) {\n                if (wires[wi].mxCell) {\n                  return [wires[wi].mxCell, connections[c]]\n                } else {\n                  return [null, null]\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    return [null, null]\n  }\n\n  const checkInBound = (x, y, compMxCell) => {\n    let height = compMxCell.geometry.height\n    let width = compMxCell.geometry.width\n    let angle = compMxCell.getStyle().split('rotation=')\n    if (angle[1]) {\n      angle = parseInt(angle[1].split(';')[0])\n      if ((angle / 90) % 2 !== 0) {\n        const t = height\n        height = width\n        width = t\n      }\n    }\n    if (compMxCell.geometry.x + width >= x &&\n      compMxCell.geometry.x <= x &&\n      compMxCell.geometry.y + height >= y &&\n      compMxCell.geometry.y <= y) {\n      return true\n    } else {\n      return false\n    }\n  }\n\n  const findClosestTerminal = (x, y, compCell) => {\n    let minDist = Number.MAX_SAFE_INTEGER\n    let closestTerm = null\n    const compx = compCell.geometry.x\n    const compy = compCell.geometry.y\n    for (let i = 0, child = compCell.getChildAt(i); i < compCell.getChildCount(); i++, child = compCell.getChildAt(i)) {\n      if (child.connectable) {\n        const distFrmPnt = Math.pow(x - (compx + child.geometry.x), 2) + Math.pow(y - (compy + child.geometry.y), 2)\n        if (distFrmPnt < minDist) {\n          closestTerm = child\n          minDist = distFrmPnt\n        }\n      }\n    }\n    return closestTerm\n  }\n\n  const componentCells = []\n  components.forEach(comp => {\n    if (comp.mxCell) { componentCells.push(comp.mxCell) }\n  })\n\n  for (const c in componentCells) {\n    for (const w in wires) {\n      let terminal\n      if (!wires[w].startTerminal) {\n        if (checkInBound(wires[w].startx, wires[w].starty, componentCells[c])) {\n          // console.log('S', wires[w].startx, wires[w].starty)\n          terminal = findClosestTerminal(wires[w].startx, wires[w].starty, componentCells[c])\n          wires[w].startTerminal = terminal\n        }\n      } if (!wires[w].endTerminal) {\n        if (checkInBound(wires[w].endx, wires[w].endy, componentCells[c])) {\n          // console.log('E', wires[w].endx, wires[w].endy)\n          terminal = findClosestTerminal(wires[w].endx, wires[w].endy, componentCells[c])\n          wires[w].endTerminal = terminal\n        }\n      }\n    }\n  }\n  // console.log(wires)\n  model.beginUpdate()\n  wires.forEach(wire => {\n    if (wire.startTerminal && wire.endTerminal) {\n      var v = graph.insertEdge(defaultParent, null, null, wire.startTerminal, wire.endTerminal)\n      if (wire.points) {\n        v.geometry.points = wire.points.map(p => { return new mxPoint(p.x, p.y) })\n      }\n      wire.mxCell = v\n    }\n  })\n  model.endUpdate()\n\n  const unconnectedWirePresent = () => {\n    for (const w in wires) {\n      if (!wires[w].mxCell) { return true }\n    }\n    return false\n  }\n\n  // while (unconnectedWirePresent()) {\n  for (const w in wires) {\n    if (!wires[w].startTerminal) {\n      [wires[w].startTerminal, wires[w].connection] = findWire(w, wires[w].startx, wires[w].starty)\n      if (wires[w].endTerminal && wires[w].startTerminal && wires[w].connection) {\n        wires[w].mxCell = drawConnection(wires[w], true, false, wires[w].connection)\n      }\n    }\n    if (!wires[w].endTerminal) {\n      [wires[w].endTerminal, wires[w].connection] = findWire(w, wires[w].endx, wires[w].endy)\n      if (wires[w].endTerminal && wires[w].startTerminal && wires[w].connection) {\n        wires[w].mxCell = drawConnection(wires[w], false, true, wires[w].connection)\n      }\n    }\n  }\n  // }\n}\n\n// Reduces the wires and connections\nconst reduceWires = (wires) => {\n  for (let i = 0; i < wires.length; i++) {\n    if (wires[i] !== undefined) {\n      for (let j = 0; j < wires.length; j++) {\n        if (wires[j] !== undefined && i !== j) {\n          if (wires[i].endx === wires[j].startx && wires[i].endy === wires[j].starty) {\n            if (wires[i].points) {\n              wires[i].points.push({ x: wires[i].endx, y: wires[i].endy })\n            } else {\n              wires[i].points = [{ x: wires[i].endx, y: wires[i].endy }]\n            }\n            wires[i].endx = wires[j].endx\n            wires[i].endy = wires[j].endy\n            if (i !== j) {\n              delete wires[j]\n              j = 0\n            }\n          }\n        }\n      }\n    }\n  }\n  wires = wires.filter(e => e !== null || e !== undefined)\n  return wires\n}\n\nexport function importSCHFile (fileContents) {\n  const rawInstr = readKicadSchematic(fileContents)\n  // console.log(rawInstr)\n  loadComponents([...rawInstr.components], [...rawInstr.wires], [...rawInstr.connections])\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/Helper/SchematicEditor.css",
    "content": "/* Sidebar Components */\n.compImage {\n  width: 72px;\n  height: 72px;\n  margin-left: auto;\n  padding: 2px;\n}\n\n.compImage:hover {\n  background-color: #f4f6f8;\n  border-radius: 5px;\n  transform: scale(1.5);\n  padding: 3px;\n  box-shadow: 0px 0px 41px 17px rgba(207,218,225,0.68);\n}\n\n/* Schematic Editer Grid */\n.grid-container {\n  position: relative;\n  overflow: hidden;\n  margin: 10px auto 0px auto;\n  -webkit-box-shadow: -8px -2px 24px 9px rgba(208, 218, 225, 1);\n  -moz-box-shadow: -8px -2px 24px 9px rgba(208, 218, 225, 1);\n  box-shadow: -8px -2px 24px 9px rgba(208, 218, 225, 1);\n  background-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHBhdHRlcm4gaWQ9ImdyaWQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZD0iTSAwIDEwIEwgNDAgMTAgTSAxMCAwIEwgMTAgNDAgTSAwIDIwIEwgNDAgMjAgTSAyMCAwIEwgMjAgNDAgTSAwIDMwIEwgNDAgMzAgTSAzMCAwIEwgMzAgNDAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2UwZTBlMCIgb3BhY2l0eT0iMC4yIiBzdHJva2Utd2lkdGg9IjEiLz48cGF0aCBkPSJNIDQwIDAgTCAwIDAgMCA0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZTBlMGUwIiBzdHJva2Utd2lkdGg9IjEiLz48L3BhdHRlcm4+PC9kZWZzPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JpZCkiLz48L3N2Zz4=\");\n  cursor: default;\n  border: 2px solid #d0dae1;\n  border-radius: 5px;\n}\n\n.A1-L {\n  width: 84.1cm;\n  height: 59.4cm;\n}\n\n.A1-P {\n  width: 59.4cm;\n  height: 84.1cm;\n}\n\n.A2-L {\n  width: 59.4cm;\n  height: 42.0cm;\n}\n\n.A2-P {\n  width: 42.0cm;\n  height: 59.4cm;\n}\n\n.A3-L {\n  width: 42.0cm;\n  height: 29.7cm;\n}\n\n.A3-P {\n  width: 29.7cm;\n  height: 42.0cm;\n}\n\n.A4-L {\n  width: 29.7cm;\n  height: 21cm;\n}\n\n.A4-P {\n  width: 21cm;\n  height: 29.7cm;\n}\n\n.A5-L {\n  width: 21.0cm;\n  height: 14.8cm;\n}\n\n.A5-P {\n  width: 14.8cm;\n  height:21.0cm;\n}\n\n.outline-container {\n  width:250px;\n  height:120px;\n  background-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHBhdHRlcm4gaWQ9ImdyaWQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZD0iTSAwIDEwIEwgNDAgMTAgTSAxMCAwIEwgMTAgNDAgTSAwIDIwIEwgNDAgMjAgTSAyMCAwIEwgMjAgNDAgTSAwIDMwIEwgNDAgMzAgTSAzMCAwIEwgMzAgNDAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2UwZTBlMCIgb3BhY2l0eT0iMC4yIiBzdHJva2Utd2lkdGg9IjEiLz48cGF0aCBkPSJNIDQwIDAgTCAwIDAgMCA0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZTBlMGUwIiBzdHJva2Utd2lkdGg9IjEiLz48L3BhdHRlcm4+PC9kZWZzPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JpZCkiLz48L3N2Zz4=\");\n  border: 1px solid #fff;\n}\n\nhtml {\n  overflow: scroll;\n  overflow-x: hidden;\n}\n::-webkit-scrollbar {\n  width: 0px; /* Remove scrollbar space */\n  background: transparent; /* Optional: just make scrollbar invisible */\n}\n/* Optional: show position indicator in red */\n::-webkit-scrollbar-thumb {\n  background: grey;\n}\n\n.modal-library-detail *::-webkit-scrollbar {\n  width: auto;\n}"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/Helper/SideBar.js",
    "content": "/* eslint-disable new-cap */\nimport MxGraphFactory from 'mxgraph'\nimport { getSvgMetadata } from './SvgParser.js'\n// import NetlistInfoFunct from './NetlistInfo.js'\nconst {\n  mxClient,\n  mxUtils,\n  mxEvent,\n  mxDragSource\n} = new MxGraphFactory()\n\nvar graph\n\nexport function SideBar (getGraph) {\n  graph = getGraph\n}\n\nexport function AddComponent (component, imgref) {\n  var img = imgref\n\n  var graphF = function (evt) {\n    var x = mxEvent.getClientX(evt)\n    var y = mxEvent.getClientY(evt)\n    var elt = document.elementFromPoint(x, y)\n    if (mxUtils.isAncestorNode(graph.container, elt)) {\n      return graph\n    }\n    return null\n  }\n  var funct = function (graph, evt, target, x, y) {\n    var parent = graph.getDefaultParent()\n    var model = graph.getModel()\n\n    var v1 = null\n\n    model.beginUpdate()\n    try {\n      // NOTE: For non-HTML labels the image must be displayed via the style\n      // rather than the label markup, so use 'image=' + image for the style.\n      // as follows: v1 = graph.insertVertex(parent, null, label,\n      // pt.x, pt.y, 120, 120, 'image=' + image);\n\n      // ***IMP\n      // GET THE SIZE OF SVG FOROM METADATA AND THEN DIVIDE BOTH WIDTH AND HEIGHT BE SAME RATIO\n      // THEN USE THAT VALUE BELOW\n\n      getSvgMetadata(graph, parent, evt, target, x, y, component)\n\n      // **IMP VERTICS DRAWING IS MOVED TO xml_parser.js\n      // WILL BE REFACTORED IN SOME TIME.\n    } finally {\n      model.endUpdate()\n    }\n\n    graph.setSelectionCell(v1)\n    /* var preview = new mxPrintPreview(graph)\n    preview.open() */\n  }\n\n  // Creates a DOM node that acts as the drag source\n  // Disables built-in DnD in IE (this is needed for cross-frame DnD, see below)\n  if (mxClient.IS_IE) {\n    mxEvent.addListener(img, 'dragstart', function (evt) {\n      evt.returnValue = false\n    })\n  }\n\n  // Creates the element that is being for the actual preview.\n  var dragElt = document.createElement('div')\n  dragElt.style.border = 'dashed black 1px'\n  dragElt.style.width = '120px'\n  dragElt.style.height = '40px'\n\n  // Drag source is configured to use dragElt for preview and as drag icon\n  // if scalePreview (last) argument is true. Dx and dy are null to force\n  // the use of the defaults. Note that dx and dy are only used for the\n  // drag icon but not for the preview.\n\n  var ds = mxUtils.makeDraggable(\n    img,\n    graphF,\n    funct,\n    dragElt,\n    null,\n    null,\n    graph.autoscroll,\n    true\n  )\n\n  // Redirects feature to global switch. Note that this feature should only be used\n  // if the the x and y arguments are used in funct to insert the cell.\n  ds.isGuidesEnabled = function () {\n    return graph.graphHandler.guidesEnabled\n  }\n\n  ds.createDragElement = mxDragSource.prototype.createDragElement\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/Helper/SvgParser.js",
    "content": "/* eslint-disable new-cap */\n/* eslint-disable no-unused-vars */\n/* eslint-disable camelcase */\nimport mxGraphFactory from 'mxgraph'\nimport ComponentParameters from './ComponentParametersData'\nimport { rotateCell } from './ToolbarTools'\nconst {\n  mxConstants\n} = new mxGraphFactory()\n\nlet pinData, metadata, pinList, pinName, pinOrientation, pinLength, pinShape\nlet currentPin, x_pos, y_pos\nlet width, height, symbolName\n\n// we need to divide the svg width and height by the same number in order to maintain the aspect ratio.\nconst default_scale = 5\n\nfunction extractData (xml) {\n  // extracting metadata from the svg file.\n\n  pinData = []\n  metadata = xml.getElementsByTagName('metadata')\n  const width = metadata[0].attributes[0].nodeValue\n  const height = metadata[0].attributes[1].nodeValue\n  const symbolName = metadata[0].attributes[4].nodeValue\n  pinList = metadata[0].childNodes\n  // console.log(metadata)\n  // console.log(xmlDoc)\n  // console.log(width,height)\n  pinList.forEach(function (pin) {\n    const pinNumber = pin.tagName.split('-').pop()\n    const pinX = pin.getElementsByTagName('x')[0].innerHTML\n    const pinY = pin.getElementsByTagName('y')[0].innerHTML\n    const pinType = pin.getElementsByTagName('type')[0].innerHTML.trim()\n    const pinName = pin.getElementsByTagName('name')[0].innerHTML.trim()\n    const pinOrientation = pin.getElementsByTagName('orientation')[0].innerHTML.trim()\n    const pinLength = pin.getElementsByTagName('length')[0].innerHTML.trim()\n    const pinShape = pin.getElementsByTagName('pinShape')[0].innerHTML.trim()\n\n    pinData.push({\n      pinNumber: pinNumber,\n      pinX: pinX,\n      pinY: pinY,\n      type: pinType,\n      pinName: pinName,\n      pinOrientation: pinOrientation,\n      pinLength: pinLength,\n      pinShape: pinShape\n    })\n    // console.log(pinNumber, pinX, pinY, pinType)\n  })\n  return {\n    width: width,\n    height: height,\n    symbolName: symbolName,\n    pinData: pinData\n  }\n}\n\nexport function getSvgMetadata (graph, parent, evt, target, x, y, component, rotation = 0, centerCoords = false) {\n  // calls extractData and other MXGRAPH functions\n  // initialize information from the svg meta\n  // plots pinnumbers and component labels.\n\n  var path = '../' + component.svg_path\n\n  return fetch(path)\n    .then(function (response) {\n      return response.text()\n    })\n    .then(function (data) {\n      const parser = new DOMParser()\n      const xml = parser.parseFromString(data, 'text/xml')\n      // console.log(xmlDoc);\n      data = extractData(xml)\n      // console.log(data)\n      return data\n    }).then(function (data) {\n      const pins = []\n      width = data.width\n      height = data.height\n      pinData = data.pinData\n\n      // console.log(pinData)\n\n      // Disables moving of vertex labels\n      graph.vertexLabelsMovable = false\n\n      // Creates a style with an indicator\n      var style = graph.getStylesheet().getDefaultVertexStyle()\n\n      style[mxConstants.STYLE_SHAPE] = 'label'\n      style[mxConstants.STYLE_VERTICAL_ALIGN] = 'bottom'\n      // style[mxConstants.STYLE_INDICATOR_SHAPE] = 'ellipse'\n      // style[mxConstants.STYLE_INDICATOR_WIDTH] = 34\n      // style[mxConstants.STYLE_INDICATOR_HEIGHT] = 34\n      style[mxConstants.STYLE_IMAGE_VERTICAL_ALIGN] = 'bottom' // indicator v-alignment\n      style[mxConstants.STYLE_IMAGE_ALIGN] = 'bottom'\n      style[mxConstants.STYLE_INDICATOR_COLOR] = 'green'\n      style[mxConstants.STYLE_FONTCOLOR] = 'red'\n      style[mxConstants.STYLE_FONTSIZE] = '10'\n      delete style[mxConstants.STYLE_STROKECOLOR] // transparent\n      // delete style[mxConstants.STYLE_FILLCOLOR] // transparent\n\n      // make the component images larger by reducing the denominator and smaller by increasing the denominator\n      width = width / default_scale\n      height = height / default_scale\n\n      if (centerCoords) {\n        if (rotation !== 0 && (rotation / 90) % 2 !== 0) {\n          x = x - height / 2\n          y = y - width / 2\n        } else {\n          x = x - width / 2\n          y = y - height / 2\n        }\n      }\n\n      const v1 = graph.insertVertex(\n        parent,\n        null,\n        component.name,\n        x,\n        y,\n        width,\n        height,\n        'shape=image;fontColor=blue;image=' + path + ';imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;'\n      )\n      v1.Component = true\n      /* var newsource = path\n      var prefix = newsource.split('/')\n      var symboltype = prefix[3].split('') */\n      v1.CellType = 'Component'\n      v1.symbol = component.symbol_prefix.toUpperCase()\n      v1.CompObject = component\n\n      component.name = component.name.toUpperCase()\n      var props = {}\n      if (v1.symbol === 'V') {\n        // console.log('voltage')\n\n        if (ComponentParameters[v1.symbol][component.name] === undefined) {\n          props = Object.assign({}, ComponentParameters[v1.symbol].VSOURCE)\n        } else {\n          props = Object.assign({}, ComponentParameters[v1.symbol][component.name])\n        }\n      } else if (v1.symbol === 'I') {\n        // console.log('CURRENT')\n        if (ComponentParameters[v1.symbol][component.name] === undefined) {\n          props = Object.assign({}, ComponentParameters[v1.symbol].ISOURCE)\n        } else {\n          props = Object.assign({}, ComponentParameters[v1.symbol][component.name])\n        }\n      } else {\n        // console.log('other')\n\n        props = Object.assign({}, ComponentParameters[v1.symbol])\n      }\n      props.NAME = component.name\n      v1.properties = props\n      // console.log('component', component)\n      // console.log('v1.properties', v1.properties)\n\n      v1.setConnectable(false)\n      let i = 0\n      for (i = 0; i < pinData.length; i++) {\n        currentPin = pinData[i]\n        if (currentPin.pinName === 'NC') continue\n        // move this to another file\n        x_pos = (parseInt(width) / 2 + parseInt(currentPin.pinX) / default_scale)\n        y_pos = (parseInt(height) / 2 - parseInt(currentPin.pinY) / default_scale) - 1\n\n        // move this to another file\n        // eslint-disable-next-line\n\n        if (currentPin.pinOrientation === 'L') {\n          pins[i] = graph.insertVertex(v1, null, currentPin.pinNumber, x_pos, y_pos, 0.5, 0.5, 'align=right;verticalAlign=bottom;rotation=0')\n        } else if (currentPin.pinOrientation === 'R') {\n          pins[i] = graph.insertVertex(v1, null, currentPin.pinNumber, x_pos, y_pos, 0.5, 0.5, 'align=left;verticalAlign=bottom;rotation=0')\n        } else if (currentPin.pinOrientation === 'U') {\n          pins[i] = graph.insertVertex(v1, null, currentPin.pinNumber, x_pos, y_pos, 0.5, 0.5, 'align=right;verticalAlign=bottom;rotation=0')\n        } else {\n          pins[i] = graph.insertVertex(v1, null, currentPin.pinNumber, x_pos, y_pos, 0.5, 0.5, 'align=right;verticalAlign=up;rotation=0')\n        }\n        pins[i].geometry.relative = false\n        pins[i].Pin = true\n        if (currentPin.type === 'I') {\n          pins[i].pinType = 'Input'\n        } else {\n          pins[i].pinType = 'Output'\n        }\n        // pins[i].pinType = currentPin['type']\n        pins[i].ParentComponent = v1\n        pins[i].PinNumber = currentPin.pinNumber\n      }\n      if (rotation !== 0) { rotateCell(v1, rotation) }\n\n      return v1\n    })\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/Helper/ToolbarTools.js",
    "content": "/* eslint-disable no-unused-vars */\n/* eslint-disable camelcase */\n/* eslint-disable new-cap */\n/* eslint-disable */\nimport mxGraphFactory from 'mxgraph'\nimport store from '../../../redux/store'\nimport * as actions from '../../../redux/actions/actions'\nimport ComponentParameters from './ComponentParametersData'\nvar graph\nvar undoManager\n\nconst {\n  mxPrintPreview,\n  mxConstants,\n  mxRectangle,\n  mxUtils,\n  mxUndoManager,\n  mxEvent,\n  mxCodec,\n  mxCell,\n  mxMorphing,\n  mxPoint\n} = new mxGraphFactory()\n\nexport default function ToolbarTools(grid, unredo) {\n  graph = grid\n\n  undoManager = new mxUndoManager()\n  var listener = function (sender, evt) {\n    undoManager.undoableEditHappened(evt.getProperty('edit'))\n  }\n  graph.getModel().addListener(mxEvent.UNDO, listener)\n  graph.getView().addListener(mxEvent.UNDO, listener)\n}\n\n// Display mxGraph root (For development only)\nexport function dispGraph () {\n  if (graph) {\n    console.log('Graph Root', graph.getDefaultParent())\n    console.log('Current Cell', graph.getSelectionCell())\n  }\n}\n\n// SAVE\nexport function Save() {\n  XMLWireConnections()\n  var enc = new mxCodec(mxUtils.createXmlDocument())\n  var node = enc.encode(graph.getModel())\n  var value = mxUtils.getXml(node)\n  return value\n}\n\n// Function to clear undo/redo history\nexport function clearHistory() {\n  undoManager.clear()\n}\n\n// Func to check if wire change\nconst checkWireChange = (changes) => {\n  for (const change of changes) {\n    if (change.__proto__.constructor.name === 'mxTerminalChange') { return true }\n  }\n  return false\n}\n\n// UNDO\nexport function Undo() {\n  if (undoManager.indexOfNextAdd === 0) {\n    // Nothing to undo\n    return\n  } else if (checkWireChange(undoManager.history[undoManager.indexOfNextAdd - 1].changes)) {\n    // Found Wire\n    undoManager.undo()\n  } else if (undoManager.history[undoManager.indexOfNextAdd - 1].changes.length > 1) {\n    // Found Component\n    let undos = 1\n    for (let i = undoManager.indexOfNextAdd - 1; i >= 0; i--, undos++) {\n      if (undoManager.history[i].changes.length === 1\n        || checkWireChange(undoManager.history[i].changes)\n      ) { break }\n    }\n    while (undos !== 0) {\n      undoManager.undo()\n      undos--\n    }\n  } else if (undoManager.history[undoManager.indexOfNextAdd - 1].changes.length === 1) {\n    // Found Rotate/Move\n    let undos = 0\n    for (let i = undoManager.indexOfNextAdd - 1; i >= 0; i--, undos++) {\n      if (undoManager.history[i].changes.length !== 1) { break }\n    }\n    while (undos !== 0) {\n      undoManager.undo()\n      undos--\n    }\n  }\n  else {\n    // Default case !?\n    undoManager.undo()\n  }\n}\n\n// REDO\nexport function Redo() {\n  if (undoManager.indexOfNextAdd === undoManager.history.length) {\n    // Nothing to redo\n    return\n  } else if (checkWireChange(undoManager.history[undoManager.indexOfNextAdd].changes)) {\n    // Found Wire\n    undoManager.redo()\n  } else if (\n    undoManager.history[undoManager.indexOfNextAdd].changes.length === 1\n    && undoManager.history[undoManager.indexOfNextAdd].changes[0].__proto__.constructor.name === 'mxChildChange'\n  ) {\n    // Found Component\n    let redos = 1\n    for (let i = undoManager.indexOfNextAdd + 1; i < undoManager.history.length; i++, redos++) {\n      if (undoManager.history[i].changes.length === 12 ||\n        undoManager.history[i].changes.length === 1 ||\n        checkWireChange(undoManager.history[i].changes)\n      ) { break }\n    }\n    while (redos !== 0) {\n      undoManager.redo()\n      redos--\n    }\n  } else if (undoManager.history[undoManager.indexOfNextAdd].changes.length === 1) {\n    //Found component Rotate/Move\n    let redos = 1;\n    for (let i = undoManager.indexOfNextAdd + 1; i < undoManager.history.length; i++, redos++) {\n      if (undoManager.history[i].changes.length !== 1 ||\n        undoManager.history[i].changes[0].__proto__.constructor.name === 'mxChildChange'\n      ) { break }\n    }\n    while (redos !== 0) {\n      redos--\n      undoManager.redo()\n    }\n  } else {\n    // Default Case !?\n    undoManager.redo()\n  }\n}\n\n// Zoom IN\nexport function ZoomIn() {\n  graph.zoomIn()\n}\n\n// ZOOM OUT\nexport function ZoomOut() {\n  graph.zoomOut()\n}\n\n// ZOOM ACTUAL\nexport function ZoomAct() {\n  graph.zoomActual()\n}\n\n// DELETE COMPONENT\nexport function DeleteComp() {\n  graph.removeCells()\n}\n\n// CLEAR WHOLE GRID\nexport function ClearGrid() {\n  graph.removeCells(graph.getChildVertices(graph.getDefaultParent()))\n}\n\nexport function rotateCell (cell, rot_ang) {\n  var view = graph.getView()\n  var state = view.getState(cell, true)\n  var vHandler = graph.createVertexHandler(state)\n  console.log(cell)\n  if (cell != null) {\n    vHandler.rotateCell(cell, parseInt(rot_ang))\n    let childCount = cell.getChildCount()\n    for (let i = 0; i < childCount; i++) {\n      let child = cell.getChildAt(i)\n      vHandler.rotateCell(child, parseInt(rot_ang) * (-1))\n    }\n  }\n  vHandler.destroy()\n}\n\nfunction rotate (rot_ang) {\n  var cell = graph.getSelectionCell()\n  console.log(graph.getDefaultParent())\n  if (cell !== undefined) {\n    rotateCell(cell, rot_ang)\n  }\n}\n\n// ROTATE COMPONENT CLOCKWISE\nexport function Rotate() {\n  rotate(90)\n}\n\n// ROTATE COMPONENT Anti-CLOCKWISE\nexport function RotateACW() {\n  rotate(-90)\n}\n\n// PRINT PREVIEW OF SCHEMATIC\nexport function PrintPreview() {\n  // Matches actual printer paper size and avoids blank pages\n  var scale = 0.8\n  var headerSize = 50\n  var footerSize = 50\n\n  // Applies scale to page\n  var pageFormat = { x: 0, y: 0, width: 1169, height: 827 }\n  var pf = mxRectangle.fromRectangle(pageFormat || mxConstants.PAGE_FORMAT_A4_LANDSCAPE)\n  pf.width = Math.round(pf.width * scale * graph.pageScale)\n  pf.height = Math.round(pf.height * scale * graph.pageScale)\n\n  // Finds top left corner of top left page\n  var bounds = mxRectangle.fromRectangle(graph.getGraphBounds())\n  bounds.x -= graph.view.translate.x * graph.view.scale\n  bounds.y -= graph.view.translate.y * graph.view.scale\n\n  var x0 = Math.floor(bounds.x / pf.width) * pf.width\n  var y0 = Math.floor(bounds.y / pf.height) * pf.height\n\n  var preview = new mxPrintPreview(graph, scale, pf, 0, -x0, -y0)\n  preview.marginTop = headerSize * scale * graph.pageScale\n  preview.marginBottom = footerSize * scale * graph.pageScale\n  preview.autoOrigin = false\n\n  var oldRenderPage = preview.renderPage\n  preview.renderPage = function (w, h, x, y, content, pageNumber) {\n    var div = oldRenderPage.apply(this, arguments)\n\n    var header = document.createElement('div')\n    header.style.position = 'absolute'\n    header.style.boxSizing = 'border-box'\n    header.style.fontFamily = 'Arial,Helvetica'\n    header.style.height = (this.marginTop - 10) + 'px'\n    header.style.textAlign = 'center'\n    header.style.verticalAlign = 'middle'\n    header.style.marginTop = 'auto'\n    header.style.fontSize = '12px'\n    header.style.width = '100%'\n    header.style.fontWeight = '100'\n\n    // Vertical centering for text in header/footer\n    header.style.lineHeight = (this.marginTop - 10) + 'px'\n\n    var footer = header.cloneNode(true)\n    var title = store.getState().saveSchematicReducer.title\n    mxUtils.write(header, title + ' - eSim on Cloud')\n    header.style.borderBottom = '1px solid blue'\n    header.style.top = '0px'\n\n    mxUtils.write(footer, 'Made with Schematic Editor - ' + pageNumber + ' - eSim on Cloud')\n    footer.style.borderTop = '1px solid blue'\n    footer.style.bottom = '0px'\n\n    div.firstChild.appendChild(footer)\n    div.firstChild.appendChild(header)\n\n    return div\n  }\n\n  preview.open()\n}\n\n// ERC CHECK FOR SCHEMATIC\nexport function ErcCheck() {\n  var list = graph.getModel().cells // mapping the grid\n  var vertexCount = 0\n  var errorCount = 0\n  var PinNC = 0\n  var stypes = 0\n  var ground = 0\n  var wirec = 0\n  for (var property in list) {\n    var cell = list[property]\n    if (cell.Component === true) {\n      for (var child in cell.children) {\n        var childVertex = cell.children[child]\n        if (childVertex.Pin === true && childVertex.edges === null) { // Checking if connections exist from a given pin\n          ++PinNC\n          ++errorCount\n        } else {\n          for (var w in childVertex.edges) {\n            if (childVertex.edges[w].source === null || childVertex.edges[w].target === null) {\n              ++PinNC\n            } else {\n              if (childVertex.edges[w].source.edge === true || childVertex.edges[w].target.edge === true) {\n                ++wirec\n              }\n            }\n          }\n        }\n      }\n      ++vertexCount\n    }\n    if (cell.symbol === 'PWR') { // Checking for ground\n      console.log('Ground is present')\n      console.log(cell)\n      ++ground\n    }\n  }\n\n  if (vertexCount === 0) {\n    alert('No Component added')\n    ++errorCount\n  } else if (PinNC !== 0) {\n    alert('Pins not connected')\n  } else if (ground === 0) {\n    alert('Ground not connected')\n  } else {\n    if (errorCount === 0) {\n      alert('ERC Check completed')\n    }\n  }\n}\n// ERC Check for Netlist, It also returns a boolean value which is called in the Netlist Generator \nexport function ErcCheckNets() {\n  var list = graph.getModel().cells // mapping the grid\n  var vertexCount = 0\n  var errorCount = 0\n  var PinNC = 0\n  var stypes = 0\n  var ground = 0\n  for (var property in list) {\n    var cell = list[property]\n    if (cell.Component === true) {\n      for (var child in cell.children) {\n        if (child.connectable) {\n          var childVertex = cell.children[child]\n          if (childVertex.Pin === true && childVertex.edges === null) {\n            graph.getSelectionCell(childVertex)\n            ++PinNC\n            ++errorCount\n          }\n        }\n      }\n      ++vertexCount\n    }\n    if (cell.symbol === 'PWR') {\n      ++ground\n    }\n  }\n  if (vertexCount === 0) {\n    alert('No Component added')\n    ++errorCount\n    return false\n  } else if (PinNC !== 0) {\n    alert('Pins not connected')\n    return false\n  } else if (ground === 0) {\n    alert('Ground not connected')\n    return false\n  } else {\n    if (errorCount === 0) {\n      return true\n    }\n  }\n}\n\n// Function to generate Netlist\nexport function GenerateNetList() {\n\n  var r = 1\n  var v = 1\n  var c = 1\n  var n = 1\n  var spiceModels = ''\n  var compDetails = {\n    componentlist: [],\n    nodelist: new Set()\n  }\n  var erc = ErcCheckNets() // Checking for ERC Failures\n  var k = ''\n  if (erc === false) {\n    alert('ERC check failed')\n  } else {\n    var list = annotate(graph) // Fetching all the Cells on the GRID\n    for (var property in list) {\n      if (list[property].Component === true && list[property].symbol !== 'PWR') {\n        var compobj = {\n          name: '',\n          magnitude: ''\n        }\n        // mxCell.prototype.ConnectedNode = null\n        var component = list[property]\n        if (component.symbol === 'R') {\n          k = k + component.symbol + r.toString()\n          component.value = component.symbol + r.toString()\n          component.properties.PREFIX = component.value\n\n          ++r\n        } else if (component.symbol === 'V') {\n          k = k + component.symbol + v.toString()\n          component.value = component.symbol + v.toString()\n          component.properties.PREFIX = component.value\n          ++v\n        } else {\n          k = k + component.symbol + c.toString()\n          component.value = component.symbol + c.toString()\n          component.properties.PREFIX = component.value\n          ++c\n        }\n\n        if (component.children !== null) {\n          for (var child in component.children) {\n            var pin = component.children[child]\n            if (pin.vertex === true && pin.connectable) {\n              if (pin.edges !== null || pin.edges.length !== 0) {\n                for (var wire in pin.edges) {\n                  if (pin.edges[wire].source !== null && pin.edges[wire].target !== null) {\n                    // Wire to Pin Connection \n                    if (pin.edges[wire].source.edge === true) {\n                    //   pin.edges[wire].node = pin.edges[wire].source.node\n                      pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                      pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                      // Pin to Wire Connection \n                    } else if (pin.edges[wire].target.edge === true) {\n                    //   pin.edges[wire].node = pin.edges[wire].target.node\n                      pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                      pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                      pin.edges[wire].tarx = pin.edges[wire].geometry.targetPoint.x\n                      pin.edges[wire].tary = pin.edges[wire].geometry.targetPoint.y\n                      // Souce or Target is Ground \n                    } else if (pin.edges[wire].source.ParentComponent.symbol === 'PWR' || pin.edges[wire].target.ParentComponent.symbol === 'PWR') {\n                    //   pin.edges[wire].node = 0\n                      pin.edges[wire].value = 0\n                      pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                      pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                      // Pin to Pin Connection, Setting the Source to be the Node Value \n                    } else {\n                    //   pin.edges[wire].node = pin.edges[wire].source.ParentComponent.properties.PREFIX + '.' + pin.edges[wire].source.value\n                      // pin.ConnectedNode = pin.edges[wire].source.ParentComponent.properties.PREFIX + '.' + pin.edges[wire].source.value\n                      pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                      pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                      pin.edges[wire].value = pin.edges[wire].node\n                    }\n                    pin.edges[wire].value = pin.edges[wire].node\n                  }\n                }\n                k = k + ' ' + pin.edges[0].node\n              }\n            }\n          }\n          compobj.name = component.symbol\n          compobj.magnitude = 10\n          var nodeNumber = 0\n          for(var child in component.children){\n              nodeNumber++\n              compobj['node' + nodeNumber.toString()] = component.children[child].edges[0].node\n              compDetails.nodelist.add(component.children[child].edges[0].node)\n          }\n          compDetails.componentlist.push(component.properties.PREFIX)\n          // console.log(\"compDetails\", compDetails)\n        }\n        // console.log('component properties', component.properties)\n        if (component.properties.MODEL && component.properties.MODEL.length > 0) {\n          k = k + ' ' + component.properties.MODEL.split(' ')[1]\n        }\n\n        if (component.properties.PREFIX.charAt(0) === 'V' || component.properties.PREFIX.charAt(0) === 'v' || component.properties.PREFIX.charAt(0) === 'I' || component.properties.PREFIX.charAt(0) === 'i') {\n          const comp = component.properties\n          if (comp.NAME === 'SINE') {\n            k = k + ` SIN(${comp.OFFSET} ${comp.AMPLITUDE} ${comp.FREQUENCY} ${comp.DELAY} ${comp.DAMPING_FACTOR} ${comp.PHASE} )`\n          } else if (comp.NAME === 'EXP') {\n            k = k + ` EXP(${comp.INITIAL_VALUE} ${comp.PULSED_VALUE} ${comp.FREQUENCY} ${comp.RISE_DELAY_TIME} ${comp.RISE_TIME_CONSTANT} ${comp.FALL_DELAY_TIME} ${comp.FALL_TIME_CONSTANT} )`\n          } else if (comp.NAME === 'DC') {\n            if (component.properties.VALUE !== undefined) {\n              k = k + ' DC ' + component.properties.VALUE\n              component.value = component.value + '\\n' + component.properties.VALUE\n            }\n          } else if (comp.NAME === 'PULSE') {\n            k = k + ` PULSE(${comp.INITIAL_VALUE} ${comp.PULSED_VALUE} ${comp.DELAY_TIME} ${comp.RISE_TIME} ${comp.FALL_TIME} ${comp.PULSE_WIDTH} ${comp.PERIOD} ${comp.PHASE} )`\n          } else {\n            if (component.properties.VALUE !== undefined) {\n              k = k + ' ' + component.properties.VALUE\n              component.value = component.value + '\\n' + component.properties.VALUE\n            }\n          }\n        } else if (component.properties.PREFIX.charAt(0) === 'C' || component.properties.PREFIX.charAt(0) === 'c') {\n          k = k + ' ' + component.properties.VALUE\n          if (component.properties.IC != 0) {\n            k = k + ' IC=' + component.properties.IC\n          }\n          component.value = component.value + '\\n' + component.properties.VALUE\n        } else if (component.properties.PREFIX.charAt(0) === 'L' || component.properties.PREFIX.charAt(0) === 'l') {\n          k = k + ' ' + component.properties.VALUE\n          if (component.properties.IC != 0) {\n            k = k + ' IC=' + component.properties.IC\n          }\n          if (component.properties.DTEMP != 27) {\n            k = k + ' dtemp=' + component.properties.DTEMP\n          }\n          component.value = component.value + '\\n' + component.properties.VALUE\n        } else if (component.properties.PREFIX.charAt(0) === 'M' || component.properties.PREFIX.charAt(0) === 'm') {\n          // k = k + ' ' + component.properties.VALUE   \n          if (component.properties.MULTIPLICITY_PARAMETER != 1) {\n            k = k + ' m=' + component.properties.MULTIPLICITY_PARAMETER\n          }\n          if (component.properties.DTEMP != 27) {\n            k = k + ' dtemp=' + component.properties.DTEMP\n          }\n          // component.value = component.value + '\\n' + component.properties.VALUE\n        } else if (component.properties.PREFIX.charAt(0) === 'Q' || component.properties.PREFIX.charAt(0) === 'q') {\n          // k = k + ' ' + component.properties.VALUE\n          if (component.properties.MULTIPLICITY_PARAMETER != 1) {\n            k = k + ' m=' + component.properties.MULTIPLICITY_PARAMETER\n          }\n          if (component.properties.DTEMP != 27) {\n            k = k + ' dtemp=' + component.properties.DTEMP\n          }\n          // component.value = component.value + '\\n' + component.properties.VALUE\n        } else if (component.properties.PREFIX.charAt(0) === 'R' || component.properties.PREFIX.charAt(0) === 'r') {\n          k = k + ' ' + component.properties.VALUE\n          if (component.properties.SHEET_RESISTANCE != 0) {\n            k = k + ' RSH=' + component.properties.SHEET_RESISTANCE\n          }\n          if (component.properties.FIRST_ORDER_TEMPERATURE_COEFF != 0) {\n            k = k + ' tc1=' + component.properties.FIRST_ORDER_TEMPERATURE_COEFF\n          }\n          if (component.properties.SECOND_ORDER_TEMPERATURE_COEFF != 0) {\n            k = k + ' tc2=' + component.properties.SECOND_ORDER_TEMPERATURE_COEFF\n          }\n          if (component.properties.PARAMETER_MEASUREMENT_TEMPERATURE != 27) {\n            k = k + ' TNOM=' + component.properties.PARAMETER_MEASUREMENT_TEMPERATURE\n          }\n          component.value = component.value + '\\n' + component.properties.VALUE\n        } else {\n          if (component.properties.VALUE !== undefined) {\n            k = k + ' ' + component.properties.VALUE\n            component.value = component.value + '\\n' + component.properties.VALUE\n          }\n        }\n\n        if (component.properties.EXTRA_EXPRESSION && component.properties.EXTRA_EXPRESSION.length > 0) {\n          k = k + ' ' + component.properties.EXTRA_EXPRESSION\n          component.value = component.value + ' ' + component.properties.EXTRA_EXPRESSION\n        }\n\n        if (component.properties.MODEL && component.properties.MODEL.length > 0) {\n          spiceModels += component.properties.MODEL + '\\n'\n        }\n\n        k = k + ' \\n'\n      }\n    }\n  }\n  store.dispatch({\n    type: actions.SET_MODEL,\n    payload: {\n      model: spiceModels\n    }\n  })\n  store.dispatch({\n    type: actions.SET_NETLIST,\n    payload: {\n      netlist: k\n    }\n  })\n  // Refresh the GRID to view the Node Values \n  graph.getModel().beginUpdate()\n  try {\n    graph.view.refresh()\n  } finally {\n    // Arguments are number of steps, ease and delay\n    var morph = new mxMorphing(graph, 20, 1.2, 20)\n    morph.addListener(mxEvent.DONE, function () {\n      graph.getModel().endUpdate()\n    })\n    morph.startAnimation()\n  }\n  var netobj = {\n    models: spiceModels,\n    main: k\n  }\n  return netobj\n}\n// Function to Annotate, TODO! It needs some polishing \nclass Stack {\n    constructor(){\n        this.data = [];\n        this.top = 0;\n    }\n    push(element) {\n      this.data[this.top] = element;\n      this.top = this.top + 1;\n    }\n   length() {\n      return this.top;\n   }\n   peek() {\n      return this.data[this.top-1];\n   }\n   isEmpty() {\n     return this.top === 0;\n   }\n   pop() {\n    if( this.isEmpty() === false ) {\n       this.top = this.top -1;\n       return this.data.pop(); // removes the last element\n     }\n   }\n   print() {\n      var top = this.top - 1; // because top points to index where new    element to be inserted\n      // console.log('printing working')\n      // console.log(this.data)\n      while(top >= 0) { // print upto 0th index\n          // console.log(this.data[top]);\n           top--;\n      }\n    }\n    reverse() {\n       this._reverse(this.top - 1 );\n    }\n    _reverse(index) {\n       if(index != 0) {\n          this._reverse(index-1);\n       }\n       console.log(this.data[index]);\n    }\n}\n\nfunction traverseWire(edge, vis) {\n  var ans = []\n  vis[edge.id] = 1\n  if (edge.target.vertex == true || edge.source.vertex == true) {\n    if (edge.target.vertex == true) { ans.push(edge.target) }\n    if (edge.source.vertex == true) { ans.push(edge.source) }\n    return ans;\n  } else {\n    vis[parseInt(edge.id)] = true\n    if (edge.edges && edge.edges.length > 0) {\n      edge.edges.forEach((elem) => {\n        ans = ans.concat(traverseWire(elem, vis))\n      })\n    } else {\n      if (edge.source.edge == true && !vis[edge.source.id]) {\n        ans = ans.concat(traverseWire(edge.source, vis))\n      }\n      if (edge.target.edge == true && !vis[edge.target.id]) {\n        ans = ans.concat(traverseWire(edge.target, vis))\n      }\n    }\n    return ans\n  }\n}\n\nfunction annotate(graph) {\n\n  var r = 1\n  var v = 1\n  var c = 1\n  var l = 1\n  var d = 1\n  var q = 1\n  var w = 1\n  var list = graph.getModel().cells\n  var n = 1\n  var erc = true\n  var k = ''\n  if (erc === false) {\n    alert('ERC check failed')\n  } else {\n    // DFS _________\n    var NODE_SETS = []\n    // console.log('dfs init')\n    var ptr = 1\n    var mp = Array(5000).fill(0)\n    NODE_SETS[0] = new Set() // Defining ground\n    for(var property in list){\n        if(list[property].Component === true && list[property].symbol !== 'PWR'){\n            mxCell.prototype.ConnectedNode = null\n            var component = list[property]\n            if (component.children !== null) {\n              // pins\n              for (var child in component.children) {\n                  var pin = component.children[child];\n                  \n                  if (pin != null &&  pin.vertex === true && pin.connectable) {\n                    if (pin.edges !== null || pin.edges.length !== 0) {\n                      if(mp[(pin.id)] === 1){                                \n                          continue                      \n                      }\n                      var stk = new Stack()\n                      var cur_node\n                      var cur_set = []\n                      var contains_gnd = 0                     \n                      \n                      stk.push(pin)      \n                      // console.log('exploring connected nodes of', pin)                    \n                      while(!stk.isEmpty()){\n                          cur_node = stk.peek()\n                          stk.pop();\n                          mp[cur_node.id] = 1\n                          cur_set.push(cur_node)\n                          stk.print()\n                          for (var wire in cur_node.edges) {\n                            // console.log(cur_node.edges[wire])\n                            if (cur_node.edges[wire].source !== null && cur_node.edges[wire].target !== null) {\n                              if (cur_node.edges[wire].target.ParentComponent !== null) {\n                                if(cur_node.edges[wire].target.ParentComponent.symbol === 'PWR'){\n                                    contains_gnd = 1\n                                }\n                              }\n                              if(cur_node.edges[wire].target.vertex == true){\n                                if (!mp[(cur_node.edges[wire].target.id)] && (cur_node.edges[wire].target.id !== cur_node.id)){\n                                  stk.push(cur_node.edges[wire].target)\n                                }\n                              }\n                              if(cur_node.edges[wire].source.vertex == true){\n                                if(!mp[(cur_node.edges[wire].source.id)] && (cur_node.edges[wire].source.id !== cur_node.id)){\n                                    stk.push(cur_node.edges[wire].source)\n                                }\n                              }\n                              // Checking for wires which are connected to another wire(s), Comment out \n                              // the if conditions below if edge connections malfunction\n                              var conn_vertices = [];\n                              if (cur_node.edges[wire].edges && cur_node.edges[wire].edges.length > 0) {\n                                for (const ed in cur_node.edges[wire].edges) {\n                                  if (!mp[cur_node.edges[wire].edges[ed].id]) {\n                                    conn_vertices = conn_vertices.concat(...traverseWire(cur_node.edges[wire].edges[ed], mp))\n                                  }\n                                }\n                              }\n                              if (cur_node.edges[wire].source.edge == true) {\n                                if (!mp[(cur_node.edges[wire].source.id)] && (cur_node.edges[wire].source.id !== cur_node.id)) {\n                                  conn_vertices = conn_vertices.concat(...traverseWire(cur_node.edges[wire].source, mp))\n                                }\n                              }\n                              if (cur_node.edges[wire].target.edge == true) {\n                                if (!mp[(cur_node.edges[wire].target.id)] && (cur_node.edges[wire].target.id !== cur_node.id)) {\n                                  conn_vertices = conn_vertices.concat(...traverseWire(cur_node.edges[wire].target, mp))\n                                }\n                              }\n                              // console.log(\"CONN EDGES\", conn_vertices)\n                              conn_vertices.forEach((elem) => {\n                                stk.push(elem)\n                              })\n                            }\n                          }\n                        if(contains_gnd === 1){\n                            for(var x in cur_set)\n                                NODE_SETS[0].add(cur_set[x])\n                        }\n                          // console.log(\"Set of nodes at same pot:\", cur_set)   \n                      }\n                    } \n                    if (!contains_gnd){\n                        NODE_SETS.push(new Set(cur_set))\n                    }\n                  }\n              }\n            }\n        }\n    }\n    // console.log('dfs end')\n    // console.log(\"Results after considering edges: \", NODE_SETS)\n    for (var property in list) {\n        if (list[property].Component === true && list[property].symbol !== 'PWR') {\n          mxCell.prototype.ConnectedNode = null\n          var component = list[property]\n          if (component.symbol === 'R') {\n            component.value = component.symbol + r.toString()\n            component.properties.PREFIX = component.value\n            ++r\n          } else if (component.symbol === 'V') {\n            component.value = component.symbol + v.toString()\n            component.properties.PREFIX = component.value\n            ++v\n          } else if (component.symbol === 'C') {\n            component.value = component.symbol + v.toString()\n            component.properties.PREFIX = component.value\n            ++c\n          } else if (component.symbol === 'D') {\n            component.value = component.symbol + v.toString()\n            component.properties.PREFIX = component.value\n            ++d\n          } else if (component.symbol === 'Q') {\n            component.value = component.symbol + v.toString()\n            component.properties.PREFIX = component.value\n            ++q\n          } else {\n            component.value = component.symbol + c.toString()\n            component.properties.PREFIX = component.value\n            ++w\n          }\n          if (component.children !== null) {\n            for (var child in component.children) {\n              var pin = component.children[child]\n              if (pin.vertex === true && pin.connectable) {\n                if (pin.edges !== null || pin.edges.length !== 0) {\n                // Search for pin in NODE_SET:\n                // assign: pin.edges[wire].node= \"NODE\" + $indexOfSet\n                NODE_SETS.forEach((e, i) => {\n                  var done = 0\n                  e.forEach((vertex) => {\n                    if (vertex.id == pin.id && done === 0) {\n                      if (i === 0) {\n                        pin.edges[wire].node = 0\n                        pin.ConnectedNode = 0\n                        pin.edges[wire].value = pin.edges[wire].node\n                      } else {\n                        pin.edges[wire].node = \"COM.\" + i.toString()\n                        pin.ConnectedNode = 'COM.' + i.toString() \n                        pin.edges[wire].value = pin.edges[wire].node\n                      }\n                      done = 1\n                      // console.log(\"VALUE SET TO \", pin.edges[wire].ConnectedNode)\n                    }\n                  })\n                })\n                k = k + ' ' + pin.edges[0].node\n                }\n              }\n            }\n        }\n      }\n    } \n  }\n  return list\n}\n\n// Returns all the Nodes present in the Schematic, Used for Simulation \nexport function GenerateNodeList() {\n  var list = annotate(graph)\n  // Using a Set to avoid duplicate Nodes \n  var nodelist = new Set()\n  for (var property in list) {\n    if (list[property].Component === true && list[property].symbol !== 'PWR') {\n      // Fetching all the nodes \n      var component = list[property]\n      if (component.children !== null) {\n        for(var child in component.children){\n            nodelist.add(component.children[child].edges[0].node)\n        }        \n      }\n    }\n  }\n  return nodelist\n}\n// Sends a list of components present in the netlist \nexport function GenerateCompList() {\n  var list = annotate(graph)\n  var a = []\n  var complist = [] // This will contain the list of Component Prefix\n  for (var property in list) {\n    if (list[property].Component === true && list[property].symbol !== 'PWR') {\n      var compobj = {\n        name: '',\n        magnitude: ''\n      }\n      var component = list[property]\n      compobj.name = component.symbol\n      var nodeNumber = 0\n      for(var child in component.children){\n          nodeNumber++\n          compobj['node' + nodeNumber.toString()] = component.children[child].edges[0].node\n      }\n      complist.push(component.properties.PREFIX)\n    }\n  }\n  return complist\n}\n// Sends a detailed list of components present in the netlist \nexport function GenerateDetailedCompList() {\n  var list = annotate(graph)\n  var a = []\n  var netlist = [] // This will contain the list of Component Prefix\n  var k = 'Unitled netlist \\n'\n  for (var property in list) {\n    if (list[property].Component === true && list[property].symbol !== 'PWR') {\n      var component = list[property]\n      netlist.push({name:component.properties.PREFIX,value:component.properties.VALUE,unit:component.properties.VALUE_UNIT})\n    }\n  }\n  return netlist\n}\n\n\n// Function to Render Circuit XML\nexport function renderXML() {\n  graph.view.refresh()\n  var xml = 'null'\n  var xmlDoc = mxUtils.parseXml(xml)\n  parseXmlToGraph(xmlDoc, graph)\n}\n// Function to Parse XML and Redraw on Grid\nexport function parseXmlToGraph(xmlDoc, graph) {\n  console.log(\"start loading\")\n  const cells = xmlDoc.documentElement.children[0].children\n  const parent = graph.getDefaultParent()\n  var v1\n  var yPos\n  var xPos\n  var props\n  var style = graph.getStylesheet().getDefaultVertexStyle()\n\n  style[mxConstants.STYLE_SHAPE] = 'label'\n  style[mxConstants.STYLE_VERTICAL_ALIGN] = 'bottom'\n  style[mxConstants.STYLE_IMAGE_VERTICAL_ALIGN] = 'bottom' // indicator v-alignment\n  style[mxConstants.STYLE_IMAGE_ALIGN] = 'bottom'\n  style[mxConstants.STYLE_INDICATOR_COLOR] = 'green'\n  style[mxConstants.STYLE_FONTCOLOR] = 'red'\n  style[mxConstants.STYLE_FONTSIZE] = '10'\n  delete style[mxConstants.STYLE_STROKECOLOR] // transparent\n  for (let i = 0; i < cells.length; i++) {\n    const cellAttrs = cells[i].attributes\n    if (cellAttrs.Component.value === '1') { // is component\n      const vertexName = cellAttrs.value.value\n      const style = cellAttrs.style.value\n      const vertexId = Number(cellAttrs.id.value)\n      const geom = cells[i].children[0].attributes\n      const xPos = Number(geom.x.value)\n      if (geom.y === undefined) {\n        yPos = 0\n      } else {\n        yPos = Number(geom.y.value)\n      }\n      const height = Number(geom.height.value)\n      const width = Number(geom.width.value)\n      v1 = graph.insertVertex(parent, vertexId, vertexName, xPos, yPos, width, height, style)\n      v1.symbol = cellAttrs.symbol.value\n      if (v1.symbol === 'V') {\n        try { props = Object.assign({}, ComponentParameters[v1.symbol][cells[i].children[2].attributes.NAME.value]) } catch (e) { props = Object.assign({}, ComponentParameters[v1.symbol][cells[i].children[1].attributes.NAME.value]) }\n      } else {\n        props = Object.assign({}, ComponentParameters[v1.symbol])\n      }\n      try { props.NAME = cells[i].children[2].attributes.NAME.value } catch (e) { props.NAME = cells[i].children[1].attributes.NAME.value }\n      v1.properties = props\n      v1.Component = true\n      v1.CellType = 'Component'\n      if (v1.properties.name === 'VSOURCE') {\n      }\n      for (var check in props) {\n        try { v1.properties[check] = cells[i].children[2].attributes[check].value } catch (e) { try { v1.properties[check] = cells[i].children[1].attributes[check].value } catch (e) { } }\n      }\n    } else if (cellAttrs.Pin.value === '1') {\n      const vertexName = cellAttrs.value.value\n      const style = cellAttrs.style.value\n      const vertexId = Number(cellAttrs.id.value)\n      const geom = cells[i].children[0].attributes\n      try { xPos = Number(geom.x.value) } catch (e) { xPos = 0 }\n      if (geom.y === undefined) {\n        yPos = 0\n      } else {\n        yPos = Number(geom.y.value)\n      }\n      const height = Number(geom.height.value)\n      const width = Number(geom.width.value)\n      var vp = graph.insertVertex(v1, vertexId, vertexName, xPos, yPos, 0.5, 0.5, style)\n      vp.ParentComponent = v1\n      vp.Pin = 1\n    } else if (cellAttrs.edge) { // is edge\n      const edgeId = Number(cellAttrs.id.value)\n      const source = Number(cellAttrs.sourceVertex.value)\n      const target = Number(cellAttrs.targetVertex.value)\n      var plist = cells[i].children[1].children\n      try {\n        if (source && target) {\n          var e = graph.insertEdge(parent, edgeId, null,\n            graph.getModel().getCell(source),\n            graph.getModel().getCell(target)\n          )\n        }\n        else {\n          var edge = graph.createEdge(parent, edgeId, null)\n          if (!source && !target)\n            var e = graph.addEdge(edge, parent)\n          if (!target)\n            var e = graph.addEdge(edge, parent, graph.getModel().getCell(source))\n          if(!source)\n            var e = graph.addEdge(edge, parent, graph.getModel().getCell(target))\n          e.geometry.targetPoint = new mxPoint(Number(cellAttrs.tarx.value), Number(cellAttrs.tary.value))\n        }\n        console.log(\"VERTEX\", e)\n\n        e.geometry.points = []\n        for (var a in cells[i].children[1].children) {\n          try {\n            e.geometry.points.push(new mxPoint(Number(plist[a].attributes.x.value), Number(plist[a].attributes.y.value)))\n          } catch (e) { }\n            graph.getModel().beginUpdate()\n          try {\n            graph.view.refresh()\n          } finally {\n            var morph = new mxMorphing(graph, 20, 1.2, 20)\n            morph.addListener(mxEvent.DONE, function () {\n              graph.getModel().endUpdate()\n            })\n            morph.startAnimation()\n          }\n        }\n        if (graph.getModel().getCell(target).edge === true) {\n          e.geometry.setTerminalPoint(new mxPoint(Number(cellAttrs.tarx.value), Number(cellAttrs.tary.value)), false)\n          graph.getModel().beginUpdate()\n          try {\n            graph.view.refresh()\n          } finally {\n            // Arguments are number of steps, ease and delay\n            morph = new mxMorphing(graph, 20, 1.2, 20)\n            morph.addListener(mxEvent.DONE, function () {\n              graph.getModel().endUpdate()\n            })\n            morph.startAnimation()\n          }\n        }\n      } catch (e) {\n      }\n    }\n  }\n  console.log(\"finish loading\")\n}\n\nexport function renderGalleryXML(xml) {\n  graph.removeCells(graph.getChildVertices(graph.getDefaultParent()))\n  graph.view.refresh()\n  var xmlDoc = mxUtils.parseXml(xml)\n  parseXmlToGraph(xmlDoc, graph)\n}\n// Certain Variables need to be Defined before Saving the Circuit, XML Wire Connections does that \nfunction XMLWireConnections() {\n  var erc = true\n  if (erc === false) {\n    alert('ERC check failed')\n  } else {\n    var list = graph.getModel().cells\n    for (var property in list) {\n      if (list[property].Component === true && list[property].symbol !== 'PWR') {\n        mxCell.prototype.ConnectedNode = null\n        var component = list[property]\n\n        if (component.children !== null) {\n          for (var child in component.children) {\n            var pin = component.children[child]\n            if (pin.vertex === true) {\n              try {\n                if (pin.edges !== null || pin.edges.length !== 0) {\n                  for (var wire in pin.edges) {\n                    if (pin.edges[wire].source == null || pin.edges[wire].target == null) {\n                      console.log(\"Here\")\n                      if (pin.edges[wire].geometry.targetPoint) {\n                        pin.edges[wire].tarx = pin.edges[wire].geometry.targetPoint.x\n                        pin.edges[wire].tary = pin.edges[wire].geometry.targetPoint.y\n                        pin.edges[wire].PointsArray = pin.edges[wire].geometry.points\n                      }\n                      if (pin.edges[wire].source.edge === true) {\n                        pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                        // pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                      } else {\n                        pin.edges[wire].node = pin.edges[wire].source.ParentComponent.properties.PREFIX + '.' + pin.edges[wire].source.value\n                        pin.ConnectedNode = pin.edges[wire].source.ParentComponent.properties.PREFIX + '.' + pin.edges[wire].source.value\n                        pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                        // pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                      }\n                    }\n                   \n                    if (pin.edges[wire].source !== null && pin.edges[wire].target !== null) {\n                      if (pin.edges[wire].source.edge === true) {\n                        pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                        pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                        pin.edges[wire].PointsArray = pin.edges[wire].geometry.points\n                      } else if (pin.edges[wire].target.edge === true) {\n                        pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                        pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                        pin.edges[wire].tarx = pin.edges[wire].geometry.targetPoint.x\n                        pin.edges[wire].tary = pin.edges[wire].geometry.targetPoint.y\n                        pin.edges[wire].PointsArray = pin.edges[wire].geometry.points\n                      } else if (pin.edges[wire].source.ParentComponent.symbol === 'PWR' || pin.edges[wire].target.ParentComponent.symbol === 'PWR') {\n                        pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                        pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                        pin.edges[wire].PointsArray = pin.edges[wire].geometry.points\n                      } else {\n                        pin.edges[wire].node = pin.edges[wire].source.ParentComponent.properties.PREFIX + '.' + pin.edges[wire].source.value\n                        pin.ConnectedNode = pin.edges[wire].source.ParentComponent.properties.PREFIX + '.' + pin.edges[wire].source.value\n                        pin.edges[wire].sourceVertex = pin.edges[wire].source.id\n                        pin.edges[wire].targetVertex = pin.edges[wire].target.id\n                        pin.edges[wire].PointsArray = pin.edges[wire].geometry.points\n                      }\n                    }\n                  }\n\n                }\n              } catch (e) { console.log('error') }\n            }\n          }\n\n        }\n\n      }\n    }\n  }\n\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/PropertiesSidebar.js",
    "content": "import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Hidden, List, ListItem, ListItemText, TextField, MenuItem, TextareaAutosize, IconButton, Collapse, Dialog, DialogTitle, DialogContent, Button } from '@material-ui/core'\nimport CreateNewFolderOutlinedIcon from '@material-ui/icons/CreateNewFolderOutlined'\nimport Popover from '@material-ui/core/Popover'\nimport Typography from '@material-ui/core/Typography'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { setSchDescription, saveSchematic } from '../../redux/actions/index'\nimport api from '../../utils/Api'\nimport VersionComponent from './VersionComponent'\nimport Canvg from 'canvg'\n\nimport './Helper/SchematicEditor.css'\n\nconst useStyles = makeStyles((theme) => ({\n  typography: {\n    padding: theme.spacing(2)\n  },\n  toolbar: {\n    minHeight: '90px'\n  },\n  pages: {\n    margin: theme.spacing(0, 0.7)\n  }\n}))\n\nconst pageSize = [\n  {\n    value: 'A1',\n    label: 'A1'\n  },\n  {\n    value: 'A2',\n    label: 'A2'\n  },\n  {\n    value: 'A3',\n    label: 'A3'\n  },\n  {\n    value: 'A4',\n    label: 'A4'\n  },\n  {\n    value: 'A5',\n    label: 'A5'\n  }\n]\n\nconst pageLayout = [\n  {\n    value: 'P',\n    label: 'Portrait'\n  },\n  {\n    value: 'L',\n    label: 'Landscape'\n  }\n]\n\n// Display grid size and orientation\nfunction GridProperties ({ gridRef }) {\n  const classes = useStyles()\n\n  const [gridSize, setGridSize] = React.useState('A4')\n  const [gridLayout, setGridLayout] = React.useState('L')\n\n  const handleSizeChange = (event) => {\n    setGridSize(event.target.value)\n    gridRef.current.className = 'grid-container ' + event.target.value + '-' + gridLayout\n  }\n\n  const handleLayoutChange = (event) => {\n    setGridLayout(event.target.value)\n    gridRef.current.className = 'grid-container ' + gridSize + '-' + event.target.value\n  }\n\n  return (\n    <>\n      <ListItem>\n        <ListItemText primary=\"Grid Properties\" />\n      </ListItem>\n      <ListItem style={{ padding: '10px 5px 15px 5px' }} divider>\n        <TextField\n          id=\"filled-select-currency\"\n          select\n          size='small'\n          className={classes.pages}\n          value={gridSize}\n          onChange={handleSizeChange}\n          helperText=\"Grid size\"\n          variant=\"outlined\"\n        >\n          {pageSize.map((option) => (\n            <MenuItem key={option.value} value={option.value}>\n              {option.label}\n            </MenuItem>\n          ))}\n        </TextField>\n        <TextField\n          id=\"grid-layout\"\n          select\n          size='small'\n          className={classes.pages}\n          value={gridLayout}\n          onChange={handleLayoutChange}\n          helperText=\"Grid Layout\"\n          variant=\"outlined\"\n        >\n          {pageLayout.map((option) => (\n            <MenuItem key={option.value} value={option.value}>\n              {option.label}\n            </MenuItem>\n          ))}\n        </TextField>\n      </ListItem>\n\n    </>\n  )\n}\nGridProperties.propTypes = {\n  gridRef: PropTypes.object.isRequired\n}\n\nexport default function PropertiesSidebar ({ gridRef, outlineRef }) {\n  const classes = useStyles()\n\n  const schSave = useSelector(state => state.saveSchematicReducer)\n\n  const [description, setDescription] = React.useState(schSave.description)\n  const [versions, setVersions] = React.useState(null)\n  const [branchOpen, setBranchOpen] = React.useState(null)\n  const [branchName, setBranchName] = React.useState('')\n  const [dialogOpen, setDialogOpen] = React.useState(false)\n\n  const [projectBranch, setProjectBranch] = React.useState(null)\n  const [projectVersion, setProjectVersion] = React.useState(null)\n\n  const [anchorEl, setAnchorEl] = React.useState(null)\n\n  const [popoverOpen, setPopoverOpen] = React.useState(null)\n\n  React.useEffect(() => {\n    const config = {\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded'\n      }\n    }\n    const token = localStorage.getItem('esim_token')\n    // If token available add to headers\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    if (window.location.href.split('?id=')[1] && !window.location.href.split('?id=')[1].includes('gallery')) {\n      api\n        .get(\n          'save/versions/' +\n          window.location.href.split('?id=')[1].substring(0, 36),\n          config\n        )\n        .then((resp) => {\n          if (resp.data.length > 0) {\n            setProjectBranch(resp.data[0].project_branch)\n            setProjectVersion(resp.data[0].project_version)\n          }\n          const versionsAccordingFreq = {}\n          resp.data.forEach((value) => {\n            const d = new Date(value.save_time)\n            value.full_time = d\n            value.date =\n              d.getDate() + '/' + parseInt(d.getMonth() + 1) + '/' + d.getFullYear()\n            value.time = d.getHours() + ':' + d.getMinutes()\n            if (d.getMinutes() < 10) {\n              value.time = d.getHours() + ':0' + d.getMinutes()\n            }\n            versionsAccordingFreq[value.branch] ? versionsAccordingFreq[value.branch].push(value) : versionsAccordingFreq[value.branch] = [value]\n          })\n          const versionsArray = Object.entries(versionsAccordingFreq)\n          for (let i = 0; i < versionsArray.length; i++) {\n            versionsArray[i][1].sort((a, b) => {\n              return b.full_time - a.full_time\n            })\n          }\n          versionsArray.sort((a, b) => {\n            return b[1][b[1].length - 1].full_time - a[1][a[1].length - 1].full_time\n          })\n          setVersions(versionsArray)\n          const temp = []\n          for (let j = 0; j < versionsArray.length; j++) {\n            if (decodeURI(window.location.href.split('branch=')[1]) === versionsArray[j][0]) { temp.push(true) } else { temp.push(false) }\n          }\n          const popoverTemp = new Array(versionsArray.length)\n          popoverTemp.fill(false)\n          setPopoverOpen(popoverTemp)\n          setBranchOpen(temp)\n        })\n        .catch((err) => {\n          console.log(err)\n        })\n    }\n  }, [])\n\n  const dispatch = useDispatch()\n\n  const getInputValues = (evt) => {\n    setDescription(`${evt.target.value}`)\n    dispatch(setSchDescription(evt.target.value))\n  }\n\n  async function exportImage (type) {\n    const svg = document.querySelector('#divGrid > svg').cloneNode(true)\n    svg.removeAttribute('style')\n    svg.setAttribute('width', gridRef.current.scrollWidth)\n    svg.setAttribute('height', gridRef.current.scrollHeight)\n    const canvas = document.createElement('canvas')\n    canvas.width = gridRef.current.scrollWidth\n    canvas.height = gridRef.current.scrollHeight\n    canvas.style.width = canvas.width + 'px'\n    canvas.style.height = canvas.height + 'px'\n    const images = svg.getElementsByTagName('image')\n    for (const image of images) {\n      const data = await fetch(image.getAttribute('xlink:href')).then((v) => {\n        return v.text()\n      })\n      image.removeAttribute('xlink:href')\n      image.setAttribute(\n        'href',\n        'data:image/svg+xml;base64,' + window.btoa(data)\n      )\n    }\n    const ctx = canvas.getContext('2d')\n    ctx.mozImageSmoothingEnabled = true\n    ctx.webkitImageSmoothingEnabled = true\n    ctx.msImageSmoothingEnabled = true\n    ctx.imageSmoothingEnabled = true\n    const pixelRatio = window.devicePixelRatio || 1\n    ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0)\n    return new Promise((resolve) => {\n      if (type === 'SVG') {\n        const svgdata = new XMLSerializer().serializeToString(svg)\n        resolve('<?xml version=\"1.0\" encoding=\"UTF-8\"?>' + svgdata)\n        return\n      }\n      const v = Canvg.fromString(ctx, svg.outerHTML)\n      v.render().then(() => {\n        let image = ''\n        if (type === 'JPG') {\n          const imgdata = ctx.getImageData(0, 0, canvas.width, canvas.height)\n          for (let i = 0; i < imgdata.data.length; i += 4) {\n            if (imgdata.data[i + 3] === 0) {\n              imgdata.data[i] = 255\n              imgdata.data[i + 1] = 255\n              imgdata.data[i + 2] = 255\n              imgdata.data[i + 3] = 255\n            }\n          }\n          ctx.putImageData(imgdata, 0, 0)\n          image = canvas.toDataURL('image/jpeg', 1.0)\n        } else {\n          if (type === 'PNG') {\n            image = canvas.toDataURL('image/png')\n          }\n        }\n        resolve(image)\n      })\n    })\n  }\n\n  const handleBranch = (branchName) => {\n    setDialogOpen(false)\n    exportImage('PNG').then((res) => {\n      console.log(schSave.project_id)\n      dispatch(saveSchematic(schSave.title, schSave.description, schSave.xmlData, res, true, branchName, setVersions, false, versions, branchOpen, setBranchOpen))\n    })\n    setBranchName('')\n  }\n\n  const handleClick = (index) => {\n    console.log(index)\n    let left = branchOpen.slice(0, index)\n    const right = branchOpen.slice(index + 1)\n    const temp = !branchOpen[index]\n    left.push(temp)\n    left = left.concat(right)\n    console.log(left)\n    setBranchOpen(left)\n  }\n\n  const handleDelete = (branchName, index) => {\n    const temp = popoverOpen\n    temp.fill(false)\n    setPopoverOpen(temp)\n    const config = {\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded'\n      }\n    }\n    const token = localStorage.getItem('esim_token')\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    const saveId = window.location.href.split('id=')[1].substr(0, 36)\n    api.delete(`/save/versions/${saveId}/${branchName}`, config).then(resp => {\n      const temp = versions.filter(version => version[0] !== branchName)\n      const tempBranch = branchOpen\n      tempBranch.splice(index, 1)\n      setBranchOpen(tempBranch)\n      setVersions(temp)\n      const tempPopover = popoverOpen.filter(popoverIndex => popoverIndex !== true)\n      setPopoverOpen(tempPopover)\n    }).catch(err => {\n      console.log(err)\n    })\n  }\n\n  const handleClickPopover = (e, index) => {\n    setAnchorEl(e.currentTarget)\n    let left = popoverOpen.slice(0, index)\n    const right = popoverOpen.slice(index + 1)\n    const temp = !popoverOpen[index]\n    left.push(temp)\n    left = left.concat(right)\n    setPopoverOpen(left)\n  }\n\n  const handleClosePopover = (index) => {\n    setAnchorEl(null)\n    let left = popoverOpen.slice(0, index)\n    const right = popoverOpen.slice(index + 1)\n    const temp = !popoverOpen[index]\n    left.push(temp)\n    left = left.concat(right)\n    setPopoverOpen(left)\n  }\n\n  const checkActiveOrProject = (branch) => {\n    if (decodeURI(window.location.href.split('branch=')[1]) === branch) return false\n    if (branch === projectBranch) return false\n    return true\n  }\n\n  const handleBranchName = (e) => {\n    setBranchName(e.target.value)\n  }\n\n  const handleDialogOpen = () => {\n    setDialogOpen(true)\n  }\n\n  const handleDialogClose = () => {\n    setBranchName('')\n    setDialogOpen(false)\n  }\n\n  return (\n    <>\n      <Hidden mdDown>\n        <div className={classes.toolbar} />\n      </Hidden>\n\n      <List>\n        <ListItem button divider>\n          <h2 style={{ margin: '5px' }}>Properties</h2>\n        </ListItem>\n        <div>\n          <GridProperties gridRef={gridRef} />\n\n          {/* Display component position box */}\n          <ListItem>\n            <ListItemText primary=\"Components Position\" />\n          </ListItem>\n          <ListItem style={{ padding: '0px' }} divider>\n            <div className=\"outline-container\" ref={outlineRef} id=\"outlineContainer\" />\n          </ListItem>\n\n          {/* Input form field for schematic description */}\n          <ListItem>\n            <ListItemText primary=\"Schematic Description\" />\n          </ListItem>\n          <ListItem style={{ padding: '0px 7px 7px 7px' }} divider>\n            <TextareaAutosize id='Description' label='Description' value={ schSave.description === '' ? description || '' : schSave.description } onChange={getInputValues} rowsMin={6} aria-label='Description' placeholder={'Add Schematic Description'} style={{ width: '100%', minWidth: '234px', maxHeight: '250px' }} />\n          </ListItem>\n        </div>\n      </List>\n      <List>\n        <ListItem button divider>\n          <h2 style={{ margin: '5px', width: '90%' }}>History</h2>\n          {versions && <IconButton\n            className=\"new-branch\"\n            size=\"small\"\n            onClick={handleDialogOpen}\n          >\n            <CreateNewFolderOutlinedIcon fontSize=\"small\" />\n          </IconButton>}\n          <Dialog onClose={handleDialogClose} aria-labelledby=\"simple-dialog-title\" open={dialogOpen}>\n            <DialogTitle id=\"simple-dialog-title\">Create new Variation</DialogTitle>\n            <DialogContent>\n              <TextField\n                id=\"branch-name\"\n                label=\"Variation Name\"\n                onChange={handleBranchName}\n                value={branchName}\n                style={{ width: '100%' }}/>\n              <br/>\n              <Button\n                style={{ marginTop: '20px', marginBottom: '10px' }}\n                variant=\"contained\"\n                color=\"primary\"\n                onClick={() => handleBranch(branchName) }>\n                Create Variation\n              </Button>\n            </DialogContent>\n          </Dialog>\n        </ListItem>\n        {(versions && branchOpen && popoverOpen)\n          ? <>\n            {versions.map((branch, index) => {\n              return (\n                <>\n                  <div style={{ display: 'flex' }}>\n                    <ListItem style={{ width: '80%' }} button onClick={() => handleClick(index)}>\n                      <ListItemText primary={'Variation ' + (versions.length - index) + ' : ' + branch[0]} />\n                    </ListItem>\n                    {checkActiveOrProject(branch[0]) &&\n                    <>\n                      <Button key={branch[0]} onClick={(e) => handleClickPopover(e, index)}>\n                        <DeleteIcon />\n                      </Button>\n                      <Popover\n                        open={popoverOpen[index]}\n                        anchorEl={anchorEl}\n                        onClose={() => handleClosePopover(index)}\n                        anchorOrigin={{\n                          vertical: 'bottom',\n                          horizontal: 'center'\n                        }}\n                        transformOrigin={{\n                          vertical: 'top',\n                          horizontal: 'center'\n                        }}\n                      >\n                        <Typography className={classes.typography}>\n                          <b>Are you sure you want to delete variation {branch[0]}?</b>\n                        </Typography>\n                        <Button style={{ marginLeft: '5%', backgroundColor: 'transparent' }} onClick={() => handleDelete(branch[0], index)}>\n                          Delete Variation\n                        </Button>\n                      </Popover>\n                    </>}\n                  </div>\n                  <Collapse in={branchOpen[index]} timeout=\"auto\" unmountOnExit>\n                    {\n                      branch[1].map((version) =>\n                        <VersionComponent\n                          key={version.name}\n                          name={version.name}\n                          date={version.date}\n                          time={version.time}\n                          save_id={version.save_id}\n                          version={version.version}\n                          branch={version.branch}\n                          setVersions={setVersions}\n                          setBranchOpen={setBranchOpen}\n                          projectBranch={projectBranch}\n                          projectVersion={projectVersion}\n                          ltiId={version.lti_id} />\n                      )\n                    }\n                  </Collapse>\n                </>\n              )\n            }\n            )\n            }\n          </>\n          : <ListItemText>No History Available</ListItemText>\n        }\n      </List>\n    </>\n  )\n}\n\nPropertiesSidebar.propTypes = {\n  gridRef: PropTypes.object.isRequired,\n  outlineRef: PropTypes.object.isRequired\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/RightSidebar.js",
    "content": "import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Drawer, Hidden, IconButton } from '@material-ui/core'\nimport HighlightOffIcon from '@material-ui/icons/HighlightOff'\nimport { makeStyles } from '@material-ui/core/styles'\n\nconst drawerWidth = 250\n\nconst useStyles = makeStyles((theme) => ({\n  drawer: {\n    [theme.breakpoints.up('lg')]: {\n      width: drawerWidth,\n      flexShrink: 0\n    }\n  },\n  drawerPaper: {\n    width: drawerWidth\n  }\n}))\n\n// Editor right side pane to display grid and component properties.\nexport default function RightSidebar ({ window, mobileOpen, mobileClose, children }) {\n  const classes = useStyles()\n\n  const container =\n    window !== undefined ? () => window().document.body : undefined\n\n  return (\n    <>\n      <nav className={classes.drawer} aria-label=\"mailbox folders\">\n        <Hidden xlUp implementation=\"css\">\n          <Drawer\n            container={container}\n            variant=\"temporary\"\n            open={mobileOpen}\n            anchor=\"right\"\n            onClose={mobileClose}\n            classes={{\n              paper: classes.drawerPaper\n            }}\n            ModalProps={{\n              keepMounted: true // Better open performance on mobile.\n            }}\n          >\n            <IconButton\n              onClick={mobileClose}\n              color=\"inherit\"\n              style={{ marginRight: '190px' }}\n            >\n              <HighlightOffIcon />\n            </IconButton>\n            {children}\n          </Drawer>\n        </Hidden>\n\n        <Hidden mdDown implementation=\"css\">\n          <Drawer\n            classes={{\n              paper: classes.drawerPaper\n            }}\n            anchor=\"right\"\n            variant=\"permanent\"\n            open\n          >\n            {children}\n          </Drawer>\n        </Hidden>\n      </nav>\n    </>\n  )\n}\n\nRightSidebar.propTypes = {\n  window: PropTypes.object,\n  mobileOpen: PropTypes.bool.isRequired,\n  mobileClose: PropTypes.func.isRequired,\n  children: PropTypes.element\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/SchematicToolbar.js",
    "content": "/* eslint-disable camelcase */\nimport React, { useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport Canvg from 'canvg'\nimport {\n  IconButton,\n  Tooltip,\n  Snackbar,\n  Select,\n  FormControl,\n  InputLabel\n} from '@material-ui/core'\nimport AddBoxOutlinedIcon from '@material-ui/icons/AddBoxOutlined'\nimport PlayCircleOutlineIcon from '@material-ui/icons/PlayCircleOutline'\nimport HelpOutlineIcon from '@material-ui/icons/HelpOutline'\nimport UndoIcon from '@material-ui/icons/Undo'\nimport RedoIcon from '@material-ui/icons/Redo'\nimport ZoomInIcon from '@material-ui/icons/ZoomIn'\nimport ZoomOutIcon from '@material-ui/icons/ZoomOut'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport SettingsOverscanIcon from '@material-ui/icons/SettingsOverscan'\nimport PrintOutlinedIcon from '@material-ui/icons/PrintOutlined'\nimport BugReportOutlinedIcon from '@material-ui/icons/BugReportOutlined'\nimport RotateRightIcon from '@material-ui/icons/RotateRight'\nimport BorderClearIcon from '@material-ui/icons/BorderClear'\nimport { makeStyles } from '@material-ui/core/styles'\nimport CloseIcon from '@material-ui/icons/Close'\nimport SaveOutlinedIcon from '@material-ui/icons/SaveOutlined'\nimport OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser'\nimport ClearAllIcon from '@material-ui/icons/ClearAll'\nimport CreateNewFolderOutlinedIcon from '@material-ui/icons/CreateNewFolderOutlined'\nimport ImageOutlinedIcon from '@material-ui/icons/ImageOutlined'\nimport SystemUpdateAltOutlinedIcon from '@material-ui/icons/SystemUpdateAltOutlined'\nimport LibraryAddRoundedIcon from '@material-ui/icons/LibraryAddRounded'\nimport Button from '@material-ui/core/Button'\nimport Menu from '@material-ui/core/Menu'\nimport MenuItem from '@material-ui/core/MenuItem'\nimport Icon from '@material-ui/core/Icon'\nimport { Link as RouterLink } from 'react-router-dom'\nimport queryString from 'query-string'\nimport { RotateLeft } from '@material-ui/icons'\nimport AddPhotoAlternateIcon from '@material-ui/icons/AddPhotoAlternate'\nimport { fetchRole } from '../../redux/actions/authActions'\n\nimport {\n  NetlistModal,\n  HelpScreen,\n  ImageExportDialog,\n  OpenSchDialog,\n  SelectLibrariesModal\n} from './ToolbarExtension'\nimport {\n  ZoomIn,\n  ZoomOut,\n  ZoomAct,\n  DeleteComp,\n  PrintPreview,\n  ErcCheck,\n  Rotate,\n  GenerateNetList,\n  Undo,\n  Redo,\n  Save,\n  ClearGrid,\n  RotateACW\n} from './Helper/ToolbarTools'\nimport {\n  toggleSimulate,\n  closeCompProperties,\n  setSchXmlData,\n  saveSchematic,\n  openLocalSch,\n  saveToGallery\n} from '../../redux/actions/index'\nimport CreateProject from '../Project/CreateProject'\nimport api from '../../utils/Api'\nimport { importSCHFile } from './Helper/KiCadFileUtils'\nimport SubmitResults from '../LTI/SubmitResults'\n\n// Req for Development\n// import CodeIcon from '@material-ui/icons/Code'\n// // eslint-disable-next-line\n// import { dispGraph } from './Helper/ToolbarTools'\n\nconst useStyles = makeStyles((theme) => ({\n  menuButton: {\n    marginLeft: 'auto',\n    marginRight: theme.spacing(0),\n    padding: theme.spacing(1),\n    [theme.breakpoints.up('lg')]: {\n      display: 'none'\n    }\n  },\n  tools: {\n    padding: theme.spacing(1),\n    margin: theme.spacing(0, 0.5),\n    color: '#262626'\n  },\n  pipe: {\n    fontSize: '1.45rem',\n    color: '#d6c4c2',\n    margin: theme.spacing(0, 1.5)\n  }\n}))\n\n// Notification snackbar to give alert messages\nfunction SimpleSnackbar ({ open, close, message }) {\n  return (\n    <div>\n      <Snackbar\n        anchorOrigin={{\n          vertical: 'bottom',\n          horizontal: 'left'\n        }}\n        open={open}\n        autoHideDuration={5000}\n        onClose={close}\n        message={message}\n        action={\n          <React.Fragment>\n            <IconButton\n              size=\"small\"\n              aria-label=\"close\"\n              color=\"inherit\"\n              onClick={close}\n            >\n              <CloseIcon fontSize=\"small\" />\n            </IconButton>\n          </React.Fragment>\n        }\n      />\n    </div>\n  )\n}\n\nSimpleSnackbar.propTypes = {\n  open: PropTypes.bool,\n  close: PropTypes.func,\n  message: PropTypes.string\n}\n\nexport default function SchematicToolbar ({\n  mobileClose,\n  gridRef,\n  ltiSimResult,\n  setLtiSimResult\n}) {\n  const classes = useStyles()\n  const netfile = useSelector((state) => state.netlistReducer)\n  const auth = useSelector((state) => state.authReducer)\n  const schSave = useSelector((state) => state.saveSchematicReducer)\n\n  const dispatch = useDispatch()\n  useEffect(() => {\n    dispatch(fetchRole())\n  }, [dispatch])\n  // Netlist Modal Control\n  const [open, setOpen] = React.useState(false)\n  const [netlist, genNetlist] = React.useState('')\n  const [ltiId, setLtiId] = React.useState('')\n  const [ltiUserId, setLtiUserId] = React.useState('')\n  const [ltiNonce, setLtiNonce] = React.useState('')\n  const [submissionDetails, setSubmissionDetails] = React.useState('')\n  const [submit, setSubmit] = React.useState(false)\n  const [results, setResults] = React.useState(false)\n  const [submitMessage, setSubmitMessage] = React.useState('')\n  const [saveId, setSaveId] = React.useState(null)\n  const [consumerKey, setConsumerKey] = React.useState('')\n  const [anchorEl, setAnchorEl] = React.useState(null)\n  const [initalSch, setIntialSch] = React.useState('')\n  const [modelSch, setModelSch] = React.useState('')\n  const [id, setId] = React.useState('')\n  // eslint-disable-next-line\n  const [scored, setScored] = React.useState(false)\n  const [ltiSimHistory, setLtiSimHistory] = React.useState([])\n  const [activeSimResult, setActiveSimResult] = React.useState(null)\n\n  useEffect(() => {\n    if (ltiSimResult && ltiId) {\n      api\n        .get(`simulation/history/lti/${ltiId}`)\n        .then((res) => {\n          res.data.map((ele, index) => {\n            ele.simulation_time = new Date(ele.simulation_time)\n            return 0\n          })\n          setLtiSimHistory(res.data)\n          setActiveSimResult(res.data[res.data.length - 1].id)\n        })\n        .catch((err) => {\n          console.log(err)\n        })\n      console.log('SIM RESULTS FOUND')\n      setLtiSimResult(false)\n    }\n    // eslint-disable-next-line\n  }, [ltiSimResult]);\n\n  const handleMenuClick = (event) => {\n    setAnchorEl(event.currentTarget)\n  }\n\n  const handleMenuClose = () => {\n    setAnchorEl(null)\n  }\n  const [shortCircuit, setshortCircuit] = React.useState(false)\n\n  const handleShortClose = (event, reason) => {\n    if (reason === 'clickaway') {\n      return\n    }\n    setshortCircuit(false)\n  }\n\n  const handleSave = (version, newSave, save_id) => {\n    if (!newSave) {\n      window.location =\n        '#/editor?id=' +\n        window.location.href.split('id=')[1].substr(0, 36) +\n        '&version=' +\n        version +\n        '&branch=' +\n        window.location.href.split('branch=')[1].substr(0)\n      window.location.reload()\n    } else {\n      window.location =\n        '#/editor?id=' + save_id + '&version=' + version + '&branch=master'\n      window.location.reload()\n    }\n  }\n\n  const handleSaveForLTI = (version, newSave, save_id) => {\n    setSaveId(save_id)\n  }\n\n  const handleChangeSim = (e) => {\n    if (e.target.value === null) {\n      setActiveSimResult(null)\n    } else {\n      setActiveSimResult(e.target.value)\n    }\n    setAnchorEl(null)\n  }\n\n  const handleClickOpen = () => {\n    const compNetlist = GenerateNetList()\n    let printToPlotControlBlock = ''\n    const ctrlblk = netfile.controlBlock.split('\\n')\n    for (let line = 0; line < ctrlblk.length; line++) {\n      if (ctrlblk[line].includes('print')) {\n        printToPlotControlBlock += 'plot '\n        let cleanCode = ctrlblk[line].split('print ')[1]\n        cleanCode = cleanCode.split('>')[0]\n        printToPlotControlBlock += cleanCode + '\\n'\n      } else {\n        printToPlotControlBlock += ctrlblk[line] + '\\n'\n      }\n    }\n    const netlist =\n      netfile.title +\n      '\\n\\n' +\n      compNetlist.models +\n      '\\n' +\n      compNetlist.main +\n      '\\n' +\n      netfile.controlLine +\n      '\\n' +\n      printToPlotControlBlock +\n      '\\n'\n\n    const checkNetlist = (netlist) => {\n      netlist = netlist.split('\\n')\n      for (let line = 0; line < netlist.length; line++) {\n        const splitLine = netlist[line].split(' ')\n        // Works only for components with 2 nodes\n        // For multiple nodes all nodes need to be checked with each other\n        if (splitLine[1] === splitLine[2] && splitLine.length >= 2) {\n          setshortCircuit(true)\n          return\n        }\n      }\n      setshortCircuit(false)\n    }\n\n    checkNetlist(compNetlist.main)\n    genNetlist(netlist)\n    setOpen(true)\n  }\n\n  useEffect(() => {\n    var url = queryString.parse(window.location.href.split('editor')[1])\n    setLtiId(url.lti_id)\n    setLtiNonce(url.lti_nonce)\n    setLtiUserId(url.lti_user_id)\n    setConsumerKey(url.consumer_key)\n    setId(url.id)\n    // eslint-disable-next-line\n  }, []);\n\n  useEffect(() => {\n    if (ltiId && id) {\n      api\n        .get(`lti/exist/${id}`)\n        .then((res) => {\n          if (res.data.secret_key) {\n            setScored(res.data.scored)\n          }\n        })\n        .catch((err) => console.log(err))\n    }\n    // eslint-disable-next-line\n  }, [ltiId]);\n\n  useEffect(() => {\n    if (consumerKey) {\n      console.log(schSave)\n      api\n        .get(`lti/exist/${id}`)\n        .then((res) => {\n          if (res.data.secret_key) {\n            setIntialSch(res.data.initial_schematic)\n            setModelSch(res.data.model_schematic)\n            setScored(res.data.scored)\n          }\n        })\n        .catch((err) => console.log(err))\n    }\n    // eslint-disable-next-line\n  }, [consumerKey]);\n\n  useEffect(() => {\n    if (saveId !== null) {\n      const body = {\n        schematic: saveId,\n        ltisession: {\n          id: ltiId,\n          user_id: ltiUserId,\n          oauth_nonce: ltiNonce\n        },\n        student_simulation: activeSimResult\n      }\n      console.log(body)\n      api\n        .post('lti/submit/', body)\n        .then((res) => {\n          console.log(res.data)\n          setSubmissionDetails(res.data)\n          setResults(true)\n          setSubmit(true)\n          setSubmitMessage(res.data.message)\n        })\n        .catch((err) => {\n          console.log(err)\n          setSubmit(true)\n          setSubmitMessage(\n            'There was an error while submitting. Please try again later!'\n          )\n        })\n    }\n    // eslint-disable-next-line\n  }, [saveId]);\n\n  const onSubmission = () => {\n    var xml = Save()\n    dispatch(setSchXmlData(xml))\n    var title = schSave.title\n    var description = schSave.description\n    exportImage('PNG').then((res) => {\n      dispatch(\n        saveSchematic(\n          title,\n          description,\n          xml,\n          res,\n          false,\n          null,\n          handleSaveForLTI,\n          true\n        )\n      )\n    })\n  }\n\n  const handleSubmitClose = () => {\n    setSubmit(false)\n  }\n\n  const handleClose = () => {\n    setOpen(false)\n  }\n\n  // Control Help dialog window\n  const [helpOpen, setHelpOpen] = React.useState(false)\n\n  const handleHelpOpen = () => {\n    setHelpOpen(true)\n  }\n\n  const handleHelpClose = () => {\n    setHelpOpen(false)\n  }\n\n  // handle Delete component\n  const handleDeleteComp = () => {\n    DeleteComp()\n    dispatch(closeCompProperties())\n  }\n\n  // handle Notification Snackbar\n  const [snacOpen, setSnacOpen] = React.useState(false)\n  const [message, setMessage] = React.useState('')\n\n  const handleSnacClick = () => {\n    setSnacOpen(true)\n  }\n\n  const handleSnacClose = (event, reason) => {\n    if (reason === 'clickaway') {\n      return\n    }\n    setSnacOpen(false)\n  }\n\n  const handleMenuOnClick = (e) => {\n    window.location.href = `/eda/#/editor?id=${e}&consumer_key=${consumerKey}`\n    window.location.reload()\n  }\n\n  // Image Export of Schematic Diagram\n  async function exportImage (type) {\n    const svg = document.querySelector('#divGrid > svg').cloneNode(true)\n    svg.removeAttribute('style')\n    svg.setAttribute('width', gridRef.current.scrollWidth)\n    svg.setAttribute('height', gridRef.current.scrollHeight)\n    const canvas = document.createElement('canvas')\n    canvas.width = gridRef.current.scrollWidth\n    canvas.height = gridRef.current.scrollHeight\n    canvas.style.width = canvas.width + 'px'\n    canvas.style.height = canvas.height + 'px'\n    const images = svg.getElementsByTagName('image')\n    for (const image of images) {\n      const data = await fetch(image.getAttribute('xlink:href')).then((v) => {\n        return v.text()\n      })\n      image.removeAttribute('xlink:href')\n      image.setAttribute(\n        'href',\n        'data:image/svg+xml;base64,' + window.btoa(data)\n      )\n    }\n    const ctx = canvas.getContext('2d')\n    ctx.mozImageSmoothingEnabled = true\n    ctx.webkitImageSmoothingEnabled = true\n    ctx.msImageSmoothingEnabled = true\n    ctx.imageSmoothingEnabled = true\n    const pixelRatio = window.devicePixelRatio || 1\n    ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0)\n    return new Promise((resolve) => {\n      if (type === 'SVG') {\n        const svgdata = new XMLSerializer().serializeToString(svg)\n        resolve('<?xml version=\"1.0\" encoding=\"UTF-8\"?>' + svgdata)\n        return\n      }\n      const v = Canvg.fromString(ctx, svg.outerHTML)\n      v.render().then(() => {\n        let image = ''\n        if (type === 'JPG') {\n          const imgdata = ctx.getImageData(0, 0, canvas.width, canvas.height)\n          for (let i = 0; i < imgdata.data.length; i += 4) {\n            if (imgdata.data[i + 3] === 0) {\n              imgdata.data[i] = 255\n              imgdata.data[i + 1] = 255\n              imgdata.data[i + 2] = 255\n              imgdata.data[i + 3] = 255\n            }\n          }\n          ctx.putImageData(imgdata, 0, 0)\n          image = canvas.toDataURL('image/jpeg', 1.0)\n        } else {\n          if (type === 'PNG') {\n            image = canvas.toDataURL('image/png')\n          }\n        }\n        resolve(image)\n      })\n    })\n  }\n\n  // Download JPEG, PNG exported Image\n  function downloadImage (data, type) {\n    const evt = new MouseEvent('click', {\n      view: window,\n      bubbles: false,\n      cancelable: true\n    })\n    const a = document.createElement('a')\n    const ext = type === 'PNG' ? '.png' : '.jpg'\n    a.setAttribute('download', schSave.title + '_eSim_on_cloud' + ext)\n    a.setAttribute('href', data)\n    a.setAttribute('target', '_blank')\n    a.dispatchEvent(evt)\n  }\n\n  // Download SVG image\n  function downloadText (data, options) {\n    const blob = new Blob(data, options)\n    const evt = new MouseEvent('click', {\n      view: window,\n      bubbles: false,\n      cancelable: true\n    })\n    const a = document.createElement('a')\n    a.setAttribute('download', schSave.title + '_eSim_on_cloud.svg')\n    a.href = URL.createObjectURL(blob)\n    a.target = '_blank'\n    a.setAttribute('target', '_blank')\n    a.dispatchEvent(evt)\n  }\n\n  const [imgopen, setImgOpen] = React.useState(false)\n\n  const handleImgClickOpen = () => {\n    setImgOpen(true)\n  }\n\n  const handleImgClose = (value) => {\n    setImgOpen(false)\n    if (value === 'SVG') {\n      exportImage('SVG').then((v) => {\n        downloadText([v], {\n          type: 'data:image/svg+xml;charset=utf-8;'\n        })\n      })\n    } else if (value === 'PNG') {\n      exportImage('PNG').then((v) => {\n        downloadImage(v, 'PNG')\n      })\n    } else if (value === 'JPG') {\n      exportImage('JPG').then((v) => {\n        downloadImage(v, 'JPG')\n      })\n    }\n  }\n\n  // handle Save Schematic onCloud\n  const handleSchSave = () => {\n    if (auth.isAuthenticated !== true) {\n      setMessage('You are not Logged In')\n      handleSnacClick()\n    } else {\n      const xml = Save()\n      dispatch(setSchXmlData(xml))\n      const title = schSave.title\n      const description = schSave.description\n      exportImage('PNG').then((res) => {\n        dispatch(\n          saveSchematic(title, description, xml, res, false, null, handleSave)\n        )\n      })\n      setMessage('Saved Successfully')\n      handleSnacClick()\n    }\n  }\n\n  // Handle Save to Gallery\n  const handleGalSave = () => {\n    if (auth.isAuthenticated !== true) {\n      setMessage('You are not Logged In')\n      handleSnacClick()\n    } else {\n      const xml = Save()\n      dispatch(setSchXmlData(xml))\n      const title = schSave.title\n      const description = schSave.description\n      exportImage('PNG').then((res) => {\n        dispatch(saveToGallery(title, description, xml, res))\n      })\n      setMessage('Saved To Gallery Successfully')\n      handleSnacClick()\n    }\n  }\n\n  // Save Schematics Locally\n  const handleLocalSchSave = () => {\n    const saveLocalData = {}\n    saveLocalData.data_dump = Save()\n    saveLocalData.title = schSave.title\n    saveLocalData.description = schSave.description\n    const json = JSON.stringify(saveLocalData)\n    const blob = new Blob([json], { type: 'octet/stream' })\n    const evt = new MouseEvent('click', {\n      view: window,\n      bubbles: false,\n      cancelable: true\n    })\n    const a = document.createElement('a')\n    a.setAttribute('download', schSave.title + '_eSim_on_cloud.json')\n    a.href = URL.createObjectURL(blob)\n    a.target = '_blank'\n    a.setAttribute('target', '_blank')\n    a.dispatchEvent(evt)\n  }\n\n  // Open Locally Saved Schematic\n  const handleLocalSchOpen = () => {\n    let obj = {}\n    const fileSelector = document.createElement('input')\n    fileSelector.setAttribute('type', 'file')\n    fileSelector.setAttribute('accept', 'application/JSON')\n    fileSelector.click()\n    fileSelector.addEventListener('change', function (event) {\n      const reader = new FileReader()\n      const filename = event.target.files[0].name\n      if (filename.slice(filename.length - 4) === 'json') {\n        reader.onload = onReaderLoad\n        reader.readAsText(event.target.files[0])\n      } else {\n        setMessage('Unsupported file type error ! Select valid file.')\n        handleSnacClick()\n      }\n    })\n    const onReaderLoad = function (event) {\n      obj = JSON.parse(event.target.result)\n      if (\n        obj.data_dump === undefined ||\n        obj.title === undefined ||\n        obj.description === undefined\n      ) {\n        setMessage('Unsupported file error !')\n        handleSnacClick()\n      } else {\n        dispatch(openLocalSch(obj))\n      }\n    }\n  }\n\n  const handleKicadFileUpload = () => {\n    const fileSelector = document.createElement('input')\n    fileSelector.setAttribute('type', 'file')\n    fileSelector.setAttribute('accept', '.sch')\n    fileSelector.click()\n    fileSelector.addEventListener('change', function (event) {\n      var reader = new FileReader()\n      var filename = event.target.files[0].name\n      if (filename.slice(filename.length - 3) === 'sch') {\n        reader.onload = async (e) => {\n          importSCHFile(e.target.result)\n        }\n        reader.readAsText(event.target.files[0])\n      }\n    })\n  }\n\n  // Control Help dialog window open and close\n  const [schOpen, setSchOpen] = React.useState(false)\n\n  const handleSchDialOpen = () => {\n    setSchOpen(true)\n  }\n\n  const handleSchDialClose = () => {\n    setSchOpen(false)\n  }\n\n  const [libsOpen, setlibsOpen] = React.useState(false)\n\n  const handleLibOpen = () => {\n    setlibsOpen(true)\n  }\n\n  const handleLibClose = () => {\n    setlibsOpen(false)\n  }\n\n  // Shortcuts that cant be put in Helper/KeyboardShortcuts.js\n  useEffect(() => {\n    function shrtcts (event) {\n      // Save - Ctrl + S\n      if (event.ctrlKey && event.keyCode === 83) {\n        event.preventDefault()\n        handleSchSave()\n      }\n      // Print - Ctrl + P\n      if (event.ctrlKey && event.keyCode === 80) {\n        event.preventDefault()\n        PrintPreview()\n      }\n      // Open dialog - Ctrl + O\n      if (event.ctrlKey && event.keyCode === 79) {\n        event.preventDefault()\n        handleSchDialOpen()\n      }\n      // Export - Ctrl + E / Image Export Ctrl + Shift + E\n      if (event.ctrlKey && event.keyCode === 69) {\n        event.preventDefault()\n        if (event.shiftKey) {\n          handleImgClickOpen()\n        } else {\n          handleLocalSchSave()\n        }\n      }\n    }\n\n    window.addEventListener('keydown', shrtcts)\n\n    return () => {\n      window.addEventListener('keydown', shrtcts)\n    }\n    // eslint-disable-next-line\n  }, []);\n\n  return (\n    <>\n      <SimpleSnackbar\n        message={'Possible short-circuit detected. Please recheck'}\n        open={shortCircuit}\n        close={handleShortClose}\n      />\n\n      {(!ltiId || !ltiNonce) && <Tooltip title=\"New\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          target=\"_blank\"\n          component={RouterLink}\n          to=\"/editor\"\n        >\n          <CreateNewFolderOutlinedIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>}\n      {(!ltiId || !ltiNonce) && <Tooltip title=\"Open (Ctrl + O)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={handleSchDialOpen}\n        >\n          <OpenInBrowserIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>}\n      {(!ltiId || !ltiNonce) && <OpenSchDialog\n        open={schOpen}\n        close={handleSchDialClose}\n        openLocal={handleLocalSchOpen}\n        openKicad={handleKicadFileUpload}\n      />}\n      {(!ltiId || !ltiNonce) && <Tooltip title=\"Save (Ctrl + S)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={handleSchSave}\n        >\n          <SaveOutlinedIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>}\n      <SimpleSnackbar\n        open={snacOpen}\n        close={handleSnacClose}\n        message={message}\n      />\n      {ltiId && ltiUserId && ltiNonce && ltiSimHistory && (\n        <div>\n          <FormControl\n            size=\"small\"\n            style={{ marginLeft: '1%', paddingBottom: '1%' }}\n            className={classes.formControl}\n          >\n            <InputLabel htmlFor=\"outlined-age-native-simple\">\n              See simulations\n            </InputLabel>\n            <Select\n              labelId=\"demo-simple-select-placeholder-label-label\"\n              id=\"demo-simple-select-placeholder-label\"\n              value={activeSimResult}\n              style={{ minWidth: '300px' }}\n              onChange={handleChangeSim}\n              label=\"Simulations\"\n              className={classes.selectEmpty}\n            >\n              {ltiSimHistory.map((sim) => {\n                return (\n                  <MenuItem key={sim.id} value={sim.id}>\n                    {sim.simulation_type} at{' '}\n                    {sim.simulation_time.toLocaleString()}\n                  </MenuItem>\n                )\n              })}\n            </Select>\n          </FormControl>\n        </div>\n      )}\n      {((ltiId && ltiUserId && ltiNonce) || consumerKey) &&\n        activeSimResult && (\n        <Tooltip title=\"Submit\">\n          <Button\n            size=\"small\"\n            variant=\"outlined\"\n            color=\"primary\"\n            className={classes.button}\n            endIcon={<Icon>send</Icon>}\n            onClick={onSubmission}\n          >\n          Submit\n          </Button>\n        </Tooltip>\n      )}\n      <span className={classes.pipe}>|</span>\n      {(!ltiId || !ltiNonce) && <Tooltip title=\"Export (Ctrl + E)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={handleLocalSchSave}\n        >\n          <SystemUpdateAltOutlinedIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>}\n      {(!ltiId || !ltiNonce) && <Tooltip title=\"Image Export (Ctrl + Shift + E)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={handleImgClickOpen}\n        >\n          <ImageOutlinedIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>}\n      {(!ltiId || !ltiNonce) && <ImageExportDialog open={imgopen} onClose={handleImgClose} />}\n      {(!ltiId || !ltiNonce) && <Tooltip title=\"Print Preview (Ctrl + P)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={PrintPreview}\n        >\n          <PrintOutlinedIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>}\n      {(!ltiId || !ltiNonce) && <span className={classes.pipe}>|</span>}\n\n      <Tooltip title=\"Simulate\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={() => {\n            dispatch(toggleSimulate())\n          }}\n        >\n          <PlayCircleOutlineIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <Tooltip title=\"Generate Netlist\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={handleClickOpen}\n        >\n          <BorderClearIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <NetlistModal open={open} close={handleClose} netlist={netlist} />\n      <Tooltip title=\"ERC Check\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={ErcCheck}\n        >\n          <BugReportOutlinedIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <Tooltip title=\"Select Libraries\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={handleLibOpen}\n        >\n          <LibraryAddRoundedIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <SelectLibrariesModal open={libsOpen} close={handleLibClose} />\n      <span className={classes.pipe}>|</span>\n\n      <Tooltip title=\"Undo (Ctrl + Z)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={Undo}\n        >\n          <UndoIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <Tooltip title=\"Redo (Ctrl + Shift + Z)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={Redo}\n        >\n          <RedoIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <Tooltip title=\"Rotate AntiClockWise (Alt + Left Arrow)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={RotateACW}\n        >\n          <RotateLeft fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <Tooltip title=\"Rotate ClockWise (Alt + Right Arrow)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={Rotate}\n        >\n          <RotateRightIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <span className={classes.pipe}>|</span>\n\n      <Tooltip title=\"Zoom In (Ctrl + +)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={ZoomIn}\n        >\n          <ZoomInIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <Tooltip title=\"Zoom Out (Ctrl + -)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={ZoomOut}\n        >\n          <ZoomOutIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <Tooltip title=\"Default Size (Ctrl + Y)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={ZoomAct}\n        >\n          <SettingsOverscanIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <span className={classes.pipe}>|</span>\n\n      <Tooltip title=\"Delete (Del)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={handleDeleteComp}\n        >\n          <DeleteIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <Tooltip title=\"Clear All (Shift + Del)\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={ClearGrid}\n        >\n          <ClearAllIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <Tooltip title=\"Help\">\n        <IconButton\n          color=\"inherit\"\n          className={classes.tools}\n          size=\"small\"\n          onClick={handleHelpOpen}\n        >\n          <HelpOutlineIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip>\n      <HelpScreen open={helpOpen} close={handleHelpClose} />\n      <span className={classes.pipe}>|</span>\n\n      {consumerKey && (\n        <>\n          <Button\n            size=\"small\"\n            color=\"primary\"\n            aria-controls=\"simple-menu\"\n            aria-haspopup=\"true\"\n            onClick={handleMenuClick}\n          >\n            See schematics\n          </Button>\n          <Menu\n            id=\"simple-menu\"\n            anchorEl={anchorEl}\n            keepMounted\n            open={Boolean(anchorEl)}\n            onClose={handleMenuClose}\n          >\n            <MenuItem onClick={() => handleMenuOnClick(modelSch)}>\n              Model Schematic\n            </MenuItem>\n            <MenuItem onClick={() => handleMenuOnClick(initalSch)}>\n              Student Schematic{' '}\n            </MenuItem>\n          </Menu>\n        </>\n      )}\n\n      <SubmitResults show={results} setResults={setResults} results={submissionDetails} />\n      <IconButton\n        color=\"inherit\"\n        aria-label=\"open drawer\"\n        edge=\"end\"\n        size=\"small\"\n        onClick={mobileClose}\n        className={classes.menuButton}\n      >\n        <AddBoxOutlinedIcon fontSize=\"small\" />\n      </IconButton>\n      {!ltiId && <CreateProject />}\n\n      <Snackbar\n        anchorOrigin={{\n          vertical: 'bottom',\n          horizontal: 'left'\n        }}\n        open={submit}\n        autoHideDuration={2000}\n        onClose={handleSubmitClose}\n        message={submitMessage}\n        action={\n          <>\n            <IconButton\n              size=\"small\"\n              aria-label=\"close\"\n              color=\"inherit\"\n              onClick={handleSubmitClose}\n            >\n              <CloseIcon fontSize=\"small\" />\n            </IconButton>\n          </>\n        }\n      />\n      {auth.roles && auth.roles.is_esim_staff && (\n        <Tooltip title=\"Add to Gallery\">\n          <IconButton\n            color=\"inherit\"\n            className={classes.tools}\n            size=\"small\"\n            onClick={handleGalSave}\n          >\n            <AddPhotoAlternateIcon fontSize=\"medium\" />\n          </IconButton>\n        </Tooltip>\n      )}\n\n      {/* <Tooltip title=\"Display MxGraph Root\">\n        <IconButton color=\"inherit\" className={classes.tools} size=\"small\" onClick={ () => dispGraph()}>\n          <CodeIcon fontSize=\"small\" />\n        </IconButton>\n      </Tooltip> */}\n    </>\n  )\n}\n\nSchematicToolbar.propTypes = {\n  mobileClose: PropTypes.func,\n  gridRef: PropTypes.object.isRequired,\n  ltiSimResult: PropTypes.string,\n  setLtiSimResult: PropTypes.string\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/SideComp.js",
    "content": "import React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { List, ListItemText, Tooltip, Popover } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport api from '../../utils/Api'\nimport Button from '@material-ui/core/Button'\nimport Snackbar from '@material-ui/core/Snackbar'\nimport CloseIcon from '@material-ui/icons/Close'\nimport IconButton from '@material-ui/core/IconButton'\n\nimport './Helper/SchematicEditor.css'\nimport { AddComponent } from './Helper/SideBar.js'\n\nconst useStyles = makeStyles((theme) => ({\n  popupInfo: {\n    margin: theme.spacing(1.5),\n    padding: theme.spacing(1.5),\n    border: '1px solid blue',\n    borderRadius: '5px'\n  }\n}))\n\nexport default function SideComp ({ isFavourite = false, favourite, setFavourite, component }) {\n  const classes = useStyles()\n  const imageRef = React.createRef()\n\n  const [openSnackbar, setOpenSnackbar] = React.useState(false)\n  const [anchorEl, setAnchorEl] = React.useState(null)\n  const [snackbarMessage, setSnackbarMessage] = React.useState(null)\n\n  const handleClick = (event) => {\n    setAnchorEl(event.currentTarget)\n  }\n  const handleClose = () => {\n    setAnchorEl(null)\n  }\n\n  const handleSnackbarClose = (event, reason) => {\n    if (reason === 'clickaway') {\n      return\n    }\n\n    setOpenSnackbar(false)\n  }\n\n  const open = Boolean(anchorEl)\n  const id = open ? 'simple-popover' : undefined\n\n  useEffect(() => {\n    // Function call to make components draggable\n    AddComponent(component, imageRef.current)\n    // eslint-disable-next-line\n  }, [])\n\n  useEffect(() => {\n    if (snackbarMessage !== null) { setOpenSnackbar(true) }\n  }, [snackbarMessage])\n\n  useEffect(() => {\n    if (openSnackbar === false) { setSnackbarMessage(null) }\n  }, [openSnackbar])\n\n  const addFavourite = (id) => {\n    const token = localStorage.getItem('esim_token')\n    const body = {\n      component: [id]\n    }\n    const config = {\n      headers: {\n        'Content-Type': 'application/json'\n      }\n    }\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    api.post('favouritecomponents', body, config).then(resp => {\n      setFavourite(resp.data.component)\n      setSnackbarMessage('Component is added to favourites successfully')\n    }).catch(err => {\n      console.log(err)\n    })\n    setAnchorEl(null)\n  }\n\n  const handleFavourite = (id) => {\n    if (favourite) {\n      var flag = 0\n      for (var i = 0; i < favourite.length; i++) {\n        if (favourite[i].id === id) {\n          flag = 1\n          break\n        }\n      }\n      if (!flag) {\n        addFavourite(id)\n      } else {\n        setSnackbarMessage('This component is already added to favourites')\n        setAnchorEl(null)\n      }\n    } else {\n      addFavourite(id)\n    }\n  }\n\n  const handleRemove = (id) => {\n    const token = localStorage.getItem('esim_token')\n    const config = {\n      headers: {\n        'Content-Type': 'application/json'\n      }\n    }\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    api.delete(`favouritecomponents/${id}`, config).then(resp => {\n      setFavourite(resp.data.component)\n    }).catch(err => {\n      console.log(err)\n    })\n    setAnchorEl(null)\n  }\n  return (\n    <div>\n      <Tooltip title={component.full_name + ' : ' + component.description} arrow>\n        {/* Display Image thumbnail in left side pane */}\n        <img ref={imageRef} className='compImage' src={'../' + component.svg_path} alt=\"Logo\" aria-describedby={id} onClick={handleClick} />\n      </Tooltip>\n\n      {/* Popover to display component information on single click */}\n      <Popover\n        id={id}\n        open={open}\n        className={classes.popup}\n        anchorEl={anchorEl}\n        onClose={handleClose}\n        anchorOrigin={{\n          vertical: 'bottom',\n          horizontal: 'center'\n        }}\n        transformOrigin={{\n          vertical: 'top',\n          horizontal: 'center'\n        }}\n      >\n        <List component=\"div\" className={classes.popupInfo} disablePadding dense >\n          <ListItemText>\n            <b>Component Name:</b> {component.name}\n          </ListItemText>\n\n          {component.description !== '' &&\n            <ListItemText>\n              <b>Description:</b> {component.description}\n            </ListItemText>\n          }\n          {\n            component.keyword !== '' &&\n            <ListItemText>\n              <b>Keywords:</b> {component.keyword}\n            </ListItemText>\n\n          }\n\n          {\n            component.data_link !== '' &&\n            <ListItemText>\n              <b>Datasheet:</b> <a href={component.data_link} rel=\"noopener noreferrer\" target='_blank' >{component.data_link}</a>\n            </ListItemText>\n          }\n\n          {!isFavourite && localStorage.getItem('esim_token') &&\n            <ListItemText>\n              <Button onClick={() => handleFavourite(component.id)}>Add to Favourites</Button>\n            </ListItemText>\n          }\n\n          {isFavourite && localStorage.getItem('esim_token') &&\n            <ListItemText>\n              <Button onClick={() => handleRemove(component.id)}>Remove from Favourites</Button>\n            </ListItemText>\n          }\n        </List>\n      </Popover>\n      <Snackbar\n        style={{ zIndex: 100 }}\n        anchorOrigin={{\n          vertical: 'bottom',\n          horizontal: 'left'\n        }}\n        open={openSnackbar}\n        autoHideDuration={2000}\n        onClose={handleSnackbarClose}\n        message={snackbarMessage}\n        action={\n          <>\n            <IconButton size=\"small\" aria-label=\"close\" color=\"inherit\" onClick={handleSnackbarClose}>\n              <CloseIcon fontSize=\"small\" />\n            </IconButton>\n          </>\n        }\n      />\n    </div>\n  )\n}\n\nSideComp.propTypes = {\n  component: PropTypes.object.isRequired,\n  isFavourite: PropTypes.bool,\n  setFavourite: PropTypes.func,\n  favourite: PropTypes.array\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/SimulationProperties.js",
    "content": "/* eslint-disable no-unused-vars */\nimport React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n  List,\n  Checkbox,\n  ListItem,\n  Button,\n  TextField,\n  ExpansionPanel,\n  ExpansionPanelSummary,\n  ExpansionPanelDetails,\n  Typography,\n  Divider,\n  Popover,\n  Tooltip,\n  Snackbar,\n  IconButton\n} from '@material-ui/core'\nimport queryString from 'query-string'\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore'\nimport MuiAlert from '@material-ui/lab/Alert'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { setControlLine, setControlBlock, setResultTitle, setResultGraph, setResultText, setNetlist } from '../../redux/actions/index'\nimport { GenerateNetList, GenerateNodeList, GenerateCompList, ErcCheckNets } from './Helper/ToolbarTools'\nimport SimulationScreen from '../Shared/SimulationScreen'\nimport { Multiselect } from 'multiselect-react-dropdown'\nimport Notice from '../Shared/Notice'\nimport api from '../../utils/Api'\n\nconst useStyles = makeStyles((theme) => ({\n  toolbar: {\n    minHeight: '90px'\n  },\n  pages: {\n    margin: theme.spacing(0, 1)\n  },\n  propertiesBox: {\n    width: '100%'\n  },\n  simulationOptions: {\n    margin: '0px',\n    padding: '0px',\n    width: '100%'\n  },\n  heading: {\n    fontSize: theme.typography.pxToRem(15),\n    fontWeight: theme.typography.fontWeightRegular\n  }\n}))\n\nfunction Alert (props) {\n  return <MuiAlert elevation={6} variant=\"filled\" {...props} />\n}\nexport default function SimulationProperties (props) {\n  const netfile = useSelector(state => state.netlistReducer)\n  const isSimRes = useSelector(state => state.simulationReducer.isSimRes)\n  const [taskId, setTaskId] = useState(null)\n  const dispatch = useDispatch()\n  const classes = useStyles()\n  const [nodeList, setNodeList] = useState([])\n  const [componentsList, setComponentsList] = useState([])\n  const [errMsg, setErrMsg] = useState('')\n  const [err, setErr] = useState(false)\n  const [error, setError] = useState(false)\n  const [warning, setWarning] = useState(false)\n  const [needParameters, setNeedParameters] = useState(false)\n  const [status, setStatus] = useState('')\n  const stats = { loading: 'loading', error: 'error', success: 'success' }\n  const [dcSweepcontrolLine, setDcSweepControlLine] = useState(props.dcSweepcontrolLine ? props.dcSweepcontrolLine : {\n    parameter: '',\n    sweepType: 'Linear',\n    start: '',\n    stop: '',\n    step: '',\n    parameter2: '',\n    start2: '',\n    stop2: '',\n    step2: ''\n  })\n  const [transientAnalysisControlLine, setTransientAnalysisControlLine] = useState(props.transientAnalysisControlLine ? props.transientAnalysisControlLine : {\n    start: '0',\n    stop: '',\n    step: '',\n    skipInitial: false\n  })\n\n  const [acAnalysisControlLine, setAcAnalysisControlLine] = useState(props.acAnalysisControlLine ? props.acAnalysisControlLine : {\n    input: 'dec',\n    start: '',\n    stop: '',\n    pointsBydecade: ''\n  })\n\n  const [tfAnalysisControlLine, setTfAnalysisControlLine] = useState(props.tfAnalysisControlLine ? props.tfAnalysisControlLine : {\n    outputNodes: false,\n    outputVoltageSource: '',\n    inputVoltageSource: ''\n  })\n\n  const [NoiseAnalysisControlLine, setNoiseAnalysisControlLine] = useState(props.NoiseAnalysisControlLine ? props.NoiseAnalysisControlLine : {\n    inputVoltageSource: '',\n    input: 'dec',\n    start: '',\n    stop: '',\n    pointsBydecade: '',\n    outputSpectrum: false\n  })\n\n  const [controlBlockParam, setControlBlockParam] = useState('')\n  const [simType, setSimType] = React.useState('')\n  let typeSimulation = ''\n\n  const handleControlBlockParam = (evt) => {\n    setControlBlockParam(evt.target.value)\n  }\n  const analysisNodeArray = []\n  const analysisCompArray = []\n  const nodeArray = []\n  const nodeNoiseArray = []\n  // const pushZero = (nodeArray) => {\n  //   nodeArray.push({ key: 0 })\n  // }\n\n  const onTabExpand = () => {\n    try {\n      setComponentsList(['', ...GenerateCompList()])\n      setNodeList(['', ...GenerateNodeList()])\n    } catch (err) {\n      setComponentsList([])\n      setNodeList([])\n      setWarning(true)\n    }\n  }\n\n  const handleDcSweepControlLine = (evt) => {\n    const value = evt.target.value\n\n    setDcSweepControlLine({\n      ...dcSweepcontrolLine,\n      [evt.target.id]: value\n    })\n  }\n\n  const handleTransientAnalysisControlLine = (evt) => {\n    const value = evt.target.value\n\n    setTransientAnalysisControlLine({\n      ...transientAnalysisControlLine,\n      [evt.target.id]: value\n    })\n  }\n  const handleTransientAnalysisControlLineUIC = (evt) => {\n    const value = evt.target.checked\n\n    setTransientAnalysisControlLine({\n      ...transientAnalysisControlLine,\n      [evt.target.id]: value\n    })\n  }\n\n  const handleAcAnalysisControlLine = (evt) => {\n    const value = evt.target.value\n\n    setAcAnalysisControlLine({\n      ...acAnalysisControlLine,\n      [evt.target.id]: value\n    })\n  }\n\n  const handleTfAnalysisControlLine = (evt) => {\n    const value = evt.target.value\n    setTfAnalysisControlLine({\n      ...tfAnalysisControlLine,\n      [evt.target.id]: value\n    })\n  }\n  const handleTfAnalysisControlLineNodes = (evt) => {\n    const value = evt.target.checked\n    setTfAnalysisControlLine({\n      ...tfAnalysisControlLine,\n      [evt.target.id]: value\n    })\n  }\n  const handleNoiseAnalysisControlLine = (evt) => {\n    const value = evt.target.value\n    setNoiseAnalysisControlLine({\n      ...NoiseAnalysisControlLine,\n      [evt.target.id]: value\n    })\n  }\n\n  const [simulateOpen, setSimulateOpen] = React.useState(false)\n  const handlesimulateOpen = () => {\n    setSimulateOpen(true)\n  }\n\n  const handleSimulateClose = () => {\n    setSimulateOpen(false)\n  }\n  const [simResult, setSimResult] = React.useState({})\n\n  const handleSimulationResult = (simResults) => {\n    setSimResult(simResults)\n  }\n\n  const acTypeOptionList = {\n    Linear: 'lin',\n    Decade: 'dec',\n    Octave: 'oct'\n  }\n  const [selectedValue, setSelectedValue] = React.useState([])\n  const [selectedValueDCSweep, setSelectedValueDCSweep] = React.useState([])\n  const [selectedValueTransientAnal, setSelectedValueTransientAnal] = React.useState([])\n  const [selectedValueTFAnal, setSelectedValueTFAnal] = React.useState([])\n  const [selectedValueNoiseAnal, setSelectedValueNoiseAnal] = React.useState([])\n  const [selectedValueComp, setSelectedValueComp] = React.useState([])\n  const [selectedValueDCSweepComp, setSelectedValueDCSweepComp] = React.useState([])\n  const [selectedValueTransientAnalComp, setSelectedValueTransientAnalComp] = React.useState([])\n  const [selectedgraphNoiseComp, setSelectedgraphNoiseComp] = React.useState([])\n\n  const handleAddSelectedValueDCSweep = (data) => {\n    let f = 0\n    selectedValueDCSweep.forEach((value, i) => {\n      if (value[i] !== undefined) {\n        if (value[i].key === data) f = 1\n      }\n    })\n    if (f === 0) {\n      const tmp = [...selectedValueDCSweep, data]\n      setSelectedValueDCSweep(tmp)\n    }\n    // console.log(selectedValue)\n  }\n  const handleRemSelectedValueDCSweep = (data) => {\n    const tmp = []\n    selectedValueDCSweep.forEach((value, i) => {\n      if (value[i] !== undefined) {\n        if (value[i].key !== data) tmp.push(data)\n      }\n    })\n    setSelectedValueDCSweep(tmp)\n    // console.log(selectedValue)\n  }\n  const handleAddSelectedValueTransientAnal = (data) => {\n    let f = 0\n    selectedValueTransientAnal.forEach((value, i) => {\n      if (value[i] !== undefined) {\n        if (value[i].key === data) f = 1\n      }\n    })\n    if (f === 0) {\n      const tmp = [...selectedValueTransientAnal, data]\n      setSelectedValueTransientAnal(tmp)\n    }\n    // console.log(selectedValue)\n  }\n  const handleRemSelectedValueTransientAnal = (data) => {\n    const tmp = []\n    selectedValueTransientAnal.forEach((value, i) => {\n      if (value[i] !== undefined) {\n        if (value[i].key !== data) tmp.push(data)\n      }\n    })\n    setSelectedValueTransientAnal(tmp)\n    // console.log(selectedValue)\n  }\n  const handleAddSelectedValueTFAnal = (data) => {\n    let f = 0\n    selectedValueTFAnal.forEach((value, i) => {\n      if (value[i] !== undefined) {\n        if (value[i].key === data) f = 1\n      }\n    })\n    if (f === 0) {\n      const tmp = [...selectedValueTFAnal, data]\n      setSelectedValueTFAnal(tmp)\n    }\n    // console.log(selectedValue)\n  }\n  const handleRemSelectedValueTFAnal = (data) => {\n    const tmp = []\n    selectedValueTFAnal.forEach((value, i) => {\n      if (value[i] !== undefined) {\n        if (value[i].key !== data) tmp.push(data)\n      }\n    })\n    setSelectedValueTFAnal(tmp)\n    // console.log(selectedValue)\n  }\n  const handleAddSelectedValueNoiseAnal = (data) => {\n    let f = 0\n    selectedValueNoiseAnal.forEach((value, i) => {\n      if (value[i] !== undefined) {\n        if (value[i].key === data) f = 1\n      }\n    })\n    if (f === 0) {\n      const tmp = data\n      setSelectedValueNoiseAnal(tmp)\n    }\n  }\n  const handleRemSelectedValueNoiseAnal = (data) => {\n    setSelectedValueNoiseAnal(data)\n  }\n  const handleAddSelectedValueDCSweepComp = (data) => {\n    let f = 0\n    selectedValueDCSweepComp.forEach((value, i) => {\n      if (value[i] !== undefined) {\n        if (value[i].key === data) f = 1\n      }\n    })\n    if (f === 0) {\n      const tmp = [...selectedValueDCSweepComp, data]\n      setSelectedValueDCSweepComp(tmp)\n    }\n    // console.log(selectedValue)\n  }\n  const handleRemSelectedValueDCSweepComp = (data) => {\n    const tmp = []\n    selectedValueDCSweepComp.forEach((value, i) => {\n      if (value[i] !== undefined) {\n        if (value[i].key !== data) tmp.push(data)\n      }\n    })\n    setSelectedValueDCSweepComp(tmp)\n    // console.log(selectedValue)\n  }\n  const handleAddSelectedValueTransientAnalComp = (data) => {\n    let f = 0\n    selectedValueTransientAnalComp.forEach((value, i) => {\n      if (value[i] !== undefined) {\n        if (value[i].key === data) f = 1\n      }\n    })\n    if (f === 0) {\n      const tmp = [...selectedValueTransientAnalComp, data]\n      setSelectedValueTransientAnalComp(tmp)\n    }\n    // console.log(selectedValue)\n  }\n  const handleRemSelectedValueTransientAnalComp = (data) => {\n    const tmp = []\n    selectedValueTransientAnalComp.forEach((value, i) => {\n      if (value[i] !== undefined) {\n        if (value[i].key !== data) tmp.push(data)\n      }\n    })\n    setSelectedValueTransientAnalComp(tmp)\n    // console.log(selectedValue)\n  }\n  const handleNoiseOutputMode = (evt) => {\n    const value = evt.target.checked\n    setNoiseAnalysisControlLine({\n      ...NoiseAnalysisControlLine,\n      [evt.target.id]: value\n    })\n  }\n  const handleErrOpen = () => {\n    setErr(true)\n  }\n  const handleErrClose = () => {\n    setErr(false)\n  }\n  const handleErrMsg = (msg) => {\n    setErrMsg(msg)\n  }\n  const handleStatus = (status) => {\n    setStatus(status)\n  }\n  // Prepare Netlist to file\n  const prepareNetlist = (netlist) => {\n    const titleA = netfile.title.split(' ')[1]\n    const myblob = new Blob([netlist], {\n      type: 'text/plain'\n    })\n    const file = new File([myblob], `${titleA}.cir`, { type: 'text/plain', lastModified: Date.now() })\n    // console.log(file)\n    sendNetlist(file)\n  }\n\n  function sendNetlist (file) {\n    setIsResult(false)\n    netlistConfig(file)\n      .then((response) => {\n        const res = response.data\n        const getUrl = 'simulation/status/'.concat(res.details.task_id)\n        setTaskId(res.details.task_id)\n        simulationResult(getUrl)\n      })\n      .catch(function (error) {\n        console.log(error)\n      })\n  }\n\n  // Upload the nelist\n  function netlistConfig (file) {\n    const token = localStorage.getItem('esim_token')\n    const url = queryString.parse(window.location.href.split('editor?')[1])\n    const formData = new FormData()\n    formData.append('simulationType', typeSimulation)\n    formData.append('file', file)\n    if (url.id) {\n      formData.append('save_id', url.id)\n      formData.append('version', url.version)\n      formData.append('branch', url.branch)\n    }\n    if (url.lti_nonce) {\n      formData.append('lti_id', url.lti_id)\n    }\n    const config = {\n      headers: {\n        'content-type': 'multipart/form-data'\n      }\n    }\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    setSimType(typeSimulation)\n    return api.post('simulation/upload', formData, config)\n  }\n\n  const [isResult, setIsResult] = useState(false)\n\n  // Get the simulation result with task_Id\n  function simulationResult (url) {\n    let isError = false\n    let msg\n    let resPending = true // to stop immature opening of simulation screen\n    api\n      .get(url)\n      .then((res) => {\n        if (res.data.state === 'PROGRESS' || res.data.state === 'PENDING') {\n          handleStatus(stats.loading)\n          setTimeout(simulationResult(url), 1000)\n        } else if (Object.prototype.hasOwnProperty.call(res.data.details, 'fail')) {\n          resPending = false\n          setIsResult(false)\n          console.log('failed notif')\n          console.log(res.data.details)\n          msg = res.data.details.fail.replace(\"b'\", '')\n          isError = true\n          console.log(err)\n        } else {\n          const result = res.data.details\n          resPending = false\n          if (result === null) {\n            setIsResult(false)\n          } else {\n            const temp = res.data.details.data\n            const data = result.data\n            // console.log('DATA SIm', data)\n            if (res.data.details.graph === 'true') {\n              const simResultGraph = { labels: [], x_points: [], y_points: [] }\n              // populate the labels\n              for (let i = 0; i < data.length; i++) {\n                simResultGraph.labels[0] = data[i].labels[0]\n                const lab = data[i].labels\n                // lab is an array containeing labels names ['time','abc','def']\n                simResultGraph.x_points = data[0].x\n\n                // labels\n                for (let x = 1; x < lab.length; x++) {\n                  //   if (lab[x].includes('#branch')) {\n                  //     lab[x] = `I (${lab[x].replace('#branch', '')})`\n                  //   }\n                  //  uncomment below if you want label like V(r1.1) but it will break the graph showing time as well\n                  //  else {\n                  // lab[x] = `V (${lab[x]})`\n\n                  // }\n                  simResultGraph.labels.push(lab[x])\n                }\n                // populate y_points\n                for (let z = 0; z < data[i].y.length; z++) {\n                  simResultGraph.y_points.push(data[i].y[z])\n                }\n              }\n\n              simResultGraph.x_points = simResultGraph.x_points.map(d => parseFloat(d))\n\n              for (let i1 = 0; i1 < simResultGraph.y_points.length; i1++) {\n                simResultGraph.y_points[i1] = simResultGraph.y_points[i1].map(d => parseFloat(d))\n              }\n\n              dispatch(setResultGraph(simResultGraph))\n            } else {\n              const simResultText = []\n              for (let i = 0; i < temp.length; i++) {\n                let postfixUnit = ''\n                if (temp[i][0].includes('#branch')) {\n                  postfixUnit = 'A'\n                } else if (temp[i][0].includes('transfer_function')) {\n                  postfixUnit = ''\n                } else if (temp[i][0].includes('impedance')) {\n                  postfixUnit = 'Ohm'\n                } else {\n                  temp[i][0] = `V(${temp[i][0]})`\n                  postfixUnit = 'V'\n                }\n\n                simResultText.push(temp[i][0] + ' ' + temp[i][1] + ' ' + parseFloat(temp[i][2]) + ' ' + postfixUnit + '\\n')\n              }\n\n              handleSimulationResult(res.data.details)\n              dispatch(setResultText(simResultText))\n            }\n            setIsResult(true)\n            props.setLtiSimResult(true)\n          }\n        }\n      })\n      .then((res) => {\n        if (isError === false && resPending === false) {\n          console.log('no error')\n          handleStatus(stats.success)\n          handlesimulateOpen()\n        } else if (resPending === false) {\n          handleStatus(stats.error)\n          handleErrMsg(msg)\n        }\n        handleErrOpen()\n      })\n      .catch(function (error) {\n        console.log(error)\n      })\n  }\n\n  const startSimulate = (type) => {\n    if (ErcCheckNets() && componentsList !== [] && nodeList !== []) {\n      let compNetlist\n      try {\n        compNetlist = GenerateNetList()\n      } catch {\n        setError(true)\n        return\n      }\n      let controlLine = ''\n      let controlBlock = ''\n      let skipMultiNodeChk = 0\n      let nodes = ''\n      let uic = ''\n      let noiseMode = ''\n      switch (type) {\n        case 'DcSolver':\n          // console.log('To be implemented')\n          typeSimulation = 'DcSolver'\n          controlLine = '.op'\n\n          dispatch(setResultTitle('DC Solver Output'))\n          break\n        case 'DcSweep':\n          // console.log(dcSweepcontrolLine)\n          if (dcSweepcontrolLine.parameter !== '' && dcSweepcontrolLine.start !== '' && dcSweepcontrolLine.stop !== '' && dcSweepcontrolLine.step !== '') {\n            typeSimulation = 'DcSweep'\n            controlLine = `.dc ${dcSweepcontrolLine.parameter} ${dcSweepcontrolLine.start} ${dcSweepcontrolLine.stop} ${dcSweepcontrolLine.step} ${dcSweepcontrolLine.parameter2} ${dcSweepcontrolLine.start2} ${dcSweepcontrolLine.stop2} ${dcSweepcontrolLine.step2}`\n            dispatch(setResultTitle('DC Sweep Output'))\n            setSelectedValue(selectedValueDCSweep)\n            setSelectedValueComp(selectedValueDCSweepComp)\n          } else {\n            setNeedParameters(true)\n            return\n          }\n          break\n        case 'Transient':\n          // console.log(transientAnalysisControlLine)\n          if (transientAnalysisControlLine.step !== '' && transientAnalysisControlLine.start !== '' && transientAnalysisControlLine.start !== '') {\n            typeSimulation = 'Transient'\n            if (transientAnalysisControlLine.skipInitial === true) uic = 'UIC'\n            controlLine = `.tran ${transientAnalysisControlLine.step} ${transientAnalysisControlLine.stop} ${transientAnalysisControlLine.start} ${uic}`\n            dispatch(setResultTitle('Transient Analysis Output'))\n            setSelectedValue(selectedValueTransientAnal)\n            setSelectedValueComp(selectedValueTransientAnalComp)\n          } else {\n            setNeedParameters(true)\n            return\n          }\n          break\n        case 'Ac':\n          // console.log(acAnalysisControlLine)\n          if (acAnalysisControlLine.input !== '' && acAnalysisControlLine.pointsBydecade !== '' && acAnalysisControlLine.start !== '' && acAnalysisControlLine.stop !== '') {\n            typeSimulation = 'Ac'\n            controlLine = `.ac ${acAnalysisControlLine.input} ${acAnalysisControlLine.pointsBydecade} ${acAnalysisControlLine.start} ${acAnalysisControlLine.stop}`\n            dispatch(setResultTitle('AC Analysis Output'))\n          } else {\n            setNeedParameters(true)\n            return\n          }\n          break\n        case 'tfAnalysis':\n          if (tfAnalysisControlLine.inputVoltageSource !== '') {\n            typeSimulation = 'tfAnalysis'\n            setSelectedValue(selectedValueTFAnal)\n            if (tfAnalysisControlLine.outputNodes === true) {\n              selectedValue.forEach((value, i) => {\n                if (value[i] !== undefined) {\n                  nodes = nodes + ' ' + String(value[i].key)\n                }\n              })\n              nodes = 'V(' + nodes + ')'\n            } else {\n              nodes = `I(${tfAnalysisControlLine.outputVoltageSource})`\n            }\n            console.log(tfAnalysisControlLine.outputNodes)\n            controlLine = `.tf ${nodes} ${tfAnalysisControlLine.inputVoltageSource}`\n\n            dispatch(setResultTitle('Transfer Function Analysis Output'))\n            skipMultiNodeChk = 1\n          } else {\n            setNeedParameters(true)\n            return\n          }\n          break\n        case 'noiseAnalysis':\n          // console.log('Start noise analysis simulation', selectedValueNoiseAnal, NoiseAnalysisControlLine)\n          typeSimulation = 'noiseAnalysis'\n          var node1 = selectedValueNoiseAnal[0].key\n          var node2 = '0'\n          if (selectedValueNoiseAnal.length > 1) {\n            node2 = selectedValueNoiseAnal[1].key\n          }\n          if (NoiseAnalysisControlLine.inputVoltageSource && NoiseAnalysisControlLine.pointsBydecade && NoiseAnalysisControlLine.input && NoiseAnalysisControlLine.start && NoiseAnalysisControlLine.stop) {\n            controlLine = `.noise v(${node1}, ${node2}) ${NoiseAnalysisControlLine.inputVoltageSource} ${NoiseAnalysisControlLine.input} ${NoiseAnalysisControlLine.pointsBydecade} ${NoiseAnalysisControlLine.start} ${NoiseAnalysisControlLine.stop}`\n            noiseMode = NoiseAnalysisControlLine.outputSpectrum ? 'setplot noise1' : 'setplot noise2'\n            dispatch(setResultTitle('Noise Analysis Output'))\n          } else {\n            setNeedParameters(true)\n            return\n          }\n          break\n        default:\n          break\n      }\n      // console.log(selectedValue)\n      let atleastOne = 0\n      let cblockline = ''\n      // if either the extra expression field or the nodes multi select\n      // drop down list in enabled then atleast one value is made non zero\n      // to add add all instead to the print statement.\n      if (selectedValue.length > 0 && selectedValue !== null && skipMultiNodeChk === 0) {\n        selectedValue.forEach((value, i) => {\n          if (value[i] !== undefined && value[i].key !== 0) {\n            atleastOne = 1\n            cblockline = cblockline + ' ' + String(value[i].key)\n          }\n        })\n      }\n      if (selectedValueComp.length > 0 && selectedValueComp !== null) {\n        selectedValueComp.forEach((value, i) => {\n          if (value[i] !== undefined && value[i].key !== 0) {\n            atleastOne = 1\n            if (value[i].key.charAt(0) === 'V' || value[i].key.charAt(0) === 'v') {\n              cblockline = cblockline + ' I(' + String(value[i].key) + ') '\n            }\n          }\n        })\n      }\n      if (controlBlockParam.length > 0) {\n        cblockline = cblockline + ' ' + controlBlockParam\n        atleastOne = 1\n      }\n\n      if (atleastOne === 0) cblockline = 'all'\n      if (typeSimulation !== 'noiseAnalysis') {\n        controlBlock = `\\n.control \\nrun \\nprint ${cblockline} > data.txt \\n.endc \\n.end`\n      } else {\n        controlBlock = `\\n.control \\nrun \\n${noiseMode} \\nprint ${cblockline} > data.txt \\n.endc \\n.end`\n      }\n      // console.log(controlLine)\n\n      dispatch(setControlLine(controlLine))\n      dispatch(setControlBlock(controlBlock))\n      // setTimeout(function () { }, 2000)\n\n      const netlist = netfile.title + '\\n\\n' +\n        compNetlist.models + '\\n' +\n        compNetlist.main + '\\n' +\n        controlLine + '\\n' +\n        controlBlock + '\\n'\n\n      dispatch(setNetlist(netlist))\n      prepareNetlist(netlist)\n    }\n\n    // handlesimulateOpen()\n  }\n\n  // simulation properties add expression input box\n  const [anchorEl, setAnchorEl] = React.useState(null)\n  const handleAddExpressionClick = (event) => {\n    setAnchorEl(event.currentTarget)\n  }\n\n  const handleAddExpressionClose = () => {\n    setAnchorEl(null)\n  }\n\n  const open = Boolean(anchorEl)\n  const id = open ? 'simple-popover' : undefined\n\n  return (\n    <>\n      <div className={classes.SimulationOptions}>\n        <Snackbar\n          open={needParameters}\n          autoHideDuration={6000}\n          onClose={() => setNeedParameters(false)}\n        >\n          <Alert onClose={() => setNeedParameters(false)} severity=\"error\">\n            Please enter the necessary parameters!\n          </Alert>\n        </Snackbar>\n        <Snackbar\n          open={warning}\n          autoHideDuration={6000}\n          onClose={() => setWarning(false)}\n        >\n          <Alert onClose={() => setWarning(false)} severity=\"warning\">\n            Circuit is not complete to be simulated!\n          </Alert>\n        </Snackbar>\n        <Snackbar\n          open={error}\n          autoHideDuration={6000}\n          onClose={() => setError(false)}\n        >\n          <Alert onClose={() => setError(false)} severity=\"error\">\n            Cannot simulate an incomplete circuit!\n          </Alert>\n        </Snackbar>\n        <SimulationScreen open={simulateOpen} isResult={isResult} close={handleSimulateClose} taskId={taskId} simType={simType} />\n        <Notice status={status} open={err} msg={errMsg} close={handleErrClose} />\n        {/* Simulation modes list */}\n        <List>\n          {/* DC Solver */}\n          <ListItem className={classes.simulationOptions} divider>\n            <div className={classes.propertiesBox}>\n              <ExpansionPanel onClick={onTabExpand}>\n                <ExpansionPanelSummary\n                  expandIcon={<ExpandMoreIcon />}\n                  aria-controls=\"panel1a-content\"\n                  id=\"panel1a-header\"\n                  style={{ width: '100%  ' }}\n                >\n                  <Typography className={classes.heading}>DC Solver</Typography>\n                </ExpansionPanelSummary>\n                <ExpansionPanelDetails>\n                  <form>\n                    <List>\n                      <ListItem>\n\n                        <Button aria-describedby={id} variant=\"outlined\" color=\"primary\" size=\"small\" onClick={handleAddExpressionClick}>\n                          Add Expression\n                        </Button>\n                        <Tooltip title={'Add expression seperated by spaces.\\n Include #branch at end of expression to indicate current  e.g v1#branch. To add multiple expression seperate them by spaces eg. v1 v2 v3#branch'}>\n                          <IconButton aria-label=\"info\">\n                            <InfoOutlinedIcon style={{ fontSize: 'large' }} />\n                          </IconButton>\n                        </Tooltip>\n                        <Popover\n                          id={id}\n                          open={open}\n                          anchorEl={anchorEl}\n                          onClose={handleAddExpressionClose}\n\n                          anchorOrigin={{\n                            vertical: 'center',\n                            horizontal: 'left'\n                          }}\n                          transformOrigin={{\n                            vertical: 'top',\n                            horizontal: 'left'\n                          }}\n                        >\n\n                          <TextField id=\"controlBlockParam\" placeHolder=\"enter expression\" size='large' variant=\"outlined\"\n                            value={controlBlockParam}\n                            onChange={handleControlBlockParam}\n                          />\n                        </Popover>\n                      </ListItem>\n                      <ListItem>\n                        <Button size='small' variant=\"contained\" color=\"primary\"\n                          onClick={(e) => { startSimulate('DcSolver') }}>\n                          Run dc solver\n                        </Button>\n                      </ListItem>\n                    </List>\n                  </form>\n                </ExpansionPanelDetails>\n              </ExpansionPanel>\n\n            </div>\n          </ListItem>\n\n          {/* DC Sweep */}\n          <ListItem className={classes.simulationOptions} divider>\n            <ExpansionPanel onClick={onTabExpand}>\n              <ExpansionPanelSummary\n                expandIcon={<ExpandMoreIcon />}\n                aria-controls=\"panel1a-content\"\n                id=\"panel1a-header\"\n                style={{ width: '97%' }}\n              >\n                <Typography className={classes.heading}>DC Sweep</Typography>\n              </ExpansionPanelSummary>\n              <ExpansionPanelDetails>\n                <form className={classes.propertiesBox} noValidate autoComplete=\"off\">\n                  <List>\n                    <ListItem>\n                      <TextField\n                        style={{ width: '100%' }}\n                        id=\"parameter\"\n                        size='small'\n                        variant=\"outlined\"\n                        select\n                        label=\"Select Component\"\n                        value={dcSweepcontrolLine.parameter}\n                        error={!dcSweepcontrolLine.parameter}\n                        onChange={handleDcSweepControlLine}\n                        SelectProps={{\n                          native: true\n                        }}\n                      >\n                        {\n                          componentsList.map((value, i) => {\n                            if (value.charAt(0) === 'V' || value.charAt(0) === 'v' || value.charAt(0) === 'I' || value.charAt(0) === 'i' || value === '') {\n                              return (<option key={i} value={value}>\n                                {value}\n                              </option>)\n                            } else {\n                              return null\n                            }\n                          })\n                        }\n\n                      </TextField>\n\n                    </ListItem>\n\n                    <ListItem>\n                      <TextField id=\"start\" label=\"Start Voltage\" size='small' variant=\"outlined\"\n                        value={dcSweepcontrolLine.start}\n                        error={!dcSweepcontrolLine.start}\n                        onChange={handleDcSweepControlLine}\n                      />\n                      <span style={{ marginLeft: '10px' }}>V</span>\n                    </ListItem>\n                    <ListItem>\n                      <TextField id=\"stop\" label=\"Stop Voltage\" size='small' variant=\"outlined\"\n                        value={dcSweepcontrolLine.stop}\n                        error={!dcSweepcontrolLine.stop}\n                        onChange={handleDcSweepControlLine}\n                      />\n                      <span style={{ marginLeft: '10px' }}>V</span>\n                    </ListItem>\n                    <ListItem>\n                      <TextField id=\"step\" label=\"Step\" size='small' variant=\"outlined\"\n                        value={dcSweepcontrolLine.step}\n                        error={!dcSweepcontrolLine.step}\n                        onChange={handleDcSweepControlLine}\n                      />\n                      <span style={{ marginLeft: '10px' }}>V</span>\n                    </ListItem>\n\n                    {/* SECONDARY PARAMETER FOR SWEEP */}\n                    <Divider />\n                    <ListItem>\n\n                      <h4 style={{ marginLeft: '10px' }}>Secondary Parameters</h4>\n                    </ListItem>\n\n                    <ListItem>\n\n                      <TextField\n                        style={{ width: '100%' }}\n                        id=\"parameter2\"\n                        size='small'\n                        variant=\"outlined\"\n                        select\n                        label=\"Select Component\"\n                        value={dcSweepcontrolLine.parameter2}\n                        onChange={handleDcSweepControlLine}\n                        SelectProps={{\n                          native: true\n                        }}\n\n                      >\n\n                        {\n                          componentsList.map((value, i) => {\n                            return <option key={i} value={value}>\n                              {value}\n                            </option>\n                          })\n                        }\n\n                      </TextField>\n\n                    </ListItem>\n\n                    <ListItem>\n                      <TextField id=\"start2\" label=\"Start Value\" size='small' variant=\"outlined\"\n                        value={dcSweepcontrolLine.start2}\n                        onChange={handleDcSweepControlLine}\n                      />\n\n                    </ListItem>\n                    <ListItem>\n                      <TextField id=\"stop2\" label=\"Stop Value\" size='small' variant=\"outlined\"\n                        value={dcSweepcontrolLine.stop2}\n                        onChange={handleDcSweepControlLine}\n                      />\n\n                    </ListItem>\n                    <ListItem>\n                      <TextField id=\"step2\" label=\"Step Value\" size='small' variant=\"outlined\"\n                        value={dcSweepcontrolLine.step2}\n                        onChange={handleDcSweepControlLine}\n                      />\n\n                    </ListItem>\n                    <ListItem>\n                      <Multiselect\n                        style={{ width: '100%' }}\n                        id=\"Nodes\"\n                        closeOnSelect=\"false\"\n                        placeholder=\"Select Node\"\n                        onSelect={handleAddSelectedValueDCSweep}\n                        onRemove={handleRemSelectedValueDCSweep}\n                        options={analysisNodeArray} displayValue=\"key\"\n                        avoidHighlightFirstOption=\"true\"\n                      />\n                    </ListItem>\n                    <ListItem>\n                      <Multiselect\n                        style={{ width: '100%' }}\n                        id=\"Branch\"\n                        closeOnSelect=\"false\"\n                        placeholder=\"Select VSRC\"\n                        onSelect={handleAddSelectedValueDCSweepComp}\n                        onRemove={handleRemSelectedValueDCSweepComp}\n                        options={analysisCompArray} displayValue=\"key\"\n                        avoidHighlightFirstOption=\"true\"\n                      />\n                    </ListItem>\n                    <ListItem>\n\n                      <Button aria-describedby={id} variant=\"outlined\" color=\"primary\" size=\"small\" onClick={handleAddExpressionClick}>\n                        Add Expression\n                      </Button>\n                      <Tooltip title={'Add expression seperated by spaces.\\n Include #branch at end of expression to indicate current  e.g v1#branch. To add multiple expression seperate them by spaces eg. v1 v2 v3#branch'}>\n                        <IconButton aria-label=\"info\">\n                          <InfoOutlinedIcon style={{ fontSize: 'large' }} />\n                        </IconButton>\n                      </Tooltip>\n                      <Popover\n                        id={id}\n                        open={open}\n                        anchorEl={anchorEl}\n                        onClose={handleAddExpressionClose}\n\n                        anchorOrigin={{\n                          vertical: 'center',\n                          horizontal: 'left'\n                        }}\n                        transformOrigin={{\n                          vertical: 'top',\n                          horizontal: 'left'\n                        }}\n                      >\n\n                        <TextField id=\"controlBlockParam\" placeHolder=\"enter expression\" size='large' variant=\"outlined\"\n                          value={controlBlockParam}\n                          onChange={handleControlBlockParam}\n                        />\n\n                      </Popover>\n\n                    </ListItem>\n\n                    <ListItem>\n                      <Button id=\"dcSweepSimulate\" size='small' variant=\"contained\" color=\"primary\" onClick={(e) => { startSimulate('DcSweep') }}>\n                        Simulate\n                      </Button>\n                    </ListItem>\n                  </List>\n                </form>\n              </ExpansionPanelDetails>\n            </ExpansionPanel>\n          </ListItem>\n\n          {/* Transient Analysis */}\n          <ListItem className={classes.simulationOptions} divider>\n            <ExpansionPanel onClick={onTabExpand}>\n              <ExpansionPanelSummary\n                expandIcon={<ExpandMoreIcon />}\n                aria-controls=\"panel1a-content\"\n                id=\"panel1a-header\"\n                style={{ width: '97%' }}\n              >\n                <Typography className={classes.heading}>Transient Analysis</Typography>\n              </ExpansionPanelSummary>\n              <ExpansionPanelDetails>\n                <form className={classes.propertiesBox} noValidate autoComplete=\"off\">\n                  <List>\n                    <ListItem>\n                      <TextField id=\"start\" label=\"Start Time\" size='small' variant=\"outlined\"\n                        value={transientAnalysisControlLine.start}\n                        error={!transientAnalysisControlLine.start}\n                        onChange={handleTransientAnalysisControlLine}\n                      />\n                      <span style={{ marginLeft: '10px' }}>S</span>\n                    </ListItem>\n                    <ListItem>\n                      <TextField id=\"stop\" label=\"Stop Time\" size='small' variant=\"outlined\"\n                        value={transientAnalysisControlLine.stop}\n                        error={!transientAnalysisControlLine.stop}\n                        onChange={handleTransientAnalysisControlLine}\n                      />\n                      <span style={{ marginLeft: '10px' }}>S</span>\n                    </ListItem>\n                    <ListItem>\n                      <TextField id=\"step\" label=\"Time Step\" size='small' variant=\"outlined\"\n                        value={transientAnalysisControlLine.step}\n                        error={!transientAnalysisControlLine.step}\n                        onChange={handleTransientAnalysisControlLine}\n                      />\n                      <span style={{ marginLeft: '10px' }}>S</span>\n                    </ListItem>\n                    <ListItem>\n                      <Checkbox id=\"skipInitial\" label=\"Use Initial Conditions\" size='small' variant=\"outlined\"\n                        value={transientAnalysisControlLine.skipInitial}\n                        checked={transientAnalysisControlLine.skipInitial}\n                        onChange={handleTransientAnalysisControlLineUIC}\n                      />\n                      <span style={{ marginLeft: '10px' }}>Use Initial Conditions</span>\n                    </ListItem>\n                    <ListItem>\n                      {nodeList.forEach((value) => {\n                        if (value !== null && value !== '') {\n                          analysisNodeArray.push({ key: value })\n                        }\n                      })\n                      }\n\n                      <Multiselect\n                        style={{ width: '100%' }}\n                        id=\"Nodes\"\n                        closeOnSelect=\"false\"\n                        placeholder=\"Select Node\"\n                        onSelect={handleAddSelectedValueTransientAnal}\n                        onRemove={handleRemSelectedValueTransientAnal}\n                        options={analysisNodeArray} displayValue=\"key\"\n                        avoidHighlightFirstOption=\"true\"\n                      />\n                    </ListItem>\n                    <ListItem>\n                      {\n                        componentsList.forEach((value) => {\n                          if (value !== null && value !== '') {\n                            if (value.charAt(0) === 'V' || value.charAt(0) === 'v') {\n                              analysisCompArray.push({ key: value })\n                            }\n                          }\n                        })\n                      }\n                      <Multiselect\n                        style={{ width: '100%' }}\n                        id=\"Branch\"\n                        closeOnSelect=\"false\"\n                        placeholder=\"Select VSRC\"\n                        onSelect={handleAddSelectedValueTransientAnalComp}\n                        onRemove={handleRemSelectedValueTransientAnalComp}\n                        options={analysisCompArray} displayValue=\"key\"\n                        avoidHighlightFirstOption=\"true\"\n                      />\n                    </ListItem>\n                    <ListItem>\n\n                      <Button aria-describedby={id} variant=\"outlined\" color=\"primary\" size=\"small\" onClick={handleAddExpressionClick}>\n                        Add Expression\n                      </Button>\n                      <Tooltip title={'Add expression seperated by spaces.\\n Include #branch at end of expression to indicate current  e.g v1#branch. To add multiple expression seperate them by spaces eg. v1 v2 v3#branch'}>\n                        <IconButton aria-label=\"info\">\n                          <InfoOutlinedIcon style={{ fontSize: 'large' }} />\n                        </IconButton>\n                      </Tooltip>\n                      <Popover\n                        id={id}\n                        open={open}\n                        anchorEl={anchorEl}\n                        onClose={handleAddExpressionClose}\n\n                        anchorOrigin={{\n                          vertical: 'center',\n                          horizontal: 'left'\n                        }}\n                        transformOrigin={{\n                          vertical: 'top',\n                          horizontal: 'left'\n                        }}\n                      >\n\n                        <TextField id=\"controlBlockParam\" placeHolder=\"enter expression\" size='large' variant=\"outlined\"\n                          value={controlBlockParam}\n                          onChange={handleControlBlockParam}\n                        />\n\n                      </Popover>\n\n                    </ListItem>\n                    <ListItem>\n                      <Button id=\"transientAnalysisSimulate\" size='small' variant=\"contained\" color=\"primary\" onClick={(e) => { startSimulate('Transient') }}>\n                        Simulate\n                      </Button>\n                    </ListItem>\n                  </List>\n                </form>\n              </ExpansionPanelDetails>\n            </ExpansionPanel>\n          </ListItem>\n\n          {/* AC Analysis */}\n          <ListItem className={classes.simulationOptions} divider>\n            <ExpansionPanel onClick={onTabExpand}>\n              <ExpansionPanelSummary\n                expandIcon={<ExpandMoreIcon />}\n                aria-controls=\"panel1a-content\"\n                id=\"panel1a-header\"\n                style={{ width: '100%' }}\n              >\n                <Typography className={classes.heading}>AC Analysis</Typography>\n              </ExpansionPanelSummary>\n              <ExpansionPanelDetails>\n                <form className={classes.propertiesBox} noValidate autoComplete=\"off\">\n                  <List>\n\n                    <ListItem>\n                      <TextField\n                        style={{ width: '100%' }}\n                        id=\"input\"\n                        size='small'\n                        variant=\"outlined\"\n                        select\n                        label=\"Type\"\n                        value={acAnalysisControlLine.input}\n                        onChange={handleAcAnalysisControlLine}\n                        SelectProps={{\n                          native: true\n                        }}\n\n                      >\n                        <option key=\"linear\" value=\"lin\">\n                          Linear\n                        </option>\n                        <option key=\"decade\" value=\"dec\">\n                          Decade\n                        </option>\n                        <option key=\"octave\" value=\"oct\">\n                          Octave\n                        </option>\n                      </TextField>\n                    </ListItem>\n\n                    <ListItem>\n                      <TextField id=\"pointsBydecade\" label=\"Points/scale\" size='small' variant=\"outlined\"\n                        value={acAnalysisControlLine.pointsBydecade}\n                        error={!acAnalysisControlLine.pointsBydecade}\n                        onChange={handleAcAnalysisControlLine}\n                      />\n                    </ListItem>\n                    <ListItem>\n                      <TextField id=\"start\" label=\"Start Frequency\" size='small' variant=\"outlined\"\n                        value={acAnalysisControlLine.start}\n                        error={!acAnalysisControlLine.start}\n                        onChange={handleAcAnalysisControlLine}\n                      />\n                      <span style={{ marginLeft: '10px' }}>Hz</span>\n                    </ListItem>\n                    <ListItem>\n                      <TextField id=\"stop\" label=\"Stop Frequency\" size='small' variant=\"outlined\"\n                        value={acAnalysisControlLine.stop}\n                        error={!acAnalysisControlLine.stop}\n                        onChange={handleAcAnalysisControlLine}\n                      />\n                      <span style={{ marginLeft: '10px' }}>Hz</span>\n                    </ListItem>\n\n                    <ListItem>\n\n                      <Button aria-describedby={id} variant=\"outlined\" color=\"primary\" size=\"small\" onClick={handleAddExpressionClick}>\n                        Add Expression\n                      </Button>\n                      <Tooltip title={'Add expression seperated by spaces. Include #branch at end of expression to indicate current  e.g v1#branch. To add multiple expression seperate them by spaces eg. v1 v2 v3#branch'}>\n                        <IconButton aria-label=\"info\">\n                          <InfoOutlinedIcon style={{ fontSize: 'large' }} />\n                        </IconButton>\n                      </Tooltip>\n                      <Popover\n                        id={id}\n                        open={open}\n                        anchorEl={anchorEl}\n                        onClose={handleAddExpressionClose}\n\n                        anchorOrigin={{\n                          vertical: 'center',\n                          horizontal: 'left'\n                        }}\n                        transformOrigin={{\n                          vertical: 'top',\n                          horizontal: 'left'\n                        }}\n                      >\n\n                        <TextField id=\"controlBlockParam\" placeHolder=\"enter expression\" size='large' variant=\"outlined\"\n                          value={controlBlockParam}\n                          onChange={handleControlBlockParam}\n                        />\n\n                      </Popover>\n\n                    </ListItem>\n\n                    <ListItem>\n                      <Button size='small' variant=\"contained\" color=\"primary\" onClick={(e) => { startSimulate('Ac') }}>\n                        Simulate\n                      </Button>\n                    </ListItem>\n                  </List>\n                </form>\n              </ExpansionPanelDetails>\n            </ExpansionPanel>\n          </ListItem>\n\n          {/* Transfer Function Analysis */}\n          <ListItem className={classes.simulationOptions} divider>\n            <ExpansionPanel onClick={onTabExpand}>\n              <ExpansionPanelSummary\n                expandIcon={<ExpandMoreIcon />}\n                aria-controls=\"panel1a-content\"\n                id=\"panel1a-header\"\n                style={{ width: '97%' }}\n              >\n                <Typography className={classes.heading}>Transfer Function Analysis</Typography>\n              </ExpansionPanelSummary>\n              <ExpansionPanelDetails>\n                <form className={classes.propertiesBox} noValidate autoComplete=\"off\">\n                  <List>\n                    <ListItem>\n                      <input\n                        type=\"checkbox\"\n                        name=\"Between Nodes\"\n                        value={tfAnalysisControlLine.outputNodes}\n                        checked={tfAnalysisControlLine.outputNodes}\n                        onChange={handleTfAnalysisControlLineNodes}\n                        id=\"outputNodes\"\n                      />\n                      <span style={{ marginLeft: '10px' }}>Output By Nodes</span>\n\n                    </ListItem>\n                    {nodeList.forEach((value) => {\n                      if (value !== null && value !== '') {\n                        nodeArray.push({ key: value })\n                      }\n                    })\n                    }\n                    {/* {pushZero(nodeArray)} */}\n                    <ListItem>\n                      <Multiselect\n                        style={{ width: '100%' }}\n                        id=\"Nodes\"\n                        closeOnSelect=\"false\"\n                        placeholder=\"Voltage between Nodes\"\n                        onSelect={handleAddSelectedValueTFAnal}\n                        onRemove={handleRemSelectedValueTFAnal}\n                        selectionLimit=\"2\"\n                        options={nodeArray} displayValue=\"key\"\n                        disable={!tfAnalysisControlLine.outputNodes}\n                        avoidHighlightFirstOption=\"true\"\n                      />\n                    </ListItem>\n                    <ListItem>\n                      <TextField\n                        style={{ width: '100%' }}\n                        id=\"outputVoltageSource\"\n                        size='small'\n                        variant=\"outlined\"\n                        select\n                        label=\"Output Voltage SRC\"\n                        value={tfAnalysisControlLine.outputVoltageSource}\n                        onChange={handleTfAnalysisControlLine}\n                        SelectProps={{\n                          native: true\n                        }}\n                        disabled={tfAnalysisControlLine.outputNodes}\n                      >\n\n                        {\n                          componentsList.map((value, i) => {\n                            if (value.charAt(0) === 'V' || value.charAt(0) === 'v' || value.charAt(0) === 'I' || value.charAt(0) === 'i' || value === '') {\n                              return (<option key={i} value={value}>\n                                {value}\n                              </option>)\n                            } else {\n                              return null\n                            }\n                          })\n                        }\n\n                      </TextField>\n\n                    </ListItem>\n                    <ListItem>\n                      <TextField\n                        style={{ width: '100%' }}\n                        id=\"inputVoltageSource\"\n                        size='small'\n                        variant=\"outlined\"\n                        select\n                        label=\"Input Voltage SRC\"\n                        value={tfAnalysisControlLine.inputVoltageSource}\n                        error={!tfAnalysisControlLine.inputVoltageSource}\n                        onChange={handleTfAnalysisControlLine}\n                        SelectProps={{\n                          native: true\n                        }}\n                      >\n                        {\n                          componentsList.map((value, i) => {\n                            if (value.charAt(0) === 'V' || value.charAt(0) === 'v' || value.charAt(0) === 'I' || value.charAt(0) === 'i' || value === '') {\n                              return (<option key={i} value={value}>\n                                {value}\n                              </option>)\n                            } else {\n                              return null\n                            }\n                          })\n                        }\n\n                      </TextField>\n\n                    </ListItem>\n                    <ListItem>\n\n                      <Button aria-describedby={id} variant=\"outlined\" color=\"primary\" size=\"small\" onClick={handleAddExpressionClick}>\n                        Add Expression\n                      </Button>\n                      <Tooltip title={'Add expression seperated by spaces.\\n Include #branch at end of expression to indicate current  e.g v1#branch. To add multiple expression seperate them by spaces eg. v1 v2 v3#branch'}>\n                        <IconButton aria-label=\"info\">\n                          <InfoOutlinedIcon style={{ fontSize: 'large' }} />\n                        </IconButton>\n                      </Tooltip>\n                      <Popover\n                        id={id}\n                        open={open}\n                        anchorEl={anchorEl}\n                        onClose={handleAddExpressionClose}\n\n                        anchorOrigin={{\n                          vertical: 'center',\n                          horizontal: 'left'\n                        }}\n                        transformOrigin={{\n                          vertical: 'top',\n                          horizontal: 'left'\n                        }}\n                      >\n\n                        <TextField id=\"controlBlockParam\" placeHolder=\"enter expression\" size='large' variant=\"outlined\"\n                          value={controlBlockParam}\n                          onChange={handleControlBlockParam}\n                        />\n\n                      </Popover>\n\n                    </ListItem>\n\n                    <ListItem>\n                      <Button id=\"tfAnalysisSimulate\" size='small' variant=\"contained\" color=\"primary\" onClick={(e) => { startSimulate('tfAnalysis') }}>\n                        Simulate\n                      </Button>\n                    </ListItem>\n                  </List>\n                </form>\n              </ExpansionPanelDetails>\n            </ExpansionPanel>\n          </ListItem>\n          {/* Noise Analysis */}\n          <ListItem className={classes.simulationOptions} divider>\n            <ExpansionPanel onClick={onTabExpand}>\n              <ExpansionPanelSummary\n                expandIcon={<ExpandMoreIcon />}\n                aria-controls=\"panel1a-content\"\n                id=\"panel1a-header\"\n                style={{ width: '97%' }}\n              >\n                <Typography className={classes.heading}>Noise Analysis</Typography>\n              </ExpansionPanelSummary>\n              <ExpansionPanelDetails>\n                <form className={classes.propertiesBox} noValidate autoComplete=\"off\">\n                  <List>\n                    {nodeList.forEach((value) => {\n                      if (value !== null && value !== '') {\n                        nodeNoiseArray.push({ key: value })\n                      }\n                    })\n                    }\n                    {/* {pushZero(nodeArray)} */}\n                    <ListItem>\n                      <Multiselect\n                        style={{ width: '100%' }}\n                        id=\"Nodes\"\n                        closeOnSelect=\"false\"\n                        placeholder=\"Voltage between Nodes\"\n                        onSelect={handleAddSelectedValueNoiseAnal}\n                        onRemove={handleRemSelectedValueNoiseAnal}\n                        selectionLimit=\"2\"\n                        options={nodeNoiseArray} displayValue=\"key\"\n                        avoidHighlightFirstOption=\"true\"\n                      />\n                    </ListItem>\n                    <ListItem>\n                      <TextField\n                        style={{ width: '100%' }}\n                        id=\"inputVoltageSource\"\n                        size='small'\n                        variant=\"outlined\"\n                        select\n                        label=\"Input Voltage SRC\"\n                        value={handleNoiseAnalysisControlLine.inputVoltageSource}\n                        error={!handleNoiseAnalysisControlLine.inputVoltageSource}\n                        onChange={handleNoiseAnalysisControlLine}\n                        SelectProps={{\n                          native: true\n                        }}\n                      >\n                        {\n                          componentsList.map((value, i) => {\n                            if (value.charAt(0) === 'V' || value.charAt(0) === 'v' || value.charAt(0) === 'I' || value.charAt(0) === 'i' || value === '') {\n                              return (<option key={i} value={value}>\n                                {value}\n                              </option>)\n                            } else {\n                              return null\n                            }\n                          })\n                        }\n\n                      </TextField>\n                    </ListItem>\n                    <ListItem>\n                      <TextField\n                        style={{ width: '100%' }}\n                        id=\"input\"\n                        size='small'\n                        variant=\"outlined\"\n                        select\n                        label=\"Type\"\n                        value={handleNoiseAnalysisControlLine.input}\n                        onChange={handleNoiseAnalysisControlLine}\n                        SelectProps={{\n                          native: true\n                        }}\n\n                      >\n                        <option key=\"linear\" value=\"lin\">\n                          Linear\n                        </option>\n                        <option key=\"decade\" value=\"dec\">\n                          Decade\n                        </option>\n                        <option key=\"octave\" value=\"oct\">\n                          Octave\n                        </option>\n                      </TextField>\n                    </ListItem>\n                    <ListItem>\n                      <TextField id=\"pointsBydecade\" label=\"Points/scale\" size='small' variant=\"outlined\"\n                        value={NoiseAnalysisControlLine.pointsBydecade}\n                        error={!NoiseAnalysisControlLine.pointsBydecade}\n                        onChange={handleNoiseAnalysisControlLine}\n                      />\n                    </ListItem>\n                    <ListItem>\n                      <TextField id=\"start\" label=\"Start Frequency\" size='small' variant=\"outlined\"\n                        value={NoiseAnalysisControlLine.start}\n                        error={!NoiseAnalysisControlLine.start}\n                        onChange={handleNoiseAnalysisControlLine}\n                      />\n                      <span style={{ marginLeft: '10px' }}>Hz</span>\n                    </ListItem>\n                    <ListItem>\n                      <TextField id=\"stop\" label=\"Stop Frequency\" size='small' variant=\"outlined\"\n                        value={NoiseAnalysisControlLine.stop}\n                        error={!NoiseAnalysisControlLine.stop}\n                        onChange={handleNoiseAnalysisControlLine}\n                      />\n                      <span style={{ marginLeft: '10px' }}>Hz</span>\n                    </ListItem>\n                    <ListItem>\n                      <input\n                        type=\"checkbox\"\n                        name=\"Between Nodes\"\n                        value={NoiseAnalysisControlLine.outputSpectrum}\n                        checked={NoiseAnalysisControlLine.outputSpectrum}\n                        onChange={handleNoiseOutputMode}\n                        id=\"outputSpectrum\"\n                      />\n                      <span style={{ marginLeft: '10px' }}>Show Noise Spectrum</span>\n\n                    </ListItem>\n\n                    <ListItem>\n\n                      <Button aria-describedby={id} variant=\"outlined\" color=\"primary\" size=\"small\" onClick={handleAddExpressionClick}>\n                        Add Expression\n                      </Button>\n                      <Tooltip title={'Add expression seperated by spaces.\\n Include #branch at end of expression to indicate current  e.g v1#branch. To add multiple expression seperate them by spaces eg. v1 v2 v3#branch'}>\n                        <IconButton aria-label=\"info\">\n                          <InfoOutlinedIcon style={{ fontSize: 'large' }} />\n                        </IconButton>\n                      </Tooltip>\n                      <Popover\n                        id={id}\n                        open={open}\n                        anchorEl={anchorEl}\n                        onClose={handleAddExpressionClose}\n\n                        anchorOrigin={{\n                          vertical: 'center',\n                          horizontal: 'left'\n                        }}\n                        transformOrigin={{\n                          vertical: 'top',\n                          horizontal: 'left'\n                        }}\n                      >\n\n                        <TextField id=\"controlBlockParam\" placeHolder=\"enter expression\" size='large' variant=\"outlined\"\n                          value={controlBlockParam}\n                          onChange={handleControlBlockParam}\n                        />\n\n                      </Popover>\n\n                    </ListItem>\n\n                    <ListItem>\n                      <Button id=\"noiseAnalysisSimulate\" size='small' variant=\"contained\" color=\"primary\" onClick={(e) => { startSimulate('noiseAnalysis') }}>\n                        Simulate\n                      </Button>\n                    </ListItem>\n                  </List>\n                </form>\n              </ExpansionPanelDetails>\n            </ExpansionPanel>\n          </ListItem>\n\n          <ListItem style={isSimRes ? {} : { display: 'none' }} onClick={handlesimulateOpen} >\n            <Button size='small' variant=\"contained\" color=\"primary\" style={{ margin: '10px auto' }} onClick={handlesimulateOpen}>\n              Simulation Result\n            </Button>\n          </ListItem>\n        </List>\n      </div>\n    </>\n  )\n}\n\nSimulationProperties.propTypes = {\n  ltiSimResult: PropTypes.object,\n  setLtiSimResult: PropTypes.object,\n  dcSweepcontrolLine: PropTypes.object,\n  transientAnalysisControlLine: PropTypes.object,\n  acAnalysisControlLine: PropTypes.object,\n  tfAnalysisControlLine: PropTypes.object,\n  NoiseAnalysisControlLine: PropTypes.object\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/ToolbarExtension.js",
    "content": "/* eslint-disable camelcase */\nimport React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n  Slide,\n  Button,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogContentText,\n  DialogTitle,\n  TextareaAutosize,\n  AppBar,\n  Toolbar,\n  IconButton,\n  Typography,\n  Container,\n  Grid,\n  Paper,\n  Divider,\n  TableContainer,\n  Table,\n  TableHead,\n  TableRow,\n  TableCell,\n  TableBody,\n  List,\n  ListItem,\n  ListItemText,\n  ListItemSecondaryAction,\n  ListSubheader,\n  Avatar,\n  ListItemAvatar,\n  Tooltip,\n  Snackbar,\n  Collapse,\n  Hidden,\n  Input\n} from '@material-ui/core'\n\nimport { makeStyles } from '@material-ui/core/styles'\nimport CloseIcon from '@material-ui/icons/Close'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { setTitle, setSchTitle, fetchSchematics, fetchSchematic, fetchGallerySchematic, fetchAllLibraries, fetchLibrary, removeLibrary, uploadLibrary, resetUploadSuccess, deleteLibrary, fetchComponents, fetchGallery, setSchXmlData, saveSchematic } from '../../redux/actions/index'\nimport { blue } from '@material-ui/core/colors'\nimport { Alert } from '@material-ui/lab'\nimport Tabs from '@material-ui/core/Tabs'\nimport Tab from '@material-ui/core/Tab'\nimport Box from '@material-ui/core/Box'\nimport ExpandMore from '@material-ui/icons/ExpandMore'\nimport ExpandLess from '@material-ui/icons/ExpandLess'\nimport { fetchRole } from '../../redux/actions/authActions'\nimport Canvg from 'canvg'\nimport { Save } from './Helper/ToolbarTools'\n\nconst Transition = React.forwardRef(function Transition (props, ref) {\n  return <Slide direction=\"up\" ref={ref} {...props} />\n})\n\nconst FileSaver = require('file-saver')\n\n// Dialog box to display generated netlist\nexport function NetlistModal ({ open, close, netlist }) {\n  const netfile = useSelector(state => state.netlistReducer)\n  const createNetlistFile = () => {\n    const titleA = netfile.title.split(' ')[1]\n    const blob = new Blob([netlist], { type: 'text/plain;charset=utf-8' })\n    FileSaver.saveAs(blob, `${titleA}_eSim_on_cloud.cir`)\n  }\n  return (\n    <Dialog\n      open={open}\n      onClose={close}\n      TransitionComponent={Transition}\n      keepMounted\n      aria-labelledby=\"generate-netlist\"\n      aria-describedby=\"generate-netlist-description\"\n    >\n      <DialogTitle id=\"generate-netlist-title\">{'Netlist Generator'}</DialogTitle>\n      <DialogContent dividers>\n        <DialogContentText id=\"generate-netlist-description\">\n          Current Netlist for given schematic...<br /><br />\n          <TextareaAutosize aria-label=\"empty textarea\" rowsMin={20} rowsMax={50} style={{ minWidth: '500px' }} value={netlist} />\n        </DialogContentText>\n      </DialogContent>\n      <DialogActions>\n        {/* Button to download the netlist */}\n        <Button color=\"primary\" onClick={createNetlistFile}>\n          Download\n        </Button>\n        <Button onClick={close} color=\"primary\" autoFocus>\n          Close\n        </Button>\n      </DialogActions>\n    </Dialog>\n  )\n}\n\nNetlistModal.propTypes = {\n  open: PropTypes.bool,\n  close: PropTypes.func,\n  netlist: PropTypes.string\n}\n\nconst useStyles = makeStyles((theme) => ({\n  appBar: {\n    position: 'relative'\n  },\n  title: {\n    marginLeft: theme.spacing(2),\n    flex: 1\n  },\n  header: {\n    padding: theme.spacing(5, 0, 6),\n    color: '#fff'\n  },\n  paper: {\n    padding: theme.spacing(2),\n    textAlign: 'center',\n    backgroundColor: '#404040',\n    color: '#fff'\n  },\n  avatar: {\n    width: theme.spacing(4),\n    height: theme.spacing(4),\n    backgroundColor: blue[100],\n    color: blue[600]\n  },\n  delete: {\n    backgroundColor: 'red',\n    color: 'white',\n    marginBottom: '10px'\n  },\n  flex_container: {\n    display: 'flex',\n    flexDirection: 'column'\n    // justifyContent: 'space-evenly'\n  },\n  flex_item: {\n    marginBottom: '10px'\n  }\n}))\n\n// Screen to display information about as keyboard shortcuts, units table and simulation modes\nexport function HelpScreen ({ open, close }) {\n  const classes = useStyles()\n  return (\n    <div>\n      <Dialog fullScreen open={open} onClose={close} TransitionComponent={Transition} PaperProps={{\n        style: {\n          backgroundColor: '#4d4d4d',\n          boxShadow: 'none'\n        }\n      }} >\n        <AppBar position=\"static\" elevation={0} className={classes.appBar}>\n          <Toolbar variant=\"dense\" style={{ backgroundColor: '#404040' }} >\n            <IconButton edge=\"start\" color=\"inherit\" onClick={close} aria-label=\"close\">\n              <CloseIcon />\n            </IconButton>\n            <Typography variant=\"h6\" className={classes.title}>\n              Help\n            </Typography>\n            <Button autoFocus color=\"inherit\" onClick={close}>\n              close\n            </Button>\n          </Toolbar>\n        </AppBar>\n        <Container maxWidth=\"lg\" className={classes.header}>\n          <Grid\n            container\n            spacing={3}\n            direction=\"row\"\n            justify=\"center\"\n            alignItems=\"center\"\n          >\n\n            <Grid item xs={12} sm={12}>\n              <Paper className={classes.paper}>\n                <fieldset style={{ padding: '20px 40px' }}>\n                  <legend>\n                    <Typography variant=\"h5\" align=\"center\" component=\"p\" gutterBottom>\n                      Keyboard Shorcuts\n                    </Typography>\n                  </legend>\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    UNDO\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Ctrl + Z\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    REDO\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Ctrl + Shift + Z\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    ZOOM IN\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Ctrl + +\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    ZOOM OUT\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Ctrl + -\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    DEFAULT SIZE\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Ctrl + Y\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    Save Circuit\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Ctrl + S\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    Print Circuit\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Ctrl + P\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    Open Dialog\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Ctrl + O\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    Export as JSON\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Ctrl + E\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    Export as Image\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Ctrl + Shift + E\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    Rotate Component Clockwise\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Alt + Right Arrow\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    Rotate Component Anti-Clockwise\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Alt + Left Arrow\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    Clear All\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    Shift + Del\n                  </Typography>\n                </fieldset>\n              </Paper>\n            </Grid>\n\n            <Grid item xs={12} sm={12}>\n              <Paper className={classes.paper}>\n                <fieldset style={{ padding: '20px 40px' }}>\n                  <legend>\n                    <Typography variant=\"h5\" align=\"center\" component=\"p\" gutterBottom>\n                      Units Table\n                    </Typography>\n                  </legend>\n                  <Typography>\n\n                    <TableContainer component={Paper}>\n                      <Table className={classes.table} aria-label=\"simple table\">\n                        <caption>Ngspice scale factors naming conventions</caption>\n                        <TableHead>\n                          <TableRow>\n                            <TableCell align=\"center\">SUFFIX</TableCell>\n                            <TableCell align=\"center\">NAME</TableCell>\n                            <TableCell align=\"center\">FACTOR</TableCell>\n                          </TableRow>\n                        </TableHead>\n                        <TableBody>\n\n                          <TableRow>\n                            <TableCell align=\"center\">T</TableCell>\n                            <TableCell align=\"center\">Tera</TableCell>\n                            <TableCell align=\"center\">10<sup>12</sup></TableCell>\n                          </TableRow>\n\n                          <TableRow>\n                            <TableCell align=\"center\">G</TableCell>\n                            <TableCell align=\"center\">Giga</TableCell>\n                            <TableCell align=\"center\">10<sup>9</sup></TableCell>\n                          </TableRow>\n\n                          <TableRow>\n                            <TableCell align=\"center\">Meg</TableCell>\n                            <TableCell align=\"center\">Mega</TableCell>\n                            <TableCell align=\"center\">10<sup>6</sup></TableCell>\n                          </TableRow>\n\n                          <TableRow>\n                            <TableCell align=\"center\">K</TableCell>\n                            <TableCell align=\"center\">Kilo</TableCell>\n                            <TableCell align=\"center\">10<sup>3</sup></TableCell>\n                          </TableRow>\n\n                          <TableRow>\n                            <TableCell align=\"center\">mil</TableCell>\n                            <TableCell align=\"center\">Mil</TableCell>\n                            <TableCell align=\"center\">25.4 X 10<sup>-6</sup></TableCell>\n                          </TableRow>\n\n                          <TableRow>\n                            <TableCell align=\"center\">m</TableCell>\n                            <TableCell align=\"center\">milli</TableCell>\n                            <TableCell align=\"center\">10<sup>-3</sup></TableCell>\n                          </TableRow>\n\n                          <TableRow>\n                            <TableCell align=\"center\">u</TableCell>\n                            <TableCell align=\"center\">micro</TableCell>\n                            <TableCell align=\"center\">10<sup>-6</sup></TableCell>\n                          </TableRow>\n\n                          <TableRow>\n                            <TableCell align=\"center\">n</TableCell>\n                            <TableCell align=\"center\">nano</TableCell>\n                            <TableCell align=\"center\">10<sup>-9</sup></TableCell>\n                          </TableRow>\n                          <TableRow>\n                            <TableCell align=\"center\">p</TableCell>\n                            <TableCell align=\"center\">pico</TableCell>\n                            <TableCell align=\"center\">10<sup>-12</sup></TableCell>\n                          </TableRow>\n\n                          <TableRow>\n                            <TableCell align=\"center\">f</TableCell>\n                            <TableCell align=\"center\">femto</TableCell>\n                            <TableCell align=\"center\">10<sup>-15</sup></TableCell>\n                          </TableRow>\n\n                        </TableBody>\n                      </Table>\n                    </TableContainer>\n                  </Typography>\n                </fieldset>\n              </Paper>\n            </Grid>\n            <Grid item xs={12} sm={12}>\n              <Paper className={classes.paper}>\n                <fieldset style={{ padding: '20px 40px' }}>\n                  <legend>\n                    <Typography variant=\"h5\" align=\"center\" component=\"p\" gutterBottom>\n                      Simulation Modes\n                    </Typography>\n                  </legend>\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    DC Solver\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    A DC simulation attempts to find a stable DC solution of your circuit.\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    DC Sweep\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    A DC Sweep will plot the DC solution of your circuit across different values of a parameter of a circuit element.\n                    You can sweep any numerical parameter of any circuit element in your circuit.\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    Transient Analysis\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    A Transient analysis does a Time-Domain Simulation of your circuit over a certain period of time.\n                  </Typography>\n                  <Divider />\n                  <Typography variant=\"h6\" align='left' gutterBottom>\n                    AC Analysis\n                  </Typography>\n                  <Typography variant=\"subtitle1\" align='left' style={{ color: '#b3b3b3' }} gutterBottom>\n                    AC Analysis does a small signal analysis of your circuit. The input can be any voltage source or current source.\n                  </Typography>\n                </fieldset>\n              </Paper>\n            </Grid>\n          </Grid>\n        </Container>\n      </Dialog>\n    </div >\n  )\n}\n\nHelpScreen.propTypes = {\n  open: PropTypes.bool,\n  close: PropTypes.func\n}\n\n// Image Export Dialog box\nconst ImgTypes = ['PNG', 'JPG', 'SVG']\nexport function ImageExportDialog (props) {\n  const classes = useStyles()\n  const { onClose, open } = props\n\n  const handleClose = () => {\n    onClose('')\n  }\n\n  const handleListItemClick = (value) => {\n    onClose(value)\n  }\n\n  return (\n    <Dialog onClose={handleClose} aria-labelledby=\"image-export-dialog-title\" open={open}>\n      <DialogTitle id=\"image-export-dialog-title\">Select Image type</DialogTitle>\n      <List>\n        {ImgTypes.map((img) => (\n          <ListItem button onClick={() => handleListItemClick(img)} key={img}>\n            <ListItemAvatar>\n              <Avatar className={classes.avatar}>\n                {img.charAt(0).toUpperCase()}\n              </Avatar>\n            </ListItemAvatar>\n            <ListItemText primary={img} />\n          </ListItem>\n        ))}\n      </List>\n      <DialogActions>\n        <Button onClick={handleClose} color=\"primary\" autoFocus>\n          Close\n        </Button>\n      </DialogActions>\n    </Dialog>\n  )\n}\n\nImageExportDialog.propTypes = {\n  onClose: PropTypes.func.isRequired,\n  open: PropTypes.bool.isRequired\n}\n\n//  home button dialog\nexport function HomeDialog ({ open, gridRef, routeVal, onClose, schSave }) {\n  const classes = useStyles()\n  // const abc = schSave\n  const dispatch = useDispatch()\n  console.log(open)\n  useEffect(() => {\n    dispatch(fetchRole())\n  }, [dispatch])\n  var homeURL = ''\n  if (routeVal === 'home') {\n    homeURL = `${window.location.protocol}\\\\\\\\${window.location.host}/`\n  } else {\n    homeURL = `${window.location.protocol}\\\\\\\\${window.location.host}/eda/#/${routeVal}`\n  }\n\n  console.log(homeURL)\n  const handleClose = () => {\n    onClose('')\n  }\n\n  // handle Notification Snackbar\n  const [snacOpen, setSnacOpen] = React.useState(false)\n  const [message, setMessage] = React.useState('')\n\n  const handleSnacClick = () => {\n    setSnacOpen(true)\n  }\n\n  const handleSnacClose = (event, reason) => {\n    if (reason === 'clickaway') {\n      return\n    }\n    setSnacOpen(false)\n  }\n\n  const auth = useSelector((state) => state.authReducer)\n\n  // handle schemaname dialog box\n  const [schemanameopen, setSchemaNameOpen] = React.useState(false)\n\n  const handleSchemaNameOpen = (e) => {\n    e.preventDefault()\n    console.log(e)\n    console.log(routeVal)\n\n    if (auth.isAuthenticated !== true) {\n      setMessage('You are not Logged In')\n      handleSnacClick()\n    } else {\n      setSchemaNameOpen(true)\n    }\n  }\n\n  const handleSchemaNameClose = () => {\n    setSchemaNameOpen(false)\n  }\n\n  return (\n    <Dialog onClose={handleClose} aria-labelledby=\"image-export-dialog-title\" open={open}>\n      <DialogTitle id=\"image-export-dialog-title\">Save changes to the untitled circuit? Your changes will be lost if you do not save it.</DialogTitle>\n      <DialogContent className={classes.flex_container} >\n        <Button variant=\"contained\" className={classes.flex_item} color=\"primary\" size=\"large\" onClick={handleSchemaNameOpen} >\n              Save\n        </Button>\n        <Button variant=\"contained\" color=\"primary\" className={classes.flex_item}size=\"large\" onClick={() => { window.open(homeURL, '_self') }}>\n              Dont Save\n        </Button>\n        <Button variant=\"contained\" className={classes.delete} size=\"large\" onClick={handleClose}>\n              Cancel\n        </Button>\n      </DialogContent>\n      {gridRef && routeVal &&\n                <SchematicNameDialog open={schemanameopen} gridRef={gridRef} routeVal={routeVal} schSave={schSave} onClose={handleSchemaNameClose} />\n      }\n      <SimpleSnackbar open={snacOpen} close={handleSnacClose} message={message} />\n    </Dialog>\n  )\n}\n\nHomeDialog.propTypes = {\n  onClose: PropTypes.func.isRequired,\n  open: PropTypes.bool.isRequired,\n  gridRef: PropTypes.object.isRequired,\n  schSave: PropTypes.object.isRequired,\n  routeVal: PropTypes.string.isRequired\n}\n\nexport function SchematicNameDialog ({ open, gridRef, routeVal, onClose, schSave }) {\n  const classes = useStyles()\n  const dispatch = useDispatch()\n  console.log(open)\n  useEffect(() => {\n    dispatch(fetchRole())\n  }, [dispatch])\n  var homeURL = ''\n  console.log(routeVal)\n  if (routeVal === 'home') {\n    homeURL = `${window.location.protocol}\\\\\\\\${window.location.host}/`\n  } else {\n    homeURL = `${window.location.protocol}\\\\\\\\${window.location.host}/eda/#/${routeVal}`\n  }\n\n  console.log(homeURL)\n  const handleClose = () => {\n    onClose('')\n  }\n\n  // handle Notification Snackbar\n  const [snacOpen, setSnacOpen] = React.useState(false)\n  const [message, setMessage] = React.useState('')\n\n  const handleSnacClick = () => {\n    setSnacOpen(true)\n  }\n\n  const handleSave = (version, newSave, save_id) => {\n    if (!newSave) {\n      // window.location = '#/editor?id=' + window.location.href.split('id=')[1].substr(0, 36) + '&version=' + version + '&branch=' + window.location.href.split('branch=')[1].substr(0)\n      // window.location.reload()\n      // window.open(homeURL, '_self')\n      window.location = homeURL\n      window.location.reload()\n    } else {\n      // window.location = '#/editor?id=' + save_id + '&version=' + version + '&branch=master'\n      // window.location.reload()\n      window.open(homeURL, '_self')\n    }\n  }\n\n  const handleSnacClose = (event, reason) => {\n    if (reason === 'clickaway') {\n      return\n    }\n    setSnacOpen(false)\n  }\n\n  const auth = useSelector((state) => state.authReducer)\n\n  // Image Export of Schematic Diagram\n  async function exportImage (type) {\n    const svg = document.querySelector('#divGrid > svg').cloneNode(true)\n    svg.removeAttribute('style')\n    svg.setAttribute('width', gridRef.current.scrollWidth)\n    svg.setAttribute('height', gridRef.current.scrollHeight)\n    const canvas = document.createElement('canvas')\n    canvas.width = gridRef.current.scrollWidth\n    canvas.height = gridRef.current.scrollHeight\n    canvas.style.width = canvas.width + 'px'\n    canvas.style.height = canvas.height + 'px'\n    const images = svg.getElementsByTagName('image')\n    for (const image of images) {\n      const data = await fetch(image.getAttribute('xlink:href')).then((v) => {\n        return v.text()\n      })\n      image.removeAttribute('xlink:href')\n      image.setAttribute(\n        'href',\n        'data:image/svg+xml;base64,' + window.btoa(data)\n      )\n    }\n    const ctx = canvas.getContext('2d')\n    ctx.mozImageSmoothingEnabled = true\n    ctx.webkitImageSmoothingEnabled = true\n    ctx.msImageSmoothingEnabled = true\n    ctx.imageSmoothingEnabled = true\n    const pixelRatio = window.devicePixelRatio || 1\n    ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0)\n    return new Promise((resolve) => {\n      if (type === 'SVG') {\n        const svgdata = new XMLSerializer().serializeToString(svg)\n        resolve('<?xml version=\"1.0\" encoding=\"UTF-8\"?>' + svgdata)\n        return\n      }\n      const v = Canvg.fromString(ctx, svg.outerHTML)\n      v.render().then(() => {\n        let image = ''\n        if (type === 'JPG') {\n          const imgdata = ctx.getImageData(0, 0, canvas.width, canvas.height)\n          for (let i = 0; i < imgdata.data.length; i += 4) {\n            if (imgdata.data[i + 3] === 0) {\n              imgdata.data[i] = 255\n              imgdata.data[i + 1] = 255\n              imgdata.data[i + 2] = 255\n              imgdata.data[i + 3] = 255\n            }\n          }\n          ctx.putImageData(imgdata, 0, 0)\n          image = canvas.toDataURL('image/jpeg', 1.0)\n        } else {\n          if (type === 'PNG') {\n            image = canvas.toDataURL('image/png')\n          }\n        }\n        resolve(image)\n      })\n    })\n  }\n\n  // handle Save Schematic onCloud\n  const handleSchSave = () => {\n    if (auth.isAuthenticated !== true) {\n      setMessage('You are not Logged In')\n      handleSnacClick()\n    } else {\n      const xml = Save()\n      dispatch(setSchXmlData(xml))\n      const title = schSave.title\n      const description = schSave.description\n      exportImage('PNG').then((res) => {\n        dispatch(saveSchematic(title, description, xml, res, false, null, handleSave))\n      })\n      setMessage('Saved Successfully')\n      handleSnacClick()\n    }\n  }\n  const titleHandler = (e) => {\n    e.preventDefault()\n    dispatch(setTitle(`* ${e.target.value}`))\n    dispatch(setSchTitle(`${e.target.value}`))\n  }\n  return (\n    <Dialog onClose={handleClose} aria-labelledby=\"image-export-dialog-title\" open={open}>\n      <DialogTitle id=\"image-export-dialog-title\">Confirm the Title for the Schematic</DialogTitle>\n      <DialogContent className={classes.flex_container} >\n        <Hidden xsDown>\n          <Input\n            style={{ marginBottom: '10px' }}\n            className={classes.input}\n            color=\"secondary\"\n            value={schSave.title === 'Untitled_Schematic' ? 'Untitled_Schematic' : schSave.title}\n            onChange={titleHandler}\n            inputProps={{ 'aria-label': 'SchematicTitle' }}\n          />\n        </Hidden>\n        <Button variant=\"contained\" color=\"primary\" size=\"large\" onClick={handleSchSave} >\n              Save\n        </Button>\n      </DialogContent>\n      <SimpleSnackbar open={snacOpen} close={handleSnacClose} message={message} />\n    </Dialog>\n  )\n}\n\nSchematicNameDialog.propTypes = {\n  onClose: PropTypes.func.isRequired,\n  open: PropTypes.bool.isRequired,\n  gridRef: PropTypes.object.isRequired,\n  schSave: PropTypes.object.isRequired,\n  routeVal: PropTypes.string.isRequired\n}\n\n// Dialog box to open saved Schematics\nexport function OpenSchDialog (props) {\n  const { open, close, openLocal, openKicad } = props\n  const [isLocal, setisLocal] = React.useState(true)\n  const [isGallery, setisGallery] = React.useState(false)\n  const [isKicad, setisKicad] = React.useState(false)\n  const schSave = useSelector(state => state.saveSchematicReducer)\n  const auth = useSelector(state => state.authReducer)\n  const schematics = useSelector(state => state.dashboardReducer.schematics)\n  const gallerySchSample = useSelector(state => state.galleryReducer.schematics)\n  const dispatch = useDispatch()\n  function getDate (jsonDate) {\n    const json = jsonDate\n    const date = new Date(json)\n    const dateTimeFormat = new Intl.DateTimeFormat('en', { month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' })\n    const [{ value: month }, , { value: day }, , { value: hour }, , { value: minute }, , { value: second }] = dateTimeFormat.formatToParts(date)\n    return `${day} ${month} ${hour}:${minute}:${second}`\n  }\n\n  return (\n    <Dialog\n      open={open}\n      onClose={close}\n      maxWidth='md'\n      TransitionComponent={Transition}\n      keepMounted\n      aria-labelledby=\"open-dialog-title\"\n      aria-describedby=\"open-dialog-description\"\n    >\n      <DialogTitle id=\"open-dialog-title\" onClose={close}>\n        <Typography variant=\"h6\">{'Open Schematic'}</Typography>\n      </DialogTitle>\n      <DialogContent dividers>\n        <DialogContentText id=\"open-dialog-description\" >\n          {isLocal\n            ? <center> <Button variant=\"outlined\" fullWidth={true} size=\"large\" onClick={() => { openLocal(); close() }} color=\"primary\">\n              Upload File\n            </Button></center>\n            : isGallery\n              ? <Grid item xs={12} sm={12}>\n                {/* Listing Gallery Schematics */}\n                <TableContainer component={Paper} style={{ maxHeight: '45vh' }}>\n                  <Table stickyHeader size=\"small\" aria-label=\"simple table\">\n                    <TableHead>\n                      <TableRow>\n                        <TableCell align=\"center\">Name</TableCell>\n                        <TableCell align=\"center\">Description</TableCell>\n                        <TableCell align=\"center\">Launch</TableCell>\n                      </TableRow>\n                    </TableHead>\n                    <TableBody>\n                      <>\n                        {gallerySchSample.map(\n                          (sch) => {\n                            return (\n                              <TableRow key={sch.save_id}>\n                                <TableCell align=\"center\">{sch.name}</TableCell>\n                                <TableCell align=\"center\">\n                                  <Tooltip title={sch.description !== null ? sch.description : 'No description'} >\n                                    <span>\n                                      {sch.description !== null ? sch.description.slice(0, 30) + (sch.description.length < 30 ? '' : '...') : '-'}\n                                    </span>\n                                  </Tooltip>\n                                </TableCell>\n                                <TableCell align=\"center\">\n                                  <Button\n                                    size=\"small\"\n                                    color=\"primary\"\n                                    onClick={() => { dispatch(fetchGallerySchematic(sch.save_id)) }}\n                                    variant={schSave.details.save_id === undefined ? 'outlined' : schSave.details.save_id !== sch.save_id ? 'outlined' : 'contained'}\n                                  >\n                                    Launch\n                                  </Button>\n                                </TableCell>\n                              </TableRow>\n                            )\n                          }\n                        )}\n                      </>\n                    </TableBody>\n                  </Table>\n                </TableContainer>\n              </Grid>\n              : isKicad\n                ? <center> <Button variant=\"outlined\" fullWidth={true} size=\"large\" onClick={() => { openKicad(); close() }} color=\"primary\">\n                Upload .sch File\n                </Button> </center>\n                : <Grid item xs={12} sm={12}>\n                  {/* Listing Saved Schematics */}\n                  {schematics.length === 0\n                    ? <Typography variant=\"subtitle1\" gutterBottom>\n                    Hey {auth.user.username} , You dont have any saved schematics...\n                    </Typography>\n                    : <TableContainer component={Paper} style={{ maxHeight: '45vh' }}>\n                      <Table stickyHeader size=\"small\" aria-label=\"simple table\">\n                        <TableHead>\n                          <TableRow>\n                            <TableCell align=\"center\">Name</TableCell>\n                            <TableCell align=\"center\">Description</TableCell>\n                            <TableCell align=\"center\">Created</TableCell>\n                            <TableCell align=\"center\">Updated</TableCell>\n                            <TableCell align=\"center\">Launch</TableCell>\n                          </TableRow>\n                        </TableHead>\n                        <TableBody>\n                          <>\n                            {schematics.map(\n                              (sch) => {\n                                return (\n                                  <TableRow key={sch.save_id}>\n                                    <TableCell align=\"center\">{sch.name}</TableCell>\n                                    <TableCell align=\"center\">\n                                      <Tooltip title={sch.description !== null ? sch.description : 'No description'} >\n                                        <span>\n                                          {sch.description !== null ? sch.description.slice(0, 30) + (sch.description.length < 30 ? '' : '...') : '-'}\n                                        </span>\n                                      </Tooltip>\n                                    </TableCell>\n                                    <TableCell align=\"center\">{getDate(sch.create_time)}</TableCell>\n                                    <TableCell align=\"center\">{getDate(sch.save_time)}</TableCell>\n                                    <TableCell align=\"center\">\n                                      <Button\n                                        size=\"small\"\n                                        color=\"primary\"\n                                        onClick={() => { dispatch(fetchSchematic(sch.save_id)) }}\n                                        variant={schSave.details.save_id === undefined ? 'outlined' : schSave.details.save_id !== sch.save_id ? 'outlined' : 'contained'}\n                                      >\n                                      Launch\n                                      </Button>\n                                    </TableCell>\n                                  </TableRow>\n                                )\n                              }\n                            )}\n                          </>\n                        </TableBody>\n                      </Table>\n                    </TableContainer>\n                  }\n                </Grid>\n          }\n        </DialogContentText>\n      </DialogContent>\n      <DialogActions>\n        <Button variant={isLocal ? 'outlined' : 'text'} onClick={() => { setisLocal(true); setisGallery(false); setisKicad(false) }} color=\"secondary\">\n          Local\n        </Button>\n        <Button variant={isGallery ? 'outlined' : 'text'} onClick={() => { dispatch(fetchGallery()); setisLocal(false); setisGallery(true) }} color=\"secondary\">\n          Gallery\n        </Button>\n        <Button variant={isKicad ? 'outlined' : 'text'} onClick={() => { setisLocal(false); setisGallery(false); setisKicad(true) }} color=\"secondary\">\n          KiCad\n        </Button>\n        {auth.isAuthenticated !== true\n          ? <></>\n          : <Button variant={!isGallery & !isLocal & !isKicad ? 'outlined' : 'text'} onClick={() => { dispatch(fetchSchematics()); setisLocal(false); setisGallery(false); setisKicad(false) }} color=\"secondary\" >\n            on Cloud\n          </Button>\n        }\n        <Button onClick={close} color=\"primary\" autoFocus>\n          Close\n        </Button>\n      </DialogActions>\n    </Dialog>\n  )\n}\n\nOpenSchDialog.propTypes = {\n  close: PropTypes.func.isRequired,\n  open: PropTypes.bool.isRequired,\n  openLocal: PropTypes.func.isRequired,\n  openKicad: PropTypes.func.isRequired\n}\n\nfunction SimpleSnackbar ({ open, close, message }) {\n  return (\n    <div>\n      <Snackbar\n        anchorOrigin={{\n          vertical: 'bottom',\n          horizontal: 'left'\n        }}\n        open={open}\n        autoHideDuration={4000}\n        onClose={close}\n        message={message}\n        action={\n          <React.Fragment>\n            <IconButton size=\"small\" aria-label=\"close\" color=\"inherit\" onClick={close}>\n              <CloseIcon fontSize=\"small\" />\n            </IconButton>\n          </React.Fragment>\n        }\n      />\n    </div>\n  )\n}\n\nSimpleSnackbar.propTypes = {\n  open: PropTypes.bool,\n  close: PropTypes.func,\n  message: PropTypes.string\n}\n\nfunction TabPanel (props) {\n  const { children, value, index, ...other } = props\n\n  return (\n    <div\n      role=\"tabpanel\"\n      hidden={value !== index}\n      id={`full-width-tabpanel-${index}`}\n      aria-labelledby={`full-width-tab-${index}`}\n      {...other}\n    >\n      {value === index && (\n        <Box>\n          {children}\n        </Box>\n      )}\n    </div>\n  )\n}\n\nTabPanel.propTypes = {\n  children: PropTypes.node,\n  index: PropTypes.any.isRequired,\n  value: PropTypes.any.isRequired\n}\n\nfunction LibraryRow ({ library }) {\n  const dispatch = useDispatch()\n  const [open, setopen] = React.useState(false)\n  const classes = useStyles()\n  const components = useSelector(state => state.schematicEditorReducer.components)\n\n  const handleAppply = (lib) => {\n    dispatch(fetchLibrary(lib.id))\n  }\n\n  const handleUnapply = (lib) => {\n    dispatch(removeLibrary(lib.id))\n  }\n\n  const handleOpen = () => {\n    if (components[library.id].length === 0) { dispatch(fetchComponents(library.id)) }\n    setopen(!open)\n  }\n\n  return (\n    <Paper style={{ marginBottom: '.5rem' }}>\n      <ListSubheader>\n        <ListItem onClick={handleOpen} >\n          {open ? <ExpandLess /> : <ExpandMore />}\n          <ListItemText primary={library.library_name.slice(0, -4)} />\n          <ListItemSecondaryAction>\n            {(!library.default && !library.additional) &&\n              <Button variant=\"contained\" size=\"small\"\n                style={{ backgroundColor: '#ff1744', color: '#ffffff', margin: '.5rem' }}\n                onClick={() => { dispatch(deleteLibrary(library.id)) }} hidden={library.default || library.additional} >\n                Delete\n              </Button>\n            }\n            {library.active\n              ? <Button variant=\"contained\" size=\"small\" color=\"secondary\"\n                onClick={() => { handleUnapply(library) }} style={{ margin: '.5rem' }}>\n                Remove\n              </Button>\n              : <Button variant=\"contained\" size=\"small\" color=\"primary\"\n                onClick={() => { handleAppply(library) }} style={{ margin: '.5rem' }}>\n                Use\n              </Button>\n            }\n          </ListItemSecondaryAction>\n        </ListItem>\n      </ListSubheader>\n\n      {(components[library.id]) &&\n        <Collapse in={open} timeout=\"auto\" unmountOnExit>\n          <List component=\"div\" style={{ paddingLeft: '1rem', paddingRight: '1rem' }}>\n            {components[library.id].map(component => {\n              return (\n                <ListItem alignItems='center' key={component.id} dense className={classes.nested}>\n                  <ListItemText primary={component.name} secondary={component.description} />\n                </ListItem>\n              )\n            })}\n          </List>\n        </Collapse>\n      }\n    </Paper>\n  )\n}\n\nLibraryRow.propTypes = {\n  library: PropTypes.any.isRequired\n}\n\nexport function SelectLibrariesModal ({ open, close }) {\n  const allLibraries = useSelector(state => state.schematicEditorReducer.allLibraries)\n  const libraries = useSelector(state => state.schematicEditorReducer.libraries)\n  const uploadSuccess = useSelector(state => state.schematicEditorReducer.uploadSuccess)\n  const auth = useSelector(state => state.authReducer)\n  const dispatch = useDispatch()\n  const classes = useStyles()\n  const [activeLibraries, setActiveLibraries] = React.useState(allLibraries)\n  const [message, setMessage] = React.useState('')\n  const [uploadDisable, setUploadDisable] = React.useState(false)\n  const [tabValue, setTabValue] = React.useState(0)\n\n  useEffect(() => {\n    if (open === true) { dispatch(fetchAllLibraries()) }\n  }, [dispatch, open])\n\n  useEffect(() => {\n    setUploadDisable(false)\n    if (uploadSuccess === true) {\n      setMessage('Upload Successful')\n      setsnacOpen(true)\n      dispatch(resetUploadSuccess())\n      dispatch(fetchAllLibraries())\n    }\n    if (uploadSuccess === false) {\n      setMessage('An Error Occured')\n      setsnacOpen(true)\n      dispatch(resetUploadSuccess())\n    }\n  }, [dispatch, uploadSuccess])\n\n  useEffect(() => {\n    const updateActive = () => {\n      const active = []\n      if (allLibraries !== undefined) {\n        allLibraries.forEach((element) => {\n          element.active = false\n          libraries.forEach(ele => {\n            if (ele.id === element.id) {\n              element.active = true\n            }\n          })\n          active.push(element)\n        })\n      }\n      setActiveLibraries(active)\n    }\n\n    if (allLibraries !== undefined) {\n      updateActive()\n    }\n  }, [libraries, allLibraries])\n\n  const fileUpload = React.useRef(null)\n\n  const handlFileUpload = (event) => {\n    setUploadDisable(true)\n    const files = event.target.files\n    const formData = new FormData()\n    for (let i = 0; i < files.length; i++) {\n      formData.append('files', files[i])\n    }\n    dispatch(uploadLibrary(formData))\n  }\n\n  const handleLibUploadOpen = () => {\n    fileUpload.current.click()\n  }\n\n  const [snacOpen, setsnacOpen] = React.useState(false)\n  const handleSnacClose = () => {\n    setsnacOpen(false)\n  }\n\n  const handleTabChange = (event, value) => {\n    setTabValue(value)\n  }\n\n  return (\n    <Dialog\n      className=\"modal-library-detail\"\n      open={open}\n      onClose={close}\n      scroll=\"paper\"\n      fullWidth\n      maxWidth=\"md\"\n      TransitionComponent={Transition}\n      aria-labelledby=\"library-select-dialog\"\n      aria-describedby=\"library-select\"\n    >\n      <DialogTitle>\n        <Typography variant=\"h6\">{'Manage libraries in the workspace'}</Typography>\n        <Divider fullWidth />\n        {/* </DialogTitle>\n      <DialogTitle> */}\n        <Tabs value={tabValue} onChange={handleTabChange} centered >\n          <Tab label=\"DEFAULT\" />\n          <Tab label=\"ADDITIONAL\" />\n          <Tab label=\"UPLOADED\" />\n        </Tabs>\n      </DialogTitle>\n      <DialogContent dividers>\n        <DialogContentText id=\"open-dialog-description\" >\n\n          {activeLibraries !== undefined\n            ? <>\n              <TabPanel value={tabValue} index={0}>\n                <List fullwidth className={classes.root}>\n                  {allLibraries.find(lib => {\n                    return lib.default === true\n                  })\n                    ? allLibraries.map(library => {\n                      if (library.default) { return <LibraryRow library={library} /> }\n                      return <></>\n                    })\n                    : <p>Nothing to show</p>\n                  }\n                </List>\n              </TabPanel>\n              <TabPanel value={tabValue} index={1}>\n                <List fullwidth className={classes.root}>\n                  {allLibraries.find(lib => {\n                    return lib.additional === true\n                  })\n                    ? allLibraries.map(library => {\n                      if (library.additional) { return <LibraryRow library={library} /> }\n                      return <></>\n                    })\n                    : <p>Nothing to show</p>\n                  }\n                </List>\n              </TabPanel>\n              <TabPanel value={tabValue} index={2}>\n                <List fullwidth className={classes.root}>\n                  {allLibraries.find(lib => {\n                    return (lib.additional === false && lib.default === false)\n                  })\n                    ? allLibraries.map(library => {\n                      if (!library.default && !library.additional) { return <LibraryRow library={library} /> }\n                      return <></>\n                    })\n                    : <p>Nothing to show</p>\n                  }\n                </List>\n              </TabPanel>\n            </>\n            : <p>Nothing To Show</p>\n          }\n        </DialogContentText>\n      </DialogContent>\n      {auth.isAuthenticated && tabValue === 2 &&\n        <DialogActions style={{ display: 'flex', justifyContent: 'center' }}>\n          <div>\n            {uploadDisable &&\n              <div style={{ paddingBottom: '10px' }}>\n                <Alert severity=\"info\">Files are being uploaded please wait.</Alert>\n              </div>\n            }\n            <Button display=\"block\" variant=\"contained\" size=\"large\" color=\"primary\"\n              onClick={() => { handleLibUploadOpen() }} disabled={uploadDisable} disableElevation={true}>\n              Upload .lib and .dcm Files\n              <input type=\"file\" multiple={true} accept=\".lib,.dcm\" ref={fileUpload} onChange={handlFileUpload} style={{ display: 'none' }} />\n            </Button>\n            <SimpleSnackbar open={snacOpen} close={handleSnacClose} message={message} />\n          </div>\n        </DialogActions>\n      }\n    </Dialog>\n  )\n}\n\nSelectLibrariesModal.propTypes = {\n  open: PropTypes.bool.isRequired,\n  close: PropTypes.func.isRequired\n}\n"
  },
  {
    "path": "eda-frontend/src/components/SchematicEditor/VersionComponent.js",
    "content": "/* eslint-disable camelcase */\nimport React from 'react'\nimport { Button, IconButton } from '@material-ui/core'\nimport DeleteOutlineIcon from '@material-ui/icons/DeleteOutline'\nimport PropTypes from 'prop-types'\nimport api from '../../utils/Api'\nimport Popover from '@material-ui/core/Popover'\nimport Typography from '@material-ui/core/Typography'\nimport { makeStyles } from '@material-ui/core/styles'\n\nconst useStyles = makeStyles((theme) => ({\n  typography: {\n    padding: theme.spacing(2)\n  }\n}))\n\nexport default function VersionComponent ({\n  name,\n  date,\n  time,\n  save_id,\n  version,\n  branch,\n  setVersions,\n  setBranchOpen,\n  projectBranch,\n  projectVersion,\n  ltiId\n}) {\n  const classes = useStyles()\n\n  const [anchorEl, setAnchorEl] = React.useState(null)\n\n  const [popoverOpen, setPopoverOpen] = React.useState(false)\n\n  const handleClickPopover = (e) => {\n    setAnchorEl(e.currentTarget)\n    setPopoverOpen(true)\n  }\n\n  const handleClosePopover = () => {\n    setAnchorEl(null)\n    setPopoverOpen(false)\n  }\n\n  const handleClick = (e) => {\n    e.preventDefault()\n    if (!ltiId) {\n      window.location = '#/editor?id=' + save_id + '&version=' + version + '&branch=' + branch\n    } else {\n      window.location = '#/editor?id=' + save_id + '&version=' + version + '&lti_id=' + ltiId + '&branch=' + branch\n    }\n    window.location.reload()\n  }\n\n  const checkActiveVersionOrProject = (version, branch) => {\n    if (version === window.location.href.split('version=')[1].substr(0, 20) && branch === decodeURI(window.location.href.split('branch=')[1])) return false\n    if (version === projectVersion && branch === projectBranch) return false\n    return true\n  }\n\n  const handleVersionDelete = (save_id, version, branch) => {\n    const config = {\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded'\n      }\n    }\n    const token = localStorage.getItem('esim_token')\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    api.delete(`/save/${save_id}/${version}/${branch}`, config).then(resp => {\n      api\n        .get(\n          'save/versions/' +\n          window.location.href.split('?id=')[1].substring(0, 36),\n          config\n        )\n        .then((resp) => {\n          console.log(resp.data)\n          const versionsAccordingFreq = {}\n          resp.data.forEach((value) => {\n            const d = new Date(value.save_time)\n            value.date =\n              d.getDate() + '/' + parseInt(d.getMonth() + 1) + '/' + d.getFullYear()\n            value.time = d.getHours() + ':' + d.getMinutes()\n            if (d.getMinutes() < 10) {\n              value.time = d.getHours() + ':0' + d.getMinutes()\n            }\n            versionsAccordingFreq[value.branch] ? versionsAccordingFreq[value.branch].push(value) : versionsAccordingFreq[value.branch] = [value]\n          })\n          setVersions(Object.entries(versionsAccordingFreq).reverse())\n          const temp = []\n          for (let i = 0; i < Object.entries(versionsAccordingFreq).length; i++) {\n            console.log(Object.entries(versionsAccordingFreq)[0])\n            if (decodeURI(window.location.href.split('branch=')[1]) === Object.entries(versionsAccordingFreq)[i][0]) { temp.push(true) } else { temp.push(false) }\n          }\n          setBranchOpen(temp.reverse())\n        })\n        .catch((err) => {\n          console.log(err)\n        })\n    }).catch(err => {\n      console.log(err)\n    })\n  }\n\n  return (\n    <div style={{ display: 'flex', alignItems: 'left', flexWrap: 'wrap' }}>\n      <Button\n        style={{ overflowX: 'hidden', width: '77%' }}\n        size=\"small\"\n        color=\"primary\"\n        disabled={((version === window.location.href.split('version=')[1].substr(0, 20)) && (branch === decodeURI(window.location.href.split('branch=')[1])))}\n        onClick={handleClick}\n      >\n        <p>\n          {name} <br /> {date} {time}\n        </p>\n      </Button>\n      {\n        checkActiveVersionOrProject(version, branch) &&\n        <>\n          <IconButton style={{ backgroundColor: 'transparent' }} onClick={(e) => handleClickPopover(e)}>\n            <DeleteOutlineIcon fontSize=\"small\"/>\n          </IconButton>\n          <Popover\n            open={popoverOpen}\n            anchorEl={anchorEl}\n            onClose={() => handleClosePopover()}\n            anchorOrigin={{\n              vertical: 'bottom',\n              horizontal: 'center'\n            }}\n            transformOrigin={{\n              vertical: 'top',\n              horizontal: 'center'\n            }}\n          >\n            <Typography className={classes.typography}>\n              <b>Are you sure you want to delete this version?</b>\n            </Typography>\n            <Button style={{ marginLeft: '5%', backgroundColor: 'transparent' }} onClick={() => handleVersionDelete(save_id, version, branch)}>\n            Delete Version\n            </Button>\n          </Popover>\n        </>\n      }\n      <br />\n    </div>\n  )\n}\n\nVersionComponent.propTypes = {\n  name: PropTypes.string,\n  date: PropTypes.string,\n  time: PropTypes.string,\n  save_id: PropTypes.string,\n  version: PropTypes.string,\n  branch: PropTypes.string,\n  setVersions: PropTypes.func,\n  setBranchOpen: PropTypes.func,\n  projectBranch: PropTypes.string,\n  projectVersion: PropTypes.string,\n  ltiId: PropTypes.string\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Shared/Graph.js",
    "content": "/* eslint-disable react/prop-types */\nimport React, { Component } from 'react'\nimport Chart from 'chart.js'\n\nimport 'chartjs-plugin-colorschemes'\nlet lineGraph\n\n// Chart Style Options\nChart.defaults.global.defaultFontColor = '#e6e6e6'\n\nclass Graph extends Component {\n  chartRef = React.createRef();\n\n  componentDidMount () {\n    this.buildChart()\n  }\n\n  componentDidUpdate () {\n    this.buildChart()\n  }\n\n  buildChart = () => {\n    const myChartRef = this.chartRef.current.getContext('2d')\n    const { x, y, labels, xscale, yscale, precision } = this.props\n    // ticks are the number of points to show on x axis\n    const scales = {\n      G: { value: 1000000000, ticks: 3 },\n      M: { value: 1000000, ticks: 3 },\n      K: { value: 1000, ticks: 3 },\n      si: { value: 1, ticks: 3 },\n      m: { value: 0.001, ticks: 5 },\n      u: { value: 0.000001, ticks: 7 },\n      n: { value: 0.000000001, ticks: 9 },\n      p: { value: 0.000000000001, ticks: 11 }\n    }\n    if (typeof lineGraph !== 'undefined') lineGraph.destroy()\n\n    const dataset = () => {\n      var arr = []\n\n      for (var i = 0; i < y.length; i++) {\n        if (labels[0] === labels[i + 1]) continue\n        arr.push({\n          label: labels[i + 1],\n          data: y[i].map(e => (e / scales[yscale].value).toFixed(precision)),\n          fill: false\n          // borderColor: getRandomColor()\n        })\n      }\n      return arr\n    }\n    const selectLabel = () => {\n      if (labels[0] === 'time') {\n        if (xscale === 'si') {\n          return 'Time in S'\n        } else {\n          return `Time in ${xscale}S`\n        }\n      } else if (labels[0] === 'v-sweep') {\n        if (xscale === 'si') {\n          return 'Voltage in V'\n        } else {\n          return `Voltage in ${xscale}V`\n        }\n      } else if (labels[0] === 'frequency') {\n        if (xscale === 'si') {\n          return 'frequency in Hz'\n        } else {\n          return `frequency in ${xscale}Hz`\n        }\n      } else {\n        if (xscale === 'si') {\n          return `${labels[0]}`\n        } else {\n          return `${labels[0]} in ${xscale}`\n        }\n      }\n    }\n\n    lineGraph = new Chart(myChartRef, {\n      type: 'line',\n      data: {\n\n        // labels: x,\n        labels: x.map(e => (e / scales[xscale].value).toFixed(precision)),\n        datasets: dataset()\n      },\n\n      options: {\n        plugins: {\n\n          colorschemes: {\n\n            scheme: 'brewer.SetOne9'\n\n          }\n        },\n        responsive: true,\n        title: {\n          display: false,\n          text: ''\n        },\n        tooltips: {\n          mode: 'index',\n          intersect: false,\n          backgroundColor: '#39604d'\n        },\n        hover: {\n          mode: 'nearest',\n          intersect: true\n        },\n        scales: {\n          xAxes: [\n            {\n              display: true,\n              gridLines: {\n                color: '#67737e'\n              },\n              scaleLabel: {\n                display: true,\n                labelString: selectLabel()\n              },\n\n              ticks: {\n                maxTicksLimit: scales[xscale].ticks\n              }\n            }\n          ],\n          yAxes: [\n            {\n              display: true,\n              scaleLabel: {\n                display: false,\n                labelString: 'Volatge ( V )'\n              },\n              gridLines: {\n                color: '#67737e'\n              },\n              ticks: {\n                // beginAtZero: true,\n                fontSize: 15,\n                padding: 25\n              }\n            }\n          ]\n        }\n      }\n    })\n  };\n\n  render () {\n    return (\n      <div>\n        <canvas id=\"myChart\" ref={this.chartRef} />\n      </div>\n    )\n  }\n}\n\nexport default Graph\n"
  },
  {
    "path": "eda-frontend/src/components/Shared/Layout.js",
    "content": "import React from 'react'\nimport PropTypes from 'prop-types'\nimport { AppBar, IconButton, Toolbar } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport MenuIcon from '@material-ui/icons/Menu'\n\nimport LayoutSidebar from './LayoutSidebar'\n\nconst useStyles = makeStyles((theme) => ({\n  appBar: {\n    borderBottom: `1px solid ${theme.palette.divider}`,\n    zIndex: theme.zIndex.drawer + 1\n  },\n  menuButton: {\n    marginRight: theme.spacing(1),\n    padding: theme.spacing(1),\n    [theme.breakpoints.up('md')]: {\n      display: 'none'\n    }\n  }\n}))\n\n// Common layout for Dashboard and Schematic Editor\nfunction Layout ({ header, resToolbar, sidebar }) {\n  const classes = useStyles()\n  const [mobileOpen, setMobileOpen] = React.useState(false)\n\n  const handleDrawerToggle = () => {\n    setMobileOpen(!mobileOpen)\n  }\n\n  return (\n    <>\n      {/* Header and Toolbar of layout */}\n      <AppBar\n        position=\"fixed\"\n        color=\"default\"\n        elevation={0}\n        className={classes.appBar}\n      >\n        {header}\n\n        <Toolbar variant=\"dense\" color=\"default\">\n          <IconButton\n            color=\"inherit\"\n            aria-label=\"open drawer\"\n            edge=\"start\"\n            size=\"small\"\n            onClick={handleDrawerToggle}\n            className={classes.menuButton}\n          >\n            <MenuIcon fontSize=\"small\" />\n          </IconButton>\n\n          {resToolbar}\n        </Toolbar>\n      </AppBar>\n\n      {/* Left Sidebar for Layout */}\n      <LayoutSidebar mobileOpen={mobileOpen} mobileClose={handleDrawerToggle}>\n        {sidebar}\n      </LayoutSidebar>\n    </>\n  )\n}\n\nLayout.propTypes = {\n  header: PropTypes.element,\n  resToolbar: PropTypes.element,\n  sidebar: PropTypes.element\n}\n\nexport default Layout\n"
  },
  {
    "path": "eda-frontend/src/components/Shared/LayoutMain.js",
    "content": "import React from 'react'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/core/styles'\n\nconst useStyles = makeStyles((theme) => ({\n  content: {\n    flexGrow: 1,\n    padding: theme.spacing(5, 3),\n    backgroundColor: '#f4f6f8',\n    height: '100vh',\n    overflow: 'auto'\n  }\n}))\n\n// Display main content of layout\nexport default function LayoutMain ({ children }) {\n  const classes = useStyles()\n\n  return (\n    <>\n      <main className={classes.content}>\n        {children}\n      </main>\n    </>\n  )\n}\n\nLayoutMain.propTypes = {\n  children: PropTypes.array.isRequired\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Shared/LayoutSidebar.js",
    "content": "import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Drawer, Hidden, IconButton } from '@material-ui/core'\nimport HighlightOffIcon from '@material-ui/icons/HighlightOff'\nimport { makeStyles } from '@material-ui/core/styles'\n\nconst drawerWidth = 250\n\nconst useStyles = makeStyles((theme) => ({\n  drawer: {\n    [theme.breakpoints.up('md')]: {\n      width: drawerWidth,\n      flexShrink: 0\n    }\n  },\n  drawerPaper: {\n    width: drawerWidth\n  }\n}))\n\n// Common layout left side pane for Dashboard and Schematic Editor\nexport default function LayoutSidebar ({ window, mobileOpen, mobileClose, children }) {\n  const classes = useStyles()\n\n  const container =\n    window !== undefined ? () => window().document.body : undefined\n\n  return (\n    <>\n      <nav className={classes.drawer} aria-label=\"mailbox folders\">\n        <Hidden lgUp implementation=\"css\">\n          <Drawer\n            container={container}\n            variant=\"temporary\"\n            open={mobileOpen}\n            onClose={mobileClose}\n            classes={{\n              paper: classes.drawerPaper\n            }}\n            ModalProps={{\n              keepMounted: true // Better open performance on mobile.\n            }}\n          >\n            <IconButton\n              onClick={mobileClose}\n              color=\"inherit\"\n              style={{ marginLeft: '190px' }}\n            >\n              <HighlightOffIcon />\n            </IconButton>\n            {children}\n          </Drawer>\n        </Hidden>\n\n        <Hidden smDown implementation=\"css\">\n          <Drawer\n            classes={{\n              paper: classes.drawerPaper\n            }}\n            variant=\"permanent\"\n            open\n          >\n            {children}\n          </Drawer>\n        </Hidden>\n      </nav>\n    </>\n  )\n}\n\nLayoutSidebar.propTypes = {\n  window: PropTypes.object,\n  mobileOpen: PropTypes.bool.isRequired,\n  mobileClose: PropTypes.func.isRequired,\n  children: PropTypes.element\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Shared/Navbar.js",
    "content": "import React, { useEffect } from 'react'\nimport { useHistory, Link as RouterLink } from 'react-router-dom'\nimport { useDispatch } from 'react-redux'\nimport {\n  AppBar,\n  Button,\n  Toolbar,\n  Typography,\n  Link,\n  IconButton,\n  Avatar,\n  Menu,\n  ListItemText,\n  Fade,\n  MenuItem\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { deepPurple } from '@material-ui/core/colors'\nimport logo from '../../static/logo.png'\nimport store from '../../redux/store'\nimport { authDefault, loadUser, logout } from '../../redux/actions/index'\n\nconst useStyles = makeStyles((theme) => ({\n  appBar: {\n    borderBottom: `1px solid ${theme.palette.divider}`\n  },\n  root: {\n    width: 500\n  },\n  toolbar: {\n    flexWrap: 'wrap'\n  },\n  toolbarTitle: {\n    flexGrow: 1\n  },\n  link: {\n    margin: theme.spacing(1, 1.5)\n  },\n  button: {\n    marginRight: theme.spacing(0.7)\n  },\n  small: {\n    width: theme.spacing(3.7),\n    height: theme.spacing(3.7)\n  },\n  purple: {\n    width: theme.spacing(3.75),\n    height: theme.spacing(3.75),\n    color: theme.palette.getContrastText(deepPurple[500]),\n    backgroundColor: deepPurple[500],\n    fontSize: '17px'\n  },\n  typography: {\n    padding: theme.spacing(2)\n  }\n}))\n\n// Common navbar for Dashboard, Home, Simulator, Gallery, etc.\nexport function Header () {\n  const history = useHistory()\n  const classes = useStyles()\n  const [anchorEl, setAnchorEl] = React.useState(null)\n  const auth = store.getState().authReducer\n  const dispatch = useDispatch()\n\n  const handleClick = (event) => {\n    setAnchorEl(event.currentTarget)\n  }\n\n  const handleClose = () => {\n    setAnchorEl(null)\n  }\n  var homeURL = `${window.location.protocol}\\\\\\\\${window.location.host}/`\n  useEffect(() => {\n    function checkUserData () {\n      const userToken = localStorage.getItem('esim_token')\n      if (userToken && userToken !== '') {\n        dispatch(loadUser())\n      } else {\n        dispatch(authDefault())\n      }\n    }\n\n    window.addEventListener('storage', checkUserData)\n\n    return () => {\n      window.removeEventListener('storage', checkUserData)\n    }\n  }, [dispatch, history])\n\n  return (\n    <>\n      {/* Display logo */}\n      <IconButton edge=\"start\" className={classes.button} color=\"primary\">\n        <Avatar alt=\"esim logo\" src={logo} className={classes.small} />\n      </IconButton>\n      <Typography\n        variant=\"h6\"\n        color=\"inherit\"\n        noWrap\n        className={classes.toolbarTitle}\n      >\n        <Link color=\"inherit\" to=\"/\" component={RouterLink}>\n          eSim\n        </Link>\n      </Typography>\n\n      {/* Display relative link to other pages */}\n      <nav>\n        {\n          (auth.isAuthenticated\n            ? (<>\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                onClick={() => { window.open(homeURL, '_self') }}\n                component={RouterLink}\n                className={classes.link}\n                // style={{ marginLeft: '65%' }}\n              >\n                Home\n              </Link>\n\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                to=\"/editor\"\n                component={RouterLink}\n                className={classes.link}\n              >\n                Editor\n              </Link>\n\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                to=\"/gallery\"\n                component={RouterLink}\n                className={classes.link}\n              >\n                Gallery\n              </Link>\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                to=\"/projects\"\n                component={RouterLink}\n                className={classes.link}\n              >\n                Projects\n              </Link>\n\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                to=\"/simulator/ngspice\"\n                component={RouterLink}\n                className={classes.link}\n              >\n                Simulator\n              </Link>\n\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                to=\"/dashboard\"\n                component={RouterLink}\n                className={classes.link}\n              >\n                Dashboard\n              </Link>\n            </>)\n            : (<>\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                onClick={() => { window.open(homeURL, '_self') }}\n                component={RouterLink}\n                // className={classes.link}\n                style={{ marginRight: '20px' }}\n              >\n                Home\n              </Link>\n\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                to=\"/editor\"\n                component={RouterLink}\n                style={{ marginRight: '20px' }}\n              >\n                Editor\n              </Link>\n\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                to=\"/gallery\"\n                component={RouterLink}\n                style={{ marginRight: '20px' }}\n              >\n                Gallery\n              </Link>\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                to=\"/projects\"\n                component={RouterLink}\n                className={classes.link}\n                style={{ marginRight: '20px' }}\n              >\n                Projects\n              </Link>\n              <Link\n                variant=\"button\"\n                color=\"textPrimary\"\n                to=\"/simulator/ngspice\"\n                component={RouterLink}\n                style={{ marginRight: '20px' }}\n              >\n                Simulator\n              </Link>\n            </>\n            )\n          )\n        }\n      </nav>\n\n      {/* Display login option or user menu as per authenticated status */}\n      {\n        (!auth.isAuthenticated ? (<Button\n          size=\"small\"\n          component={RouterLink}\n          to=\"/login?close=close\"\n          color=\"primary\"\n          variant=\"outlined\"\n          target=\"_blank\"\n        >\n          Login\n        </Button>)\n          : (<>\n            <IconButton\n              edge=\"start\"\n              style={{ marginLeft: 'auto' }}\n              color=\"primary\"\n              aria-controls=\"simple-menu\"\n              aria-haspopup=\"true\"\n              onClick={handleClick}\n            >\n              <Avatar className={classes.purple}>\n                {auth.user.username.charAt(0).toUpperCase()}\n              </Avatar>\n            </IconButton>\n            <Menu\n              id=\"simple-menu\"\n              anchorEl={anchorEl}\n              keepMounted\n              open={Boolean(anchorEl)}\n              onClose={handleClose}\n              TransitionComponent={Fade}\n              style={{ marginTop: '25px' }}\n            >\n              <MenuItem\n                component={RouterLink}\n                to=\"/dashboard\"\n                onClick={handleClose}\n              >\n                <ListItemText primary={auth.user.username} secondary={auth.user.email} />\n              </MenuItem>\n              <MenuItem\n                component={RouterLink}\n                to=\"/dashboard/profile\"\n                onClick={handleClose}\n              >\n                My Profile\n              </MenuItem>\n              <MenuItem\n                component={RouterLink}\n                to=\"/dashboard/schematics\"\n                onClick={handleClose}\n              >\n                My Schematics\n              </MenuItem>\n              <MenuItem\n                component={RouterLink}\n                to=\"/account/change_password\"\n                onClick={handleClose}\n              >\n                Change password\n              </MenuItem>\n              <MenuItem onClick={() => {\n                store.dispatch(logout(history))\n              }}>\n                Logout\n              </MenuItem>\n            </Menu>\n          </>\n          )\n        )\n      }\n    </>\n  )\n}\n\nexport default function Navbar () {\n  const classes = useStyles()\n\n  return (\n    <AppBar\n      position=\"static\"\n      color=\"default\"\n      elevation={0}\n      className={classes.appBar}\n    >\n      <Toolbar variant=\"dense\" color=\"default\" className={classes.toolbar}>\n\n        <Header />\n      </Toolbar>\n    </AppBar>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Shared/Notice.js",
    "content": "import React from 'react'\nimport PropTypes from 'prop-types'\nimport './helper/Notice.css'\nimport {\n  IconButton\n} from '@material-ui/core'\nimport CloseIcon from '@material-ui/icons/Close'\nimport Button from '@material-ui/core/Button'\nimport Dialog from '@material-ui/core/Dialog'\nimport DialogActions from '@material-ui/core/DialogActions'\nimport DialogContent from '@material-ui/core/DialogContent'\nimport DialogContentText from '@material-ui/core/DialogContentText'\nimport DialogTitle from '@material-ui/core/DialogTitle'\nimport { SpinnerDotted } from 'spinners-react'\n\nexport function ScrollDialog (txt) {\n  const [open, setOpen] = React.useState(true)\n  const [scroll, setScroll] = React.useState('paper')\n\n  const handleClickOpen = () => {\n    setOpen(true)\n    setScroll('paper')\n  }\n\n  const handleClose = () => {\n    setOpen(false)\n  }\n  const descriptionElementRef = React.useRef(null)\n  React.useEffect(() => {\n    if (open) {\n      const { current: descriptionElement } = descriptionElementRef\n      if (descriptionElement !== null) {\n        descriptionElement.focus()\n      }\n    }\n  }, [open])\n\n  return (\n    <div>\n      <Button onClick={handleClickOpen}>View More</Button>\n      <Dialog\n        maxWidth='md'\n        open={open}\n        onClose={handleClose}\n        scroll={scroll}\n        aria-labelledby=\"scroll-dialog-title\"\n        aria-describedby=\"scroll-dialog-description\"\n      >\n        <DialogTitle id=\"scroll-dialog-title\" classes={{ root: 'title' }}>Error Details</DialogTitle>\n        <DialogContent dividers={scroll === 'paper'}>\n          <DialogContentText\n            id=\"scroll-dialog-description\"\n            ref={descriptionElementRef}\n            tabIndex={-1}\n          >\n            {<pre>{txt.txt} </pre>}\n          </DialogContentText>\n        </DialogContent>\n        <DialogActions>\n          <Button onClick={handleClose} color=\"primary\">\n            Close\n          </Button>\n        </DialogActions>\n      </Dialog>\n    </div>\n  )\n}\nexport default function Notice ({ status, msg, open, close }) {\n  // open = true\n  // status = 'success'\n  const MAX_CHARS = 180\n  const err = ((msg.length) > MAX_CHARS)\n    ? msg.substring(0, MAX_CHARS) + '...'\n    : msg.substring(0, MAX_CHARS)\n  if (open === true) {\n    switch (status) {\n      case 'loading':\n        return (\n          <div>\n            <div className=\"error-notice\">\n              <div className=\"notice warning\">\n                <SpinnerDotted size=\"25\" thickness=\"100\" color=\"#f0ad4e\" />\n                <strong> Loading...</strong>\n              </div>\n            </div>\n          </div>\n        )\n      case 'success':\n        return (\n          <div>\n            <div className=\"error-notice\">\n              <div className=\"notice success\">\n                <IconButton edge=\"start\" size=\"small\" color=\"inherit\" onClick={close} aria-label=\"close\">\n                  <CloseIcon />\n                </IconButton>\n                <strong>Success</strong> - Simulation ran successfully!\n              </div>\n            </div>\n          </div>\n        )\n      case 'error':\n        return (\n          <div>\n            <div className=\"error-notice\">\n              <div className=\"notice danger\">\n                <IconButton edge=\"start\" size=\"small\" color=\"inherit\" onClick={close} aria-label=\"close\">\n                  <CloseIcon />\n                </IconButton>\n                <strong>  Error</strong>- {err} <ScrollDialog txt={msg}/>\n              </div>\n            </div>\n          </div>\n        )\n      default:\n        return (\n          <div></div>\n        )\n    }\n  } else {\n    return (<div></div>)\n  }\n}\n\nError.propTypes = {\n  status: PropTypes.string,\n  msg: PropTypes.string,\n  close: PropTypes.func,\n  open: PropTypes.bool\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Shared/SimulationScreen.js",
    "content": "import React, { useEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n  Slide,\n  Button,\n  Dialog,\n  AppBar,\n  Toolbar,\n  IconButton,\n  Typography,\n  Grid,\n  TextField,\n  Paper,\n  Container,\n  Table,\n  TableBody,\n  TableCell,\n  TableContainer,\n  TableHead,\n  TableRow,\n  MenuItem,\n  Select,\n  FormControl,\n  InputLabel\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport CloseIcon from '@material-ui/icons/Close'\nimport { useSelector } from 'react-redux'\nimport api from '../../utils/Api'\nimport queryString from 'query-string'\n\nimport Graph from './Graph'\n\nconst FileSaver = require('file-saver')\n\nconst Transition = React.forwardRef(function Transition (props, ref) {\n  return <Slide direction=\"up\" ref={ref} {...props} />\n})\n\nconst useStyles = makeStyles((theme) => ({\n  appBar: {\n    position: 'relative'\n  },\n  title: {\n    marginLeft: theme.spacing(2),\n    flex: 1\n  },\n  header: {\n    padding: theme.spacing(5, 0, 6),\n    color: '#fff'\n  },\n  paper: {\n    padding: theme.spacing(2),\n    textAlign: 'center',\n    backgroundColor: '#404040',\n    color: '#fff'\n  }\n}))\n// {details:{},title:''} simResults\nexport default function SimulationScreen ({ open, close, isResult, taskId, simType = 'NgSpiceSimulator' }) {\n  const classes = useStyles()\n  const result = useSelector((state) => state.simulationReducer)\n  const stitle = useSelector((state) => state.saveSchematicReducer.title)\n  const netlist = useSelector((state) => state.netlistReducer.netlist)\n  const [xscale, setXScale] = React.useState('si')\n  const [yscale, setYScale] = React.useState('si')\n  const [scalesNonGraphArray, setScalesNonGraph] = useState([])\n  const [scalesNonGraphArrayCompare, setScalesNonGraphCompare] = useState([])\n  const [exactDecimal, setExactDecimal] = useState([])\n  const [exactDecimalCompare, setExactDecimalCompare] = useState([])\n  const [notation, setNotation] = React.useState('Engineering')\n  const [precision, setPrecision] = React.useState(5)\n  const [history, setHistory] = React.useState('')\n  const [historyId, setHistoryId] = React.useState('')\n  const [comparingSim, setComparingSim] = React.useState('')\n  const [compare, setCompare] = React.useState(false)\n  const [compareNetlist, setCompareNetlist] = React.useState(false)\n  const precisionArr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n  const scalesNonGraph = []\n  const scalesNonGraphCompare = []\n  const exactDecimalArray = []\n  const exactDecimalArrayCompare = []\n  const scales = {\n    G: 1000000000,\n    M: 1000000,\n    K: 1000,\n    si: 1,\n    m: 0.001,\n    u: 0.000001,\n    n: 0.000000001,\n    p: 0.000000000001\n  }\n\n  useEffect(() => {\n    if (close) {\n      setHistoryId('')\n      setCompare(false)\n      setComparingSim('')\n    }\n  }, [close])\n  useEffect(() => {\n    if (open) {\n      const url = queryString.parse(window.location.href.split('editor?')[1])\n      let getUrl = ''\n      const token = localStorage.getItem('esim_token')\n      const config = {\n        headers: {\n          'Content-Type': 'application/json'\n        }\n      }\n      if (url.id) {\n        getUrl = `simulation/history/${url.id}/${url.version}/${url.branch}/${simType}`\n      } else {\n        getUrl = `simulation/history/simulator/${simType}`\n      }\n      if (token) {\n        config.headers.Authorization = `Token ${token}`\n\n        api.get(getUrl, config).then(res => {\n          const arr = []\n          const temp2 = (result.isGraph === 'true')\n          res.data.map((ele, index) => {\n            ele.simulation_time = new Date(ele.simulation_time)\n            if (ele.result === null) {\n              arr.push(index)\n            } else {\n              var temp = (ele.result.graph === 'true')\n              if (!ele.result.graph || temp !== temp2) {\n                arr.push(index)\n              }\n            }\n            if (ele.task === taskId) {\n              arr.push(index)\n            }\n            return 0\n          })\n          for (let i = arr.length - 1; i >= 0; i--) {\n            res.data.splice(arr[i], 1)\n          }\n          setHistory(res.data)\n        }).catch(err => {\n          console.log(err)\n        })\n      }\n    }\n    // eslint-disable-next-line\n  }, [open])\n\n  const handleChangeSim = (e) => {\n    setHistoryId(e.target.value)\n    let schematic = []\n    if (e.target.value !== '') {\n      setCompare(true)\n      history.forEach(element => {\n        const data = element.result.data\n        if (element.id === e.target.value) {\n          if (element.result.graph === 'true') {\n            const simResultGraph = { labels: [], x_points: [], y_points: [] }\n            // populate the labels\n            for (let i = 0; i < data.length; i++) {\n              simResultGraph.labels[0] = data[i].labels[0]\n              const lab = data[i].labels\n              // lab is an array containeing labels names ['time','abc','def']\n              simResultGraph.x_points = data[0].x\n\n              // labels\n              for (let x = 1; x < lab.length; x++) {\n                simResultGraph.labels.push(lab[x])\n              }\n              // populate y_points\n              for (let z = 0; z < data[i].y.length; z++) {\n                simResultGraph.y_points.push(data[i].y[z])\n              }\n            }\n\n            simResultGraph.x_points = simResultGraph.x_points.map(d => parseFloat(d))\n\n            for (let i1 = 0; i1 < simResultGraph.y_points.length; i1++) {\n              simResultGraph.y_points[i1] = simResultGraph.y_points[i1].map(d => parseFloat(d))\n            }\n            schematic = simResultGraph\n            let val, idx\n            setScales(1, val, idx, null, null, schematic)\n          } else {\n            const simResultText = []\n            for (let i = 0; i < data.length; i++) {\n              let postfixUnit = ''\n              if (data[i][0].includes('#branch')) {\n                postfixUnit = 'A'\n              } else if (data[i][0].includes('transfer_function')) {\n                postfixUnit = ''\n              } else if (data[i][0].includes('impedance')) {\n                postfixUnit = 'Ohm'\n              } else {\n                if (data[i][0][0] !== 'V') {\n                  data[i][0] = `V(${data[i][0]})`\n                }\n                postfixUnit = 'V'\n              }\n\n              simResultText.push(data[i][0] + ' ' + data[i][1] + ' ' + parseFloat(data[i][2]) + ' ' + postfixUnit + '\\n')\n            }\n            schematic = simResultText\n            addScalesNonGraph(0, schematic, exactDecimalArrayCompare, scalesNonGraphCompare, setScalesNonGraphCompare, setExactDecimalCompare)\n          }\n          setCompareNetlist(element.netlist)\n        }\n      })\n      setComparingSim(schematic)\n    } else {\n      setCompare(false)\n    }\n  }\n  // DO NOT CHANGE THIS FUNCTION\n  const toFixed = (x) => {\n    let e = 0\n    if (Math.abs(x) < 1.0) {\n      e = parseInt(x.toString().split('e-')[1])\n      if (e) {\n        x *= Math.pow(10, e - 1)\n        x = '0.' + (new Array(e)).join('0') + x.toString().substring(2)\n      }\n    } else {\n      e = parseInt(x.toString().split('+')[1])\n      if (e > 20) {\n        e -= 20\n        x /= Math.pow(10, e)\n        x += (new Array(e + 1)).join('0')\n      }\n    }\n    return x\n  }\n\n  // DO NOT CHANGE\n  const decimalCount = (num1, num2) => {\n    const difference = toFixed(num1) - toFixed(num2)\n    const numStr = toFixed(difference).toString()\n    if (Math.abs(difference) < 1) {\n      if (numStr.includes('.')) {\n        return ['decimal', numStr.split('.')[1].length]\n      }\n    } else {\n      return ['notDecimal', numStr.split('.')[0].length]\n    }\n    return ['notDecimal', 1]\n  }\n\n  // DO NOT CHANGE\n  const decimalCountNonGraph = (num) => {\n    const numStr = num.toString()\n    if (Math.abs(num) < 1) {\n      if (numStr.includes('.')) {\n        const afterDeci = numStr.split('.')[1]\n        let count = 0\n        while (afterDeci[count] === '0') {\n          count++\n        }\n        return ['decimal', count + 2] // count + 2 to adjust with the scaling feature. 0.000xyz will become xyz.abc mUnit\n      }\n    } else {\n      return ['notDecimal', numStr.split('.')[0].length]\n    }\n    return ['notDecimal', 1]\n  }\n\n  // DO NOT CHANGE\n  const exactDecimalCount = (num) => {\n    const numStr = num.toString()\n    if (Math.abs(num) < 1) {\n      if (numStr.includes('.')) {\n        const afterDeci = numStr.split('.')[1]\n        let count = 0\n        while (afterDeci[count] === '0') {\n          count++\n        }\n        return ['decimal', -1 * (count + 1)] // count + 2 to adjust with the scaling feature. 0.000xyz will become xyz.abc mUnit\n      }\n    } else {\n      const beforeDeci = numStr.split('.')[0]\n      return ['notDecimal', (beforeDeci.length - 1)]\n    }\n    return ['notDecimal', 0]\n  }\n  useEffect(() => {\n    if (isResult === true) {\n      let g, val, idx\n      if (result.graph !== {} && result.isGraph !== 'false') {\n        g = 1\n        setScales(g, val, idx, null, null, result.graph)\n      } else {\n        g = 0\n        addScalesNonGraph(g, result.text, exactDecimalArray, scalesNonGraph, setScalesNonGraph, setExactDecimal)\n      }\n    }\n    // eslint-disable-next-line\n  }, [isResult])\n\n  // DO NOT CHANGE\n  const addScalesNonGraph = (g, data, arr, scale, setScaleFunc, setStateFunc) => {\n    data.forEach((line, index) => {\n      setScales(g, parseFloat(line.split(' ')[2]), index, scale, setScaleFunc)\n      const count = exactDecimalCount(parseFloat(line.split(' ')[2]))\n      arr.push(count[1])\n    })\n    setStateFunc(arr)\n  }\n\n  const setScales = (g, val, idx, scale = null, setScaleFunc = null, data = null) => {\n    let countX, countY\n    if (g === 1) {\n      countX = decimalCount(Math.min(...data.x_points), Math.max(...data.x_points))\n      countY = decimalCount(Math.min(...data.y_points[0]), Math.max(...data.y_points[0]))\n    } else {\n      countX = decimalCountNonGraph(val)\n      countY = countX // not required. used only countX for nongraphical output\n    }\n    if (countX[0] === 'decimal') {\n      if (countX[1] > 0 && countX[1] <= 4) {\n        if (g === 1) {\n          setXScale('m')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('m')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'm'\n            setScaleFunc(scale)\n          }\n        }\n      } else if (countX[1] > 4 && countX[1] <= 7) {\n        if (g === 1) {\n          setXScale('u')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('u')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'u'\n            setScaleFunc(scale)\n          }\n        }\n      } else if (countX[1] > 7 && countX[1] <= 10) {\n        if (g === 1) {\n          setXScale('n')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('n')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'n'\n            setScaleFunc(scale)\n          }\n        }\n      } else if (countX[1] > 10 && countX[1] <= 12) {\n        if (g === 1) {\n          setXScale('p')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('p')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'p'\n            setScaleFunc(scale)\n          }\n        }\n      }\n    } else {\n      if (countX[1] > 0 && countX[1] <= 4) {\n        if (g === 1) {\n          setXScale('si')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('si')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'si'\n            setScaleFunc(scale)\n          }\n        }\n      } else if (countX[1] > 4 && countX[1] <= 7) {\n        if (g === 1) {\n          setXScale('K')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('K')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'K'\n            setScaleFunc(scale)\n          }\n        }\n      } else if (countX[1] > 7 && countX[1] <= 10) {\n        if (g === 1) {\n          setXScale('M')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('M')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'M'\n            setScaleFunc(scale)\n          }\n        }\n      } else if (countX[1] > 10) {\n        if (g === 1) {\n          setXScale('G')\n        } else {\n          if (scale.length <= idx || scale.length === 0) {\n            scale.push('G')\n            setScaleFunc(scale)\n          } else {\n            scale[idx] = 'G'\n            setScaleFunc(scale)\n          }\n        }\n      }\n    }\n    if (countY[0] === 'decimal') {\n      if (countY[1] > 0 && countY[1] <= 4) {\n        setYScale('m')\n      } else if (countY[1] > 4 && countY[1] <= 7) {\n        setYScale('u')\n      } else if (countY[1] > 7 && countY[1] <= 10) {\n        setYScale('n')\n      } else if (countY[1] > 10 && countY[1] <= 12) {\n        setYScale('p')\n      }\n    } else {\n      if (countY[1] > 0 && countY[1] <= 4) {\n        setYScale('si')\n      } else if (countY[1] > 4 && countY[1] <= 7) {\n        setYScale('K')\n      } else if (countY[1] > 7 && countY[1] <= 10) {\n        setYScale('M')\n      } else if (countY[1] > 10) {\n        setYScale('G')\n      }\n    }\n  }\n  const handleXScale = (evt) => {\n    setXScale(evt.target.value)\n  }\n\n  const handleYScale = (evt) => {\n    setYScale(evt.target.value)\n  }\n  const handlePrecision = (evt) => {\n    setPrecision(evt.target.value)\n  }\n  const handleNotation = (evt) => {\n    setNotation(evt.target.value)\n  }\n  const generateCSV = () => {\n    let headings = ''\n    result.graph.labels.forEach(label => {\n      headings = headings + label + ','\n    })\n\n    headings = headings.slice(0, -1)\n    headings += '\\n'\n    let downloadString = ''\n\n    for (let x = 0; x < result.graph.x_points.length; x++) {\n      downloadString += result.graph.x_points[x]\n      for (let y = 0; y < result.graph.y_points.length; y++) {\n        downloadString = downloadString + ',' + result.graph.y_points[y][x]\n      }\n      downloadString += '\\n'\n    }\n\n    downloadString = headings.concat(downloadString)\n    return downloadString\n  }\n  const handleCsvDownload = () => {\n    const downloadString = generateCSV()\n    const blob = new Blob([downloadString], { type: 'text/plain;charset=utf-8' })\n    FileSaver.saveAs(blob, 'graph_points_eSim_on_cloud.csv')\n  }\n\n  return (\n    <div>\n      <Dialog fullScreen open={open} onClose={close} TransitionComponent={Transition} PaperProps={{\n        style: {\n          backgroundColor: '#4d4d4d',\n          boxShadow: 'none'\n        }\n      }}>\n        <AppBar position=\"static\" elevation={0} className={classes.appBar}>\n          <Toolbar variant=\"dense\" style={{ backgroundColor: '#404040' }} >\n            <IconButton edge=\"start\" color=\"inherit\" onClick={close} aria-label=\"close\">\n              <CloseIcon />\n            </IconButton>\n            <Typography variant=\"h6\" className={classes.title}>\n              Simulation Result\n            </Typography>\n            <Button autoFocus color=\"inherit\" onClick={close}>\n              close\n            </Button>\n          </Toolbar>\n        </AppBar>\n        <Container maxWidth=\"lg\" className={classes.header}>\n          <Grid\n            container\n            spacing={3}\n            direction=\"row\"\n            justify=\"center\"\n            alignItems=\"center\"\n          >\n            {/* Card to display simualtion result screen header */}\n            <Grid item xs={12} sm={12}>\n              <Paper className={classes.paper}>\n                <Typography variant=\"h2\" align=\"center\" gutterBottom>\n                  {result.title}\n                </Typography>\n                <Typography variant=\"h5\" align=\"center\" component=\"p\" gutterBottom>\n                  Simulation Result for {stitle}\n                </Typography>\n              </Paper>\n            </Grid>\n\n            {/* Display graph result */}\n            {isResult === true\n              ? <>\n                {\n\n                  (result.graph !== {} && result.isGraph === 'true')\n                    ? <Grid item xs={12} sm={12}>\n                      <Paper className={classes.paper}>\n                        <Typography variant=\"h4\" align=\"center\" gutterBottom>\n                          GRAPH OUTPUT\n                        </Typography>\n                        <div style={{ padding: '15px 10px 10px 10px', margin: '20px 0px', backgroundColor: 'white', borderRadius: '5px' }}>\n                          <TextField\n                            style={{ width: '20%' }}\n                            id=\"xscale\"\n                            size='small'\n                            variant=\"outlined\"\n                            select\n                            label=\"Select X Axis Scale\"\n                            value={xscale}\n                            onChange={handleXScale}\n                            SelectProps={{\n                              native: true\n                            }}\n                          >\n                            <option value='G'>\n                              Giga (G)\n                            </option>\n                            <option value='M'>\n                              Mega (MEG)\n                            </option>\n                            <option value='K'>\n                              Kilo (K)\n                            </option>\n                            <option value='si'>\n                              SI UNIT\n                            </option>\n\n                            <option value='m'>\n                              Milli (m)\n                            </option>\n                            <option value='u'>\n                              Micro (u)\n                            </option>\n                            <option value='n'>\n                              Nano (n)\n                            </option>\n                            <option value='p'>\n                              Pico (p)\n                            </option>\n\n                          </TextField>\n                          <TextField\n                            style={{ width: '20%', marginLeft: '10px' }}\n                            id=\"yscale\"\n                            size='small'\n                            variant=\"outlined\"\n                            select\n                            label=\"Select Y Axis Scale\"\n                            value={yscale}\n                            onChange={handleYScale}\n                            SelectProps={{\n                              native: true\n                            }}\n                          >\n                            <option value='G'>\n                              Giga (G)\n                            </option>\n                            <option value='M'>\n                              Mega (MEG)\n                            </option>\n                            <option value='K'>\n                              Kilo (K)\n                            </option>\n                            <option value='si'>\n                              SI UNIT\n                            </option>\n\n                            <option value='m'>\n                              Milli (m)\n                            </option>\n                            <option value='u'>\n                              Micro (u)\n                            </option>\n                            <option value='n'>\n                              Nano (n)\n                            </option>\n                            <option value='p'>\n                              Pico (p)\n                            </option>\n\n                          </TextField>\n\n                          <TextField\n                            style={{ width: '20%', marginLeft: '10px' }}\n                            id=\"precision\"\n                            size='small'\n                            variant=\"outlined\"\n                            select\n                            label=\"Select Precision\"\n                            value={precision}\n                            onChange={handlePrecision}\n                            SelectProps={{\n                              native: true\n                            }}\n                          >\n                            {\n                              precisionArr.map((d, i) => {\n                                return (\n                                  <option key={i} value={d}>\n                                    {d}\n                                  </option>\n                                )\n                              })\n                            }\n\n                          </TextField>\n                          {history && <FormControl variant=\"outlined\" size='small' style={{ marginLeft: '1%' }} className={classes.formControl}>\n                            <InputLabel htmlFor=\"outlined-age-native-simple\">Compare simulation</InputLabel>\n                            <Select\n                              labelId=\"select-simulation-history\"\n                              id=\"select-sim\"\n                              value={historyId}\n                              style={{ minWidth: '300px' }}\n                              onChange={handleChangeSim}\n                              label=\"Compare simulation\"\n                              className={classes.selectEmpty}\n                            >\n                              <MenuItem value=\"\">\n                                None\n                              </MenuItem>\n                              {history.map(sim => {\n                                return <MenuItem key={sim.id} value={sim.id}>{sim.simulation_type} at {sim.simulation_time.toLocaleString()}</MenuItem>\n                              })}\n                            </Select>\n                          </FormControl>}\n                          {result.isGraph === 'true' && !compare && <Button variant=\"contained\" style={{ marginLeft: '1%' }} color=\"primary\" size=\"medium\" onClick={handleCsvDownload}>\n                            Download Graph Output\n                          </Button>}\n                        </div>\n                        {!compare && <Graph\n                          labels={result.graph.labels}\n                          x={result.graph.x_points}\n                          y={result.graph.y_points}\n                          xscale={xscale}\n                          yscale={yscale}\n                          precision={precision}\n                        />}\n                        {compare && comparingSim && <div style={{ display: 'flex' }}>\n                          <TableContainer component={Paper} style={{ float: 'left' }}>\n                            <Table className={classes.table} aria-label=\"simple table\">\n                              <TableHead>\n                                <TableRow>\n                                  <TableCell></TableCell>\n                                  {\n                                    result.graph.labels.map(ele => {\n                                      return <TableCell key={ele} align=\"center\">{ele}</TableCell>\n                                    })\n                                  }\n                                </TableRow>\n                              </TableHead>\n                              <TableBody>\n                                <TableRow>\n                                  <TableCell>Max value</TableCell>\n                                  <TableCell align=\"center\">{(Math.max(...result.graph.x_points) / scales[xscale]).toFixed(precision)} </TableCell>\n                                  {\n                                    result.graph.y_points.map(ele => {\n                                      return <TableCell key={ele} align=\"center\">{(Math.max(...ele) / scales[yscale]).toFixed(precision)}</TableCell>\n                                    })}\n                                </TableRow>\n                                <TableRow>\n                                  <TableCell>Min value</TableCell>\n                                  <TableCell align=\"center\">{(Math.min(...result.graph.x_points) / scales[xscale]).toFixed(precision)} </TableCell>\n                                  {\n                                    result.graph.y_points.map(ele => {\n                                      return <TableCell key={ele} align=\"center\">{Math.min(...ele) / scales[yscale]}</TableCell>\n                                    })}\n                                </TableRow>\n                              </TableBody>\n                            </Table>\n                          </TableContainer>\n                          <TableContainer component={Paper} style={{ float: 'right', marginLeft: '2%' }}>\n                            <Table className={classes.table} aria-label=\"simple table\">\n                              <TableHead>\n                                <TableRow>\n                                  <TableCell></TableCell>\n                                  {\n                                    comparingSim.labels.map(ele => {\n                                      return <TableCell key={ele} align=\"center\">{ele}</TableCell>\n                                    })\n                                  }\n                                </TableRow>\n                              </TableHead>\n                              <TableBody>\n                                <TableRow>\n                                  <TableCell>Max value</TableCell>\n                                  <TableCell align=\"center\">{(Math.max(...comparingSim.x_points) / scales[xscale]).toFixed(precision)} </TableCell>\n                                  {\n                                    comparingSim.y_points.map(ele => {\n                                      return <TableCell key={ele} align=\"center\">{(Math.max(...ele) / scales[yscale]).toFixed(precision)}</TableCell>\n                                    })}\n                                </TableRow>\n                                <TableRow>\n                                  <TableCell>Min value</TableCell>\n                                  <TableCell align=\"center\">{(Math.min(...comparingSim.x_points) / scales[xscale]).toFixed(precision)} </TableCell>\n                                  {\n                                    comparingSim.y_points.map(ele => {\n                                      return <TableCell key={ele} align=\"center\">{(Math.min(...ele) / scales[yscale]).toFixed(precision)}</TableCell>\n                                    })}\n                                </TableRow>\n                              </TableBody>\n                            </Table>\n                          </TableContainer>\n                        </div>}\n                      </Paper>\n                      <Paper className={classes.paper}>\n                        {compare && <div style={{ display: 'flex', textAlign: 'left' }}>\n                          <div style={{ width: '50%' }}>\n                            <h2 style={{ marginLeft: '30%' }}>Current Netlist</h2>\n                            <div>{netlist.split('\\n').map((i, key) => {\n                              return <h3 style={{ marginLeft: '30%' }} key={key}>{i}</h3>\n                            })}</div>\n                          </div>\n                          <div style={{ width: '50%' }}>\n                            <h2 style={{ marginLeft: '30%' }}>Compared Netlist</h2>\n                            <div>{compareNetlist.split('\\n').map((i, key) => {\n                              return <h3 style={{ marginLeft: '30%' }} key={key}>{i}</h3>\n                            })}</div>\n                          </div>\n                        </div>}\n                      </Paper>\n                    </Grid>\n                    : (result.isGraph === 'true') ? <span>SOMETHING WENT WRONG PLEASE CHECK THE SIMULATION PARAMETERS.</span> : <span></span>\n                }\n\n                {\n                  (result.isGraph === 'false')\n                    ? <Grid item xs={12} sm={12}>\n                      <Paper className={classes.paper}>\n                        <Typography variant=\"h4\" align=\"center\" gutterBottom>\n                          OUTPUT\n                        </Typography>\n                        <div style={{ padding: '15px 10px 10px 10px', backgroundColor: 'white', margin: '20px 0px', borderRadius: '5px' }}>\n                          <TextField\n                            style={{ width: '20%' }}\n                            id=\"notation\"\n                            size='small'\n                            variant=\"outlined\"\n                            select\n                            label=\"Select Notation\"\n                            value={notation}\n                            onChange={handleNotation}\n                            SelectProps={{\n                              native: true\n                            }}\n                          >\n                            <option value='Engineering'>\n                              Engineering Notation\n                            </option>\n                            <option value='Scientific'>\n                              Scientific Notation\n                            </option>\n                          </TextField>\n\n                          <TextField\n                            style={{ width: '20%', marginLeft: '10px' }}\n                            id=\"precision\"\n                            size='small'\n                            variant=\"outlined\"\n                            select\n                            label=\"Select Precision\"\n                            value={precision}\n                            onChange={handlePrecision}\n                            SelectProps={{\n                              native: true\n                            }}\n                          >\n                            {\n                              precisionArr.map((d, i) => {\n                                return (\n                                  <option key={i} value={d}>\n                                    {d}\n                                  </option>\n                                )\n                              })\n                            }\n\n                          </TextField>\n                          {history && <FormControl variant=\"outlined\" size='small' style={{ marginLeft: '1%' }} className={classes.formControl}>\n                            <InputLabel htmlFor=\"outlined-age-native-simple\">Compare simulation</InputLabel>\n                            <Select\n                              labelId=\"select-simulation-history\"\n                              id=\"select-sim\"\n                              value={historyId}\n                              style={{ minWidth: '300px' }}\n                              onChange={handleChangeSim}\n                              label=\"Compare simulation\"\n                              className={classes.selectEmpty}\n                            >\n                              <MenuItem value=\"\">\n                                None\n                              </MenuItem>\n                              {history.map(sim => {\n                                return <MenuItem key={sim.id} value={sim.id}>{sim.simulation_type} at {sim.simulation_time.toLocaleString()}</MenuItem>\n                              })}\n                            </Select>\n                          </FormControl>}\n                        </div>\n                        <div style={{ display: 'flex' }}>\n                          <TableContainer component={Paper} style={{ float: 'left' }}>\n                            <Table className={classes.table} aria-label=\"simple table\">\n                              <TableHead>\n                                <TableRow>\n                                  <TableCell align=\"center\">Node/Branch</TableCell>\n                                  <TableCell align=\"center\">Value</TableCell>\n                                  <TableCell align=\"center\">Unit</TableCell>\n                                </TableRow>\n                              </TableHead>\n                              <TableBody>\n                                {result.text.map((line, index) => (\n                                  <TableRow key={index}>\n                                    <TableCell align=\"center\">{line.split('=')[0]}</TableCell>\n                                    <TableCell align=\"center\">\n                                      {(line.split(' ')[3] === '\\n')\n                                        ? (parseFloat(line.split(' ')[2]))\n                                        : (notation === 'Scientific'\n                                          ? ((parseFloat(line.split(' ')[2]) / Math.pow(10, exactDecimal[index])).toFixed(precision).toString() + 'e' + ((exactDecimal[index]) >= 0\n                                            ? '+' + (exactDecimal[index]).toString()\n                                            : exactDecimal[index]).toString())\n                                          : (parseFloat(line.split(' ')[2]) / scales[scalesNonGraphArray[index]]).toFixed(precision))}\n                                    </TableCell>\n                                    <TableCell align=\"center\">{(scalesNonGraphArray[index] === 'si' || notation === 'Scientific' || line.split(' ')[3] === '\\n') ? '' : scalesNonGraphArray[index]}{line.split(' ')[3]}</TableCell>\n                                  </TableRow>\n                                ))\n                                }\n                              </TableBody>\n                            </Table>\n                          </TableContainer>\n                          {compare && <TableContainer component={Paper} style={{ float: 'right', marginLeft: '2%' }}>\n                            <Table className={classes.table} aria-label=\"simple table\">\n                              <TableHead>\n                                <TableRow>\n                                  <TableCell align=\"center\">Node/Branch</TableCell>\n                                  <TableCell align=\"center\">Value</TableCell>\n                                  <TableCell align=\"center\">Unit</TableCell>\n                                </TableRow>\n                              </TableHead>\n                              <TableBody>\n                                {comparingSim.map((line, index) => {\n                                  return (\n                                    <TableRow key={index}>\n                                      <TableCell align=\"center\">{line.split('=')[0]}</TableCell>\n                                      <TableCell align=\"center\">\n                                        {(line.split(' ')[3] === '\\n')\n                                          ? (parseFloat(line.split(' ')[2]))\n                                          : (notation === 'Scientific'\n                                            ? ((parseFloat(line.split(' ')[2]) / Math.pow(10, exactDecimalCompare[index])).toFixed(precision).toString() + 'e' + ((exactDecimalCompare[index]) >= 0\n                                              ? '+' + (exactDecimalCompare[index]).toString()\n                                              : exactDecimalCompare[index]).toString())\n                                            : (parseFloat(line.split(' ')[2]) / scales[scalesNonGraphArrayCompare[index]]).toFixed(precision))}\n                                      </TableCell>\n                                      <TableCell align=\"center\">{(scalesNonGraphArrayCompare[index] === 'si' || notation === 'Scientific' || line.split(' ')[3] === '\\n') ? '' : scalesNonGraphArrayCompare[index]}{line.split(' ')[3]}</TableCell>\n                                    </TableRow>\n                                  )\n                                })\n                                }\n\n                              </TableBody>\n                            </Table>\n                          </TableContainer>}\n                        </div>\n                      </Paper>\n                      <Paper className={classes.paper}>\n                        {compare && <div style={{ display: 'flex', textAlign: 'left' }}>\n                          <div style={{ width: '50%' }}>\n                            <h2 style={{ marginLeft: '30%' }}>Current Netlist</h2>\n                            <div>{netlist.split('\\n').map((i, key) => {\n                              return <h3 style={{ marginLeft: '30%' }} key={key}>{i}</h3>\n                            })}</div>\n                          </div>\n                          <div style={{ width: '50%' }}>\n                            <h2 style={{ marginLeft: '30%' }}>Compared Netlist</h2>\n                            <div>{compareNetlist.split('\\n').map((i, key) => {\n                              return <h3 style={{ marginLeft: '30%' }} key={key}>{i}</h3>\n                            })}</div>\n                          </div>\n\n                        </div>}\n                      </Paper>\n                    </Grid>\n                    : <span></span>\n                }</>\n              : <Grid item xs={12} sm={12}>\n                <Paper className={classes.paper}>\n                  <Typography variant=\"h6\" align=\"center\" gutterBottom>\n                    SOMETHING WENT WRONG PLEASE CHECK THE NETLIST.\n                  </Typography>\n                </Paper>\n              </Grid>\n            }\n          </Grid>\n        </Container>\n      </Dialog>\n    </div>\n  )\n}\n\nSimulationScreen.propTypes = {\n  open: PropTypes.bool,\n  close: PropTypes.func,\n  isResult: PropTypes.bool,\n  simType: PropTypes.string,\n  taskId: PropTypes.string\n  // simResults: PropTypes.object\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Shared/Snackbar.js",
    "content": "import React from 'react'\nimport PropTypes from 'prop-types'\nimport {\n  Button,\n  Snackbar\n} from '@material-ui/core'\nimport { useDispatch } from 'react-redux'\nimport MuiAlert from '@material-ui/lab/Alert'\n\nfunction Alert (props) {\n  return <MuiAlert elevation={6} variant=\"filled\" {...props} />\n}\n// Schematic delete snackbar\n\nexport default function SimpleSnackbar ({ open, close, sch, confirmation }) {\n  const dispatch = useDispatch()\n\n  return (\n    <Snackbar\n      anchorOrigin={{\n        vertical: 'bottom',\n        horizontal: 'center'\n      }}\n      open={open}\n      autoHideDuration={6000}\n      onClose={close}\n    >\n      <Alert\n        icon={false}\n        severity=\"warning\"\n        color=\"error\"\n        style={{ width: '100%' }}\n        action={\n          <>\n            <Button\n              size=\"small\"\n              aria-label=\"close\"\n              color=\"inherit\"\n              onClick={() => {\n                dispatch(confirmation(sch.save_id))\n              }}\n            >\n              Yes\n            </Button>\n            <Button\n              size=\"small\"\n              aria-label=\"close\"\n              color=\"inherit\"\n              onClick={close}\n            >\n              NO\n            </Button>\n          </>\n        }\n      >\n        {'Delete ' + sch.name + ' ?'}\n      </Alert>\n    </Snackbar>\n  )\n}\n\nSimpleSnackbar.propTypes = {\n  open: PropTypes.bool,\n  close: PropTypes.func,\n  sch: PropTypes.object,\n  confirmation: PropTypes.func\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Shared/helper/Notice.css",
    "content": ".title{\n  color: #d9534f;\n}\n.error-notice{\n  margin:5px; /* Make sure to keep some distance from all sides */\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;    /* Firefox, other Gecko */\n  box-sizing: border-box;         /* Opera/IE 8+ */\n}\n\n.notice{\n  width:99%;\n  background-color: #ffffff;\n  padding:10px;\n  border:1px solid #eee;\n  border-left-width:7px;\n  border-radius: 3px;\n  margin:20px auto;\n  font-family: 'Open Sans', sans-serif;\n  font-size: 16px;\n  align-items: left;\n  justify-content: left;\n}\n\n.danger{\n  border-left-color: #d9534f; /* Left side border color */\n  background-color: rgba(217, 83, 79, 0.1); /*Same color as the left border with reduced alpha to 0.1*/\n}\n\n.danger strong{\n  color:#d9534f;\n}\n\n.warning{\n  border-left-color: #f0ad4e;\n  background-color: rgba(240, 173, 78, 0.1);\n}\n\n.warning strong{\n  color:#f0ad4e;\n}\n\n.success {\n  border-left-color: #82c280;\n  background-color: rgb(224, 250, 223);\n}\n\n.success strong {\n  color: #347e35;\n}"
  },
  {
    "path": "eda-frontend/src/components/Simulator/Editor.js",
    "content": "import React from 'react'\nimport AceEditor from 'react-ace'\nimport PropTypes from 'prop-types'\nimport 'brace/theme/monokai'\nimport 'brace/theme/github'\n\nexport default function Editor (props) {\n  // code editor for online spice simulator\n  return (\n\n    <AceEditor\n      style={{ width: '100%', marginTop: '35px' }}\n      onChange={props.onCodeChange}\n      value={props.code}\n      theme={props.dark.checkedA ? 'github' : 'monokai'}\n      editorProps={{\n        $blockScrolling: true\n      }}\n\n      setOptions={{\n        enableBasicAutocompletion: true,\n        enableLiveAutocompletion: true,\n        enableSnippets: true,\n        fontSize: 18\n\n      }}\n    />\n\n  )\n}\n\nEditor.propTypes = {\n  code: PropTypes.string,\n  onCodeChange: PropTypes.func,\n  dark: PropTypes.bool\n}\n"
  },
  {
    "path": "eda-frontend/src/components/Simulator/NetlistUpload.js",
    "content": "/* eslint-disable react/prop-types */\nimport React, { Component } from 'react'\nimport { Grid, Button, Paper } from '@material-ui/core'\nimport { withStyles } from '@material-ui/core/styles'\n\nimport api from '../../utils/Api'\n\nconst styles = (theme) => ({\n  paper: {\n    padding: theme.spacing(2),\n    textAlign: 'center',\n    backgroundColor: '#404040',\n    color: '#fff'\n  },\n  finlabel: {\n    cursor: 'pointer',\n    color: '#9feaf9',\n    padding: theme.spacing(1),\n    border: '2px solid #9feaf9'\n  },\n  finput: {\n    opacity: 0,\n    position: 'absolute',\n    zIndex: -1\n  }\n})\n\nclass NetlistUpload extends Component {\n  constructor (props) {\n    super(props)\n    this.state = {\n      file: null,\n      filename: 'Choose Netlist',\n      x_1: [],\n      y1_1: [],\n      y2_1: []\n    }\n    this.onFormSubmit = this.onFormSubmit.bind(this)\n    this.onChange = this.onChange.bind(this)\n    this.netlistUpload = this.netlistUpload.bind(this)\n  }\n\n  onChange (e) {\n    this.setState({\n      file: e.target.files[0],\n      filename: e.target.files[0].name\n    })\n  }\n\n  onFormSubmit (e) {\n    // Stop default form submit\n    e.preventDefault()\n    this.netlistUpload(this.state.file)\n      .then((response) => {\n        const res = response.data\n        const getUrl = 'simulation/status/'.concat(res.details.task_id)\n        this.simulationResult(getUrl)\n      })\n      .catch(function (error) {\n        console.log(error)\n      })\n  }\n\n  // Upload the nelist\n  netlistUpload (file) {\n    const token = localStorage.getItem('esim_token')\n    const formData = new FormData()\n    formData.append('file', file)\n    const config = {\n      headers: {\n        'content-type': 'multipart/form-data'\n      }\n    }\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    return api.post('simulation/upload', formData, config)\n  }\n\n  // Get the simulation result with task_Id\n  simulationResult (url) {\n    api\n      .get(url)\n      .then((res) => {\n        if (res.data.state === 'PROGRESS' || res.data.state === 'PENDING') {\n          setTimeout(this.simulationResult(url), 1000)\n        } else {\n          this.setState({\n            x_1: res.data.details.data[0].x,\n            y1_1: res.data.details.data[0].y[0],\n            y2_1: res.data.details.data[0].y[1]\n          })\n        }\n      })\n      .then((res) => { })\n      .catch(function (error) {\n        console.log(error)\n      })\n  }\n\n  fileData = () => {\n    if (this.state.file) {\n      return (\n        <div>\n          <h3>File Details:</h3>\n          <p>File Name: {this.state.file.name}</p>\n          <p>File Type: Ngspice Netlist</p>\n        </div>\n      )\n    } else {\n      return (\n        <div>\n          <h4>Choose Netlist before pressing UPLOAD button</h4>\n        </div>\n      )\n    }\n  };\n\n  render () {\n    const { classes } = this.props\n    return (\n      <>\n        <Grid item xs={12} sm={5}>\n          <Paper className={classes.paper}>\n            <h2>SUBMIT NETLIST</h2>\n            <form onSubmit={this.onFormSubmit} style={{ marginTop: '45px' }}>\n              <label htmlFor=\"netlist\" className={classes.finlabel}>\n                {this.state.filename}\n              </label>\n              <input\n                type=\"file\"\n                id=\"netlist\"\n                onChange={this.onChange}\n                className={classes.finput}\n              />\n              <br />\n              <Button\n                type=\"submit\"\n                variant=\"contained\"\n                color=\"primary\"\n                style={{ marginTop: '30px' }}\n              >\n                Upload\n              </Button>\n            </form>\n            <br />\n            {this.fileData()}\n          </Paper>\n        </Grid>\n        <Grid item xs={12} sm={7}>\n          <Paper className={classes.paper}>\n            <h2>GRAPH OUTPUT</h2>\n          </Paper>\n        </Grid>\n      </>\n    )\n  }\n}\n\nexport default withStyles(styles, { withTheme: true })(NetlistUpload)\n"
  },
  {
    "path": "eda-frontend/src/components/Simulator/textToFile.js",
    "content": "import randomstring from 'randomstring'\n\nexport default function textToFile (data) {\n  // create a file from a blob\n\n  var myblob = new Blob([data], {\n    type: 'text/plain'\n  })\n  var fileName = randomstring.generate({ length: 15 }) + '.cir'\n  var file = new File([myblob], fileName, { type: 'text/plain', lastModified: Date.now() })\n  return file\n}\n"
  },
  {
    "path": "eda-frontend/src/index.css",
    "content": "body {\n  margin: 0;\n  padding: 0;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n    sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n"
  },
  {
    "path": "eda-frontend/src/index.js",
    "content": "// This is the JavaScript entry point of react application.\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport * as serviceWorker from './serviceWorker'\nimport CssBaseline from '@material-ui/core/CssBaseline'\nimport { ThemeProvider } from '@material-ui/core/styles'\nimport theme from './theme'\nimport './index.css'\nimport App from './App'\nimport { Provider } from 'react-redux'\nimport store from './redux/store'\nReactDOM.render(\n  <ThemeProvider theme={theme}>\n    {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */}\n    <CssBaseline />\n    <Provider store={store}>\n      <App />\n    </Provider>\n  </ThemeProvider>,\n  document.getElementById('root')\n)\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister()\n"
  },
  {
    "path": "eda-frontend/src/pages/Account/ChangePassword.js",
    "content": "import React, { useState, useEffect } from 'react'\nimport {\n  Container,\n  Button,\n  Typography,\n  TextField,\n  Card,\n  Avatar,\n  InputAdornment,\n  IconButton\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport Visibility from '@material-ui/icons/Visibility'\nimport VisibilityOff from '@material-ui/icons/VisibilityOff'\nimport LockOutlinedIcon from '@material-ui/icons/LockOutlined'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { changePassword } from '../../redux/actions/index'\nimport { useHistory } from 'react-router-dom'\n\nconst useStyles = makeStyles((theme) => ({\n  paper: {\n    marginTop: theme.spacing(20),\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    padding: theme.spacing(3, 5)\n  },\n  avatar: {\n    margin: theme.spacing(1),\n    backgroundColor: theme.palette.primary.main\n  },\n  form: {\n    width: '100%', // Fix IE 11 issue.\n    marginTop: theme.spacing(1)\n  },\n  submit: {\n    margin: theme.spacing(1.5, 0)\n  }\n}))\n\nexport default function ChangePassword (props) {\n  const classes = useStyles()\n\n  const account = useSelector(state => state.accountReducer)\n  const query = new URLSearchParams(props.location.search)\n  const url = query.get('url')\n\n  const dispatch = useDispatch()\n  var homeURL = `${window.location.protocol}\\\\\\\\${window.location.host}/`\n\n  const history = useHistory()\n\n  useEffect(() => {\n    document.title = 'Change password - eSim '\n  }, [dispatch])\n\n  const [currentPassword, setCurrentPassword] = useState('')\n  const [newPassword, setNewPassword] = useState('')\n  const [reNewPassword, setReNewPassword] = useState('')\n  const [showCurrentPassword, setShowCurrentPassword] = useState(false)\n  const [showNewPassword, setShowNewPassword] = useState(false)\n  const [showReNewPassword, setShowReNewPassword] = useState(false)\n\n  const handleClickShowNewPassword = () => setShowNewPassword(!showNewPassword)\n  const handleMouseDownNewPassword = () => setShowNewPassword(!showNewPassword)\n\n  const handleClickShowReNewPassword = () => setShowReNewPassword(!showReNewPassword)\n  const handleMouseDownReNewPassword = () => setShowReNewPassword(!showReNewPassword)\n\n  const handleClickShowCurrentPassword = () => setShowCurrentPassword(!showCurrentPassword)\n  const handleMouseDownCurrentPassword = () => setShowCurrentPassword(!showCurrentPassword)\n\n  return (\n    <Container component=\"main\" maxWidth=\"xs\">\n      <Card className={classes.paper}>\n        <Avatar className={classes.avatar}>\n          <LockOutlinedIcon />\n        </Avatar>\n\n        <Typography component=\"h1\" variant=\"h5\">\n          Change password\n        </Typography>\n\n        {/* Display's error messages while signing in */}\n        <Typography variant=\"body1\" align=\"center\" style={{ marginTop: '10px' }} color={account.changePasswordSuccess ? 'secondary' : 'error'}>\n          {account.changePasswordError}\n        </Typography>\n\n        <form className={classes.form} noValidate>\n          <TextField\n            variant=\"outlined\"\n            margin=\"normal\"\n            required\n            fullWidth\n            name=\"currentPassword\"\n            label=\"Current password\"\n            InputProps={{\n              endAdornment: (\n                <InputAdornment position=\"end\">\n                  <IconButton\n                    size=\"small\"\n                    aria-label=\"toggle password visibility\"\n                    onClick={handleClickShowCurrentPassword}\n                    onMouseDown={handleMouseDownCurrentPassword}\n                  >\n                    {showCurrentPassword ? <Visibility fontSize=\"small\" /> : <VisibilityOff fontSize=\"small\" />} {/* Handle password visibility */}\n                  </IconButton>\n                </InputAdornment>\n              )\n            }}\n            type={showCurrentPassword ? 'text' : 'password'}\n            id=\"currentPassword\"\n            value={currentPassword}\n            onChange={e => setCurrentPassword(e.target.value)}\n            autoComplete=\"current-password\"\n          />\n          <TextField\n            variant=\"outlined\"\n            margin=\"normal\"\n            required\n            fullWidth\n            name=\"newPassword\"\n            label=\"New password\"\n            InputProps={{\n              endAdornment: (\n                <InputAdornment position=\"end\">\n                  <IconButton\n                    size=\"small\"\n                    aria-label=\"toggle password visibility\"\n                    onClick={handleClickShowNewPassword}\n                    onMouseDown={handleMouseDownNewPassword}\n                  >\n                    {showNewPassword ? <Visibility fontSize=\"small\" /> : <VisibilityOff fontSize=\"small\" />} {/* Handle password visibility */}\n                  </IconButton>\n                </InputAdornment>\n              )\n            }}\n            type={showNewPassword ? 'text' : 'password'}\n            id=\"newPassword\"\n            value={newPassword}\n            onChange={e => setNewPassword(e.target.value)}\n            autoComplete=\"new-password\"\n          />\n          <TextField\n            variant=\"outlined\"\n            margin=\"normal\"\n            required\n            fullWidth\n            name=\"reNewPassword\"\n            label=\"Re-enter password\"\n            InputProps={{\n              endAdornment: (\n                <InputAdornment position=\"end\">\n                  <IconButton\n                    size=\"small\"\n                    aria-label=\"toggle password visibility\"\n                    onClick={handleClickShowReNewPassword}\n                    onMouseDown={handleMouseDownReNewPassword}\n                  >\n                    {showReNewPassword ? <Visibility fontSize=\"small\" /> : <VisibilityOff fontSize=\"small\" />} {/* Handle password visibility */}\n                  </IconButton>\n                </InputAdornment>\n              )\n            }}\n            type={showReNewPassword ? 'text' : 'password'}\n            id=\"reNewPassword\"\n            value={reNewPassword}\n            onChange={e => setReNewPassword(e.target.value)}\n            autoComplete=\"re-new-password\"\n          />\n          <Button\n            fullWidth\n            variant=\"contained\"\n            color=\"primary\"\n            onClick={() => dispatch(changePassword(currentPassword, newPassword, reNewPassword, history, url))}\n            className={classes.submit}\n            disabled={false}\n          >\n            Reset password\n          </Button>\n        </form>\n\n      </Card>\n      <Button\n        fullWidth\n        onClick={() => { window.open(homeURL, '_self') }}\n        color=\"default\"\n        className={classes.submit}\n      >\n        Back to home\n      </Button>\n    </Container>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/Dashboard.js",
    "content": "// Main Layout for user dashboard.\nimport React, { useEffect } from 'react'\nimport { Switch, Route } from 'react-router-dom'\nimport { CssBaseline } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { Header } from '../components/Shared/Navbar'\nimport Layout from '../components/Shared/Layout'\nimport LayoutMain from '../components/Shared/LayoutMain'\nimport DashboardSidebar from '../components/Dashboard/DashboardSidebar'\nimport DashboardHome from '../components/Dashboard/DashboardHome'\nimport SchematicsList from '../components/Dashboard/SchematicsList'\nimport DashboardOtherProjects from '../components/Dashboard/DashboardOtherProjects'\nimport api from '../utils/Api'\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n    display: 'flex',\n    minHeight: '100vh'\n  },\n  toolbar: {\n    minHeight: '40px'\n  }\n}))\n\nexport default function Dashboard () {\n  const classes = useStyles()\n  const [ltiDetails, setLtiDetails] = React.useState(null)\n\n  useEffect(() => {\n    document.title = 'Dashboard - eSim '\n  })\n\n  useEffect(() => {\n    const token = localStorage.getItem('esim_token')\n    const config = {\n      headers: {\n        'Content-Type': 'application/json'\n      }\n    }\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    api.get('lti/exists', config)\n      .then(res => {\n        setLtiDetails(res.data)\n      }).catch(err => console.log(err))\n  }, [])\n\n  return (\n    <div className={classes.root}>\n      <CssBaseline />\n\n      {/* Schematic editor header and left side pane */}\n      <Layout resToolbar={<Header />} sidebar={<DashboardSidebar />} />\n\n      <LayoutMain>\n        <div className={classes.toolbar} />\n\n        {/* Subroutes under dashboard section */}\n        {ltiDetails !== null && <Switch>\n          <Route exact path=\"/dashboard\" component={() => <DashboardHome ltiDetails={ltiDetails}/>} />\n          <Route exact path=\"/dashboard/profile\" />\n          <Route\n            exact\n            path=\"/dashboard/schematics\"\n            component={() => <SchematicsList ltiDetails={ltiDetails}/>}\n          />\n          <Route\n            exact\n            path=\"/dashboard/review_projects\"\n            component={DashboardOtherProjects}\n          />\n        </Switch>}\n      </LayoutMain>\n    </div>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/Gallery.js",
    "content": "// Main layout for gallery page.\nimport React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n  Card,\n  Grid,\n  Button,\n  Typography,\n  CardActions,\n  CardContent,\n  Container,\n  CssBaseline,\n  CardActionArea,\n  CardMedia,\n  Tooltip,\n  ButtonBase\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { Link as RouterLink } from 'react-router-dom'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { fetchRole, deleteGallerySch, fetchGallery } from '../redux/actions/index'\nimport SimpleSnackbar from '../components/Shared/Snackbar'\n\nconst useStyles = makeStyles((theme) => ({\n  mainHead: {\n    width: '100%',\n    backgroundColor: '#404040',\n    color: '#fff'\n  },\n  title: {\n    fontSize: 18,\n    color: '#80ff80'\n  },\n  header: {\n    padding: theme.spacing(5, 0, 6, 0)\n  },\n  root: {\n    display: 'flex',\n    minHeight: '100vh',\n    backgroundColor: '#f4f6f8'\n  },\n  media: {\n    marginTop: theme.spacing(3),\n    height: 170\n  }\n}))\n\n// Card displaying overview of gallery sample schematics.\nfunction SchematicCard ({ sch }) {\n  const classes = useStyles()\n  const auth = useSelector(state => state.authReducer)\n  const dispatch = useDispatch()\n  const [snacOpen, setSnacOpen] = React.useState(false)\n\n  const handleSnacClick = () => {\n    setSnacOpen(true)\n  }\n  const handleSnacClose = (event, reason) => {\n    if (reason === 'clickaway') {\n      return\n    }\n    setSnacOpen(false)\n  }\n  useEffect(() => {\n    dispatch(fetchRole())\n  }, [dispatch])\n\n  return (\n    <>\n      <Card>\n        <ButtonBase\n          target=\"_blank\"\n          component={RouterLink}\n          to={'/editor?id=' + sch.save_id}\n          style={{ width: '100%' }}\n        >\n          <CardActionArea>\n            <CardMedia\n              className={classes.media}\n              image={sch.media}\n              title={sch.name}\n            />\n            <CardContent>\n              <Typography gutterBottom variant=\"h5\" component=\"h2\">\n                {sch.name}\n              </Typography>\n              <Typography variant=\"body2\" component=\"p\">\n                {sch.description}\n              </Typography>\n            </CardContent>\n          </CardActionArea>\n        </ButtonBase>\n\n        <CardActions>\n          <Button\n            target=\"_blank\"\n            component={RouterLink}\n            to={'/editor?id=' + sch.save_id}\n            size=\"small\"\n            color=\"primary\"\n          >\n            Launch in Editor\n          </Button>\n          {console.log(auth.roles)}\n          {auth.roles && auth.roles.is_esim_staff &&\n            <Button onClick={() => { handleSnacClick() }}>\n              <Tooltip title=\"Delete\" placement=\"bottom\" arrow>\n                <DeleteIcon\n                  color=\"secondary\"\n                  fontSize=\"small\"\n                />\n              </Tooltip>\n            </Button>}\n          <SimpleSnackbar open={snacOpen} close={handleSnacClose} sch={sch} confirmation={deleteGallerySch} />\n        </CardActions>\n      </Card>\n    </>\n  )\n}\nSchematicCard.propTypes = {\n  sch: PropTypes.object\n}\n\n// Card displaying eSim gallery page header.\nfunction MainCard () {\n  const classes = useStyles()\n  useEffect(() => {\n    document.title = 'Gallery - eSim '\n  })\n\n  return (\n    <Card className={classes.mainHead}>\n      <CardContent>\n        <Typography variant=\"h2\" align=\"center\" gutterBottom>\n        eSim Gallery\n        </Typography>\n        <Typography className={classes.title} align=\"center\" gutterBottom>\n        Sample schematics are listed below...\n        </Typography>\n      </CardContent>\n    </Card>\n  )\n}\n\nexport default function Gallery () {\n  const classes = useStyles()\n  const gallerySchSample = useSelector(state => state.galleryReducer.schematics)\n  const dispatch = useDispatch()\n  useEffect(() => {\n    dispatch(fetchGallery())\n    dispatch(fetchRole())\n  }, [dispatch])\n\n  return (\n    <div className={classes.root}>\n      <CssBaseline />\n      <Container maxWidth=\"lg\" className={classes.header}>\n        <Grid\n          container\n          direction=\"row\"\n          justify=\"flex-start\"\n          alignItems=\"flex-start\"\n          alignContent=\"center\"\n          spacing={3}\n        >\n          {/* eSim Gallery Header */}\n          <Grid item xs={12}>\n            <MainCard />\n          </Grid>\n\n          {/* Listing Gallery Schematics */}\n          {console.log(gallerySchSample)}\n          {gallerySchSample.map(\n            (sch) => {\n              return (\n                <Grid item xs={12} sm={6} lg={4} key={sch.save_id}>\n                  <SchematicCard sch={sch} />\n                </Grid>\n              )\n            }\n          )}\n\n        </Grid>\n      </Container>\n    </div>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/Home.js",
    "content": "// Main layout for home page.\nimport React, { useEffect } from 'react'\n\nimport Button from '@material-ui/core/Button'\nimport Typography from '@material-ui/core/Typography'\nimport { makeStyles } from '@material-ui/core/styles'\nimport Container from '@material-ui/core/Container'\nimport { Link as RouterLink } from 'react-router-dom'\nimport logo from '../static/logo.png'\n\nconst useStyles = makeStyles((theme) => ({\n  header: {\n    padding: theme.spacing(23, 0, 6)\n  }\n}))\n\nexport default function Home () {\n  const classes = useStyles()\n\n  useEffect(() => {\n    document.title = 'eSim'\n  })\n\n  return (\n    <Container maxWidth=\"sm\" component=\"main\" className={classes.header}>\n      <center>\n        <img src={logo} width='120' height='120' alt='Logo' />\n      </center>\n      <Typography\n        component=\"h1\"\n        variant=\"h2\"\n        align=\"center\"\n        color=\"textPrimary\"\n        gutterBottom\n      >\n        eSim on Cloud\n      </Typography>\n      <Typography\n        variant=\"h5\"\n        align=\"center\"\n        color=\"textSecondary\"\n        component=\"p\"\n      >\n        Online Circuit Simulator\n        <br></br>\n        <br></br>\n        <Button\n          component={RouterLink}\n          to=\"/editor\"\n          variant=\"contained\"\n          size=\"large\"\n          color=\"primary\"\n        >\n          Schematic Editor\n        </Button>\n      </Typography>\n    </Container>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/LTISetup.js",
    "content": "// Main Layout for LTI Setup Page\nimport React, { useEffect } from 'react'\nimport { Switch, Route } from 'react-router-dom'\nimport { CssBaseline } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\n\nimport { Header } from '../components/Shared/Navbar'\nimport Layout from '../components/Shared/Layout'\nimport LayoutMain from '../components/Shared/LayoutMain'\nimport DashboardSidebar from '../components/Dashboard/DashboardSidebar'\nimport DashboardHome from '../components/Dashboard/DashboardHome'\nimport SchematicsList from '../components/Dashboard/SchematicsList'\nimport LTIConfig from '../components/LTI/LTI'\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n    display: 'flex',\n    minHeight: '100vh'\n  },\n  toolbar: {\n    minHeight: '40px'\n  }\n}))\n\nexport default function LTISetup () {\n  const classes = useStyles()\n  // var auth = useSelector(state => state.authReducer)\n\n  useEffect(() => {\n    document.title = 'LTI - eSim'\n    // eslint-disable-next-line\n  }, [])\n\n  return (\n    <div className={classes.root}>\n      <CssBaseline />\n\n      {/* Submission page header and left side pane */}\n      <Layout resToolbar={<Header />} sidebar={<DashboardSidebar />} />\n\n      <LayoutMain>\n        <div className={classes.toolbar} />\n        <Switch>\n          <Route exact path=\"/dashboard\" component={DashboardHome} />\n          <Route exact path=\"/dashboard/profile\" />\n          <Route\n            exact\n            path=\"/dashboard/schematics\"\n            component={SchematicsList}\n          />\n        </Switch>\n        <LTIConfig />\n      </LayoutMain>\n    </div>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/Login.js",
    "content": "// User Login / Sign In page.\n/* eslint-disable react/prop-types */\nimport React, { useState, useEffect } from 'react'\n\nimport {\n  Container,\n  Grid,\n  Button,\n  Typography,\n  Link,\n  Checkbox,\n  FormControlLabel,\n  TextField,\n  Card,\n  Avatar,\n  InputAdornment,\n  IconButton\n} from '@material-ui/core'\nimport Tooltip from '@material-ui/core/Tooltip'\nimport { makeStyles } from '@material-ui/core/styles'\nimport LockOutlinedIcon from '@material-ui/icons/LockOutlined'\nimport Visibility from '@material-ui/icons/Visibility'\nimport VisibilityOff from '@material-ui/icons/VisibilityOff'\nimport { Link as RouterLink } from 'react-router-dom'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { login, authDefault, googleLogin } from '../redux/actions/index'\nimport google from '../static/google.png'\n\nconst useStyles = makeStyles((theme) => ({\n  paper: {\n    marginTop: theme.spacing(24),\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    padding: theme.spacing(3, 5)\n  },\n  avatar: {\n    margin: theme.spacing(1),\n    backgroundColor: theme.palette.primary.main\n  },\n  form: {\n    width: '100%', // Fix IE 11 issue.\n    marginTop: theme.spacing(1)\n  },\n  submit: {\n    margin: theme.spacing(2, 0)\n  }\n}))\n\nvar url = ''\n\nexport default function SignIn (props) {\n  const classes = useStyles()\n  const auth = useSelector(state => state.authReducer)\n  const [close, setClose] = useState(false)\n\n  const dispatch = useDispatch()\n  var homeURL = `${window.location.protocol}\\\\\\\\${window.location.host}/`\n\n  useEffect(() => {\n    const query = new URLSearchParams(props.location.search)\n    if (query.get('logout')) {\n      localStorage.removeItem('esim_token')\n    }\n  // eslint-disable-next-line\n  }, [])\n\n  useEffect(() => {\n    dispatch(authDefault())\n    document.title = 'Login'\n\n    const user = localStorage.getItem('username')\n    if (user && user !== '') {\n      setUsername(user)\n      setRemember(true)\n    }\n\n    const query = new URLSearchParams(props.location.search)\n    if (query.get('close')) {\n      setClose(true)\n    }\n\n    const ardUrl = localStorage.getItem('ard_redurl')\n    if (ardUrl && ardUrl !== '') {\n      url = ardUrl\n    } else if (props.location.search !== '') {\n      url = query.get('url')\n      localStorage.setItem('ard_redurl', url)\n    } else {\n      url = ''\n    }\n  }, [dispatch, props.location.search, close])\n\n  const [username, setUsername] = useState('')\n  const [password, setPassword] = useState('')\n  const [remember, setRemember] = useState(false)\n  const [showPassword, setShowPassword] = useState(false)\n  const handleClickShowPassword = () => setShowPassword(!showPassword)\n  const handleMouseDownPassword = () => setShowPassword(!showPassword)\n\n  // Function call for normal user login.\n  const handleLogin = (event) => {\n    event.preventDefault()\n    if (remember) {\n      localStorage.setItem('username', username)\n    } else if (username === localStorage.getItem('username')) {\n      localStorage.setItem('username', '')\n    }\n    if (!close) {\n      dispatch(login(username, password, url))\n    }\n    if (close) {\n      dispatch(login(username, password, 'close'))\n    }\n    localStorage.removeItem('ard_redurl')\n  }\n\n  // Function call for google oAuth login.\n  const handleGoogleLogin = () => {\n    var host = window.location.protocol + '//' + window.location.host\n    dispatch(googleLogin(host))\n  }\n\n  return (\n    <Container component=\"main\" maxWidth=\"xs\">\n      <Card className={classes.paper}>\n        <Avatar className={classes.avatar}>\n          <LockOutlinedIcon />\n        </Avatar>\n\n        <Typography component=\"h1\" variant=\"h5\">\n          Login | Sign In\n        </Typography>\n\n        {/* Display's error messages while logging in */}\n        <Typography variant=\"body1\" align=\"center\" style={{ marginTop: '10px' }} color=\"error\" >\n          {auth.errors}\n        </Typography>\n\n        <form className={classes.form} onSubmit={handleLogin} noValidate>\n          <TextField\n            variant=\"outlined\"\n            margin=\"normal\"\n            required\n            fullWidth\n            id=\"email\"\n            label=\"Username\"\n            name=\"email\"\n            autoComplete=\"email\"\n            value={username}\n            onChange={e => setUsername(e.target.value)}\n            autoFocus\n          />\n          <TextField\n            variant=\"outlined\"\n            margin=\"normal\"\n            required\n            fullWidth\n            name=\"password\"\n            label=\"Password\"\n            InputProps={{\n              endAdornment: (\n                <InputAdornment position=\"end\">\n                  <Tooltip title={'Show Password'} aria-label={'Show Password'} arrow>\n                    <IconButton\n                      size=\"small\"\n                      aria-label=\"toggle password visibility\"\n                      onClick={handleClickShowPassword}\n                      onMouseDown={handleMouseDownPassword}\n                    >\n                      {showPassword ? <Visibility fontSize=\"small\" /> : <VisibilityOff fontSize=\"small\" />} {/* handle password visibility */}\n                    </IconButton>\n                  </Tooltip>\n                </InputAdornment>\n              )\n            }}\n            type={showPassword ? 'text' : 'password'}\n            id=\"password\"\n            value={password}\n            onChange={e => setPassword(e.target.value)}\n            autoComplete=\"current-password\"\n          />\n          <FormControlLabel\n            control={\n              <Checkbox\n                value=\"remember\"\n                checked={remember}\n                onChange={ () => { setRemember(!remember) }}\n                color=\"primary\" />\n            }\n            label=\"Remember me\"\n          />\n          <Button\n            fullWidth\n            variant=\"contained\"\n            color=\"primary\"\n            type=\"submit\"\n            // onClick={handleLogin}\n            className={classes.submit}\n          >\n            Login\n          </Button>\n          <Grid container>\n            <Grid item xs>\n              <Link component={RouterLink} to=\"/reset-password\" variant=\"body2\">\n                Forgot password?\n              </Link>\n            </Grid>\n            <Grid item>\n              <Link component={RouterLink} to=\"/signup\" variant=\"body2\">\n                {'New User? Sign Up'}\n              </Link>\n            </Grid>\n          </Grid>\n        </form>\n        <Typography variant=\"body1\" color=\"secondary\" align=\"center\" >Or</Typography>\n\n        {/* Google oAuth Sign In option */}\n        <Button\n          fullWidth\n          variant=\"outlined\"\n          color=\"primary\"\n          onClick={handleGoogleLogin}\n          className={classes.submit}\n        >\n          <img alt=\"G\" src={google} height=\"20\" />&emsp; Login With Google\n        </Button>\n      </Card>\n      <Button\n        onClick={() => { window.open(homeURL, '_self') }}\n        fullWidth\n        color=\"default\"\n        className={classes.submit}\n      >\n        Back to home\n      </Button>\n    </Container>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/NotFound.js",
    "content": "// Page to display Page Not Found (i.e. 404) error.\nimport React, { useEffect } from 'react'\n\nimport { Container, Typography } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\n\nconst useStyles = makeStyles((theme) => ({\n  header: {\n    padding: theme.spacing(8, 0, 6)\n  }\n}))\n\nexport default function NotFound () {\n  const classes = useStyles()\n\n  useEffect(() => {\n    document.title = 'Not Found - EDA '\n  })\n\n  return (\n    <Container maxWidth=\"lg\" className={classes.header}>\n      <Typography variant=\"h1\" align=\"center\" gutterBottom>\n        404 Not Found\n      </Typography>\n      <Typography\n        variant=\"h4\"\n        align=\"center\"\n        color=\"textSecondary\"\n        gutterBottom\n      >\n        Sorry, Requested page not found\n      </Typography>\n    </Container>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/ProjectPage.js",
    "content": "// Main Layout for Schemaic Editor page.\n/* eslint-disable react/prop-types */\n/* eslint-disable camelcase */\nimport React, { useEffect } from 'react'\nimport {\n  Button,\n  Typography,\n  Dialog,\n  DialogContent,\n  Grid,\n  Paper,\n  Tooltip,\n  Snackbar,\n  TextField,\n  DialogActions,\n  List\n} from '@material-ui/core'\nimport { makeStyles, withStyles } from '@material-ui/core/styles'\nimport ComponentProperties from '../components/SchematicEditor/ComponentProperties'\nimport MuiDialogTitle from '@material-ui/core/DialogTitle'\nimport LayoutMain from '../components/Shared/LayoutMain'\nimport PlayCircleOutlineIcon from '@material-ui/icons/PlayCircleOutline'\nimport IconButton from '@material-ui/core/IconButton'\nimport CloseIcon from '@material-ui/icons/Close'\nimport LoadGrid from '../components/SchematicEditor/Helper/ComponentDrag.js'\nimport '../components/SchematicEditor/Helper/SchematicEditor.css'\nimport { fetchSchematic, fetchGallerySchematic, reportProject, makeCopy } from '../redux/actions/index'\nimport { useDispatch, useSelector } from 'react-redux'\nimport SimulationProperties from '../components/SchematicEditor/SimulationProperties'\nimport ZoomInIcon from '@material-ui/icons/ZoomIn'\nimport ZoomOutIcon from '@material-ui/icons/ZoomOut'\nimport SettingsOverscanIcon from '@material-ui/icons/SettingsOverscan'\nimport MuiAlert from '@material-ui/lab/Alert'\nimport { ZoomIn, ZoomOut, ZoomAct, GenerateDetailedCompList, GenerateNetList } from '../components/SchematicEditor/Helper/ToolbarTools'\nimport ReportComponent from '../components/Project/ReportComponent'\nimport ChangeStatus from '../components/Project/ChangeStatus'\nimport { NetlistModal } from '../components/SchematicEditor/ToolbarExtension'\nimport ProjectTimeline from '../components/Project/ProjectTimeline'\nconst useStyles = makeStyles((theme) => ({\n  root: {\n    display: 'flex',\n    overflowX: 'visible',\n    overflowY: 'hidden',\n    backgroundColor: '#f4f6f8'\n\n  },\n  toolbar: {\n    minHeight: '20px'\n  }\n}))\n\nconst styles = (theme) => ({\n  root: {\n    margin: 0,\n    padding: theme.spacing(2)\n  },\n  closeButton: {\n    position: 'absolute',\n    right: theme.spacing(1),\n    top: theme.spacing(1),\n    color: theme.palette.grey[500]\n  }\n})\n\nfunction Alert (props) {\n  return <MuiAlert elevation={6} variant=\"filled\" {...props} />\n}\nexport default function ProjectPage (props) {\n  const classes = useStyles()\n  const gridRef = React.createRef()\n  const dispatch = useDispatch()\n  const [netListOpen, setNetListOpen] = React.useState(false)\n  const [snackbarOpen, setSnackbarOpen] = React.useState(false)\n  const [simulateOpen, setSimulateOpen] = React.useState(false)\n  const [reportOpen, setReportOpen] = React.useState(false)\n  const [reportDescription, setDescription] = React.useState(null)\n  const [netlist, genNetlist] = React.useState('')\n  const [statusChanged, setStatusChanged] = React.useState(false)\n  const [componentsList, setComponentsList] = React.useState(undefined)\n  const project = useSelector(state => state.projectReducer)\n  const auth = useSelector(state => state.authReducer)\n  const netfile = useSelector((state) => state.netlistReducer)\n  const DialogTitle = withStyles(styles)((props) => {\n    const { children, classes, onClose, ...other } = props\n    return (\n      <MuiDialogTitle disableTypography className={classes.root} {...other}>\n        <Typography variant=\"h6\">{children}</Typography>\n        {onClose ? (\n          <IconButton aria-label=\"close\" className={classes.closeButton} onClick={onClose}>\n            <CloseIcon />\n          </IconButton>\n        ) : null}\n      </MuiDialogTitle>\n    )\n  })\n  const handleSimulateOpen = () => {\n    setSimulateOpen(!simulateOpen)\n  }\n  const handleReportOpen = () => {\n    setReportOpen(!reportOpen)\n  }\n  const handleChangeDescription = (e) => {\n    setDescription(e.target.value)\n  }\n  const handleNetlistClick = () => {\n    setNetListOpen(!netListOpen)\n  }\n  const onClick = (type) => {\n    const query = new URLSearchParams(props.location.search)\n    var save_id = query.get('save_id')\n    var project_id = query.get('project_id')\n    switch (type) {\n      case 'Report':\n        dispatch(reportProject(reportDescription, project_id))\n        handleReportOpen()\n        break\n      case 'Make copy':\n        dispatch(makeCopy(save_id, project.details.active_version, project.details.active_branch))\n        setSnackbarOpen(true)\n        break\n      case 'Generate Netlist':\n        var compNetlist = GenerateNetList()\n        var netlist =\n          netfile.title +\n          '\\n\\n' +\n          compNetlist.models +\n          '\\n' +\n          compNetlist.main +\n          '\\n' +\n          netfile.controlLine +\n          '\\n' +\n          netfile.controlBlock +\n          '\\n'\n        genNetlist(netlist)\n        handleNetlistClick()\n        break\n      default:\n        break\n    }\n  }\n  const changedStatus = () => {\n    setStatusChanged(true)\n  }\n  useEffect(() => {\n    console.log(project.details)\n  }, [project])\n  useEffect(() => {\n    var container = gridRef.current\n    LoadGrid(container, null, null)\n    if (props.location.search !== '') {\n      const query = new URLSearchParams(props.location.search)\n      var saveID = query.get('save_id')\n      var version = query.get('version')\n      var branch = query.get('branch')\n      if (saveID.substr(0, 7) === 'gallery') {\n        // Loading Gallery schemaic.\n        dispatch(fetchGallerySchematic(saveID))\n      } else {\n        // Loading User on-cloud saved schemaic.\n        dispatch(fetchSchematic(saveID, version, branch))\n      }\n    }\n    setTimeout(() => {\n      setComponentsList([GenerateDetailedCompList()])\n    }, 2000)\n    // eslint-disable-next-line\n  }, [props.location, dispatch])\n  return (\n    <div className={classes.root}>\n      <LayoutMain>\n\n        {project.details !== '401'\n          ? <>\n            {statusChanged\n              ? <>\n                Status Changed\n              </> : <Grid container>\n                <Grid item xs={1} />\n                <Grid item xs={10}>\n                  {project.reports && project.details.is_reported &&\n                    <ReportComponent project={project} changedStatus={changedStatus} location={props.location} />\n                  }\n                  {project.details && !project.details?.is_reported && project.details?.author_name !== auth.user?.username &&\n                    <ChangeStatus project={project} changedStatus={changedStatus} />\n                  }\n                  <Paper style={{ padding: '1%', marginTop: '2%', borderRadius: '12px' }}>\n                    <Typography>\n                      {project.details && <h1 style={{ marginTop: '0', marginBottom: '0' }}>{project.details.title}</h1>}\n                      {project.details && <h4 style={{ marginTop: '0', marginBottom: '0' }}>By: {project.details.author_name} </h4>}\n                    </Typography>\n                    <hr style={{ marginTop: '0' }} />\n\n                    <Typography>\n                      <h3>{project.details?.description}</h3>\n                      {componentsList && <h2 style={{ marginBottom: '0' }}>Component List:</h2>}\n                      {componentsList && componentsList[0].map((item, i) => (<div key={i}>{i + 1}.{item.name}  {item.value}{item.unit}</div>))}\n                      {project.details && project.details?.fields && project.details.fields.map(item => (\n                        <p key={item}>\n                          <h3 style={{ marginTop: '0', marginBottom: '0' }}>{item.name}:</h3>\n                          <p style={{ marginTop: '0' }}>\n                            {item.text.split('\\n').map((text) => (\n                              <span key={text}>\n                                {text}\n                                <br></br>\n                              </span>\n                            ))}\n                          </p>\n                        </p>\n                      ))}\n                    </Typography>\n\n                    <Dialog\n                      open={simulateOpen}\n                      onClose={handleSimulateOpen}\n                    >\n                      <DialogTitle onClose={handleSimulateOpen}>Simulate Circuit</DialogTitle>\n                      <DialogContent style={{ padding: '3%' }}>\n                        {project.details && <SimulationProperties\n                          dcSweepcontrolLine={project.details.dc_sweep}\n                          transientAnalysisControlLine={project.details.transient_analysis}\n                          acAnalysisControlLine={project.details.ac_analysis}\n                          tfAnalysisControlLine={project.details.tf_analysis}\n                        />}\n                      </DialogContent>\n                    </Dialog>\n                    <Dialog\n                      open={reportOpen}\n                      onClose={handleReportOpen}\n                      fullWidth={true}\n                      maxWidth={'md'} >\n                      <DialogTitle>Report this project</DialogTitle>\n                      <DialogContent style={{ padding: '3%' }}>\n                        <TextField\n                          multiline\n                          variant=\"outlined\"\n                          label=\"Report Description\"\n                          style={{ width: '100%' }}\n                          value={reportDescription}\n                          error={!reportDescription}\n                          helperText={'Please enter description'}\n                          onChange={handleChangeDescription}\n                          rows={8} />\n                      </DialogContent>\n                      <DialogActions>\n                        <Button onClick={() => onClick('Report')}>Report</Button>\n                        <Button onClick={handleReportOpen}>Cancel</Button>\n                      </DialogActions>\n                    </Dialog>\n                  </Paper>\n                  <h1>Circuit Diagram:\n                    {auth.isAuthenticated && <Button variant=\"contained\" style={{ float: 'right', backgroundColor: 'red', color: 'white', marginTop: '.5%' }} onClick={() => handleReportOpen()}>Report</Button>}\n                    {auth.isAuthenticated && <Button variant=\"contained\" color=\"primary\" style={{ float: 'right', margin: '.5% .5% 0 0%' }} onClick={() => onClick('Make copy')}>Make a Copy</Button>}\n                    <Button style={{ float: 'right', backgroundColor: 'lightgreen', margin: '.5% .5% 0 0' }} variant=\"contained\" onClick={() => handleSimulateOpen()}>\n                      <PlayCircleOutlineIcon />Simulate\n                    </Button>\n                    <Button variant=\"contained\" color=\"primary\" style={{ float: 'right', margin: '.5% .5% 0 0%' }} onClick={() => onClick('Generate Netlist')}>Generate Netlist</Button>\n                  </h1>\n                  <NetlistModal open={netListOpen} close={handleNetlistClick} netlist={netlist} />\n                  <Snackbar\n                    open={snackbarOpen}\n                    autoHideDuration={6000}\n                    onClose={() => setSnackbarOpen(false)}\n                  >\n                    <Alert onClose={() => setSnackbarOpen(false)} severity=\"success\">\n                      Successfully made a copy!\n                    </Alert>\n                  </Snackbar>\n                  <Grid container>\n                    <Grid item xs={1}>\n                      <Paper style={{ width: '30px' }}>\n                        <div>\n                          <Tooltip title=\"Zoom In\">\n                            <IconButton color=\"inherit\" className={classes.tools} size=\"small\" onClick={ZoomIn}>\n                              <ZoomInIcon />\n                            </IconButton>\n                          </Tooltip>\n                        </div>\n                        <div>\n                          <Tooltip title=\"Zoom Out\">\n                            <IconButton color=\"inherit\" className={classes.tools} size=\"small\" onClick={ZoomOut}>\n                              <ZoomOutIcon />\n                            </IconButton>\n                          </Tooltip>\n                        </div>\n                        <div>\n                          <Tooltip title=\"Default Size\">\n                            <IconButton color=\"inherit\" className={classes.tools} size=\"small\" onClick={ZoomAct}>\n                              <SettingsOverscanIcon />\n                            </IconButton>\n                          </Tooltip>\n                        </div>\n                      </Paper>\n                    </Grid>\n                    <Grid item xs={10}>\n                      <LayoutMain>\n                        <center>\n                          <div className=\"grid-container A4-L\" ref={gridRef} id=\"divGrid\" />\n                        </center>\n                      </LayoutMain>\n                    </Grid>\n                    <ComponentProperties />\n                    <Grid item xs={1} />\n\n                    <Grid item xs={12} sm={12}>\n                      <Paper style={{ padding: '0 2%', margin: '3% 0', borderRadius: '12px' }}>\n                        <List>\n                          <h3>History of this Project</h3>\n                          {project.details?.history[0]\n                            ? <ProjectTimeline history={project.details.history.slice(0).reverse()} isOwner={auth.user?.username === project.details.author_name} />\n                            : <h4>No history of this project.</h4>\n                          }\n                        </List>\n                      </Paper>\n                    </Grid>\n                  </Grid>\n                </Grid>\n                <Grid item xs={1} />\n              </Grid>}\n          </>\n          : <>\n            {statusChanged ? <>Status Changed. Wait for it to get back to the status where it is visible for you.</> : <>Not Authorized</>}\n          </>}\n      </LayoutMain>\n    </div>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/Projects.js",
    "content": "import {\n  Card,\n  Grid,\n  Container,\n  CssBaseline,\n  CardContent,\n  Typography,\n  Select,\n  MenuItem,\n  Popover,\n  FormControl,\n  Input,\n  IconButton,\n  InputLabel\n} from '@material-ui/core'\nimport React, { useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { makeStyles } from '@material-ui/core/styles'\nimport ProjectCard from '../components/Dashboard/ProjectCard'\nimport { fetchPublicProjects } from '../redux/actions/index'\nimport FilterListIcon from '@material-ui/icons/FilterList'\n\nconst useStyles = makeStyles((theme) => ({\n  mainHead: {\n    width: '100%',\n    backgroundColor: '#404040',\n    color: '#fff'\n  },\n  title: {\n    fontSize: 18,\n    color: '#80ff80'\n  },\n  header: {\n    padding: theme.spacing(5, 0, 6, 0)\n  },\n  root: {\n    display: 'flex',\n    minHeight: '100vh',\n    backgroundColor: '#f4f6f8'\n  },\n  media: {\n    marginTop: theme.spacing(3),\n    height: 170\n  }\n}))\n\n// Card displaying eSim gallery page header.\nfunction MainCard () {\n  const classes = useStyles()\n\n  return (\n    <Card className={classes.mainHead}>\n      <CardContent>\n        <Typography variant=\"h2\" align=\"center\" gutterBottom>\n          eSim Published Projects\n        </Typography>\n        <Typography className={classes.title} align=\"center\" gutterBottom>\n          Published Projects are listed below...\n        </Typography>\n      </CardContent>\n    </Card>\n  )\n}\n\nfunction PublicProjects (props) {\n  const classes = useStyles()\n  const dispatch = useDispatch()\n\n  const projects = useSelector(state => state.dashboardReducer.publicProjects)\n  const [sort, setSort] = React.useState('')\n  const [order, setOrder] = React.useState('ascending')\n  const [filteredProjects, setFilteredProjects] = React.useState(projects)\n  const [anchorEl, setAnchorEl] = React.useState(null)\n  const open = Boolean(anchorEl)\n  useEffect(() => {\n    dispatch(fetchPublicProjects())\n  }, [dispatch])\n  useEffect(() => {\n    setFilteredProjects(projects)\n  }, [projects])\n  const handleFilterOpen = (e) => {\n    if (anchorEl) {\n      setAnchorEl(null)\n    } else {\n      setAnchorEl(e.currentTarget)\n    }\n  }\n  const sortSaves = (sorting, order) => {\n    if (order === 'ascending') {\n      if (sorting === 'name') {\n        setFilteredProjects(filteredProjects.sort((a, b) => a.title > b.title))\n      } else if (sorting === 'author') {\n        setFilteredProjects(filteredProjects.sort((a, b) => a.author > b.author))\n      } else if (sorting === 'status') {\n        setFilteredProjects(filteredProjects.sort((a, b) => a.status_name > b.status_name))\n      }\n    } else {\n      if (sorting === 'name') {\n        setFilteredProjects(filteredProjects.sort((a, b) => a.title < b.title))\n      } else if (sorting === 'author') {\n        setFilteredProjects(filteredProjects.sort((a, b) => a.author < b.author))\n      } else if (sorting === 'status') {\n        setFilteredProjects(filteredProjects.sort((a, b) => a.status_name < b.status_name))\n      }\n    }\n  }\n  const handleSort = (e) => {\n    sortSaves(e.target.value, order)\n    setSort(e.target.value)\n  }\n  const handleOrder = (e) => {\n    setOrder(e.target.value)\n    if (sort !== '') {\n      sortSaves(sort, e.target.value)\n    }\n  }\n  const onSearch = (e) => {\n    setFilteredProjects(projects.filter((o) =>\n      // eslint-disable-next-line\n      Object.keys(o).some((k) => {\n        if ((k === 'title' || k === 'description' || k === 'author' || k === 'status_name') && String(o[k]).toLowerCase().includes(e.target.value.toLowerCase())) {\n          return String(o[k]).toLowerCase().includes(e.target.value.toLowerCase())\n        }\n      }\n      )\n    ))\n  }\n  return (\n    <div className={classes.root}>\n      <CssBaseline />\n      <Container maxWidth=\"lg\" className={classes.header}>\n        <Grid\n          container\n          direction=\"row\"\n          justify=\"flex-start\"\n          alignItems=\"flex-start\"\n          alignContent=\"center\"\n          spacing={3}\n        >\n          {/* eSim Gallery Header */}\n          <Grid item xs={12}>\n            <MainCard />\n          </Grid>\n          <Grid item xs={12}>\n            {filteredProjects && <IconButton onClick={handleFilterOpen} style={{ float: 'right' }} ><FilterListIcon /></IconButton>}\n            {filteredProjects && <Input style={{ float: 'right' }} onChange={(e) => onSearch(e)} placeholder='Search' />}\n            <Popover\n              open={open}\n              onClose={handleFilterOpen}\n              anchorOrigin={{\n                vertical: 'bottom',\n                horizontal: 'center'\n              }}\n              transformOrigin={{\n                vertical: 'top',\n                horizontal: 'center'\n              }}\n              anchorEl={anchorEl}\n            >\n              <FormControl style={{ width: ' 200px', padding: '2%' }}>\n                <InputLabel>Select Sort</InputLabel>\n                <Select className={classes.popover} value={sort} onChange={handleSort} >\n                  <MenuItem key='name' value='name'>Name</MenuItem>\n                  <MenuItem key='author' value='author'>Author</MenuItem>\n                  <MenuItem key='status' value='status'>Status</MenuItem>\n                </Select>\n              </FormControl>\n              <FormControl style={{ width: ' 200px', padding: '2%' }}>\n                <InputLabel>Select Order</InputLabel>\n                <Select className={classes.popover} value={order} onChange={handleOrder} >\n                  <MenuItem key='ascending' value='ascending'>Ascending</MenuItem>\n                  <MenuItem key='descending' value='descending'>Descending</MenuItem>\n                </Select>\n              </FormControl>\n            </Popover>\n          </Grid>\n          {/* Listing Gallery Schematics */}\n          {filteredProjects.map(\n            (pub) => {\n              console.log(pub)\n              return (\n                <Grid item xs={12} sm={6} lg={4} key={pub.save_id}>\n                  <ProjectCard pub={pub} is_review={true} />\n                </Grid>\n              )\n            })}\n\n        </Grid>\n      </Container>\n    </div>\n  )\n}\n\nexport default PublicProjects\n"
  },
  {
    "path": "eda-frontend/src/pages/ResetPassword/Confirmation.js",
    "content": "// User Sign Up / Register page.\nimport React, { useState, useEffect } from 'react'\nimport {\n  Container,\n  Button,\n  Typography,\n  TextField,\n  Card,\n  Avatar,\n  InputAdornment,\n  IconButton\n} from '@material-ui/core'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/core/styles'\nimport Visibility from '@material-ui/icons/Visibility'\nimport VisibilityOff from '@material-ui/icons/VisibilityOff'\nimport LockOutlinedIcon from '@material-ui/icons/LockOutlined'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { resetPasswordConfirm, authDefault, resetPasswordConfirmError } from '../../redux/actions/index'\n\nconst useStyles = makeStyles((theme) => ({\n  paper: {\n    marginTop: theme.spacing(20),\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    padding: theme.spacing(3, 5)\n  },\n  avatar: {\n    margin: theme.spacing(1),\n    backgroundColor: theme.palette.primary.main\n  },\n  form: {\n    width: '100%', // Fix IE 11 issue.\n    marginTop: theme.spacing(1)\n  },\n  submit: {\n    margin: theme.spacing(1.5, 0)\n  }\n}))\n\nexport default function ResetPasswordConfirm ({ match }) {\n  const classes = useStyles()\n\n  const auth = useSelector(state => state.authReducer)\n\n  const dispatch = useDispatch()\n  var homeURL = `${window.location.protocol}\\\\\\\\${window.location.host}/`\n  const { id, token } = match.params\n\n  useEffect(() => {\n    dispatch(authDefault())\n    document.title = 'Reset password - eSim '\n    dispatch(resetPasswordConfirmError(''))\n  }, [dispatch])\n\n  const [newPassword, setNewPassword] = useState('')\n  const [reNewPassword, setReNewPassword] = useState('')\n  const [showNewPassword, setShowNewPassword] = useState(false)\n  const [showReNewPassword, setShowReNewPassword] = useState(false)\n\n  const handleClickShowNewPassword = () => setShowNewPassword(!showNewPassword)\n  const handleMouseDownNewPassword = () => setShowNewPassword(!showNewPassword)\n\n  const handleClickShowReNewPassword = () => setShowReNewPassword(!showReNewPassword)\n  const handleMouseDownReNewPassword = () => setShowReNewPassword(!showReNewPassword)\n\n  return (\n    <Container component=\"main\" maxWidth=\"xs\">\n      <Card className={classes.paper}>\n        <Avatar className={classes.avatar}>\n          <LockOutlinedIcon />\n        </Avatar>\n\n        <Typography component=\"h1\" variant=\"h5\">\n          Reset password\n        </Typography>\n\n        {/* Display's error messages while signing in */}\n        <Typography variant=\"body1\" align=\"center\" style={{ marginTop: '10px' }} color={auth.resetPasswordConfirmSuccess ? 'secondary' : 'error'}>\n          {auth.resetPasswordError}\n        </Typography>\n\n        <form className={classes.form} noValidate>\n          <TextField\n            variant=\"outlined\"\n            margin=\"normal\"\n            required\n            fullWidth\n            name=\"password\"\n            label=\"New password\"\n            InputProps={{\n              endAdornment: (\n                <InputAdornment position=\"end\">\n                  <IconButton\n                    size=\"small\"\n                    aria-label=\"toggle password visibility\"\n                    onClick={handleClickShowNewPassword}\n                    onMouseDown={handleMouseDownNewPassword}\n                  >\n                    {showNewPassword ? <Visibility fontSize=\"small\" /> : <VisibilityOff fontSize=\"small\" />} {/* Handle password visibility */}\n                  </IconButton>\n                </InputAdornment>\n              )\n            }}\n            type={showNewPassword ? 'text' : 'password'}\n            id=\"newPassword\"\n            value={newPassword}\n            onChange={e => setNewPassword(e.target.value)}\n            autoComplete=\"current-password\"\n          />\n          <TextField\n            variant=\"outlined\"\n            margin=\"normal\"\n            required\n            fullWidth\n            name=\"reNewPassword\"\n            label=\"Re-enter password\"\n            InputProps={{\n              endAdornment: (\n                <InputAdornment position=\"end\">\n                  <IconButton\n                    size=\"small\"\n                    aria-label=\"toggle password visibility\"\n                    onClick={handleClickShowReNewPassword}\n                    onMouseDown={handleMouseDownReNewPassword}\n                  >\n                    {showReNewPassword ? <Visibility fontSize=\"small\" /> : <VisibilityOff fontSize=\"small\" />} {/* Handle password visibility */}\n                  </IconButton>\n                </InputAdornment>\n              )\n            }}\n            type={showReNewPassword ? 'text' : 'password'}\n            id=\"reNewPassword\"\n            value={reNewPassword}\n            onChange={e => setReNewPassword(e.target.value)}\n            autoComplete=\"current-password\"\n          />\n          <Button\n            fullWidth\n            variant=\"contained\"\n            color=\"primary\"\n            onClick={() => dispatch(resetPasswordConfirm(id, token, newPassword, reNewPassword))}\n            className={classes.submit}\n            disabled={false}\n          >\n            Reset password\n          </Button>\n        </form>\n\n      </Card>\n      <Button\n        fullWidth\n        onClick={() => { window.open(homeURL, '_self') }}\n        color=\"default\"\n        className={classes.submit}\n      >\n        Back to home\n      </Button>\n    </Container>\n  )\n}\n\nResetPasswordConfirm.propTypes = {\n  match: PropTypes.object.isRequired\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/ResetPassword/Initiation.js",
    "content": "// User Sign Up / Register page.\nimport React, { useState, useEffect } from 'react'\nimport {\n  Container,\n  Button,\n  Typography,\n  TextField,\n  Card,\n  Avatar\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport LockOutlinedIcon from '@material-ui/icons/LockOutlined'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { resetPassword, authDefault } from '../../redux/actions/index'\n\nconst useStyles = makeStyles((theme) => ({\n  paper: {\n    marginTop: theme.spacing(20),\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    padding: theme.spacing(3, 5)\n  },\n  avatar: {\n    margin: theme.spacing(1),\n    backgroundColor: theme.palette.primary.main\n  },\n  form: {\n    width: '100%', // Fix IE 11 issue.\n    marginTop: theme.spacing(1)\n  },\n  submit: {\n    margin: theme.spacing(1.5, 0)\n  }\n}))\n\nexport default function ResetPassword () {\n  const classes = useStyles()\n\n  const auth = useSelector(state => state.authReducer)\n\n  const dispatch = useDispatch()\n  var homeURL = `${window.location.protocol}\\\\\\\\${window.location.host}/`\n\n  useEffect(() => {\n    dispatch(authDefault())\n    document.title = 'Reset password - eSim '\n  }, [dispatch])\n\n  const [email, setEmail] = useState('')\n\n  return (\n    <Container component=\"main\" maxWidth=\"xs\">\n      <Card className={classes.paper}>\n        <Avatar className={classes.avatar}>\n          <LockOutlinedIcon />\n        </Avatar>\n\n        <Typography component=\"h1\" variant=\"h5\">\n          Reset password\n        </Typography>\n\n        {/* Display's error messages while signing in */}\n        <Typography variant=\"body1\" align=\"center\" style={{ marginTop: '10px' }} color={auth.resetPasswordError ? 'secondary' : 'error'}>\n          {auth.resetPasswordError}\n        </Typography>\n\n        <form className={classes.form} noValidate>\n          <TextField\n            variant=\"outlined\"\n            margin=\"normal\"\n            required\n            fullWidth\n            id=\"email\"\n            label=\"email\"\n            name=\"email\"\n            type=\"email\"\n            autoComplete=\"email\"\n            value={email}\n            onChange={e => setEmail(e.target.value)}\n            autoFocus\n          />\n          <Button\n            fullWidth\n            variant=\"contained\"\n            color=\"primary\"\n            onClick={() => { email.length > 0 && dispatch(resetPassword(email)) }}\n            className={classes.submit}\n            disabled={false}\n          >\n            Reset password\n          </Button>\n        </form>\n\n      </Card>\n      <Button\n        fullWidth\n        onClick={() => { window.open(homeURL, '_self') }}\n        color=\"default\"\n        className={classes.submit}\n      >\n        Back to home\n      </Button>\n    </Container>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/SchematiEditor.js",
    "content": "// Main Layout for Schemaic Editor page.\n/* eslint-disable react/prop-types */\nimport React, { useEffect } from 'react'\nimport { CssBaseline } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\n\nimport Layout from '../components/Shared/Layout'\nimport Header from '../components/SchematicEditor/Header'\nimport ComponentSidebar from '../components/SchematicEditor/ComponentSidebar'\nimport LayoutMain from '../components/Shared/LayoutMain'\nimport SchematicToolbar from '../components/SchematicEditor/SchematicToolbar'\nimport RightSidebar from '../components/SchematicEditor/RightSidebar'\nimport PropertiesSidebar from '../components/SchematicEditor/PropertiesSidebar'\nimport LoadGrid from '../components/SchematicEditor/Helper/ComponentDrag.js'\nimport ComponentProperties from '../components/SchematicEditor/ComponentProperties'\nimport '../components/SchematicEditor/Helper/SchematicEditor.css'\nimport { fetchSchematic, fetchGallerySchematic } from '../redux/actions/index'\nimport { useDispatch } from 'react-redux'\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n    display: 'flex',\n    minHeight: '100vh'\n  },\n  toolbar: {\n    minHeight: '80px'\n  }\n}))\n\nexport default function SchematiEditor (props) {\n  const classes = useStyles()\n  const compRef = React.createRef()\n  const gridRef = React.createRef()\n  const outlineRef = React.createRef()\n  const dispatch = useDispatch()\n  const [mobileOpen, setMobileOpen] = React.useState(false)\n  const [ltiSimResult, setLtiSimResult] = React.useState(false)\n\n  const handleDrawerToggle = () => {\n    setMobileOpen(!mobileOpen)\n  }\n\n  useEffect(() => {\n    document.title = 'Schematic Editor - eSim '\n    const container = gridRef.current\n    const sidebar = compRef.current\n    const outline = outlineRef.current\n    LoadGrid(container, sidebar, outline)\n\n    if (props.location.search !== '') {\n      const query = new URLSearchParams(props.location.search)\n      console.log(props.location.search)\n      const cktid = query.get('id')\n      const version = query.get('version')\n      const branch = query.get('branch')\n      console.log(cktid)\n      if (cktid.substr(0, 7) === 'gallery') {\n        // Loading Gallery schemaic.\n        dispatch(fetchGallerySchematic(cktid))\n      } else {\n        // Loading User on-cloud saved schemaic.\n        dispatch(fetchSchematic(cktid, version, branch))\n      }\n    }\n  // eslint-disable-next-line\n  }, [props.location])\n\n  return (\n    <div className={classes.root}>\n      <CssBaseline />\n\n      {/* Schematic editor header, toolbar and left side pane */}\n      <Layout\n        header={gridRef && <Header gridRef={gridRef}/> }\n        resToolbar={\n          <SchematicToolbar\n            gridRef={gridRef}\n            ltiSimResult={ltiSimResult}\n            setLtiSimResult={setLtiSimResult}\n            mobileClose={handleDrawerToggle}\n          />\n        }\n        sidebar={<ComponentSidebar compRef={compRef} ltiSimResult={ltiSimResult}\n          setLtiSimResult={setLtiSimResult}/>}\n      />\n\n      {/* Grid for drawing and designing circuits */}\n      <LayoutMain>\n        <div className={classes.toolbar} />\n        <center>\n          <div className=\"grid-container A4-L\" ref={gridRef} id=\"divGrid\" />\n        </center>\n      </LayoutMain>\n\n      {/* Schematic editor Right side pane */}\n      <RightSidebar mobileOpen={mobileOpen} mobileClose={handleDrawerToggle}>\n        <PropertiesSidebar gridRef={gridRef} outlineRef={outlineRef} />\n      </RightSidebar>\n      <ComponentProperties/>\n    </div>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/Simulator.js",
    "content": "import React, { useState, useEffect } from 'react'\nimport { Container, Grid, Button, Paper, Typography, Switch, FormControlLabel } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport Editor from '../components/Simulator/Editor'\nimport textToFile from '../components/Simulator/textToFile'\nimport SimulationScreen from '../components/Shared/SimulationScreen'\nimport { useDispatch } from 'react-redux'\nimport { setResultGraph, setResultText, setNetlist } from '../redux/actions/index'\nimport Notice from '../components/Shared/Notice'\n\nimport api from '../utils/Api'\n\nconst useStyles = makeStyles((theme) => ({\n  header: {\n    padding: theme.spacing(5, 0, 6)\n    // color: '#fff'\n  },\n  paper: {\n    padding: theme.spacing(2),\n    textAlign: 'center',\n    backgroundColor: '#404040',\n    color: '#fff'\n\n  }\n}))\n\nexport default function Simulator () {\n  const classes = useStyles()\n  const dispatch = useDispatch()\n  const [netlistCode, setNetlistCode] = useState('')\n  const [errMsg, setErrMsg] = useState('')\n  const [err, setErr] = useState(false)\n  const [status, setStatus] = useState('')\n  const stats = { loading: 'loading', error: 'error', success: 'success' }\n  const [state, setState] = React.useState({\n    checkedA: false\n\n  })\n  const [taskId, setTaskId] = useState(null)\n\n  useEffect(() => {\n    document.title = 'Simulator - eSim '\n  })\n\n  const handleChange = (event) => {\n    setState({ ...state, [event.target.name]: event.target.checked })\n  }\n\n  const handleSimulationButtonClick = () => {\n    prepareNetlist()\n  }\n  const onCodeChange = (code) => {\n    setNetlistCode(code)\n  }\n\n  const [simulateOpen, setSimulateOpen] = React.useState(false)\n\n  const handleErrOpen = () => {\n    setErr(true)\n  }\n  const handleErrClose = () => {\n    setErr(false)\n  }\n  const handleErrMsg = (msg) => {\n    setErrMsg(msg)\n  }\n  const handleStatus = (status) => {\n    setStatus(status)\n  }\n  const handlesimulateOpen = () => {\n    setSimulateOpen(true)\n  }\n\n  const handleSimulateClose = () => {\n    setSimulateOpen(false)\n  }\n\n  const netlistCodeSanitization = (code) => {\n    const codeArray = code.split('\\n')\n    let cleanCode = ''\n    let frontPlot = ''\n    for (let line = 0; line < codeArray.length; line++) {\n      if (codeArray[line].includes('plot') && !codeArray[line].includes('setplot')) {\n        frontPlot += codeArray[line].split('plot ')[1] + ' '\n      }\n    }\n    frontPlot = `print ${frontPlot} > data.txt \\n`\n    let flag = 0\n    for (let i = 0; i < codeArray.length; i++) {\n      if (codeArray[i].includes('plot') && !codeArray[i].includes('setplot')) {\n        if (!flag) {\n          cleanCode += frontPlot\n          flag = 1\n        }\n      } else {\n        cleanCode += codeArray[i] + '\\n'\n      }\n    }\n    return cleanCode\n  }\n\n  function prepareNetlist () {\n    const sanatizedText = netlistCodeSanitization(netlistCode)\n    dispatch(setNetlist(sanatizedText))\n    const file = textToFile(sanatizedText)\n    sendNetlist(file)\n  }\n\n  // Upload the nelist\n  function netlistConfig (file) {\n    const token = localStorage.getItem('esim_token')\n    const formData = new FormData()\n    formData.append('file', file)\n    const config = {\n      headers: {\n        'content-type': 'multipart/form-data'\n      }\n    }\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    return api.post('simulation/upload', formData, config)\n  }\n\n  function sendNetlist (file) {\n    setIsResult(false)\n    netlistConfig(file)\n      .then((response) => {\n        const res = response.data\n        const getUrl = 'simulation/status/'.concat(res.details.task_id)\n        setTaskId(res.details.task_id)\n        simulationResult(getUrl)\n      })\n      .catch(function (error) {\n        console.log(error)\n      })\n  }\n\n  const [isResult, setIsResult] = useState(false)\n\n  function simulationResult (url) {\n    let isError = false\n    let msg\n    let resPending = true // to stop immature opening of simulation screen\n    api\n      .get(url)\n      .then((res) => {\n        if (res.data.state === 'PROGRESS' || res.data.state === 'PENDING') {\n          handleStatus(stats.loading)\n          setTimeout(simulationResult(url), 1000)\n        } else if (Object.prototype.hasOwnProperty.call(res.data.details, 'fail')) {\n          resPending = false\n          setIsResult(false)\n          console.log('failed notif')\n          console.log(res.data.details)\n          msg = res.data.details.fail.replace(\"b'\", '')\n          isError = true\n          console.log(err)\n        } else {\n          const result = res.data.details\n          resPending = false\n          if (result === null) {\n            setIsResult(false)\n          } else {\n            const temp = res.data.details.data\n\n            const data = result.data\n            if (res.data.details.graph === 'true') {\n              const simResultGraph = { labels: [], x_points: [], y_points: [] }\n              // populate the labels\n              for (let i = 0; i < data.length; i++) {\n                simResultGraph.labels[0] = data[i].labels[0]\n                const lab = data[i].labels\n                // lab is an array containeing labels names ['time','abc','def']\n                simResultGraph.x_points = data[0].x\n\n                // labels\n                for (let x = 1; x < lab.length; x++) {\n                //   if (lab[x].includes('#branch')) {\n                //     lab[x] = `I (${lab[x].replace('#branch', '')})`\n                //   }\n                  //  uncomment below if you want label like V(r1.1) but it will break the graph showing time as well\n                  //  else {\n                  // lab[x] = `V (${lab[x]})`\n\n                  // }\n                  simResultGraph.labels.push(lab[x])\n                }\n                // populate y_points\n                for (let z = 0; z < data[i].y.length; z++) {\n                  simResultGraph.y_points.push(data[i].y[z])\n                }\n              }\n\n              simResultGraph.x_points = simResultGraph.x_points.map(d => parseFloat(d))\n\n              for (let i1 = 0; i1 < simResultGraph.y_points.length; i1++) {\n                simResultGraph.y_points[i1] = simResultGraph.y_points[i1].map(d => parseFloat(d))\n              }\n              dispatch(setResultGraph(simResultGraph))\n            } else {\n              const simResultText = []\n              for (let i = 0; i < temp.length; i++) {\n                let postfixUnit = ''\n                if (temp[i][0].includes('#branch')) {\n                  postfixUnit = 'A'\n                } else if (temp[i][0].includes('transfer_function')) {\n                  postfixUnit = ''\n                } else if (temp[i][0].includes('impedance')) {\n                  postfixUnit = 'Ohm'\n                } else {\n                  temp[i][0] = `V(${temp[i][0]})`\n                  postfixUnit = 'V'\n                }\n\n                simResultText.push(temp[i][0] + ' ' + temp[i][1] + ' ' + parseFloat(temp[i][2]) + ' ' + postfixUnit + '\\n')\n              }\n              // handleSimulationResult(res.data.details)\n              dispatch(setResultText(simResultText))\n            }\n            setIsResult(true)\n          }\n        }\n      })\n      .then((res) => {\n        if (isError === false && resPending === false) {\n          // console.log('no error')\n          handleStatus(stats.success)\n          handlesimulateOpen()\n        } else if (resPending === false) {\n          handleStatus(stats.error)\n          handleErrMsg(msg)\n\n          // console.log('reached error alert')\n          // console.log(msg)\n          // alert(msg)\n        }\n        handleErrOpen()\n      })\n      .catch(function (error) {\n        console.log(error)\n      })\n  }\n\n  return (\n    <Container maxWidth=\"lg\" className={classes.header}>\n      <SimulationScreen open={simulateOpen} isResult={isResult} close={handleSimulateClose} dark={state} taskId={taskId} />\n      <Grid\n        container\n        spacing={3}\n        direction=\"row\"\n        justify=\"center\"\n        alignItems=\"stretch\"\n      >\n        <Notice status={status} open={err} msg={errMsg} close={handleErrClose}/>\n        <Grid item xs={12} >\n          <Paper className={classes.paper}>\n\n            <Typography variant=\"h4\" gutterBottom>\n              SPICE SIMULATOR\n            </Typography>\n            <Typography variant=\"subtitle1\" gutterBottom>\n              eSim on Cloud - ngSpice Simulator\n            </Typography>\n          </Paper>\n        </Grid>\n        <Grid item xs={12} >\n          <Paper className={classes.paper}>\n\n            <Typography variant=\"h5\" gutterBottom>\n              Enter Netlist\n\n            </Typography>\n            <FormControlLabel\n              style={{ marginLeft: '10px' }}\n              control={<Switch checked={state.checkedA} color=\"primary\" onChange={handleChange} name=\"checkedA\" />}\n              label=\"Light Mode\"\n            />\n\n            <Editor code={netlistCode} onCodeChange={onCodeChange} dark={state} />\n            <br />\n\n            <Button variant=\"contained\" color=\"primary\" size=\"large\" onClick={handleSimulationButtonClick}>\n              Simulate\n            </Button>\n          </Paper>\n        </Grid>\n      </Grid>\n    </Container>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/SubmissionPage.js",
    "content": "// Main Layout for Submission Page\nimport React, { useEffect } from 'react'\nimport { Switch, Route } from 'react-router-dom'\nimport { CssBaseline } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\n\nimport { Header } from '../components/Shared/Navbar'\nimport Layout from '../components/Shared/Layout'\nimport LayoutMain from '../components/Shared/LayoutMain'\nimport DashboardSidebar from '../components/Dashboard/DashboardSidebar'\nimport DashboardHome from '../components/Dashboard/DashboardHome'\nimport SchematicsList from '../components/Dashboard/SchematicsList'\nimport SubmissionTable from '../components/LTI/SubmissionTable'\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n    display: 'flex',\n    minHeight: '100vh'\n  },\n  toolbar: {\n    minHeight: '40px'\n  }\n}))\n\nexport default function Submissions () {\n  const classes = useStyles()\n  // var auth = useSelector(state => state.authReducer)\n\n  useEffect(() => {\n    document.title = 'Submissions - eSim'\n    // eslint-disable-next-line\n  }, [])\n\n  return (\n    <div className={classes.root}>\n      <CssBaseline />\n\n      {/* Submission page header and left side pane */}\n      <Layout resToolbar={<Header />} sidebar={<DashboardSidebar />} />\n\n      <LayoutMain>\n        <div className={classes.toolbar} />\n        <Switch>\n          <Route exact path=\"/dashboard\" component={DashboardHome} />\n          <Route exact path=\"/dashboard/profile\" />\n          <Route\n            exact\n            path=\"/dashboard/schematics\"\n            component={SchematicsList}\n          />\n        </Switch>\n        <SubmissionTable />\n      </LayoutMain>\n    </div>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/pages/signUp.js",
    "content": "// User Sign Up / Register page.\nimport React, { useState, useEffect } from 'react'\nimport {\n  Container,\n  Grid,\n  Button,\n  Typography,\n  Link,\n  Checkbox,\n  FormControlLabel,\n  TextField,\n  Card,\n  Avatar,\n  InputAdornment,\n  IconButton\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport LockOutlinedIcon from '@material-ui/icons/LockOutlined'\nimport Visibility from '@material-ui/icons/Visibility'\nimport VisibilityOff from '@material-ui/icons/VisibilityOff'\nimport { Link as RouterLink, useHistory } from 'react-router-dom'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { signUp, authDefault, googleLogin } from '../redux/actions/index'\nimport google from '../static/google.png'\n\nconst useStyles = makeStyles((theme) => ({\n  paper: {\n    marginTop: theme.spacing(20),\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    padding: theme.spacing(3, 5)\n  },\n  avatar: {\n    margin: theme.spacing(1),\n    backgroundColor: theme.palette.primary.main\n  },\n  form: {\n    width: '100%', // Fix IE 11 issue.\n    marginTop: theme.spacing(1)\n  },\n  submit: {\n    margin: theme.spacing(1.5, 0)\n  }\n}))\n\nexport default function SignUp () {\n  const classes = useStyles()\n\n  const auth = useSelector(state => state.authReducer)\n\n  const dispatch = useDispatch()\n  var homeURL = `${window.location.protocol}\\\\\\\\${window.location.host}/`\n\n  useEffect(() => {\n    dispatch(authDefault())\n    document.title = 'Sign Up - eSim '\n  }, [dispatch])\n\n  const history = useHistory()\n\n  const [username, setUsername] = useState('')\n  const [password, setPassword] = useState('')\n  const [email, setEmail] = useState('')\n  const [accept, setAccept] = useState(true)\n  const [showPassword, setShowPassword] = useState(false)\n  const handleClickShowPassword = () => setShowPassword(!showPassword)\n  const handleMouseDownPassword = () => setShowPassword(!showPassword)\n\n  // Function call for google oAuth sign up.\n  const handleGoogleSignup = () => {\n    var host = window.location.protocol + '//' + window.location.host\n    dispatch(googleLogin(host))\n  }\n\n  const handleSignup = (event) => {\n    event.preventDefault()\n    dispatch(signUp(email, username, password, history))\n  }\n\n  return (\n    <Container component=\"main\" maxWidth=\"xs\">\n      <Card className={classes.paper}>\n        <Avatar className={classes.avatar}>\n          <LockOutlinedIcon />\n        </Avatar>\n\n        <Typography component=\"h1\" variant=\"h5\">\n          Register | Sign Up\n        </Typography>\n\n        {/* Display's error messages while signing in */}\n        <Typography variant=\"body1\" align=\"center\" style={{ marginTop: '10px' }} color={auth.isRegistered ? 'secondary' : 'error'}>\n          {auth.regErrors}\n          { auth.isRegistered &&\n            <>\n              <br />\n              <Link component={RouterLink} to=\"/login\">\n                {'Back to Login'}\n              </Link>\n            </>\n          }\n        </Typography>\n\n        <form className={classes.form} onSubmit={handleSignup} noValidate>\n          <TextField\n            variant=\"outlined\"\n            margin=\"normal\"\n            required\n            fullWidth\n            id=\"username\"\n            label=\"Username\"\n            name=\"username\"\n            autoComplete=\"email\"\n            value={username}\n            onChange={e => setUsername(e.target.value)}\n            autoFocus\n          />\n          <TextField\n            variant=\"outlined\"\n            margin=\"normal\"\n            required\n            fullWidth\n            id=\"email\"\n            label=\"email\"\n            name=\"email\"\n            type=\"email\"\n            autoComplete=\"email\"\n            value={email}\n            onChange={e => setEmail(e.target.value)}\n            autoFocus\n          />\n          <TextField\n            variant=\"outlined\"\n            margin=\"normal\"\n            required\n            fullWidth\n            name=\"password\"\n            label=\"Password\"\n            InputProps={{\n              endAdornment: (\n                <InputAdornment position=\"end\">\n                  <IconButton\n                    size=\"small\"\n                    aria-label=\"toggle password visibility\"\n                    onClick={handleClickShowPassword}\n                    onMouseDown={handleMouseDownPassword}\n                  >\n                    {showPassword ? <Visibility fontSize=\"small\" /> : <VisibilityOff fontSize=\"small\" />} {/* handle password visibility */}\n                  </IconButton>\n                </InputAdornment>\n              )\n            }}\n            type={showPassword ? 'text' : 'password'}\n            id=\"password\"\n            value={password}\n            onChange={e => setPassword(e.target.value)}\n            autoComplete=\"current-password\"\n          />\n          <FormControlLabel\n            control={<Checkbox checked={accept} onChange={e => setAccept(e.target.checked)} color=\"primary\" />}\n            label=\"I accept the Terms of Use & Privacy Policy\"\n          />\n          <Button\n            fullWidth\n            variant=\"contained\"\n            color=\"primary\"\n            type=\"submit\"\n            className={classes.submit}\n            disabled={!accept}\n          >\n            Sign Up\n          </Button>\n          <Typography variant=\"body2\" color=\"secondary\" align=\"center\" >Or</Typography>\n\n          {/* Google oAuth Sign Up option */}\n          <Button\n            fullWidth\n            variant=\"outlined\"\n            color=\"primary\"\n            onClick={handleGoogleSignup}\n            className={classes.submit}\n          >\n            <img alt=\"G\" src={google} height=\"20\" />&emsp; Sign Up With Google\n          </Button>\n        </form>\n\n        <Grid container>\n          <Grid item style={{ margin: 'auto' }} >\n            <Link component={RouterLink} to=\"/login\" variant=\"body2\">\n              {'Already have account? Login'}\n            </Link>\n          </Grid>\n        </Grid>\n      </Card>\n      <Button\n        fullWidth\n        onClick={() => { window.open(homeURL, '_self') }}\n        color=\"default\"\n        className={classes.submit}\n      >\n        Back to home\n      </Button>\n    </Container>\n  )\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/actions/accountActions.js",
    "content": "\nimport * as actions from './actions'\nimport api from '../../utils/Api'\n\n// Redux action for account workflow\nconst changePasswordError = (message) => (dispatch) => {\n  dispatch({\n    type: actions.CHANGE_PASSWORD_FAILED,\n    payload: {\n      data: message\n    }\n  })\n}\n\nexport const changePassword = (oldPassword, newPassword, reNewPassword, history, url) => (dispatch, getState) => {\n  const body = {\n    current_password: oldPassword,\n    new_password: newPassword,\n    re_new_password: reNewPassword\n  }\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  const token = getState().authReducer.token\n\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n\n  api.post('auth/users/set_password/', body, config)\n    .then((res) => {\n      if (res.status >= 200 || res.status < 304) {\n        dispatch({\n          type: actions.CHANGE_PASSWORD_SUCCESS,\n          payload: {\n            data: 'The password has been changed successfully.'\n          }\n        })\n        if (url != null) {\n          setTimeout(() => {\n            window.location.href = url\n          }, 2000)\n        } else {\n          setTimeout(() => {\n            history.push('/dashboard')\n          }, 2000)\n        }\n      }\n    })\n    .catch((err) => {\n      var res = err.response\n      if ([400, 401, 403, 304].includes(res.status)) {\n        // eslint-disable-next-line camelcase\n        const { new_password, re_new_password, current_password, non_field_errors } = res.data\n        const defaultErrors = ['Password change failed.']\n        // eslint-disable-next-line camelcase\n        var message = (current_password || new_password || non_field_errors || re_new_password || defaultErrors)[0]\n\n        dispatch(changePasswordError(message))\n      }\n    })\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/actions/actions.js",
    "content": "// Actions for schematic editor\nexport const FETCH_LIBRARIES = 'FETCH_LIBRARIES'\nexport const FETCH_LIBRARY = 'FETCH_LIBRARY'\nexport const REMOVE_LIBRARY = 'REMOVE_LIBRARY'\nexport const FETCH_ALL_LIBRARIES = 'FETCH_ALL_LIBRARIES'\nexport const FETCH_CUSTOM_LIBRARIES = 'FETCH_CUSTOM_LIBRARIES'\nexport const DELETE_LIBRARY = 'DELETE_LIBRARY'\nexport const UPLOAD_LIBRARIES = 'UPLOAD_LIBRARIES'\nexport const RESET_UPLOAD_SUCCESS = 'RESET_UPLOAD_SUCCESS'\nexport const TOGGLE_COLLAPSE = 'TOGGLE_COLLAPSE'\nexport const FETCH_COMPONENTS = 'FETCH_COMPONENTS'\nexport const TOGGLE_SIMULATE = 'TOGGLE_SIMULATE'\n\n// Actions for handleing component properties\nexport const GET_COMP_PROPERTIES = 'GET_COMP_PROPERTIES'\nexport const SET_COMP_PROPERTIES = 'SET_COMP_PROPERTIES'\nexport const CLOSE_COMP_PROPERTIES = 'CLOSE_COMP_PROPERTIES'\nexport const CLOSE_COMP_PROPERTIES_TEMP = 'CLOSE_COMP_PROPERTIES_TEMP'\n\n// Actions for handleing and generating netlist\nexport const SET_NETLIST = 'SET_NETLIST'\nexport const SET_TITLE = 'SET_TITLE'\nexport const SET_MODEL = 'SET_MODEL'\nexport const SET_CONTROL_LINE = 'SET_CONTROL_LINE'\nexport const SET_CONTROL_BLOCK = 'SET_CONTROL_BLOCK'\n\n// Actions for handleing simualtion result display\nexport const SET_RESULT_TITLE = 'SET_RESULT_TITLE'\nexport const SET_RESULT_GRAPH = 'SET_RESULT_GRAPH'\nexport const SET_RESULT_TEXT = 'SET_RESULT_TEXT'\n\n// Actions for handleing user authentication and registeration\nexport const USER_LOADING = 'USER_LOADING'\nexport const USER_LOADED = 'USER_LOADED'\nexport const LOGIN_SUCCESSFUL = 'LOGIN_SUCCESSFUL'\nexport const AUTHENTICATION_ERROR = 'AUTHENTICATION_ERROR'\nexport const LOGIN_FAILED = 'LOGIN_FAILED'\nexport const LOGOUT_SUCCESSFUL = 'LOGOUT_SUCCESSFUL'\nexport const LOADING_FAILED = 'LOADING_FAILED'\nexport const SIGNUP_SUCCESSFUL = 'SIGNUP_SUCCESSFUL'\nexport const SIGNUP_FAILED = 'SIGNUP_FAILED'\nexport const DEFAULT_STORE = 'DEFAULT_STORE'\nexport const RESET_PASSWORD_SUCCESSFUL = 'RESET_PASSWORD_SUCCESSFUL'\nexport const RESET_PASSWORD_FAILED = 'RESET_PASSWORD_FAILED'\nexport const RESET_PASSWORD_CONFIRM_SUCCESSFUL = 'RESET_PASSWORD_CONFIRM_SUCCESSFUL'\nexport const RESET_PASSWORD_CONFIRM_FAILED = 'RESET_PASSWORD_CONFIRM_FAILED'\nexport const ROLE_LOADED = 'ROLE_LOADED'\n\n// Actions for saving scheamtics and loading saved, gallery and local schematics.\nexport const SAVE_SCHEMATICS = 'SAVE_SCHEMATICS'\nexport const SET_SCH_SAVED = 'SET_SCH_SAVED'\nexport const SET_SCH_TITLE = 'SET_SCH_TITLE'\nexport const SET_SCH_DESCRIPTION = 'SET_SCH_DESCRIPTION'\nexport const SET_SCH_XML_DATA = 'SET_SCH_XML_DATA'\nexport const SET_SCH_SHARED = 'SET_SCH_SHARED'\nexport const CLEAR_DETAILS = 'CLEAR_DETAILS'\n\n// Action for fetching on-cloud saved schematics for authenticated user to display in dashboard\nexport const FETCH_SCHEMATICS = 'FETCH_SCHEMATICS'\n\n// Action for fetching on-cloud gallery for everyone\nexport const FETCH_GALLERY = 'FETCH_GALLERY'\n\n// Actions for accounts page\nexport const CHANGE_PASSWORD_SUCCESS = 'CHANGE_PASSWORD_SUCCESS'\nexport const CHANGE_PASSWORD_FAILED = 'CHANGE_PASSWORD_FAILED'\n\nexport const FETCH_MY_PROJECTS = 'FETCH_MY_PROJECTS'\nexport const FETCH_PUBLIC_PROJECTS = 'FETCH_PUBLIC_PROJECTS'\nexport const FETCH_OTHER_PROJECTS = 'FETCH_OTHER_PROJECTS'\n\n// Actions for handling Projects\nexport const SET_CURRENT_PROJECT = 'SET_CURRENT_PROJECT'\nexport const DELETE_PROJECT = 'DELETE_PROJECT'\nexport const FETCH_REPORTS = 'FETCH_REPORTS'\nexport const RESOLVE_REPORTS = 'RESOLVE_REPORTS'\nexport const GET_STATES = 'GET_STATES'\nexport const SET_STATE = 'SET_STATE'\n"
  },
  {
    "path": "eda-frontend/src/redux/actions/authActions.js",
    "content": "import * as actions from './actions'\nimport api from '../../utils/Api'\n\n// Api call for maintaining user login state throughout the application\nexport const loadUser = () => (dispatch, getState) => {\n  // User Loading\n  dispatch({ type: actions.USER_LOADING })\n\n  // Get token from localstorage and dispatch LOGIN_SUCCESSFUL\n  const token = localStorage.getItem('esim_token')\n  const userId = localStorage.getItem('user_id')\n  if (token) {\n    dispatch({\n      type: actions.LOGIN_SUCCESSFUL,\n      payload: {\n        data: {\n          auth_token: token,\n          user_id: userId\n        }\n      }\n    })\n  }\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  } else {\n    dispatch({ type: actions.LOADING_FAILED })\n    return\n  }\n\n  api.get('auth/users/me/', config)\n    .then(\n      (res) => {\n        if (res.status === 200) {\n          dispatch({\n            type: actions.USER_LOADED,\n            payload: {\n              user: res.data\n            }\n          })\n        } else if (res.status >= 400 && res.status < 500) {\n          dispatch({\n            type: actions.LOGIN_FAILED,\n            payload: {\n              data: res.data\n            }\n          })\n        }\n      }\n    )\n    .catch((err) => {\n      console.error(err)\n      dispatch({\n        type: actions.LOGIN_FAILED,\n        payload: {\n          data: []\n        }\n      })\n    })\n}\n\n// Api call for maintaining user login state throughout the application without excess actions\nexport const loadMinUser = () => (dispatch) => {\n  // Get token from localstorage and dispatch LOGIN_SUCCESSFUL\n  const token = localStorage.getItem('esim_token')\n  const userId = localStorage.getItem('user_id')\n  if (token) {\n    dispatch({\n      type: actions.LOGIN_SUCCESSFUL,\n      payload: {\n        data: {\n          auth_token: token,\n          user_id: userId\n        }\n      }\n    })\n  }\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  } else {\n    dispatch({ type: actions.LOADING_FAILED })\n    return\n  }\n\n  api.get('auth/users/me/', config)\n    .then(\n      (res) => {\n        if (res.status === 200) {\n          dispatch({\n            type: actions.USER_LOADED,\n            payload: {\n              user: res.data\n            }\n          })\n        } else if (res.status >= 400 && res.status < 500) {\n          dispatch({\n            type: actions.LOGIN_FAILED,\n            payload: {\n              data: res.data\n            }\n          })\n        }\n      }\n    )\n    .catch((err) => {\n      console.error(err)\n      dispatch({\n        type: actions.LOGIN_FAILED,\n        payload: {\n          data: {}\n        }\n      })\n    })\n}\n\n// Handle api call for user login\nexport const login = (username, password, toUrl) => {\n  const body = {\n    password: password,\n    username: username\n  }\n\n  return function (dispatch) {\n    api.post('auth/user/token/', body)\n      .then((res) => {\n        if (res.status === 200) {\n          dispatch({\n            type: actions.LOGIN_SUCCESSFUL,\n            payload: {\n              data: res.data\n            }\n          })\n          if (toUrl === '') {\n            dispatch(loadUser())\n          } else if (toUrl === 'close') {\n            window.opener = null\n            window.open('', '_self')\n            window.close()\n          } else {\n            if (process.env.NODE_ENV === 'development') {\n              localStorage.setItem('ard_redurl', '')\n              window.location.href = toUrl + '?token=' + localStorage.getItem('esim_token')\n            } else {\n              window.open(toUrl, '_self')\n              localStorage.setItem('ard_redurl', '')\n            }\n          }\n        } else if (res.status === 400 || res.status === 403 || res.status === 401) {\n          dispatch({\n            type: actions.AUTHENTICATION_ERROR,\n            payload: {\n              data: res.data.non_field_errors[0]\n            }\n          })\n        } else {\n          dispatch({\n            type: actions.LOGIN_FAILED,\n            payload: {\n              data: 'Something went wrong! Login Failed'\n            }\n          })\n        }\n      })\n      .catch((err) => {\n        var res = err.response\n        if (res.status === 400 || res.status === 403 || res.status === 401) {\n          dispatch(loginError(res.data.non_field_errors[0]))\n        } else {\n          dispatch(loginError('Something went wrong! Login Failed'))\n        }\n      })\n  }\n}\n\n// Handle api call for user sign up\nexport const signUp = (email, username, password, history) => (dispatch) => {\n  const body = {\n    email: email,\n    username: username,\n    password: password\n  }\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  api.post('auth/users/', body, config)\n    .then((res) => {\n      if (res.status === 200 || res.status === 201) {\n        dispatch({\n          type: actions.SIGNUP_SUCCESSFUL,\n          payload: {\n            data: 'Successfully Signed Up! A verification link has been sent to your email account.'\n          }\n        })\n        // history.push('/login')\n      }\n    })\n    .catch((err) => {\n      var res = err.response\n      if (res.status === 400 || res.status === 403 || res.status === 401) {\n        if (res.data.username !== undefined) {\n          if (res.data.username[0].search('already') !== -1 && res.data.username[0].search('exists') !== -1) { dispatch(signUpError('Username Already Taken.')) }\n        } else if (res.data.password !== undefined) {\n          dispatch(signUpError(res.data.password))\n        } else {\n          dispatch(signUpError(res.data.email))\n        }\n      } else {\n        dispatch(signUpError('Something went wrong! Registration Failed'))\n      }\n    })\n}\n\n// Handle api call for user logout\nexport const logout = (history) => (dispatch, getState) => {\n  // Get token from localstorage\n  const token = getState().authReducer.token\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n\n  api.post('auth/token/logout/', {}, config)\n    .then(\n      (res) => {\n        if (res.status === 200 || res.status === 204) {\n          dispatch({\n            type: actions.LOGOUT_SUCCESSFUL,\n            payload: {\n              user: res.data\n            }\n          })\n          history.push('/login')\n        }\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n\n// Redux action for default auth store\nexport const authDefault = () => (dispatch) => {\n  dispatch({ type: actions.DEFAULT_STORE })\n}\n\n// Redux action for display login error\nconst loginError = (message) => (dispatch) => {\n  dispatch({\n    type: actions.AUTHENTICATION_ERROR,\n    payload: {\n      data: message\n    }\n  })\n}\n\n// Redux action for display sign up error\nconst signUpError = (message) => (dispatch) => {\n  dispatch({\n    type: actions.SIGNUP_FAILED,\n    payload: {\n      data: message\n    }\n  })\n}\n\n// Redux action for display reset password error\nconst resetPasswordError = (message) => (dispatch) => {\n  dispatch({\n    type: actions.RESET_PASSWORD_FAILED,\n    payload: {\n      data: message\n    }\n  })\n}\n\n// Redux action for display reset password confirmation error\nexport const resetPasswordConfirmError = (message) => (dispatch) => {\n  dispatch({\n    type: actions.RESET_PASSWORD_CONFIRM_FAILED,\n    payload: {\n      data: message\n    }\n  })\n}\n\n// Api call for Google oAuth login or sign up\nexport const googleLogin = (host, toUrl) => {\n  return function (dispatch) {\n    api.get('auth/o/google-oauth2/?redirect_uri=' + host + '/api/auth/google-callback')\n      .then((res) => {\n        if (res.status === 200) {\n          // Open google login page\n          window.open(res.data.authorization_url, '_self')\n        } else {\n          dispatch({\n            type: actions.LOGIN_FAILED,\n            payload: {\n              data: 'Something went wrong! Login Failed'\n            }\n          })\n        }\n      })\n      .then((res) => { console.log(res) })\n      .catch((err) => {\n        var res = err.response\n        if (res.status === 400 || res.status === 403 || res.status === 401) {\n          dispatch(loginError('Incorrect Username or Password.'))\n        } else {\n          dispatch(loginError('Something went wrong! Login Failed'))\n        }\n      })\n  }\n}\n// Handles api call for user's password confirmation\nexport const resetPasswordConfirm = (uid, token, newPassword, reNewPassword) => (dispatch) => {\n  const body = {\n    uid: uid,\n    token: token,\n    new_password: newPassword,\n    re_new_password: reNewPassword\n  }\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  api.post('auth/users/reset_password_confirm/', body, config)\n    .then((res) => {\n      if (res.status >= 200 || res.status < 304) {\n        dispatch({\n          type: actions.RESET_PASSWORD_CONFIRM_SUCCESSFUL,\n          payload: {\n            data: 'The password has been reset successfully.'\n          }\n        })\n        setTimeout(() => {\n          window.location.href = '/eda/#/login'\n        }, 2000)\n      }\n    })\n    .catch((err) => {\n      var res = err.response\n      if ([400, 401, 403, 304].includes(res.status)) {\n        // eslint-disable-next-line camelcase\n        const { new_password, re_new_password, non_field_errors, token } = res.data\n        const defaultErrors = ['Password reset failed.']\n        // eslint-disable-next-line camelcase\n        var message = (new_password || re_new_password || non_field_errors || defaultErrors)[0]\n\n        if (token) {\n          // Override message if it's a token error\n          message = 'Either the password has already been changed or you have the incorrect URL'\n        }\n\n        dispatch(resetPasswordConfirmError(message))\n      }\n    })\n}\n// Handles api call for user's password recovery\nexport const resetPassword = (email) => (dispatch) => {\n  const body = {\n    email: email\n  }\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  api.post('auth/users/reset_password/', body, config)\n    .then((res) => {\n      if (res.status >= 200 || res.status < 304) {\n        dispatch({\n          type: actions.RESET_PASSWORD_SUCCESSFUL,\n          payload: {\n            data: 'The password reset link has been sent to your email account.'\n          }\n        })\n        setTimeout(() => {\n          window.location.href = '/eda/#/login'\n        }, 2000)\n        // history.push('/login')\n      }\n    })\n    .catch((err) => {\n      var res = err.response\n      if ([400, 401, 403, 304].includes(res.status)) {\n        dispatch(resetPasswordError(res.data))\n      }\n    })\n}\n// API call for fetching user role.\nexport const fetchRole = () => (dispatch, getState) => {\n  const token = getState().authReducer.token\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  } else {\n    dispatch({ type: actions.LOADING_FAILED })\n    return\n  }\n  api.get('workflow/role/', config)\n    .then((res) => {\n      console.log(res.data)\n      dispatch({\n        type: actions.ROLE_LOADED,\n        payload: {\n          data: res.data\n        }\n      })\n    }).catch(() => { console.log('Error') })\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/actions/componentPropertiesActions.js",
    "content": "import * as actions from './actions'\n\n// Actions for listing stored component properites on double click on component\nexport const getCompProperties = (id, compProperties, x, y) => (dispatch) => {\n  dispatch({\n    type: actions.GET_COMP_PROPERTIES,\n    payload: {\n      id: id,\n      compProperties: compProperties,\n      x: x,\n      y: y\n    }\n  })\n}\n\n// Actions for updating entered component properites on clicking set parameters\nexport const setCompProperties = (id, compProperties) => (dispatch) => {\n  dispatch({\n    type: actions.SET_COMP_PROPERTIES,\n    payload: {\n      id: id,\n      compProperties: compProperties\n    }\n  })\n}\n\n// handleing hiding of component properties sidebar\nexport const closeCompProperties = () => (dispatch) => {\n  dispatch({\n    type: actions.CLOSE_COMP_PROPERTIES\n  })\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/actions/dashboardActions.js",
    "content": "import api from '../../utils/Api'\nimport * as actions from './actions'\n\n// Api call for listing user'ssaved schematic to display on dashboard\nexport const fetchSchematics = () => (dispatch, getState) => {\n  const token = getState().authReducer.token\n\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n\n  api.get('save/list', config)\n    .then(\n      (res) => {\n        console.log(res.data)\n\n        dispatch({\n          type: actions.FETCH_SCHEMATICS,\n          payload: res.data\n        })\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n// Api call for listing users projects to display on dashboard\nexport const fetchMyProjects = () => (dispatch, getState) => {\n  const token = getState().authReducer.token\n\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n\n  api.get('publish/myproject/', config)\n    .then(\n      (res) => {\n        console.log(res.data)\n        dispatch({\n          type: actions.FETCH_MY_PROJECTS,\n          payload: res.data\n        })\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n// Api call for listing other users projects to display on dashboard\nexport const fetchOtherProjects = () => (dispatch, getState) => {\n  const token = getState().authReducer.token\n\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n\n  api.get('workflow/otherprojects/', config)\n    .then(\n      (res) => {\n        dispatch({\n          type: actions.FETCH_OTHER_PROJECTS,\n          payload: res.data\n        })\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n// Api call for listing public projects to display on dashboard\nexport const fetchPublicProjects = () => (dispatch, getState) => {\n  const token = getState().authReducer.token\n\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n\n  api.get('publish/publishing/', config)\n    .then(\n      (res) => {\n        dispatch({\n          type: actions.FETCH_PUBLIC_PROJECTS,\n          payload: res.data\n        })\n        console.log(res.data[0].status)\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n\n// Api call for deleting saved schematic\nexport const deleteSchematic = (saveId) => (dispatch, getState) => {\n  const token = getState().authReducer.token\n  const config = {\n    headers: {\n      'Content-Type': 'application/x-www-form-urlencoded'\n    }\n  }\n\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n\n  api.delete('save/' + saveId, config)\n    .then(\n      (res) => {\n        if (res.status === 200 || res.status === 204) {\n          console.log('Called Delete')\n          dispatch(fetchSchematics())\n        }\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/actions/galleryActions.js",
    "content": "/* eslint-disable camelcase */\nimport * as actions from './actions'\nimport api from '../../utils/Api'\nimport { renderGalleryXML } from '../../components/SchematicEditor/Helper/ToolbarTools'\nimport { setTitle } from './index'\nimport { fetchLibrary, removeLibrary } from './schematicEditorActions'\nimport { setSchTitle, setSchDescription, setSchXmlData } from './saveSchematicActions'\n\n// Action for Loading Gallery schematics\nexport const fetchGallery = () => (dispatch, getState) => {\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  api.get('save/gallery', config)\n    .then((res) => {\n      console.log(res.data)\n      const data = res.data\n      dispatch({\n        type: actions.FETCH_GALLERY,\n        payload: data\n      })\n      dispatch(setTitle('* ' + data.name))\n      dispatch(setSchTitle(data.name))\n      dispatch(setSchDescription(data.description))\n      dispatch(setSchXmlData(data.data_dump))\n\n      renderGalleryXML(data.data_dump)\n      if (data.esim_libraries.length > 0) {\n        getState().schematicEditorReducer.libraries.forEach(e => dispatch(removeLibrary(e.id)))\n        data.esim_libraries.forEach(e => dispatch(fetchLibrary(e.id)))\n      }\n      dispatch({\n        type: actions.FETCH_GALLERY,\n        payload: res.data\n      })\n    })\n    .catch((err) => { console.error(err) })\n}\n\n// Api call to delete the schematic in gallery [role required: Staff]\nexport const deleteGallerySch = (Id) => (dispatch, getState) => {\n  const token = getState().authReducer.token\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/x-www-form-urlencoded'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n  console.log('deleting ', Id)\n  api\n    .delete('save/gallery/' + Id, config)\n    .then(\n      (res) => {\n        console.log('Called delete for: ', res)\n        dispatch(fetchGallery())\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/actions/index.js",
    "content": "// Actions dispatch to change state variables inside store\nexport * from './schematicEditorActions'\nexport * from './componentPropertiesActions'\nexport * from './netlistActions'\nexport * from './simulationActions'\nexport * from './authActions'\nexport * from './saveSchematicActions'\nexport * from './dashboardActions'\nexport * from './accountActions'\nexport * from './projectActions'\nexport * from './galleryActions'\n"
  },
  {
    "path": "eda-frontend/src/redux/actions/netlistActions.js",
    "content": "import * as actions from './actions'\n\n// Action to update netlist with component nodes and parameters\nexport const setNetlist = (netlist) => (dispatch) => {\n  dispatch({\n    type: actions.SET_NETLIST,\n    payload: {\n      netlist: netlist\n    }\n  })\n}\n\n// Action to update netlist title\nexport const setTitle = (title) => (dispatch) => {\n  dispatch({\n    type: actions.SET_TITLE,\n    payload: {\n      title: title\n    }\n  })\n}\n\n// Action to update netlist model section\nexport const setModel = (model) => (dispatch) => {\n  dispatch({\n    type: actions.SET_MODEL,\n    payload: {\n      model: model\n    }\n  })\n}\n\n// Action to update netlist contorl line section\nexport const setControlLine = (controlLine) => (dispatch) => {\n  dispatch({\n    type: actions.SET_CONTROL_LINE,\n    payload: {\n      controlLine: controlLine\n    }\n  })\n}\n\n// Action to update netlist control block section\nexport const setControlBlock = (controlBlock) => (dispatch) => {\n  dispatch({\n    type: actions.SET_CONTROL_BLOCK,\n    payload: {\n      controlBlock: controlBlock\n    }\n  })\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/actions/projectActions.js",
    "content": "/* eslint-disable camelcase */\nimport * as actions from './actions'\nimport api from '../../utils/Api'\n\nexport const createProject = (save_id, details) => (dispatch, getState) => {\n  // Get token from localstorage\n  const token = localStorage.getItem('esim_token')\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n  api.post(`/publish/project/${save_id}`, details, config)\n    .then(\n      (res) => {\n        dispatch({\n          type: actions.SET_CURRENT_PROJECT,\n          payload: res.data\n        })\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n\nexport const fetchProject = () => (dispatch, getState) => {\n  // Get token from localstorage\n  const token = getState().authReducer.token\n  const project_id = getState().saveSchematicReducer.details.project_id\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/x-www-form-urlencoded'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n  api.get('/publish/project/' + project_id, config)\n    .then(\n      (res) => {\n        dispatch({\n          type: actions.SET_CURRENT_PROJECT,\n          payload: res.data\n        })\n        if (res.data.is_reported) {\n          dispatch(fetchReports(project_id))\n        }\n      }\n    )\n    .catch((err) => {\n      if (err.response?.status === 401) {\n        dispatch({\n          type: actions.SET_CURRENT_PROJECT,\n          payload: '401'\n        })\n      }\n    })\n}\nexport const deleteProject = (project_id) => (dispatch, getState) => {\n  // Get token from localstorage\n  const token = getState().authReducer.token\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/x-www-form-urlencoded'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n  api.delete('/publish/project/' + project_id, config)\n    .then(\n      (res) => {\n        dispatch({\n          type: actions.DELETE_PROJECT\n        })\n      }\n    )\n    .catch((err) => {\n      console.log(err)\n    })\n}\nexport const fetchReports = (projectID) => (dispatch, getState) => {\n  // Get token from localstorage\n  const token = getState().authReducer.token\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/x-www-form-urlencoded'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n  api.get('workflow/report/' + projectID, config)\n    .then(\n      (res) => {\n        if (res.data.open !== [] && res.data.closed !== [] && res.data.approved !== []) {\n          dispatch({\n            type: actions.FETCH_REPORTS,\n            payload: res.data\n          })\n        }\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\nexport const resolveReports = (projectID, stateName) => (dispatch, getState) => {\n  // Get token from localstorage\n  const token = getState().authReducer.token\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n  api.post('workflow/report/resolve/' + projectID, { name: stateName }, config)\n    .then(\n      (res) => {\n        dispatch({\n          type: actions.RESOLVE_REPORTS\n        })\n        console.log(res.data)\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n\nexport const getStatus = (project_id) => (dispatch, getState) => {\n  const token = getState().authReducer.token\n  if (!project_id) {\n    project_id = getState().saveSchematicReducer.details.project_id\n  }\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n  api.get(`/workflow/state/${project_id}`, config)\n    .then((res) => {\n      console.log(res.data)\n      dispatch({\n        type: actions.GET_STATES,\n        payload: res.data\n      })\n    })\n    .catch(error => console.log(error))\n}\nexport const changeStatus = (project_id, status, notes) => (dispatch, getState) => {\n  // post the state\n  const token = localStorage.getItem('esim_token')\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n  api.post(`/workflow/state/${project_id}`,\n    {\n      name: status,\n      note: notes\n    }, config)\n    .then((res) => {\n      dispatch(fetchProject())\n      dispatch(getStatus())\n    })\n    .catch(error => console.log(error))\n}\nexport const reportProject = (reportDescription, project_id) => (dispatch, getState) => {\n  // Get token from localstorage\n  if (reportDescription) {\n    const token = getState().authReducer.token\n    // add headers\n    const config = {\n      headers: {\n        'Content-Type': 'application/json'\n      }\n    }\n    // If token available add to headers\n    if (token) {\n      config.headers.Authorization = `Token ${token}`\n    }\n    api.post(`workflow/report/create/${project_id}`, { description: reportDescription }, config)\n      .then(\n        (res) => {\n          dispatch(fetchProject(project_id))\n          dispatch(fetchReports(project_id))\n        }\n      )\n      .catch((err) => { console.error(err) })\n  }\n}\nexport const approveReports = (project_id, reports, status) => (dispatch, getState) => {\n  // Get token from localstorage\n  const token = getState().authReducer.token\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n  api.post(`workflow/report/approve/${project_id}`,\n    {\n      reports: reports,\n      state: { name: status }\n    }, config)\n    .then(\n      (res) => {\n        dispatch(fetchReports(project_id))\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/actions/saveSchematicActions.js",
    "content": "/* eslint-disable camelcase */\nimport * as actions from './actions'\nimport queryString from 'query-string'\nimport api from '../../utils/Api'\nimport { renderGalleryXML } from '../../components/SchematicEditor/Helper/ToolbarTools'\nimport { setTitle } from './index'\nimport { fetchLibrary, removeLibrary } from './schematicEditorActions'\nimport randomstring from 'randomstring'\nimport { fetchProject } from './projectActions'\nimport { v4 as uuidv4 } from 'uuid'\n\nexport const setSchTitle = (title) => (dispatch) => {\n  dispatch({\n    type: actions.SET_SCH_TITLE,\n    payload: {\n      title: title\n    }\n  })\n}\n\nexport const setSchDescription = (description) => (dispatch) => {\n  dispatch({\n    type: actions.SET_SCH_DESCRIPTION,\n    payload: {\n      description: description\n    }\n  })\n}\n\nexport const setSchXmlData = (xmlData) => (dispatch) => {\n  dispatch({\n    type: actions.SET_SCH_XML_DATA,\n    payload: {\n      xmlData: xmlData\n    }\n  })\n}\n\n// Api call to save new schematic or updating saved schematic.\nexport const saveSchematic = (title, description, xml, base64, newBranch = false, branchName = null, setVersions, ltiExists = false, versions, branchOpen, setBranchOpen, setSaveId = null) => (dispatch, getState) => {\n  var libraries = []\n  getState().schematicEditorReducer.libraries.forEach(e => { libraries.push(e.id) })\n  const project_id = getState().saveSchematicReducer.details.project_id\n  const body = {\n    data_dump: xml,\n    base64_image: base64,\n    name: title,\n    description: description,\n    esim_libraries: JSON.stringify([...libraries]),\n    project_id: project_id\n  }\n  // Get token from localstorage\n  const token = getState().authReducer.token\n  const schSave = getState().saveSchematicReducer\n  console.log(schSave)\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/x-www-form-urlencoded'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n  if (!newBranch) {\n    console.log('New Version not Branch')\n    body.version = randomstring.generate({\n      length: 20\n    })\n    if (schSave.isSaved && !ltiExists) {\n      //  Updating saved schemaic\n      body.save_id = schSave.details.save_id\n      body.branch = decodeURI(window.location.href.split('branch=')[1])\n      console.log(window.location.href.split('branch=')[1])\n      api\n        .post('save', queryString.stringify(body), config)\n        .then((res) => {\n          if (!res.data.duplicate) { setVersions(res.data.version, false, null) }\n          dispatch({\n            type: actions.SET_SCH_SAVED,\n            payload: res.data\n          })\n        })\n        .catch((err) => {\n          console.error(err)\n        })\n    } else {\n      body.branch = 'master'\n      // saving new schematic\n      api\n        .post('save', queryString.stringify(body), config)\n        .then((res) => {\n          setVersions(res.data.version, true, res.data.save_id)\n          dispatch({\n            type: actions.SET_SCH_SAVED,\n            payload: res.data\n          })\n        })\n        .catch((err) => {\n          console.error(err)\n        })\n    }\n  } else {\n    console.log('New Branch not Version')\n    let flag = 0\n    for (let i = 0; i < versions.length; i++) {\n      if (branchName === versions[i][0]) { flag = 1 }\n    }\n    if (!flag) {\n      body.save_id = schSave.details.save_id\n      body.branch = branchName\n      body.version = schSave.details.version\n      api\n        .post('save', queryString.stringify(body), config)\n        .then((res) => {\n          const temp = versions\n          const tempBranch = branchOpen\n          const d = new Date(res.data.save_time)\n          res.data.date = d.getDate() + '/' + parseInt(d.getMonth() + 1) + '/' + d.getFullYear()\n          res.data.time = d.getHours() + ':' + d.getMinutes()\n          if (d.getMinutes() < 10) {\n            res.data.time = d.getHours() + ':0' + d.getMinutes()\n          }\n          temp.unshift([res.data.branch, [res.data]])\n          tempBranch.unshift(false)\n          setBranchOpen(tempBranch)\n          setVersions(temp)\n          dispatch({\n            type: actions.SET_SCH_SAVED,\n            payload: res.data\n          })\n        })\n        .catch((err) => {\n          console.error(err)\n        })\n    }\n  }\n}\n\n// Api call to save the current schematic to gallery [role required: Staff]\nexport const saveToGallery = (title, description, xml, base64) => (dispatch, getState) => {\n  const token = getState().authReducer.token\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/x-www-form-urlencoded'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n  console.log(token)\n  console.log(config)\n\n  const libraries = []\n  getState().schematicEditorReducer.libraries.forEach(e => { libraries.push(e.id) })\n  const body = {\n    data_dump: xml,\n    media: base64,\n    name: title,\n    description: description,\n    esim_libraries: JSON.stringify([...libraries]),\n    save_id: 'gallery' + uuidv4()\n  }\n  console.log('successfully saved to gallery')\n  console.log(body)\n\n  api\n    .post('save/gallery/' + body.save_id, queryString.stringify(body), config)\n    .then(\n      (res) => {\n        console.log(res)\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n\n// Action for Loading on-cloud saved schematics\nexport const fetchSchematic = (saveId, version, branch) => (dispatch, getState) => {\n  // Get token from localstorage\n  const token = getState().authReducer.token\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/x-www-form-urlencoded'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n\n  // console.log('Already Saved')\n  api.get('save/' + saveId + '/' + version + '/' + branch, config)\n    .then(\n      (res) => {\n        dispatch({\n          type: actions.SET_SCH_SAVED,\n          payload: res.data\n        })\n        dispatch(setSchTitle(res.data.name))\n        dispatch(setSchDescription(res.data.description))\n        dispatch(setSchXmlData(res.data.data_dump))\n        if (res.data.project_id !== undefined) {\n          dispatch(fetchProject())\n        }\n        renderGalleryXML(res.data.data_dump)\n        if (res.data.esim_libraries.length > 0) {\n          getState().schematicEditorReducer.libraries.forEach(e => dispatch(removeLibrary(e.id)))\n          res.data.esim_libraries.forEach(e => dispatch(fetchLibrary(e.id)))\n        }\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n\n// Action for Loading Gallery schematics\nexport const fetchGallerySchematic = (Id) => (dispatch, getState) => {\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  api.get('save/gallery/' + Id, config)\n    .then((res) => {\n      console.log(res.data)\n      const data = res.data\n      dispatch(setTitle('* ' + data.name))\n      dispatch(setSchTitle(data.name))\n      dispatch(setSchDescription(data.description))\n      dispatch(setSchXmlData(data.data_dump))\n\n      renderGalleryXML(data.data_dump)\n      if (data.esim_libraries.length > 0) {\n        getState().schematicEditorReducer.libraries.forEach(e => dispatch(removeLibrary(e.id)))\n        data.esim_libraries.forEach(e => dispatch(fetchLibrary(e.id)))\n      }\n    })\n    .catch((err) => { console.error(err) })\n}\n\nexport const setSchShared = (share) => (dispatch, getState) => {\n  // Get token from localstorage\n  const token = getState().authReducer.token\n  const schSave = getState().saveSchematicReducer\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n\n  let isShared\n  if (share === true) {\n    isShared = 'on'\n  } else {\n    isShared = 'off'\n  }\n\n  api\n    .post(\n      'save/' + schSave.details.save_id + '/sharing/' + isShared + '/' + schSave.details.version + '/' + schSave.details.branch,\n      {},\n      config\n    )\n    .then((res) => {\n      dispatch({\n        type: actions.SET_SCH_SHARED,\n        payload: res.data\n      })\n    })\n    .catch((err) => {\n      console.error(err)\n    })\n}\n\n// Action for Loading local exported schematics\nexport const openLocalSch = (obj) => (dispatch, getState) => {\n  const data = obj\n\n  dispatch({ type: actions.CLEAR_DETAILS })\n  dispatch(setTitle('* ' + data.title))\n  dispatch(setSchTitle(data.title))\n  dispatch(setSchDescription(data.description))\n  dispatch(setSchXmlData(data.data_dump))\n  renderGalleryXML(data.data_dump)\n}\n\n// Action for making a copy of a schematic\nexport const makeCopy = (saveID, version, branch) => (dispatch, getState) => {\n  const token = getState().authReducer.token\n\n  // add headers\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n  // If token available add to headers\n  if (token) {\n    config.headers.Authorization = `Token ${token}`\n  }\n  api.post(`/save/copy/${version}/${saveID}/${branch}`, {}, config)\n    .then(res => {\n      const win = window.open()\n      win.location.href = '/eda/#/editor?id=' + res.data.save_id + '&version=' + res.data.version + '&branch=' + res.data.branch\n      win.focus()\n    })\n    .catch(error => console.log(error))\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/actions/schematicEditorActions.js",
    "content": "import api from '../../utils/Api'\nimport * as actions from './actions'\nimport store from '../store'\n\n// Api call for fetching component library list\nexport const fetchLibraries = () => (dispatch, getState) => {\n// SAMPLE Response from API\n// [\n  //  {\n  //   \"id\": 1\n  //   \"library_name\": \"Analog.lib\",\n  //   \"saved_on\": \"2020-05-19T14:06:02.351977Z\"\n  // },\n// ] -- Multiple objects in array\n  const token = store.getState().authReducer.token\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n  if (token) { config.headers.Authorization = `Token ${token}` }\n\n  api.get('libraries/default', config).then((res) => {\n    dispatch({\n      type: actions.FETCH_LIBRARIES,\n      payload: res.data\n    })\n  })\n    .catch((err) => { console.error(err) })\n}\n\nexport const fetchAllLibraries = () => (dispatch) => {\n  // SAMPLE Response from API\n  // [\n  //  {\n  //   \"id\": 1\n  //   \"library_name\": \"Analog.lib\",\n  //   \"saved_on\": \"2020-05-19T14:06:02.351977Z\"\n  // },\n  // ] -- Multiple objects in array\n  const token = store.getState().authReducer.token\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n  if (token) { config.headers.Authorization = `Token ${token}` }\n\n  api.get('libraries/', config).then((res) => {\n    dispatch({\n      type: actions.FETCH_ALL_LIBRARIES,\n      payload: res.data\n    })\n  })\n    .catch((err) => { console.error(err) })\n}\n\nexport const fetchCustomLibraries = () => (dispatch) => {\n  // SAMPLE Response from API\n  // [\n  //  {\n  //   \"id\": 1\n  //   \"library_name\": \"Analog.lib\",\n  //   \"saved_on\": \"2020-05-19T14:06:02.351977Z\"\n  // },\n  // ] -- Multiple objects in array\n  const token = store.getState().authReducer.token\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n  if (token) { config.headers.Authorization = `Token ${token}` }\n\n  api.get('libraries/get_custom_libraries', config).then((res) => {\n    if (res.data.length > 0) {\n      dispatch({\n        type: actions.FETCH_CUSTOM_LIBRARIES,\n        payload: res.data\n      })\n    }\n  })\n    .catch((err) => { console.error(err) })\n}\n\nexport const fetchLibrary = (libraryId) => (dispatch) => {\n  // SAMPLE Response from API\n  // {\n  //   \"library_name\": \"Motor.lib\",\n  //   \"saved_on\": \"2021-05-10T20:29:01.794498Z\",\n  //   \"id\": 363\n  // } -- Single Object\n  const token = store.getState().authReducer.token\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n  if (token) { config.headers.Authorization = `Token ${token}` }\n\n  api.get(`libraries/${libraryId}`, config).then(res => {\n    dispatch({\n      type: actions.FETCH_LIBRARY,\n      payload: res.data\n    })\n  })\n}\n\nexport const removeLibrary = (libraryId) => (dispatch) => {\n  dispatch({\n    type: actions.REMOVE_LIBRARY,\n    payload: libraryId\n  })\n}\n\nexport const deleteLibrary = (libraryId) => (dispatch) => {\n  const token = store.getState().authReducer.token\n  const config = {\n    headers: {\n      Authorization: `Token ${token}`\n    }\n  }\n  api.delete(`libraries/${libraryId}/`, config).then(\n    dispatch({\n      type: actions.DELETE_LIBRARY,\n      payload: libraryId\n    })\n  ).catch(err => {\n    console.log(err)\n  })\n}\n\n// API call to save uploaded libraries\nexport const uploadLibrary = (formData) => (dispatch) => {\n  const token = store.getState().authReducer.token\n  const config = {\n    headers: {\n      Authorization: `Token ${token}`\n    }\n  }\n  api.post('/library-sets/', formData, config).then(res => {\n    dispatch({\n      type: actions.UPLOAD_LIBRARIES,\n      payload: res.status\n    })\n  })\n    .catch(err => {\n      console.log(err)\n      console.log(err.response.status)\n      dispatch({\n        type: actions.UPLOAD_LIBRARIES,\n        payload: err.response.status\n      })\n    })\n}\n\nexport const resetUploadSuccess = () => (dispatch) => {\n  dispatch({\n    type: actions.RESET_UPLOAD_SUCCESS\n  })\n}\n\n// Api call for fetching components under specified library id\nexport const fetchComponents = (libraryId) => (dispatch) => {\n// SAMPLE Response from API\n//   [\n  // {\n  //   \"id\": 14221,\n  //   \"name\": \"BAT54ADW\",\n  //   \"svg_path\": \"kicad-symbols/symbol_svgs/Diode/D-BAT54ADW-1-A.svg\",\n  //   \"thumbnail_path\": \"kicad-symbols/symbol_svgs/Diode/D-BAT54ADW-1-A_thumbnail.svg\",\n  //   \"symbol_prefix\": \"D\",\n  //   \"component_library\": \"http://localhost/api/libraries/193/\",\n  //   \"description\": \"Schottky diode array 2 pair Com A\",\n  //   \"data_link\": \"http://www.diodes.com/datasheets/ds30152.pdf\",\n  //   \"full_name\": \"D-BAT54ADW-1-A\",\n  //   \"keyword\": \"diode\",\n  //   \"alternate_component\": [\n  //     {\n  //       \"dmg\": 1,\n  //       \"part\": \"C\",\n  //       \"full_name\": \"D-BAT54ADW-1-C\",\n  //       \"svg_path\": \"kicad-symbols/symbol_svgs/Diode/D-BAT54ADW-1-C.svg\",\n  //       \"id\": 2326\n  //     },\n  //     {\n  //       \"dmg\": 1,\n  //       \"part\": \"B\",\n  //       \"full_name\": \"D-BAT54ADW-1-B\",\n  //       \"svg_path\": \"kicad-symbols/symbol_svgs/Diode/D-BAT54ADW-1-B.svg\",\n  //       \"id\": 2327\n  //     },\n  //   ]\n  // },\n// ] -- Multiple objects in array\n  const token = store.getState().authReducer.token\n  const config = {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }\n  if (token) { config.headers.Authorization = `Token ${token}` }\n  const url = 'components/?component_library=' + parseInt(libraryId)\n  api.get(url, config)\n    .then(\n      (res) => {\n        dispatch({\n          type: actions.FETCH_COMPONENTS,\n          payload: { components: res.data, id: libraryId }\n        })\n      }\n    )\n    .catch((err) => { console.error(err) })\n}\n\n// Action to keep only one component list dropdown open at a time\nexport const toggleCollapse = (id) => (dispatch) => {\n  dispatch({\n    type: actions.TOGGLE_COLLAPSE,\n    payload: { id: id }\n  })\n}\n\n// Action to hide components list to display simulation parameters\nexport const toggleSimulate = () => (dispatch) => {\n  dispatch({\n    type: actions.TOGGLE_SIMULATE\n  })\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/actions/simulationActions.js",
    "content": "import * as actions from './actions'\n\n// Actions to update title for simulation result screen\nexport const setResultTitle = (title) => (dispatch) => {\n  dispatch({\n    type: actions.SET_RESULT_TITLE,\n    payload: {\n      title: title\n    }\n  })\n}\n\n// Action to update store with graphical result points\nexport const setResultGraph = (graph) => (dispatch) => {\n  dispatch({\n    type: actions.SET_RESULT_GRAPH,\n    payload: {\n      graph: graph\n    }\n  })\n}\n\n// Action to update store with simulation result text\nexport const setResultText = (text) => (dispatch) => {\n  dispatch({\n    type: actions.SET_RESULT_TEXT,\n    payload: {\n      text: text\n    }\n  })\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/reducers/accountReducer.js",
    "content": "import * as actions from '../actions/actions'\n\nconst initialState = {\n  changePasswordSuccess: false,\n  changePasswordError: ''\n}\n\nexport default function (state = initialState, action) {\n  switch (action.type) {\n    case actions.CHANGE_PASSWORD_SUCCESS: {\n      return {\n        ...state,\n        changePasswordSuccess: true,\n        changePasswordError: action.payload.data\n      }\n    }\n\n    case actions.CHANGE_PASSWORD_FAILED: {\n      return {\n        ...state,\n        changePasswordSuccess: false,\n        changePasswordError: action.payload.data\n      }\n    }\n\n    default:\n      return state\n  }\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/reducers/authReducer.js",
    "content": "import * as actions from '../actions/actions'\n\nconst initialState = {\n  token: localStorage.getItem('esim_token'),\n  isAuthenticated: null,\n  isRegistered: null,\n  isLoading: false,\n  user: null,\n  roles: null,\n  errors: '',\n  regErrors: '',\n  resetPasswordSuccess: false,\n  resetPasswordError: '',\n  resetPasswordConfirmSuccess: false\n}\n\nexport default function (state = initialState, action) {\n  switch (action.type) {\n    case actions.USER_LOADING: {\n      return {\n        ...state,\n        isLoading: true\n      }\n    }\n    case actions.DEFAULT_STORE: {\n      return {\n        ...initialState,\n        errors: '',\n        regErrors: ''\n      }\n    }\n    case actions.SIGNUP_SUCCESSFUL: {\n      return {\n        ...state,\n        isRegistered: true,\n        regErrors: action.payload.data\n      }\n    }\n\n    case actions.SIGNUP_FAILED: {\n      return {\n        ...state,\n        isRegistered: false,\n        regErrors: action.payload.data\n      }\n    }\n\n    case actions.USER_LOADED: {\n      return {\n        ...state,\n        isAuthenticated: true,\n        isLoading: false,\n        user: action.payload.user\n      }\n    }\n\n    case actions.LOGIN_SUCCESSFUL: {\n      localStorage.setItem('user_id', action.payload.data.user_id)\n      localStorage.setItem('esim_token', action.payload.data.auth_token)\n      return {\n        ...state,\n        token: action.payload.data.auth_token,\n        // ...action.payload.data,\n        // isAuthenticated: true,\n        // isLoading: false,\n        errors: ''\n      }\n    }\n\n    case actions.LOADING_FAILED: {\n      return {\n        ...state,\n        isLoading: false\n      }\n    }\n\n    case actions.AUTHENTICATION_ERROR:\n    case actions.LOGIN_FAILED:\n    case actions.LOGOUT_SUCCESSFUL: {\n      localStorage.removeItem('esim_token')\n      return {\n        ...state,\n        errors: action.payload.data,\n        token: null,\n        user: null,\n        isAuthenticated: false,\n        isLoading: false\n      }\n    }\n\n    case actions.RESET_PASSWORD_SUCCESSFUL: {\n      return {\n        ...state,\n        resetPasswordSuccess: true,\n        resetPasswordError: action.payload.data\n      }\n    }\n\n    case actions.RESET_PASSWORD_FAILED: {\n      return {\n        ...state,\n        resetPasswordSuccess: false,\n        resetPasswordError: action.payload.data\n      }\n    }\n\n    case actions.RESET_PASSWORD_CONFIRM_SUCCESSFUL: {\n      return {\n        ...state,\n        resetPasswordConfirmSuccess: true,\n        resetPasswordError: action.payload.data\n      }\n    }\n\n    case actions.RESET_PASSWORD_CONFIRM_FAILED: {\n      return {\n        ...state,\n        resetPasswordConfirmSuccess: false,\n        resetPasswordError: action.payload.data\n      }\n    }\n\n    case actions.ROLE_LOADED: {\n      return {\n        ...state,\n        roles: action.payload.data\n      }\n    }\n    default:\n      return state\n  }\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/reducers/componentPropertiesReducer.js",
    "content": "import * as actions from '../actions/actions'\nimport { ZoomAct } from '../../components/SchematicEditor/Helper/ToolbarTools.js'\n\nconst InitialState = {\n  id: '',\n  isPropertiesWindowOpen: false,\n  compProperties: {},\n  x: 0,\n  y: 0\n}\n\nexport default function (state = InitialState, action) {\n  switch (action.type) {\n    case actions.GET_COMP_PROPERTIES: {\n      return {\n        ...state,\n        id: action.payload.id,\n        isPropertiesWindowOpen: true,\n        compProperties: action.payload.compProperties,\n        x: action.payload.x,\n        y: action.payload.y\n      }\n    }\n\n    case actions.SET_COMP_PROPERTIES: {\n      return {\n        ...state,\n        id: action.payload.id,\n        isPropertiesWindowOpen: false,\n        compProperties: action.payload.compProperties\n      }\n    }\n\n    case actions.CLOSE_COMP_PROPERTIES: {\n      ZoomAct()\n      return {\n        ...state,\n        isPropertiesWindowOpen: false\n      }\n    }\n\n    case actions.CLOSE_COMP_PROPERTIES_TEMP: {\n      return {\n        ...state,\n        isPropertiesWindowOpen: false\n      }\n    }\n\n    default:\n      return state\n  }\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/reducers/dashboardReducer.js",
    "content": "import * as actions from '../actions/actions'\n\nconst InitialState = {\n  schematics: [],\n  myProjects: [],\n  publicProjects: [],\n  otherProjects: []\n}\n\nexport default function (state = InitialState, action) {\n  switch (action.type) {\n    case actions.FETCH_SCHEMATICS: {\n      return {\n        ...state,\n        schematics: action.payload\n      }\n    }\n    case actions.FETCH_MY_PROJECTS: {\n      return {\n        ...state,\n        myProjects: action.payload\n      }\n    }\n    case actions.FETCH_PUBLIC_PROJECTS: {\n      return {\n        ...state,\n        publicProjects: action.payload\n      }\n    }\n    case actions.FETCH_OTHER_PROJECTS: {\n      return {\n        ...state,\n        otherProjects: action.payload\n      }\n    }\n\n    default:\n      return state\n  }\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/reducers/galleryReducer.js",
    "content": "import * as actions from '../actions/actions'\n\nconst InitialState = {\n  schematics: []\n}\n\nexport default function (state = InitialState, action) {\n  switch (action.type) {\n    case actions.FETCH_GALLERY: {\n      return {\n        ...state,\n        schematics: action.payload\n      }\n    }\n    default:\n      return state\n  }\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/reducers/index.js",
    "content": "import { combineReducers } from 'redux'\nimport schematicEditorReducer from './schematicEditorReducer'\nimport componentPropertiesReducer from './componentPropertiesReducer'\nimport netlistReducer from './netlistReducer'\nimport simulationReducer from './simulationReducer'\nimport authReducer from './authReducer'\nimport saveSchematicReducer from './saveSchematicReducer'\nimport dashboardReducer from './dashboardReducer'\nimport accountReducer from './accountReducer'\nimport projectReducer from './projectReducer'\nimport galleryReducer from './galleryReducer'\nexport default combineReducers({\n  schematicEditorReducer,\n  componentPropertiesReducer,\n  netlistReducer,\n  simulationReducer,\n  authReducer,\n  saveSchematicReducer,\n  dashboardReducer,\n  accountReducer,\n  projectReducer,\n  galleryReducer\n})\n"
  },
  {
    "path": "eda-frontend/src/redux/reducers/netlistReducer.js",
    "content": "import * as actions from '../actions/actions'\n\nconst initialState = {\n  title: '* Untitled_Schematic',\n  model: '',\n  netlist: '',\n  controlLine: '',\n  controlBlock: ''\n}\n\nexport default function (state = initialState, action) {\n  switch (action.type) {\n    case actions.SET_NETLIST: {\n      return {\n        ...state,\n        netlist: action.payload.netlist\n      }\n    }\n    case actions.SET_TITLE: {\n      return {\n        ...state,\n        title: action.payload.title\n      }\n    }\n\n    case actions.SET_MODEL: {\n      return {\n        ...state,\n        model: action.payload.model\n      }\n    }\n    case actions.SET_CONTROL_LINE: {\n      return {\n        ...state,\n        controlLine: action.payload.controlLine\n      }\n    }\n    case actions.SET_CONTROL_BLOCK: {\n      return {\n        ...state,\n        controlBlock: action.payload.controlBlock\n      }\n    }\n    default:\n      return state\n  }\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/reducers/projectReducer.js",
    "content": "import * as actions from '../actions/actions'\n\nconst initialState =\n{\n  details: null,\n  reports: null,\n  states: null\n}\n\nexport default function (state = initialState, action) {\n  switch (action.type) {\n    case actions.SET_CURRENT_PROJECT: {\n      return {\n        ...state,\n        details: action.payload\n      }\n    }\n    case actions.DELETE_PROJECT: {\n      return {\n        reports: null,\n        details: null,\n        states: null\n      }\n    }\n    case actions.FETCH_REPORTS: {\n      return {\n        ...state,\n        reports: action.payload\n      }\n    }\n    case actions.RESOLVE_REPORTS: {\n      return {\n        ...state,\n        reports: null\n      }\n    }\n\n    case actions.GET_STATES: {\n      return {\n        ...state,\n        states: action.payload\n      }\n    }\n    case actions.SET_STATE: {\n      return {\n        ...state\n      }\n    }\n    default:\n      return state\n  }\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/reducers/saveSchematicReducer.js",
    "content": "import * as actions from '../actions/actions'\n\nconst initialState = {\n  title: 'Untitled_Schematic',\n  description: '',\n  xmlData: null,\n  details: {},\n  isSaved: null,\n  isShared: null\n}\n\nexport default function (state = initialState, action) {\n  switch (action.type) {\n    case actions.SET_SCH_SAVED: {\n      return {\n        ...state,\n        isSaved: true,\n        isShared: action.payload.shared,\n        details: action.payload\n      }\n    }\n\n    case actions.SET_SCH_SHARED: {\n      return {\n        ...state,\n        isShared: true,\n        details: action.payload\n      }\n    }\n    case actions.CLEAR_DETAILS: {\n      return {\n        ...state,\n        isSaved: null,\n        isShared: null,\n        details: {}\n      }\n    }\n\n    case actions.SET_SCH_TITLE: {\n      return {\n        ...state,\n        title: action.payload.title\n      }\n    }\n\n    case actions.SET_SCH_DESCRIPTION: {\n      return {\n        ...state,\n        description: action.payload.description\n      }\n    }\n\n    case actions.SET_SCH_XML_DATA: {\n      return {\n        ...state,\n        xmlData: action.payload.xmlData\n      }\n    }\n\n    default:\n      return state\n  }\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/reducers/schematicEditorReducer.js",
    "content": "import * as actions from '../actions/actions'\n\nconst InitialState = {\n  isSimulate: false,\n  libraries: [],\n  collapse: {},\n  components: {}\n}\n\nexport default function (state = InitialState, action) {\n  switch (action.type) {\n    case actions.FETCH_LIBRARIES: {\n      // Add 'open' parameter to track open/close state of collapse\n      const collapse = {}\n      const components = {}\n      action.payload.forEach(element => {\n        collapse[element.id] = false\n        components[element.id] = []\n      })\n      return { ...state, libraries: action.payload, collapse: collapse, components: components }\n    }\n\n    case actions.TOGGLE_COLLAPSE: {\n      const existingState = state.collapse[action.payload.id]\n      const newCollapse = Object.keys(state.collapse).reduce(function (accObj, parseObj) {\n        accObj[parseObj] = false\n        return accObj\n      }, {})\n      newCollapse[action.payload.id] = !existingState\n      Object.assign(state.collapse, newCollapse)\n      return { ...state, collapse: { ...state.collapse, newCollapse } }\n    }\n\n    case actions.FETCH_COMPONENTS: {\n      const newComponents = state.components\n      newComponents[action.payload.id] = action.payload.components\n      // console.log('Fetched and added ', newComponents[action.payload.id].length, 'Components')\n      Object.assign(state.components, newComponents)\n      return { ...state, components: { ...state.components, newComponents } }\n    }\n\n    case actions.TOGGLE_SIMULATE: {\n      return { ...state, isSimulate: !state.isSimulate }\n    }\n\n    case actions.FETCH_ALL_LIBRARIES: {\n      const components = { ...state.components }\n      var allLibraries = action.payload\n      allLibraries.forEach(e => {\n        if (!components[e.id]) { components[e.id] = [] }\n      })\n      return { ...state, allLibraries: allLibraries, components: components }\n    }\n\n    case actions.FETCH_CUSTOM_LIBRARIES: {\n      const allComponents = {}\n      action.payload.forEach(e => {\n        allComponents[e.id] = []\n      })\n      return { ...state, customLibraries: action.payload }\n    }\n\n    case actions.FETCH_LIBRARY: {\n      const components = { ...state.components }\n      components[action.payload.id] = []\n      const collapse = { ...state.collapse }\n      const libraries = [...state.libraries]\n      const newLib = action.payload\n      collapse[newLib.id] = false\n      if (!libraries.some(e => e.id === newLib.id)) { libraries.push(newLib) }\n      return { ...state, libraries: libraries, components: components, collapse: collapse }\n    }\n\n    case actions.REMOVE_LIBRARY: {\n      var libraries = [...state.libraries]\n      const filterFunc = (element) => {\n        return element.id !== action.payload\n      }\n      libraries = libraries.filter(filterFunc)\n      return { ...state, libraries: libraries }\n    }\n\n    case actions.DELETE_LIBRARY: {\n      const filterFunc = (element) => {\n        return element.id !== action.payload\n      }\n      var newLibraries = [...state.libraries]\n      newLibraries = newLibraries.filter(filterFunc)\n      const allComponents = { ...state.components }\n      const allLibraries = [...state.allLibraries].filter(filterFunc)\n      delete allComponents[action.payload]\n      return { ...state, libraries: newLibraries, allLibraries: allLibraries, components: allComponents }\n    }\n\n    case actions.UPLOAD_LIBRARIES: {\n      if (action.payload === 201) {\n        return { ...state, uploadSuccess: true }\n      } else { return { ...state, uploadSuccess: false } }\n    }\n\n    case actions.RESET_UPLOAD_SUCCESS: {\n      return { ...state, uploadSuccess: null }\n    }\n\n    default:\n      return state\n  }\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/reducers/simulationReducer.js",
    "content": "import * as actions from '../actions/actions'\n\nconst initialState = {\n  title: '',\n  isGraph: 'false',\n  text: [],\n  graph: {},\n  isSimRes: false\n}\n\nexport default function (state = initialState, action) {\n  switch (action.type) {\n    case actions.SET_RESULT_TITLE: {\n      return {\n        ...state,\n        title: action.payload.title\n      }\n    }\n    case actions.SET_RESULT_GRAPH: {\n      return {\n        ...state,\n        isSimRes: true,\n        isGraph: 'true',\n        graph: action.payload.graph\n      }\n    }\n\n    case actions.SET_RESULT_TEXT: {\n      return {\n        ...state,\n        isSimRes: true,\n        isGraph: 'false',\n        text: action.payload.text\n      }\n    }\n\n    default:\n      return state\n  }\n}\n"
  },
  {
    "path": "eda-frontend/src/redux/store.js",
    "content": "// Initialize Redux store which holds the whole state tree of application.\nimport reducer from './reducers/index'\nimport { createStore, applyMiddleware } from 'redux'\nimport reduxThunk from 'redux-thunk'\nconst createStoreWithMiddleware = applyMiddleware(reduxThunk)(createStore)\nconst store = createStoreWithMiddleware(\n  reducer,\n  window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()\n)\n\nexport default store\n"
  },
  {
    "path": "eda-frontend/src/serviceWorker.js",
    "content": "// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.0/8 are considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n)\n\nexport function register (config) {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href)\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config)\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          // console.log(\n          //   'This web app is being served cache-first by a service ' +\n          //     'worker. To learn more, visit https://bit.ly/CRA-PWA'\n          // )\n        })\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config)\n      }\n    })\n  }\n}\n\nfunction registerValidSW (swUrl, config) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then(registration => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing\n        if (installingWorker == null) {\n          return\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n              // console.log(\n              //   'New content is available and will be used when all ' +\n              //     'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n              // )\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration)\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              // console.log('Content is cached for offline use.')\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration)\n              }\n            }\n          }\n        }\n      }\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error)\n    })\n}\n\nfunction checkValidServiceWorker (swUrl, config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: { 'Service-Worker': 'script' }\n  })\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get('content-type')\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf('javascript') === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            window.location.reload()\n          })\n        })\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config)\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      )\n    })\n}\n\nexport function unregister () {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready\n      .then(registration => {\n        registration.unregister()\n      })\n      .catch(error => {\n        console.error(error.message)\n      })\n  }\n}\n"
  },
  {
    "path": "eda-frontend/src/setupTests.js",
    "content": "// jest-dom adds custom jest matchers for asserting on DOM nodes.\n// allows you to do things like:\n// expect(element).toHaveTextContent(/react/i)\n// learn more: https://github.com/testing-library/jest-dom\nimport '@testing-library/jest-dom/extend-expect'\n"
  },
  {
    "path": "eda-frontend/src/theme.js",
    "content": "import { red } from '@material-ui/core/colors'\nimport { createMuiTheme } from '@material-ui/core/styles'\n\n// A custom Material UI theme for this application\nconst theme = createMuiTheme({\n  palette: {\n    primary: {\n      main: '#556cd6'\n    },\n    secondary: {\n      main: '#19857b'\n    },\n    error: {\n      main: red.A400\n    },\n    background: {\n      default: '#fff'\n    }\n  }\n})\n\nexport default theme\n"
  },
  {
    "path": "eda-frontend/src/utils/Api.js",
    "content": "// Creating a new instance of axios for custom API config.\nimport axios from 'axios'\n\nexport default axios.create({\n  baseURL: '/api/',\n  responseType: 'json'\n})\n"
  },
  {
    "path": "esim-cloud-backend/.gitignore",
    "content": "*.sqlite3\n__pycache__\nvenv/\nstatic/\nsymbols/*\n.DS_Store\nsymbol_svgs\nkicad-symbols/*"
  },
  {
    "path": "esim-cloud-backend/Dockerfile",
    "content": "FROM python:3.7-alpine\n\nENV PYTHONUNBUFFERED 1\nENV PYTHONDONTWRITEBYTECODE 1\n\nRUN mkdir /code\nWORKDIR /code\n\nENV NGSPICE_VERSION 31\n\nRUN apk add --no-cache --virtual .build-deps \\\n    autoconf \\\n    automake \\\n    bison \\\n    curl \\\n    flex \\\n    g++ \\\n    libx11-dev \\\n    libxaw-dev \\\n    libtool \\\n    make\n\nRUN curl -fSL https://github.com/imr/ngspice/archive/ngspice-$NGSPICE_VERSION.tar.gz -o ngspice.tar.gz \\\n    && mkdir -p /usr/src \\\n    && tar -zxC /usr/src -f ngspice.tar.gz \\\n    && rm ngspice.tar.gz \\\n    && cd /usr/src/ngspice-ngspice-$NGSPICE_VERSION \\\n    && ./autogen.sh \\\n    && ./configure \\\n    && make \\\n    && make install \\\n    && apk del .build-deps\n\n# Arduino Cli and Compiling tools\nRUN apk add \\\n        wget \\\n        tar \\\n        ca-certificates \\\n        gcc-avr \\\n        binutils \\\n        avr-libc \\\n        ctags\n\nENV USER=root\n\nRUN wget -O /tmp/cli.tar.gz \\\n        https://downloads.arduino.cc/arduino-cli/arduino-cli_0.10.0_Linux_64bit.tar.gz && \\\n    cd /tmp && \\\n    mkdir arduino && \\\n    tar -xvf /tmp/cli.tar.gz && \\\n    mv /tmp/arduino-cli /usr/bin/arduino-cli && \\\n    rm /tmp/cli.tar.gz\n\nRUN arduino-cli core update-index \\\n\t&& arduino-cli core install arduino:avr \\\n    && arduino-cli lib install Servo \\\n    && arduino-cli lib install Stepper \\\n    && arduino-cli lib install LiquidCrystal \\\n    && cd /root/.arduino15/ \\\n    && find / -name platform.txt -exec sed -i \"s/^compiler.path=.*$/compiler.path=/g\" {} \\; \\\n    && find . -name ctags -exec ln -nsf /usr/bin/ctags {} \\;\n\n\nRUN apk add --no-cache libxt jpeg-dev zlib-dev libxaw-dev libx11-dev libtool mariadb-connector-c-dev libffi-dev postgresql-dev\n\nCOPY requirements.txt /code/\nRUN apk add --no-cache mariadb-connector-c-dev ;\\\n    apk add --update alpine-sdk && \\\n    apk add libffi-dev openssl-dev && \\\n    apk --no-cache --update add build-base ;\\\n    apk add --no-cache --virtual .build-deps gcc python3-dev musl-dev mariadb-dev\\\n    && pip install --upgrade pip\\\n    && pip install --trusted-host pypi.python.org -r requirements.txt \\\n    && apk del .build-deps\n"
  },
  {
    "path": "esim-cloud-backend/README.md",
    "content": "# eSim-Cloud Backend Documentation\n\n\n\n### Configurable Environment Variables for docker container\nEnvironment variables can be found in the .env file, detailed description for each environment variable is provided in readthedocs documentation\n\n### Custom Management Commands:\n* ```python manage.py seed_libs --location kicad-symbols``` can be used to convert ```.lib``` files to SVGs and seed their details to the database for libAPI endpoints.\n* ```python manage.py seed_libs --clear ``` can be used to delete all existing libraries and components.\n\n\n### Database Migrations:\n* ``` migrations.sh ``` can be used to apply all necessary database migrations automatially\n* If manually running the django backend, please ensure to apply migrations to specific databases\n* ```python manage.py migrate libAPI --database=\"mongodb\"```\n* ```python manage.py migrate simulationAPI --database=\"mongodb\"```\n"
  },
  {
    "path": "esim-cloud-backend/arduinoAPI/__init__.py",
    "content": ""
  },
  {
    "path": "esim-cloud-backend/arduinoAPI/admin.py",
    "content": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "esim-cloud-backend/arduinoAPI/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass ArduinoapiConfig(AppConfig):\n    name = 'arduinoAPI'\n"
  },
  {
    "path": "esim-cloud-backend/arduinoAPI/models.py",
    "content": "from django.db import models\n"
  },
  {
    "path": "esim-cloud-backend/arduinoAPI/tasks.py",
    "content": "import os\nimport shutil\nfrom pathlib import Path\nimport time\nimport subprocess\nimport traceback\nfrom django.conf import settings\nfrom celery import shared_task, current_task\nfrom celery import states\nimport json\nimport logging\nimport re\nimport uuid\n\nlogger = logging.getLogger(__name__)\nPATTERN = r'^[ \\t]*\\w+\\d*[ \\t]+\\w+\\d*\\(([ \\t]*\\w+\\d*[ \\t]+\\w+\\d*[ \\t]*\\,?)*\\)[ \\t]*\\n?\\{'  # noqa\n\n\ndef saveFiles(data, langIndex):\n    # try:\n    filenames = []\n    if not os.path.exists(settings.MEDIA_ROOT):\n        Path(settings.MEDIA_ROOT).mkdir(parents=True, exist_ok=True)\n    for k in data:\n        foldername = str(uuid.uuid4()) + '_' + str(k)\n        work_dir = settings.MEDIA_ROOT+'/'+str(foldername)\n\n        Path(work_dir).mkdir(parents=True, exist_ok=True)\n\n        if langIndex == 0:\n            filename = settings.MEDIA_ROOT+'/'+str(foldername)+'/sketch.ino'\n        elif langIndex == 1:\n            filename = settings.MEDIA_ROOT+'/'+str(foldername)+'/sketch.c'\n\n        fout = open(filename, 'w', encoding='utf8')\n        matches = re.finditer(PATTERN, data.get(k, ''), re.MULTILINE)\n\n        for _, match in enumerate(matches, start=1):\n            func_name = match.group().replace('{', '')\n            func_name = func_name.strip() + ';'\n            fout.writelines('#line 1 \"{}\"\\n'.format(filename))\n            fout.writelines('{}\\n'.format(func_name))\n\n        fout.writelines(data.get(k, ''))\n        fout.close()\n        filenames.append(foldername)\n        logger.info('Creating')\n        logger.info(filename)\n\n    return filenames\n    # except Exception:\n    #     logger.error(traceback.format_exc())\n    #     return []\n\n\ndef CompileINO(filenames):\n    ret = {}\n    try:\n        for filename in filenames:\n            ino_name = settings.MEDIA_ROOT+'/'+str(filename)+'/sketch.ino'\n            out_name = settings.MEDIA_ROOT+'/'+str(filename)+'/out.hex'\n            logger.info('Compiling')\n            logger.info(ino_name)\n\n            ps = subprocess.Popen(\n                ['arduino-cli', 'compile', ino_name, '--fqbn',\n                    'arduino:avr:uno', '-o', out_name],\n                stdout=subprocess.PIPE,\n                stderr=subprocess.PIPE\n            )\n            output, err = ps.communicate()\n            # print(ps.returncode)\n            # print(output)\n            # print(err)\n            data = ''\n            if err == '' and ps.returncode != 0:\n                err = b'Code Cannot be Compiled: Unknown Reason'\n\n            if os.path.isfile(out_name):\n                data = open(out_name, 'r').read()\n            # print(data)\n            pos = filename.find('_')\n            if pos != -1:\n                pos += 1\n                key = filename[pos:]\n            else:\n                key = filename\n\n            ret[key] = {\n                'output': re.sub(\n                    rf'{settings.MEDIA_ROOT}/{filename}/',\n                    '',\n                    output.decode('utf-8')\n                ),\n                'error': re.sub(\n                    rf'{settings.MEDIA_ROOT}/{filename}/',\n                    '',\n                    err.decode('utf-8')\n                ),\n                'data': data\n            }\n\n    except Exception:\n        print(traceback.format_exc())\n        return False\n    finally:\n        for filename in filenames:\n            parent = settings.MEDIA_ROOT+'/'+str(filename)\n            shutil.rmtree(parent, True)\n            logger.info('Removing')\n            logger.info(parent)\n    return ret\n\n\ndef CompileInlineAssembly(filenames):\n    ret = {}\n    try:\n        for filename in filenames:\n            c_name = settings.MEDIA_ROOT+'/'+str(filename)+'/sketch.c'\n            obj_name = settings.MEDIA_ROOT+'/'+str(filename)+'/sketch.o'\n            bin_name = settings.MEDIA_ROOT+'/'+str(filename)+'/sketch'\n            out_name = settings.MEDIA_ROOT+'/'+str(filename)+'/out.hex'\n            logger.info('Compiling')\n            logger.info(c_name)\n            createObj = \"avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o \" + obj_name + \" \" + c_name\n            createBin = \"avr-gcc -mmcu=atmega328p \" + obj_name + \" -o \" + bin_name\n            createHex = \"avr-objcopy -O ihex -R .eeprom \" + bin_name + \" \" + out_name\n            ps = subprocess.Popen(\n                createObj + \" && \" + createBin + \" && \" + createHex,\n                stdout=subprocess.PIPE,\n                stderr=subprocess.PIPE,\n                shell=True\n            )\n            output, err = ps.communicate()\n            # print(ps.returncode)\n            # print(output)\n            # print(err)\n            data = ''\n            if err == '' and ps.returncode != 0:\n                err = b'Code Cannot be Compiled: Unknown Reason'\n\n            if os.path.isfile(out_name):\n                data = open(out_name, 'r').read()\n            # print(data)\n            pos = filename.find('_')\n            if pos != -1:\n                pos += 1\n                key = filename[pos:]\n            else:\n                key = filename\n\n            ret[key] = {\n                'output': \"Compiled Successfully\",\n                'error': re.sub(\n                    rf'{settings.MEDIA_ROOT}/{filename}/',\n                    '',\n                    err.decode('utf-8')\n                ),\n                'data': data\n            }\n\n    except Exception:\n        print(traceback.format_exc())\n        return False\n    finally:\n        for filename in filenames:\n            parent = settings.MEDIA_ROOT+'/'+str(filename)\n            shutil.rmtree(parent, True)\n            logger.info('Removing')\n            logger.info(parent)\n    return ret\n\n\n@shared_task\ndef compile_sketch_task(task_id, data, langIndex):\n    try:\n        current_task.update_state(\n            state='PROGRESS',\n            meta={'current_process': 'Saving Files'})\n        filenames = saveFiles(data, langIndex)\n        current_task.update_state(\n            state='PROGRESS',\n            meta={'current_process': 'Starting Compiling'})\n        if langIndex == 0:\n            output = CompileINO(filenames)\n        elif langIndex == 1:\n            output = CompileInlineAssembly(filenames)\n        if isinstance(output, bool):\n            current_task.update_state(state='FAILURE', meta={\n                'exc_type': 'Compilation Error',\n                'exc_message': 'Server Error'\n            })\n            return {'error': True}\n        else:\n            current_task.update_state(\n                state='PROGRESS',\n                meta={'current_process': 'Done'})\n            return output\n    except Exception as e:\n        current_task.update_state(state='FAILURE', meta={\n            'exc_type': type(e).__name__,\n            'exc_message': traceback.format_exc()\n        })\n        print(traceback.format_exc())\n        return {'error': True}\n"
  },
  {
    "path": "esim-cloud-backend/arduinoAPI/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "esim-cloud-backend/arduinoAPI/urls.py",
    "content": "\"\"\"\nesimCloud URL Configuration\n\"\"\"\nfrom django.urls import path\nfrom arduinoAPI import views as arduinoAPI_views\n\n\nurlpatterns = [\n    path('compileINO', arduinoAPI_views.CompileSketchINO.as_view(),\n         name='compileINOFiles'),\n    path('compileInlineAssembly', arduinoAPI_views.CompileSketchInlineAssembly.as_view(),\n         name='compileInlineAssemblyFiles'),\n    path('compile/status', arduinoAPI_views.CompilationStatus.as_view(),\n         name='CompilationStatus')\n\n]\n"
  },
  {
    "path": "esim-cloud-backend/arduinoAPI/views.py",
    "content": "from django.shortcuts import render\nfrom rest_framework.views import APIView\nfrom rest_framework.response import Response\nfrom arduinoAPI.tasks import compile_sketch_task\nimport uuid\nfrom celery.result import AsyncResult\n\n\nclass CompileSketchINO(APIView):\n    def post(self, request):\n        \"\"\"\n        Compile list of Arduino Sketch File\n\n        body: {<Arduino ID>:<source code>}\n        example: { \"1\":\"void setup(){}void loop(){}\"}\n        \"\"\"\n        # Create Task ID (Used for getting Response)\n        task_id = uuid.uuid4()\n        # Queue Task\n        task = compile_sketch_task.apply_async(\n            kwargs={\n                'data': request.data,\n                'task_id': task_id,\n                'langIndex': 0\n            }, task_id=str(task_id))\n        # Return Status\n        return Response({\n            'state': task.state,\n            'uuid': str(task_id)\n        })\n\n\nclass CompileSketchInlineAssembly(APIView):\n    def post(self, request):\n        \"\"\"\n        Compile list of Arduino C Inline assembly File\n\n        body: {<Arduino ID>:<source code>}\n        example: { \"1\":\"#include <avr/io.h>#include <util/delay.h>\"}\n        \"\"\"\n        # Create Task ID (Used for getting Response)\n        task_id = uuid.uuid4()\n        # Queue Task\n        task = compile_sketch_task.apply_async(\n            kwargs={\n                'data': request.data,\n                'task_id': task_id,\n                'langIndex': 1\n            }, task_id=str(task_id))\n        # Return Status\n        return Response({\n            'state': task.state,\n            'uuid': str(task_id)\n        })\n\nclass CompilationStatus(APIView):\n    \"\"\"\n    Returns Compilation Status\n    \"\"\"\n\n    def get(self, request):\n        # GET task id from Query\n        task_id = request.GET.get(\"task_id\", -1)\n        if task_id == -1:\n            return Response({})\n\n        # Get Celery Result\n        celery_result = AsyncResult(str(task_id))\n        # return Result with status\n        response_data = {\n            'state': celery_result.state,\n            'details': celery_result.info\n        }\n        return Response(response_data)\n"
  },
  {
    "path": "esim-cloud-backend/authAPI/__init__.py",
    "content": ""
  },
  {
    "path": "esim-cloud-backend/authAPI/admin.py",
    "content": "from django.contrib import admin\nfrom django.contrib.auth.admin import UserAdmin\nfrom .models import User\n\n\nadmin.site.register(User, UserAdmin)\n"
  },
  {
    "path": "esim-cloud-backend/authAPI/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass AuthapiConfig(AppConfig):\n    name = 'authAPI'\n"
  },
  {
    "path": "esim-cloud-backend/authAPI/models.py",
    "content": "from django.db import models\nfrom django.contrib.auth.models import AbstractUser\n# Create your models here.\n\n\nclass User(AbstractUser):\n    email = models.EmailField(unique=True)\n"
  },
  {
    "path": "esim-cloud-backend/authAPI/serializers.py",
    "content": "from django.contrib.auth import authenticate, get_user_model\nfrom rest_framework import serializers\n\nfrom djoser.conf import settings\n\nUser = get_user_model()\n\n\nclass TokenCreateSerializer(serializers.Serializer):\n    password = serializers.CharField(required=False,\n                                     style={\"input_type\": \"password\"})\n\n    default_error_messages = {\n        \"invalid_credentials\": \"Incorrect username or password\",\n        \"inactive_account\": \"\"\"Your account is not activated.\n                               Please click on the activation link\n                               sent by email.\"\"\",\n    }\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.user = None\n        self.fields[settings.LOGIN_FIELD] = serializers.CharField()\n\n    def validate(self, attrs):\n        password = attrs.get(\"password\")\n        params = {settings.LOGIN_FIELD: attrs.get(settings.LOGIN_FIELD)}\n        self.user = authenticate(\n            request=self.context.get(\"request\"), **params, password=password\n        )\n        if not self.user:\n            self.user = User.objects.filter(**params).first()\n            if self.user and not self.user.is_active:\n                self.fail(\"inactive_account\")\n\n            if self.user and not self.user.check_password(password):\n                self.fail(\"invalid_credentials\")\n\n        if self.user and self.user.is_active:\n            return attrs\n\n        if self.user and (not self.user.is_active):\n            self.fail(\"inactive_account\")\n\n        self.fail(\"invalid_credentials\")\n"
  },
  {
    "path": "esim-cloud-backend/authAPI/templates/activate_user.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <!-- Basic Page Needs\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n    <meta charset=\"utf-8\">\n    <title>Activate Account</title>\n    <meta name=\"description\" content=\"\">\n\n    <!-- Mobile Specific Metas\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n    <!-- FONT\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n    <link href=\"//fonts.googleapis.com/css?family=Raleway:400,300,600\" rel=\"stylesheet\" type=\"text/css\">\n    <script src=\"//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js\"></script>\n\n    <!-- CSS\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n    <link rel=\"stylesheet\" href=\"/css/normalize.css\">\n    <link rel=\"stylesheet\" href=\"/css/skeleton.css\">\n    <style>\n        html,\n        body {\n            min-height: 100%;\n        }\n\n        .button {\n            border-color: #33C3F0;\n        }\n\n        .footer {\n            position: absolute;\n            bottom: 0;\n            min-width: 100%;\n            padding: 10px;\n            text-align: center;\n        }\n\n        #clickhere {\n            cursor: pointer;\n        }\n    </style>\n\n    <!-- Script\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n\n\n    <script>\n        function sendData() {\n            $.ajax({\n                url: \"{{ activation_url }}\",\n                data: { uid: '{{ uid }}', token: '{{ token }}' },\n                type: \"POST\",\n                dataType: \"json\",\n                //on success\n                success: function (data) {\n                    window.location.replace('{{ redirect_url }}');\n                },\n                //on error\n                error: function (err) {\n                    // ToDo: Error message popup\n                    console.log(err)\n                    $('#error-text').text(err.statusText)\n\n                }\n            });\n        }\n\n    </script>\n\n    <!-- Favicon\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n    <!-- <link rel=\"icon\" type=\"image/png\" href=\"images/favicon.png\"> -->\n\n</head>\n\n<body>\n\n\n    <!-- Primary Page Layout\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n    <div class=\"container\">\n        <div class=\"row\">\n\n            <div style=\"padding-top: 30%; align-content: center;\">\n                <h1 style=\"text-align: center;\">To Activate Your Account\n                    <a id=\"clickhere\" onClick=\"sendData();\"><strong><u>Click Here</u><strong></a></h1>\n            </div>\n            <div style=\"padding-top: 30%; align-content: center;\">\n                <h1 style=\"text-align: center; color: #e25555;\" id=\"error-text\"> </h1>\n            </div>\n        </div>\n    </div>\n    <div class=\"container footer\">\n        <footer class=\"twelve columns\">\n            Made with <span style=\"color: #e25555;\">&hearts;</span> by <a\n                href=\"https://github.com/frg-fossee\">frg-fossee</a>\n        </footer>\n    </div> <!-- end footer div.container -->\n    </div>\n    <!-- End Document\n  –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n</body>\n\n</html>\n"
  },
  {
    "path": "esim-cloud-backend/authAPI/templates/css/normalize.css",
    "content": "/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n *    user zoom.\n */\n\nhtml {\n  font-family: sans-serif; /* 1 */\n  -ms-text-size-adjust: 100%; /* 2 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n  margin: 0;\n}\n\n/* HTML5 display definitions\n   ========================================================================== */\n\n/**\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\n * Correct `block` display not defined for `details` or `summary` in IE 10/11\n * and Firefox.\n * Correct `block` display not defined for `main` in IE 11.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; /* 1 */\n  vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9/10.\n * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n/* Links\n   ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n  background-color: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n  outline: 0;\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n */\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n */\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari and Chrome.\n */\n\ndfn {\n  font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari, and Chrome.\n */\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n  font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9/10.\n */\n\nimg {\n  border: 0;\n}\n\n/**\n * Correct overflow not hidden in IE 9/10/11.\n */\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari.\n */\n\nfigure {\n  margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n  overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n *    Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; /* 1 */\n  font: inherit; /* 2 */\n  margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\n */\n\nbutton {\n  overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n *    and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n *    `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; /* 2 */\n  cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n  line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n *    (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; /* 1 */\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box; /* 2 */\n  box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n  border: 0; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9/10/11.\n */\n\ntextarea {\n  overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n  font-weight: bold;\n}\n\n/* Tables\n   ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n\n.footer-wrapper {\nposition: relative;\nmargin-top: 0;\nbackground-color: #e5e5e5;\nborder-top: 1px solid #fff;\nbottom: -10px;\nheight: 40px;\nwidth: 100%;}\n\n.footer-wrapper footer { margin: 0 auto; }\n"
  },
  {
    "path": "esim-cloud-backend/authAPI/templates/css/skeleton.css",
    "content": "/*\n* Skeleton V2.0.4\n* Copyright 2014, Dave Gamache\n* www.getskeleton.com\n* Free to use under the MIT license.\n* http://www.opensource.org/licenses/mit-license.php\n* 12/29/2014\n*/\n\n\n/* Table of contents\n––––––––––––––––––––––––––––––––––––––––––––––––––\n- Grid\n- Base Styles\n- Typography\n- Links\n- Buttons\n- Forms\n- Lists\n- Code\n- Tables\n- Spacing\n- Utilities\n- Clearing\n- Media Queries\n*/\n\n\n/* Grid\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n.container {\n  position: relative;\n  width: 100%;\n  max-width: 960px;\n  margin: 0 auto;\n  padding: 0 20px;\n  box-sizing: border-box; }\n.column,\n.columns {\n  width: 100%;\n  float: left;\n  box-sizing: border-box; }\n\n/* For devices larger than 400px */\n@media (min-width: 400px) {\n  .container {\n    width: 85%;\n    padding: 0; }\n}\n\n/* For devices larger than 550px */\n@media (min-width: 550px) {\n  .container {\n    width: 80%; }\n  .column,\n  .columns {\n    margin-left: 4%; }\n  .column:first-child,\n  .columns:first-child {\n    margin-left: 0; }\n\n  .one.column,\n  .one.columns                    { width: 4.66666666667%; }\n  .two.columns                    { width: 13.3333333333%; }\n  .three.columns                  { width: 22%;            }\n  .four.columns                   { width: 30.6666666667%; }\n  .five.columns                   { width: 39.3333333333%; }\n  .six.columns                    { width: 48%;            }\n  .seven.columns                  { width: 56.6666666667%; }\n  .eight.columns                  { width: 65.3333333333%; }\n  .nine.columns                   { width: 74.0%;          }\n  .ten.columns                    { width: 82.6666666667%; }\n  .eleven.columns                 { width: 91.3333333333%; }\n  .twelve.columns                 { width: 100%; margin-left: 0; }\n\n  .one-third.column               { width: 30.6666666667%; }\n  .two-thirds.column              { width: 65.3333333333%; }\n\n  .one-half.column                { width: 48%; }\n\n  /* Offsets */\n  .offset-by-one.column,\n  .offset-by-one.columns          { margin-left: 8.66666666667%; }\n  .offset-by-two.column,\n  .offset-by-two.columns          { margin-left: 17.3333333333%; }\n  .offset-by-three.column,\n  .offset-by-three.columns        { margin-left: 26%;            }\n  .offset-by-four.column,\n  .offset-by-four.columns         { margin-left: 34.6666666667%; }\n  .offset-by-five.column,\n  .offset-by-five.columns         { margin-left: 43.3333333333%; }\n  .offset-by-six.column,\n  .offset-by-six.columns          { margin-left: 52%;            }\n  .offset-by-seven.column,\n  .offset-by-seven.columns        { margin-left: 60.6666666667%; }\n  .offset-by-eight.column,\n  .offset-by-eight.columns        { margin-left: 69.3333333333%; }\n  .offset-by-nine.column,\n  .offset-by-nine.columns         { margin-left: 78.0%;          }\n  .offset-by-ten.column,\n  .offset-by-ten.columns          { margin-left: 86.6666666667%; }\n  .offset-by-eleven.column,\n  .offset-by-eleven.columns       { margin-left: 95.3333333333%; }\n\n  .offset-by-one-third.column,\n  .offset-by-one-third.columns    { margin-left: 34.6666666667%; }\n  .offset-by-two-thirds.column,\n  .offset-by-two-thirds.columns   { margin-left: 69.3333333333%; }\n\n  .offset-by-one-half.column,\n  .offset-by-one-half.columns     { margin-left: 52%; }\n\n}\n\n\n/* Base Styles\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n/* NOTE\nhtml is set to 62.5% so that all the REM measurements throughout Skeleton\nare based on 10px sizing. So basically 1.5rem = 15px :) */\nhtml {\n  font-size: 62.5%; }\nbody {\n  font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */\n  line-height: 1.6;\n  font-weight: 400;\n  font-family: \"Raleway\", \"HelveticaNeue\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  color: #222; }\n\n\n/* Typography\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 2rem;\n  font-weight: 300; }\nh1 { font-size: 4.0rem; line-height: 1.2;  letter-spacing: -.1rem;}\nh2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; }\nh3 { font-size: 3.0rem; line-height: 1.3;  letter-spacing: -.1rem; }\nh4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; }\nh5 { font-size: 1.8rem; line-height: 1.5;  letter-spacing: -.05rem; }\nh6 { font-size: 1.5rem; line-height: 1.6;  letter-spacing: 0; }\n\n/* Larger than phablet */\n@media (min-width: 550px) {\n  h1 { font-size: 5.0rem; }\n  h2 { font-size: 4.2rem; }\n  h3 { font-size: 3.6rem; }\n  h4 { font-size: 3.0rem; }\n  h5 { font-size: 2.4rem; }\n  h6 { font-size: 1.5rem; }\n}\n\np {\n  margin-top: 0; }\n\n\n/* Links\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\na {\n  color: #1EAEDB; }\na:hover {\n  color: #0FA0CE; }\n\n\n/* Buttons\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n.button,\nbutton,\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  display: inline-block;\n  height: 38px;\n  padding: 0 30px;\n  color: #555;\n  text-align: center;\n  font-size: 11px;\n  font-weight: 600;\n  line-height: 38px;\n  letter-spacing: .1rem;\n  text-transform: uppercase;\n  text-decoration: none;\n  white-space: nowrap;\n  background-color: transparent;\n  border-radius: 4px;\n  border: 1px solid #bbb;\n  cursor: pointer;\n  box-sizing: border-box; }\n.button:hover,\nbutton:hover,\ninput[type=\"submit\"]:hover,\ninput[type=\"reset\"]:hover,\ninput[type=\"button\"]:hover,\n.button:focus,\nbutton:focus,\ninput[type=\"submit\"]:focus,\ninput[type=\"reset\"]:focus,\ninput[type=\"button\"]:focus {\n  color: #333;\n  border-color: #888;\n  outline: 0; }\n.button.button-primary,\nbutton.button-primary,\ninput[type=\"submit\"].button-primary,\ninput[type=\"reset\"].button-primary,\ninput[type=\"button\"].button-primary {\n  color: #FFF;\n  background-color: #33C3F0;\n  border-color: #33C3F0; }\n.button.button-primary:hover,\nbutton.button-primary:hover,\ninput[type=\"submit\"].button-primary:hover,\ninput[type=\"reset\"].button-primary:hover,\ninput[type=\"button\"].button-primary:hover,\n.button.button-primary:focus,\nbutton.button-primary:focus,\ninput[type=\"submit\"].button-primary:focus,\ninput[type=\"reset\"].button-primary:focus,\ninput[type=\"button\"].button-primary:focus {\n  color: #FFF;\n  background-color: #1EAEDB;\n  border-color: #1EAEDB; }\n\n\n/* Forms\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\ninput[type=\"email\"],\ninput[type=\"number\"],\ninput[type=\"search\"],\ninput[type=\"text\"],\ninput[type=\"tel\"],\ninput[type=\"url\"],\ninput[type=\"password\"],\ntextarea,\nselect {\n  height: 38px;\n  padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */\n  background-color: #fff;\n  border: 1px solid #D1D1D1;\n  border-radius: 4px;\n  box-shadow: none;\n  box-sizing: border-box; }\n/* Removes awkward default styles on some inputs for iOS */\ninput[type=\"email\"],\ninput[type=\"number\"],\ninput[type=\"search\"],\ninput[type=\"text\"],\ninput[type=\"tel\"],\ninput[type=\"url\"],\ninput[type=\"password\"],\ntextarea {\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none; }\ntextarea {\n  min-height: 65px;\n  padding-top: 6px;\n  padding-bottom: 6px; }\ninput[type=\"email\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"password\"]:focus,\ntextarea:focus,\nselect:focus {\n  border: 1px solid #33C3F0;\n  outline: 0; }\nlabel,\nlegend {\n  display: block;\n  margin-bottom: .5rem;\n  font-weight: 600; }\nfieldset {\n  padding: 0;\n  border-width: 0; }\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  display: inline; }\nlabel > .label-body {\n  display: inline-block;\n  margin-left: .5rem;\n  font-weight: normal; }\n\n\n/* Lists\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nul {\n  list-style: circle inside; }\nol {\n  list-style: decimal inside; }\nol, ul {\n  padding-left: 0;\n  margin-top: 0; }\nul ul,\nul ol,\nol ol,\nol ul {\n  margin: 1.5rem 0 1.5rem 3rem;\n  font-size: 90%; }\nli {\n  margin-bottom: 1rem; }\n\n\n/* Code\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\ncode {\n  padding: .2rem .5rem;\n  margin: 0 .2rem;\n  font-size: 90%;\n  white-space: nowrap;\n  background: #F1F1F1;\n  border: 1px solid #E1E1E1;\n  border-radius: 4px; }\npre > code {\n  display: block;\n  padding: 1rem 1.5rem;\n  white-space: pre; }\n\n\n/* Tables\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nth,\ntd {\n  padding: 12px 15px;\n  text-align: left;\n  border-bottom: 1px solid #E1E1E1; }\nth:first-child,\ntd:first-child {\n  padding-left: 0; }\nth:last-child,\ntd:last-child {\n  padding-right: 0; }\n\n\n/* Spacing\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nbutton,\n.button {\n  margin-bottom: 1rem; }\ninput,\ntextarea,\nselect,\nfieldset {\n  margin-bottom: 1.5rem; }\npre,\nblockquote,\ndl,\nfigure,\ntable,\np,\nul,\nol,\nform {\n  margin-bottom: 2.5rem; }\n\n\n/* Utilities\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n.u-full-width {\n  width: 100%;\n  box-sizing: border-box; }\n.u-max-full-width {\n  max-width: 100%;\n  box-sizing: border-box; }\n.u-pull-right {\n  float: right; }\n.u-pull-left {\n  float: left; }\n\n\n/* Misc\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nhr {\n  margin-top: 3rem;\n  margin-bottom: 3.5rem;\n  border-width: 0;\n  border-top: 1px solid #E1E1E1; }\n\n\n/* Clearing\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n\n/* Self Clearing Goodness */\n.container:after,\n.row:after,\n.u-cf {\n  content: \"\";\n  display: table;\n  clear: both; }\n\n\n/* Media Queries\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n/*\nNote: The best way to structure the use of media queries is to create the queries\nnear the relevant code. For example, if you wanted to change the styles for buttons\non small devices, paste the mobile query code up in the buttons section and style it\nthere.\n*/\n\n\n/* Larger than mobile */\n@media (min-width: 400px) {}\n\n/* Larger than phablet (also point when grid becomes active) */\n@media (min-width: 550px) {}\n\n/* Larger than tablet */\n@media (min-width: 750px) {}\n\n/* Larger than desktop */\n@media (min-width: 1000px) {}\n\n/* Larger than Desktop HD */\n@media (min-width: 1200px) {}\n"
  },
  {
    "path": "esim-cloud-backend/authAPI/templates/google_callback.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Redirecting to the destination...</title>\n    <script>\n        window.localStorage.setItem('esim_token', '{{ token }}');\n        var redirect_to = window.localStorage.getItem('ard_redurl');\n        if (redirect_to) {\n            window.localStorage.removeItem('ard_redurl');\n            window.open(redirect_to, '_self')\n        } else {\n            window.open('{{url}}', '_self')\n        }\n    </script>\n</head>\n<body></body>\n</html>"
  },
  {
    "path": "esim-cloud-backend/authAPI/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "esim-cloud-backend/authAPI/token.py",
    "content": "class TokenStrategy:\n    @classmethod\n    def obtain(cls, user):\n        from rest_framework.authtoken.models import Token\n        from django.utils.six import text_type\n\n        token = Token.objects.create(user=...)\n        return {\n            \"token\": text_type(token.key),\n        }\n"
  },
  {
    "path": "esim-cloud-backend/authAPI/urls.py",
    "content": "\"\"\"\n\nesimCloud URL Configuration\n\n\"\"\"\nfrom django.conf.urls import url\nfrom authAPI import views as authAPI_views\n\nurlpatterns = [\n    url(r'^google-callback', authAPI_views.GoogleOAuth2),\n    url(r'^users/activate/(?P<uid>[\\w-]+)/(?P<token>[\\w-]+)/$',\n        authAPI_views.activate_user),\n    url(r'user/token/', authAPI_views.CustomTokenCreateView.as_view())\n]\n"
  },
  {
    "path": "esim-cloud-backend/authAPI/views.py",
    "content": "from rest_framework import generics, status, permissions\nfrom rest_framework.response import Response\nfrom django.conf import settings\nfrom requests_oauthlib import OAuth2Session\nfrom django.contrib.auth import get_user_model\nfrom djoser.conf import settings as djoser_settings\nfrom random import randint\nfrom django.shortcuts import render\nfrom django.http import HttpResponseNotFound\nfrom djoser import utils\nfrom djoser.serializers import TokenSerializer\nfrom authAPI.serializers import TokenCreateSerializer\n\nToken = djoser_settings.TOKEN_MODEL\n\n\ndef activate_user(request, uid, token):\n    \"\"\"\n    Used to activate accounts,\n    sends POST request to /api/auth/users/activation/ route\n    internally to activate account.\n    Link to this route is sent via email to user for verification\n    \"\"\"\n\n    protocol = 'https://' if request.is_secure() else 'http://'\n    web_url = protocol + request.get_host() + '/api/auth/users/activation/'  # noqa URL comes from Djoser library\n    return render(request, 'activate_user.html',\n                  {'uid': uid,\n                   'token': token,\n                   'activation_url': web_url,\n                   'redirect_url': settings.POST_ACTIVATE_REDIRECT_URL\n                   })\n\n\ndef GoogleOAuth2(request):\n    state = request.GET.get('state', None)\n    code = request.GET.get('code', None)\n\n    if not (state is None) or not (code is None):\n        client_id = settings.SOCIAL_AUTH_GOOGLE_OAUTH2_KEY\n        client_secret = settings.SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET\n\n        google = OAuth2Session(\n            client_id,\n            redirect_uri=settings.GOOGLE_OAUTH_REDIRECT_URI,\n            state=state\n        )\n        google.fetch_token(\n            'https://accounts.google.com/o/oauth2/token',\n            client_secret=client_secret,\n            code=code\n        )\n\n        user_info = google.get(\n            'https://www.googleapis.com/oauth2/v1/userinfo').json()\n\n        if user_info['email']:\n            user, created = get_user_model().objects.get_or_create(\n                email=user_info['email'])\n            if created:\n                # If User was created\n                # Set name to firstname_lastname1209\n                username = user_info['name'].strip().replace(\n                    ' ', '_') + str(randint(0, 9999))\n                user.username = username\n                user.save()\n            token, created = Token.objects.get_or_create(user=user)\n\n            protocol = 'https://' if request.is_secure() else 'http://'\n            web_url = protocol + request.get_host() + '/eda/#/login'\n\n            return render(request, 'google_callback.html',\n                          {\n                              \"token\": token,\n                              \"url\": web_url\n                          })\n    return HttpResponseNotFound(\"<h1>Page Not Found</h1>\")\n\n\nclass CustomTokenCreateView(utils.ActionViewMixin, generics.GenericAPIView):\n    \"\"\"\n    Use this endpoint to obtain user authentication token.\n    \"\"\"\n\n    serializer_class = TokenCreateSerializer\n    permission_classes = [permissions.AllowAny]\n\n    def _action(self, serializer):\n        token = utils.login_user(self.request, serializer.user)\n        token_serializer_class = TokenSerializer\n        data = {\n            'auth_token': token_serializer_class(token).data[\"auth_token\"],\n            'user_id': serializer.user.id\n        }\n        return Response(\n            data=data, status=status.HTTP_200_OK\n        )\n"
  },
  {
    "path": "esim-cloud-backend/esimCloud/__init__.py",
    "content": "from .celery import app as celery_app\n\n__all__ = ('celery_app',)\n"
  },
  {
    "path": "esim-cloud-backend/esimCloud/asgi.py",
    "content": "\"\"\"\nASGI config for esimCloud project.\n\nIt exposes the ASGI callable as a module-level variable named ``application``.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/3.0/howto/deployment/asgi/\n\"\"\"\n\nimport os\n\nfrom django.core.asgi import get_asgi_application\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'esimCloud.settings')\n\napplication = get_asgi_application()\n"
  },
  {
    "path": "esim-cloud-backend/esimCloud/celery.py",
    "content": "import os\nfrom celery import Celery\nfrom django.conf import settings\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'esimCloud.settings')\n\napp = Celery('esimCloud')\napp.config_from_object('django.conf:settings', namespace='CELERY')\napp.autodiscover_tasks(lambda: settings.INSTALLED_APPS)\n\n\n@app.task(bind=True)\ndef debug_task(self):\n    print('Request: {0!r}'.format(self.request))\n"
  },
  {
    "path": "esim-cloud-backend/esimCloud/settings.py",
    "content": "\"\"\"\nDjango settings for esimCloud project.\n\nGenerated by 'django-admin startproject' using Django 3.0.5.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/3.0/topics/settings/\n\nFor the full list of settings and their values, see\nhttps://docs.djangoproject.com/en/3.0/ref/settings/\n\"\"\"\nimport os\n\n# Build paths inside the project like this: os.path.join(BASE_DIR, ...)\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n\n# Quick-start development settings - unsuitable for production\n# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/\n\n# SECURITY WARNING: keep the secret key used in production secret!\nSECRET_KEY = os.environ.get(\n    \"SECRET_KEY\", 'kk5tq+=kyyicitl+1ki!wyx@*mz^vmei6_q25dt!^3(_kxd^eg')\n\n# SECURITY WARNING: don't run with debug turned on in production!\nDEBUG = bool(os.environ.get(\"DJANGO_DEBUG\", default=True) == 'True')\n\nALLOWED_HOSTS = ['0.0.0.0', 'localhost', '127.0.0.1']\n\n# Application definition\n\nINSTALLED_APPS = [\n    'django.contrib.admin',\n    'django.contrib.auth',\n    'django.contrib.contenttypes',\n    'django.contrib.sessions',\n    'django.contrib.messages',\n    'django.contrib.staticfiles',\n    'whitenoise.runserver_nostatic',\n    'django_filters',\n    'corsheaders',\n    'drf_yasg',\n    'rest_framework',\n    'rest_framework.authtoken',\n    'social_django',\n    'inline_actions',\n    'djoser',\n    'simulationAPI',\n    'authAPI',\n    'libAPI',\n    'saveAPI',\n    'publishAPI',\n    'arduinoAPI',\n    'workflowAPI',\n    'ltiAPI',\n]\n\nMIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',\n    'whitenoise.middleware.WhiteNoiseMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'corsheaders.middleware.CorsMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n]\n\nROOT_URLCONF = 'esimCloud.urls'\n\nTEMPLATES = [\n    {\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\n        'DIRS': [os.path.join(BASE_DIR, 'templates')],\n        'APP_DIRS': True,\n        'OPTIONS': {\n            'context_processors': [\n                'django.template.context_processors.debug',\n                'django.template.context_processors.request',\n                'django.contrib.auth.context_processors.auth',\n                'django.contrib.messages.context_processors.messages',\n            ],\n        },\n    },\n]\n\nWSGI_APPLICATION = 'esimCloud.wsgi.application'\n\nAUTH_USER_MODEL = 'authAPI.User'\n# Database config Defaults to sqlite3 if not provided in environment files\n\nDATABASES = {\n    \"default\": {\n        \"ENGINE\": os.environ.get(\"SQL_ENGINE\", \"django.db.backends.sqlite3\"),\n        \"NAME\": os.environ.get(\"SQL_DATABASE\",\n                               os.path.join(BASE_DIR, \"db.sqlite3\")),\n        \"USER\": os.environ.get(\"SQL_USER\", \"user\"),\n        \"PASSWORD\": os.environ.get(\"SQL_PASSWORD\", \"password\"),\n        \"HOST\": os.environ.get(\"SQL_HOST\", \"localhost\"),\n        \"PORT\": os.environ.get(\"SQL_PORT\", \"5432\"),\n    },\n}\n\nDATABASE_ROUTERS = (\n    # 'simulationAPI.dbrouters.mongoRouter',<- to Store models in mongodb\n    # 'saveAPI.dbrouters.mongoRouter',<- to Store saveAPI models in mongodb\n    # 'libAPI.dbrouters.mongoRouter'<- to Store LibAPI models in mongodb\n)\n\n# Password validation\nAUTH_PASSWORD_VALIDATORS = [\n    {\n        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',  # noqa\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',  # noqa\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',  # noqa\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',  # noqa\n    },\n]\n\n# Mail server config\n\n# use this for console emails\nEMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'\n\n# Note SMTP is slow\n# EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'\n# EMAIL_HOST = os.environ.get(\"EMAIL_HOST\", \"smtp.gmail.com\")\n# EMAIL_HOST_USER = os.environ.get(\"EMAIL_HOST_USER\", \"email@gmail.com\")\n# EMAIL_HOST_PASSWORD = os.environ.get(\"EMAIL_HOST_PASSWORD\", \"gmailpassword\")\n# EMAIL_PORT = os.environ.get(\"EMAIL_PORT\", 587)\n# EMAIL_USE_TLS = os.environ.get(\"EMAIL_USE_TLS\", True)\n\nSOCIAL_AUTH_GOOGLE_OAUTH2_KEY = os.environ.get(\n    \"SOCIAL_AUTH_GOOGLE_OAUTH2_KEY\", \"\")\n\nSOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = os.environ.get(\n    \"SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET\", \"\")\n\nGOOGLE_OAUTH_REDIRECT_URI = os.environ.get(\n    \"GOOGLE_OAUTH_REDIRECT_URI\", \"http://localhost/api/auth/google-callback\")\n\nPOST_ACTIVATE_REDIRECT_URL = os.environ.get(\n    \"POST_ACTIVATE_REDIRECT_URL\", \"http://localhost/\")\n\nDJOSER = {\n    'SEND_ACTIVATION_EMAIL': True,\n    'PASSWORD_RESET_CONFIRM_URL': 'eda/#/password/reset/confirm/{uid}/{token}',\n    'PASSWORD_RESET_CONFIRM_RETYPE': True,\n    'SET_PASSWORD_RETYPE': True,\n    # 'USERNAME_RESET_CONFIRM_URL': '#/username/reset/confirm/{uid}/{token}',\n    'ACTIVATION_URL': 'api/auth/users/activate/{uid}/{token}',\n    'SOCIAL_AUTH_ALLOWED_REDIRECT_URIS': [\n      \"http://localhost:8000/api/auth/google-callback\",\n      \"http://localhost/api/auth/google-callback\", GOOGLE_OAUTH_REDIRECT_URI],  # noqa\n    'SOCIAL_AUTH_TOKEN_STRATEGY': 'authAPI.token.TokenStrategy',\n    'PASSWORD_RESET_SHOW_EMAIL_NOT_FOUND': True,\n    'SERIALIZERS': {\n        'token_create': 'authAPI.serializers.TokenCreateSerializer',\n    },\n}\n\nREST_FRAMEWORK = {\n    'DEFAULT_AUTHENTICATION_CLASSES': (\n        'rest_framework.authentication.TokenAuthentication',\n    ),\n}\n\nAUTHENTICATION_BACKENDS = (\n    'django.contrib.auth.backends.ModelBackend',\n    'social_core.backends.google.GoogleOAuth2',\n)\n\n# Internationalization\n# https://docs.djangoproject.com/en/3.0/topics/i18n/\n\nLANGUAGE_CODE = 'en-us'\n\nTIME_ZONE = 'Asia/Kolkata'\n\nUSE_I18N = True\n\nUSE_L10N = True\n\nUSE_TZ = True\n\n# Allow CORS for Public API\nCORS_ORIGIN_ALLOW_ALL = True\n\n# Static files for django admin and DRF\nSTATIC_ROOT = os.path.join(BASE_DIR, 'static')\nSTATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'\nSTATIC_URL = '/django_static/'\n\n# File Storage\nFILE_STORAGE_ROOT = os.path.join(BASE_DIR, 'file_storage')\nFILE_STORAGE_URL = '/files'\n\n# noqa For Netlist handling netlist uploads and other temp uploads\nMEDIA_URL = '/files/'\nMEDIA_ROOT = os.path.join(BASE_DIR, \"file_storage\")\n\n# celery\nCELERY_BROKER_URL = 'redis://redis:6379'\nCELERY_RESULT_BACKEND = 'redis://redis:6379'\nCELERY_ACCEPT_CONTENT = ['application/json']\nCELERY_RESULT_SERIALIZER = 'json'\nCELERY_TASK_SERIALIZER = 'json'\nCELERY_IMPORTS = (\n    'simulationAPI.tasks',\n    'arduinoAPI.tasks'\n)\n\nLOGGING = {\n    'version': 1,\n    'disable_existing_loggers': False,\n    'handlers': {\n        'console': {\n            'class': 'logging.StreamHandler',\n        },\n    },\n    'root': {\n        'handlers': ['console'],\n        'level': 'INFO',\n    },\n}\n\nSWAGGER_SETTINGS = {\n    'SECURITY_DEFINITIONS': {\n        'Bearer': {\n            'type': 'apiKey',\n            'name': 'Authorization',\n            'in': 'header'\n        }\n    }\n}\n\nLTI_TOOL_CONFIGURATION = {\n    'title': 'Esim-Cloud',\n    'description': 'Esim cloud is a simulation platform',\n    'launch_url': 'api/lti/auth/',\n    'course_aware': True,\n    'course_navigation': True\n}\n\n\nSECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')\nSESSION_COOKIE_SECURE = False\nCSRF_COOKIE_SECURE = False\n"
  },
  {
    "path": "esim-cloud-backend/esimCloud/urls.py",
    "content": "\"\"\"\n\nesimCloud URL Configuration\n\n\"\"\"\n\nfrom django.contrib import admin\nfrom django.urls import path\nfrom simulationAPI import urls as simulationURLs\nfrom libAPI import urls as libURLs\nfrom saveAPI import urls as saveURLs\nfrom workflowAPI import urls as workURLs\nfrom publishAPI import urls as publishURLs\nfrom authAPI import urls as authURLs\nfrom rest_framework import permissions\nfrom drf_yasg.views import get_schema_view\nfrom drf_yasg import openapi\nfrom django.conf.urls import url, include\nfrom arduinoAPI import urls as arduinoURLs\nfrom ltiAPI import urls as ltiURLS\n\nschema_view = get_schema_view(\n    openapi.Info(\n        title=\"eSim Cloud API\",\n        default_version='v1',\n        description=\"Public API Endpoints for eSim Cloud\",\n        license=openapi.License(name=\"GPLv3 License\"),\n    ),\n    public=True,\n    permission_classes=(permissions.AllowAny,),\n)\n\nurlpatterns = [\n    path('api/admin/', admin.site.urls),\n\n    # Simulation API Routes\n    path('api/simulation/', include(simulationURLs)),\n\n    # libAPI routes\n    path('api/', include(libURLs)),\n\n    # libAPI routes\n    path('api/', include(saveURLs)),\n\n    # publishAPI routes\n    path('api/', include(publishURLs)),\n\n    # workflowAPI routes\n    path('api/workflow/', include(workURLs)),\n\n    # Arduino Routes\n    path('api/arduino/', include(arduinoURLs)),\n\n    # LTI Routes\n    path('api/lti/', include(ltiURLS)),\n\n    # Auth API Routes\n    url(r'^api/auth/', include('djoser.urls')),\n    url(r'^api/auth/', include('djoser.urls.authtoken')),\n    url(r'^api/auth/', include(\"djoser.social.urls\")),\n    url(r'^api/auth/', include(authURLs)),\n\n    # For API Documentation\n    url(r'^api/docs(?P<format>\\.json|\\.yaml)$',\n        schema_view.without_ui(\n            cache_timeout=0),\n        name='schema-json'),\n\n    path('api/docs', schema_view.with_ui(\n        'swagger',\n        cache_timeout=0),\n         name='schema-swagger-ui'),\n\n]\n"
  },
  {
    "path": "esim-cloud-backend/esimCloud/wsgi.py",
    "content": "\"\"\"\nWSGI config for esimCloud project.\n\nIt exposes the WSGI callable as a module-level variable named ``application``.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/\n\"\"\"\n\nimport os\n\nfrom django.core.wsgi import get_wsgi_application\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'esimCloud.settings')\n\napplication = get_wsgi_application()\n"
  },
  {
    "path": "esim-cloud-backend/generate_svg.sh",
    "content": "#!/bin/sh\n\n# Cloning from github is not practical since it has a lot of useless symbols\n# echo 'Cloning kicad-symbols from github'\n# git clone --depth 1 --single-branch https://github.com/KiCad/kicad-symbols\n\nfor i in kicad-symbols/*.lib; do\n    [ -f \"$i\" ] || break\n    echo 'Processing': $i;\n    python libAPI/helper/main.py $i symbol_svgs\ndone\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/.gitattributes",
    "content": "* text=auto\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/.gitignore",
    "content": "*.pyc\n*.bak\n*.bck\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/4xxx.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP 14528\nD Monostable\nK CMOS\nF https://www.onsemi.com/pub/Collateral/MC14528B-D.PDF\n$ENDCMP\n#\n$CMP 14529\nD Dual 4 to 1 Multiplexer\nK CMOS MUX MUX4\nF http://www.alldatasheet.com/datasheet-pdf/pdf/97272/HITACHI/HD14529B.html\n$ENDCMP\n#\n$CMP 14538\nD Monostable\nK CMOS\nF https://www.onsemi.com/pub/Collateral/MC14538B-D.PDF\n$ENDCMP\n#\n$CMP 4001\nD Quad Nor 2 inputs\nK CMOS Nor2\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4000bms-01bms-02bms-25bms.pdf\n$ENDCMP\n#\n$CMP 4002\nD Dual  4 input NOR gate\nK CMOS Nor4\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4000bms-01bms-02bms-25bms.pdf\n$ENDCMP\n#\n$CMP 40106\nD Hex Schmitt trigger inverter\nK CMOS\nF https://assets.nexperia.com/documents/data-sheet/HEF40106B.pdf\n$ENDCMP\n#\n$CMP 4009\nD Hex Buffer Inverter\nK CMOS INV BUFFER high sink, VCC and VDD sep. VDD>VI>VCC!\nF http://www.sycelectronica.com.ar/semiconductores/CD4009.pdf\n$ENDCMP\n#\n$CMP 4010\nD Hex Buffer\nK CMOS BUFFER high sink, VCC and VDD sep. VDD>VI>VCC! \nF http://www.ti.com/lit/ds/symlink/cd4010b-q1.pdf\n$ENDCMP\n#\n$CMP 4011\nD Quad Nand 2 inputs\nK CMOS Nand2\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4011bms-12bms-23bms.pdf\n$ENDCMP\n#\n$CMP 4012\nD Dual 4 inputs Nand\nK CMOS Nand4\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4011bms-12bms-23bms.pdf\n$ENDCMP\n#\n$CMP 4013\nD Dual D  FlipFlop, Set & reset\nK CMOS DFF\nF http://www.onsemi.com/pub/Collateral/MC14013B-D.PDF\n$ENDCMP\n#\n$CMP 4016\nD Quad Analog Switches\nK CMOS SWITCH\nF http://www.ti.com/lit/ds/symlink/cd4016b.pdf\n$ENDCMP\n#\n$CMP 4017\nD Johnson Counter ( 10 outputs )\nK CNT CNT10\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4017bms-22bms.pdf\n$ENDCMP\n#\n$CMP 4020\nD Binary counter 14 stages (asynchronous)\nK CMOS CNT CNT14\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4020bms-24bms-40bms.pdf\n$ENDCMP\n#\n$CMP 4021\nD 8-bit static shift register\nK shift register SR PISO\nF https://assets.nexperia.com/documents/data-sheet/HEF4021B.pdf\n$ENDCMP\n#\n$CMP 4022\nD Johnson Counter (8 states)\nK CMOS CNT CNT8\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4017bms-22bms.pdf\n$ENDCMP\n#\n$CMP 4023\nD Triple Nand 3 inputs\nK CMOS Nand3\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4011bms-12bms-23bms.pdf\n$ENDCMP\n#\n$CMP 4025\nD Triple Nor 3 inputs\nK CMOS Nor3\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4000bms-01bms-02bms-25bms.pdf\n$ENDCMP\n#\n$CMP 4027\nD Dual JK FlipFlop, set & reset\nK CMOS JK JKFF\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4027bms.pdf\n$ENDCMP\n#\n$CMP 4028\nD Decoder 4 to 10 lines\nK CMOS DECOD DECOD10\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4028bms.pdf\n$ENDCMP\n#\n$CMP 4029\nD Up/Down Counter\nK CMOS COUNTER\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4029bms.pdf\n$ENDCMP\n#\n$CMP 4040\nD Binary Counter 12 stages (Asynchronous)\nK CMOS CNT CNT12\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4020bms-24bms-40bms.pdf\n$ENDCMP\n#\n$CMP 4046\nD Phase Comp & VCO\nK CMOS PLL\nF https://assets.nexperia.com/documents/data-sheet/HEF4046B.pdf\n$ENDCMP\n#\n$CMP 4047\nD Monostable/Astable Multivibrator\nK CMOS monostable astable multivibrator\nF https://www.fairchildsemi.com/datasheets/CD/CD4047BC.pdf\n$ENDCMP\n#\n$CMP 4049\nD Hex Buffer Inverter\nK CMOS BUFFER\nF http://www.intersil.com/content/dam/intersil/documents/cd40/cd4049ubms.pdf\n$ENDCMP\n#\n$CMP 4050\nD Hex Buffer\nK CMOS BUFFER\nF http://www.intersil.com/content/dam/intersil/documents/cd40/cd4050bms.pdf\n$ENDCMP\n#\n$CMP 4051\nD Analog Multiplexer 8 to 1 lins\nK CMOS MUX MUX8\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4051bms-52bms-53bms.pdf\n$ENDCMP\n#\n$CMP 4052\nD Dual Analog Multiplexer 4 to 1 line\nK CMOS MUX MUX4\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4051bms-52bms-53bms.pdf\n$ENDCMP\n#\n$CMP 4053\nD Triple analog Multiplexer 2 to 1 line\nK CMOS MUX MUX2\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4051bms-52bms-53bms.pdf\n$ENDCMP\n#\n$CMP 4056\nD BCD to 7-Segment Decoder/Driver, Strobed-Latch Function\nK CMOS LCD 7-segment decoder driver\nF http://www.ti.com/lit/ds/symlink/cd4056b.pdf\n$ENDCMP\n#\n$CMP 4066\nD Quad Analog Switches\nK CMOS SWITCH\nF http://www.ti.com/lit/ds/symlink/cd4066b.pdf\n$ENDCMP\n#\n$CMP 4069\nD Hex inverter\nK CMOS NOT\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4069ubms.pdf\n$ENDCMP\n#\n$CMP 4070\nD Quad Xor 2 inputs\nK CMOS XOR2\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4070bms-77bms.pdf\n$ENDCMP\n#\n$CMP 4071\nD Quad Or 2 inputs\nK CMOS OR2\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4071bms-72bms-75bms.pdf\n$ENDCMP\n#\n$CMP 4072\nD Dual 4 input OR gate\nK CMOS OR4\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4071bms-72bms-75bms.pdf\n$ENDCMP\n#\n$CMP 4073\nD Triple And 3 inputs\nK CMOS And3\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4073bms-81bms-82bms.pdf\n$ENDCMP\n#\n$CMP 4075\nD Triple Or 3 inputs\nK CMOS Or3\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4071bms-72bms-75bms.pdf\n$ENDCMP\n#\n$CMP 4077\nD Quad Xnor 2 inputs\nK CMOS XOR XNOR XNOR2\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4076bms.pdf\n$ENDCMP\n#\n$CMP 4081\nD Quad And 2 inputs\nK CMOS And2\nF http://www.intersil.com/content/dam/Intersil/documents/cd40/cd4073bms-81bms-82bms.pdf\n$ENDCMP\n#\n$CMP 4098\nD Dual Monostable Multivibrator\nK CMOS monostable multivibrator\nF http://www.ti.com/lit/ds/symlink/cd4098b.pdf\n$ENDCMP\n#\n$CMP 4504\nD CMOS Hex Voltage-Level Shifter for TTL-to-CMOS or CMOS-to-CMOS, DIP-16/SOIC-16/TSSOP-16\nK Level-shifter\nF http://www.ti.com/lit/ds/symlink/cd4504b.pdf\n$ENDCMP\n#\n$CMP 4510\nD 4 bits programmable counter\nK CMOS CNT CNT4\nF http://pdf.datasheetcatalog.com/datasheets/150/109581_DS.pdf\n$ENDCMP\n#\n$CMP 4518\nD Dual BCD Up-Counter\nK CMOS\nF http://www.intersil.com/content/dam/Intersil/documents/cd45/cd4518bms-20bms.pdf\n$ENDCMP\n#\n$CMP 4520\nD Dual Binary Up-Counter\nK CMOS\nF http://www.intersil.com/content/dam/Intersil/documents/cd45/cd4518bms-20bms.pdf\n$ENDCMP\n#\n$CMP 4528\nD Monostable\nK CMOS\nF http://datasheet.octopart.com/CD4528BCN-Fairchild-datasheet-143503.pdf\n$ENDCMP\n#\n$CMP 4538\nD Monostable\nK CMOS\nF https://assets.nexperia.com/documents/data-sheet/HEF4538B.pdf\n$ENDCMP\n#\n$CMP 4543\nD BCD to 7-segment latch/decoder/driver\nK CMOS 7-segment latch decoder driver\nF http://www.ti.com/lit/ds/symlink/cd4543b.pdf\n$ENDCMP\n#\n$CMP HEF4093B\nD Quad 2-Input NAND Schmitt Trigger, SOIC-14\nK NAND2\nF https://assets.nexperia.com/documents/data-sheet/HEF4093B.pdf\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/4xxx.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# 14529\n#\nDEF 14529 U 0 40 Y Y 1 L N\nF0 \"U\" -300 750 50 H V C CNN\nF1 \"14529\" -300 -850 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 700 300 -800 1 1 10 f\nX STX 1 -500 -600 200 R 50 50 1 0 I\nX W 10 500 100 200 L 50 50 1 0 T\nX Y3 11 -500 -200 200 R 50 50 1 0 I\nX Y2 12 -500 -100 200 R 50 50 1 0 I\nX Y1 13 -500 0 200 R 50 50 1 0 I\nX Y0 14 -500 100 200 R 50 50 1 0 I\nX STY 15 -500 -700 200 R 50 50 1 0 I\nX VDD 16 0 900 200 D 50 50 1 0 W\nX X0 2 -500 600 200 R 50 50 1 0 I\nX X1 3 -500 500 200 R 50 50 1 0 I\nX X2 4 -500 400 200 R 50 50 1 0 I\nX X3 5 -500 300 200 R 50 50 1 0 I\nX A 6 -500 -400 200 R 50 50 1 0 I\nX B 7 -500 -500 200 R 50 50 1 0 I\nX VSS 8 0 -1000 200 U 50 50 1 0 W\nX Z 9 500 600 200 L 50 50 1 0 T\nENDDRAW\nENDDEF\n#\n# 4001\n#\nDEF 4001 U 0 40 Y Y 5 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4001\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA -360 0 258 354 -354 1 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 1 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 1 1 10 f 150 0 -24 -150\nA -360 0 258 354 -354 2 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 2 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 2 1 10 f 150 0 -24 -150\nA -360 0 258 354 -354 3 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 3 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 3 1 10 f 150 0 -24 -150\nA -360 0 258 354 -354 4 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 4 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 4 1 10 f 150 0 -24 -150\nA 0 0 150 -899 899 1 2 10 f 0 -150 0 150\nA 0 0 150 -899 899 2 2 10 f 0 -150 0 150\nA 0 0 150 -899 899 3 2 10 f 0 -150 0 150\nA 0 0 150 -899 899 4 2 10 f 0 -150 0 150\nS -200 300 200 -300 5 1 10 f\nP 2 1 1 10 -150 -150 -25 -150 f\nP 2 1 1 10 -150 150 -25 150 f\nP 12 1 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 2 1 10 -150 -150 -25 -150 f\nP 2 2 1 10 -150 150 -25 150 f\nP 12 2 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 3 1 10 -150 -150 -25 -150 f\nP 2 3 1 10 -150 150 -25 150 f\nP 12 3 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 4 1 10 -150 -150 -25 -150 f\nP 2 4 1 10 -150 150 -25 150 f\nP 12 4 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 4 1 2 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 2 2 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 3 2 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 4 2 10 0 150 -150 150 -150 -150 0 -150 f\nX VDD 14 0 500 200 D 50 50 5 0 W\nX VSS 7 0 -500 200 U 50 50 5 0 W\nX ~ 1 -300 100 170 R 50 50 1 1 I\nX ~ 2 -300 -100 170 R 50 50 1 1 I\nX ~ 3 300 0 150 L 50 50 1 1 O I\nX ~ 4 300 0 150 L 50 50 2 1 O I\nX ~ 5 -300 100 170 R 50 50 2 1 I\nX ~ 6 -300 -100 170 R 50 50 2 1 I\nX ~ 10 300 0 150 L 50 50 3 1 O I\nX ~ 8 -300 100 170 R 50 50 3 1 I\nX ~ 9 -300 -100 170 R 50 50 3 1 I\nX ~ 11 300 0 150 L 50 50 4 1 O I\nX ~ 12 -300 100 170 R 50 50 4 1 I\nX ~ 13 -300 -100 170 R 50 50 4 1 I\nX ~ 1 -300 100 150 R 50 50 1 2 I I\nX ~ 2 -300 -100 150 R 50 50 1 2 I I\nX ~ 3 300 0 150 L 50 50 1 2 O\nX ~ 4 300 0 150 L 50 50 2 2 O\nX ~ 5 -300 100 150 R 50 50 2 2 I I\nX ~ 6 -300 -100 150 R 50 50 2 2 I I\nX ~ 10 300 0 150 L 50 50 3 2 O\nX ~ 8 -300 100 150 R 50 50 3 2 I I\nX ~ 9 -300 -100 150 R 50 50 3 2 I I\nX ~ 11 300 0 150 L 50 50 4 2 O\nX ~ 12 -300 100 150 R 50 50 4 2 I I\nX ~ 13 -300 -100 150 R 50 50 4 2 I I\nENDDRAW\nENDDEF\n#\n# 4002\n#\nDEF 4002 U 0 40 Y Y 3 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4002\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA -445 0 343 306 -306 1 1 10 N -150 175 -150 -175\nA -81 -56 238 137 768 1 1 10 f 150 0 -24 175\nA -81 56 238 -137 -768 1 1 10 f 150 0 -24 -175\nA -445 0 343 306 -306 2 1 10 N -150 175 -150 -175\nA -81 -56 238 137 768 2 1 10 f 150 0 -24 175\nA -81 56 238 -137 -768 2 1 10 f 150 0 -24 -175\nA -25 0 175 -899 899 1 2 10 f -25 -175 -25 175\nA -25 0 175 -899 899 2 2 10 f -25 -175 -25 175\nS -200 300 200 -300 3 1 10 f\nP 2 1 1 10 -150 -175 -25 -175 f\nP 2 1 1 10 -150 175 -25 175 f\nP 13 1 1 -1000 -25 175 -150 175 -150 175 -143 161 -122 115 -109 66 -103 17 -104 -34 -113 -83 -128 -131 -150 -175 -150 -175 -25 -175 f\nP 2 2 1 10 -150 -175 -25 -175 f\nP 2 2 1 10 -150 175 -25 175 f\nP 13 2 1 -1000 -25 175 -150 175 -150 175 -143 161 -122 115 -109 66 -103 17 -104 -34 -113 -83 -128 -131 -150 -175 -150 -175 -25 -175 f\nP 4 1 2 10 -25 175 -150 175 -150 -175 -25 -175 f\nP 4 2 2 10 -25 175 -150 175 -150 -175 -25 -175 f\nX VDD 14 0 500 200 D 50 50 3 0 W\nX VSS 7 0 -500 200 U 50 50 3 0 W\nX ~ 1 300 0 150 L 50 50 1 1 O I\nX ~ 2 -300 150 150 R 50 50 1 1 I\nX ~ 3 -300 50 190 R 50 50 1 1 I\nX ~ 4 -300 -50 190 R 50 50 1 1 I\nX ~ 5 -300 -150 150 R 50 50 1 1 I\nX ~ 10 -300 50 190 R 50 50 2 1 I\nX ~ 11 -300 -50 190 R 50 50 2 1 I\nX ~ 12 -300 -150 150 R 50 50 2 1 I\nX ~ 13 300 0 150 L 50 50 2 1 O I\nX ~ 9 -300 150 150 R 50 50 2 1 I\nX ~ 1 300 0 150 L 50 50 1 2 O\nX ~ 2 -300 150 150 R 50 50 1 2 I I\nX ~ 3 -300 50 150 R 50 50 1 2 I I\nX ~ 4 -300 -50 150 R 50 50 1 2 I I\nX ~ 5 -300 -150 150 R 50 50 1 2 I I\nX ~ 10 -300 50 150 R 50 50 2 2 I I\nX ~ 11 -300 -50 150 R 50 50 2 2 I I\nX ~ 12 -300 -150 150 R 50 50 2 2 I I\nX ~ 13 300 0 150 L 50 50 2 2 O\nX ~ 9 -300 150 150 R 50 50 2 2 I I\nENDDRAW\nENDDEF\n#\n# 4009\n#\nDEF 4009 U 0 40 Y Y 7 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4009\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -200 300 200 -300 7 1 10 f\nP 4 1 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 2 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 3 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 4 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 5 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 6 0 10 -150 150 -150 -150 150 0 -150 150 f\nX ~ 2 300 0 150 L 50 50 1 0 O I\nX ~ 3 -300 0 150 R 50 50 1 0 I\nX ~ 4 300 0 150 L 50 50 2 0 O I\nX ~ 5 -300 0 150 R 50 50 2 0 I\nX ~ 6 300 0 150 L 50 50 3 0 O I\nX ~ 7 -300 0 150 R 50 50 3 0 I\nX ~ 10 300 0 150 L 50 50 4 0 O I\nX ~ 9 -300 0 150 R 50 50 4 0 I\nX ~ 11 -300 0 150 R 50 50 5 0 I\nX ~ 12 300 0 150 L 50 50 5 0 O I\nX ~ 14 -300 0 150 R 50 50 6 0 I\nX ~ 15 300 0 150 L 50 50 6 0 O I\nX VDD 16 -100 500 200 D 50 50 7 0 W\nX VCC 1 100 500 200 D 50 50 7 0 W\nX VSS 8 0 -500 200 U 50 50 7 0 W\nENDDRAW\nENDDEF\n#\n# 4010\n#\nDEF 4010 U 0 40 Y Y 7 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4010\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -200 300 200 -300 7 1 10 f\nP 4 1 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 2 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 3 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 4 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 5 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 6 0 10 -150 150 -150 -150 150 0 -150 150 f\nX ~ 2 300 0 150 L 50 50 1 0 O\nX ~ 3 -300 0 150 R 50 50 1 0 I\nX ~ 4 300 0 150 L 50 50 2 0 O\nX ~ 5 -300 0 150 R 50 50 2 0 I\nX ~ 6 300 0 150 L 50 50 3 0 O\nX ~ 7 -300 0 150 R 50 50 3 0 I\nX ~ 10 300 0 150 L 50 50 4 0 O\nX ~ 9 -300 0 150 R 50 50 4 0 I\nX ~ 11 -300 0 150 R 50 50 5 0 I\nX ~ 12 300 0 150 L 50 50 5 0 O\nX ~ 14 -300 0 150 R 50 50 6 0 I\nX ~ 15 300 0 150 L 50 50 6 0 O\nX VDD 16 -100 500 200 D 50 50 7 0 W\nX VCC 1 100 500 200 D 50 50 7 0 W\nX VSS 8 0 -500 200 U 50 50 7 0 W\nENDDRAW\nENDDEF\n#\n# 40106\n#\nDEF 40106 U 0 40 Y Y 7 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"40106\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nS -200 300 200 -300 7 1 10 f\nP 3 1 0 0 -25 -50 -25 50 25 50 N\nP 4 1 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 1 0 0 -50 -50 25 -50 25 50 50 50 N\nP 3 2 0 0 -25 -50 -25 50 25 50 N\nP 4 2 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 2 0 0 -50 -50 25 -50 25 50 50 50 N\nP 3 3 0 0 -25 -50 -25 50 25 50 N\nP 4 3 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 3 0 0 -50 -50 25 -50 25 50 50 50 N\nP 3 4 0 0 -25 -50 -25 50 25 50 N\nP 4 4 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 4 0 0 -50 -50 25 -50 25 50 50 50 N\nP 3 5 0 0 -25 -50 -25 50 25 50 N\nP 4 5 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 5 0 0 -50 -50 25 -50 25 50 50 50 N\nP 3 6 0 0 -25 -50 -25 50 25 50 N\nP 4 6 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 6 0 0 -50 -50 25 -50 25 50 50 50 N\nX ~ 1 -300 0 150 R 50 50 1 0 I\nX ~ 2 300 0 150 L 50 50 1 0 O I\nX ~ 3 -300 0 150 R 50 50 2 0 I\nX ~ 4 300 0 150 L 50 50 2 0 O I\nX ~ 5 -300 0 150 R 50 50 3 0 I\nX ~ 6 300 0 150 L 50 50 3 0 O I\nX ~ 8 300 0 150 L 50 50 4 0 O I\nX ~ 9 -300 0 150 R 50 50 4 0 I\nX ~ 10 300 0 150 L 50 50 5 0 O I\nX ~ 11 -300 0 150 R 50 50 5 0 I\nX ~ 12 300 0 150 L 50 50 6 0 O I\nX ~ 13 -300 0 150 R 50 50 6 0 I\nX VDD 14 0 500 200 D 50 50 7 0 W\nX VSS 7 0 -500 200 U 50 50 7 0 W\nENDDRAW\nENDDEF\n#\n# 4011\n#\nDEF 4011 U 0 40 Y Y 5 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4011\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA 0 0 150 -899 899 1 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 2 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 3 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 4 1 10 f 0 -150 0 150\nA -360 0 258 354 -354 1 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 1 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 1 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 2 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 2 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 2 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 3 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 3 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 3 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 4 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 4 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 4 2 10 f 150 0 -24 -150\nS -200 300 200 -300 5 1 10 f\nP 4 1 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 2 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 3 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 4 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 2 1 2 10 -150 -150 -25 -150 f\nP 2 1 2 10 -150 150 -25 150 f\nP 12 1 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 2 2 10 -150 -150 -25 -150 f\nP 2 2 2 10 -150 150 -25 150 f\nP 12 2 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 3 2 10 -150 -150 -25 -150 f\nP 2 3 2 10 -150 150 -25 150 f\nP 12 3 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 4 2 10 -150 -150 -25 -150 f\nP 2 4 2 10 -150 150 -25 150 f\nP 12 4 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nX VDD 14 0 500 200 D 50 50 5 0 W\nX VSS 7 0 -500 200 U 50 50 5 0 W\nX ~ 1 -300 100 150 R 50 50 1 1 I\nX ~ 2 -300 -100 150 R 50 50 1 1 I\nX ~ 3 300 0 150 L 50 50 1 1 O I\nX ~ 4 300 0 150 L 50 50 2 1 O I\nX ~ 5 -300 100 150 R 50 50 2 1 I\nX ~ 6 -300 -100 150 R 50 50 2 1 I\nX ~ 10 300 0 150 L 50 50 3 1 O I\nX ~ 8 -300 100 150 R 50 50 3 1 I\nX ~ 9 -300 -100 150 R 50 50 3 1 I\nX ~ 11 300 0 150 L 50 50 4 1 O I\nX ~ 12 -300 100 150 R 50 50 4 1 I\nX ~ 13 -300 -100 150 R 50 50 4 1 I\nX ~ 1 -300 100 170 R 50 50 1 2 I I\nX ~ 2 -300 -100 170 R 50 50 1 2 I I\nX ~ 3 300 0 150 L 50 50 1 2 O\nX ~ 4 300 0 150 L 50 50 2 2 O\nX ~ 5 -300 100 170 R 50 50 2 2 I I\nX ~ 6 -300 -100 170 R 50 50 2 2 I I\nX ~ 10 300 0 150 L 50 50 3 2 O\nX ~ 8 -300 100 170 R 50 50 3 2 I I\nX ~ 9 -300 -100 170 R 50 50 3 2 I I\nX ~ 11 300 0 150 L 50 50 4 2 O\nX ~ 12 -300 100 170 R 50 50 4 2 I I\nX ~ 13 -300 -100 170 R 50 50 4 2 I I\nENDDRAW\nENDDEF\n#\n# 4012\n#\nDEF 4012 U 0 40 Y Y 3 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4012\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA -25 0 175 -899 899 1 1 10 f -25 -175 -25 175\nA -25 0 175 -899 899 2 1 10 f -25 -175 -25 175\nA -445 0 343 306 -306 1 2 10 N -150 175 -150 -175\nA -81 -56 238 137 768 1 2 10 f 150 0 -24 175\nA -81 56 238 -137 -768 1 2 10 f 150 0 -24 -175\nA -445 0 343 306 -306 2 2 10 N -150 175 -150 -175\nA -81 -56 238 137 768 2 2 10 f 150 0 -24 175\nA -81 56 238 -137 -768 2 2 10 f 150 0 -24 -175\nS -200 300 200 -300 3 1 10 f\nP 4 1 1 10 -25 175 -150 175 -150 -175 -25 -175 f\nP 4 2 1 10 -25 175 -150 175 -150 -175 -25 -175 f\nP 2 1 2 10 -150 -175 -25 -175 f\nP 2 1 2 10 -150 175 -25 175 f\nP 13 1 2 -1000 -25 175 -150 175 -150 175 -143 161 -122 115 -109 66 -103 17 -104 -34 -113 -83 -128 -131 -150 -175 -150 -175 -25 -175 f\nP 2 2 2 10 -150 -175 -25 -175 f\nP 2 2 2 10 -150 175 -25 175 f\nP 13 2 2 -1000 -25 175 -150 175 -150 175 -143 161 -122 115 -109 66 -103 17 -104 -34 -113 -83 -128 -131 -150 -175 -150 -175 -25 -175 f\nX VDD 14 0 500 200 D 50 50 3 0 W\nX VSS 7 0 -500 200 U 50 50 3 0 W\nX ~ 1 300 0 150 L 50 50 1 1 O I\nX ~ 2 -300 150 150 R 50 50 1 1 I\nX ~ 3 -300 50 150 R 50 50 1 1 I\nX ~ 4 -300 -50 150 R 50 50 1 1 I\nX ~ 5 -300 -150 150 R 50 50 1 1 I\nX ~ 10 -300 50 150 R 50 50 2 1 I\nX ~ 11 -300 -50 150 R 50 50 2 1 I\nX ~ 12 -300 -150 150 R 50 50 2 1 I\nX ~ 13 300 0 150 L 50 50 2 1 O I\nX ~ 9 -300 150 150 R 50 50 2 1 I\nX ~ 1 300 0 150 L 50 50 1 2 O\nX ~ 2 -300 150 150 R 50 50 1 2 I I\nX ~ 3 -300 50 190 R 50 50 1 2 I I\nX ~ 4 -300 -50 190 R 50 50 1 2 I I\nX ~ 5 -300 -150 150 R 50 50 1 2 I I\nX ~ 10 -300 50 190 R 50 50 2 2 I I\nX ~ 11 -300 -50 190 R 50 50 2 2 I I\nX ~ 12 -300 -150 150 R 50 50 2 2 I I\nX ~ 13 300 0 150 L 50 50 2 2 O\nX ~ 9 -300 150 150 R 50 50 2 2 I I\nENDDRAW\nENDDEF\n#\n# 4013\n#\nDEF 4013 U 0 40 Y Y 3 L N\nF0 \"U\" -300 350 50 H V C CNN\nF1 \"4013\" -300 -350 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*W7.62mm*\n SOIC*3.9x9.9mm*P1.27mm*\n TSSOP*4.4x5mm*P0.65mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 1 1 10 f\nS -200 200 200 -200 2 1 10 f\nS -200 300 200 -300 3 1 10 f\nX VDD 14 0 400 100 D 50 50 3 0 W\nX VSS 7 0 -400 100 U 50 50 3 0 W\nX Q 1 300 100 100 L 50 50 1 1 O\nX ~Q 2 300 -100 100 L 50 50 1 1 O\nX C 3 -300 0 100 R 50 50 1 1 I C\nX R 4 0 -300 100 U 50 50 1 1 I\nX D 5 -300 100 100 R 50 50 1 1 I\nX S 6 0 300 100 D 50 50 1 1 I\nX R 10 0 -300 100 U 50 50 2 1 I\nX C 11 -300 0 100 R 50 50 2 1 I C\nX ~Q 12 300 -100 100 L 50 50 2 1 O\nX Q 13 300 100 100 L 50 50 2 1 O\nX S 8 0 300 100 D 50 50 2 1 I\nX D 9 -300 100 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# 4016\n#\nDEF 4016 U 0 40 Y Y 5 L N\nF0 \"U\" -300 350 50 H V C CNN\nF1 \"4016\" -300 -350 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS 4066\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nS -200 300 200 -300 5 1 10 f\nP 2 1 0 6 0 50 0 100 N\nP 4 1 0 0 -100 0 100 100 100 -100 -100 0 f\nP 4 1 0 0 -100 100 100 0 -100 -100 -100 100 f\nP 2 2 0 6 0 50 0 100 N\nP 4 2 0 0 -100 0 100 100 100 -100 -100 0 f\nP 4 2 0 0 -100 100 100 0 -100 -100 -100 100 f\nP 2 3 0 6 0 50 0 100 N\nP 4 3 0 0 -100 0 100 100 100 -100 -100 0 f\nP 4 3 0 0 -100 100 100 0 -100 -100 -100 100 f\nP 2 4 0 6 0 50 0 100 N\nP 4 4 0 0 -100 0 100 100 100 -100 -100 0 f\nP 4 4 0 0 -100 100 100 0 -100 -100 -100 100 f\nX ~ 1 -300 0 200 R 50 50 1 0 P\nX ~ 13 0 300 200 D 50 50 1 0 I\nX ~ 2 300 0 200 L 50 50 1 0 P\nX ~ 3 300 0 200 L 50 50 2 0 P\nX ~ 4 -300 0 200 R 50 50 2 0 P\nX ~ 5 0 300 200 D 50 50 2 0 I\nX ~ 6 0 300 200 D 50 50 3 0 I\nX ~ 8 -300 0 200 R 50 50 3 0 P\nX ~ 9 300 0 200 L 50 50 3 0 P\nX ~ 10 300 0 200 L 50 50 4 0 P\nX ~ 11 -300 0 200 R 50 50 4 0 P\nX ~ 12 0 300 200 D 50 50 4 0 I\nX VDD 14 0 500 200 D 50 50 5 0 W\nX VSS 7 0 -500 200 U 50 50 5 0 W\nENDDRAW\nENDDEF\n#\n# 4017\n#\nDEF 4017 U 0 40 Y Y 1 L N\nF0 \"U\" -300 650 50 H V C CNN\nF1 \"4017\" -300 -750 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 600 300 -700 1 1 10 f\nX Q5 1 500 0 200 L 50 50 1 0 O\nX Q4 10 500 100 200 L 50 50 1 0 O\nX Q9 11 500 -400 200 L 50 50 1 0 O\nX Cout 12 500 -600 200 L 50 50 1 0 O\nX CKEN 13 -500 400 200 R 50 50 1 0 I I\nX CLK 14 -500 500 200 R 50 50 1 0 I C\nX Reset 15 -500 200 200 R 50 50 1 0 I\nX VDD 16 0 800 200 D 50 50 1 0 W\nX Q1 2 500 400 200 L 50 50 1 0 O\nX Q0 3 500 500 200 L 50 50 1 0 O\nX Q2 4 500 300 200 L 50 50 1 0 O\nX Q6 5 500 -100 200 L 50 50 1 0 O\nX Q7 6 500 -200 200 L 50 50 1 0 O\nX Q3 7 500 200 200 L 50 50 1 0 O\nX VSS 8 0 -900 200 U 50 50 1 0 W\nX Q8 9 500 -300 200 L 50 50 1 0 O\nENDDRAW\nENDDEF\n#\n# 4020\n#\nDEF 4020 U 0 40 Y Y 1 L N\nF0 \"U\" -300 650 50 H V C CNN\nF1 \"4020\" -300 -750 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 600 300 -700 1 1 10 f\nX Q11 1 500 -400 200 L 50 50 1 0 O\nX CLK 10 -500 500 200 R 50 50 1 0 I IC\nX Reset 11 -500 300 200 R 50 50 1 0 I\nX Q8 12 500 -100 200 L 50 50 1 0 O\nX Q7 13 500 0 200 L 50 50 1 0 O\nX Q9 14 500 -200 200 L 50 50 1 0 O\nX Q10 15 500 -300 200 L 50 50 1 0 O\nX VDD 16 0 800 200 D 50 50 1 0 W\nX Q12 2 500 -500 200 L 50 50 1 0 O\nX Q13 3 500 -600 200 L 50 50 1 0 O\nX Q5 4 500 200 200 L 50 50 1 0 O\nX Q4 5 500 300 200 L 50 50 1 0 O\nX Q6 6 500 100 200 L 50 50 1 0 O\nX Q3 7 500 400 200 L 50 50 1 0 O\nX VSS 8 0 -900 200 U 50 50 1 0 W\nX Q0 9 500 500 200 L 50 50 1 0 O\nENDDRAW\nENDDEF\n#\n# 4021\n#\nDEF 4021 U 0 20 Y Y 1 F N\nF0 \"U\" -200 750 50 H V C CNN\nF1 \"4021\" 150 750 50 H V C CNN\nF2 \"\" 0 150 50 H I C CNN\nF3 \"\" 0 150 50 H I C CNN\n$FPLIST\n DIP*W7.62mm*\n SOIC*3.9x9.9mm*P1.27mm*\n TSSOP*4.4x5mm*P0.65mm*\n SOIC*5.3x10.2mm*P1.27mm*\n$ENDFPLIST\nDRAW\nS -300 700 300 -700 0 1 10 f\nX D7 1 -400 -600 100 R 50 50 1 1 I\nX CP 10 -400 600 100 R 50 50 1 1 I\nX DS 11 -400 300 100 R 50 50 1 1 I\nX Q6 12 400 500 100 L 50 50 1 1 O\nX D4 13 -400 -300 100 R 50 50 1 1 I\nX D5 14 -400 -400 100 R 50 50 1 1 I\nX D6 15 -400 -500 100 R 50 50 1 1 I\nX VDD 16 0 800 100 D 50 50 1 1 W\nX Q5 2 400 600 100 L 50 50 1 1 O\nX Q7 3 400 400 100 L 50 50 1 1 O\nX D3 4 -400 -200 100 R 50 50 1 1 I\nX D2 5 -400 -100 100 R 50 50 1 1 I\nX D1 6 -400 0 100 R 50 50 1 1 I\nX D0 7 -400 100 100 R 50 50 1 1 I\nX VSS 8 0 -800 100 U 50 50 1 1 W\nX PL 9 -400 400 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# 4022\n#\nDEF 4022 U 0 40 Y Y 1 L N\nF0 \"U\" -300 550 50 H V C CNN\nF1 \"4022\" -300 -650 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 500 300 -600 1 1 10 f\nX Q1 1 500 300 200 L 50 50 1 0 O\nX Q7 10 500 -300 200 L 50 50 1 0 O\nX Q4 11 500 0 200 L 50 50 1 0 O\nX Cout 12 500 -500 200 L 50 50 1 0 O\nX CKEN 13 -500 300 200 R 50 50 1 0 I I\nX CLK 14 -500 400 200 R 50 50 1 0 I C\nX Reset 15 -500 100 200 R 50 50 1 0 I\nX VDD 16 0 700 200 D 50 50 1 0 W\nX Q0 2 500 400 200 L 50 50 1 0 O\nX Q2 3 500 200 200 L 50 50 1 0 O\nX Q5 4 500 -100 200 L 50 50 1 0 O\nX Q6 5 500 -200 200 L 50 50 1 0 O\nX Q3 7 500 100 200 L 50 50 1 0 O\nX VSS 8 0 -800 200 U 50 50 1 0 W\nENDDRAW\nENDDEF\n#\n# 4023\n#\nDEF 4023 U 0 40 Y Y 4 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4023\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA 0 0 150 -899 899 1 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 2 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 3 1 10 f 0 -150 0 150\nA -360 0 258 354 -354 1 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 1 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 1 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 2 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 2 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 2 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 3 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 3 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 3 2 10 f 150 0 -24 -150\nS -200 300 200 -300 4 1 10 f\nP 4 1 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 2 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 3 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 2 1 2 10 -150 -150 -25 -150 f\nP 2 1 2 10 -150 150 -25 150 f\nP 12 1 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 2 2 10 -150 -150 -25 -150 f\nP 2 2 2 10 -150 150 -25 150 f\nP 12 2 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 3 2 10 -150 -150 -25 -150 f\nP 2 3 2 10 -150 150 -25 150 f\nP 12 3 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nX VDD 14 0 500 200 D 50 50 4 0 W\nX VSS 7 0 -500 200 U 50 50 4 0 W\nX ~ 1 -300 100 150 R 50 50 1 1 I\nX ~ 2 -300 0 150 R 50 50 1 1 I\nX ~ 8 -300 -100 150 R 50 50 1 1 I\nX ~ 9 300 0 150 L 50 50 1 1 O I\nX ~ 3 -300 100 150 R 50 50 2 1 I\nX ~ 4 -300 0 150 R 50 50 2 1 I\nX ~ 5 -300 -100 150 R 50 50 2 1 I\nX ~ 6 300 0 150 L 50 50 2 1 O I\nX ~ 10 300 0 150 L 50 50 3 1 O I\nX ~ 11 -300 100 150 R 50 50 3 1 I\nX ~ 12 -300 0 150 R 50 50 3 1 I\nX ~ 13 -300 -100 150 R 50 50 3 1 I\nX ~ 1 -300 100 170 R 50 50 1 2 I I\nX ~ 2 -300 0 195 R 50 50 1 2 I I\nX ~ 8 -300 -100 170 R 50 50 1 2 I I\nX ~ 9 300 0 150 L 50 50 1 2 O\nX ~ 3 -300 100 170 R 50 50 2 2 I I\nX ~ 4 -300 0 195 R 50 50 2 2 I I\nX ~ 5 -300 -100 170 R 50 50 2 2 I I\nX ~ 6 300 0 150 L 50 50 2 2 O\nX ~ 10 300 0 150 L 50 50 3 2 O\nX ~ 11 -300 100 170 R 50 50 3 2 I I\nX ~ 12 -300 0 195 R 50 50 3 2 I I\nX ~ 13 -300 -100 170 R 50 50 3 2 I I\nENDDRAW\nENDDEF\n#\n# 4025\n#\nDEF 4025 U 0 40 Y Y 4 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4025\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA -360 0 258 354 -354 1 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 1 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 1 1 10 f 150 0 -24 -150\nA -360 0 258 354 -354 2 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 2 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 2 1 10 f 150 0 -24 -150\nA -360 0 258 354 -354 3 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 3 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 3 1 10 f 150 0 -24 -150\nA 0 0 150 -899 899 1 2 10 f 0 -150 0 150\nA 0 0 150 -899 899 2 2 10 f 0 -150 0 150\nA 0 0 150 -899 899 3 2 10 f 0 -150 0 150\nS -200 300 200 -300 4 1 10 f\nP 2 1 1 10 -150 -150 -25 -150 f\nP 2 1 1 10 -150 150 -25 150 f\nP 12 1 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 2 1 10 -150 -150 -25 -150 f\nP 2 2 1 10 -150 150 -25 150 f\nP 12 2 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 3 1 10 -150 -150 -25 -150 f\nP 2 3 1 10 -150 150 -25 150 f\nP 12 3 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 4 1 2 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 2 2 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 3 2 10 0 150 -150 150 -150 -150 0 -150 f\nX VDD 14 0 500 200 D 50 50 4 0 W\nX VSS 7 0 -500 200 U 50 50 4 0 W\nX ~ 1 -300 100 170 R 50 50 1 1 I\nX ~ 2 -300 0 195 R 50 50 1 1 I\nX ~ 8 -300 -100 170 R 50 50 1 1 I\nX ~ 9 300 0 150 L 50 50 1 1 O I\nX ~ 3 -300 100 170 R 50 50 2 1 I\nX ~ 4 -300 0 195 R 50 50 2 1 I\nX ~ 5 -300 -100 170 R 50 50 2 1 I\nX ~ 6 300 0 150 L 50 50 2 1 O I\nX ~ 10 300 0 150 L 50 50 3 1 O I\nX ~ 11 -300 100 170 R 50 50 3 1 I\nX ~ 12 -300 0 195 R 50 50 3 1 I\nX ~ 13 -300 -100 170 R 50 50 3 1 I\nX ~ 1 -300 100 150 R 50 50 1 2 I I\nX ~ 2 -300 0 150 R 50 50 1 2 I I\nX ~ 8 -300 -100 150 R 50 50 1 2 I I\nX ~ 9 300 0 150 L 50 50 1 2 O\nX ~ 3 -300 100 150 R 50 50 2 2 I I\nX ~ 4 -300 0 150 R 50 50 2 2 I I\nX ~ 5 -300 -100 150 R 50 50 2 2 I I\nX ~ 6 300 0 150 L 50 50 2 2 O\nX ~ 10 300 0 150 L 50 50 3 2 O\nX ~ 11 -300 100 150 R 50 50 3 2 I I\nX ~ 12 -300 0 150 R 50 50 3 2 I I\nX ~ 13 -300 -100 150 R 50 50 3 2 I I\nENDDRAW\nENDDEF\n#\n# 4027\n#\nDEF 4027 U 0 40 Y Y 3 L N\nF0 \"U\" -300 350 50 H V C CNN\nF1 \"4027\" -300 -350 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*W7.62mm*\n SOIC*3.9x9.9mm*P1.27mm*\n TSSOP*4.4x5mm*P0.65mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 1 1 10 f\nS -200 200 200 -200 2 1 10 f\nS -200 300 200 -300 3 1 10 f\nX VDD 16 0 400 100 D 50 50 3 0 W\nX VSS 8 0 -400 100 U 50 50 3 0 W\nX Q 1 300 100 100 L 50 50 1 1 O\nX ~Q 2 300 -100 100 L 50 50 1 1 O\nX C 3 -300 0 100 R 50 50 1 1 I C\nX R 4 0 -300 100 U 50 50 1 1 I\nX K 5 -300 -100 100 R 50 50 1 1 I\nX J 6 -300 100 100 R 50 50 1 1 I\nX S 7 0 300 100 D 50 50 1 1 I\nX J 10 -300 100 100 R 50 50 2 1 I\nX K 11 -300 -100 100 R 50 50 2 1 I\nX R 12 0 -300 100 U 50 50 2 1 I\nX C 13 -300 0 100 R 50 50 2 1 I C\nX ~Q 14 300 -100 100 L 50 50 2 1 O\nX Q 15 300 100 100 L 50 50 2 1 O\nX S 9 0 300 100 D 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# 4028\n#\nDEF 4028 U 0 40 Y Y 1 L N\nF0 \"U\" -300 550 50 H V C CNN\nF1 \"4028\" -300 -650 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 500 300 -600 1 1 10 f\nX S4 1 500 0 200 L 50 50 1 0 O\nX A 10 -500 200 200 R 50 50 1 0 I\nX D 11 -500 -100 200 R 50 50 1 0 I\nX C 12 -500 0 200 R 50 50 1 0 I\nX B 13 -500 100 200 R 50 50 1 0 I\nX S1 14 500 300 200 L 50 50 1 0 O\nX S3 15 500 100 200 L 50 50 1 0 O\nX VDD 16 0 700 200 D 50 50 1 0 W\nX S2 2 500 200 200 L 50 50 1 0 O\nX S0 3 500 400 200 L 50 50 1 0 O\nX S7 4 500 -300 200 L 50 50 1 0 O\nX S9 5 500 -500 200 L 50 50 1 0 O\nX S5 6 500 -100 200 L 50 50 1 0 O\nX S6 7 500 -200 200 L 50 50 1 0 O\nX VSS 8 0 -800 200 U 50 50 1 0 W\nX S8 9 500 -400 200 L 50 50 1 0 O\nENDDRAW\nENDDEF\n#\n# 4029\n#\nDEF 4029 U 0 40 Y Y 1 L N\nF0 \"U\" -300 650 50 H V C CNN\nF1 \"4029\" -300 -750 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 600 300 -700 1 1 10 f\nX PE 1 -500 -600 200 R 50 50 1 0 I\nX U/D 10 500 -100 200 L 50 50 1 0 I\nX Q2 11 500 400 200 L 50 50 1 0 O\nX J2 12 -500 200 200 R 50 50 1 0 I\nX J3 13 -500 100 200 R 50 50 1 0 I\nX Q3 14 500 300 200 L 50 50 1 0 O\nX CK 15 -500 500 200 R 50 50 1 0 I IC\nX VDD 16 0 800 200 D 50 50 1 0 W\nX Q4 2 500 200 200 L 50 50 1 0 O\nX J4 3 -500 0 200 R 50 50 1 0 I\nX J1 4 -500 300 200 R 50 50 1 0 I\nX Cin 5 -500 -200 200 R 50 50 1 0 I\nX Q1 6 500 500 200 L 50 50 1 0 O\nX Cout 7 500 -300 200 L 50 50 1 0 O\nX VSS 8 0 -900 200 U 50 50 1 0 W\nX B/D 9 500 -200 200 L 50 50 1 0 I\nENDDRAW\nENDDEF\n#\n# 4040\n#\nDEF 4040 U 0 40 Y Y 1 L N\nF0 \"U\" -300 650 50 H V C CNN\nF1 \"4040\" -300 -750 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 600 300 -700 1 1 10 f\nX Q11 1 500 -600 200 L 50 50 1 0 O\nX CLK 10 -500 500 200 R 50 50 1 0 I IC\nX Reset 11 -500 200 200 R 50 50 1 0 I\nX Q8 12 500 -300 200 L 50 50 1 0 O\nX Q7 13 500 -200 200 L 50 50 1 0 O\nX Q9 14 500 -400 200 L 50 50 1 0 O\nX Q10 15 500 -500 200 L 50 50 1 0 O\nX VDD 16 0 800 200 D 50 50 1 0 W\nX Q5 2 500 0 200 L 50 50 1 0 O\nX Q4 3 500 100 200 L 50 50 1 0 O\nX Q6 4 500 -100 200 L 50 50 1 0 O\nX Q3 5 500 200 200 L 50 50 1 0 O\nX Q2 6 500 300 200 L 50 50 1 0 O\nX Q1 7 500 400 200 L 50 50 1 0 O\nX VSS 8 0 -900 200 U 50 50 1 0 W\nX Q0 9 500 500 200 L 50 50 1 0 O\nENDDRAW\nENDDEF\n#\n# 4046\n#\nDEF 4046 U 0 40 Y Y 1 L N\nF0 \"U\" -300 550 50 H V C CNN\nF1 \"4046\" -300 -650 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 500 300 -600 1 1 10 f\nX PCP 1 500 -200 200 L 50 50 1 0 O\nX SFout 10 500 -300 200 L 50 50 1 0 O\nX R1 11 -500 -200 200 R 50 50 1 0 I\nX R2 12 -500 -300 200 R 50 50 1 0 I\nX PC2 13 500 200 200 L 50 50 1 0 T\nX RefIn 3 -500 400 200 R 50 50 1 0 I\nX ZOUT 15 500 -400 200 L 50 50 1 0 O\nX VDD 16 0 700 200 D 50 50 1 0 W\nX PC1 2 500 300 200 L 50 50 1 0 O\nX SigIn 14 -500 300 200 R 50 50 1 0 I\nX FOUT 4 500 400 200 L 50 50 1 0 I\nX Inh 5 -500 -500 200 R 50 50 1 0 I\nX C1 6 -500 100 200 R 50 50 1 0 I\nX C2 7 -500 0 200 R 50 50 1 0 I\nX VSS 8 0 -800 200 U 50 50 1 0 W\nX VCOin 9 500 0 200 L 50 50 1 0 I\nENDDRAW\nENDDEF\n#\n# 4047\n#\nDEF 4047 U 0 40 Y Y 1 L N\nF0 \"U\" -300 950 50 H V C CNN\nF1 \"4047\" -300 -950 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*W7.62mm*\n SOIC*3.9x8.7mm*P1.27mm*\n$ENDFPLIST\nDRAW\nS -400 900 400 -900 1 1 10 f\nX C 1 -600 -500 200 R 50 50 1 0 I\nX Q 10 600 300 200 L 50 50 1 0 O\nX ~Q 11 600 100 200 L 50 50 1 0 O\nX RETRIGGER 12 -600 100 200 R 50 50 1 0 I\nX OSC_OUT 13 600 700 200 L 50 50 1 0 O\nX VDD 14 0 1100 200 D 50 50 1 0 W\nX R 2 -600 -300 200 R 50 50 1 0 I\nX RC_COMMON 3 -600 -700 200 R 50 50 1 0 I\nX ~ASTABLE 4 -600 600 200 R 50 50 1 0 I\nX ASTABLE 5 -600 700 200 R 50 50 1 0 I\nX -TRIGGER 6 -600 400 200 R 50 50 1 0 I\nX VSS 7 0 -1100 200 U 50 50 1 0 W\nX +TRIGGER 8 -600 300 200 R 50 50 1 0 I\nX EXT_RESET 9 -600 -100 200 R 50 50 1 0 I\nENDDRAW\nENDDEF\n#\n# 4049\n#\nDEF 4049 U 0 40 Y Y 7 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4049\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -200 300 200 -300 7 1 10 f\nP 4 1 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 2 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 3 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 4 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 5 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 6 0 10 -150 150 -150 -150 150 0 -150 150 f\nX ~ 2 300 0 150 L 50 50 1 0 O I\nX ~ 3 -300 0 150 R 50 50 1 0 I\nX ~ 4 300 0 150 L 50 50 2 0 O I\nX ~ 5 -300 0 150 R 50 50 2 0 I\nX ~ 6 300 0 150 L 50 50 3 0 O I\nX ~ 7 -300 0 150 R 50 50 3 0 I\nX ~ 10 300 0 150 L 50 50 4 0 O I\nX ~ 9 -300 0 150 R 50 50 4 0 I\nX ~ 11 -300 0 150 R 50 50 5 0 I\nX ~ 12 300 0 150 L 50 50 5 0 O I\nX ~ 14 -300 0 150 R 50 50 6 0 I\nX ~ 15 300 0 150 L 50 50 6 0 O I\nX VCC 1 0 500 200 D 50 50 7 0 W\nX VSS 8 0 -500 200 U 50 50 7 0 W\nENDDRAW\nENDDEF\n#\n# 4050\n#\nDEF 4050 U 0 40 Y Y 7 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4050\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -200 300 200 -300 7 1 10 f\nP 4 1 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 2 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 3 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 4 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 5 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 6 0 10 -150 150 -150 -150 150 0 -150 150 f\nX ~ 2 300 0 150 L 50 50 1 0 O\nX ~ 3 -300 0 150 R 50 50 1 0 I\nX ~ 4 300 0 150 L 50 50 2 0 O\nX ~ 5 -300 0 150 R 50 50 2 0 I\nX ~ 6 300 0 150 L 50 50 3 0 O\nX ~ 7 -300 0 150 R 50 50 3 0 I\nX ~ 10 300 0 150 L 50 50 4 0 O\nX ~ 9 -300 0 150 R 50 50 4 0 I\nX ~ 11 -300 0 150 R 50 50 5 0 I\nX ~ 12 300 0 150 L 50 50 5 0 O\nX ~ 14 -300 0 150 R 50 50 6 0 I\nX ~ 15 300 0 150 L 50 50 6 0 O\nX VCC 1 0 500 200 D 50 50 7 0 W\nX VSS 8 0 -500 200 U 50 50 7 0 W\nENDDRAW\nENDDEF\n#\n# 4051\n#\nDEF 4051 U 0 40 Y Y 1 L N\nF0 \"U\" -300 750 50 H V C CNN\nF1 \"4051\" -300 -750 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 700 300 -700 1 1 10 f\nX X4 1 -500 200 200 R 50 50 1 0 P\nX B 10 -500 -500 200 R 50 50 1 0 I\nX A 11 -500 -400 200 R 50 50 1 0 I\nX X3 12 -500 300 200 R 50 50 1 0 P\nX X0 13 -500 600 200 R 50 50 1 0 P\nX X1 14 -500 500 200 R 50 50 1 0 P\nX X2 15 -500 400 200 R 50 50 1 0 P\nX VDD 16 0 900 200 D 50 50 1 0 W\nX X6 2 -500 0 200 R 50 50 1 0 P\nX X 3 500 600 200 L 50 50 1 0 P\nX X7 4 -500 -100 200 R 50 50 1 0 P\nX X5 5 -500 100 200 R 50 50 1 0 P\nX Inh 6 -500 -300 200 R 50 50 1 0 I\nX VEE 7 100 -900 200 U 50 50 1 0 W\nX VSS 8 0 -900 200 U 50 50 1 0 W\nX C 9 -500 -600 200 R 50 50 1 0 I\nENDDRAW\nENDDEF\n#\n# 4052\n#\nDEF 4052 U 0 40 Y Y 1 L N\nF0 \"U\" -300 750 50 H V C CNN\nF1 \"4052\" -300 -750 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 700 300 -700 1 1 10 f\nX Y0 1 -500 200 200 R 50 50 1 0 P\nX A 10 -500 -500 200 R 50 50 1 0 I\nX X3 11 -500 300 200 R 50 50 1 0 P\nX X0 12 -500 600 200 R 50 50 1 0 P\nX X 13 500 600 200 L 50 50 1 0 P\nX X1 14 -500 500 200 R 50 50 1 0 P\nX X2 15 -500 400 200 R 50 50 1 0 P\nX VDD 16 0 900 200 D 50 50 1 0 W\nX Y2 2 -500 0 200 R 50 50 1 0 P\nX Y 3 500 200 200 L 50 50 1 0 P\nX Y3 4 -500 -100 200 R 50 50 1 0 P\nX Y1 5 -500 100 200 R 50 50 1 0 P\nX Inh 6 -500 -300 200 R 50 50 1 0 I\nX VEE 7 100 -900 200 U 50 50 1 0 W\nX VSS 8 0 -900 200 U 50 50 1 0 W\nX B 9 -500 -600 200 R 50 50 1 0 I\nENDDRAW\nENDDEF\n#\n# 4053\n#\nDEF 4053 U 0 40 Y Y 1 L N\nF0 \"U\" -300 750 50 H V C CNN\nF1 \"4053\" -300 -750 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 700 300 -700 1 1 10 f\nX Y1 1 -500 200 200 R 50 50 1 0 P\nX B 10 -500 -500 200 R 50 50 1 0 I\nX A 11 -500 -400 200 R 50 50 1 0 I\nX X0 12 -500 600 200 R 50 50 1 0 P\nX X1 13 -500 500 200 R 50 50 1 0 P\nX X 14 500 600 200 L 50 50 1 0 P\nX Y 15 500 300 200 L 50 50 1 0 P\nX VDD 16 0 900 200 D 50 50 1 0 W\nX Y0 2 -500 300 200 R 50 50 1 0 P\nX Z1 3 -500 -100 200 R 50 50 1 0 P\nX Z 4 500 0 200 L 50 50 1 0 P\nX Z0 5 -500 0 200 R 50 50 1 0 P\nX Inh 6 -500 -300 200 R 50 50 1 0 I\nX VEE 7 100 -900 200 U 50 50 1 0 W\nX VSS 8 0 -900 200 U 50 50 1 0 W\nX C 9 -500 -600 200 R 50 50 1 0 I\nENDDRAW\nENDDEF\n#\n# 4056\n#\nDEF 4056 U 0 40 Y Y 1 L N\nF0 \"U\" -300 550 50 H V C CNN\nF1 \"4056\" -300 -550 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*W7.62mm*\n SOIC*3.9x9.9mm*P1.27mm*\n TSSOP*4.4x5mm*P0.65mm*\n$ENDFPLIST\nDRAW\nS -300 500 300 -500 1 1 10 f\nX STROBE 1 -500 -200 200 R 50 50 1 0 I\nX b 10 500 200 200 L 50 50 1 0 O\nX c 11 500 100 200 L 50 50 1 0 O\nX d 12 500 0 200 L 50 50 1 0 O\nX e 13 500 -100 200 L 50 50 1 0 O\nX g 14 500 -300 200 L 50 50 1 0 O\nX f 15 500 -200 200 L 50 50 1 0 O\nX VDD 16 0 700 200 D 50 50 1 0 W\nX 2^2 2 -500 100 200 R 50 50 1 0 I\nX 2^1 3 -500 200 200 R 50 50 1 0 I\nX 2^3 4 -500 0 200 R 50 50 1 0 I\nX 2^0 5 -500 300 200 R 50 50 1 0 I\nX FREQ.IN 6 -500 -300 200 R 50 50 1 0 I\nX VEE 7 0 -700 200 U 50 50 1 0 W\nX VSS 8 100 -700 200 U 50 50 1 0 W\nX a 9 500 300 200 L 50 50 1 0 O\nENDDRAW\nENDDEF\n#\n# 4069\n#\nDEF 4069 U 0 40 Y Y 7 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4069\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nS -200 300 200 -300 7 1 10 f\nP 4 1 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 2 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 3 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 4 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 5 0 10 -150 150 -150 -150 150 0 -150 150 f\nP 4 6 0 10 -150 150 -150 -150 150 0 -150 150 f\nX ~ 1 -300 0 150 R 50 50 1 0 I\nX ~ 2 300 0 150 L 50 50 1 0 O I\nX ~ 3 -300 0 150 R 50 50 2 0 I\nX ~ 4 300 0 150 L 50 50 2 0 O I\nX ~ 5 -300 0 150 R 50 50 3 0 I\nX ~ 6 300 0 150 L 50 50 3 0 O I\nX ~ 8 300 0 150 L 50 50 4 0 O I\nX ~ 9 -300 0 150 R 50 50 4 0 I\nX ~ 10 300 0 150 L 50 50 5 0 O I\nX ~ 11 -300 0 150 R 50 50 5 0 I\nX ~ 12 300 0 150 L 50 50 6 0 O I\nX ~ 13 -300 0 150 R 50 50 6 0 I\nX VDD 14 0 500 200 D 50 50 7 0 W\nX VSS 7 0 -500 200 U 50 50 7 0 W\nENDDRAW\nENDDEF\n#\n# 4070\n#\nDEF 4070 U 0 40 Y Y 5 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4070\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA -385 0 258 354 -354 1 0 10 N -174 150 -174 -150\nA -360 0 258 354 -354 1 0 10 N -150 150 -150 -150\nA -47 -52 204 150 837 1 0 10 f 150 0 -24 150\nA -47 52 204 -150 -837 1 0 10 f 150 0 -24 -150\nA -385 0 258 354 -354 2 0 10 N -174 150 -174 -150\nA -360 0 258 354 -354 2 0 10 N -150 150 -150 -150\nA -47 -52 204 150 837 2 0 10 f 150 0 -24 150\nA -47 52 204 -150 -837 2 0 10 f 150 0 -24 -150\nA -385 0 258 354 -354 3 0 10 N -174 150 -174 -150\nA -360 0 258 354 -354 3 0 10 N -150 150 -150 -150\nA -47 -52 204 150 837 3 0 10 f 150 0 -24 150\nA -47 52 204 -150 -837 3 0 10 f 150 0 -24 -150\nA -385 0 258 354 -354 4 0 10 N -174 150 -174 -150\nA -360 0 258 354 -354 4 0 10 N -150 150 -150 -150\nA -47 -52 204 150 837 4 0 10 f 150 0 -24 150\nA -47 52 204 -150 -837 4 0 10 f 150 0 -24 -150\nS -200 300 200 -300 5 1 10 f\nP 2 1 0 10 -150 -150 -25 -150 f\nP 2 1 0 10 -150 150 -25 150 f\nP 12 1 0 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 2 0 10 -150 -150 -25 -150 f\nP 2 2 0 10 -150 150 -25 150 f\nP 12 2 0 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 3 0 10 -150 -150 -25 -150 f\nP 2 3 0 10 -150 150 -25 150 f\nP 12 3 0 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 4 0 10 -150 -150 -25 -150 f\nP 2 4 0 10 -150 150 -25 150 f\nP 12 4 0 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 1 1 6 -150 -100 -125 -100 N\nP 2 1 1 6 -150 100 -125 100 N\nP 2 2 1 6 -150 -100 -125 -100 N\nP 2 2 1 6 -150 100 -125 100 N\nP 2 3 1 6 -150 -100 -125 -100 N\nP 2 3 1 6 -150 100 -125 100 N\nP 2 4 1 6 -150 -100 -125 -100 N\nP 2 4 1 6 -150 100 -125 100 N\nX ~ 1 -300 100 175 R 50 50 1 0 I\nX ~ 2 -300 -100 175 R 50 50 1 0 I\nX ~ 3 300 0 150 L 50 50 1 0 O\nX ~ 4 300 0 150 L 50 50 2 0 O\nX ~ 5 -300 100 175 R 50 50 2 0 I\nX ~ 6 -300 -100 175 R 50 50 2 0 I\nX ~ 10 300 0 150 L 50 50 3 0 O\nX ~ 8 -300 100 175 R 50 50 3 0 I\nX ~ 9 -300 -100 175 R 50 50 3 0 I\nX ~ 11 300 0 150 L 50 50 4 0 O\nX ~ 12 -300 100 175 R 50 50 4 0 I\nX ~ 13 -300 -100 175 R 50 50 4 0 I\nX VDD 14 0 500 200 D 50 50 5 0 W\nX VSS 7 0 -500 200 U 50 50 5 0 W\nENDDRAW\nENDDEF\n#\n# 4071\n#\nDEF 4071 U 0 40 Y Y 5 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4071\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA -360 0 258 354 -354 1 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 1 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 1 1 10 f 150 0 -24 -150\nA -360 0 258 354 -354 2 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 2 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 2 1 10 f 150 0 -24 -150\nA -360 0 258 354 -354 3 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 3 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 3 1 10 f 150 0 -24 -150\nA -360 0 258 354 -354 4 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 4 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 4 1 10 f 150 0 -24 -150\nA 0 0 150 -899 899 1 2 10 f 0 -150 0 150\nA 0 0 150 -899 899 2 2 10 f 0 -150 0 150\nA 0 0 150 -899 899 3 2 10 f 0 -150 0 150\nA 0 0 150 -899 899 4 2 10 f 0 -150 0 150\nS -200 300 200 -300 5 1 10 f\nP 2 1 1 10 -150 -150 -25 -150 f\nP 2 1 1 10 -150 150 -25 150 f\nP 12 1 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 2 1 10 -150 -150 -25 -150 f\nP 2 2 1 10 -150 150 -25 150 f\nP 12 2 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 3 1 10 -150 -150 -25 -150 f\nP 2 3 1 10 -150 150 -25 150 f\nP 12 3 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 4 1 10 -150 -150 -25 -150 f\nP 2 4 1 10 -150 150 -25 150 f\nP 12 4 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 4 1 2 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 2 2 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 3 2 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 4 2 10 0 150 -150 150 -150 -150 0 -150 f\nX VDD 14 0 500 200 D 50 50 5 0 W\nX VSS 7 0 -500 200 U 50 50 5 0 W\nX ~ 1 -300 100 170 R 50 50 1 1 I\nX ~ 2 -300 -100 170 R 50 50 1 1 I\nX ~ 3 300 0 150 L 50 50 1 1 O\nX ~ 4 300 0 150 L 50 50 2 1 O\nX ~ 5 -300 100 170 R 50 50 2 1 I\nX ~ 6 -300 -100 170 R 50 50 2 1 I\nX ~ 10 300 0 150 L 50 50 3 1 O\nX ~ 8 -300 100 170 R 50 50 3 1 I\nX ~ 9 -300 -100 170 R 50 50 3 1 I\nX ~ 11 300 0 150 L 50 50 4 1 O\nX ~ 12 -300 100 170 R 50 50 4 1 I\nX ~ 13 -300 -100 170 R 50 50 4 1 I\nX ~ 1 -300 100 150 R 50 50 1 2 I I\nX ~ 2 -300 -100 150 R 50 50 1 2 I I\nX ~ 3 300 0 150 L 50 50 1 2 O I\nX ~ 4 300 0 150 L 50 50 2 2 O I\nX ~ 5 -300 100 150 R 50 50 2 2 I I\nX ~ 6 -300 -100 150 R 50 50 2 2 I I\nX ~ 10 300 0 150 L 50 50 3 2 O I\nX ~ 8 -300 100 150 R 50 50 3 2 I I\nX ~ 9 -300 -100 150 R 50 50 3 2 I I\nX ~ 11 300 0 150 L 50 50 4 2 O I\nX ~ 12 -300 100 150 R 50 50 4 2 I I\nX ~ 13 -300 -100 150 R 50 50 4 2 I I\nENDDRAW\nENDDEF\n#\n# 4072\n#\nDEF 4072 U 0 40 Y Y 3 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4072\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA -445 0 343 306 -306 1 1 10 N -150 175 -150 -175\nA -81 -56 238 137 768 1 1 10 f 150 0 -24 175\nA -81 56 238 -137 -768 1 1 10 f 150 0 -24 -175\nA -445 0 343 306 -306 2 1 10 N -150 175 -150 -175\nA -81 -56 238 137 768 2 1 10 f 150 0 -24 175\nA -81 56 238 -137 -768 2 1 10 f 150 0 -24 -175\nA -25 0 175 -899 899 1 2 10 f -25 -175 -25 175\nA -25 0 175 -899 899 2 2 10 f -25 -175 -25 175\nS -200 300 200 -300 3 1 10 f\nP 2 1 1 10 -150 -175 -25 -175 f\nP 2 1 1 10 -150 175 -25 175 f\nP 13 1 1 -1000 -25 175 -150 175 -150 175 -143 161 -122 115 -109 66 -103 17 -104 -34 -113 -83 -128 -131 -150 -175 -150 -175 -25 -175 f\nP 2 2 1 10 -150 -175 -25 -175 f\nP 2 2 1 10 -150 175 -25 175 f\nP 13 2 1 -1000 -25 175 -150 175 -150 175 -143 161 -122 115 -109 66 -103 17 -104 -34 -113 -83 -128 -131 -150 -175 -150 -175 -25 -175 f\nP 4 1 2 10 -25 175 -150 175 -150 -175 -25 -175 f\nP 4 2 2 10 -25 175 -150 175 -150 -175 -25 -175 f\nX VDD 14 0 500 200 D 50 50 3 0 W\nX VSS 7 0 -500 200 U 50 50 3 0 W\nX ~ 1 300 0 150 L 50 50 1 1 O\nX ~ 2 -300 150 150 R 50 50 1 1 I\nX ~ 3 -300 50 190 R 50 50 1 1 I\nX ~ 4 -300 -50 190 R 50 50 1 1 I\nX ~ 5 -300 -150 150 R 50 50 1 1 I\nX ~ 10 -300 50 190 R 50 50 2 1 I\nX ~ 11 -300 -50 190 R 50 50 2 1 I\nX ~ 12 -300 -150 150 R 50 50 2 1 I\nX ~ 13 300 0 150 L 50 50 2 1 O\nX ~ 9 -300 150 150 R 50 50 2 1 I\nX ~ 1 300 0 150 L 50 50 1 2 O I\nX ~ 2 -300 150 150 R 50 50 1 2 I I\nX ~ 3 -300 50 150 R 50 50 1 2 I I\nX ~ 4 -300 -50 150 R 50 50 1 2 I I\nX ~ 5 -300 -150 150 R 50 50 1 2 I I\nX ~ 10 -300 50 150 R 50 50 2 2 I I\nX ~ 11 -300 -50 150 R 50 50 2 2 I I\nX ~ 12 -300 -150 150 R 50 50 2 2 I I\nX ~ 13 300 0 150 L 50 50 2 2 O I\nX ~ 9 -300 150 150 R 50 50 2 2 I I\nENDDRAW\nENDDEF\n#\n# 4073\n#\nDEF 4073 U 0 40 Y Y 4 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4073\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA 0 0 150 -899 899 1 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 2 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 3 1 10 f 0 -150 0 150\nA -360 0 258 354 -354 1 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 1 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 1 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 2 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 2 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 2 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 3 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 3 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 3 2 10 f 150 0 -24 -150\nS -200 300 200 -300 4 1 10 f\nP 4 1 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 2 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 3 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 2 1 2 10 -150 -150 -25 -150 f\nP 2 1 2 10 -150 150 -25 150 f\nP 12 1 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 2 2 10 -150 -150 -25 -150 f\nP 2 2 2 10 -150 150 -25 150 f\nP 12 2 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 3 2 10 -150 -150 -25 -150 f\nP 2 3 2 10 -150 150 -25 150 f\nP 12 3 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nX VDD 14 0 500 200 D 50 50 4 0 W\nX VSS 7 0 -500 200 U 50 50 4 0 W\nX ~ 1 -300 100 150 R 50 50 1 1 I\nX ~ 2 -300 0 150 R 50 50 1 1 I\nX ~ 8 -300 -100 150 R 50 50 1 1 I\nX ~ 9 300 0 150 L 50 50 1 1 O\nX ~ 3 -300 100 150 R 50 50 2 1 I\nX ~ 4 -300 0 150 R 50 50 2 1 I\nX ~ 5 -300 -100 150 R 50 50 2 1 I\nX ~ 6 300 0 150 L 50 50 2 1 O\nX ~ 10 300 0 150 L 50 50 3 1 O\nX ~ 11 -300 100 150 R 50 50 3 1 I\nX ~ 12 -300 0 150 R 50 50 3 1 I\nX ~ 13 -300 -100 150 R 50 50 3 1 I\nX ~ 1 -300 100 170 R 50 50 1 2 I I\nX ~ 2 -300 0 195 R 50 50 1 2 I I\nX ~ 8 -300 -100 170 R 50 50 1 2 I I\nX ~ 9 300 0 150 L 50 50 1 2 O I\nX ~ 3 -300 100 170 R 50 50 2 2 I I\nX ~ 4 -300 0 195 R 50 50 2 2 I I\nX ~ 5 -300 -100 170 R 50 50 2 2 I I\nX ~ 6 300 0 150 L 50 50 2 2 O I\nX ~ 10 300 0 150 L 50 50 3 2 O I\nX ~ 11 -300 100 170 R 50 50 3 2 I I\nX ~ 12 -300 0 195 R 50 50 3 2 I I\nX ~ 13 -300 -100 170 R 50 50 3 2 I I\nENDDRAW\nENDDEF\n#\n# 4075\n#\nDEF 4075 U 0 40 Y Y 4 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4075\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA -360 0 258 354 -354 1 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 1 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 1 1 10 f 150 0 -24 -150\nA -360 0 258 354 -354 2 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 2 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 2 1 10 f 150 0 -24 -150\nA -360 0 258 354 -354 3 1 10 N -150 150 -150 -150\nA -47 -52 204 150 837 3 1 10 f 150 0 -24 150\nA -47 52 204 -150 -837 3 1 10 f 150 0 -24 -150\nA 0 0 150 -899 899 1 2 10 f 0 -150 0 150\nA 0 0 150 -899 899 2 2 10 f 0 -150 0 150\nA 0 0 150 -899 899 3 2 10 f 0 -150 0 150\nS -200 300 200 -300 4 1 10 f\nP 2 1 1 10 -150 -150 -25 -150 f\nP 2 1 1 10 -150 150 -25 150 f\nP 12 1 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 2 1 10 -150 -150 -25 -150 f\nP 2 2 1 10 -150 150 -25 150 f\nP 12 2 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 3 1 10 -150 -150 -25 -150 f\nP 2 3 1 10 -150 150 -25 150 f\nP 12 3 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 4 1 2 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 2 2 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 3 2 10 0 150 -150 150 -150 -150 0 -150 f\nX VDD 14 0 500 200 D 50 50 4 0 W\nX VSS 7 0 -500 200 U 50 50 4 0 W\nX ~ 1 -300 100 170 R 50 50 1 1 I\nX ~ 2 -300 0 195 R 50 50 1 1 I\nX ~ 8 -300 -100 170 R 50 50 1 1 I\nX ~ 9 300 0 150 L 50 50 1 1 O\nX ~ 3 -300 100 170 R 50 50 2 1 I\nX ~ 4 -300 0 195 R 50 50 2 1 I\nX ~ 5 -300 -100 170 R 50 50 2 1 I\nX ~ 6 300 0 150 L 50 50 2 1 O\nX ~ 10 300 0 150 L 50 50 3 1 O\nX ~ 11 -300 100 170 R 50 50 3 1 I\nX ~ 12 -300 0 195 R 50 50 3 1 I\nX ~ 13 -300 -100 170 R 50 50 3 1 I\nX ~ 1 -300 100 150 R 50 50 1 2 I I\nX ~ 2 -300 0 150 R 50 50 1 2 I I\nX ~ 8 -300 -100 150 R 50 50 1 2 I I\nX ~ 9 300 0 150 L 50 50 1 2 O I\nX ~ 3 -300 100 150 R 50 50 2 2 I I\nX ~ 4 -300 0 150 R 50 50 2 2 I I\nX ~ 5 -300 -100 150 R 50 50 2 2 I I\nX ~ 6 300 0 150 L 50 50 2 2 O I\nX ~ 10 300 0 150 L 50 50 3 2 O I\nX ~ 11 -300 100 150 R 50 50 3 2 I I\nX ~ 12 -300 0 150 R 50 50 3 2 I I\nX ~ 13 -300 -100 150 R 50 50 3 2 I I\nENDDRAW\nENDDEF\n#\n# 4077\n#\nDEF 4077 U 0 40 Y Y 5 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4077\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA -385 0 258 354 -354 1 0 10 N -174 150 -174 -150\nA -360 0 258 354 -354 1 0 10 N -150 150 -150 -150\nA -47 -52 204 150 837 1 0 10 f 150 0 -24 150\nA -47 52 204 -150 -837 1 0 10 f 150 0 -24 -150\nA -385 0 258 354 -354 2 0 10 N -174 150 -174 -150\nA -360 0 258 354 -354 2 0 10 N -150 150 -150 -150\nA -47 -52 204 150 837 2 0 10 f 150 0 -24 150\nA -47 52 204 -150 -837 2 0 10 f 150 0 -24 -150\nA -385 0 258 354 -354 3 0 10 N -174 150 -174 -150\nA -360 0 258 354 -354 3 0 10 N -150 150 -150 -150\nA -47 -52 204 150 837 3 0 10 f 150 0 -24 150\nA -47 52 204 -150 -837 3 0 10 f 150 0 -24 -150\nA -385 0 258 354 -354 4 0 10 N -174 150 -174 -150\nA -360 0 258 354 -354 4 0 10 N -150 150 -150 -150\nA -47 -52 204 150 837 4 0 10 f 150 0 -24 150\nA -47 52 204 -150 -837 4 0 10 f 150 0 -24 -150\nS -200 300 200 -300 5 1 10 f\nP 2 1 0 10 -150 -150 -25 -150 f\nP 2 1 0 10 -150 150 -25 150 f\nP 12 1 0 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 2 0 10 -150 -150 -25 -150 f\nP 2 2 0 10 -150 150 -25 150 f\nP 12 2 0 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 3 0 10 -150 -150 -25 -150 f\nP 2 3 0 10 -150 150 -25 150 f\nP 12 3 0 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 4 0 10 -150 -150 -25 -150 f\nP 2 4 0 10 -150 150 -25 150 f\nP 12 4 0 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 1 1 6 -150 -100 -125 -100 N\nP 2 1 1 6 -150 100 -125 100 N\nP 2 2 1 6 -150 -100 -125 -100 N\nP 2 2 1 6 -150 100 -125 100 N\nP 2 3 1 6 -150 -100 -125 -100 N\nP 2 3 1 6 -150 100 -125 100 N\nP 2 4 1 6 -150 -100 -125 -100 N\nP 2 4 1 6 -150 100 -125 100 N\nX ~ 1 -300 100 175 R 50 50 1 0 I\nX ~ 2 -300 -100 175 R 50 50 1 0 I\nX ~ 3 300 0 150 L 50 50 1 0 O I\nX ~ 4 300 0 150 L 50 50 2 0 O I\nX ~ 5 -300 100 175 R 50 50 2 0 I\nX ~ 6 -300 -100 175 R 50 50 2 0 I\nX ~ 10 300 0 150 L 50 50 3 0 O I\nX ~ 8 -300 100 175 R 50 50 3 0 I\nX ~ 9 -300 -100 175 R 50 50 3 0 I\nX ~ 11 300 0 150 L 50 50 4 0 O I\nX ~ 12 -300 100 175 R 50 50 4 0 I\nX ~ 13 -300 -100 175 R 50 50 4 0 I\nX VDD 14 0 500 200 D 50 50 5 0 W\nX VSS 7 0 -500 200 U 50 50 5 0 W\nENDDRAW\nENDDEF\n#\n# 4081\n#\nDEF 4081 U 0 40 Y Y 5 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"4081\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?14*\n$ENDFPLIST\nDRAW\nA 0 0 150 -899 899 1 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 2 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 3 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 4 1 10 f 0 -150 0 150\nA -360 0 258 354 -354 1 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 1 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 1 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 2 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 2 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 2 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 3 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 3 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 3 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 4 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 4 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 4 2 10 f 150 0 -24 -150\nS -200 300 200 -300 5 1 10 f\nP 4 1 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 2 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 3 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 4 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 2 1 2 10 -150 -150 -25 -150 f\nP 2 1 2 10 -150 150 -25 150 f\nP 12 1 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 2 2 10 -150 -150 -25 -150 f\nP 2 2 2 10 -150 150 -25 150 f\nP 12 2 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 3 2 10 -150 -150 -25 -150 f\nP 2 3 2 10 -150 150 -25 150 f\nP 12 3 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 4 2 10 -150 -150 -25 -150 f\nP 2 4 2 10 -150 150 -25 150 f\nP 12 4 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nX VDD 14 0 500 200 D 50 50 5 0 W\nX VSS 7 0 -500 200 U 50 50 5 0 W\nX ~ 1 -300 100 150 R 50 50 1 1 I\nX ~ 2 -300 -100 150 R 50 50 1 1 I\nX ~ 3 300 0 150 L 50 50 1 1 O\nX ~ 4 300 0 150 L 50 50 2 1 O\nX ~ 5 -300 100 150 R 50 50 2 1 I\nX ~ 6 -300 -100 150 R 50 50 2 1 I\nX ~ 10 300 0 150 L 50 50 3 1 O\nX ~ 8 -300 100 150 R 50 50 3 1 I\nX ~ 9 -300 -100 150 R 50 50 3 1 I\nX ~ 11 300 0 150 L 50 50 4 1 O\nX ~ 12 -300 100 150 R 50 50 4 1 I\nX ~ 13 -300 -100 150 R 50 50 4 1 I\nX ~ 1 -300 100 170 R 50 50 1 2 I I\nX ~ 2 -300 -100 170 R 50 50 1 2 I I\nX ~ 3 300 0 150 L 50 50 1 2 O I\nX ~ 4 300 0 150 L 50 50 2 2 O I\nX ~ 5 -300 100 170 R 50 50 2 2 I I\nX ~ 6 -300 -100 170 R 50 50 2 2 I I\nX ~ 10 300 0 150 L 50 50 3 2 O I\nX ~ 8 -300 100 170 R 50 50 3 2 I I\nX ~ 9 -300 -100 170 R 50 50 3 2 I I\nX ~ 11 300 0 150 L 50 50 4 2 O I\nX ~ 12 -300 100 170 R 50 50 4 2 I I\nX ~ 13 -300 -100 170 R 50 50 4 2 I I\nENDDRAW\nENDDEF\n#\n# 4098\n#\nDEF 4098 U 0 20 Y Y 3 F N\nF0 \"U\" -200 450 50 H V C CNN\nF1 \"4098\" -200 -450 50 H V C CNN\nF2 \"\" -200 450 50 H I C CNN\nF3 \"\" -200 450 50 H I C CNN\n$FPLIST\n DIP*W7.62mm*\n SOIC*3.9x9.9mm*P1.27mm*\n TSSOP*4.4x5mm*P0.65mm*\n$ENDFPLIST\nDRAW\nS -300 400 300 -400 1 1 0 f\nS -300 400 300 -400 2 1 0 f\nS -200 300 200 -300 3 1 0 f\nX Cx1 1 -400 300 100 R 50 50 1 1 I\nX Rx1_Cx1 2 -400 200 100 R 50 50 1 1 I\nX ~Reset1 3 -400 0 100 R 50 50 1 1 I\nX +TR1 4 -400 -200 100 R 50 50 1 1 I\nX -TR1 5 -400 -300 100 R 50 50 1 1 I\nX Q1 6 400 100 100 L 50 50 1 1 O\nX ~Q1 7 400 -100 100 L 50 50 1 1 O\nX Q2 10 400 100 100 L 50 50 2 1 O\nX -TR2 11 -400 -300 100 R 50 50 2 1 I\nX +TR2 12 -400 -200 100 R 50 50 2 1 I\nX ~Reset2 13 -400 0 100 R 50 50 2 1 I\nX Rx2_Cx2 14 -400 200 100 R 50 50 2 1 I\nX Cx2 15 -400 300 100 R 50 50 2 1 I\nX ~Q2 9 400 -100 100 L 50 50 2 1 O\nX VDD 16 0 400 100 D 50 50 3 1 W\nX VSS 8 0 -400 100 U 50 50 3 1 W\nENDDRAW\nENDDEF\n#\n# 4504\n#\nDEF 4504 U 0 20 Y Y 1 F N\nF0 \"U\" -300 850 50 H V C CNN\nF1 \"4504\" 250 850 50 H V C CNN\nF2 \"\" 0 -1300 50 H I C CNN\nF3 \"\" -650 -350 50 H I C CNN\n$FPLIST\n DIP*W7.62mm*\n SOIC*3.9x9.9mm*P1.27mm*\n TSSOP*4.4x5mm*P0.65mm*\n$ENDFPLIST\nDRAW\nS -350 800 350 -800 1 1 10 f\nP 2 0 1 0 -140 -500 -40 -500 N\nP 2 0 1 0 -140 -300 -40 -300 N\nP 2 0 1 0 -140 -100 -40 -100 N\nP 2 0 1 0 -140 100 -40 100 N\nP 2 0 1 0 -140 300 -40 300 N\nP 2 0 1 0 -140 500 -40 500 N\nP 2 0 1 0 30 -500 130 -500 N\nP 2 0 1 0 30 -300 130 -300 N\nP 2 0 1 0 30 -100 130 -100 N\nP 2 0 1 0 30 100 130 100 N\nP 2 0 1 0 30 300 130 300 N\nP 2 0 1 0 30 500 130 500 N\nP 4 1 1 0 30 -500 -40 -540 -40 -460 30 -500 N\nP 4 1 1 0 30 -300 -40 -340 -40 -260 30 -300 N\nP 4 1 1 0 30 -100 -40 -140 -40 -60 30 -100 N\nP 4 1 1 0 30 100 -40 60 -40 140 30 100 N\nP 4 1 1 0 30 300 -40 260 -40 340 30 300 N\nP 4 1 1 0 30 500 -40 460 -40 540 30 500 N\nX VCC 1 -100 900 100 D 50 50 1 1 W\nX Dout 10 450 -100 100 L 50 50 1 1 O\nX Ein 11 -450 -300 100 R 50 50 1 1 I\nX Eout 12 450 -300 100 L 50 50 1 1 O\nX Select 13 -450 -700 100 R 50 50 1 1 I\nX Fin 14 -450 -500 100 R 50 50 1 1 I\nX Fout 15 450 -500 100 L 50 50 1 1 O\nX VDD 16 100 900 100 D 50 50 1 1 W\nX Aout 2 450 500 100 L 50 50 1 1 O\nX Ain 3 -450 500 100 R 50 50 1 1 I\nX Bout 4 450 300 100 L 50 50 1 1 O\nX Bin 5 -450 300 100 R 50 50 1 1 I\nX Cout 6 450 100 100 L 50 50 1 1 O\nX Cin 7 -450 100 100 R 50 50 1 1 I\nX VSS 8 0 -900 100 U 50 50 1 1 W\nX Din 9 -450 -100 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# 4510\n#\nDEF 4510 U 0 40 Y Y 1 L N\nF0 \"U\" -300 550 50 H V C CNN\nF1 \"4510\" -300 -650 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 500 300 -600 1 1 10 f\nX PE 1 -500 -400 200 R 50 50 1 0 I\nX U/D 10 -500 -200 200 R 50 50 1 0 I\nX Q2 11 500 300 200 L 50 50 1 0 O\nX A2 12 -500 300 200 R 50 50 1 0 I\nX A3 13 -500 200 200 R 50 50 1 0 I\nX Q3 14 500 200 200 L 50 50 1 0 O\nX CLK 15 -500 -300 200 R 50 50 1 0 I C\nX VDD 16 0 700 200 D 50 50 1 0 W\nX Q4 2 500 100 200 L 50 50 1 0 O\nX A4 3 -500 100 200 R 50 50 1 0 I\nX A1 4 -500 400 200 R 50 50 1 0 I\nX CI 5 -500 -100 200 R 50 50 1 0 I I\nX Q1 6 500 400 200 L 50 50 1 0 O\nX CO 7 500 -100 200 L 50 50 1 0 O I\nX VSS 8 0 -800 200 U 50 50 1 0 W\nX RST 9 -500 -500 200 R 50 50 1 0 I\nENDDRAW\nENDDEF\n#\n# 4518\n#\nDEF 4518 U 0 40 Y Y 3 L N\nF0 \"U\" -300 350 50 H V C CNN\nF1 \"4518\" -300 -350 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 200 300 -300 1 1 10 f\nS -300 200 300 -300 2 1 10 f\nS -200 300 200 -300 3 1 10 f\nX CK 1 -500 0 200 R 50 50 1 0 I C\nX Enable 2 -500 -200 200 R 50 50 1 0 I\nX Q1 3 500 100 200 L 50 50 1 0 O\nX Q2 4 500 0 200 L 50 50 1 0 O\nX Q3 5 500 -100 200 L 50 50 1 0 O\nX Q4 6 500 -200 200 L 50 50 1 0 O\nX Reset 7 -500 -100 200 R 50 50 1 0 I\nX Enable 10 -500 -200 200 R 50 50 2 0 I\nX Q1 11 500 100 200 L 50 50 2 0 O\nX Q2 12 500 0 200 L 50 50 2 0 O\nX Q3 13 500 -100 200 L 50 50 2 0 O\nX Q4 14 500 -200 200 L 50 50 2 0 O\nX Reset 15 -500 -100 200 R 50 50 2 0 I\nX CK 9 -500 0 200 R 50 50 2 0 I C\nX VDD 16 0 500 200 D 50 50 3 0 W\nX VSS 8 0 -500 200 U 50 50 3 0 W\nENDDRAW\nENDDEF\n#\n# 4520\n#\nDEF 4520 U 0 40 Y Y 3 L N\nF0 \"U\" -300 350 50 H V C CNN\nF1 \"4520\" -300 -350 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 200 300 -300 1 1 10 f\nS -300 200 300 -300 2 1 10 f\nS -200 300 200 -300 3 1 10 f\nX CK 1 -500 0 200 R 50 50 1 0 I C\nX Enable 2 -500 -200 200 R 50 50 1 0 I\nX Q1 3 500 100 200 L 50 50 1 0 O\nX Q2 4 500 0 200 L 50 50 1 0 O\nX Q3 5 500 -100 200 L 50 50 1 0 O\nX Q4 6 500 -200 200 L 50 50 1 0 O\nX Reset 7 -500 -100 200 R 50 50 1 0 I\nX Enable 10 -500 -200 200 R 50 50 2 0 I\nX Q1 11 500 100 200 L 50 50 2 0 O\nX Q2 12 500 0 200 L 50 50 2 0 O\nX Q3 13 500 -100 200 L 50 50 2 0 O\nX Q4 14 500 -200 200 L 50 50 2 0 O\nX Reset 15 -500 -100 200 R 50 50 2 0 I\nX CK 9 -500 0 200 R 50 50 2 0 I C\nX VDD 16 0 500 200 D 50 50 3 0 W\nX VSS 8 0 -500 200 U 50 50 3 0 W\nENDDRAW\nENDDEF\n#\n# 4538\n#\nDEF 4538 U 0 40 Y Y 3 L N\nF0 \"U\" -300 350 50 H V C CNN\nF1 \"4538\" -300 -450 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS 4528 14528 14538\n$FPLIST\n DIP?16*\n$ENDFPLIST\nDRAW\nS -300 300 300 -400 1 1 10 f\nS -300 300 300 -400 2 1 10 f\nS -200 300 200 -300 3 1 10 f\nX VSS 1 0 -600 200 U 50 50 1 0 W\nX RxCx 2 -500 200 200 R 50 50 1 0 I\nX R 3 -500 -300 200 R 50 50 1 0 I I\nX Clk+ 4 -500 0 200 R 50 50 1 0 I C\nX Clk- 5 -500 -100 200 R 50 50 1 0 I IC\nX Q 6 500 100 200 L 50 50 1 0 O\nX ~Q 7 500 -200 200 L 50 50 1 0 O\nX Q 10 500 100 200 L 50 50 2 0 O\nX Clk- 11 -500 -100 200 R 50 50 2 0 I IC\nX Clk+ 12 -500 0 200 R 50 50 2 0 I C\nX R 13 -500 -300 200 R 50 50 2 0 I I\nX RxCx 14 -500 200 200 R 50 50 2 0 I\nX VSS 15 0 -600 200 U 50 50 2 0 W\nX ~Q 9 500 -200 200 L 50 50 2 0 O\nX VDD 16 0 500 200 D 50 50 3 0 W\nX VSS 8 0 -500 200 U 50 50 3 0 W\nENDDRAW\nENDDEF\n#\n# 4543\n#\nDEF 4543 U 0 40 Y Y 1 L N\nF0 \"U\" -300 450 50 H V C CNN\nF1 \"4543\" -300 -450 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*W7.62mm*\n SOIC*3.9x9.9mm*P1.27mm*\n TSSOP*4.4x5mm*P0.65mm*\n$ENDFPLIST\nDRAW\nS -300 400 300 -400 1 1 10 f\nX ~LE 1 -500 -100 200 R 50 50 1 0 I\nX Qb 10 500 200 200 L 50 50 1 0 O\nX Qc 11 500 100 200 L 50 50 1 0 O\nX Qd 12 500 0 200 L 50 50 1 0 O\nX Qe 13 500 -100 200 L 50 50 1 0 O\nX Qg 14 500 -300 200 L 50 50 1 0 O\nX Qf 15 500 -200 200 L 50 50 1 0 O\nX VDD 16 0 600 200 D 50 50 1 0 W\nX D2 2 -500 100 200 R 50 50 1 0 I\nX D1 3 -500 200 200 R 50 50 1 0 I\nX D3 4 -500 0 200 R 50 50 1 0 I\nX D0 5 -500 300 200 R 50 50 1 0 I\nX PH 6 -500 -300 200 R 50 50 1 0 I\nX BL 7 -500 -200 200 R 50 50 1 0 I\nX VSS 8 0 -600 200 U 50 50 1 0 W\nX Qa 9 500 300 200 L 50 50 1 0 O\nENDDRAW\nENDDEF\n#\n# HEF4093B\n#\nDEF HEF4093B U 0 40 Y Y 5 L N\nF0 \"U\" 0 50 50 H V C CNN\nF1 \"HEF4093B\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOIC*3.9x8.7mm*P1.27mm*\n$ENDFPLIST\nDRAW\nA 0 0 150 -899 899 1 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 2 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 3 1 10 f 0 -150 0 150\nA 0 0 150 -899 899 4 1 10 f 0 -150 0 150\nA -360 0 258 354 -354 1 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 1 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 1 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 2 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 2 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 2 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 3 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 3 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 3 2 10 f 150 0 -24 -150\nA -360 0 258 354 -354 4 2 10 N -150 150 -150 -150\nA -47 -52 204 150 837 4 2 10 f 150 0 -24 150\nA -47 52 204 -150 -837 4 2 10 f 150 0 -24 -150\nS -200 300 200 -300 5 1 10 f\nP 3 1 0 0 -25 -50 -25 50 25 50 N\nP 3 1 0 0 -25 -50 -25 50 25 50 N\nP 4 1 0 0 -50 -50 25 -50 25 50 50 50 N\nP 4 1 0 0 -50 -50 25 -50 25 50 50 50 N\nP 3 2 0 0 -25 -50 -25 50 25 50 N\nP 3 2 0 0 -25 -50 -25 50 25 50 N\nP 4 2 0 0 -50 -50 25 -50 25 50 50 50 N\nP 4 2 0 0 -50 -50 25 -50 25 50 50 50 N\nP 3 3 0 0 -25 -50 -25 50 25 50 N\nP 3 3 0 0 -25 -50 -25 50 25 50 N\nP 4 3 0 0 -50 -50 25 -50 25 50 50 50 N\nP 4 3 0 0 -50 -50 25 -50 25 50 50 50 N\nP 3 4 0 0 -25 -50 -25 50 25 50 N\nP 3 4 0 0 -25 -50 -25 50 25 50 N\nP 4 4 0 0 -50 -50 25 -50 25 50 50 50 N\nP 4 4 0 0 -50 -50 25 -50 25 50 50 50 N\nP 4 1 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 2 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 3 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 4 4 1 10 0 150 -150 150 -150 -150 0 -150 f\nP 2 1 2 10 -150 -150 -25 -150 f\nP 2 1 2 10 -150 150 -25 150 f\nP 12 1 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 2 2 10 -150 -150 -25 -150 f\nP 2 2 2 10 -150 150 -25 150 f\nP 12 2 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 3 2 10 -150 -150 -25 -150 f\nP 2 3 2 10 -150 150 -25 150 f\nP 12 3 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nP 2 4 2 10 -150 -150 -25 -150 f\nP 2 4 2 10 -150 150 -25 150 f\nP 12 4 2 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f\nX VCC 14 0 500 200 D 50 50 5 0 W\nX GND 7 0 -500 200 U 50 50 5 0 W\nX ~ 1 -300 100 150 R 50 50 1 1 I\nX ~ 2 -300 -100 150 R 50 50 1 1 I\nX ~ 3 300 0 150 L 50 50 1 1 O I\nX ~ 4 300 0 150 L 50 50 2 1 O I\nX ~ 5 -300 100 150 R 50 50 2 1 I\nX ~ 6 -300 -100 150 R 50 50 2 1 I\nX ~ 10 300 0 150 L 50 50 3 1 O I\nX ~ 8 -300 100 150 R 50 50 3 1 I\nX ~ 9 -300 -100 150 R 50 50 3 1 I\nX ~ 11 300 0 150 L 50 50 4 1 O I\nX ~ 12 -300 100 150 R 50 50 4 1 I\nX ~ 13 -300 -100 150 R 50 50 4 1 I\nX ~ 1 -300 100 170 R 50 50 1 2 I I\nX ~ 2 -300 -100 170 R 50 50 1 2 I I\nX ~ 3 300 0 150 L 50 50 1 2 O\nX ~ 4 300 0 150 L 50 50 2 2 O\nX ~ 5 -300 100 170 R 50 50 2 2 I I\nX ~ 6 -300 -100 170 R 50 50 2 2 I I\nX ~ 10 300 0 150 L 50 50 3 2 O\nX ~ 8 -300 100 170 R 50 50 3 2 I I\nX ~ 9 -300 -100 170 R 50 50 3 2 I I\nX ~ 11 300 0 150 L 50 50 4 2 O\nX ~ 12 -300 100 170 R 50 50 4 2 I I\nX ~ 13 -300 -100 170 R 50 50 4 2 I I\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Analog.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP AD5593R\nD 8-channel 12bits configurable ADC/DAC/GPIO Internal Reference, I2C interface Integrated temperature sensor,Single Supply, TSSOP-16\nK 8channel 12bit ADC DAC GPIO I2C Temperature\nF https://www.analog.com/media/en/technical-documentation/data-sheets/AD5593R.pdf\n$ENDCMP\n#\n$CMP AD630ARZ\nD High precision Balanced Modulator/Demodulator, 2 MHz, SOIC-20W\nK modulator demodulator\nF https://www.analog.com/media/en/technical-documentation/data-sheets/ad630.pdf\n$ENDCMP\n#\n$CMP AD654JN\nD Low Cost Monolithic Voltage-to-Frequency Converter, DIP-8\nK v-to-f v-f\nF https://www.analog.com/media/en/technical-documentation/data-sheets/AD654.pdf\n$ENDCMP\n#\n$CMP AD654JR\nD Low Cost Monolithic Voltage-to-Frequency Converter, SOIC-8\nK v-to-f v-f\nF https://www.analog.com/media/en/technical-documentation/data-sheets/AD654.pdf\n$ENDCMP\n#\n$CMP LF398H\nD Sample And Hold Unity Gain Follower, TO-99-8\nK sample hold buffer unity gain\nF http://www.ti.com/lit/ds/symlink/lf398-n.pdf\n$ENDCMP\n#\n$CMP LF398_DIP8\nD Sample And Hold Unity Gain Follower, DIP-8\nK sample hold buffer unity gain\nF http://www.ti.com/lit/ds/symlink/lf398-n.pdf\n$ENDCMP\n#\n$CMP LF398_SOIC14\nD Sample And Hold Unity Gain Follower, SOIC-14\nK sample hold buffer unity gain\nF http://www.ti.com/lit/ds/symlink/lf398-n.pdf\n$ENDCMP\n#\n$CMP LF398_SOIC8\nD Sample And Hold Unity Gain Follower, SOIC-8\nK sample hold buffer unity gain\nF https://www.analog.com/media/en/technical-documentation/data-sheets/lt0398s8.pdf\n$ENDCMP\n#\n$CMP MLX90314xDF\nD Programmable Sensor Interface (Signal Conditioner), SOIC-16W\nK sensor signal conditioning\nF https://www.melexis.com/-/media/files/documents/datasheets/mlx90314-datasheet-melexis.pdf\n$ENDCMP\n#\n$CMP MLX90320xFR\nD Programmable Automotive Sensor Interface (Signal Conditioner), SSOP-14\nK sensor signal conditioning\nF https://www.melexis.com/-/media/files/documents/datasheets/mlx90320-datasheet-melexis.pdf\n$ENDCMP\n#\n$CMP MPY634KP\nD Wide Bandwidth Precision Analog Multiplier, DIP-14\nK analog multiplier\nF http://www.ti.com/lit/ds/symlink/mpy634.pdf\n$ENDCMP\n#\n$CMP MPY634KU\nD Wide Bandwidth Precision Analog Multiplier, SOIC-16W\nK analog multiplier\nF http://www.ti.com/lit/ds/symlink/mpy634.pdf\n$ENDCMP\n#\n$CMP PGA112\nD Zero-Drift Programmable Gain Amplifier With Mux, x1/x2/x4/x8/x16/x32/x64/x128 gains, VSSOP-10\nK PGA SPI\nF http://www.ti.com/lit/ds/sbos424c/sbos424c.pdf\n$ENDCMP\n#\n$CMP PGA113\nD Zero-Drift Programmable Gain Amplifier With Mux, x1/x2/x5/x10/x20/x50/x100/x200 gains, VSSOP-10\nK PGA SPI\nF http://www.ti.com/lit/ds/sbos424c/sbos424c.pdf\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Analog.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# AD5593R\n#\nDEF AD5593R U 0 40 Y Y 1 F N\nF0 \"U\" -350 600 50 H V L CNN\nF1 \"AD5593R\" 150 600 50 H V L CNN\nF2 \"Package_SO:TSSOP-16_4.4x5mm_P0.65mm\" 1000 -500 50 H I C CIN\nF3 \"\" 0 -200 50 H I C CNN\n$FPLIST\n TSSOP-16*\n$ENDFPLIST\nDRAW\nS -350 -450 350 550 0 1 10 f\nX ~RESET 1 -500 -100 150 R 50 50 1 1 I\nX IO4 10 500 0 150 L 50 50 1 1 B\nX IO5 11 500 -100 150 L 50 50 1 1 B\nX IO6 12 500 -200 150 L 50 50 1 1 B\nX IO7 13 500 -300 150 L 50 50 1 1 B\nX GND 14 0 -600 150 U 50 50 1 1 W\nX SDA 15 -500 400 150 R 50 50 1 1 B\nX SCL 16 -500 300 150 R 50 50 1 1 I\nX A0 2 -500 -300 150 R 50 50 1 1 I\nX VDD 3 -100 700 150 D 50 50 1 1 W\nX IO0 4 500 400 150 L 50 50 1 1 B\nX IO1 5 500 300 150 L 50 50 1 1 B\nX IO2 6 500 200 150 L 50 50 1 1 B\nX IO3 7 500 100 150 L 50 50 1 1 B\nX VRef 8 -500 100 150 R 50 50 1 1 P\nX VLogic 9 100 700 150 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# AD630ARZ\n#\nDEF AD630ARZ U 0 20 Y Y 1 F N\nF0 \"U\" -350 750 50 H V C CNN\nF1 \"AD630ARZ\" 250 750 50 H V C CNN\nF2 \"Package_SO:SOIC-20W_7.5x12.8mm_P1.27mm\" 0 -1050 50 H I C CNN\nF3 \"\" -400 1100 50 H I C CNN\n$FPLIST\n SOIC*7.5x12.8mm*P1.27mm*\n$ENDFPLIST\nDRAW\nC -250 100 5 0 1 0 N\nC -250 500 5 0 1 0 N\nC -50 210 10 0 1 0 N\nC -50 290 10 0 1 0 N\nC 10 250 10 0 1 0 N\nC 50 250 5 0 1 0 N\nC 100 250 5 0 1 0 N\nC 300 -100 5 0 1 0 N\nC 300 0 5 0 1 0 N\nC 300 200 5 0 1 0 N\nC 325 200 5 0 1 0 N\nT 0 -175 -295 35 0 0 0 + Normal 0 C C\nT 0 -175 100 35 0 0 0 + Normal 0 C C\nT 0 -175 500 35 0 0 0 + Normal 0 C C\nT 0 175 155 35 0 0 0 + Normal 0 C C\nT 0 -175 -200 35 0 0 0 - Normal 0 C C\nT 0 -175 0 35 0 0 0 - Normal 0 C C\nT 0 -175 400 35 0 0 0 - Normal 0 C C\nT 0 175 255 35 0 0 0 - Normal 0 C C\nT 900 300 100 30 0 0 0 10k Normal 0 C C\nT 0 375 0 30 0 0 0 10k Normal 0 C C\nT 0 -325 200 30 0 0 0 2k5 Normal 0 C C\nT 0 -325 600 30 0 0 0 2k5 Normal 0 C C\nT 0 375 -100 30 0 0 0 5k Normal 0 C C\nT 0 -145 450 50 0 0 0 A Normal 0 C C\nT 0 -145 50 50 0 0 0 B Normal 0 C C\nT 0 440 -270 30 0 0 0 \"B/~A\" Normal 0 C C\nT 0 -430 525 30 0 0 0 CHA+ Normal 0 C C\nT 0 -430 430 30 0 0 0 CHA- Normal 0 C C\nT 0 -425 125 30 0 0 0 CHB+ Normal 0 C C\nT 0 -420 30 30 0 0 0 CHB- Normal 0 C C\nT 0 420 530 30 0 0 0 COMP Normal 0 C C\nT 0 460 -70 30 0 0 0 RA Normal 0 C C\nT 0 460 30 30 0 0 0 RB Normal 0 C C\nT 0 460 -170 30 0 0 0 RF Normal 0 C C\nT 0 -440 625 30 0 0 0 RinA Normal 0 C C\nT 0 -440 230 30 0 0 0 RinB Normal 0 C C\nT 0 -415 -275 30 0 0 0 SEL_A Normal 0 C C\nT 0 -415 -175 30 0 0 0 SEL_B Normal 0 C C\nT 0 430 230 30 0 0 0 Vout Normal 0 C C\nS -500 700 500 -700 0 1 10 f\nP 2 0 1 0 -500 -300 -200 -300 N\nP 2 0 1 0 -500 -200 -200 -200 N\nP 2 0 1 0 -500 0 -200 0 N\nP 2 0 1 0 -500 200 -375 200 N\nP 2 0 1 0 -500 400 -200 400 N\nP 2 0 1 0 -500 600 -375 600 N\nP 2 0 1 0 -250 500 -200 500 N\nP 2 0 1 0 -75 -250 0 -250 N\nP 2 0 1 0 -50 350 -50 300 N\nP 2 0 1 0 0 -250 100 -250 N\nP 2 0 1 0 0 -225 0 -250 N\nP 2 0 1 0 0 -175 0 -200 N\nP 2 0 1 0 0 -125 0 -150 N\nP 2 0 1 0 0 -75 0 -100 N\nP 2 0 1 0 0 -25 0 -50 N\nP 2 0 1 0 0 25 0 0 N\nP 2 0 1 0 0 75 0 50 N\nP 2 0 1 0 0 125 0 100 N\nP 2 0 1 0 0 175 0 150 N\nP 2 0 1 0 0 225 0 200 N\nP 2 0 1 0 0 250 -50 260 N\nP 2 0 1 0 50 250 20 250 N\nP 2 0 1 0 50 250 50 500 N\nP 2 0 1 0 50 250 150 250 N\nP 2 0 1 0 75 100 125 100 N\nP 2 0 1 0 100 -260 150 -300 N\nP 2 0 1 0 100 -240 150 -200 N\nP 2 0 1 0 100 -200 100 -300 N\nP 2 0 1 0 150 -350 175 -350 N\nP 2 0 1 0 150 -200 200 -200 N\nP 2 0 1 0 150 300 150 100 N\nP 2 0 1 0 200 375 200 325 N\nP 2 0 1 0 200 475 200 500 N\nP 2 0 1 0 225 375 225 325 N\nP 2 0 1 0 225 500 500 500 N\nP 2 0 1 0 225 525 225 475 N\nP 2 0 1 0 300 50 300 -100 N\nP 2 0 1 0 300 200 500 200 N\nP 2 0 1 0 325 -100 300 -100 N\nP 2 0 1 0 325 0 300 0 N\nP 2 0 1 0 425 -100 500 -100 N\nP 2 0 1 0 425 0 500 0 N\nP 3 0 1 0 -250 100 -225 100 -200 100 N\nP 3 0 1 0 -75 50 -50 50 -50 200 N\nP 3 0 1 0 -75 450 -50 450 -50 350 N\nP 3 0 1 0 50 500 200 500 200 525 N\nP 3 0 1 0 100 250 100 350 200 350 N\nP 3 0 1 0 145 -275 150 -300 125 -295 N\nP 3 0 1 0 150 -300 150 -350 125 -350 N\nP 3 0 1 0 150 150 100 150 100 100 N\nP 3 0 1 0 150 300 275 200 150 100 N\nP 3 0 1 0 225 350 325 350 325 200 N\nP 3 0 1 0 300 -100 300 -200 500 -200 N\nP 3 0 1 0 300 150 300 200 275 200 N\nP 4 0 1 0 -275 200 -250 200 -250 100 -500 100 N\nP 4 0 1 0 -275 600 -250 600 -250 500 -500 500 N\nP 4 0 1 0 -200 -150 -200 -350 -75 -250 -200 -150 N\nP 4 0 1 0 -200 150 -200 -50 -75 50 -200 150 N\nP 4 0 1 0 -200 550 -200 350 -75 450 -200 550 N\nP 4 0 1 0 200 -200 225 -200 225 -300 500 -300 N\nP 5 0 1 0 -375 225 -375 175 -275 175 -275 225 -375 225 N\nP 5 0 1 0 -375 625 -375 575 -275 575 -275 625 -375 625 N\nP 5 0 1 0 275 150 325 150 325 50 275 50 275 150 N\nP 5 0 1 0 325 -75 325 -125 425 -125 425 -75 325 -75 N\nP 5 0 1 0 325 25 325 -25 425 -25 425 25 325 25 N\nX RinA 1 -600 600 100 R 50 0 1 1 I\nX SEL_A 10 -600 -300 100 R 50 0 1 1 I\nX VS+ 11 0 800 100 D 50 50 1 1 W\nX COMP 12 600 500 100 L 50 0 1 1 P\nX Vout 13 600 200 100 L 50 0 1 1 O\nX RB 14 600 0 100 L 50 0 1 1 O\nX RF 15 600 -200 100 L 50 0 1 1 O\nX RA 16 600 -100 100 L 50 0 1 1 O\nX RinB 17 -600 200 100 R 50 0 1 1 I\nX CHB+ 18 -600 100 100 R 50 0 1 1 I\nX CHB- 19 -600 0 100 R 50 0 1 1 I\nX CHA+ 2 -600 500 100 R 50 0 1 1 I\nX CHA- 20 -600 400 100 R 50 0 1 1 I\nX DIFF_OFF_ADJ1 3 -600 -500 100 R 50 30 1 1 P\nX DIFF_OFF_ADJ2 4 -600 -600 100 R 50 30 1 1 P\nX CM_OFF_ADJ1 5 600 -500 100 L 50 30 1 1 P\nX CM_OFF_ADJ2 6 600 -600 100 L 50 30 1 1 P\nX B/~A 7 600 -300 100 L 50 0 1 1 C\nX VS- 8 0 -800 100 U 50 50 1 1 W\nX SEL_B 9 -600 -200 100 R 50 0 1 1 I\nENDDRAW\nENDDEF\n#\n# AD654JN\n#\nDEF AD654JN U 0 20 Y Y 1 F N\nF0 \"U\" -250 350 50 H V R CNN\nF1 \"AD654JN\" 50 350 50 H V L CNN\nF2 \"Package_DIP:DIP-8_W7.62mm\" 0 0 50 H I C CNN\nF3 \"\" -250 700 50 H I C CNN\n$FPLIST\n DIP*W7.62mm*\n$ENDFPLIST\nDRAW\nS -300 300 300 -300 0 1 10 f\nX FOUT 1 400 -200 100 L 50 50 1 1 C\nX COM 2 0 -400 100 U 50 50 1 1 W\nX RT 3 -400 -100 100 R 50 50 1 1 I\nX +VIN 4 -400 100 100 R 50 50 1 1 I\nX -VS 5 -100 -400 100 U 50 50 1 1 W\nX CT1 6 400 200 100 L 50 50 1 1 P\nX CT2 7 400 -100 100 L 50 50 1 1 P\nX +VS 8 -100 400 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# AD654JR\n#\nDEF AD654JR U 0 20 Y Y 1 F N\nF0 \"U\" -250 350 50 H V R CNN\nF1 \"AD654JR\" 50 350 50 H V L CNN\nF2 \"Package_SO:SOIC-8_3.9x4.9mm_P1.27mm\" 0 0 50 H I C CNN\nF3 \"\" -250 700 50 H I C CNN\n$FPLIST\n SOIC*3.9x4.9mm*P1.27mm*\n$ENDFPLIST\nDRAW\nS -300 300 300 -300 0 1 10 f\nX FOUT 1 400 -200 100 L 50 50 1 1 C\nX COM 2 0 -400 100 U 50 50 1 1 W\nX RT 3 -400 -100 100 R 50 50 1 1 I\nX +VIN 4 -400 100 100 R 50 50 1 1 I\nX -VS 5 -100 -400 100 U 50 50 1 1 W\nX CT1 6 400 200 100 L 50 50 1 1 P\nX CT2 7 400 -100 100 L 50 50 1 1 P\nX +VS 8 -100 400 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# LF398H\n#\nDEF LF398H U 0 5 Y Y 1 F N\nF0 \"U\" 200 150 50 H V L CNN\nF1 \"LF398H\" 200 -100 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-99-8\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n *TO*99*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 0 -100 100 -200 N\nP 2 0 1 0 100 200 0 100 N\nP 4 0 1 10 -200 200 200 0 -200 -200 -200 200 f\nX V+ 1 -100 300 150 D 50 50 1 1 P\nX Adj 2 100 300 100 D 50 50 1 1 P\nX I 3 -300 100 100 R 50 50 1 1 I\nX V- 4 -100 -300 150 U 50 50 1 1 P\nX ~ 5 300 0 100 L 50 50 1 1 O\nX Ch 6 100 -300 100 U 50 50 1 1 P\nX T 7 -300 -100 100 R 50 50 1 1 P\nX Hold 8 -300 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# LF398_DIP8\n#\nDEF LF398_DIP8 U 0 5 Y Y 1 F N\nF0 \"U\" 200 150 50 H V L CNN\nF1 \"LF398_DIP8\" 200 -100 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS LF398_SOIC8\n$FPLIST\n *SOIC*3.9x4.9mm*P1.27mm*\n *DIP*W7.62mm*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 0 -100 100 -200 N\nP 2 0 1 0 100 200 0 100 N\nP 4 0 1 10 -200 200 200 0 -200 -200 -200 200 f\nX V+ 1 -100 300 150 D 50 50 1 1 P\nX Adj 2 100 300 100 D 50 50 1 1 P\nX I 3 -300 100 100 R 50 50 1 1 I\nX V- 4 -100 -300 150 U 50 50 1 1 P\nX ~ 5 300 0 100 L 50 50 1 1 O\nX Ch 6 100 -300 100 U 50 50 1 1 P\nX T 7 -300 -100 100 R 50 50 1 1 P\nX Hold 8 -300 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# LF398_SOIC14\n#\nDEF LF398_SOIC14 U 0 5 Y Y 1 F N\nF0 \"U\" 200 150 50 H V L CNN\nF1 \"LF398_SOIC14\" 200 -100 50 H V L CNN\nF2 \"Package_SO:SOIC-14_3.9x8.7mm_P1.27mm\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n *SOIC*3.9x8.7mm*P1.27mm*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 0 -100 100 -200 N\nP 2 0 1 0 100 200 0 100 N\nP 4 0 1 10 -200 200 200 0 -200 -200 -200 200 f\nX I 1 -300 100 100 R 50 50 1 1 I\nX T 10 -300 -100 100 R 50 50 1 1 P\nX Hold 11 -300 0 100 R 50 50 1 1 I\nX V+ 12 -100 300 150 D 50 50 1 1 P\nX NC 13 0 -100 100 U 50 50 1 1 N N\nX Adj 14 100 300 100 D 50 50 1 1 P\nX NC 2 -200 100 100 D 50 50 1 1 N N\nX V- 3 -100 -300 150 U 50 50 1 1 P\nX NC 4 -100 100 100 D 50 50 1 1 N N\nX NC 5 -200 -100 100 U 50 50 1 1 N N\nX NC 6 -100 -100 100 U 50 50 1 1 N N\nX ~ 7 300 0 100 L 50 50 1 1 O\nX Ch 8 100 -300 100 U 50 50 1 1 P\nX NC 9 0 100 100 D 50 50 1 1 N N\nENDDRAW\nENDDEF\n#\n# MLX90314xDF\n#\nDEF MLX90314xDF U 0 20 Y Y 1 F N\nF0 \"U\" -350 550 50 H V R CNN\nF1 \"MLX90314xDF\" 600 -550 50 H V R CNN\nF2 \"Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm\" -400 800 50 H I C CNN\nF3 \"\" -250 700 50 H I C CNN\n$FPLIST\n SOIC*7.5x10.3mm*P1.27mm*\n$ENDFPLIST\nDRAW\nS -400 500 400 -500 0 1 10 f\nX IO1 1 500 300 100 L 50 50 1 1 B\nX FET 10 0 600 100 D 50 50 1 1 O\nX VDD1 11 100 600 100 D 50 50 1 1 W\nX VMO 12 500 0 100 L 50 50 1 1 O\nX CMO 13 500 -100 100 L 50 50 1 1 O\nX CMN 14 500 -200 100 L 50 50 1 1 I\nX GND 15 0 -600 100 U 50 50 1 1 W\nX COMS 16 500 400 100 L 50 50 1 1 B\nX IO2 2 500 200 100 L 50 50 1 1 B\nX TSTB 3 -500 400 100 R 50 50 1 1 I\nX FLT 4 -500 -400 100 R 50 50 1 1 P\nX OFC 5 500 -400 100 L 50 50 1 1 O\nX VBN 6 -500 -100 100 R 50 50 1 1 I\nX VBP 7 -500 0 100 R 50 50 1 1 I\nX TMP 8 -500 -200 100 R 50 50 1 1 I\nX VDD 9 -100 600 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# MLX90320xFR\n#\nDEF MLX90320xFR U 0 20 Y Y 1 F N\nF0 \"U\" -350 550 50 H V R CNN\nF1 \"MLX90320xFR\" 600 550 50 H V R CNN\nF2 \"Package_SO:SSOP-14_5.3x6.2mm_P0.65mm\" 0 800 50 H I C CNN\nF3 \"\" -250 700 50 H I C CNN\n$FPLIST\n SSOP*5.3x6.2mm*P0.65mm*\n$ENDFPLIST\nDRAW\nS -400 500 400 -500 0 1 10 f\nX INM 1 -500 200 100 R 50 50 1 1 I\nX TESTIN2 10 500 -100 100 L 50 50 1 1 P\nX FLT 11 500 200 100 L 50 50 1 1 O\nX OUT 12 500 400 100 L 50 50 1 1 B\nX TEST2 13 500 -400 100 L 50 50 1 1 P\nX VDD 14 0 600 100 D 50 50 1 1 W\nX ANAGND 2 -100 -600 100 U 50 50 1 1 W\nX INP 3 -500 300 100 R 50 50 1 1 I\nX SUB 4 100 -600 100 U 50 50 1 1 W\nX TMP 5 -500 0 100 R 50 50 1 1 P\nX DIGGND 6 0 -600 100 U 50 50 1 1 W\nX TEST1 7 500 -300 100 L 50 50 1 1 P\nX TESTOUT 8 500 -200 100 L 50 50 1 1 P\nX TESTIN1 9 500 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MPY634KP\n#\nDEF MPY634KP U 0 20 Y Y 1 F N\nF0 \"U\" -400 550 50 H V L CNN\nF1 \"MPY634KP\" 50 550 50 H V L CNN\nF2 \"Package_DIP:DIP-14_W7.62mm\" 0 0 50 H I C CIN\nF3 \"\" 50 50 50 H I C CNN\n$FPLIST\n DIP*W7.62mm*\n$ENDFPLIST\nDRAW\nT 0 -230 -205 25 0 0 0 + Normal 0 C C\nT 0 -230 95 25 0 0 0 + Normal 0 C C\nT 0 -225 395 25 0 0 0 + Normal 0 C C\nT 0 175 40 25 0 0 0 + Normal 0 C C\nT 0 -230 -290 25 0 0 0 - Normal 0 C C\nT 0 -230 10 25 0 0 0 - Normal 0 C C\nT 0 -225 310 25 0 0 0 - Normal 0 C C\nT 0 175 -40 25 0 0 0 - Normal 0 C C\nT 0 220 0 25 0 0 0 A Normal 0 C C\nT 0 -175 -250 25 0 0 0 V-I Normal 0 C C\nT 0 -175 50 25 0 0 0 V-I Normal 0 C C\nT 0 -170 350 25 0 0 0 V-I Normal 0 C C\nT 900 0 -125 25 0 1 0 0.75 Normal 0 C C\nT 900 50 -125 25 0 1 0 ATTEN Normal 0 C C\nT 900 50 150 25 0 1 0 CORE Normal 0 C C\nT 900 0 150 25 0 1 0 MULTIPLIER Normal 0 C C\nS -400 500 400 -400 0 1 10 f\nS -50 -50 100 -200 0 1 0 N\nS -50 300 100 0 0 1 0 N\nP 4 0 0 0 -50 -125 -75 -125 -75 -250 -100 -250 N\nP 4 0 0 0 -50 -125 -75 -125 -75 -250 -100 -250 N\nP 4 0 0 0 -50 100 -75 100 -75 50 -100 50 N\nP 4 0 0 0 -50 100 -75 100 -75 50 -100 50 N\nP 4 0 0 0 -50 200 -75 200 -75 350 -100 350 N\nP 4 0 0 0 -50 200 -75 200 -75 350 -100 350 N\nP 4 0 0 0 150 -50 125 -50 125 -125 100 -125 N\nP 4 0 0 0 150 -50 125 -50 125 -125 100 -125 N\nP 4 0 0 0 150 50 125 50 125 150 100 150 N\nP 4 0 0 0 150 50 125 50 125 150 100 150 N\nP 2 0 1 0 -275 -300 -250 -300 N\nP 2 0 1 0 -275 -200 -250 -200 N\nP 2 0 1 0 -275 0 -250 0 N\nP 2 0 1 0 -275 100 -250 100 N\nP 2 0 1 0 -270 300 -245 300 N\nP 2 0 1 0 -270 400 -245 400 N\nP 4 0 1 0 -250 -175 -250 -325 -100 -250 -250 -175 N\nP 4 0 1 0 -250 125 -250 -25 -100 50 -250 125 N\nP 4 0 1 0 -245 425 -245 275 -95 350 -245 425 N\nP 4 0 1 0 150 75 150 -75 280 0 150 75 N\nX X1 1 -500 400 100 R 50 50 1 1 I\nX Z2 10 -500 -300 100 R 50 50 1 1 I\nX Z1 11 -500 -200 100 R 50 50 1 1 I\nX VO 12 500 0 100 L 50 50 1 1 O\nX NC 13 400 100 100 L 50 50 1 1 N N\nX +VS 14 0 600 100 D 50 50 1 1 W\nX X2 2 -500 300 100 R 50 50 1 1 I\nX NC 3 400 400 100 L 50 50 1 1 N N\nX SF 4 500 -200 100 L 50 50 1 1 P\nX NC 5 400 300 100 L 50 50 1 1 N N\nX Y1 6 -500 100 100 R 50 50 1 1 I\nX Y2 7 -500 0 100 R 50 50 1 1 I\nX -VS 8 0 -500 100 U 50 50 1 1 W\nX NC 9 400 200 100 L 50 50 1 1 N N\nENDDRAW\nENDDEF\n#\n# MPY634KU\n#\nDEF MPY634KU U 0 20 Y Y 1 F N\nF0 \"U\" -400 550 50 H V L CNN\nF1 \"MPY634KU\" 50 550 50 H V L CNN\nF2 \"Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOIC*7.5x10.3mm*P1.27mm*\n$ENDFPLIST\nDRAW\nT 0 -230 -205 25 0 0 0 + Normal 0 C C\nT 0 -230 95 25 0 0 0 + Normal 0 C C\nT 0 -225 395 25 0 0 0 + Normal 0 C C\nT 0 175 40 25 0 0 0 + Normal 0 C C\nT 0 -230 -290 25 0 0 0 - Normal 0 C C\nT 0 -230 10 25 0 0 0 - Normal 0 C C\nT 0 -225 310 25 0 0 0 - Normal 0 C C\nT 0 175 -40 25 0 0 0 - Normal 0 C C\nT 0 220 0 25 0 0 0 A Normal 0 C C\nT 0 -175 -250 25 0 0 0 V-I Normal 0 C C\nT 0 -175 50 25 0 0 0 V-I Normal 0 C C\nT 0 -170 350 25 0 0 0 V-I Normal 0 C C\nT 900 0 -125 25 0 1 0 0.75 Normal 0 C C\nT 900 50 -125 25 0 1 0 ATTEN Normal 0 C C\nT 900 50 150 25 0 1 0 CORE Normal 0 C C\nT 900 0 150 25 0 1 0 MULTIPLIER Normal 0 C C\nS -400 500 400 -400 0 1 10 f\nS -50 -50 100 -200 0 1 0 N\nS -50 300 100 0 0 1 0 N\nP 4 0 0 0 -50 -125 -75 -125 -75 -250 -100 -250 N\nP 4 0 0 0 -50 -125 -75 -125 -75 -250 -100 -250 N\nP 4 0 0 0 -50 100 -75 100 -75 50 -100 50 N\nP 4 0 0 0 -50 100 -75 100 -75 50 -100 50 N\nP 4 0 0 0 -50 200 -75 200 -75 350 -100 350 N\nP 4 0 0 0 -50 200 -75 200 -75 350 -100 350 N\nP 4 0 0 0 150 -50 125 -50 125 -125 100 -125 N\nP 4 0 0 0 150 -50 125 -50 125 -125 100 -125 N\nP 4 0 0 0 150 50 125 50 125 150 100 150 N\nP 4 0 0 0 150 50 125 50 125 150 100 150 N\nP 2 0 1 0 -275 -300 -250 -300 N\nP 2 0 1 0 -275 -200 -250 -200 N\nP 2 0 1 0 -275 0 -250 0 N\nP 2 0 1 0 -275 100 -250 100 N\nP 2 0 1 0 -270 300 -245 300 N\nP 2 0 1 0 -270 400 -245 400 N\nP 4 0 1 0 -250 -175 -250 -325 -100 -250 -250 -175 N\nP 4 0 1 0 -250 125 -250 -25 -100 50 -250 125 N\nP 4 0 1 0 -245 425 -245 275 -95 350 -245 425 N\nP 4 0 1 0 150 75 150 -75 280 0 150 75 N\nX X1 1 -500 400 100 R 50 50 1 1 I\nX -VS 10 0 -500 100 U 50 50 1 1 W\nX NC 11 400 -100 100 L 50 50 1 1 N N\nX Z2 12 -500 -300 100 R 50 50 1 1 I\nX Z1 13 -500 -200 100 R 50 50 1 1 I\nX VO 14 500 0 100 L 50 50 1 1 O\nX NC 15 400 -300 100 L 50 50 1 1 N N\nX +VS 16 0 600 100 D 50 50 1 1 W\nX X2 2 -500 300 100 R 50 50 1 1 I\nX NC 3 400 400 100 L 50 50 1 1 N N\nX SF 4 500 -200 100 L 50 50 1 1 P\nX NC 5 400 300 100 L 50 50 1 1 N N\nX Y1 6 -500 100 100 R 50 50 1 1 I\nX Y2 7 -500 0 100 R 50 50 1 1 I\nX NC 8 400 200 100 L 50 50 1 1 N N\nX NC 9 400 100 100 L 50 50 1 1 N N\nENDDRAW\nENDDEF\n#\n# PGA112\n#\nDEF PGA112 U 0 20 Y Y 1 F N\nF0 \"U\" -350 350 50 H V R CNN\nF1 \"PGA112\" 300 350 50 H V R CNN\nF2 \"Package_SO:TSSOP-10_3x3mm_P0.5mm\" -400 800 50 H I C CNN\nF3 \"\" -250 700 50 H I C CNN\nALIAS PGA113\n$FPLIST\n TSSOP*3x3mm*P0.5mm*\n$ENDFPLIST\nDRAW\nS -400 300 300 -300 0 1 10 f\nX AVDD 1 -100 400 100 D 50 50 1 1 W\nX DVDD 10 0 400 100 D 50 50 1 1 W\nX CH1 2 -500 -200 100 R 50 50 1 1 I\nX CH0/VCAL 3 -500 -100 100 R 50 50 1 1 I\nX VREF 4 -500 200 100 R 50 50 1 1 I\nX VOUT 5 400 -200 100 L 50 50 1 1 O\nX GND 6 0 -400 100 U 50 50 1 1 W\nX SCLK 7 400 200 100 L 50 50 1 1 I\nX DIO 8 400 100 100 L 50 50 1 1 B\nX ~CS 9 400 0 100 L 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Device.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP Amperemeter_AC\nD AC ammeter\nK ammeter AC ampere meter\nF ~\n$ENDCMP\n#\n$CMP Amperemeter_DC\nD DC ammeter\nK ammeter DC ampere meter\nF ~\n$ENDCMP\n#\n$CMP Antenna\nD Antenna\nK antenna\nF ~\n$ENDCMP\n#\n$CMP Antenna_Chip\nD Ceramic chip antenna with pin for PCB trace\nK antenna\nF ~\n$ENDCMP\n#\n$CMP Antenna_Dipole\nD Dipole antenna\nK dipole antenna\nF ~\n$ENDCMP\n#\n$CMP Antenna_Loop\nD Loop antenna\nK loop antenna\nF ~\n$ENDCMP\n#\n$CMP Antenna_Shield\nD Antenna with extra pin for shielding\nK antenna\nF ~\n$ENDCMP\n#\n$CMP Battery\nD Multiple-cell battery\nK batt voltage-source cell\nF ~\n$ENDCMP\n#\n$CMP Battery_Cell\nD Single-cell battery\nK battery cell\nF ~\n$ENDCMP\n#\n$CMP Buzzer\nD Buzzer, polarized\nK quartz resonator ceramic\nF ~\n$ENDCMP\n#\n$CMP C\nD Unpolarized capacitor\nK cap capacitor\nF ~\n$ENDCMP\n#\n$CMP CP\nD Polarized capacitor\nK cap capacitor\nF ~\n$ENDCMP\n#\n$CMP CP1\nD Polarized capacitor, US symbol\nK cap capacitor\nF ~\n$ENDCMP\n#\n$CMP CP1_Small\nD Polarized capacitor, small US symbol\nK cap capacitor\nF ~\n$ENDCMP\n#\n$CMP CP_Small\nD Polarized capacitor, small symbol\nK cap capacitor\nF ~\n$ENDCMP\n#\n$CMP CTRIM\nD Trimmable capacitor\nK trimmer variable capacitor\nF ~\n$ENDCMP\n#\n$CMP CTRIM_DIF\nD Differential variable capacitor with two stators\nK trimmer capacitor\nF ~\n$ENDCMP\n#\n$CMP CTRIM_Small\nD Trimmable capacitor, small symbol\nK trimmer variable capacitor\nF ~\n$ENDCMP\n#\n$CMP C_Feedthrough\nD Feedthrough capacitor\nK EMI filter feedthrough capacitor\nF ~\n$ENDCMP\n#\n$CMP C_Small\nD Unpolarized capacitor, small symbol\nK capacitor cap\nF ~\n$ENDCMP\n#\n$CMP C_Variable\nD Variable capacitor\nK trimmer capacitor\nF ~\n$ENDCMP\n#\n$CMP CircuitBreaker_1P\nD Single pole circuit breaker\nK CB\nF ~\n$ENDCMP\n#\n$CMP CircuitBreaker_1P_US\nD Single pole circuit breaker, US symbol\nK CB\nF ~\n$ENDCMP\n#\n$CMP CircuitBreaker_2P\nD Double pole circuit breaker\nK CB 2P\nF ~\n$ENDCMP\n#\n$CMP CircuitBreaker_2P_US\nD Double pole circuit breaker, US symbol\nK CB 2P\nF ~\n$ENDCMP\n#\n$CMP CircuitBreaker_3P\nD Triple pole circuit breaker\nK CB 3P\nF ~\n$ENDCMP\n#\n$CMP CircuitBreaker_3P_US\nD Triple pole circuit breaker, US symbol\nK CB 3P\nF ~\n$ENDCMP\n#\n$CMP Crystal\nD Two pin crystal\nK quartz ceramic resonator oscillator\nF ~\n$ENDCMP\n#\n$CMP Crystal_GND2\nD Three pin crystal, GND on pin 2\nK quartz ceramic resonator oscillator\nF ~\n$ENDCMP\n#\n$CMP Crystal_GND23\nD Four pin crystal, GND on pins 2 and 3\nK quartz ceramic resonator oscillator\nF ~\n$ENDCMP\n#\n$CMP Crystal_GND23_Small\nD Four pin crystal, GND on pins 2 and 3, small symbol\nK quartz ceramic resonator oscillator\nF ~\n$ENDCMP\n#\n$CMP Crystal_GND24\nD Four pin crystal, GND on pins 2 and 4\nK quartz ceramic resonator oscillator\nF ~\n$ENDCMP\n#\n$CMP Crystal_GND24_Small\nD Four pin crystal, GND on pins 2 and 4, small symbol\nK quartz ceramic resonator oscillator\nF ~\n$ENDCMP\n#\n$CMP Crystal_GND2_Small\nD Three pin crystal, GND on pin 2, small symbol\nK quartz ceramic resonator oscillator\nF ~\n$ENDCMP\n#\n$CMP Crystal_GND3\nD Three pin crystal, GND on pin 3\nK quartz ceramic resonator oscillator\nF ~\n$ENDCMP\n#\n$CMP Crystal_GND3_Small\nD Three pin crystal, GND on pin 3, small symbol\nK quartz ceramic resonator oscillator\nF ~\n$ENDCMP\n#\n$CMP Crystal_Small\nD Two pin crystal, small symbol\nK quartz ceramic resonator oscillator\nF ~\n$ENDCMP\n#\n$CMP D\nD Diode\nK diode\nF ~\n$ENDCMP\n#\n$CMP DIAC\nD Diode for alternating current\nK AC diode DIAC\nF ~\n$ENDCMP\n#\n$CMP DIAC_ALT\nD Diode for alternating current, filled shape\nK AC diode DIAC\nF ~\n$ENDCMP\n#\n$CMP D_AAK\nD Diode, anode on pins 1 and 2\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_ALT\nD Diode, filled shape\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Bridge_+-AA\nD Diode bridge, +ve/-ve/AC/AC\nK rectifier ACDC\nF ~\n$ENDCMP\n#\n$CMP D_Bridge_+A-A\nD Diode bridge, +ve/AC/-ve/AC\nK rectifier ACDC\nF ~\n$ENDCMP\n#\n$CMP D_Bridge_+AA-\nD Diode bridge, +ve/AC/AC/-ve\nK rectifier ACDC\nF ~\n$ENDCMP\n#\n$CMP D_Bridge_-A+A\nD Diode bridge, -ve/AC/+ve/AC\nK rectifier ACDC\nF ~\n$ENDCMP\n#\n$CMP D_Bridge_-AA+\nD Diode bridge, -ve/AC/AC/+ve\nK rectifier ACDC\nF ~\n$ENDCMP\n#\n$CMP D_Capacitance\nD Variable capacitance diode\nK capacitance diode varicap varactor\nF ~\n$ENDCMP\n#\n$CMP D_Capacitance_ALT\nD Variable capacitance diode, filled shape\nK capacitance diode varicap varactor\nF ~\n$ENDCMP\n#\n$CMP D_KAA\nD Diode, anode on pins 2 and 3\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_KAK\nD Diode, cathode on pins 1 and 3\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_KKA\nD Diode, cathode on pins 1 and 2\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Photo\nD Photodiode\nK photodiode diode opto\nF ~\n$ENDCMP\n#\n$CMP D_Photo_ALT\nD Photodiode, filled shape\nK photodiode diode opto\nF ~\n$ENDCMP\n#\n$CMP D_Radiation\nD Semiconductor radiation detector\nK radiation detector diode\nF ~\n$ENDCMP\n#\n$CMP D_Radiation_ALT\nD Semiconductor radiation detector, filled shape\nK radiation detector diode\nF ~\n$ENDCMP\n#\n$CMP D_Schottky\nD Schottky diode\nK diode Schottky\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_AAK\nD Schottky diode, anode on pins 1 and 2\nK diode Schottky SCHDPAK\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_AKA\nD Schottky diode, anode on pins 1 and 3\nK diode Schottky SCHDPAK\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_AKK\nD Schottky diode, cathode on pins 2 and 3\nK diode Schottky SCHDPAK\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_ALT\nD Schottky diode, filled shape\nK diode Schottky\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_KAA\nD Schottky diode, anode on pins 2 and 3\nK diode Schottky SCHDPAK\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_KAK\nD Schottky diode, cathode on pins 1 and 3\nK diode Schottky SCHDPAK\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_KKA\nD Schottky diode, cathode on pins 1 and 2\nK diode Schottky SCHDPAK\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_Small\nD Schottky diode, small symbol\nK diode Schottky\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_Small_ALT\nD Schottky diode, small symbol, filled shape\nK diode Schottky\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_x2_ACom_AKK\nD Dual Schottky diode, common anode on pin 1\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_x2_ACom_KAK\nD Dual Schottky diode, common anode on pin 2\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_x2_ACom_KKA\nD Dual Schottky diode, common anode on pin 3\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_x2_KCom_AAK\nD Dual Schottky diode, common cathode on pin 3\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_x2_KCom_AKA\nD Dual Schottky diode, common cathode on pin 2\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_x2_KCom_KAA\nD Dual Schottky diode, common cathode on pin 1\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_x2_Serial_ACK\nD Dual Schottky diode, anode/center/cathode\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_x2_Serial_AKC\nD Dual Schottky diode, anode/cathode/center\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_x2_Serial_CAK\nD Dual Schottky diode, center/anode/cathode\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_x2_Serial_CKA\nD Dual Schottky diode, center/cathode/anode\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_x2_Serial_KAC\nD Dual Schottky diode, cathode/anode/center\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Schottky_x2_Serial_KCA\nD Dual Schottky diode, cathode/center/anode\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Shockley\nD Shockley (PNPN) diode\nK Shockley diode PNPN\nF ~\n$ENDCMP\n#\n$CMP D_SiPM\nD Silicon photomultiplier\nK SiPM MPPC SPAD photon counting\nF ~\n$ENDCMP\n#\n$CMP D_Small\nD Diode, small symbol\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Small_ALT\nD Diode, small symbol, filled shape\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_TVS\nD Bidirectional transient-voltage-suppression diode\nK diode TVS thyrector\nF ~\n$ENDCMP\n#\n$CMP D_TVS_ALT\nD Bidirectional transient-voltage-suppression diode, filled shape\nK diode TVS thyrector\nF ~\n$ENDCMP\n#\n$CMP D_TVS_x2_AAC\nD Bidirectional dual transient-voltage-suppression diode, center on pin 3\nK diode TVS thyrector\nF ~\n$ENDCMP\n#\n$CMP D_TVS_x2_ACA\nD Bidirectional dual transient-voltage-suppression diode, center on pin 2\nK diode TVS thyrector\nF ~\n$ENDCMP\n#\n$CMP D_TVS_x2_CAA\nD Bidirectional dual transient-voltage-suppression diode, center on pin 1\nK diode TVS thyrector\nF ~\n$ENDCMP\n#\n$CMP D_Temperature_Dependent\nD Temperature dependent diode\nK temperature sensor diode\nF ~\n$ENDCMP\n#\n$CMP D_Temperature_Dependent_ALT\nD Temperature dependent diode, filled shape\nK temperature sensor diode\nF ~\n$ENDCMP\n#\n$CMP D_Tunnel\nD Tunnel diode (Esaki diode)\nK tunnel diode\nF ~\n$ENDCMP\n#\n$CMP D_Tunnel_ALT\nD Tunnel diode (Esaki diode), filled shape\nK tunnel diode\nF ~\n$ENDCMP\n#\n$CMP D_Unitunnel\nD Unitunnel diode\nK unitunnel diode\nF ~\n$ENDCMP\n#\n$CMP D_Unitunnel_ALT\nD Unitunnel diode, filled shape\nK unitunnel diode\nF ~\n$ENDCMP\n#\n$CMP D_Zener\nD Zener diode\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Zener_ALT\nD Zener diode, filled shape\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Zener_Small\nD Zener diode, small symbol\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Zener_Small_ALT\nD Zener diode, small symbol, filled shape\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_Zener_x2_ACom_AKK\nD Dual Zener diode, common anode on pin 1\nK diode zener dual\nF ~\n$ENDCMP\n#\n$CMP D_Zener_x2_ACom_KAK\nD Dual Zener diode, common anode on pin 2\nK diode zener dual\nF ~\n$ENDCMP\n#\n$CMP D_Zener_x2_ACom_KKA\nD Dual Zener diode, common anode on pin 3\nK diode zener dual\nF ~\n$ENDCMP\n#\n$CMP D_Zener_x2_KCom_AAK\nD Dual Zener diode, common cathode on pin 3\nK diode zener dual\nF ~\n$ENDCMP\n#\n$CMP D_Zener_x2_KCom_AKA\nD Dual Zener diode, common cathode on pin 2\nK diode zener dual\nF ~\n$ENDCMP\n#\n$CMP D_Zener_x2_KCom_KAA\nD Dual Zener diode, common cathode on pin 1\nK diode zener dual\nF ~\n$ENDCMP\n#\n$CMP D_x2_ACom_AKK\nD Dual diode, common anode on pin 1\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_x2_ACom_KAK\nD Dual diode, common anode on pin 2\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_x2_ACom_KKA\nD Dual diode, common anode on pin 3\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_x2_KCom_AAK\nD Dual diode, common cathode on pin 3\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_x2_KCom_AKA\nD Dual diode, common cathode on pin 2\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_x2_KCom_KAA\nD Dual diode, common cathode on pin 1\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_x2_Serial_ACK\nD Dual diode, anode/center/cathode\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_x2_Serial_AKC\nD Dual diode, anode/cathode/center\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_x2_Serial_CAK\nD Dual diode, center/anode/cathode\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_x2_Serial_CKA\nD Dual diode, center/cathode/anode\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_x2_Serial_KAC\nD Dual diode, cathode/anode/center\nK diode\nF ~\n$ENDCMP\n#\n$CMP D_x2_Serial_KCA\nD Dual diode, cathode/center/anode\nK diode\nF ~\n$ENDCMP\n#\n$CMP Delay_Line\nD Delay line\nK delay propagation retard impedance\nF ~\n$ENDCMP\n#\n$CMP EMI_Filter_C\nD EMI filter, single capacitor\nK EMI filter feedthrough capacitor\nF http://www.murata.com/~/media/webrenewal/support/library/catalog/products/emc/emifil/c31e.ashx?la=en-gb\n$ENDCMP\n#\n$CMP EMI_Filter_CLC\nD EMI T-filter (CLC)\nK EMI T-filter\nF http://www.murata.com/~/media/webrenewal/support/library/catalog/products/emc/emifil/c31e.ashx?la=en-gb\n$ENDCMP\n#\n$CMP EMI_Filter_CommonMode\nD EMI 2-inductor common mode filter\nK EMI common mode filter\nF ~\n$ENDCMP\n#\n$CMP EMI_Filter_LCL\nD EMI T-filter (LCL)\nK EMI T-filter\nF http://www.murata.com/~/media/webrenewal/support/library/catalog/products/emc/emifil/c31e.ashx?la=en-gb\n$ENDCMP\n#\n$CMP EMI_Filter_LL\nD EMI 2-inductor filter\nK EMI filter\nF ~\n$ENDCMP\n#\n$CMP EMI_Filter_LL_1423\nD EMI 2-inductor filter, pin-connections 1-4 and 2-3\nK EMI filter common-mode choke\nF ~\n$ENDCMP\n#\n$CMP Earphone\nD Earphone, polarized\nK earphone speaker headphone\nF ~\n$ENDCMP\n#\n$CMP Electromagnetic_Actor\nD Electromagnetic actor\nK electromagnet coil inductor\nF ~\n$ENDCMP\n#\n$CMP Ferrite_Bead\nD Ferrite bead\nK L ferrite bead inductor filter\nF ~\n$ENDCMP\n#\n$CMP Ferrite_Bead_Small\nD Ferrite bead, small symbol\nK L ferrite bead inductor filter\nF ~\n$ENDCMP\n#\n$CMP Frequency_Counter\nD Frequency counter\nK frequency counter\nF ~\n$ENDCMP\n#\n$CMP Fuse\nD Fuse\nK fuse\nF ~\n$ENDCMP\n#\n$CMP Fuse_Polarized\nD Polarized fuse\nK fuse\nF ~\n$ENDCMP\n#\n$CMP Fuse_Polarized_Small\nD Polarized fuse, small symbol\nK fuse\nF ~\n$ENDCMP\n#\n$CMP Fuse_Small\nD Fuse, small symbol\nK fuse\nF ~\n$ENDCMP\n#\n$CMP Galvanometer\nD Galvanometer\nK galvanometer\nF ~\n$ENDCMP\n#\n$CMP Hall_Generator\nD Hall effect generator\nK Hall generator magnet\nF ~\n$ENDCMP\n#\n$CMP Heater\nD Resistive heater\nK heater R resistor\nF ~\n$ENDCMP\n#\n$CMP Jumper\nD Jumper, normally closed\nK jumper bridge link NC\nF ~\n$ENDCMP\n#\n$CMP Jumper_NC_Dual\nD Dual jumper, normally closed\nK jumper bridge link NC\nF ~\n$ENDCMP\n#\n$CMP Jumper_NC_Small\nD Jumper, normally closed, small symbol\nK jumper link bridge NC\nF ~\n$ENDCMP\n#\n$CMP Jumper_NO_Small\nD Jumper, normally open, small symbol\nK jumper link bridge NO\nF ~\n$ENDCMP\n#\n$CMP L\nD Inductor\nK inductor choke coil reactor magnetic\nF ~\n$ENDCMP\n#\n$CMP LED\nD Light emitting diode\nK LED diode\nF ~\n$ENDCMP\n#\n$CMP LED_ABRG\nD RGB LED, anode/blue/red/green\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_ALT\nD Light emitting diode, filled shape\nK LED diode\nF ~\n$ENDCMP\n#\n$CMP LED_ARBG\nD RGB LED, anode/red/blue/green\nK LED RGB Diode\nF ~\n$ENDCMP\n#\n$CMP LED_ARGB\nD RGB LED, anode/red/green/blue\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_BARG\nD RGB LED, blue/anode/red/green\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_BGRA\nD RGB LED, blue/green/red/anode\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_CRGB\nD RGB LED, cathode/red/green/blue\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_Dual_2pin\nD Dual LED, bidirectional\nK LED diode bicolor dual\nF ~\n$ENDCMP\n#\n$CMP LED_Dual_AAC\nD Dual LED, common cathode on pin 3\nK LED diode bicolor dual\nF ~\n$ENDCMP\n#\n$CMP LED_Dual_AACC\nD Dual LED, cathodes on pins 3 and 4\nK LED diode bicolor dual\nF ~\n$ENDCMP\n#\n$CMP LED_Dual_ACA\nD Dual LED, common cathode on pin 2\nK LED diode bicolor dual\nF ~\n$ENDCMP\n#\n$CMP LED_Dual_ACAC\nD Dual LED, cathodes on pins 2 and 4\nK LED diode bicolor dual\nF ~\n$ENDCMP\n#\n$CMP LED_Dual_CAC\nD Dual LED, common anode on pin 2\nK LED diode bicolor dual\nF ~\n$ENDCMP\n#\n$CMP LED_Dual_CACA\nD Dual LED, cathodes on pins 1 and 3\nK LED diode bicolor dual\nF ~\n$ENDCMP\n#\n$CMP LED_Dual_CCA\nD Dual LED, common anode on pin 3\nK LED diode bicolor dual\nF ~\n$ENDCMP\n#\n$CMP LED_PAD\nD Light emitting diode with pad\nK LED diode pad\nF ~\n$ENDCMP\n#\n$CMP LED_RABG\nD RGB LED, red/anode/blue/green\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_RAGB\nD RGB LED, red/anode/green/blue\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_RCBG\nD RGB LED, red/cathode/blue/green\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_RCGB\nD RGB LED, red/cathode/green/blue\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_RGB\nD RGB LED, 6 pin package\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_RGBA\nD RGB LED, red/green/blue/anode\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_RGBC\nD RGB LED, red/green/blue/cathode\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_RGB_EP\nD RGB LED, 6 pin package with exposed pad\nK LED RGB diode\nF ~\n$ENDCMP\n#\n$CMP LED_Series\nD Several LEDs in series\nK LED diode\nF ~\n$ENDCMP\n#\n$CMP LED_Series_PAD\nD Several LEDs in series with exposed pad\nK LED diode pad\nF ~\n$ENDCMP\n#\n$CMP LED_Small\nD Light emitting diode, small symbol\nK LED diode light-emitting-diode\nF ~\n$ENDCMP\n#\n$CMP LED_Small_ALT\nD Light emitting diode, small symbol, filled shape\nK LED diode light-emitting-diode\nF ~\n$ENDCMP\n#\n$CMP LTRIM\nD Variable inductor\nK inductor choke coil reactor magnetic\nF ~\n$ENDCMP\n#\n$CMP L_Core_Ferrite\nD Inductor with ferrite core\nK inductor choke coil reactor magnetic\nF ~\n$ENDCMP\n#\n$CMP L_Core_Ferrite_Coupled\nD Coupled inductor with ferrite core\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Ferrite_Coupled_1243\nD Coupled inductor with ferrite core\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Ferrite_Coupled_1324\nD Coupled inductor with ferrite core\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Ferrite_Coupled_1342\nD Coupled inductor with ferrite core\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Ferrite_Coupled_1423\nD Coupled inductor with ferrite core\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Ferrite_Coupled_Small\nD Coupled inductor with ferrite core, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Ferrite_Coupled_Small_1243\nD Coupled inductor with ferrite core, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Ferrite_Coupled_Small_1324\nD Coupled inductor with ferrite core, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Ferrite_Coupled_Small_1342\nD Coupled inductor with ferrite core, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Ferrite_Coupled_Small_1423\nD Coupled inductor with ferrite core, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Ferrite_Small\nD Inductor with ferrite core, small symbol\nK inductor choke coil reactor magnetic\nF ~\n$ENDCMP\n#\n$CMP L_Core_Iron\nD Inductor with iron core\nK inductor choke coil reactor magnetic\nF ~\n$ENDCMP\n#\n$CMP L_Core_Iron_Coupled\nD Coupled inductor with iron core\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Iron_Coupled_1243\nD Coupled inductor with iron core\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Iron_Coupled_1324\nD Coupled inductor with iron core\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Iron_Coupled_1342\nD Coupled inductor with iron core\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Iron_Coupled_1423\nD Coupled inductor with iron core\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Iron_Coupled_Small\nD Coupled inductor with iron core, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Iron_Coupled_Small_1243\nD Coupled inductor with iron core, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Iron_Coupled_Small_1324\nD Coupled inductor with iron core, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Iron_Coupled_Small_1342\nD Coupled inductor with iron core, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Iron_Coupled_Small_1423\nD Coupled inductor with iron core, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Core_Iron_Small\nD Inductor with iron core, small symbol\nK inductor choke coil reactor magnetic\nF ~\n$ENDCMP\n#\n$CMP L_Coupled\nD Coupled inductor\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Coupled_1243\nD Coupled inductor\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Coupled_1324\nD Coupled inductor\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Coupled_1342\nD Coupled inductor\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Coupled_1423\nD Coupled inductor\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Coupled_Small\nD Coupled inductor, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Coupled_Small_1243\nD Coupled inductor, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Coupled_Small_1324\nD Coupled inductor, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Coupled_Small_1342\nD Coupled inductor, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Coupled_Small_1423\nD Coupled inductor, small symbol\nK inductor choke coil reactor magnetic coupled\nF ~\n$ENDCMP\n#\n$CMP L_Small\nD Inductor, small symbol\nK inductor choke coil reactor magnetic\nF ~\n$ENDCMP\n#\n$CMP Lamp\nD Lamp\nK lamp\nF ~\n$ENDCMP\n#\n$CMP Lamp_Flash\nD Flash lamp tube\nK flash lamp\nF ~\n$ENDCMP\n#\n$CMP Lamp_Neon\nD Neon lamp\nK neon lamp\nF ~\n$ENDCMP\n#\n$CMP Laserdiode_1A3C\nD Laser diode, cathode on pin 3, anode on pin 1\nK opto laserdiode\nF ~\n$ENDCMP\n#\n$CMP Laserdiode_1C2A\nD Laser diode, cathode on pin 1, anode on pin 2\nK opto laserdiode\nF ~\n$ENDCMP\n#\n$CMP Laserdiode_M_TYPE\nD Laser diode with photodiode, common cathode on pin 2\nK opto laserdiode photodiode\nF http://www.egismos.disonhu.com/laser/diode-package.htm\n$ENDCMP\n#\n$CMP Laserdiode_N_TYPE\nD Laser diode with photodiode, center on pin 2, LD cathode on pin 1\nK opto laserdiode photodiode\nF http://www.egismos.disonhu.com/laser/diode-package.htm\n$ENDCMP\n#\n$CMP Laserdiode_P_TYPE\nD Laser diode with photodiode, center on pin 2, PD cathode on pin 3\nK opto laserdiode photodiode\nF http://www.egismos.disonhu.com/laser/diode-package.htm\n$ENDCMP\n#\n$CMP MEMRISTOR\nD Memristor\nK memristor\nF ~\n$ENDCMP\n#\n$CMP Microphone\nD Microphone\nK microphone\nF ~\n$ENDCMP\n#\n$CMP Microphone_Condenser\nD Condenser microphone\nK capacitance condenser microphone\nF ~\n$ENDCMP\n#\n$CMP Microphone_Crystal\nD Crystal microphone\nK microphone crystal\nF ~\n$ENDCMP\n#\n$CMP Microphone_Ultrasound\nD Ultrasound receiver\nK microphone ultrasound crystal\nF ~\n$ENDCMP\n#\n$CMP Net-Tie_2\nD Net tie, 2 pins\nK net tie short\nF ~\n$ENDCMP\n#\n$CMP Net-Tie_3\nD Net tie, 3 pins\nK net tie short\nF ~\n$ENDCMP\n#\n$CMP Net-Tie_3_Tee\nD Net tie, 3 pins, tee\nK net tie short\nF ~\n$ENDCMP\n#\n$CMP Net-Tie_4\nD Net tie, 4 pins\nK net tie short\nF ~\n$ENDCMP\n#\n$CMP Net-Tie_4_Cross\nD Net tie, 4 pins, cross\nK net tie short\nF ~\n$ENDCMP\n#\n$CMP Ohmmeter\nD Ohmmeter\nK ohmmeter resistance\nF ~\n$ENDCMP\n#\n$CMP Opamp_Dual_Generic\nD Dual operational amplifier\nK dual opamp\nF ~\n$ENDCMP\n#\n$CMP Opamp_Quad_Generic\nD Quad operational amplifier\nK quad opamp\nF ~\n$ENDCMP\n#\n$CMP Oscilloscope\nD Oscilloscope\nK oscilloscope\nF ~\n$ENDCMP\n#\n$CMP Peltier_Element\nD Peltier element, thermoelectric cooler\nK Peltier TEC\nF ~\n$ENDCMP\n#\n$CMP Polyfuse\nD Resettable fuse, polymeric positive temperature coefficient\nK resettable fuse PTC PPTC polyfuse polyswitch\nF ~\n$ENDCMP\n#\n$CMP Polyfuse_Small\nD Resettable fuse, polymeric positive temperature coefficient, small symbol\nK resettable fuse PTC PPTC polyfuse polyswitch\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_NMOS_G1S2G2D2S1D1\nD Dual NMOS transistor, 6 pin package\nK transistor NMOS N-MOS N-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_NMOS_S1G1D2S2G2D1\nD Dual NMOS transistor, 6 pin package\nK transistor NMOS N-MOS N-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_NPN_C2C1E1E2\nD Double NPN transistors, current mirror configuration\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_NPN_NPN_BRT_E1B1C2E2B2C1\nD Dual NPN bias resistor transistor, 6 pin package\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_NPN_NPN_C2E2C1E1B1B2\nD Dual NPN transistor, 6 pin package\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_NPN_NPN_E1B1C2E2B2C1\nD Dual NPN transistor, 6 pin package\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_NPN_PNP_BRT_E1B1C2E2B2C1\nD Dual NPN/PNP bias resistor transistor, 6 pin package\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_NPN_PNP_E1B1C2E2B2C1\nD Dual NPN/PNP transistor, 6 pin package\nK transistor NPN PNP\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_PMOS_G1S2G2D2S1D1\nD Dual PMOS transistor, 6 pin package\nK transistor PMOS P-MOS P-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_PMOS_S1G1D2S2G2D1\nD Dual PMOS transistor, 6 pin package\nK transistor PMOS P-MOS P-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_PMOS_S1G1S2G2D2D2D1D1\nD Dual PMOS transistor, 8 pin package\nK transistor PMOS P-MOS P-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_PNP_C2C1E1E2\nD Double PNP transistors, current mirror configuration\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_PNP_NPN_BRT_E1B1C2E2B2C1\nD Dual PNP/NPN bias resistor transistor, 6 pin package\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_PNP_PNP_BRT_E1B1C2E2B2C1\nD Dual PNP bias resistor transistor, 6 pin package\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_PNP_PNP_C1B1B2C2E2E1\nD Dual PNP transistor, 6 pin package\nK transistor PNP\nF https://www.diodes.com/assets/Datasheets/ds30437.pdf\n$ENDCMP\n#\n$CMP Q_DUAL_PNP_PNP_C2E2C1E1B1B2\nD Dual PNP transistor, 6 pin package\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_DUAL_PNP_PNP_E1B1C2E2B2C1\nD Dual PNP transistor, 6 pin package\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_NIGBT_CEG\nD N-IGBT transistor, collector/emitter/gate\nK transistor IGBT N-IGBT\nF ~\n$ENDCMP\n#\n$CMP Q_NIGBT_CGE\nD N-IGBT transistor, collector/gate/emitter\nK transistor IGBT N-IGBT\nF ~\n$ENDCMP\n#\n$CMP Q_NIGBT_ECG\nD N-IGBT transistor, emitter/collector/gate\nK transistor IGBT N-IGBT\nF ~\n$ENDCMP\n#\n$CMP Q_NIGBT_ECGC\nD N-IGBT transistor, emitter/collector/gate, collector connected to mounting plane\nK transistor IGBT N-IGBT\nF ~\n$ENDCMP\n#\n$CMP Q_NIGBT_EGC\nD N-IGBT transistor, emitter/gate/collector\nK transistor IGBT N-IGBT\nF ~\n$ENDCMP\n#\n$CMP Q_NIGBT_GCE\nD N-IGBT transistor, gate/collector/emitter\nK transistor IGBT N-IGBT\nF ~\n$ENDCMP\n#\n$CMP Q_NIGBT_GCEC\nD N-IGBT transistor, gate/collector/emitter, collector connected to mounting plane\nK transistor IGBT N-IGBT\nF ~\n$ENDCMP\n#\n$CMP Q_NIGBT_GEC\nD N-IGBT transistor, gate/emitter/collector\nK transistor IGBT N-IGBT\nF ~\n$ENDCMP\n#\n$CMP Q_NJFET_DGS\nD N-JFET transistor, drain/gate/source\nK transistor NJFET N-JFET\nF ~\n$ENDCMP\n#\n$CMP Q_NJFET_DSG\nD N-JFET transistor, drain/source/gate\nK transistor NJFET N-JFET\nF ~\n$ENDCMP\n#\n$CMP Q_NJFET_GDS\nD N-JFET transistor, gate/drain/source\nK transistor NJFET N-JFET\nF ~\n$ENDCMP\n#\n$CMP Q_NJFET_GSD\nD N-JFET transistor, gate/source/drain\nK transistor NJFET N-JFET\nF ~\n$ENDCMP\n#\n$CMP Q_NJFET_SDG\nD N-JFET transistor, source/drain/gate\nK transistor NJFET N-JFET\nF ~\n$ENDCMP\n#\n$CMP Q_NJFET_SGD\nD N-JFET transistor, source/gate/drain\nK transistor NJFET N-JFET\nF ~\n$ENDCMP\n#\n$CMP Q_NMOS_DGS\nD N-MOSFET transistor, drain/gate/source\nK transistor NMOS N-MOS N-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_NMOS_DSG\nD N-MOSFET transistor, drain/source/gate\nK transistor NMOS N-MOS N-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_NMOS_GDS\nD N-MOSFET transistor, gate/drain/source\nK transistor NMOS N-MOS N-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_NMOS_GDSD\nD N-MOSFET transistor, gate/drain/source, drain connected to mounting plane\nK transistor NMOS N-MOS N-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_NMOS_GSD\nD N-MOSFET transistor, gate/source/drain\nK transistor NMOS N-MOS N-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_NMOS_SDG\nD N-MOSFET transistor, source/drain/gate\nK transistor NMOS N-MOS N-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_NMOS_SDGD\nD N-MOSFET transistor, source/drain/gate, drain connected to mounting plane\nK transistor NMOS N-MOS N-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_NMOS_SGD\nD N-MOSFET transistor, source/gate/drain\nK transistor NMOS N-MOS N-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_BCE\nD NPN transistor, base/collector/emitter\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_BCEC\nD NPN transistor, base/collector/emitter, collector connected to mounting plane\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_BEC\nD NPN transistor, base/emitter/collector\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_BEC_BRT\nD NPN bias resistor transistor, base/emitter/collector\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_CBE\nD NPN transistor, collector/base/emitter\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_CEB\nD NPN transistor, collector/emitter/base\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_Darlington_BCE\nD NPN Darlington transistor, base/collector/emitter\nK transistor NPN Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_Darlington_BCEC\nD NPN Darlington transistor, base/collector/emitter, collector connected to mounting plane\nK transistor NPN Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_Darlington_BEC\nD NPN Darlington transistor, base/emitter/collector\nK transistor NPN Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_Darlington_CBE\nD NPN Darlington transistor, collector/base/emitter\nK transistor NPN Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_Darlington_CEB\nD NPN Darlington transistor, collector/emitter/base\nK transistor NPN Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_Darlington_EBC\nD NPN Darlington transistor, emitter/base/collector\nK transistor NPN Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_Darlington_ECB\nD NPN Darlington transistor, emitter/collector/base\nK transistor NPN Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_Darlington_ECBC\nD NPN Darlington transistor, emitter/collector/base, collector connected to mounting plane\nK transistor NPN Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_EBC\nD NPN transistor, emitter/base/collector\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_ECB\nD NPN transistor, emitter/collector/base\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_ECBC\nD NPN transistor, emitter/collector/base, collector connected to mounting plane\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_NPN_ECB_BRT\nD NPN transistor, emitter/collector/base\nK transistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_NUJT_BEB\nD N-Type unijunction transistor\nK transistor UJT\nF ~\n$ENDCMP\n#\n$CMP Q_PJFET_DGS\nD P-JFET transistor, drain/gate/source\nK transistor PJFET P-JFET\nF ~\n$ENDCMP\n#\n$CMP Q_PJFET_DSG\nD P-JFET transistor, drain/source/gate\nK transistor PJFET P-JFET\nF ~\n$ENDCMP\n#\n$CMP Q_PJFET_GDS\nD P-JFET transistor, gate/drain/source\nK transistor PJFET P-JFET\nF ~\n$ENDCMP\n#\n$CMP Q_PJFET_GSD\nD P-JFET transistor, gate/source/drain\nK transistor PJFET P-JFET\nF ~\n$ENDCMP\n#\n$CMP Q_PJFET_SDG\nD P-JFET transistor, source/drain/gate\nK transistor PJFET P-JFET\nF ~\n$ENDCMP\n#\n$CMP Q_PJFET_SGD\nD P-JFET transistor, source/gate/drain\nK transistor PJFET P-JFET\nF ~\n$ENDCMP\n#\n$CMP Q_PMOS_DGS\nD P-MOSFET transistor, drain/gate/source\nK transistor PMOS P-MOS P-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_PMOS_DSG\nD P-MOSFET transistor, drain/source/gate\nK transistor PMOS P-MOS P-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_PMOS_GDS\nD P-MOSFET transistor, gate/drain/source\nK transistor PMOS P-MOS P-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_PMOS_GDSD\nD P-MOSFET transistor, gate/drain/source, drain connected to mounting plane\nK transistor PMOS P-MOS P-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_PMOS_GSD\nD P-MOSFET transistor, gate/source/drain\nK transistor PMOS P-MOS P-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_PMOS_SDG\nD P-MOSFET transistor, source/drain/gate\nK transistor PMOS P-MOS P-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_PMOS_SDGD\nD P-MOSFET transistor, source/drain/gate, drain connected to mounting plane\nK transistor PMOS P-MOS P-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_PMOS_SGD\nD P-MOSFET transistor, source/gate/drain\nK transistor PMOS P-MOS P-MOSFET\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_BCE\nD PNP transistor, base/collector/emitter\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_BCEC\nD PNP transistor, base/collector/emitter, collector connected to mounting plane\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_BEC\nD PNP transistor, base/emitter/collector\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_BEC_BRT\nD PNP bias resistor transistor, base/emitter/collector\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_CBE\nD PNP transistor, collector/base/emitter\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_CEB\nD PNP transistor, collector/emitter/base\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_Darlington_BCE\nD PNP Darlington transistor, base/collector/emitter\nK transistor PNP Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_Darlington_BCEC\nD PNP Darlington transistor, base/collector/emitter, collector connected to mounting plane\nK transistor PNP Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_Darlington_BEC\nD PNP Darlington transistor, base/emitter/collector\nK transistor PNP Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_Darlington_CBE\nD PNP Darlington transistor, collector/base/emitter\nK transistor PNP Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_Darlington_CEB\nD PNP Darlington transistor, collector/emitter/base\nK transistor PNP Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_Darlington_EBC\nD PNP Darlington transistor, emitter/base/collector\nK transistor PNP Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_Darlington_ECB\nD PNP Darlington transistor, emitter/collector/base\nK transistor PNP Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_Darlington_ECBC\nD PNP Darlington transistor, emitter/collector/base, collector connected to mounting plane\nK transistor PNP Darlington\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_EBC\nD PNP transistor, emitter/base/collector\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_ECB\nD PNP transistor, emitter/collector/base\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_ECBC\nD PNP transistor, emitter/collector/base, collector connected to mounting plane\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_PNP_ECB_BRT\nD PNP bias resistor transistor, emitter/collector/base\nK transistor PNP\nF ~\n$ENDCMP\n#\n$CMP Q_PUJT_BEB\nD P-Type unijunction transistor\nK transistor UJT\nF ~\n$ENDCMP\n#\n$CMP Q_Photo_NPN\nD NPN phototransistor, collector/emitter\nK phototransistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_Photo_NPN_CBE\nD NPN phototransistor, collector/base/emitter\nK phototransistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_Photo_NPN_CE\nD NPN phototransistor, collector/emitter\nK phototransistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_Photo_NPN_EBC\nD NPN phototransistor, emitter/base/collector\nK phototransistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_Photo_NPN_EC\nD NPN phototransistor, emitter/collector\nK phototransistor NPN\nF ~\n$ENDCMP\n#\n$CMP Q_SCR_AGK\nD Silicon controlled rectifier, anode/gate/cathode\nK SCR thyristor\nF ~\n$ENDCMP\n#\n$CMP Q_SCR_AKG\nD Silicon controlled rectifier, anode/cathode/gate\nK SCR thyristor\nF ~\n$ENDCMP\n#\n$CMP Q_SCR_GAK\nD Silicon controlled rectifier, gate/anode/cathode\nK SCR thyristor\nF ~\n$ENDCMP\n#\n$CMP Q_SCR_GKA\nD Silicon controlled rectifier, gate/cathode/anode\nK SCR thyristor\nF ~\n$ENDCMP\n#\n$CMP Q_SCR_KAG\nD Silicon controlled rectifier, cathode/anode/gate\nK SCR thyristor\nF ~\n$ENDCMP\n#\n$CMP Q_SCR_KGA\nD Silicon controlled rectifier, cathode/gate/anode\nK SCR thyristor\nF ~\n$ENDCMP\n#\n$CMP Q_TRIAC_A1A2G\nD Triode for alternating current, anode1/anode2/gate\nK TRIAC\nF ~\n$ENDCMP\n#\n$CMP Q_TRIAC_A1GA2\nD Triode for alternating current, anode1/gate/anode2\nK TRIAC\nF ~\n$ENDCMP\n#\n$CMP Q_TRIAC_A2A1G\nD Triode for alternating current, anode2/anode1/gate\nK TRIAC\nF ~\n$ENDCMP\n#\n$CMP Q_TRIAC_A2GA1\nD Triode for alternating current, anode2/gate/anode1\nK TRIAC\nF ~\n$ENDCMP\n#\n$CMP Q_TRIAC_GA1A2\nD Triode for alternating current, gate/anode1/anode2\nK TRIAC\nF ~\n$ENDCMP\n#\n$CMP Q_TRIAC_GA2A1\nD Triode for alternating current, gate/anode2/anode1\nK TRIAC\nF ~\n$ENDCMP\n#\n$CMP R\nD Resistor\nK R res resistor\nF ~\n$ENDCMP\n#\n$CMP RF_Shield_One_Piece\nD One-piece EMI RF shielding cabinet\nK RF EMI shielding cabinet\nF ~\n$ENDCMP\n#\n$CMP RF_Shield_Two_Pieces\nD Two-piece EMI RF shielding cabinet\nK RF EMI shielding cabinet\nF ~\n$ENDCMP\n#\n$CMP RTRIM\nD Trimmable resistor (preset resistor)\nK R res resistor variable potentiometer trimmer\nF ~\n$ENDCMP\n#\n$CMP R_Network03\nD 3 resistor network, star topology, bussed resistors, small symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network03_Split\nD 3 resistor network, star topology, bussed resistors, split\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network03_US\nD 3 resistor network, star topology, bussed resistors, small US symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network04\nD 4 resistor network, star topology, bussed resistors, small symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network04_Split\nD 4 resistor network, star topology, bussed resistors, split\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network04_US\nD 4 resistor network, star topology, bussed resistors, small US symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network05\nD 5 resistor network, star topology, bussed resistors, small symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network05_Split\nD 5 resistor network, star topology, bussed resistors, split\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network05_US\nD 5 resistor network, star topology, bussed resistors, small US symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network06\nD 6 resistor network, star topology, bussed resistors, small symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network06_Split\nD 6 resistor network, star topology, bussed resistors, split\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network06_US\nD 6 resistor network, star topology, bussed resistors, small US symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network07\nD 7 resistor network, star topology, bussed resistors, small symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network07_Split\nD 7 resistor network, star topology, bussed resistors, split\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network07_US\nD 7 resistor network, star topology, bussed resistors, small US symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network08\nD 8 resistor network, star topology, bussed resistors, small symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network08_Split\nD 8 resistor network, star topology, bussed resistors, split\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network08_US\nD 8 resistor network, star topology, bussed resistors, small US symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network09\nD 9 resistor network, star topology, bussed resistors, small symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network09_Split\nD 9 resistor network, star topology, bussed resistors, split\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network09_US\nD 9 resistor network, star topology, bussed resistors, small US symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network10\nD 10 resistor network, star topology, bussed resistors, small symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network10_Split\nD 10 resistor network, star topology, bussed resistors, split\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network10_US\nD 10 resistor network, star topology, bussed resistors, small US symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network11\nD 11 resistor network, star topology, bussed resistors, small symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network11_Split\nD 11 resistor network, star topology, bussed resistors, split\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network11_US\nD 11 resistor network, star topology, bussed resistors, small US symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network12\nD 12 resistor network, star topology, bussed resistors, small symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network12_Split\nD 12 resistor network, star topology, bussed resistors, split\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network12_US\nD 12 resistor network, star topology, bussed resistors, small US symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network13\nD 13 resistor network, star topology, bussed resistors, small symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network13_Split\nD 13 resistor network, star topology, bussed resistors, split\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network13_US\nD 13 resistor network, star topology, bussed resistors, small US symbol\nK R network star-topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network_Dividers_x02_SIP\nD 2 voltage divider network, dual terminator, SIP package\nK R network divider topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network_Dividers_x03_SIP\nD 3 voltage divider network, dual terminator, SIP package\nK R network divider topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network_Dividers_x04_SIP\nD 4 voltage divider network, dual terminator, SIP package\nK R network divider topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network_Dividers_x05_SIP\nD 5 voltage divider network, dual terminator, SIP package\nK R network divider topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network_Dividers_x06_SIP\nD 6 voltage divider network, dual terminator, SIP package\nK R network divider topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network_Dividers_x07_SIP\nD 7 voltage divider network, dual terminator, SIP package\nK R network divider topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network_Dividers_x08_SIP\nD 8 voltage divider network, dual terminator, SIP package\nK R network divider topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network_Dividers_x09_SIP\nD 9 voltage divider network, dual terminator, SIP package\nK R network divider topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network_Dividers_x10_SIP\nD 10 voltage divider network, dual terminator, SIP package\nK R network divider topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Network_Dividers_x11_SIP\nD 11 voltage divider network, dual terminator, SIP package\nK R network divider topology\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_PHOTO\nD Photoresistor\nK resistor variable light sensitive opto LDR\nF ~\n$ENDCMP\n#\n$CMP R_POT\nD Potentiometer\nK resistor variable\nF ~\n$ENDCMP\n#\n$CMP R_POT_Dual\nD Dual potentiometer\nK resistor variable\nF ~\n$ENDCMP\n#\n$CMP R_POT_Dual_Separate\nD Dual potentiometer, separate units\nK resistor variable\nF ~\n$ENDCMP\n#\n$CMP R_POT_MountingPin\nD Potentiometer with a mounting pin\nK resistor variable\nF ~\n$ENDCMP\n#\n$CMP R_POT_Small\nD Potentiometer\nK resistor variable\nF ~\n$ENDCMP\n#\n$CMP R_POT_TRIM\nD Trim-potentiometer\nK resistor variable trimpot trimmer\nF ~\n$ENDCMP\n#\n$CMP R_POT_TRIM_US\nD Trim-potentiometer, US symbol\nK resistor variable trimpot trimmer\nF ~\n$ENDCMP\n#\n$CMP R_POT_US\nD Potentiometer, US symbol\nK resistor variable\nF ~\n$ENDCMP\n#\n$CMP R_Pack02\nD 2 resistor network, parallel topology\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack02_SIP\nD 2 resistor network, parallel topology, SIP package\nK R network parallel topology isolated\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Pack02_SIP_Split\nD 2 resistor network, parallel topology, SIP package, split\nK R network parallel topology isolated\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Pack02_Split\nD 2 resistor network, parallel topology, split\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack03\nD 3 resistor network, parallel topology\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack03_SIP\nD 3 resistor network, parallel topology, SIP package\nK R network parallel topology isolated\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Pack03_SIP_Split\nD 3 resistor network, parallel topology, SIP package, split\nK R network parallel topology isolated\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Pack03_Split\nD 3 resistor network, parallel topology, split\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack04\nD 4 resistor network, parallel topology\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack04_SIP\nD 4 resistor network, parallel topology, SIP package\nK R network parallel topology isolated\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Pack04_SIP_Split\nD 4 resistor network, parallel topology, SIP package, split\nK R network parallel topology isolated\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Pack04_Split\nD 4 resistor network, parallel topology, split\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack05\nD 5 resistor network, parallel topology\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack05_SIP\nD 5 resistor network, parallel topology, SIP package\nK R network parallel topology isolated\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Pack05_SIP_Split\nD 5 resistor network, parallel topology, SIP package, split\nK R network parallel topology isolated\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Pack05_Split\nD 5 resistor network, parallel topology, split\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack06\nD 6 resistor network, parallel topology\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack06_SIP\nD 6 resistor network, parallel topology, SIP package\nK R network parallel topology isolated\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Pack06_SIP_Split\nD 6 resistor network, parallel topology, SIP package, split\nK R network parallel topology isolated\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Pack06_Split\nD 6 resistor network, parallel topology, split\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack07\nD 7 resistor network, parallel topology\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack07_SIP\nD 7 resistor network, parallel topology, SIP package\nK R network parallel topology isolated\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Pack07_SIP_Split\nD 7 resistor network, parallel topology, SIP package, split\nK R network parallel topology isolated\nF http://www.vishay.com/docs/31509/csc.pdf\n$ENDCMP\n#\n$CMP R_Pack07_Split\nD 7 resistor network, parallel topology, split\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack08\nD 8 resistor network, parallel topology\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack08_Split\nD 8 resistor network, parallel topology, split\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack09\nD 9 resistor network, parallel topology\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack09_Split\nD 9 resistor network, parallel topology, split\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack10\nD 10 resistor network, parallel topology\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack10_Split\nD 10 resistor network, parallel topology, split\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack11\nD 11 resistor network, parallel topology\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Pack11_Split\nD 11 resistor network, parallel topology, split\nK R network parallel topology isolated\nF ~\n$ENDCMP\n#\n$CMP R_Shunt\nD Shunt resistor\nK R res shunt resistor\nF ~\n$ENDCMP\n#\n$CMP R_Shunt_US\nD Shunt resistor, US symbol\nK R res shunt resistor\nF ~\n$ENDCMP\n#\n$CMP R_Small\nD Resistor, small symbol\nK R resistor\nF ~\n$ENDCMP\n#\n$CMP R_Small_US\nD Resistor, small US symbol\nK r resistor\nF ~\n$ENDCMP\n#\n$CMP R_US\nD Resistor, US symbol\nK R res resistor\nF ~\n$ENDCMP\n#\n$CMP R_Variable\nD Variable resistor\nK R res resistor variable potentiometer rheostat\nF ~\n$ENDCMP\n#\n$CMP R_Variable_US\nD Variable resistor, US symbol\nK R res resistor variable potentiometer rheostat\nF ~\n$ENDCMP\n#\n$CMP Resonator\nD Three pin ceramic resonator\nK ceramic resonator\nF ~\n$ENDCMP\n#\n$CMP Resonator_Small\nD Three pin ceramic resonator, small symbol\nK ceramic resonator\nF ~\n$ENDCMP\n#\n$CMP Rotary_Encoder\nD Rotary encoder, dual channel, incremental quadrate outputs\nK rotary switch encoder\nF ~\n$ENDCMP\n#\n$CMP Rotary_Encoder_Switch\nD Rotary encoder, dual channel, incremental quadrate outputs, with switch\nK rotary switch encoder switch push button\nF ~\n$ENDCMP\n#\n$CMP SPARK_GAP\nD Spark gap\nK spark gap ESD electrostatic suppression\nF ~\n$ENDCMP\n#\n$CMP Solar_Cell\nD Single solar cell\nK solar cell\nF ~\n$ENDCMP\n#\n$CMP Solar_Cells\nD Multiple solar cells\nK solar cell\nF ~\n$ENDCMP\n#\n$CMP Speaker\nD Speaker\nK speaker sound\nF ~\n$ENDCMP\n#\n$CMP Speaker_Crystal\nD Crystal speaker/transducer\nK crystal speaker ultrasonic transducer\nF ~\n$ENDCMP\n#\n$CMP Speaker_Ultrasound\nD Ultrasonic transducer\nK crystal speaker ultrasonic transducer\nF ~\n$ENDCMP\n#\n$CMP Thermistor\nD Temperature dependent resistor\nK R res thermistor\nF ~\n$ENDCMP\n#\n$CMP Thermistor_NTC\nD Temperature dependent resistor, negative temperature coefficient\nK thermistor NTC resistor sensor RTD\nF ~\n$ENDCMP\n#\n$CMP Thermistor_NTC_3wire\nD Temperature dependent resistor, negative temperature coefficient, 3-wire interface\nK thermistor NTC resistor sensor RTD\nF ~\n$ENDCMP\n#\n$CMP Thermistor_NTC_4wire\nD Temperature dependent resistor, negative temperature coefficient, 4-wire interface\nK thermistor NTC resistor sensor RTD\nF ~\n$ENDCMP\n#\n$CMP Thermistor_NTC_US\nD Temperature dependent resistor, negative temperature coefficient, US symbol\nK thermistor NTC resistor sensor RTD\nF ~\n$ENDCMP\n#\n$CMP Thermistor_PTC\nD Temperature dependent resistor, positive temperature coefficient\nK resistor PTC thermistor sensor RTD\nF ~\n$ENDCMP\n#\n$CMP Thermistor_PTC_3wire\nD Temperature dependent resistor, positive temperature coefficient, 3-wire interface\nK resistor PTC thermistor sensor RTD\nF ~\n$ENDCMP\n#\n$CMP Thermistor_PTC_4wire\nD Temperature dependent resistor, positive temperature coefficient, 3-wire interface\nK resistor PTC thermistor sensor RTD\nF ~\n$ENDCMP\n#\n$CMP Thermistor_PTC_US\nD Temperature dependent resistor, positive temperature coefficient, US symbol\nK resistor PTC thermistor sensor RTD\nF ~\n$ENDCMP\n#\n$CMP Thermistor_US\nD Thermistor, temperature dependent resistor, US symbol\nK R res thermistor\nF ~\n$ENDCMP\n#\n$CMP Thermocouple\nD Thermocouple\nK thermocouple temperature sensor cold junction\nF ~\n$ENDCMP\n#\n$CMP Thermocouple_ALT\nD Thermocouple with connector block\nK thermocouple temperature sensor cold junction\nF ~\n$ENDCMP\n#\n$CMP Thermocouple_Block\nD Thermocouple with isothermal block\nK thermocouple temperature sensor cold junction\nF ~\n$ENDCMP\n#\n$CMP Transformer_1P_1S\nD Transformer, single primary, single secondary\nK transformer coil magnet\nF ~\n$ENDCMP\n#\n$CMP Transformer_1P_1S_SO8\nD Transformer, single primary, single secondary, SO-8 package\nK transformer coil magnet\nF ~\n$ENDCMP\n#\n$CMP Transformer_1P_2S\nD Transformer, single primary, dual secondary\nK transformer coil magnet\nF ~\n$ENDCMP\n#\n$CMP Transformer_1P_SS\nD Transformer, single primary, split secondary\nK transformer coil magnet\nF ~\n$ENDCMP\n#\n$CMP Transformer_AUDIO\nD Audio transformer\nK transformer coil magnet sound\nF ~\n$ENDCMP\n#\n$CMP Transformer_SP_1S\nD Transformer, split primary, single secondary\nK transformer coil magnet\nF ~\n$ENDCMP\n#\n$CMP Transformer_SP_2S\nD Transformer, split primary, dual secondary\nK transformer coil magnet\nF ~\n$ENDCMP\n#\n$CMP Varistor\nD Voltage dependent resistor\nK VDR resistance\nF ~\n$ENDCMP\n#\n$CMP Varistor_US\nD Voltage dependent resistor, US symbol\nK VDR resistance\nF ~\n$ENDCMP\n#\n$CMP Voltage_Divider\nD Voltage divider\nK R network voltage divider\nF ~\n$ENDCMP\n#\n$CMP Voltage_Divider_CenterPin1\nD Voltage divider, center on pin 1\nK R network voltage divider\nF ~\n$ENDCMP\n#\n$CMP Voltage_Divider_CenterPin3\nD Voltage divider, center on pin 3\nK R network voltage divider\nF ~\n$ENDCMP\n#\n$CMP Voltmeter_AC\nD AC voltmeter\nK voltmeter AC\nF ~\n$ENDCMP\n#\n$CMP Voltmeter_DC\nD DC voltmeter\nK voltmeter DC\nF ~\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Device.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# Amperemeter_AC\n#\nDEF Amperemeter_AC MES 0 1 N N 1 F N\nF0 \"MES\" -130 40 50 H V R CNN\nF1 \"Amperemeter_AC\" -130 -30 50 H V R CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nA -20 -54 21 -1633 -167 0 1 0 N -40 -60 0 -60\nA 20 -65 21 140 1660 0 1 0 N 40 -60 0 -60\nC 0 0 100 0 1 10 N\nT 0 0 25 100 0 0 0 A Normal 0 C C\nP 2 0 0 0 -125 -125 -75 -75 N\nP 2 0 0 0 75 75 125 125 N\nP 3 0 0 0 75 125 125 125 125 75 N\nX ~ 1 0 -200 100 U 50 50 1 1 P\nX ~ 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Amperemeter_DC\n#\nDEF Amperemeter_DC MES 0 1 N N 1 F N\nF0 \"MES\" -130 40 50 H V R CNN\nF1 \"Amperemeter_DC\" -130 -30 50 H V R CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nC 0 0 100 0 1 10 N\nT 0 0 0 100 0 0 0 A Normal 0 C C\nP 2 0 0 0 -125 -125 -75 -75 N\nP 2 0 0 0 75 75 125 125 N\nP 3 0 0 0 75 125 125 125 125 75 N\nP 2 0 1 0 10 150 30 150 N\nP 2 0 1 0 20 160 20 140 N\nX - 1 0 -200 100 U 50 50 1 1 P\nX + 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Antenna\n#\nDEF Antenna AE 0 40 N N 1 F N\nF0 \"AE\" -75 75 50 H V R CNN\nF1 \"Antenna\" -75 0 50 H V R CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 10 0 100 0 -150 N\nP 3 0 1 10 50 100 0 -100 -50 100 N\nX A 1 0 -200 100 U 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Antenna_Chip\n#\nDEF Antenna_Chip AE 0 40 N N 1 F N\nF0 \"AE\" 0 200 50 H V R CNN\nF1 \"Antenna_Chip\" 0 125 50 H V R CNN\nF2 \"\" -100 175 50 H I C CNN\nF3 \"\" -100 175 50 H I C CNN\nDRAW\nP 2 0 1 10 -100 0 -100 -25 N\nP 2 0 1 10 -100 0 -50 0 N\nP 2 0 1 10 50 0 100 0 N\nP 2 0 1 10 50 50 50 -50 N\nP 2 0 1 0 100 -25 100 0 N\nP 2 0 1 10 100 275 100 -75 N\nP 3 0 1 10 -50 50 -50 -50 -50 0 N\nP 3 0 1 10 150 275 100 75 50 275 N\nP 5 0 1 10 -25 50 25 50 25 -50 -25 -50 -25 50 N\nX FEED 1 -100 -100 100 U 50 50 1 1 I\nX PCB_Trace 2 100 -100 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Antenna_Dipole\n#\nDEF Antenna_Dipole AE 0 40 N N 1 F N\nF0 \"AE\" 50 50 50 H V C CNN\nF1 \"Antenna_Dipole\" 50 0 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 8 0 1 10 100 -150 100 -100 200 -100 200 -50 -100 -50 -100 -100 0 -100 0 -150 N\nX ~ 1 0 -200 100 U 50 50 1 1 I\nX ~ 2 100 -200 100 U 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Antenna_Loop\n#\nDEF Antenna_Loop AE 0 40 N N 1 F N\nF0 \"AE\" 50 250 50 H V C CNN\nF1 \"Antenna_Loop\" 50 200 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 7 0 1 10 100 -150 100 -100 200 0 50 150 -100 0 0 -100 0 -150 N\nX ~ 1 0 -200 100 U 50 50 1 1 I\nX ~ 2 100 -200 100 U 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Antenna_Shield\n#\nDEF Antenna_Shield AE 0 40 N N 1 F N\nF0 \"AE\" -75 175 50 H V R CNN\nF1 \"Antenna_Shield\" -75 100 50 H V R CNN\nF2 \"\" 0 100 50 H I C CNN\nF3 \"\" 0 100 50 H I C CNN\nDRAW\nA -1 -73 32 -882 1242 0 1 0 N 0 -105 -20 -45\nA 1 -73 32 -918 558 0 1 0 N 0 -105 20 -45\nC 30 -75 7 0 1 0 F\nP 2 0 1 0 0 -100 0 0 N\nP 2 0 1 10 0 200 0 -150 N\nP 2 0 1 0 30 -75 100 -75 N\nP 2 0 1 0 100 -100 100 -75 N\nP 3 0 1 10 50 200 0 0 -50 200 N\nX A 1 0 -200 100 U 50 50 1 1 I\nX Shield 2 100 -200 100 U 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Battery\n#\nDEF Battery BT 0 0 N N 1 F N\nF0 \"BT\" 100 100 50 H V L CNN\nF1 \"Battery\" 100 0 50 H V L CNN\nF2 \"\" 0 60 50 V I C CNN\nF3 \"\" 0 60 50 V I C CNN\nDRAW\nS -80 -55 80 -65 0 1 0 F\nS -80 70 80 60 0 1 0 F\nS -52 -78 50 -98 0 1 0 F\nS -52 47 50 27 0 1 0 F\nP 2 0 1 0 0 -60 0 -50 N\nP 2 0 1 0 0 -40 0 -30 N\nP 2 0 1 0 0 -20 0 -10 N\nP 2 0 1 0 0 0 0 10 N\nP 2 0 1 0 0 20 0 30 N\nP 2 0 1 0 0 70 0 100 N\nP 2 0 1 10 10 105 50 105 N\nP 2 0 1 10 30 125 30 85 N\nX + 1 0 200 100 D 50 50 1 1 P\nX - 2 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Battery_Cell\n#\nDEF Battery_Cell BT 0 0 N N 1 F N\nF0 \"BT\" 100 100 50 H V L CNN\nF1 \"Battery_Cell\" 100 0 50 H V L CNN\nF2 \"\" 0 60 50 V I C CNN\nF3 \"\" 0 60 50 V I C CNN\nDRAW\nS -90 70 90 60 0 1 0 F\nS -62 47 58 27 0 1 0 F\nP 2 0 1 0 0 30 0 0 N\nP 2 0 1 0 0 70 0 100 N\nP 2 0 1 10 20 135 60 135 N\nP 2 0 1 10 40 155 40 115 N\nX + 1 0 200 100 D 50 50 1 1 P\nX - 2 0 -100 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Buzzer\n#\nDEF Buzzer BZ 0 1 Y N 1 F N\nF0 \"BZ\" 150 50 50 H V L CNN\nF1 \"Buzzer\" 150 -50 50 H V L CNN\nF2 \"\" -25 100 50 V I C CNN\nF3 \"\" -25 100 50 V I C CNN\n$FPLIST\n *Buzzer*\n$ENDFPLIST\nDRAW\nA 0 0 125 -899 899 0 1 0 N 0 -125 0 125\nP 2 0 1 0 -65 75 -45 75 N\nP 2 0 1 0 -55 85 -55 65 N\nP 2 0 1 0 0 125 0 -125 N\nX - 1 -100 100 100 R 50 50 1 1 P\nX + 2 -100 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# C\n#\nDEF C C 0 10 N Y 1 F N\nF0 \"C\" 25 100 50 H V L CNN\nF1 \"C\" 25 -100 50 H V L CNN\nF2 \"\" 38 -150 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n C_*\n$ENDFPLIST\nDRAW\nP 2 0 1 20 -80 -30 80 -30 N\nP 2 0 1 20 -80 30 80 30 N\nX ~ 1 0 150 110 D 50 50 1 1 P\nX ~ 2 0 -150 110 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CP\n#\nDEF CP C 0 10 N Y 1 F N\nF0 \"C\" 25 100 50 H V L CNN\nF1 \"CP\" 25 -100 50 H V L CNN\nF2 \"\" 38 -150 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n CP_*\n$ENDFPLIST\nDRAW\nS -90 20 90 40 0 1 0 N\nS 90 -20 -90 -40 0 1 0 F\nP 2 0 1 0 -70 90 -30 90 N\nP 2 0 1 0 -50 110 -50 70 N\nX ~ 1 0 150 110 D 50 50 1 1 P\nX ~ 2 0 -150 110 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CP1\n#\nDEF CP1 C 0 10 N N 1 F N\nF0 \"C\" 25 100 50 H V L CNN\nF1 \"CP1\" 25 -100 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n CP_*\n$ENDFPLIST\nDRAW\nA 0 -150 128 1287 513 0 1 20 N -80 -50 80 -50\nP 2 0 1 20 -80 30 80 30 N\nP 2 0 1 0 -70 90 -30 90 N\nP 2 0 1 0 -50 70 -50 110 N\nX ~ 1 0 150 110 D 50 50 1 1 P\nX ~ 2 0 -150 130 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CP1_Small\n#\nDEF CP1_Small C 0 10 N N 1 F N\nF0 \"C\" 10 70 50 H V L CNN\nF1 \"CP1_Small\" 10 -80 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n CP_*\n$ENDFPLIST\nDRAW\nA 0 -140 125 1186 614 0 1 12 N -60 -30 60 -30\nP 2 0 1 12 -60 20 60 20 N\nP 2 0 1 0 -50 60 -30 60 N\nP 2 0 1 0 -40 50 -40 70 N\nX ~ 1 0 100 80 D 50 50 1 1 P\nX ~ 2 0 -100 80 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CP_Small\n#\nDEF CP_Small C 0 10 N N 1 F N\nF0 \"C\" 10 70 50 H V L CNN\nF1 \"CP_Small\" 10 -80 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n CP_*\n$ENDFPLIST\nDRAW\nS -60 -12 60 -27 0 1 0 F\nS -60 27 60 12 0 1 0 N\nP 2 0 1 0 -50 60 -30 60 N\nP 2 0 1 0 -40 50 -40 70 N\nX ~ 1 0 100 73 D 50 50 1 1 P\nX ~ 2 0 -100 73 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CTRIM\n#\nDEF CTRIM C 0 10 N N 1 F N\nF0 \"C\" 60 -80 50 H V C CNN\nF1 \"CTRIM\" 120 -140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 20 -80 -30 80 -30 N\nP 2 0 1 20 -80 30 80 30 N\nP 2 0 1 12 50 100 -50 -100 N\nP 2 0 1 12 50 100 15 120 N\nP 2 0 1 12 50 100 85 80 N\nX ~ 1 0 150 120 D 50 50 1 1 P\nX ~ 2 0 -150 120 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CTRIM_DIF\n#\nDEF CTRIM_DIF C 0 10 Y N 1 F N\nF0 \"C\" 200 50 50 H V L CNN\nF1 \"CTRIM_DIF\" 200 -25 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 20 -160 -30 160 -30 N\nP 2 0 1 20 -160 30 -40 30 N\nP 2 0 1 0 -100 50 -100 30 N\nP 2 0 1 0 -60 90 110 -80 N\nP 2 0 1 0 0 -50 0 -30 N\nP 2 0 1 20 40 30 160 30 N\nP 2 0 1 0 100 50 100 30 N\nP 3 0 1 0 -30 90 -60 90 -60 60 N\nX ~ 1 -100 150 100 D 50 50 1 1 P\nX ~ 2 0 -150 100 U 50 50 1 1 P\nX ~ 3 100 150 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CTRIM_Small\n#\nDEF CTRIM_Small C 0 10 N N 1 F N\nF0 \"C\" 60 -80 50 H V C CNN\nF1 \"CTRIM_Small\" 120 -140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n C_*\n$ENDFPLIST\nDRAW\nP 2 0 1 12 -60 -20 60 -20 N\nP 2 0 1 12 -60 20 60 20 N\nP 2 0 1 7 30 60 -30 -60 N\nP 2 0 1 7 50 50 15 70 N\nX ~ 1 0 100 80 D 50 50 1 1 P\nX ~ 2 0 -100 80 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# C_Feedthrough\n#\nDEF C_Feedthrough C 0 10 Y N 1 F N\nF0 \"C\" 0 300 50 H V C CNN\nF1 \"C_Feedthrough\" 0 225 50 H V C CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nALIAS EMI_Filter_C\nDRAW\nS -65 60 60 80 0 1 0 F\nS 60 120 -65 140 0 1 0 F\nP 2 0 1 0 -100 100 100 100 N\nP 2 0 1 0 0 0 0 70 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 0 -100 100 U 50 50 1 1 P\nX 3 3 200 100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# C_Small\n#\nDEF C_Small C 0 10 N N 1 F N\nF0 \"C\" 10 70 50 H V L CNN\nF1 \"C_Small\" 10 -80 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n C_*\n$ENDFPLIST\nDRAW\nP 2 0 1 13 -60 -20 60 -20 N\nP 2 0 1 12 -60 20 60 20 N\nX ~ 1 0 100 80 D 50 50 1 1 P\nX ~ 2 0 -100 80 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# C_Variable\n#\nDEF C_Variable C 0 10 N N 1 F N\nF0 \"C\" 25 -75 50 H V L CNN\nF1 \"C_Variable\" 25 -150 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 20 -80 -30 80 -30 N\nP 2 0 1 20 -80 30 80 30 N\nP 2 0 1 12 50 100 -50 -100 N\nP 2 0 1 12 50 100 20 90 N\nP 2 0 1 12 50 100 60 70 N\nX ~ 1 0 150 120 D 50 50 1 1 P\nX ~ 2 0 -150 120 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CircuitBreaker_1P\n#\nDEF CircuitBreaker_1P CB 0 20 Y Y 1 F N\nF0 \"CB\" 75 0 50 H V L CNN\nF1 \"CircuitBreaker_1P\" 75 75 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 0 -200 0 -150 N\nP 2 0 1 0 0 -150 -100 150 N\nP 2 1 1 0 -25 175 25 125 N\nP 2 1 1 0 0 200 0 150 N\nP 2 1 1 0 25 175 -25 125 N\nX ~ 1 0 300 100 D 50 50 1 1 P\nX ~ 2 0 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CircuitBreaker_1P_US\n#\nDEF CircuitBreaker_1P_US CB 0 20 Y Y 1 F N\nF0 \"CB\" 125 -50 50 H V L CNN\nF1 \"CircuitBreaker_1P_US\" 125 25 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nA -225 0 335 266 -266 0 1 0 N 75 150 75 -150\nC 0 -175 25 0 1 0 N\nC 0 175 25 0 1 0 N\nX ~ 1 0 300 100 D 50 50 1 1 P\nX ~ 2 0 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CircuitBreaker_2P\n#\nDEF CircuitBreaker_2P CB 0 20 Y Y 1 F N\nF0 \"CB\" 150 0 50 H V L CNN\nF1 \"CircuitBreaker_2P\" 150 100 50 H V L CNN\nF2 \"\" -100 0 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -150 0 -90 0 N\nP 2 0 1 0 -100 -150 -200 150 N\nP 2 0 1 0 -70 0 -20 0 N\nP 2 0 1 0 0 0 50 0 N\nP 2 0 1 0 100 -200 100 -150 N\nP 2 0 1 0 100 -150 0 150 N\nP 2 1 1 0 -125 175 -75 125 N\nP 2 1 1 0 -100 -150 -100 -200 N\nP 2 1 1 0 -100 200 -100 150 N\nP 2 1 1 0 -75 175 -125 125 N\nP 2 1 1 0 75 175 125 125 N\nP 2 1 1 0 100 200 100 150 N\nP 2 1 1 0 125 175 75 125 N\nX ~ 1 -100 300 100 D 50 50 1 1 P\nX ~ 2 -100 -300 100 U 50 50 1 1 P\nX ~ 3 100 300 100 D 50 50 1 1 P\nX ~ 4 100 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CircuitBreaker_2P_US\n#\nDEF CircuitBreaker_2P_US CB 0 20 Y Y 1 F N\nF0 \"CB\" 250 -50 50 H V L CNN\nF1 \"CircuitBreaker_2P_US\" 250 50 50 H V L CNN\nF2 \"\" -100 0 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nDRAW\nA -325 0 335 266 -266 0 1 0 N -25 150 -25 -150\nA -125 0 335 266 -266 1 1 0 N 175 150 175 -150\nC -100 -175 25 0 1 0 N\nC -100 175 25 0 1 0 N\nC 100 -175 25 1 1 0 N\nC 100 175 25 1 1 0 N\nP 2 0 1 0 10 0 10 0 N\nP 2 0 1 0 10 0 50 0 N\nP 2 0 1 0 70 0 110 0 N\nP 2 0 1 0 130 0 170 0 N\nP 2 0 1 0 190 0 210 0 N\nX ~ 1 -100 300 100 D 50 50 1 1 P\nX ~ 2 -100 -300 100 U 50 50 1 1 P\nX ~ 3 100 300 100 D 50 50 1 1 P\nX ~ 4 100 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CircuitBreaker_3P\n#\nDEF CircuitBreaker_3P CB 0 20 Y Y 1 F N\nF0 \"CB\" 250 0 50 H V L CNN\nF1 \"CircuitBreaker_3P\" 250 100 50 H V L CNN\nF2 \"\" 300 -100 50 H I C CNN\nF3 \"\" 250 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -250 0 -190 0 N\nP 2 0 1 0 -225 175 -175 125 N\nP 2 0 1 0 -200 -200 -200 -150 N\nP 2 0 1 0 -200 -150 -300 150 N\nP 2 0 1 0 -200 200 -200 150 N\nP 2 0 1 0 -175 175 -225 125 N\nP 2 0 1 0 -90 0 -20 0 N\nP 2 0 1 0 0 -200 0 -150 N\nP 2 0 1 0 0 -150 -100 150 N\nP 2 0 1 0 0 0 60 0 N\nP 2 0 1 0 0 200 0 150 N\nP 2 0 1 0 25 175 -25 125 N\nP 2 0 1 0 80 0 150 0 N\nP 2 0 1 0 175 175 225 125 N\nP 2 0 1 0 200 -200 200 -150 N\nP 2 0 1 0 200 -150 100 150 N\nP 2 0 1 0 200 200 200 150 N\nP 2 0 1 0 225 175 175 125 N\nP 3 0 1 0 -170 0 -110 0 -120 0 N\nP 3 0 1 0 -25 175 0 150 25 125 N\nX ~ 1 -200 300 100 D 50 50 1 1 P\nX ~ 2 -200 -300 100 U 50 50 1 1 P\nX ~ 3 0 300 100 D 50 50 1 1 P\nX ~ 4 0 -300 100 U 50 50 1 1 P\nX ~ 5 200 300 100 D 50 50 1 1 P\nX ~ 6 200 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CircuitBreaker_3P_US\n#\nDEF CircuitBreaker_3P_US CB 0 20 Y Y 1 F N\nF0 \"CB\" 400 0 50 H V L CNN\nF1 \"CircuitBreaker_3P_US\" 400 100 50 H V L CNN\nF2 \"\" 300 -100 50 H I C CNN\nF3 \"\" 400 0 50 H I C CNN\nDRAW\nA -225 0 335 266 -266 0 1 0 N 75 150 75 -150\nA -425 0 335 266 -266 1 1 0 N -125 150 -125 -150\nA -25 0 335 266 -266 1 1 0 N 275 150 275 -150\nC 0 -175 25 0 1 0 N\nC 0 175 25 0 1 0 N\nC -200 -175 25 1 1 0 N\nC -200 175 25 1 1 0 N\nC 200 -175 25 1 1 0 N\nC 200 175 25 1 1 0 N\nP 2 0 1 0 -90 0 -50 0 N\nP 2 0 1 0 -30 0 10 0 N\nP 2 0 1 0 30 0 70 0 N\nP 2 0 1 0 90 0 130 0 N\nP 2 0 1 0 150 0 190 0 N\nP 2 0 1 0 210 0 250 0 N\nP 2 0 1 0 270 0 310 0 N\nX ~ 1 -200 300 100 D 50 50 1 1 P\nX ~ 2 -200 -300 100 U 50 50 1 1 P\nX ~ 3 0 300 100 D 50 50 1 1 P\nX ~ 4 0 -300 100 U 50 50 1 1 P\nX ~ 5 200 300 100 D 50 50 1 1 P\nX ~ 6 200 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Crystal\n#\nDEF Crystal Y 0 40 N N 1 F N\nF0 \"Y\" 0 150 50 H V C CNN\nF1 \"Crystal\" 0 -150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Crystal*\n$ENDFPLIST\nDRAW\nS -45 100 45 -100 0 1 12 N\nP 2 0 1 0 -100 0 -75 0 N\nP 2 0 1 20 -75 -50 -75 50 N\nP 2 0 1 20 75 -50 75 50 N\nP 2 0 1 0 100 0 75 0 N\nX 1 1 -150 0 50 R 50 50 1 1 P\nX 2 2 150 0 50 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Crystal_GND2\n#\nDEF Crystal_GND2 Y 0 40 Y N 1 F N\nF0 \"Y\" 0 225 50 H V C CNN\nF1 \"Crystal_GND2\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Crystal*\n$ENDFPLIST\nDRAW\nS -45 100 45 -100 0 1 12 N\nP 2 0 1 0 -100 0 -75 0 N\nP 2 0 1 20 -75 -50 -75 50 N\nP 2 0 1 0 0 -150 0 -140 N\nP 2 0 1 0 75 0 100 0 N\nP 2 0 1 20 75 50 75 -50 N\nP 4 0 1 0 -100 -90 -100 -140 100 -140 100 -90 N\nX 1 1 -150 0 50 R 50 50 1 1 P\nX 2 2 0 -200 50 U 50 50 1 1 P\nX 3 3 150 0 50 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Crystal_GND23\n#\nDEF Crystal_GND23 Y 0 40 Y N 1 F N\nF0 \"Y\" 125 200 50 H V L CNN\nF1 \"Crystal_GND23\" 125 125 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Crystal*\n$ENDFPLIST\nDRAW\nS -45 100 45 -100 0 1 12 N\nP 2 0 1 0 -100 0 -80 0 N\nP 2 0 1 20 -80 -50 -80 50 N\nP 2 0 1 0 0 -150 0 -140 N\nP 2 0 1 0 0 140 0 150 N\nP 2 0 1 20 80 -50 80 50 N\nP 2 0 1 0 80 0 100 0 N\nP 4 0 1 0 -100 -90 -100 -140 100 -140 100 -90 N\nP 4 0 1 0 -100 90 -100 140 100 140 100 90 N\nX 1 1 -150 0 50 R 50 50 1 1 P\nX 2 2 0 200 50 D 50 50 1 1 P\nX 3 3 0 -200 50 U 50 50 1 1 P\nX 4 4 150 0 50 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Crystal_GND23_Small\n#\nDEF Crystal_GND23_Small Y 0 40 Y N 1 F N\nF0 \"Y\" 50 175 50 H V L CNN\nF1 \"Crystal_GND23_Small\" 50 100 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Crystal*\n$ENDFPLIST\nDRAW\nS -30 -60 30 60 0 1 0 N\nP 2 0 1 15 -50 -30 -50 30 N\nP 2 0 1 15 50 -30 50 30 N\nP 4 0 1 0 -50 -50 -50 -75 50 -75 50 -50 N\nP 4 0 1 0 -50 50 -50 75 50 75 50 50 N\nX 1 1 -100 0 50 R 30 50 1 1 P\nX 2 2 0 -100 25 U 30 50 1 1 P\nX 3 3 0 100 25 D 30 50 1 1 P\nX 4 4 100 0 50 L 30 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Crystal_GND24\n#\nDEF Crystal_GND24 Y 0 40 Y N 1 F N\nF0 \"Y\" 125 200 50 H V L CNN\nF1 \"Crystal_GND24\" 125 125 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Crystal*\n$ENDFPLIST\nDRAW\nS -45 100 45 -100 0 1 12 N\nP 2 0 1 0 -100 0 -80 0 N\nP 2 0 1 20 -80 -50 -80 50 N\nP 2 0 1 0 0 -150 0 -140 N\nP 2 0 1 0 0 140 0 150 N\nP 2 0 1 20 80 -50 80 50 N\nP 2 0 1 0 80 0 100 0 N\nP 4 0 1 0 -100 -90 -100 -140 100 -140 100 -90 N\nP 4 0 1 0 -100 90 -100 140 100 140 100 90 N\nX 1 1 -150 0 50 R 50 50 1 1 P\nX 2 2 0 200 50 D 50 50 1 1 P\nX 3 3 150 0 50 L 50 50 1 1 P\nX 4 4 0 -200 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Crystal_GND24_Small\n#\nDEF Crystal_GND24_Small Y 0 40 Y N 1 F N\nF0 \"Y\" 50 175 50 H V L CNN\nF1 \"Crystal_GND24_Small\" 50 100 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Crystal*\n$ENDFPLIST\nDRAW\nS -30 -60 30 60 0 1 0 N\nP 2 0 1 15 -50 -30 -50 30 N\nP 2 0 1 15 50 -30 50 30 N\nP 4 0 1 0 -50 -50 -50 -75 50 -75 50 -50 N\nP 4 0 1 0 -50 50 -50 75 50 75 50 50 N\nX 1 1 -100 0 50 R 30 50 1 1 P\nX 2 2 0 -100 25 U 30 50 1 1 P\nX 3 3 100 0 50 L 30 50 1 1 P\nX 4 4 0 100 25 D 30 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Crystal_GND2_Small\n#\nDEF Crystal_GND2_Small Y 0 40 Y N 1 F N\nF0 \"Y\" 0 200 50 H V C CNN\nF1 \"Crystal_GND2_Small\" 0 125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Crystal*\n$ENDFPLIST\nDRAW\nS -30 -60 30 60 0 1 0 N\nP 2 0 1 15 -50 -30 -50 30 N\nP 2 0 1 15 50 -30 50 30 N\nP 4 0 1 0 -50 -50 -50 -75 50 -75 50 -50 N\nX 1 1 -100 0 50 R 30 50 1 1 P\nX 2 2 0 -100 25 U 30 50 1 1 P\nX 3 3 100 0 50 L 30 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Crystal_GND3\n#\nDEF Crystal_GND3 Y 0 40 Y N 1 F N\nF0 \"Y\" 0 225 50 H V C CNN\nF1 \"Crystal_GND3\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Crystal*\n$ENDFPLIST\nDRAW\nS -45 100 45 -100 0 1 12 N\nP 2 0 1 0 -100 0 -75 0 N\nP 2 0 1 20 -75 -50 -75 50 N\nP 2 0 1 0 0 -150 0 -140 N\nP 2 0 1 0 75 0 100 0 N\nP 2 0 1 20 75 50 75 -50 N\nP 4 0 1 0 -100 -90 -100 -140 100 -140 100 -90 N\nX 1 1 -150 0 50 R 50 50 1 1 P\nX 2 2 150 0 50 L 50 50 1 1 P\nX 3 3 0 -200 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Crystal_GND3_Small\n#\nDEF Crystal_GND3_Small Y 0 40 Y N 1 F N\nF0 \"Y\" 0 200 50 H V C CNN\nF1 \"Crystal_GND3_Small\" 0 125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Crystal*\n$ENDFPLIST\nDRAW\nS -30 -60 30 60 0 1 0 N\nP 2 0 1 15 -50 -30 -50 30 N\nP 2 0 1 15 50 -30 50 30 N\nP 4 0 1 0 -50 -50 -50 -75 50 -75 50 -50 N\nX 1 1 -100 0 50 R 30 50 1 1 P\nX 2 2 100 0 50 L 30 50 1 1 P\nX 3 3 0 -100 25 U 30 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Crystal_Small\n#\nDEF Crystal_Small Y 0 40 N N 1 F N\nF0 \"Y\" 0 100 50 H V C CNN\nF1 \"Crystal_Small\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Crystal*\n$ENDFPLIST\nDRAW\nS -30 -60 30 60 0 1 0 N\nP 2 0 1 15 -50 -30 -50 30 N\nP 2 0 1 15 50 -30 50 30 N\nX 1 1 -100 0 50 R 50 50 1 1 P\nX 2 2 100 0 50 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D\n#\nDEF D D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DIAC\n#\nDEF DIAC D 0 40 N N 1 F N\nF0 \"D\" 0 150 50 H V C CNN\nF1 \"DIAC\" 0 -150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 4 0 1 10 -50 -100 -50 100 50 50 -50 0 F\nP 4 0 1 10 50 100 50 -100 -50 -50 50 0 F\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DIAC_ALT\n#\nDEF DIAC_ALT D 0 40 N N 1 F N\nF0 \"D\" 0 150 50 H V C CNN\nF1 \"DIAC_ALT\" 0 -150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 4 0 1 10 -50 -100 -50 100 50 50 -50 0 F\nP 4 0 1 10 50 100 50 -100 -50 -50 50 0 F\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_AAK\n#\nDEF D_AAK D 0 0 Y N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_AAK\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nC 100 0 10 0 1 0 F\nP 2 0 1 10 -50 50 -50 -50 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 0 150 100 100 100 100 0 -50 0 N\nX A 1 200 100 100 L 50 50 1 1 P\nX A 2 200 0 100 L 50 50 1 1 P\nX K 3 -150 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_ALT\n#\nDEF D_ALT D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_ALT\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 F\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Bridge_+-AA\n#\nDEF D_Bridge_+-AA D 0 0 Y Y 1 F N\nF0 \"D\" 100 275 50 H V L CNN\nF1 \"D_Bridge_+-AA\" 100 200 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*Bridge*\n D*Rectifier*\n$ENDFPLIST\nDRAW\nC -200 0 10 0 1 0 F\nC 0 -200 10 0 1 0 F\nC 0 200 10 0 1 0 F\nC 200 0 10 0 1 0 F\nP 2 0 1 10 -100 150 -50 100 N\nP 2 0 1 10 -50 -100 -100 -150 N\nP 2 0 1 10 100 -50 150 -100 N\nP 2 0 1 10 100 50 150 100 N\nP 4 0 1 10 -150 100 -100 50 -75 125 -150 100 N\nP 4 0 1 10 -100 -50 -150 -100 -75 -125 -100 -50 N\nP 4 0 1 10 50 100 100 150 125 75 50 100 N\nP 4 0 1 10 125 -75 50 -100 100 -150 125 -75 N\nP 5 0 1 0 -200 0 0 -200 200 0 0 200 -200 0 N\nX + 1 300 0 100 L 50 50 1 1 P\nX - 2 -300 0 100 R 50 50 1 1 P\nX ~~ 3 0 300 100 D 50 50 1 1 P\nX ~~ 4 0 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Bridge_+A-A\n#\nDEF D_Bridge_+A-A D 0 0 Y Y 1 F N\nF0 \"D\" 100 275 50 H V L CNN\nF1 \"D_Bridge_+A-A\" 100 200 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*Bridge*\n D*Rectifier*\n$ENDFPLIST\nDRAW\nC -200 0 10 0 1 0 F\nC 0 -200 10 0 1 0 F\nC 0 200 10 0 1 0 F\nC 200 0 10 0 1 0 F\nP 2 0 1 10 -100 150 -50 100 N\nP 2 0 1 10 -50 -100 -100 -150 N\nP 2 0 1 10 100 -50 150 -100 N\nP 2 0 1 10 100 50 150 100 N\nP 4 0 1 10 -150 100 -100 50 -75 125 -150 100 N\nP 4 0 1 10 -100 -50 -150 -100 -75 -125 -100 -50 N\nP 4 0 1 10 50 100 100 150 125 75 50 100 N\nP 4 0 1 10 125 -75 50 -100 100 -150 125 -75 N\nP 5 0 1 0 -200 0 0 -200 200 0 0 200 -200 0 N\nX + 1 300 0 100 L 50 50 1 1 P\nX ~~ 2 0 -300 100 U 50 50 1 1 P\nX - 3 -300 0 100 R 50 50 1 1 P\nX ~~ 4 0 300 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Bridge_+AA-\n#\nDEF D_Bridge_+AA- D 0 0 Y Y 1 F N\nF0 \"D\" 100 275 50 H V L CNN\nF1 \"D_Bridge_+AA-\" 100 200 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*Bridge*\n D*Rectifier*\n$ENDFPLIST\nDRAW\nC -200 0 10 0 1 0 F\nC 0 -200 10 0 1 0 F\nC 0 200 10 0 1 0 F\nC 200 0 10 0 1 0 F\nP 2 0 1 10 -100 150 -50 100 N\nP 2 0 1 10 -50 -100 -100 -150 N\nP 2 0 1 10 100 -50 150 -100 N\nP 2 0 1 10 100 50 150 100 N\nP 4 0 1 10 -150 100 -100 50 -75 125 -150 100 N\nP 4 0 1 10 -100 -50 -150 -100 -75 -125 -100 -50 N\nP 4 0 1 10 50 100 100 150 125 75 50 100 N\nP 4 0 1 10 125 -75 50 -100 100 -150 125 -75 N\nP 5 0 1 0 -200 0 0 -200 200 0 0 200 -200 0 N\nX + 1 300 0 100 L 50 50 1 1 P\nX ~~ 2 0 300 100 D 50 50 1 1 P\nX ~~ 3 0 -300 100 U 50 50 1 1 P\nX - 4 -300 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Bridge_-A+A\n#\nDEF D_Bridge_-A+A D 0 0 Y Y 1 F N\nF0 \"D\" 100 275 50 H V L CNN\nF1 \"D_Bridge_-A+A\" 100 200 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*Bridge*\n D*Rectifier*\n$ENDFPLIST\nDRAW\nC -200 0 10 0 1 0 F\nC 0 -200 10 0 1 0 F\nC 0 200 10 0 1 0 F\nC 200 0 10 0 1 0 F\nP 2 0 1 10 -100 150 -50 100 N\nP 2 0 1 10 -50 -100 -100 -150 N\nP 2 0 1 10 100 -50 150 -100 N\nP 2 0 1 10 100 50 150 100 N\nP 4 0 1 10 -150 100 -100 50 -75 125 -150 100 N\nP 4 0 1 10 -100 -50 -150 -100 -75 -125 -100 -50 N\nP 4 0 1 10 50 100 100 150 125 75 50 100 N\nP 4 0 1 10 125 -75 50 -100 100 -150 125 -75 N\nP 5 0 1 0 -200 0 0 -200 200 0 0 200 -200 0 N\nX - 1 -300 0 100 R 50 50 1 1 P\nX ~~ 2 0 -300 100 U 50 50 1 1 P\nX + 3 300 0 100 L 50 50 1 1 P\nX ~~ 4 0 300 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Bridge_-AA+\n#\nDEF D_Bridge_-AA+ D 0 0 Y Y 1 F N\nF0 \"D\" 100 275 50 H V L CNN\nF1 \"D_Bridge_-AA+\" 100 200 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*Bridge*\n D*Rectifier*\n$ENDFPLIST\nDRAW\nC -200 0 10 0 1 0 F\nC 0 -200 10 0 1 0 F\nC 0 200 10 0 1 0 F\nC 200 0 10 0 1 0 F\nP 2 0 1 10 -100 150 -50 100 N\nP 2 0 1 10 -50 -100 -100 -150 N\nP 2 0 1 10 100 -50 150 -100 N\nP 2 0 1 10 100 50 150 100 N\nP 4 0 1 10 -150 100 -100 50 -75 125 -150 100 N\nP 4 0 1 10 -100 -50 -150 -100 -75 -125 -100 -50 N\nP 4 0 1 10 50 100 100 150 125 75 50 100 N\nP 4 0 1 10 125 -75 50 -100 100 -150 125 -75 N\nP 5 0 1 0 -200 0 0 -200 200 0 0 200 -200 0 N\nX - 1 -300 0 100 R 50 50 1 1 P\nX ~~ 2 0 300 100 D 50 50 1 1 P\nX ~~ 3 0 -300 100 U 50 50 1 1 P\nX + 4 300 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Capacitance\n#\nDEF D_Capacitance D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Capacitance\" 0 -130 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -50 -70 -6 -70 N\nP 2 0 1 0 -50 0 50 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -6 -50 -6 -90 N\nP 2 0 1 0 6 -70 50 -70 N\nP 2 0 1 0 6 -50 6 -90 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Capacitance_ALT\n#\nDEF D_Capacitance_ALT D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Capacitance_ALT\" 0 -130 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -50 -70 -6 -70 N\nP 2 0 1 0 -50 0 50 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -6 -50 -6 -90 N\nP 2 0 1 0 6 -70 50 -70 N\nP 2 0 1 0 6 -50 6 -90 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 F\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_KAA\n#\nDEF D_KAA D 0 0 Y N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_KAA\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nC 100 0 10 0 1 0 F\nP 2 0 1 10 -50 50 -50 -50 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 0 150 100 100 100 100 0 -50 0 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 200 100 100 L 50 50 1 1 I\nX A 3 200 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_KAK\n#\nDEF D_KAK D 0 0 Y N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_KAK\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nC -150 0 10 0 1 0 F\nP 2 0 1 10 -50 50 -50 -50 N\nP 3 0 1 0 -150 100 -150 0 100 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -250 100 100 R 50 50 1 1 P\nX A 2 200 0 100 L 50 50 1 1 P\nX K 3 -250 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_KKA\n#\nDEF D_KKA D 0 0 Y N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_KKA\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nC -150 0 10 0 1 0 F\nP 2 0 1 10 -50 50 -50 -50 N\nP 4 0 1 0 -200 100 -150 100 -150 0 100 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -250 100 100 R 50 50 1 1 I\nX K 2 -250 0 100 R 50 50 1 1 P\nX A 3 200 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Photo\n#\nDEF D_Photo D 0 20 N N 1 F N\nF0 \"D\" 20 70 50 H V L CNN\nF1 \"D_Photo\" -40 -110 50 H V C CNN\nF2 \"\" -50 0 50 H I C CNN\nF3 \"\" -50 0 50 H I C CNN\nDRAW\nP 2 0 1 10 -100 50 -100 -50 N\nP 2 0 1 0 -80 70 -60 70 N\nP 2 0 1 0 0 0 -100 0 N\nP 3 0 1 0 -20 130 -80 70 -80 90 N\nP 4 0 1 10 0 -50 0 50 -100 0 0 -50 N\nP 5 0 1 0 30 130 -30 70 -30 90 -30 70 -10 70 N\nX K 1 -200 0 100 R 50 50 1 1 P\nX A 2 100 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Photo_ALT\n#\nDEF D_Photo_ALT D 0 20 N N 1 F N\nF0 \"D\" 20 70 50 H V L CNN\nF1 \"D_Photo_ALT\" -40 -110 50 H V C CNN\nF2 \"\" -50 0 50 H I C CNN\nF3 \"\" -50 0 50 H I C CNN\nDRAW\nP 2 0 1 10 -100 50 -100 -50 N\nP 2 0 1 0 -80 70 -60 70 N\nP 2 0 1 0 0 0 -100 0 N\nP 3 0 1 0 -20 130 -80 70 -80 90 N\nP 4 0 1 10 0 -50 0 50 -100 0 0 -50 F\nP 5 0 1 0 30 130 -30 70 -30 90 -30 70 -10 70 N\nX K 1 -200 0 100 R 50 50 1 1 P\nX A 2 100 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Radiation\n#\nDEF D_Radiation D 0 40 N N 1 F N\nF0 \"D\" -50 -90 50 H V C CNN\nF1 \"D_Radiation\" -50 -160 50 H V C CNN\nF2 \"\" -50 0 50 H I C CNN\nF3 \"\" -50 0 50 H I C CNN\nDRAW\nA -30 130 22 634 -1534 0 1 0 N -20 150 -50 120\nA -10 170 22 -1166 266 0 1 0 N -20 150 10 180\nA 10 110 22 634 -1534 0 1 0 N 20 130 -10 100\nA 30 150 22 -1166 266 0 1 0 N 20 130 50 160\nA 30 190 22 -1534 634 0 1 0 N 10 180 40 210\nA 70 170 22 -1534 634 0 1 0 N 50 160 80 190\nP 2 0 1 10 -100 50 -100 -50 N\nP 2 0 1 0 -80 90 -50 90 N\nP 2 0 1 0 -80 90 -50 120 N\nP 2 0 1 0 -80 120 -80 90 N\nP 2 0 1 0 -40 70 -10 70 N\nP 2 0 1 0 -40 70 -10 100 N\nP 2 0 1 0 -40 100 -40 70 N\nP 2 0 1 0 0 0 -100 0 N\nP 4 0 1 10 0 50 0 -50 -100 0 0 50 N\nX K 1 -200 0 100 R 50 50 1 1 P\nX A 2 100 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Radiation_ALT\n#\nDEF D_Radiation_ALT D 0 40 N N 1 F N\nF0 \"D\" -50 -90 50 H V C CNN\nF1 \"D_Radiation_ALT\" -50 -160 50 H V C CNN\nF2 \"\" -50 0 50 H I C CNN\nF3 \"\" -50 0 50 H I C CNN\nDRAW\nA -30 130 22 634 -1534 0 1 0 N -20 150 -50 120\nA -10 170 22 -1166 266 0 1 0 N -20 150 10 180\nA 10 110 22 634 -1534 0 1 0 N 20 130 -10 100\nA 30 150 22 -1166 266 0 1 0 N 20 130 50 160\nA 30 190 22 -1534 634 0 1 0 N 10 180 40 210\nA 70 170 22 -1534 634 0 1 0 N 50 160 80 190\nP 2 0 1 10 -100 50 -100 -50 N\nP 2 0 1 0 -80 90 -50 90 N\nP 2 0 1 0 -80 90 -50 120 N\nP 2 0 1 0 -80 120 -80 90 N\nP 2 0 1 0 -40 70 -10 70 N\nP 2 0 1 0 -40 70 -10 100 N\nP 2 0 1 0 -40 100 -40 70 N\nP 2 0 1 0 0 0 -100 0 N\nP 4 0 1 10 0 50 0 -50 -100 0 0 50 F\nX K 1 -200 0 100 R 50 50 1 1 P\nX A 2 100 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky\n#\nDEF D_Schottky D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Schottky\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_AAK\n#\nDEF D_Schottky_AAK D 0 0 Y N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Schottky_AAK\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nC 100 0 10 0 1 0 F\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 0 150 100 100 100 100 0 -50 0 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX A 1 200 100 100 L 50 50 1 1 P\nX A 2 200 0 100 L 50 50 1 1 P\nX K 3 -150 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_AKA\n#\nDEF D_Schottky_AKA D 0 0 Y N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Schottky_AKA\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nC 100 0 10 0 1 0 F\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 0 150 100 100 100 100 0 -50 0 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX A 1 200 100 100 L 50 50 1 1 I\nX K 2 -150 0 100 R 50 50 1 1 P\nX A 3 200 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_AKK\n#\nDEF D_Schottky_AKK D 0 0 Y N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Schottky_AKK\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nC -150 0 10 0 1 0 F\nP 4 0 1 0 -200 100 -150 100 -150 0 100 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX A 1 200 0 100 L 50 50 1 1 P\nX K 2 -250 100 100 R 50 50 1 1 I\nX K 3 -250 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_ALT\n#\nDEF D_Schottky_ALT D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Schottky_ALT\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 F\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_KAA\n#\nDEF D_Schottky_KAA D 0 0 Y N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Schottky_KAA\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nC 100 0 10 0 1 0 F\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 0 150 100 100 100 100 0 -50 0 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 200 100 100 L 50 50 1 1 I\nX A 3 200 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_KAK\n#\nDEF D_Schottky_KAK D 0 0 Y N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Schottky_KAK\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nC -150 0 10 0 1 0 F\nP 3 0 1 0 -150 100 -150 0 100 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -250 100 100 R 50 50 1 1 P\nX A 2 200 0 100 L 50 50 1 1 P\nX K 3 -250 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_KKA\n#\nDEF D_Schottky_KKA D 0 0 Y N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Schottky_KKA\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nC -150 0 10 0 1 0 F\nP 4 0 1 0 -200 100 -150 100 -150 0 100 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -250 100 100 R 50 50 1 1 I\nX K 2 -250 0 100 R 50 50 1 1 P\nX A 3 200 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_Small\n#\nDEF D_Schottky_Small D 0 10 N N 1 F N\nF0 \"D\" -50 80 50 H V L CNN\nF1 \"D_Schottky_Small\" -280 -80 50 H V L CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -30 0 30 0 N\nP 4 0 1 10 30 -40 -30 0 30 40 30 -40 N\nP 6 0 1 10 -50 30 -50 40 -30 40 -30 -40 -10 -40 -10 -30 N\nX K 1 -100 0 70 R 50 50 1 1 P\nX A 2 100 0 70 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_Small_ALT\n#\nDEF D_Schottky_Small_ALT D 0 10 N N 1 F N\nF0 \"D\" -50 80 50 H V L CNN\nF1 \"D_Schottky_Small_ALT\" -280 -80 50 H V L CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -30 0 30 0 N\nP 4 0 1 10 30 -40 -30 0 30 40 30 -40 F\nP 6 0 1 10 -50 30 -50 40 -30 40 -30 -40 -10 -40 -10 -30 N\nX K 1 -100 0 70 R 50 50 1 1 P\nX A 2 100 0 70 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_x2_ACom_AKK\n#\nDEF D_Schottky_x2_ACom_AKK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Schottky_x2_ACom_AKK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -140 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -150 50 -150 -50 -150 -50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 4 0 1 10 -150 50 -170 50 -170 40 -170 40 N\nP 4 0 1 10 150 -50 170 -50 170 -40 170 -40 N\nP 4 0 1 10 150 50 130 50 130 40 130 40 N\nP 5 0 1 10 -130 -40 -130 -50 -150 -50 -150 -50 -150 -50 N\nP 6 0 1 10 -50 -50 -150 0 -50 50 -50 -50 -50 -50 -50 -50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX A 1 0 -200 100 U 50 50 0 1 P\nX K 2 -300 0 150 R 50 50 0 1 P\nX K 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_x2_ACom_KAK\n#\nDEF D_Schottky_x2_ACom_KAK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Schottky_x2_ACom_KAK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -140 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -150 50 -150 -50 -150 -50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 4 0 1 10 -150 50 -170 50 -170 40 -170 40 N\nP 4 0 1 10 150 -50 170 -50 170 -40 170 -40 N\nP 4 0 1 10 150 50 130 50 130 40 130 40 N\nP 5 0 1 10 -130 -40 -130 -50 -150 -50 -150 -50 -150 -50 N\nP 6 0 1 10 -50 -50 -150 0 -50 50 -50 -50 -50 -50 -50 -50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX K 1 -300 0 150 R 50 50 0 1 P\nX A 2 0 -200 100 U 50 50 0 1 P\nX K 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_x2_ACom_KKA\n#\nDEF D_Schottky_x2_ACom_KKA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Schottky_x2_ACom_KKA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -140 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -150 50 -150 -50 -150 -50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 4 0 1 10 -150 50 -170 50 -170 40 -170 40 N\nP 4 0 1 10 150 -50 170 -50 170 -40 170 -40 N\nP 4 0 1 10 150 50 130 50 130 40 130 40 N\nP 5 0 1 10 -130 -40 -130 -50 -150 -50 -150 -50 -150 -50 N\nP 6 0 1 10 -50 -50 -150 0 -50 50 -50 -50 -50 -50 -50 -50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX K 1 -300 0 150 R 50 50 0 1 P\nX K 2 300 0 150 L 50 50 0 1 P\nX A 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_x2_KCom_AAK\n#\nDEF D_Schottky_x2_KCom_AAK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Schottky_x2_KCom_AAK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 50 -50 50 50 50 50 N\nP 4 0 1 10 -50 -50 -30 -50 -30 -40 -30 -40 N\nP 4 0 1 10 50 -50 70 -50 70 -40 70 -40 N\nP 4 0 1 10 50 50 30 50 30 40 30 40 N\nP 5 0 1 10 -70 40 -70 50 -50 50 -50 50 -50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX A 2 300 0 150 L 50 50 0 1 P\nX K 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_x2_KCom_AKA\n#\nDEF D_Schottky_x2_KCom_AKA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Schottky_x2_KCom_AKA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 0 0 0 -100 N\nP 2 0 1 0 150 0 -150 0 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 50 -50 50 50 50 50 N\nP 4 0 1 10 -50 -50 -30 -50 -30 -40 -30 -40 N\nP 4 0 1 10 50 -50 70 -50 70 -40 70 -40 N\nP 4 0 1 10 50 50 30 50 30 40 30 40 N\nP 5 0 1 10 -70 40 -70 50 -50 50 -50 50 -50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX K 2 0 -200 100 U 50 50 0 1 P\nX A 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_x2_KCom_KAA\n#\nDEF D_Schottky_x2_KCom_KAA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Schottky_x2_KCom_KAA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 50 -50 50 50 50 50 N\nP 4 0 1 10 -50 -50 -30 -50 -30 -40 -30 -40 N\nP 4 0 1 10 50 -50 70 -50 70 -40 70 -40 N\nP 4 0 1 10 50 50 30 50 30 40 30 40 N\nP 5 0 1 10 -70 40 -70 50 -50 50 -50 50 -50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX K 1 0 -200 100 U 50 50 0 1 P\nX A 2 -300 0 150 R 50 50 0 1 P\nX A 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_x2_Serial_ACK\n#\nDEF D_Schottky_x2_Serial_ACK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Schottky_x2_Serial_ACK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 0 0 0 -100 N\nP 2 0 1 0 150 0 -150 0 N\nP 2 0 1 0 250 0 300 0 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 4 0 1 10 -50 -50 -30 -50 -30 -40 -30 -40 N\nP 4 0 1 10 150 -50 170 -50 170 -40 170 -40 N\nP 4 0 1 10 150 50 130 50 130 40 130 40 N\nP 5 0 1 10 -70 40 -70 50 -50 50 -50 50 -50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX common 2 0 -200 100 U 50 50 0 1 P\nX K 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_x2_Serial_AKC\n#\nDEF D_Schottky_x2_Serial_AKC D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Schottky_x2_Serial_AKC\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 2 0 1 0 250 0 300 0 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 4 0 1 10 -50 -50 -30 -50 -30 -40 -30 -40 N\nP 4 0 1 10 150 -50 170 -50 170 -40 170 -40 N\nP 4 0 1 10 150 50 130 50 130 40 130 40 N\nP 5 0 1 10 -70 40 -70 50 -50 50 -50 50 -50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX K 2 300 0 150 L 50 50 0 1 P\nX common 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_x2_Serial_CAK\n#\nDEF D_Schottky_x2_Serial_CAK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Schottky_x2_Serial_CAK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 4 0 1 10 -50 -50 -30 -50 -30 -40 -30 -40 N\nP 4 0 1 10 150 -50 170 -50 170 -40 170 -40 N\nP 4 0 1 10 150 50 130 50 130 40 130 40 N\nP 5 0 1 10 -70 40 -70 50 -50 50 -50 50 -50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX common 1 0 -200 100 U 50 50 0 1 P\nX A 2 -300 0 150 R 50 50 0 1 P\nX K 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_x2_Serial_CKA\n#\nDEF D_Schottky_x2_Serial_CKA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Schottky_x2_Serial_CKA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 4 0 1 10 -50 -50 -30 -50 -30 -40 -30 -40 N\nP 4 0 1 10 150 -50 170 -50 170 -40 170 -40 N\nP 4 0 1 10 150 50 130 50 130 40 130 40 N\nP 5 0 1 10 -70 40 -70 50 -50 50 -50 50 -50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX common 1 0 -200 100 U 50 50 0 1 P\nX K 2 300 0 150 L 50 50 0 1 P\nX A 3 -300 0 150 R 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_x2_Serial_KAC\n#\nDEF D_Schottky_x2_Serial_KAC D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Schottky_x2_Serial_KAC\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 4 0 1 10 -50 -50 -30 -50 -30 -40 -30 -40 N\nP 4 0 1 10 150 -50 170 -50 170 -40 170 -40 N\nP 4 0 1 10 150 50 130 50 130 40 130 40 N\nP 5 0 1 10 -70 40 -70 50 -50 50 -50 50 -50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX K 1 300 0 150 L 50 50 0 1 P\nX A 2 -300 0 150 R 50 50 0 1 P\nX common 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Schottky_x2_Serial_KCA\n#\nDEF D_Schottky_x2_Serial_KCA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Schottky_x2_Serial_KCA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 2 0 1 0 250 0 300 0 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 4 0 1 10 -50 -50 -30 -50 -30 -40 -30 -40 N\nP 4 0 1 10 150 -50 170 -50 170 -40 170 -40 N\nP 4 0 1 10 150 50 130 50 130 40 130 40 N\nP 5 0 1 10 -70 40 -70 50 -50 50 -50 50 -50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX K 1 300 0 150 L 50 50 0 1 P\nX common 2 0 -200 100 U 50 50 0 1 P\nX A 3 -300 0 150 R 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Shockley\n#\nDEF D_Shockley D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Shockley\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -50 0 50 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 3 0 1 10 -50 0 50 50 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_SiPM\n#\nDEF D_SiPM D 0 20 N N 1 F N\nF0 \"D\" 70 70 50 H V L CNN\nF1 \"D_SiPM\" 10 -110 50 H V C CNN\nF2 \"\" 50 175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n MPPC*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -50 0 50 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -30 70 -10 70 N\nP 2 0 1 10 50 50 50 -50 N\nP 3 0 1 0 30 130 -30 70 -30 90 N\nP 3 0 1 10 50 50 -50 0 50 -50 N\nP 5 0 1 0 80 130 20 70 20 90 20 70 40 70 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Small\n#\nDEF D_Small D 0 10 N N 1 F N\nF0 \"D\" -50 80 50 H V L CNN\nF1 \"D_Small\" -150 -80 50 H V L CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -30 -40 -30 40 N\nP 2 0 1 0 -30 0 30 0 N\nP 4 0 1 10 30 -40 -30 0 30 40 30 -40 N\nX K 1 -100 0 70 R 50 50 1 1 P\nX A 2 100 0 70 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Small_ALT\n#\nDEF D_Small_ALT D 0 10 N N 1 F N\nF0 \"D\" -50 80 50 H V L CNN\nF1 \"D_Small_ALT\" -150 -80 50 H V L CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -30 -40 -30 40 N\nP 2 0 1 0 -30 0 30 0 N\nP 4 0 1 10 30 -40 -30 0 30 40 30 -40 F\nX K 1 -100 0 70 R 50 50 1 1 P\nX A 2 100 0 70 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_TVS\n#\nDEF D_TVS D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_TVS\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 20 50 0 50 0 -50 -20 -50 N\nP 5 0 1 10 -100 50 -100 -50 100 50 100 -50 -100 50 N\nX A1 1 -150 0 100 R 50 50 1 1 P\nX A2 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_TVS_ALT\n#\nDEF D_TVS_ALT D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_TVS_ALT\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 -100 -50 0 0 -100 50 -100 -50 F\nP 4 0 1 10 20 50 0 50 0 -50 -20 -50 N\nP 4 0 1 10 100 50 100 -50 0 0 100 50 F\nX A1 1 -150 0 100 R 50 50 1 1 P\nX A2 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_TVS_x2_AAC\n#\nDEF D_TVS_x2_AAC D 0 40 Y N 1 F N\nF0 \"D\" 0 175 50 H V C CNN\nF1 \"D_TVS_x2_AAC\" 0 100 50 H V C CNN\nF2 \"\" -150 0 50 H I C CNN\nF3 \"\" -150 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 0 0 0 -50 0 0 N\nP 2 0 1 0 -250 0 250 0 N\nP 4 0 1 10 -130 50 -150 50 -150 -50 -170 -50 N\nP 4 0 1 10 170 50 150 50 150 -50 130 -50 N\nP 5 0 1 10 -250 50 -50 -50 -50 50 -250 -50 -250 50 N\nP 5 0 1 10 250 50 50 -50 50 50 250 -50 250 50 N\nX A1 1 -350 0 100 R 50 50 1 1 P\nX A2 2 350 0 100 L 50 50 1 1 P\nX common 3 0 -150 100 U 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# D_TVS_x2_ACA\n#\nDEF D_TVS_x2_ACA D 0 40 Y N 1 F N\nF0 \"D\" 0 175 50 H V C CNN\nF1 \"D_TVS_x2_ACA\" 0 100 50 H V C CNN\nF2 \"\" -150 0 50 H I C CNN\nF3 \"\" -150 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 5 0 0 10 -250 -50 -50 50 -50 -50 -250 50 -250 -50 N\nP 5 0 0 10 50 50 50 -50 250 50 250 -50 50 50 N\nP 2 0 1 0 -250 0 250 0 N\nP 2 0 1 0 0 0 0 -50 N\nP 4 0 1 10 -130 50 -150 50 -150 -50 -170 -50 N\nP 4 0 1 10 170 50 150 50 150 -50 130 -50 N\nX A1 1 -350 0 100 R 50 50 1 1 P\nX common 2 0 -150 100 U 50 50 1 1 I\nX A2 3 350 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_TVS_x2_CAA\n#\nDEF D_TVS_x2_CAA D 0 40 Y N 1 F N\nF0 \"D\" 0 175 50 H V C CNN\nF1 \"D_TVS_x2_CAA\" 0 100 50 H V C CNN\nF2 \"\" -150 0 50 H I C CNN\nF3 \"\" -150 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -250 0 250 0 N\nP 2 0 1 0 0 0 0 -50 N\nP 4 0 1 10 -130 50 -150 50 -150 -50 -170 -50 N\nP 4 0 1 10 170 50 150 50 150 -50 130 -50 N\nP 5 0 1 10 -250 -50 -50 50 -50 -50 -250 50 -250 -50 N\nP 6 0 1 10 50 40 50 -50 250 50 250 -50 50 50 50 40 N\nX common 1 0 -150 100 U 50 50 1 1 I\nX A1 2 -350 0 100 R 50 50 1 1 P\nX A2 3 350 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Temperature_Dependent\n#\nDEF D_Temperature_Dependent D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Temperature_Dependent\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nA -104 -54 7 -265 818 0 1 0 N -98 -57 -103 -47\nA -88 -57 10 1800 -900 0 1 0 N -98 -57 -88 -67\nA -88 -57 10 -900 0 0 1 0 N -88 -67 -78 -57\nA -88 -32 10 0 900 0 1 0 N -78 -32 -88 -22\nA -88 -32 10 900 1800 0 1 0 N -88 -22 -98 -32\nA -88 -32 10 1800 -900 0 1 0 N -98 -32 -88 -42\nA -82 -23 20 -1075 -253 0 1 0 N -88 -42 -63 -32\nP 2 0 1 0 -78 -56 -78 -32 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Temperature_Dependent_ALT\n#\nDEF D_Temperature_Dependent_ALT D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Temperature_Dependent_ALT\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nA -104 -54 7 -265 818 0 1 0 N -98 -57 -103 -47\nA -88 -57 10 1800 -900 0 1 0 N -98 -57 -88 -67\nA -88 -57 10 -900 0 0 1 0 N -88 -67 -78 -57\nA -88 -32 10 0 900 0 1 0 N -78 -32 -88 -22\nA -88 -32 10 900 1800 0 1 0 N -88 -22 -98 -32\nA -88 -32 10 1800 -900 0 1 0 N -98 -32 -88 -42\nA -82 -23 20 -1075 -253 0 1 0 N -88 -42 -63 -32\nP 2 0 1 0 -78 -56 -78 -32 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 F\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Tunnel\n#\nDEF D_Tunnel D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Tunnel\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 -30 50 -50 50 -50 -50 -30 -50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Tunnel_ALT\n#\nDEF D_Tunnel_ALT D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Tunnel_ALT\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 -30 50 -50 50 -50 -50 -30 -50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 F\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Unitunnel\n#\nDEF D_Unitunnel D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Unitunnel\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nP 6 0 1 10 -70 -50 -30 -50 -50 -50 -50 50 -30 50 -70 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Unitunnel_ALT\n#\nDEF D_Unitunnel_ALT D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Unitunnel_ALT\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 F\nP 6 0 1 10 -70 -50 -30 -50 -50 -50 -50 50 -30 50 -70 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Zener\n#\nDEF D_Zener D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Zener\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Zener_ALT\n#\nDEF D_Zener_ALT D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"D_Zener_ALT\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 F\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Zener_Small\n#\nDEF D_Zener_Small D 0 10 N N 1 F N\nF0 \"D\" 0 90 50 H V C CNN\nF1 \"D_Zener_Small\" 0 -90 50 H V C CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 30 0 -30 0 N\nP 3 0 1 10 -10 40 -30 40 -30 -40 N\nP 4 0 1 10 30 40 -30 0 30 -40 30 40 N\nX K 1 -100 0 70 R 50 50 1 1 P\nX A 2 100 0 70 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Zener_Small_ALT\n#\nDEF D_Zener_Small_ALT D 0 10 N N 1 F N\nF0 \"D\" 0 90 50 H V C CNN\nF1 \"D_Zener_Small_ALT\" 0 -90 50 H V C CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\n$FPLIST\n TO-???*\n *_Diode_*\n *SingleDiode*\n D_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 30 0 -30 0 N\nP 3 0 1 10 -10 40 -30 40 -30 -40 N\nP 4 0 1 10 30 40 -30 0 30 -40 30 40 F\nX K 1 -100 0 70 R 50 50 1 1 P\nX A 2 100 0 70 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# D_Zener_x2_ACom_AKK\n#\nDEF D_Zener_x2_ACom_AKK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Zener_x2_ACom_AKK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT*\n SC*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -140 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -150 -50 -150 50 -130 50 N\nP 3 0 1 10 150 50 150 -50 130 -50 N\nP 6 0 1 10 -50 -50 -150 0 -50 50 -50 -50 -50 -50 -50 -50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX A 1 0 -200 100 U 50 50 0 1 P\nX K 2 -300 0 150 R 50 50 0 1 P\nX K 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Zener_x2_ACom_KAK\n#\nDEF D_Zener_x2_ACom_KAK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Zener_x2_ACom_KAK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT*\n SC*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -140 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -150 -50 -150 50 -130 50 N\nP 3 0 1 10 130 -50 150 -50 150 50 N\nP 6 0 1 10 -50 -50 -150 0 -50 50 -50 -50 -50 -50 -50 -50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX K 1 -300 0 150 R 50 50 0 1 P\nX A 2 0 -200 100 U 50 50 0 1 P\nX K 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Zener_x2_ACom_KKA\n#\nDEF D_Zener_x2_ACom_KKA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Zener_x2_ACom_KKA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT*\n SC*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -140 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -150 -50 -150 50 -130 50 N\nP 3 0 1 10 130 -50 150 -50 150 50 N\nP 6 0 1 10 -50 -50 -150 0 -50 50 -50 -50 -50 -50 -50 -50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX K 1 -300 0 150 R 50 50 0 1 P\nX K 2 300 0 150 L 50 50 0 1 P\nX A 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Zener_x2_KCom_AAK\n#\nDEF D_Zener_x2_KCom_AAK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Zener_x2_KCom_AAK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT*\n SC*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 50 -50 -50 -70 -50 N\nP 3 0 1 10 50 -50 50 50 70 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX A 2 300 0 150 L 50 50 0 1 P\nX K 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Zener_x2_KCom_AKA\n#\nDEF D_Zener_x2_KCom_AKA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Zener_x2_KCom_AKA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT*\n SC*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 0 0 0 -100 N\nP 2 0 1 10 70 50 70 50 N\nP 2 0 1 0 150 0 -150 0 N\nP 3 0 1 10 -70 -50 -50 -50 -50 50 N\nP 3 0 1 10 50 -50 50 50 70 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX K 2 0 -200 100 U 50 50 0 1 P\nX A 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_Zener_x2_KCom_KAA\n#\nDEF D_Zener_x2_KCom_KAA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_Zener_x2_KCom_KAA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT*\n SC*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 50 -50 -50 -70 -50 N\nP 3 0 1 10 50 -50 50 50 70 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX K 1 0 -200 100 U 50 50 0 1 P\nX A 2 -300 0 150 R 50 50 0 1 P\nX A 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_x2_ACom_AKK\n#\nDEF D_x2_ACom_AKK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_x2_ACom_AKK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -140 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -150 50 -150 -50 -150 -50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 6 0 1 10 -50 -50 -150 0 -50 50 -50 -50 -50 -50 -50 -50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX A 1 0 -200 100 U 50 50 0 1 P\nX K 2 -300 0 150 R 50 50 0 1 P\nX K 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_x2_ACom_KAK\n#\nDEF D_x2_ACom_KAK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_x2_ACom_KAK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 0 0 0 -100 N\nP 2 0 1 0 150 0 -150 0 N\nP 3 0 1 10 -150 50 -150 -50 -150 -50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 6 0 1 10 -50 -50 -150 0 -50 50 -50 -50 -50 -50 -50 -50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX K 1 -300 0 150 R 50 50 0 1 P\nX A 2 0 -200 100 U 50 50 0 1 P\nX K 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_x2_ACom_KKA\n#\nDEF D_x2_ACom_KKA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_x2_ACom_KKA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -150 50 -150 -50 -150 -50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 6 0 1 10 -50 -50 -150 0 -50 50 -50 -50 -50 -50 -50 -50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX K 1 -300 0 150 R 50 50 0 1 P\nX K 2 300 0 150 L 50 50 0 1 P\nX A 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_x2_KCom_AAK\n#\nDEF D_x2_KCom_AAK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_x2_KCom_AAK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 50 -50 50 50 50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX A 2 300 0 150 L 50 50 0 1 P\nX K 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_x2_KCom_AKA\n#\nDEF D_x2_KCom_AKA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_x2_KCom_AKA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 0 0 0 -100 N\nP 2 0 1 0 150 0 -150 0 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 50 -50 50 50 50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX K 2 0 -200 100 U 50 50 0 1 P\nX A 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_x2_KCom_KAA\n#\nDEF D_x2_KCom_KAA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_x2_KCom_KAA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 50 -50 50 50 50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX K 1 0 -200 100 U 50 50 0 1 P\nX A 2 -300 0 150 R 50 50 0 1 P\nX A 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_x2_Serial_ACK\n#\nDEF D_x2_Serial_ACK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_x2_Serial_ACK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 0 0 0 -100 N\nP 2 0 1 0 150 0 -150 0 N\nP 2 0 1 0 250 0 300 0 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX common 2 0 -200 100 U 50 50 0 1 P\nX K 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_x2_Serial_AKC\n#\nDEF D_x2_Serial_AKC D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_x2_Serial_AKC\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 2 0 1 0 250 0 300 0 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX K 2 300 0 150 L 50 50 0 1 P\nX common 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_x2_Serial_CAK\n#\nDEF D_x2_Serial_CAK D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_x2_Serial_CAK\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 0 0 0 -100 N\nP 2 0 1 0 150 0 -150 0 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX common 1 0 -200 100 U 50 50 0 1 P\nX A 2 -300 0 150 R 50 50 0 1 P\nX K 3 300 0 150 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_x2_Serial_CKA\n#\nDEF D_x2_Serial_CKA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_x2_Serial_CKA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX common 1 0 -200 100 U 50 50 0 1 P\nX K 2 300 0 150 L 50 50 0 1 P\nX A 3 -300 0 150 R 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_x2_Serial_KAC\n#\nDEF D_x2_Serial_KAC D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_x2_Serial_KAC\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 0 0 0 -100 N\nP 2 0 1 0 150 0 -150 0 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX K 1 300 0 150 L 50 50 0 1 P\nX A 2 -300 0 150 R 50 50 0 1 P\nX common 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# D_x2_Serial_KCA\n#\nDEF D_x2_Serial_KCA D 0 30 Y N 1 F N\nF0 \"D\" 50 -100 50 H V C CNN\nF1 \"D_x2_Serial_KCA\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 0 0 0 -100 N\nP 2 0 1 0 150 0 -150 0 N\nP 2 0 1 0 250 0 300 0 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX K 1 300 0 150 L 50 50 0 1 P\nX common 2 0 -200 100 U 50 50 0 1 P\nX A 3 -300 0 150 R 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# Delay_Line\n#\nDEF Delay_Line L 0 40 Y N 1 F N\nF0 \"L\" 100 50 50 H V L CNN\nF1 \"Delay_Line\" 100 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nA 0 -150 50 899 1 0 1 0 N 0 -100 50 -150\nA 0 -150 50 -1 -899 0 1 0 N 50 -150 0 -199\nA 0 -50 50 899 1 0 1 0 N 0 0 50 -50\nA 0 -50 50 -1 -899 0 1 0 N 50 -50 0 -99\nA 0 50 50 899 1 0 1 0 N 0 100 50 50\nA 0 50 50 -1 -899 0 1 0 N 50 50 0 1\nA 0 150 50 899 1 0 1 0 N 0 200 50 150\nA 0 150 50 -1 -899 0 1 0 N 50 150 0 101\nP 2 0 1 0 -100 200 -100 -200 N\nX 1 1 0 300 100 D 50 50 1 1 P\nX 2 2 0 -300 100 U 50 50 1 1 P\nX COMMUN 3 -200 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# EMI_Filter_CLC\n#\nDEF EMI_Filter_CLC FL 0 10 Y N 1 F N\nF0 \"FL\" 0 275 50 H V C CNN\nF1 \"EMI_Filter_CLC\" 0 200 50 H V C CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\n$FPLIST\n Filter*\n Resonator*\n$ENDFPLIST\nDRAW\nA -80 100 20 1 1799 0 1 0 N -60 100 -100 100\nA -40 100 20 1 1799 0 1 0 N -20 100 -60 100\nA 0 100 20 1 1799 0 1 0 N 20 100 -20 100\nA 40 100 20 1 1799 0 1 0 N 60 100 20 100\nA 80 100 20 1 1799 0 1 0 N 100 100 60 100\nC -160 100 10 0 1 0 F\nC 0 0 10 0 1 0 F\nC 150 100 10 0 1 0 F\nS -225 150 220 -25 0 1 10 f\nS -200 30 -120 40 0 1 0 F\nS -120 60 -200 70 0 1 0 F\nS 110 30 190 40 0 1 0 F\nS 190 60 110 70 0 1 0 F\nP 2 0 1 0 -200 100 -100 100 N\nP 2 0 1 0 -160 100 -160 70 N\nP 2 0 1 0 100 100 200 100 N\nP 2 0 1 0 150 100 150 70 N\nP 4 0 1 0 -160 30 -160 0 150 0 150 30 N\nX 1 1 -300 100 100 R 50 50 1 1 P\nX 2 2 0 -100 100 U 50 50 1 1 P\nX 3 3 300 100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# EMI_Filter_LCL\n#\nDEF EMI_Filter_LCL FL 0 10 Y N 1 F N\nF0 \"FL\" 0 275 50 H V C CNN\nF1 \"EMI_Filter_LCL\" 0 200 50 H V C CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\n$FPLIST\n Filter*\n Resonator*\n$ENDFPLIST\nDRAW\nA -180 100 20 1 1799 0 1 0 N -160 100 -200 100\nA -140 100 20 1 1799 0 1 0 N -120 100 -160 100\nA -100 100 20 1 1799 0 1 0 N -80 100 -120 100\nA -60 100 20 1 1799 0 1 0 N -40 100 -80 100\nA 60 100 20 1 1799 0 1 0 N 80 100 40 100\nA 100 100 20 1 1799 0 1 0 N 120 100 80 100\nA 140 100 20 1 1799 0 1 0 N 160 100 120 100\nA 180 100 20 1 1799 0 1 0 N 200 100 160 100\nC 0 100 10 0 1 0 F\nS -225 150 225 0 0 1 10 f\nS -40 30 40 40 0 1 0 F\nS 40 60 -40 70 0 1 0 F\nP 2 0 1 0 -40 100 40 100 N\nP 2 0 1 0 0 30 0 0 N\nP 2 0 1 0 0 100 0 70 N\nX 1 1 -300 100 100 R 50 50 1 1 P\nX 2 2 0 -100 100 U 50 50 1 1 P\nX 3 3 300 100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# EMI_Filter_LL\n#\nDEF EMI_Filter_LL FL 0 10 Y N 1 F N\nF0 \"FL\" 0 175 50 H V C CNN\nF1 \"EMI_Filter_LL\" 0 -175 50 H V C CNN\nF2 \"\" 0 40 50 H I C CNN\nF3 \"\" 0 40 50 H I C CNN\nALIAS EMI_Filter_CommonMode\n$FPLIST\n L_*\n L_CommonMode*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 20 100 20 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 -20 -100 -20 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 200 100 100 L 50 50 1 1 P\nX 3 3 -200 -100 100 R 50 50 1 1 P\nX 4 4 200 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# EMI_Filter_LL_1423\n#\nDEF EMI_Filter_LL_1423 FL 0 20 Y N 1 F N\nF0 \"FL\" 0 175 50 H V C CNN\nF1 \"EMI_Filter_LL_1423\" 0 -175 50 H V C CNN\nF2 \"\" 0 -250 50 H I C CNN\nF3 \"\" 0 40 50 V I C CNN\n$FPLIST\n Bourns*SRF0905*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 20 100 20 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 -20 -100 -20 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 -100 100 R 50 50 1 1 P\nX 2 2 -200 100 100 R 50 50 1 1 P\nX 3 3 200 100 100 L 50 50 1 1 P\nX 4 4 200 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Earphone\n#\nDEF Earphone LS 0 1 Y N 1 F N\nF0 \"LS\" 100 150 50 H V L CNN\nF1 \"Earphone\" 100 75 50 H V L CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nS 50 -25 75 125 0 1 0 F\nS 50 0 -50 100 0 1 0 N\nX - 1 0 -100 100 U 50 50 1 1 P\nX + 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Electromagnetic_Actor\n#\nDEF Electromagnetic_Actor L 0 1 N N 1 F N\nF0 \"L\" 50 150 50 H V L CNN\nF1 \"Electromagnetic_Actor\" 50 -50 50 H V L CNN\nF2 \"\" -25 100 50 V I C CNN\nF3 \"\" -25 100 50 V I C CNN\n$FPLIST\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nS -100 100 100 0 0 1 10 N\nP 2 0 1 10 -50 100 50 0 N\nX - 1 0 200 100 D 50 50 1 1 P\nX + 2 0 -100 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Ferrite_Bead\n#\nDEF Ferrite_Bead FB 0 0 N Y 1 F N\nF0 \"FB\" -150 25 50 V V C CNN\nF1 \"Ferrite_Bead\" 150 0 50 V V C CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Inductor_*\n L_*\n *Ferrite*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 0 -50 0 -48 N\nP 2 0 1 0 0 50 0 51 N\nP 5 0 1 0 -109 16 -67 89 109 -12 66 -85 -109 16 N\nX ~ 1 0 150 100 D 50 50 1 1 P\nX ~ 2 0 -150 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Ferrite_Bead_Small\n#\nDEF Ferrite_Bead_Small FB 0 0 N Y 1 F N\nF0 \"FB\" 75 50 50 H V L CNN\nF1 \"Ferrite_Bead_Small\" 75 -50 50 H V L CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Inductor_*\n L_*\n *Ferrite*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 0 -50 0 -31 N\nP 2 0 1 0 0 35 0 51 N\nP 5 0 1 0 -72 11 -44 59 72 -8 44 -56 -72 11 N\nX ~ 1 0 100 50 D 50 50 1 1 P\nX ~ 2 0 -100 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Frequency_Counter\n#\nDEF Frequency_Counter MES 0 1 N N 1 F N\nF0 \"MES\" -130 40 50 H V R CNN\nF1 \"Frequency_Counter\" -130 -30 50 H V R CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nC 0 0 100 0 1 10 N\nT 0 0 0 80 0 0 0 Hz Normal 0 C C\nP 2 0 0 0 -125 -125 -75 -75 N\nP 2 0 0 0 75 75 125 125 N\nP 3 0 0 0 75 125 125 125 125 75 N\nX - 1 0 -200 100 U 50 50 1 1 P\nX + 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Fuse\n#\nDEF Fuse F 0 0 N Y 1 F N\nF0 \"F\" 80 0 50 V V C CNN\nF1 \"Fuse\" -75 0 50 V V C CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n *Fuse*\n$ENDFPLIST\nDRAW\nS -30 -100 30 100 0 1 10 N\nP 2 0 1 0 0 100 0 -100 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Fuse_Polarized\n#\nDEF Fuse_Polarized F 0 0 N Y 1 F N\nF0 \"F\" 80 0 50 V V C CNN\nF1 \"Fuse_Polarized\" -75 0 50 V V C CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n *Fuse*\n$ENDFPLIST\nDRAW\nS -30 -100 30 100 0 1 10 N\nS -30 100 30 60 0 1 10 F\nP 2 0 1 0 0 100 0 -100 N\nX ~ 1 0 150 50 D 50 50 1 1 W\nX ~ 2 0 -150 50 U 50 50 1 1 w\nENDDRAW\nENDDEF\n#\n# Fuse_Polarized_Small\n#\nDEF Fuse_Polarized_Small F 0 10 N N 1 F N\nF0 \"F\" 10 -60 50 H V C CNN\nF1 \"Fuse_Polarized_Small\" 0 60 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SM*\n$ENDFPLIST\nDRAW\nS -50 20 -30 -20 0 1 0 F\nS -50 20 50 -20 0 1 0 N\nP 2 0 1 0 -50 0 50 0 N\nX ~ 1 -100 0 50 R 50 50 1 1 W\nX ~ 2 100 0 50 L 50 50 1 1 w\nENDDRAW\nENDDEF\n#\n# Fuse_Small\n#\nDEF Fuse_Small F 0 10 N N 1 F N\nF0 \"F\" 0 -60 50 H V C CNN\nF1 \"Fuse_Small\" 0 60 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SM*\n$ENDFPLIST\nDRAW\nS -50 20 50 -20 0 1 0 N\nP 2 0 1 0 -50 0 50 0 N\nX ~ 1 -100 0 50 R 50 50 1 1 P\nX ~ 2 100 0 50 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Galvanometer\n#\nDEF Galvanometer MES 0 1 N N 1 F N\nF0 \"MES\" -130 40 50 H V R CNN\nF1 \"Galvanometer\" -130 -30 50 H V R CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nC 0 0 100 0 1 10 N\nP 2 0 0 0 -125 -125 125 125 N\nP 3 0 0 0 75 125 125 125 125 75 N\nP 2 0 1 0 10 150 30 150 N\nP 2 0 1 0 20 160 20 140 N\nX - 1 0 -200 100 U 50 50 1 1 P\nX + 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Hall_Generator\n#\nDEF Hall_Generator HG 0 0 Y N 1 F N\nF0 \"HG\" 100 175 50 H V L CNN\nF1 \"Hall_Generator\" 100 100 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nS -40 100 40 -100 0 1 10 N\nP 2 0 1 0 -40 0 -100 0 N\nP 2 0 1 10 -20 -20 20 20 N\nP 2 0 1 10 -20 20 20 -20 N\nP 2 0 1 0 40 0 100 0 N\nX U1 1 0 200 100 D 50 50 1 1 P\nX U2 2 0 -200 100 U 50 50 1 1 P\nX UH1 3 -150 0 50 R 50 50 1 1 P\nX UH2 4 150 0 50 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Heater\n#\nDEF Heater R 0 0 N Y 1 F N\nF0 \"R\" 80 0 50 V V C CNN\nF1 \"Heater\" -80 0 50 V V C CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nS -40 -100 40 100 0 1 10 N\nP 2 0 1 0 -40 60 40 60 N\nP 2 0 1 0 40 -60 -40 -60 N\nP 2 0 1 0 40 -20 -40 -20 N\nP 2 0 1 0 40 20 -40 20 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Jumper\n#\nDEF Jumper JP 0 30 Y N 1 F N\nF0 \"JP\" 0 150 50 H V C CNN\nF1 \"Jumper\" 0 -80 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SolderJumper*\n Jumper*\n TestPoint*2Pads*\n TestPoint*Bridge*\n$ENDFPLIST\nDRAW\nA 0 -26 125 1426 373 0 1 0 N -98 50 99 50\nC -100 0 35 0 1 0 N\nC 100 0 35 0 1 0 N\nX 1 1 -300 0 165 R 50 50 0 1 P\nX 2 2 300 0 165 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# Jumper_NC_Dual\n#\nDEF Jumper_NC_Dual JP 0 30 Y N 1 F N\nF0 \"JP\" 50 -100 50 H V L CNN\nF1 \"Jumper_NC_Dual\" 0 100 50 H V C BNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SolderJumper*Bridged*\n Jumper*\n TestPoint*2Pads*\n TestPoint*Bridge*\n$ENDFPLIST\nDRAW\nA -60 10 64 386 1413 0 1 0 N -10 50 -110 50\nA 60 10 64 386 1413 0 1 0 N 110 50 10 50\nC -120 0 35 0 1 0 N\nC 0 0 36 0 1 0 N\nC 120 0 35 0 1 0 N\nX 1 1 -250 0 95 R 50 50 0 1 P\nX 2 2 0 -100 60 U 50 50 0 1 P\nX 3 3 250 0 95 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# Jumper_NC_Small\n#\nDEF Jumper_NC_Small JP 0 30 N N 1 F N\nF0 \"JP\" 0 80 50 H V C CNN\nF1 \"Jumper_NC_Small\" 10 -60 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SolderJumper*Bridged*\n Jumper*\n TestPoint*2Pads*\n TestPoint*Bridge*\n$ENDFPLIST\nDRAW\nA 0 -10 57 450 1350 0 1 0 N 40 30 -40 30\nC -40 0 20 0 1 0 N\nC 40 0 20 0 1 0 N\nX 1 1 -100 0 40 R 50 50 0 1 P\nX 2 2 100 0 40 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# Jumper_NO_Small\n#\nDEF Jumper_NO_Small JP 0 30 N N 1 F N\nF0 \"JP\" 0 80 50 H V C CNN\nF1 \"Jumper_NO_Small\" 10 -60 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SolderJumper*Open*\n Jumper*\n TestPoint*2Pads*\n TestPoint*Bridge*\n$ENDFPLIST\nDRAW\nC -40 0 20 0 1 0 N\nC 40 0 20 0 1 0 N\nX 1 1 -100 0 40 R 50 50 0 1 P\nX 2 2 100 0 40 L 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# L\n#\nDEF L L 0 40 N N 1 F N\nF0 \"L\" -50 0 50 V V C CNN\nF1 \"L\" 75 0 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA 0 -75 25 -899 899 0 1 0 N 0 -100 0 -50\nA 0 -25 25 -899 899 0 1 0 N 0 -50 0 0\nA 0 25 25 -899 899 0 1 0 N 0 0 0 50\nA 0 75 25 -899 899 0 1 0 N 0 50 0 100\nX 1 1 0 150 50 D 50 50 1 1 P\nX 2 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED\n#\nDEF LED D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"LED\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 -50 -50 50 N\nP 2 0 1 0 -50 0 50 0 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nP 5 0 1 0 -120 -30 -180 -90 -150 -90 -180 -90 -180 -60 N\nP 5 0 1 0 -70 -30 -130 -90 -100 -90 -130 -90 -130 -60 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_ABRG\n#\nDEF LED_ABRG D 0 0 Y N 1 F N\nF0 \"D\" 0 400 50 H V C CNN\nF1 \"LED_ABRG\" 0 -400 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC 80 0 10 1 1 0 F\nT 0 -75 -250 50 0 1 0 B Normal 0 C C\nT 0 -75 -50 50 0 1 0 G Normal 0 C C\nT 0 -75 150 50 0 1 0 R Normal 0 C C\nS 50 250 50 250 1 1 0 N\nS 110 330 -110 -300 1 1 10 f\nP 2 1 1 0 -100 -200 50 -200 N\nP 2 1 1 10 -50 -150 -50 -250 N\nP 2 1 1 10 -50 50 -50 -50 N\nP 2 1 1 10 -50 250 -50 150 N\nP 2 1 1 0 50 200 -100 200 N\nP 2 1 1 0 100 0 -100 0 N\nP 4 1 1 0 50 -200 80 -200 80 200 50 200 N\nP 4 1 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 1 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 1 1 10 50 250 50 150 -50 200 50 250 N\nP 5 1 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 1 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 1 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 1 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 1 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 1 1 0 0 250 60 310 30 310 60 310 60 280 N\nX A 1 200 0 100 L 50 50 1 1 P\nX BK 2 -200 -200 100 R 50 50 1 1 P\nX RK 3 -200 200 100 R 50 50 1 1 P\nX GK 4 -200 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_ALT\n#\nDEF LED_ALT D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"LED_ALT\" 0 -100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 -50 -50 50 N\nP 2 0 1 0 -50 0 50 0 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 F\nP 5 0 1 0 -120 -30 -180 -90 -150 -90 -180 -90 -180 -60 N\nP 5 0 1 0 -70 -30 -130 -90 -100 -90 -130 -90 -130 -60 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_ARBG\n#\nDEF LED_ARBG D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"LED_ARBG\" 0 -350 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC 80 0 10 0 1 0 F\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 0 -100 -200 50 -200 N\nP 2 0 1 8 -50 -150 -50 -250 N\nP 2 0 1 8 -50 50 -50 -50 N\nP 2 0 1 8 -50 250 -50 150 N\nP 2 0 1 0 50 200 -100 200 N\nP 2 0 1 0 100 0 -100 0 N\nP 4 0 1 0 50 -200 80 -200 80 200 50 200 N\nP 4 0 1 8 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 8 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 8 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX A 1 200 0 100 L 50 50 1 1 P\nX RK 2 -200 200 100 R 50 50 1 1 P\nX BK 3 -200 -200 100 R 50 50 1 1 P\nX GK 4 -200 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_ARGB\n#\nDEF LED_ARGB D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"LED_ARGB\" 0 -350 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC 80 0 10 0 1 0 F\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 0 -100 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 200 -100 200 N\nP 2 0 1 0 100 0 -100 0 N\nP 4 0 1 0 50 -200 80 -200 80 200 50 200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX A 1 200 0 100 L 50 50 1 1 P\nX RK 2 -200 200 100 R 50 50 1 1 P\nX GK 3 -200 0 100 R 50 50 1 1 P\nX BK 4 -200 -200 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_BARG\n#\nDEF LED_BARG D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"LED_BARG\" 0 -350 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC 80 0 10 0 1 0 F\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS 50 -50 50 50 0 1 0 N\nS 50 50 50 50 0 1 0 N\nS 50 150 50 250 0 1 0 N\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 0 -50 -200 -100 -200 N\nP 2 0 1 0 -50 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 0 -50 0 -100 0 N\nP 2 0 1 0 -50 0 50 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -50 200 -100 200 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 0 100 0 N\nP 2 0 1 0 50 200 -50 200 N\nP 3 0 1 0 -50 50 -50 -50 -50 -50 N\nP 3 0 1 0 -50 250 -50 150 -50 150 N\nP 4 0 1 0 50 -200 80 -200 80 200 50 200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX BK 1 -200 -200 100 R 50 50 1 1 P\nX A 2 200 0 100 L 50 50 1 1 P\nX RK 3 -200 200 100 R 50 50 1 1 P\nX GK 4 -200 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_BGRA\n#\nDEF LED_BGRA D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"LED_BGRA\" 0 -350 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC 80 0 10 0 1 0 F\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS 50 -50 50 50 0 1 0 N\nS 50 50 50 50 0 1 0 N\nS 50 150 50 250 0 1 0 N\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 0 -50 -200 -100 -200 N\nP 2 0 1 0 -50 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 0 -50 0 -100 0 N\nP 2 0 1 0 -50 0 50 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -50 200 -100 200 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 0 100 0 N\nP 2 0 1 0 50 200 -50 200 N\nP 3 0 1 0 -50 50 -50 -50 -50 -50 N\nP 3 0 1 0 -50 250 -50 150 -50 150 N\nP 4 0 1 0 50 -200 80 -200 80 200 50 200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX BK 1 -200 -200 100 R 50 50 1 1 P\nX GK 2 -200 0 100 R 50 50 1 1 P\nX RK 3 -200 200 100 R 50 50 1 1 P\nX A 4 200 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_CRGB\n#\nDEF LED_CRGB D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"LED_CRGB\" 0 -350 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC -85 0 10 0 1 0 F\nT 0 75 -250 50 0 0 0 B Normal 0 C C\nT 0 75 -50 50 0 0 0 G Normal 0 C C\nT 0 75 150 50 0 0 0 R Normal 0 C C\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 -200 100 -200 N\nP 2 0 1 0 50 0 -100 0 N\nP 2 0 1 0 50 0 100 0 N\nP 2 0 1 0 50 200 100 200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 0 50 200 -85 200 -85 -200 50 -200 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX K 1 -200 0 100 R 50 50 1 1 P\nX RA 2 200 200 100 L 50 50 1 1 P\nX GA 3 200 0 100 L 50 50 1 1 P\nX BA 4 200 -200 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_Dual_2pin\n#\nDEF LED_Dual_2pin D 0 0 Y N 1 F N\nF0 \"D\" 0 225 50 H V C CNN\nF1 \"LED_Dual_2pin\" 0 -250 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC -80 0 10 0 1 0 F\nC 0 0 180 0 1 10 f\nC 90 0 10 0 1 0 F\nP 2 0 1 0 -180 0 -100 0 N\nP 2 0 1 0 -80 0 -100 0 N\nP 2 0 1 10 -40 150 -40 50 N\nP 2 0 1 10 50 -50 50 -150 N\nP 2 0 1 0 160 0 90 0 F\nP 2 0 1 8 170 230 170 200 N\nP 2 0 1 8 220 180 220 150 N\nP 3 0 1 8 110 170 170 230 140 230 N\nP 3 0 1 8 160 120 220 180 190 180 N\nP 4 0 1 10 -40 -50 -40 -150 50 -100 -40 -50 N\nP 4 0 1 10 50 150 50 50 -40 100 50 150 N\nP 5 0 1 0 90 100 -80 100 -80 -100 90 -100 90 100 N\nX KA 1 300 0 150 L 50 50 1 1 I\nX AK 2 -300 0 120 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# LED_Dual_AAC\n#\nDEF LED_Dual_AAC D 0 0 Y N 1 F N\nF0 \"D\" 0 225 50 H V C CNN\nF1 \"LED_Dual_AAC\" 0 -250 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC -100 0 11 0 1 0 F\nC 0 0 180 0 1 10 f\nP 2 0 1 0 -180 0 -100 0 N\nP 2 0 1 10 -50 -50 -50 -150 N\nP 2 0 1 10 -50 50 -50 150 N\nP 2 0 1 0 150 -100 75 -100 N\nP 2 0 1 0 150 100 75 100 N\nP 4 0 1 10 50 -150 50 -50 -50 -100 50 -150 N\nP 4 0 1 10 50 50 50 150 -50 100 50 50 N\nP 4 0 1 0 80 100 -100 100 -100 -100 80 -100 N\nP 5 0 1 0 80 200 140 260 110 260 140 260 140 230 N\nP 5 0 1 0 130 160 190 220 160 220 190 220 190 190 N\nX A1 1 300 100 150 L 50 50 1 1 I\nX A2 2 300 -100 150 L 50 50 1 1 I\nX K 3 -300 0 120 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# LED_Dual_AACC\n#\nDEF LED_Dual_AACC D 0 0 Y N 1 F N\nF0 \"D\" 0 225 50 H V C CNN\nF1 \"LED_Dual_AACC\" 0 -250 50 H V C CNN\nF2 \"\" 30 0 50 H I C CNN\nF3 \"\" 30 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC 0 0 180 0 1 10 f\nP 2 0 1 0 -200 -100 80 -100 N\nP 2 0 1 0 -200 100 80 100 N\nP 2 0 1 10 50 -50 50 -150 N\nP 2 0 1 10 50 150 50 50 N\nP 2 0 1 0 150 -100 75 -100 N\nP 2 0 1 0 150 100 75 100 N\nP 4 0 1 10 -50 -50 -50 -150 50 -100 -50 -50 N\nP 4 0 1 10 -50 150 -50 50 50 100 -50 150 N\nP 5 0 1 0 80 200 140 260 110 260 140 260 140 230 N\nP 5 0 1 0 130 160 190 220 160 220 190 220 190 190 N\nX A1 1 -300 100 120 R 50 50 1 1 I\nX A2 2 -300 -100 120 R 50 50 1 1 I\nX K1 3 300 100 150 L 50 50 1 1 I\nX K2 4 300 -100 150 L 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# LED_Dual_ACA\n#\nDEF LED_Dual_ACA D 0 0 Y N 1 F N\nF0 \"D\" 0 225 50 H V C CNN\nF1 \"LED_Dual_ACA\" 0 -250 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC -100 0 11 0 1 0 F\nC 0 0 180 0 1 10 f\nP 2 0 1 0 -180 0 -100 0 N\nP 2 0 1 10 -50 -50 -50 -150 N\nP 2 0 1 10 -50 50 -50 150 N\nP 2 0 1 0 150 -100 75 -100 N\nP 2 0 1 0 150 100 75 100 N\nP 4 0 1 10 50 -150 50 -50 -50 -100 50 -150 N\nP 4 0 1 10 50 50 50 150 -50 100 50 50 N\nP 4 0 1 0 80 100 -100 100 -100 -100 80 -100 N\nP 5 0 1 0 80 200 140 260 110 260 140 260 140 230 N\nP 5 0 1 0 130 160 190 220 160 220 190 220 190 190 N\nX A1 1 300 100 150 L 50 50 1 1 I\nX K 2 -300 0 120 R 50 50 1 1 I\nX A2 3 300 -100 150 L 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# LED_Dual_ACAC\n#\nDEF LED_Dual_ACAC D 0 0 Y N 1 F N\nF0 \"D\" 0 225 50 H V C CNN\nF1 \"LED_Dual_ACAC\" 0 -250 50 H V C CNN\nF2 \"\" 30 0 50 H I C CNN\nF3 \"\" 30 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC 0 0 180 0 1 10 f\nP 2 0 1 0 -200 -100 80 -100 N\nP 2 0 1 0 -200 100 80 100 N\nP 2 0 1 10 50 -50 50 -150 N\nP 2 0 1 10 50 150 50 50 N\nP 2 0 1 0 150 -100 75 -100 N\nP 2 0 1 0 150 100 75 100 N\nP 4 0 1 10 -50 -50 -50 -150 50 -100 -50 -50 N\nP 4 0 1 10 -50 150 -50 50 50 100 -50 150 N\nP 5 0 1 0 80 200 140 260 110 260 140 260 140 230 N\nP 5 0 1 0 130 160 190 220 160 220 190 220 190 190 N\nX A1 1 -300 100 120 R 50 50 1 1 I\nX K1 2 300 100 150 L 50 50 1 1 I\nX A2 3 -300 -100 120 R 50 50 1 1 I\nX K2 4 300 -100 150 L 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# LED_Dual_CAC\n#\nDEF LED_Dual_CAC D 0 0 Y Y 1 F N\nF0 \"D\" 0 225 50 H V C CNN\nF1 \"LED_Dual_CAC\" 0 -250 50 H V C CNN\nF2 \"\" 50 0 50 H I C CNN\nF3 \"\" 50 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC -100 0 11 0 1 0 F\nC 0 0 180 0 1 10 f\nP 2 0 1 0 -180 0 -100 0 N\nP 2 0 1 10 50 -50 50 -150 N\nP 2 0 1 10 50 150 50 50 N\nP 2 0 1 0 150 -100 75 -100 N\nP 2 0 1 0 150 100 75 100 N\nP 4 0 1 10 -50 -50 -50 -150 50 -100 -50 -50 N\nP 4 0 1 10 -50 150 -50 50 50 100 -50 150 N\nP 4 0 1 0 80 100 -100 100 -100 -100 80 -100 N\nP 5 0 1 0 80 200 140 260 110 260 140 260 140 230 N\nP 5 0 1 0 130 160 190 220 160 220 190 220 190 190 N\nX K1 1 300 100 150 L 50 50 1 1 I\nX A 2 -300 0 120 R 50 50 1 1 I\nX K2 3 300 -100 150 L 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# LED_Dual_CACA\n#\nDEF LED_Dual_CACA D 0 0 Y N 1 F N\nF0 \"D\" 0 225 50 H V C CNN\nF1 \"LED_Dual_CACA\" 0 -250 50 H V C CNN\nF2 \"\" 30 0 50 H I C CNN\nF3 \"\" 30 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC 0 0 180 0 1 10 f\nP 2 0 1 0 -200 -100 80 -100 N\nP 2 0 1 0 -200 100 80 100 N\nP 2 0 1 10 -50 -50 -50 -150 N\nP 2 0 1 10 -50 150 -50 50 N\nP 2 0 1 0 150 -100 75 -100 N\nP 2 0 1 0 150 100 75 100 N\nP 4 0 1 10 50 -50 50 -150 -50 -100 50 -50 N\nP 4 0 1 10 50 150 50 50 -50 100 50 150 N\nP 5 0 1 0 80 200 140 260 110 260 140 260 140 230 N\nP 5 0 1 0 130 160 190 220 160 220 190 220 190 190 N\nX A1 1 -300 100 120 R 50 50 1 1 I\nX K1 2 300 100 150 L 50 50 1 1 I\nX A2 3 -300 -100 120 R 50 50 1 1 I\nX K2 4 300 -100 150 L 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# LED_Dual_CCA\n#\nDEF LED_Dual_CCA D 0 0 Y Y 1 F N\nF0 \"D\" 0 225 50 H V C CNN\nF1 \"LED_Dual_CCA\" 0 -250 50 H V C CNN\nF2 \"\" 50 0 50 H I C CNN\nF3 \"\" 50 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC -100 0 11 0 1 0 F\nC 0 0 180 0 1 10 f\nP 2 0 1 0 -180 0 -100 0 N\nP 2 0 1 10 50 -50 50 -150 N\nP 2 0 1 10 50 150 50 50 N\nP 2 0 1 0 150 -100 75 -100 N\nP 2 0 1 0 150 100 75 100 N\nP 4 0 1 10 -50 -50 -50 -150 50 -100 -50 -50 N\nP 4 0 1 10 -50 150 -50 50 50 100 -50 150 N\nP 4 0 1 0 80 100 -100 100 -100 -100 80 -100 N\nP 5 0 1 0 80 200 140 260 110 260 140 260 140 230 N\nP 5 0 1 0 130 160 190 220 160 220 190 220 190 190 N\nX K1 1 300 100 150 L 50 50 1 1 I\nX K2 2 300 -100 150 L 50 50 1 1 I\nX A 3 -300 0 120 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# LED_PAD\n#\nDEF LED_PAD D 0 40 Y N 1 F N\nF0 \"D\" 0 225 50 H V C CNN\nF1 \"LED_PAD\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 -50 -50 50 N\nP 2 0 1 0 -50 0 50 0 N\nP 2 0 1 0 0 -100 0 -80 N\nP 4 0 1 0 -80 -20 -80 -80 80 -80 80 -20 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nP 5 0 1 0 -35 55 25 115 -5 115 25 115 25 85 N\nP 5 0 1 0 15 55 75 115 45 115 75 115 75 85 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nX PAD 3 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_RABG\n#\nDEF LED_RABG D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"LED_RABG\" 0 -350 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC 80 0 10 0 1 0 F\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS 50 -50 50 50 0 1 0 N\nS 50 50 50 50 0 1 0 N\nS 50 150 50 250 0 1 0 N\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 0 -50 -200 -100 -200 N\nP 2 0 1 0 -50 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 0 -50 0 -100 0 N\nP 2 0 1 0 -50 0 50 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -50 200 -100 200 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 0 100 0 N\nP 2 0 1 0 50 200 -50 200 N\nP 3 0 1 0 -50 50 -50 -50 -50 -50 N\nP 3 0 1 0 -50 250 -50 150 -50 150 N\nP 4 0 1 0 50 -200 80 -200 80 200 50 200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX RK 1 -200 200 100 R 50 50 1 1 P\nX A 2 200 0 100 L 50 50 1 1 P\nX BK 3 -200 -200 100 R 50 50 1 1 P\nX GK 4 -200 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_RAGB\n#\nDEF LED_RAGB D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"LED_RAGB\" 0 -350 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC 80 0 10 0 1 0 F\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS 50 -50 50 50 0 1 0 N\nS 50 50 50 50 0 1 0 N\nS 50 150 50 250 0 1 0 N\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 0 -50 -200 -100 -200 N\nP 2 0 1 0 -50 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 0 -50 0 -100 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -50 200 -100 200 N\nP 2 0 1 0 -50 200 50 200 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 0 -50 0 N\nP 2 0 1 0 50 0 100 0 N\nP 3 0 1 0 -50 50 -50 -50 -50 -50 N\nP 3 0 1 0 -50 250 -50 150 -50 150 N\nP 4 0 1 0 50 -200 80 -200 80 200 50 200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX RK 1 -200 200 100 R 50 50 1 1 P\nX A 2 200 0 100 L 50 50 1 1 P\nX GK 3 -200 0 100 R 50 50 1 1 P\nX BK 4 -200 -200 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_RCBG\n#\nDEF LED_RCBG D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"LED_RCBG\" 0 -350 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC -85 0 10 0 1 0 F\nT 0 75 -250 50 0 0 0 B Normal 0 C C\nT 0 75 -50 50 0 0 0 G Normal 0 C C\nT 0 75 150 50 0 0 0 R Normal 0 C C\nS 50 -50 50 50 0 1 0 N\nS 50 50 50 50 0 1 0 N\nS 50 150 50 250 0 1 0 N\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 0 -50 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 0 -50 0 -100 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -50 200 50 200 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 -200 100 -200 N\nP 2 0 1 0 50 0 -50 0 N\nP 2 0 1 0 50 0 100 0 N\nP 2 0 1 0 50 200 100 200 N\nP 3 0 1 0 -50 50 -50 -50 -50 -50 N\nP 3 0 1 0 -50 250 -50 150 -50 150 N\nP 4 0 1 0 -50 200 -85 200 -85 -200 -40 -200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX RA 1 200 200 100 L 50 50 1 1 P\nX K 2 -200 0 100 R 50 50 1 1 P\nX BA 3 200 -200 100 L 50 50 1 1 P\nX GA 4 200 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_RCGB\n#\nDEF LED_RCGB D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"LED_RCGB\" 0 -350 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC -85 0 10 0 1 0 F\nT 0 75 -250 50 0 0 0 B Normal 0 C C\nT 0 75 -50 50 0 0 0 G Normal 0 C C\nT 0 75 150 50 0 0 0 R Normal 0 C C\nS 50 -50 50 50 0 1 0 N\nS 50 50 50 50 0 1 0 N\nS 50 150 50 250 0 1 0 N\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 0 -50 0 -100 0 N\nP 2 0 1 0 -50 0 50 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -50 200 50 200 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 -200 -50 -200 N\nP 2 0 1 0 50 -200 100 -200 N\nP 2 0 1 0 50 0 100 0 N\nP 2 0 1 0 50 200 100 200 N\nP 3 0 1 0 -50 50 -50 -50 -50 -50 N\nP 3 0 1 0 -50 250 -50 150 -50 150 N\nP 4 0 1 0 -50 200 -85 200 -85 -200 -40 -200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX RA 1 200 200 100 L 50 50 1 1 P\nX K 2 -200 0 100 R 50 50 1 1 P\nX GA 3 200 0 100 L 50 50 1 1 P\nX BA 4 200 -200 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_RGB\n#\nDEF LED_RGB D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"LED_RGB\" 0 -350 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS 50 -50 50 50 0 1 0 N\nS 50 50 50 50 0 1 0 N\nS 50 150 50 250 0 1 0 N\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 0 -50 -200 -100 -200 N\nP 2 0 1 0 -50 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 0 -50 0 -100 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -50 200 -100 200 N\nP 2 0 1 0 -50 200 50 200 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 -200 100 -200 N\nP 2 0 1 0 50 0 -50 0 N\nP 2 0 1 0 50 0 100 0 N\nP 2 0 1 0 50 200 100 200 N\nP 3 0 1 0 -50 50 -50 -50 -50 -50 N\nP 3 0 1 0 -50 250 -50 150 -50 150 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX RK 1 -200 200 100 R 50 50 1 1 P\nX GK 2 -200 0 100 R 50 50 1 1 P\nX BK 3 -200 -200 100 R 50 50 1 1 P\nX BA 4 200 -200 100 L 50 50 1 1 P\nX GA 5 200 0 100 L 50 50 1 1 P\nX RA 6 200 200 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_RGBA\n#\nDEF LED_RGBA D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"LED_RGBA\" 0 -350 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC 80 0 10 0 1 0 F\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS 50 -50 50 50 0 1 0 N\nS 50 50 50 50 0 1 0 N\nS 50 150 50 250 0 1 0 N\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 0 -50 -200 -100 -200 N\nP 2 0 1 0 -50 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 0 -50 0 -100 0 N\nP 2 0 1 0 -50 0 50 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -50 200 -100 200 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 0 100 0 N\nP 2 0 1 0 50 200 -50 200 N\nP 3 0 1 0 -50 50 -50 -50 -50 -50 N\nP 3 0 1 0 -50 250 -50 150 -50 150 N\nP 4 0 1 0 50 -200 80 -200 80 200 50 200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX RK 1 -200 200 100 R 50 50 1 1 P\nX GK 2 -200 0 100 R 50 50 1 1 P\nX BK 3 -200 -200 100 R 50 50 1 1 P\nX A 4 200 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_RGBC\n#\nDEF LED_RGBC D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"LED_RGBC\" 0 -350 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC -85 0 10 0 1 0 F\nT 0 75 -250 50 0 0 0 B Normal 0 C C\nT 0 75 -50 50 0 0 0 G Normal 0 C C\nT 0 75 150 50 0 0 0 R Normal 0 C C\nS 50 -50 50 50 0 1 0 N\nS 50 50 50 50 0 1 0 N\nS 50 150 50 250 0 1 0 N\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 0 -50 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 0 -50 0 -100 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -50 200 50 200 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 -200 100 -200 N\nP 2 0 1 0 50 0 -50 0 N\nP 2 0 1 0 50 0 100 0 N\nP 2 0 1 0 50 200 100 200 N\nP 3 0 1 0 -50 50 -50 -50 -50 -50 N\nP 3 0 1 0 -50 250 -50 150 -50 150 N\nP 4 0 1 0 -50 200 -85 200 -85 -200 -40 -200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX RA 1 200 200 100 L 50 50 1 1 P\nX GA 2 200 0 100 L 50 50 1 1 P\nX BA 3 200 -200 100 L 50 50 1 1 P\nX K 4 -200 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_RGB_EP\n#\nDEF LED_RGB_EP D 0 0 Y N 1 F N\nF0 \"D\" 0 450 50 H V C CNN\nF1 \"LED_RGB_EP\" 0 370 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nC 0 -300 14 0 1 10 F\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS 50 -50 50 50 0 1 0 N\nS 50 50 50 50 0 1 0 N\nS 50 150 50 250 0 1 0 N\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 0 -50 -200 -100 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 0 -50 0 -100 0 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 -50 200 -100 200 N\nP 2 0 1 0 -50 200 50 200 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 -40 0 50 0 N\nP 2 0 1 0 50 -200 -50 -200 N\nP 2 0 1 0 50 -200 100 -200 N\nP 2 0 1 0 50 200 100 200 N\nP 2 0 1 0 100 0 50 0 N\nP 3 0 1 0 -50 50 -50 -50 -50 -50 N\nP 3 0 1 0 -50 250 -50 150 -50 150 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX RK 1 -200 200 100 R 50 50 1 1 P\nX GK 2 -200 0 100 R 50 50 1 1 P\nX BK 3 -200 -200 100 R 50 50 1 1 P\nX BA 4 200 -200 100 L 50 50 1 1 P\nX GA 5 200 0 100 L 50 50 1 1 P\nX RA 6 200 200 100 L 50 50 1 1 P\nX PAD 7 0 -500 200 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_Series\n#\nDEF LED_Series D 0 40 Y N 1 F N\nF0 \"D\" 0 225 50 H V C CNN\nF1 \"LED_Series\" 0 150 50 H V C CNN\nF2 \"\" -100 0 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -150 0 -40 0 N\nP 2 0 1 10 -145 -50 -145 50 N\nP 2 0 1 0 -20 0 -30 0 N\nP 2 0 1 0 5 0 -5 0 N\nP 2 0 1 0 20 0 30 0 N\nP 2 0 1 0 40 0 150 0 N\nP 2 0 1 10 45 -50 45 50 N\nP 4 0 1 10 -45 -50 -45 50 -145 0 -45 -50 N\nP 4 0 1 10 145 -50 145 50 45 0 145 -50 N\nP 5 0 1 0 -130 55 -70 115 -100 115 -70 115 -70 85 N\nP 5 0 1 0 -80 55 -20 115 -50 115 -20 115 -20 85 N\nP 5 0 1 0 60 55 120 115 90 115 120 115 120 85 N\nP 5 0 1 0 110 55 170 115 140 115 170 115 170 85 N\nX K 1 -250 0 100 R 50 50 1 1 P\nX A 2 250 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_Series_PAD\n#\nDEF LED_Series_PAD D 0 40 Y N 1 F N\nF0 \"D\" 0 225 50 H V C CNN\nF1 \"LED_Series_PAD\" 0 150 50 H V C CNN\nF2 \"\" -100 0 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -150 0 -40 0 N\nP 2 0 1 10 -145 -50 -145 50 N\nP 2 0 1 0 -20 0 -30 0 N\nP 2 0 1 0 0 -100 0 -80 N\nP 2 0 1 0 5 0 -5 0 N\nP 2 0 1 0 20 0 30 0 N\nP 2 0 1 0 40 0 150 0 N\nP 2 0 1 10 45 -50 45 50 N\nP 4 0 1 0 -160 -20 -160 -80 160 -80 160 -20 N\nP 4 0 1 10 -45 -50 -45 50 -145 0 -45 -50 N\nP 4 0 1 10 145 -50 145 50 45 0 145 -50 N\nP 5 0 1 0 -130 55 -70 115 -100 115 -70 115 -70 85 N\nP 5 0 1 0 -80 55 -20 115 -50 115 -20 115 -20 85 N\nP 5 0 1 0 60 55 120 115 90 115 120 115 120 85 N\nP 5 0 1 0 110 55 170 115 140 115 170 115 170 85 N\nX K 1 -250 0 100 R 50 50 1 1 P\nX A 2 250 0 100 L 50 50 1 1 P\nX PAD 3 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_Small\n#\nDEF LED_Small D 0 10 N N 1 F N\nF0 \"D\" -50 125 50 H V L CNN\nF1 \"LED_Small\" -175 -100 50 H V L CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -30 -40 -30 40 N\nP 2 0 1 0 40 0 -30 0 N\nP 4 0 1 10 30 -40 -30 0 30 40 30 -40 N\nP 5 0 1 0 0 30 -20 50 -10 50 -20 50 -20 40 N\nP 5 0 1 0 20 50 0 70 10 70 0 70 0 60 N\nX K 1 -100 0 70 R 50 50 1 1 P\nX A 2 100 0 70 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_Small_ALT\n#\nDEF LED_Small_ALT D 0 10 N N 1 F N\nF0 \"D\" -50 125 50 H V L CNN\nF1 \"LED_Small_ALT\" -175 -100 50 H V L CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\n$FPLIST\n LED*\n LED_SMD:*\n LED_THT:*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -30 -40 -30 40 N\nP 2 0 1 0 40 0 -30 0 N\nP 4 0 1 10 30 -40 -30 0 30 40 30 -40 F\nP 5 0 1 0 0 30 -20 50 -10 50 -20 50 -20 40 N\nP 5 0 1 0 20 50 0 70 10 70 0 70 0 60 N\nX K 1 -100 0 70 R 50 50 1 1 P\nX A 2 100 0 70 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LTRIM\n#\nDEF LTRIM L 0 40 N N 1 F N\nF0 \"L\" -75 0 50 V V C CNN\nF1 \"LTRIM\" 125 0 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA 0 -75 25 -899 899 0 1 0 N 0 -100 0 -50\nA 0 -25 25 -899 899 0 1 0 N 0 -50 0 0\nA 0 25 25 -899 899 0 1 0 N 0 0 0 50\nA 0 75 25 -899 899 0 1 0 N 0 50 0 100\nP 2 0 1 0 -50 -75 75 100 N\nP 2 0 1 0 75 100 40 85 N\nP 2 0 1 0 75 100 70 65 N\nX 1 1 0 150 50 D 50 50 1 1 P\nX 2 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Ferrite\n#\nDEF L_Core_Ferrite L 0 40 N N 1 F N\nF0 \"L\" -50 0 50 V V C CNN\nF1 \"L_Core_Ferrite\" 110 0 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA 0 -75 25 -899 899 0 1 0 N 0 -100 0 -50\nA 0 -25 25 -899 899 0 1 0 N 0 -50 0 0\nA 0 25 25 -899 899 0 1 0 N 0 0 0 50\nA 0 75 25 -899 899 0 1 0 N 0 50 0 100\nP 2 0 1 0 40 -110 40 -90 N\nP 2 0 1 0 40 -70 40 -50 N\nP 2 0 1 0 40 -30 40 -10 N\nP 2 0 1 0 40 10 40 30 N\nP 2 0 1 0 40 50 40 70 N\nP 2 0 1 0 40 90 40 110 N\nP 2 0 1 0 60 -90 60 -110 N\nP 2 0 1 0 60 -50 60 -70 N\nP 2 0 1 0 60 -10 60 -30 N\nP 2 0 1 0 60 30 60 10 N\nP 2 0 1 0 60 70 60 50 N\nP 2 0 1 0 60 110 60 90 N\nX 1 1 0 150 50 D 50 50 1 1 P\nX 2 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Ferrite_Coupled\n#\nDEF L_Core_Ferrite_Coupled L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Core_Ferrite_Coupled\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -110 -20 -90 -20 N\nP 2 0 1 0 -110 20 -90 20 N\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 -70 -20 -50 -20 N\nP 2 0 1 0 -70 20 -50 20 N\nP 2 0 1 0 -30 -20 -10 -20 N\nP 2 0 1 0 -30 20 -10 20 N\nP 2 0 1 0 10 -20 30 -20 N\nP 2 0 1 0 10 20 30 20 N\nP 2 0 1 0 50 -20 70 -20 N\nP 2 0 1 0 50 20 70 20 N\nP 2 0 1 0 90 -20 110 -20 N\nP 2 0 1 0 90 20 110 20 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 200 100 100 L 50 50 1 1 P\nX 3 3 -200 -100 100 R 50 50 1 1 P\nX 4 4 200 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Ferrite_Coupled_1243\n#\nDEF L_Core_Ferrite_Coupled_1243 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Core_Ferrite_Coupled_1243\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -110 -20 -90 -20 N\nP 2 0 1 0 -110 20 -90 20 N\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 -70 -20 -50 -20 N\nP 2 0 1 0 -70 20 -50 20 N\nP 2 0 1 0 -30 -20 -10 -20 N\nP 2 0 1 0 -30 20 -10 20 N\nP 2 0 1 0 10 -20 30 -20 N\nP 2 0 1 0 10 20 30 20 N\nP 2 0 1 0 50 -20 70 -20 N\nP 2 0 1 0 50 20 70 20 N\nP 2 0 1 0 90 -20 110 -20 N\nP 2 0 1 0 90 20 110 20 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 200 100 100 L 50 50 1 1 P\nX 3 3 200 -100 100 L 50 50 1 1 P\nX 4 4 -200 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Ferrite_Coupled_1324\n#\nDEF L_Core_Ferrite_Coupled_1324 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Core_Ferrite_Coupled_1324\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -110 -20 -90 -20 N\nP 2 0 1 0 -110 20 -90 20 N\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 -70 -20 -50 -20 N\nP 2 0 1 0 -70 20 -50 20 N\nP 2 0 1 0 -30 -20 -10 -20 N\nP 2 0 1 0 -30 20 -10 20 N\nP 2 0 1 0 10 -20 30 -20 N\nP 2 0 1 0 10 20 30 20 N\nP 2 0 1 0 50 -20 70 -20 N\nP 2 0 1 0 50 20 70 20 N\nP 2 0 1 0 90 -20 110 -20 N\nP 2 0 1 0 90 20 110 20 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 -200 -100 100 R 50 50 1 1 P\nX 3 3 200 100 100 L 50 50 1 1 P\nX 4 4 200 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Ferrite_Coupled_1342\n#\nDEF L_Core_Ferrite_Coupled_1342 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Core_Ferrite_Coupled_1342\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -110 -20 -90 -20 N\nP 2 0 1 0 -110 20 -90 20 N\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 -70 -20 -50 -20 N\nP 2 0 1 0 -70 20 -50 20 N\nP 2 0 1 0 -30 -20 -10 -20 N\nP 2 0 1 0 -30 20 -10 20 N\nP 2 0 1 0 10 -20 30 -20 N\nP 2 0 1 0 10 20 30 20 N\nP 2 0 1 0 50 -20 70 -20 N\nP 2 0 1 0 50 20 70 20 N\nP 2 0 1 0 90 -20 110 -20 N\nP 2 0 1 0 90 20 110 20 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 200 -100 100 L 50 50 1 1 P\nX 3 3 200 100 100 L 50 50 1 1 P\nX 4 4 -200 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Ferrite_Coupled_1423\n#\nDEF L_Core_Ferrite_Coupled_1423 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Core_Ferrite_Coupled_1423\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -110 -20 -90 -20 N\nP 2 0 1 0 -110 20 -90 20 N\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 -70 -20 -50 -20 N\nP 2 0 1 0 -70 20 -50 20 N\nP 2 0 1 0 -30 -20 -10 -20 N\nP 2 0 1 0 -30 20 -10 20 N\nP 2 0 1 0 10 -20 30 -20 N\nP 2 0 1 0 10 20 30 20 N\nP 2 0 1 0 50 -20 70 -20 N\nP 2 0 1 0 50 20 70 20 N\nP 2 0 1 0 90 -20 110 -20 N\nP 2 0 1 0 90 20 110 20 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 -200 -100 100 R 50 50 1 1 P\nX 3 3 200 -100 100 L 50 50 1 1 P\nX 4 4 200 100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Ferrite_Coupled_Small\n#\nDEF L_Core_Ferrite_Coupled_Small L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Core_Ferrite_Coupled_Small\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nP 2 0 1 0 -65 10 -55 10 N\nP 2 0 1 0 -55 -10 -65 -10 N\nP 2 0 1 0 -45 10 -35 10 N\nP 2 0 1 0 -35 -10 -45 -10 N\nP 2 0 1 0 -25 10 -15 10 N\nP 2 0 1 0 -15 -10 -25 -10 N\nP 2 0 1 0 -5 10 5 10 N\nP 2 0 1 0 5 -10 -5 -10 N\nP 2 0 1 0 15 10 25 10 N\nP 2 0 1 0 25 -10 15 -10 N\nP 2 0 1 0 35 10 45 10 N\nP 2 0 1 0 45 -10 35 -10 N\nP 2 0 1 0 55 10 65 10 N\nP 2 0 1 0 65 -10 55 -10 N\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 100 50 20 L 50 50 1 1 P\nX 3 3 -100 -50 20 R 50 50 1 1 P\nX 4 4 100 -50 20 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Ferrite_Coupled_Small_1243\n#\nDEF L_Core_Ferrite_Coupled_Small_1243 L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Core_Ferrite_Coupled_Small_1243\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nP 2 0 1 0 -65 10 -55 10 N\nP 2 0 1 0 -55 -10 -65 -10 N\nP 2 0 1 0 -45 10 -35 10 N\nP 2 0 1 0 -35 -10 -45 -10 N\nP 2 0 1 0 -25 10 -15 10 N\nP 2 0 1 0 -15 -10 -25 -10 N\nP 2 0 1 0 -5 10 5 10 N\nP 2 0 1 0 5 -10 -5 -10 N\nP 2 0 1 0 15 10 25 10 N\nP 2 0 1 0 25 -10 15 -10 N\nP 2 0 1 0 35 10 45 10 N\nP 2 0 1 0 45 -10 35 -10 N\nP 2 0 1 0 55 10 65 10 N\nP 2 0 1 0 65 -10 55 -10 N\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 100 50 20 L 50 50 1 1 P\nX 3 3 100 -50 20 L 50 50 1 1 P\nX 4 4 -100 -50 20 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Ferrite_Coupled_Small_1324\n#\nDEF L_Core_Ferrite_Coupled_Small_1324 L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Core_Ferrite_Coupled_Small_1324\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nP 2 0 1 0 -65 10 -55 10 N\nP 2 0 1 0 -55 -10 -65 -10 N\nP 2 0 1 0 -45 10 -35 10 N\nP 2 0 1 0 -35 -10 -45 -10 N\nP 2 0 1 0 -25 10 -15 10 N\nP 2 0 1 0 -15 -10 -25 -10 N\nP 2 0 1 0 -5 10 5 10 N\nP 2 0 1 0 5 -10 -5 -10 N\nP 2 0 1 0 15 10 25 10 N\nP 2 0 1 0 25 -10 15 -10 N\nP 2 0 1 0 35 10 45 10 N\nP 2 0 1 0 45 -10 35 -10 N\nP 2 0 1 0 55 10 65 10 N\nP 2 0 1 0 65 -10 55 -10 N\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 -100 -50 20 R 50 50 1 1 P\nX 3 3 100 50 20 L 50 50 1 1 P\nX 4 4 100 -50 20 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Ferrite_Coupled_Small_1342\n#\nDEF L_Core_Ferrite_Coupled_Small_1342 L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Core_Ferrite_Coupled_Small_1342\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nP 2 0 1 0 -65 10 -55 10 N\nP 2 0 1 0 -55 -10 -65 -10 N\nP 2 0 1 0 -45 10 -35 10 N\nP 2 0 1 0 -35 -10 -45 -10 N\nP 2 0 1 0 -25 10 -15 10 N\nP 2 0 1 0 -15 -10 -25 -10 N\nP 2 0 1 0 -5 10 5 10 N\nP 2 0 1 0 5 -10 -5 -10 N\nP 2 0 1 0 15 10 25 10 N\nP 2 0 1 0 25 -10 15 -10 N\nP 2 0 1 0 35 10 45 10 N\nP 2 0 1 0 45 -10 35 -10 N\nP 2 0 1 0 55 10 65 10 N\nP 2 0 1 0 65 -10 55 -10 N\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 100 -50 20 L 50 50 1 1 P\nX 3 3 100 50 20 L 50 50 1 1 P\nX 4 4 -100 -50 20 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Ferrite_Coupled_Small_1423\n#\nDEF L_Core_Ferrite_Coupled_Small_1423 L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Core_Ferrite_Coupled_Small_1423\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nP 2 0 1 0 -65 10 -55 10 N\nP 2 0 1 0 -55 -10 -65 -10 N\nP 2 0 1 0 -45 10 -35 10 N\nP 2 0 1 0 -35 -10 -45 -10 N\nP 2 0 1 0 -25 10 -15 10 N\nP 2 0 1 0 -15 -10 -25 -10 N\nP 2 0 1 0 -5 10 5 10 N\nP 2 0 1 0 5 -10 -5 -10 N\nP 2 0 1 0 15 10 25 10 N\nP 2 0 1 0 25 -10 15 -10 N\nP 2 0 1 0 35 10 45 10 N\nP 2 0 1 0 45 -10 35 -10 N\nP 2 0 1 0 55 10 65 10 N\nP 2 0 1 0 65 -10 55 -10 N\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 -100 -50 20 R 50 50 1 1 P\nX 3 3 100 -50 20 L 50 50 1 1 P\nX 4 4 100 50 20 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Ferrite_Small\n#\nDEF L_Core_Ferrite_Small L 0 10 N N 1 F N\nF0 \"L\" 50 40 50 H V L CNN\nF1 \"L_Core_Ferrite_Small\" 50 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA 0 -60 20 -899 899 0 1 0 N 0 -80 0 -40\nA 0 -20 20 -899 899 0 1 0 N 0 -40 0 0\nA 0 20 20 -899 899 0 1 0 N 0 0 0 40\nA 0 60 20 -899 899 0 1 0 N 0 40 0 80\nP 2 0 1 0 30 -75 30 -65 N\nP 2 0 1 0 30 -55 30 -45 N\nP 2 0 1 0 30 -35 30 -25 N\nP 2 0 1 0 30 -15 30 -5 N\nP 2 0 1 0 30 5 30 15 N\nP 2 0 1 0 30 25 30 35 N\nP 2 0 1 0 30 45 30 55 N\nP 2 0 1 0 30 65 30 75 N\nP 2 0 1 0 40 -65 40 -75 N\nP 2 0 1 0 40 -45 40 -55 N\nP 2 0 1 0 40 -25 40 -35 N\nP 2 0 1 0 40 -5 40 -15 N\nP 2 0 1 0 40 15 40 5 N\nP 2 0 1 0 40 35 40 25 N\nP 2 0 1 0 40 55 40 45 N\nP 2 0 1 0 40 75 40 65 N\nX ~ 1 0 100 20 D 50 50 1 1 P\nX ~ 2 0 -100 20 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Iron\n#\nDEF L_Core_Iron L 0 40 N N 1 F N\nF0 \"L\" -50 0 50 V V C CNN\nF1 \"L_Core_Iron\" 110 0 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA 0 -75 25 -899 899 0 1 0 N 0 -100 0 -50\nA 0 -25 25 -899 899 0 1 0 N 0 -50 0 0\nA 0 25 25 -899 899 0 1 0 N 0 0 0 50\nA 0 75 25 -899 899 0 1 0 N 0 50 0 100\nP 2 0 1 0 40 100 40 -100 N\nP 2 0 1 0 60 -100 60 100 N\nX 1 1 0 150 50 D 50 50 1 1 P\nX 2 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Iron_Coupled\n#\nDEF L_Core_Iron_Coupled L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Core_Iron_Coupled\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 20 100 20 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 -20 -100 -20 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 200 100 100 L 50 50 1 1 P\nX 3 3 -200 -100 100 R 50 50 1 1 P\nX 4 4 200 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Iron_Coupled_1243\n#\nDEF L_Core_Iron_Coupled_1243 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Core_Iron_Coupled_1243\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 20 100 20 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 -20 -100 -20 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 200 100 100 L 50 50 1 1 P\nX 3 3 200 -100 100 L 50 50 1 1 P\nX 4 4 -200 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Iron_Coupled_1324\n#\nDEF L_Core_Iron_Coupled_1324 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Core_Iron_Coupled_1324\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 20 100 20 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 -20 -100 -20 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 -200 -100 100 R 50 50 1 1 P\nX 3 3 200 100 100 L 50 50 1 1 P\nX 4 4 200 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Iron_Coupled_1342\n#\nDEF L_Core_Iron_Coupled_1342 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Core_Iron_Coupled_1342\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 20 100 20 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 -20 -100 -20 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 200 -100 100 L 50 50 1 1 P\nX 3 3 200 100 100 L 50 50 1 1 P\nX 4 4 -200 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Iron_Coupled_1423\n#\nDEF L_Core_Iron_Coupled_1423 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Core_Iron_Coupled_1423\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 20 100 20 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 -20 -100 -20 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 -200 -100 100 R 50 50 1 1 P\nX 3 3 200 -100 100 L 50 50 1 1 P\nX 4 4 200 100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Iron_Coupled_Small\n#\nDEF L_Core_Iron_Coupled_Small L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Core_Iron_Coupled_Small\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nP 2 0 1 0 70 -10 -70 -10 N\nP 2 0 1 0 70 10 -70 10 N\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 100 50 20 L 50 50 1 1 P\nX 3 3 -100 -50 20 R 50 50 1 1 P\nX 4 4 100 -50 20 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Iron_Coupled_Small_1243\n#\nDEF L_Core_Iron_Coupled_Small_1243 L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Core_Iron_Coupled_Small_1243\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nP 2 0 1 0 70 -10 -70 -10 N\nP 2 0 1 0 70 10 -70 10 N\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 100 50 20 L 50 50 1 1 P\nX 3 3 100 -50 20 L 50 50 1 1 P\nX 4 4 -100 -50 20 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Iron_Coupled_Small_1324\n#\nDEF L_Core_Iron_Coupled_Small_1324 L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Core_Iron_Coupled_Small_1324\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nP 2 0 1 0 70 -10 -70 -10 N\nP 2 0 1 0 70 10 -70 10 N\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 -100 -50 20 R 50 50 1 1 P\nX 3 3 100 -50 20 L 50 50 1 1 P\nX 4 4 100 50 20 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Iron_Coupled_Small_1342\n#\nDEF L_Core_Iron_Coupled_Small_1342 L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Core_Iron_Coupled_Small_1342\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nP 2 0 1 0 70 -10 -70 -10 N\nP 2 0 1 0 70 10 -70 10 N\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 100 -50 20 L 50 50 1 1 P\nX 3 3 100 50 20 L 50 50 1 1 P\nX 4 4 -100 -50 20 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Iron_Coupled_Small_1423\n#\nDEF L_Core_Iron_Coupled_Small_1423 L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Core_Iron_Coupled_Small_1423\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nP 2 0 1 0 70 -10 -70 -10 N\nP 2 0 1 0 70 10 -70 10 N\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 -100 -50 20 R 50 50 1 1 P\nX 3 3 100 -50 20 L 50 50 1 1 P\nX 4 4 100 50 20 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Core_Iron_Small\n#\nDEF L_Core_Iron_Small L 0 10 N N 1 F N\nF0 \"L\" 50 40 50 H V L CNN\nF1 \"L_Core_Iron_Small\" 50 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA 0 -60 20 -899 899 0 1 0 N 0 -80 0 -40\nA 0 -20 20 -899 899 0 1 0 N 0 -40 0 0\nA 0 20 20 -899 899 0 1 0 N 0 0 0 40\nA 0 60 20 -899 899 0 1 0 N 0 40 0 80\nP 2 0 1 0 30 80 30 -80 N\nP 2 0 1 0 40 -80 40 80 N\nX ~ 1 0 100 20 D 50 50 1 1 P\nX ~ 2 0 -100 20 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Coupled\n#\nDEF L_Coupled L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Coupled\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 200 100 100 L 50 50 1 1 P\nX 3 3 -200 -100 100 R 50 50 1 1 P\nX 4 4 200 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Coupled_1243\n#\nDEF L_Coupled_1243 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Coupled_1243\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 200 100 100 L 50 50 1 1 P\nX 3 3 200 -100 100 L 50 50 1 1 P\nX 4 4 -200 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Coupled_1324\n#\nDEF L_Coupled_1324 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Coupled_1324\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 200 100 100 L 50 50 1 1 P\nX 3 3 200 -100 100 L 50 50 1 1 P\nX 4 4 -200 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Coupled_1342\n#\nDEF L_Coupled_1342 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Coupled_1342\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 200 -100 100 L 50 50 1 1 P\nX 3 3 200 100 100 L 50 50 1 1 P\nX 4 4 -200 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Coupled_1423\n#\nDEF L_Coupled_1423 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Coupled_1423\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 -200 -100 100 R 50 50 1 1 P\nX 3 3 200 -100 100 L 50 50 1 1 P\nX 4 4 200 100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Coupled_Small\n#\nDEF L_Coupled_Small L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Coupled_Small\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 100 50 20 L 50 50 1 1 P\nX 3 3 -100 -50 20 R 50 50 1 1 P\nX 4 4 100 -50 20 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Coupled_Small_1243\n#\nDEF L_Coupled_Small_1243 L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Coupled_Small_1243\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 100 50 20 L 50 50 1 1 P\nX 3 3 100 -50 20 L 50 50 1 1 P\nX 4 4 -100 -50 20 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Coupled_Small_1324\n#\nDEF L_Coupled_Small_1324 L 0 10 Y N 1 F N\nF0 \"L\" 0 175 50 H V C CNN\nF1 \"L_Coupled_Small_1324\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -80 -80 20 1 1799 0 1 0 N -60 -80 -100 -80\nA -80 80 20 -1799 -1 0 1 0 N -100 80 -60 80\nA -40 -80 20 1 1799 0 1 0 N -20 -80 -60 -80\nA -40 80 20 -1799 -1 0 1 0 N -60 80 -20 80\nA 0 -80 20 1 1799 0 1 0 N 20 -80 -20 -80\nA 0 80 20 -1799 -1 0 1 0 N -20 80 20 80\nA 40 -80 20 1 1799 0 1 0 N 60 -80 20 -80\nA 40 80 20 -1799 -1 0 1 0 N 20 80 60 80\nA 80 -80 20 1 1799 0 1 0 N 100 -80 60 -80\nA 80 80 20 -1799 -1 0 1 0 N 60 80 100 80\nC -120 -50 10 0 1 0 F\nC -120 60 10 0 1 0 F\nP 2 0 1 0 -100 -80 -100 -100 N\nP 2 0 1 0 -100 80 -100 100 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 100 100 80 N\nX 1 1 -200 100 100 R 50 50 1 1 P\nX 2 2 200 -100 100 L 50 50 1 1 P\nX 3 3 200 100 100 L 50 50 1 1 P\nX 4 4 -200 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Coupled_Small_1342\n#\nDEF L_Coupled_Small_1342 L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Coupled_Small_1342\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 100 -50 20 L 50 50 1 1 P\nX 3 3 100 50 20 L 50 50 1 1 P\nX 4 4 -100 -50 20 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Coupled_Small_1423\n#\nDEF L_Coupled_Small_1423 L 0 10 Y N 1 F N\nF0 \"L\" 0 125 50 H V C CNN\nF1 \"L_Coupled_Small_1423\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA -60 -50 20 1 1799 0 1 0 N -40 -50 -80 -50\nA -60 50 20 -1799 -1 0 1 0 N -80 50 -40 50\nA -20 -50 20 1 1799 0 1 0 N 0 -50 -40 -50\nA -20 50 20 -1799 -1 0 1 0 N -40 50 0 50\nA 20 -50 20 1 1799 0 1 0 N 40 -50 0 -50\nA 20 50 20 -1799 -1 0 1 0 N 0 50 40 50\nA 60 -50 20 1 1799 0 1 0 N 80 -50 40 -50\nA 60 50 20 -1799 -1 0 1 0 N 40 50 80 50\nC -60 -50 10 0 1 0 F\nC -60 50 10 0 1 0 F\nX 1 1 -100 50 20 R 50 50 1 1 P\nX 2 2 -100 -50 20 R 50 50 1 1 P\nX 3 3 100 -50 20 L 50 50 1 1 P\nX 4 4 100 50 20 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# L_Small\n#\nDEF L_Small L 0 10 N N 1 F N\nF0 \"L\" 30 40 50 H V L CNN\nF1 \"L_Small\" 30 -40 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Choke_*\n *Coil*\n Inductor_*\n L_*\n$ENDFPLIST\nDRAW\nA 0 -60 20 -899 899 0 1 0 N 0 -80 0 -40\nA 0 -20 20 -899 899 0 1 0 N 0 -40 0 0\nA 0 20 20 -899 899 0 1 0 N 0 0 0 40\nA 0 60 20 -899 899 0 1 0 N 0 40 0 80\nX ~ 1 0 100 20 D 50 50 1 1 P\nX ~ 2 0 -100 20 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Lamp\n#\nDEF Lamp LA 0 1 N N 1 F N\nF0 \"LA\" 25 150 50 H V L CNN\nF1 \"Lamp\" 25 -150 50 H V L CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nC 0 0 100 0 1 0 N\nP 2 0 1 0 -70 70 70 -70 N\nP 2 0 1 0 70 70 -70 -70 N\nX - 1 0 -200 100 U 50 50 1 1 P\nX + 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Lamp_Flash\n#\nDEF Lamp_Flash LA 0 1 Y N 1 F N\nF0 \"LA\" 25 150 50 H V L CNN\nF1 \"Lamp_Flash\" 25 -150 50 H V L CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nA 0 0 117 310 -310 0 0 10 N 100 60 100 -60\nC 0 0 100 0 1 0 N\nC 40 -50 10 0 1 0 F\nS -30 -70 30 -80 0 0 10 F\nS -30 80 30 70 0 0 10 F\nP 2 0 0 10 120 0 150 0 N\nP 2 0 1 0 0 -100 0 -80 N\nP 2 0 1 0 0 100 0 80 N\nX ~ 1 0 -200 100 U 50 50 1 1 P\nX ~ 2 200 0 50 L 50 50 1 1 P\nX ~ 3 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Lamp_Neon\n#\nDEF Lamp_Neon NE 0 1 Y N 1 F N\nF0 \"NE\" 25 150 50 H V L CNN\nF1 \"Lamp_Neon\" 25 -150 50 H V L CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nC 0 0 100 0 1 0 N\nC 40 -50 10 0 1 0 F\nS -60 -20 60 -30 0 1 0 F\nS -60 30 60 20 0 1 0 F\nP 2 0 1 0 0 -100 0 -30 N\nP 2 0 1 0 0 30 0 100 N\nX ~ 1 0 -200 100 U 50 50 1 1 P\nX ~ 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Laserdiode_1A3C\n#\nDEF Laserdiode_1A3C LD 0 40 Y N 1 F N\nF0 \"LD\" -50 175 50 H V C CNN\nF1 \"Laserdiode_1A3C\" -50 -100 50 H V C CNN\nF2 \"\" -100 -25 50 H I C CNN\nF3 \"\" 30 -200 50 H I C CNN\n$FPLIST\n *LaserDiode*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -160 50 -100 110 N\nP 2 0 1 0 -160 70 -100 90 N\nP 2 0 1 0 -160 90 -100 70 N\nP 2 0 1 0 -160 110 -100 50 N\nP 2 0 1 0 -140 110 -120 50 N\nP 2 0 1 0 -130 80 -130 40 N\nP 2 0 1 0 -130 80 -130 120 N\nP 2 0 1 0 -120 110 -140 50 N\nP 2 0 1 0 -70 80 -170 80 N\nP 2 0 1 8 -60 50 -60 -50 N\nP 2 0 1 0 50 120 30 120 N\nP 2 0 1 0 100 0 -200 0 N\nP 3 0 1 0 -10 60 50 120 50 100 N\nP 4 0 1 8 40 50 40 -50 -60 0 40 50 N\nP 5 0 1 0 -60 60 0 120 0 100 0 120 -20 120 N\nX A 1 200 0 100 L 50 50 1 1 P\nX K 3 -300 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Laserdiode_1C2A\n#\nDEF Laserdiode_1C2A LD 0 40 Y N 1 F N\nF0 \"LD\" -50 175 50 H V C CNN\nF1 \"Laserdiode_1C2A\" -50 -100 50 H V C CNN\nF2 \"\" -100 -25 50 H I C CNN\nF3 \"\" 30 -200 50 H I C CNN\n$FPLIST\n *LaserDiode*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -160 50 -100 110 N\nP 2 0 1 0 -160 70 -100 90 N\nP 2 0 1 0 -160 90 -100 70 N\nP 2 0 1 0 -160 110 -100 50 N\nP 2 0 1 0 -140 110 -120 50 N\nP 2 0 1 0 -130 80 -130 40 N\nP 2 0 1 0 -130 80 -130 120 N\nP 2 0 1 0 -120 110 -140 50 N\nP 2 0 1 0 -70 80 -170 80 N\nP 2 0 1 8 -60 50 -60 -50 N\nP 2 0 1 0 50 120 30 120 N\nP 2 0 1 0 100 0 -200 0 N\nP 3 0 1 0 -10 60 50 120 50 100 N\nP 4 0 1 8 40 50 40 -50 -60 0 40 50 N\nP 5 0 1 0 -60 60 0 120 0 100 0 120 -20 120 N\nX K 1 -300 0 100 R 50 50 1 1 P\nX A 2 200 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Laserdiode_M_TYPE\n#\nDEF Laserdiode_M_TYPE LD 0 20 Y N 1 F N\nF0 \"LD\" 40 280 50 H V C CNN\nF1 \"Laserdiode_M_TYPE\" 40 -220 50 H V C CNN\nF2 \"\" 40 75 50 H I C CNN\nF3 \"\" 90 -100 50 H I C CNN\n$FPLIST\n *LaserDiode*\n$ENDFPLIST\nDRAW\nA -20 -63 7 -899 899 0 1 0 N -20 -70 -20 -55\nA 0 -70 15 -899 899 0 1 0 N 0 -85 0 -55\nA 0 65 15 -899 899 0 1 0 N 0 50 0 80\nC -60 0 10 0 1 0 F\nS 170 240 -90 -170 0 1 10 f\nP 2 0 1 0 -100 0 -60 0 N\nP 2 0 1 0 -60 150 0 210 N\nP 2 0 1 0 -60 170 0 190 N\nP 2 0 1 0 -60 190 0 170 N\nP 2 0 1 0 -60 210 0 150 N\nP 2 0 1 0 -40 210 -20 150 N\nP 2 0 1 0 -30 180 -30 140 N\nP 2 0 1 0 -30 180 -30 220 N\nP 2 0 1 0 -25 -55 -25 -85 N\nP 2 0 1 0 -20 210 -40 150 N\nP 2 0 1 0 0 -55 0 -85 N\nP 2 0 1 0 0 80 0 50 N\nP 2 0 1 0 30 180 -70 180 N\nP 2 0 1 8 40 -50 40 -150 N\nP 2 0 1 0 40 -30 60 -30 N\nP 2 0 1 8 40 150 40 50 N\nP 2 0 1 0 150 220 130 220 N\nP 3 0 1 0 -25 80 -25 50 -10 50 N\nP 3 0 1 0 90 160 150 220 150 200 N\nP 3 0 1 0 100 30 40 -30 40 -10 N\nP 4 0 1 8 140 -50 140 -150 40 -100 140 -50 N\nP 4 0 1 8 140 150 140 50 40 100 140 150 N\nP 4 0 1 0 200 100 -60 100 -60 -100 200 -100 N\nP 5 0 1 0 40 160 100 220 100 200 100 220 80 220 N\nP 5 0 1 0 150 30 90 -30 90 -10 90 -30 110 -30 N\nX ~ 1 300 100 100 L 50 50 1 1 P\nX ~ 2 -200 0 100 R 50 50 1 1 P\nX ~ 3 300 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Laserdiode_N_TYPE\n#\nDEF Laserdiode_N_TYPE LD 0 20 Y N 1 F N\nF0 \"LD\" 40 280 50 H V C CNN\nF1 \"Laserdiode_N_TYPE\" 40 -220 50 H V C CNN\nF2 \"\" 0 75 50 H I C CNN\nF3 \"\" 50 -100 50 H I C CNN\n$FPLIST\n *LaserDiode*\n$ENDFPLIST\nDRAW\nA -20 -63 7 -899 899 0 1 0 N -20 -70 -20 -55\nA 0 -70 15 -899 899 0 1 0 N 0 -85 0 -55\nA 0 65 15 -899 899 0 1 0 N 0 50 0 80\nC -60 0 10 0 1 0 F\nS 170 240 -90 -170 0 1 10 f\nP 2 0 1 0 -100 0 -60 0 N\nP 2 0 1 0 -60 150 0 210 N\nP 2 0 1 0 -60 170 0 190 N\nP 2 0 1 0 -60 190 0 170 N\nP 2 0 1 0 -60 210 0 150 N\nP 2 0 1 0 -40 210 -20 150 N\nP 2 0 1 0 -30 180 -30 140 N\nP 2 0 1 0 -30 180 -30 220 N\nP 2 0 1 0 -25 -55 -25 -85 N\nP 2 0 1 0 -20 210 -40 150 N\nP 2 0 1 0 0 -55 0 -85 N\nP 2 0 1 0 0 80 0 50 N\nP 2 0 1 0 30 180 -70 180 N\nP 2 0 1 0 30 220 50 220 N\nP 2 0 1 8 40 -50 40 -150 N\nP 2 0 1 0 40 -30 60 -30 N\nP 2 0 1 8 140 150 140 50 N\nP 3 0 1 0 -25 80 -25 50 -10 50 N\nP 3 0 1 0 90 160 30 220 30 200 N\nP 3 0 1 0 100 30 40 -30 40 -10 N\nP 4 0 1 8 140 -50 140 -150 40 -100 140 -50 N\nP 4 0 1 0 200 100 -60 100 -60 -100 200 -100 N\nP 5 0 1 0 140 160 80 220 80 200 80 220 100 220 N\nP 5 0 1 0 150 30 90 -30 90 -10 90 -30 110 -30 N\nP 4 1 1 8 40 150 40 50 140 100 40 150 N\nX ~ 1 300 100 100 L 50 50 1 1 P\nX ~ 2 -200 0 100 R 50 50 1 1 P\nX ~ 3 300 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Laserdiode_P_TYPE\n#\nDEF Laserdiode_P_TYPE LD 0 20 Y N 1 F N\nF0 \"LD\" 40 280 50 H V C CNN\nF1 \"Laserdiode_P_TYPE\" 40 -220 50 H V C CNN\nF2 \"\" 0 75 50 H I C CNN\nF3 \"\" 130 -100 50 H I C CNN\n$FPLIST\n *LaserDiode*\n$ENDFPLIST\nDRAW\nA -20 -63 7 -899 899 0 1 0 N -20 -70 -20 -55\nA 0 -70 15 -899 899 0 1 0 N 0 -85 0 -55\nA 0 65 15 -899 899 0 1 0 N 0 50 0 80\nC -60 0 10 0 1 0 F\nS 170 240 -90 -170 0 1 10 f\nP 2 0 1 0 -100 0 -60 0 N\nP 2 0 1 0 -60 150 0 210 N\nP 2 0 1 0 -60 170 0 190 N\nP 2 0 1 0 -60 190 0 170 N\nP 2 0 1 0 -60 210 0 150 N\nP 2 0 1 0 -40 210 -20 150 N\nP 2 0 1 0 -30 180 -30 140 N\nP 2 0 1 0 -30 180 -30 220 N\nP 2 0 1 0 -25 -55 -25 -85 N\nP 2 0 1 0 -20 210 -40 150 N\nP 2 0 1 0 0 -55 0 -85 N\nP 2 0 1 0 0 80 0 50 N\nP 2 0 1 0 30 180 -70 180 N\nP 2 0 1 8 40 150 40 50 N\nP 2 0 1 8 140 -50 140 -150 N\nP 2 0 1 0 140 -30 120 -30 N\nP 2 0 1 0 150 220 130 220 N\nP 3 0 1 0 -25 80 -25 50 -10 50 N\nP 3 0 1 0 80 30 140 -30 140 -10 N\nP 3 0 1 0 90 160 150 220 150 200 N\nP 4 0 1 8 40 -50 40 -150 140 -100 40 -50 N\nP 4 0 1 8 140 150 140 50 40 100 140 150 N\nP 4 0 1 0 200 100 -60 100 -60 -100 200 -100 N\nP 5 0 1 0 30 30 90 -30 90 -10 90 -30 70 -30 N\nP 5 0 1 0 40 160 100 220 100 200 100 220 80 220 N\nX ~ 1 300 100 100 L 50 50 1 1 P\nX ~ 2 -200 0 100 R 50 50 1 1 P\nX ~ 3 300 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MEMRISTOR\n#\nDEF MEMRISTOR MR 0 0 N Y 1 F N\nF0 \"MR\" 100 0 50 V V C CNN\nF1 \"MEMRISTOR\" -100 0 50 V V C CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 10 0 0 10 0 100 50 100 50 50 -50 50 -50 0 50 0 50 -50 -50 -50 -50 -100 0 -100 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Microphone\n#\nDEF Microphone MK 0 1 Y N 1 F N\nF0 \"MK\" -150 50 50 H V R CNN\nF1 \"Microphone\" -150 -25 50 H V R CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nC 0 0 100 0 1 10 N\nP 2 0 1 10 -100 100 -100 -100 N\nP 2 0 1 0 10 150 30 150 N\nP 2 0 1 0 20 160 20 140 N\nX - 1 0 -200 100 U 50 50 1 1 P\nX + 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Microphone_Condenser\n#\nDEF Microphone_Condenser MK 0 1 Y N 1 F N\nF0 \"MK\" -130 50 50 H V R CNN\nF1 \"Microphone_Condenser\" -130 -25 50 H V R CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nC 0 0 100 0 1 10 N\nS 40 -10 -40 -30 0 1 0 F\nS 40 30 -40 10 0 1 0 F\nP 2 0 1 10 -100 100 -100 -100 N\nP 2 0 1 0 0 -30 0 -60 N\nP 2 0 1 0 0 30 0 60 N\nP 2 0 1 0 10 150 30 150 N\nP 2 0 1 0 20 160 20 140 N\nX - 1 0 -200 100 U 50 50 1 1 P\nX + 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Microphone_Crystal\n#\nDEF Microphone_Crystal MK 0 1 Y N 1 F N\nF0 \"MK\" -150 45 50 H V R CNN\nF1 \"Microphone_Crystal\" -150 -30 50 H V R CNN\nF2 \"\" 50 -70 50 V I L CNN\nF3 \"\" 0 100 50 V I C CNN\nALIAS Microphone_Ultrasound\nDRAW\nC 0 0 100 0 1 10 N\nS -50 20 50 -20 0 1 10 N\nP 2 0 1 10 -100 100 -100 -100 N\nP 2 0 1 0 -30 -40 30 -40 N\nP 2 0 1 0 -30 40 30 40 N\nP 2 0 1 0 0 -40 0 -70 N\nP 2 0 1 0 0 40 0 70 N\nP 2 0 1 0 10 150 30 150 N\nP 2 0 1 0 20 160 20 140 N\nX - 1 0 -200 100 U 50 50 1 1 P\nX + 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Net-Tie_2\n#\nDEF Net-Tie_2 NT 0 0 N N 1 F N\nF0 \"NT\" 0 50 50 H V C CNN\nF1 \"Net-Tie_2\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Net*Tie*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 0 50 0 N\nX 1 1 -100 0 100 R 50 50 1 1 P\nX 2 2 100 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Net-Tie_3\n#\nDEF Net-Tie_3 NT 0 0 N N 1 F N\nF0 \"NT\" 0 50 50 H V C CNN\nF1 \"Net-Tie_3\" 0 -150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Net*Tie*\n$ENDFPLIST\nDRAW\nP 2 0 1 20 -50 0 50 0 N\nP 3 0 1 20 0 0 0 -100 -50 -100 N\nX 1 1 -100 0 100 R 50 50 1 1 P\nX 2 2 100 0 100 L 50 50 1 1 P\nX 3 3 -100 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Net-Tie_3_Tee\n#\nDEF Net-Tie_3_Tee NT 0 0 N N 1 F N\nF0 \"NT\" 0 125 50 H V C CNN\nF1 \"Net-Tie_3_Tee\" 0 50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Net*Tie*\n$ENDFPLIST\nDRAW\nP 2 0 1 20 -50 0 50 0 N\nP 2 0 1 10 -50 0 50 0 N\nP 2 0 1 10 0 -100 0 -100 N\nP 2 0 1 20 0 -50 0 0 N\nX 1 1 -100 0 100 R 50 50 1 1 P\nX 2 2 100 0 100 L 50 50 1 1 P\nX 3 3 0 -100 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Net-Tie_4\n#\nDEF Net-Tie_4 NT 0 0 N N 1 F N\nF0 \"NT\" 0 50 50 H V C CNN\nF1 \"Net-Tie_4\" 0 -150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Net*Tie*\n$ENDFPLIST\nDRAW\nP 2 0 1 20 -50 -100 50 -100 N\nP 2 0 1 20 -50 0 50 0 N\nP 2 0 1 20 0 -100 0 0 N\nX 1 1 -100 0 100 R 50 50 1 1 P\nX 2 2 100 0 100 L 50 50 1 1 P\nX 3 3 -100 -100 100 R 50 50 1 1 P\nX 4 4 100 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Net-Tie_4_Cross\n#\nDEF Net-Tie_4_Cross NT 0 0 N N 1 F N\nF0 \"NT\" 25 50 50 H V L CNN\nF1 \"Net-Tie_4_Cross\" 25 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Net*Tie*\n$ENDFPLIST\nDRAW\nP 2 0 1 20 -50 0 50 0 N\nP 2 0 1 20 0 -50 0 50 N\nX 1 1 -100 0 100 R 50 50 1 1 P\nX 2 2 100 0 100 L 50 50 1 1 P\nX 3 3 0 100 100 D 50 50 1 1 P\nX 4 4 0 -100 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Ohmmeter\n#\nDEF Ohmmeter MES 0 1 N N 1 F N\nF0 \"MES\" -130 40 50 H V R CNN\nF1 \"Ohmmeter\" -130 -30 50 H V R CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nC 0 0 100 0 1 10 N\nT 0 0 0 100 0 0 0 Ω Normal 0 C C\nP 2 0 0 0 -125 -125 -75 -75 N\nP 2 0 0 0 75 75 125 125 N\nP 3 0 0 0 75 125 125 125 125 75 N\nX - 1 0 -200 100 U 50 50 1 1 P\nX + 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Opamp_Dual_Generic\n#\nDEF Opamp_Dual_Generic U 0 20 Y Y 3 L N\nF0 \"U\" 0 200 50 H V L CNN\nF1 \"Opamp_Dual_Generic\" 0 -200 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOIC*3.9x4.9mm*P1.27mm*\n DIP*W7.62mm*\n MSOP*3x3mm*P0.65mm*\n SSOP*2.95x2.8mm*P0.65mm*\n TSSOP*3x3mm*P0.65mm*\n VSSOP*P0.5mm*\n TO?99*\n$ENDFPLIST\nDRAW\nP 4 1 1 10 -200 200 200 0 -200 -200 -200 200 f\nP 4 2 1 10 -200 200 200 0 -200 -200 -200 200 f\nX ~ 1 300 0 100 L 50 50 1 1 O\nX - 2 -300 -100 100 R 50 50 1 1 I\nX + 3 -300 100 100 R 50 50 1 1 I\nX + 5 -300 100 100 R 50 50 2 1 I\nX - 6 -300 -100 100 R 50 50 2 1 I\nX ~ 7 300 0 100 L 50 50 2 1 O\nX V- 4 -100 -300 150 U 50 50 3 1 W\nX V+ 8 -100 300 150 D 50 50 3 1 W\nENDDRAW\nENDDEF\n#\n# Opamp_Quad_Generic\n#\nDEF Opamp_Quad_Generic U 0 20 Y Y 5 L N\nF0 \"U\" 0 200 50 H V L CNN\nF1 \"Opamp_Quad_Generic\" 0 -200 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOIC*3.9x8.7mm*P1.27mm*\n DIP*W7.62mm*\n TSSOP*4.4x5mm*P0.65mm*\n SSOP*5.3x6.2mm*P0.65mm*\n$ENDFPLIST\nDRAW\nP 4 1 1 10 -200 200 200 0 -200 -200 -200 200 f\nP 4 2 1 10 -200 200 200 0 -200 -200 -200 200 f\nP 4 3 1 10 -200 200 200 0 -200 -200 -200 200 f\nP 4 4 1 10 -200 200 200 0 -200 -200 -200 200 f\nX ~ 1 300 0 100 L 50 50 1 1 O\nX - 2 -300 -100 100 R 50 50 1 1 I\nX + 3 -300 100 100 R 50 50 1 1 I\nX + 5 -300 100 100 R 50 50 2 1 I\nX - 6 -300 -100 100 R 50 50 2 1 I\nX ~ 7 300 0 100 L 50 50 2 1 O\nX + 10 -300 100 100 R 50 50 3 1 I\nX ~ 8 300 0 100 L 50 50 3 1 O\nX - 9 -300 -100 100 R 50 50 3 1 I\nX + 12 -300 100 100 R 50 50 4 1 I\nX - 13 -300 -100 100 R 50 50 4 1 I\nX ~ 14 300 0 100 L 50 50 4 1 O\nX V- 11 -100 -300 150 U 50 50 5 1 W\nX V+ 4 -100 300 150 D 50 50 5 1 W\nENDDRAW\nENDDEF\n#\n# Oscilloscope\n#\nDEF Oscilloscope MES 0 1 N N 1 F N\nF0 \"MES\" -130 40 50 H V R CNN\nF1 \"Oscilloscope\" -130 -30 50 H V R CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nA -55 20 15 1 1799 0 0 10 N -40 20 -70 20\nA -15 -20 15 -1799 -1 0 0 10 N -30 -20 0 -20\nA 25 20 15 1 1799 0 0 10 N 40 20 10 20\nA 65 -20 15 -1799 -1 0 0 10 N 50 -20 80 -20\nC 0 0 100 0 1 10 N\nP 2 0 0 10 -70 20 -75 0 N\nP 2 0 0 10 -40 20 -30 -20 N\nP 2 0 0 10 0 -20 10 20 N\nP 2 0 0 10 40 20 50 -20 N\nP 2 0 0 10 80 -20 85 0 N\nP 2 0 1 0 10 150 30 150 N\nP 2 0 1 0 20 160 20 140 N\nX - 1 0 -200 100 U 50 50 1 1 P\nX + 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Peltier_Element\n#\nDEF Peltier_Element PE 0 0 N Y 1 F N\nF0 \"PE\" 0 125 50 H V C CNN\nF1 \"Peltier_Element\" 0 -50 50 H V C CNN\nF2 \"\" 0 -70 50 H I C CNN\nF3 \"\" 0 25 50 V I C CNN\nDRAW\nS -140 75 -115 0 0 1 0 F\nS -90 75 -65 0 0 1 0 F\nS -15 75 -40 0 0 1 0 F\nS 35 75 10 0 0 1 0 F\nS 60 0 85 75 0 1 0 F\nS 110 0 135 75 0 1 0 F\nP 2 0 1 10 -150 0 150 0 F\nP 2 0 1 10 -150 75 150 75 N\nX ~ 1 -200 0 50 R 50 50 1 1 P\nX ~ 2 200 0 50 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Polyfuse\n#\nDEF Polyfuse F 0 0 N Y 1 F N\nF0 \"F\" -100 0 50 V V C CNN\nF1 \"Polyfuse\" 100 0 50 V V C CNN\nF2 \"\" 50 -200 50 H I L CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n *polyfuse*\n *PTC*\n$ENDFPLIST\nDRAW\nS -30 100 30 -100 0 1 10 N\nP 2 0 1 0 0 100 0 -100 N\nP 4 0 1 0 -60 100 -60 60 60 -60 60 -100 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Polyfuse_Small\n#\nDEF Polyfuse_Small F 0 0 N Y 1 F N\nF0 \"F\" -75 0 50 V V C CNN\nF1 \"Polyfuse_Small\" 75 0 50 V V C CNN\nF2 \"\" 50 -200 50 H I L CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n *polyfuse*\n *PTC*\n$ENDFPLIST\nDRAW\nS -20 50 20 -50 0 1 0 N\nP 2 0 1 0 0 100 0 -100 N\nP 4 0 1 0 -40 50 -40 30 40 -30 40 -50 N\nX ~ 1 0 100 25 D 50 50 1 1 P\nX ~ 2 0 -100 25 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_DUAL_NMOS_G1S2G2D2S1D1\n#\nDEF Q_DUAL_NMOS_G1S2G2D2S1D1 Q 0 0 Y N 2 F N\nF0 \"Q\" 250 50 50 H V C CNN\nF1 \"Q_DUAL_NMOS_G1S2G2D2S1D1\" 750 -50 50 H V C CNN\nF2 \"\" 200 0 50 H I C CNN\nF3 \"\" 200 0 50 H I C CNN\n$FPLIST\n TSOP*\n SC?70*\n SC?88*\n SOT?363*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX S 5 100 -200 100 U 50 50 1 1 P\nX D 6 100 200 100 D 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 2 1 P\nX G 3 -200 0 100 R 50 50 2 1 I\nX D 4 100 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# Q_DUAL_NMOS_S1G1D2S2G2D1\n#\nDEF Q_DUAL_NMOS_S1G1D2S2G2D1 Q 0 0 Y N 2 F N\nF0 \"Q\" 250 50 50 H V C CNN\nF1 \"Q_DUAL_NMOS_S1G1D2S2G2D1\" 750 -50 50 H V C CNN\nF2 \"\" 200 0 50 H I C CNN\nF3 \"\" 200 0 50 H I C CNN\n$FPLIST\n TSOP*\n SC?70*\n SC?88*\n SOT?363*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX D 6 100 200 100 D 50 50 1 1 P\nX D 3 100 200 100 D 50 50 2 1 P\nX S 4 100 -200 100 U 50 50 2 1 P\nX G 5 -200 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# Q_DUAL_NPN_C2C1E1E2\n#\nDEF Q_DUAL_NPN_C2C1E1E2 Q 0 0 Y Y 1 F N\nF0 \"Q\" 300 50 50 H V L CNN\nF1 \"Q_DUAL_NPN_C2C1E1E2\" 300 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CIN\nF3 \"\" -100 0 50 H I L CNN\n$FPLIST\n SOT?143*\n$ENDFPLIST\nDRAW\nC -200 120 10 0 1 0 F\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -200 -100 -125 -25 N\nP 2 0 1 0 -200 100 -125 25 N\nP 2 0 1 0 -200 100 -125 25 N\nP 2 0 1 0 125 0 -125 0 N\nP 2 0 1 0 200 -100 125 -25 N\nP 2 0 1 0 200 100 125 25 N\nP 3 0 1 20 -125 -75 -125 75 -125 75 F\nP 3 0 1 0 0 0 0 120 -200 120 N\nP 3 0 1 20 125 -75 125 75 125 75 F\nP 5 0 1 0 -150 -70 -170 -50 -190 -90 -150 -70 -150 -70 F\nP 5 0 1 0 150 -70 170 -50 190 -90 150 -70 150 -70 F\nX C2 1 -200 200 100 D 50 50 1 1 P\nX C1 2 200 200 100 D 50 50 1 1 P\nX E1 3 200 -200 100 U 50 50 1 1 P\nX E2 4 -200 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_DUAL_NPN_NPN_BRT_E1B1C2E2B2C1\n#\nDEF Q_DUAL_NPN_NPN_BRT_E1B1C2E2B2C1 Q 0 20 Y N 2 F N\nF0 \"Q\" 150 50 50 H V L CNN\nF1 \"Q_DUAL_NPN_NPN_BRT_E1B1C2E2B2C1\" 150 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SC?70*\n SC?88*\n SOT*363*\n$ENDFPLIST\nDRAW\nC -150 0 10 0 1 0 F\nC 50 -120 10 0 1 0 F\nC 0 0 111 1 1 10 N\nC 0 0 111 2 1 10 N\nS -250 20 -190 -20 0 1 0 N\nS -170 -90 -130 -30 0 1 0 N\nP 2 0 1 0 -150 -30 -150 0 N\nP 2 0 1 0 -30 0 -190 0 N\nP 2 0 1 20 -25 60 -25 -60 N\nP 3 0 1 0 -150 -90 -150 -120 50 -120 N\nP 2 1 1 0 -25 25 50 100 N\nP 3 1 1 0 -25 -25 50 -100 50 -100 N\nP 5 1 1 0 0 -70 20 -50 40 -90 0 -70 0 -70 F\nP 2 2 1 0 -25 25 50 100 N\nP 3 2 1 0 -25 -25 50 -100 50 -100 N\nP 5 2 1 0 0 -70 20 -50 40 -90 0 -70 0 -70 F\nX C1 3 50 200 100 D 50 50 1 1 P\nX E1 4 50 -200 100 U 50 50 1 1 P\nX B1 5 -350 0 100 R 50 50 1 1 I\nX E1 1 50 -200 100 U 50 50 2 1 P\nX B1 2 -350 0 100 R 50 50 2 1 I\nX C1 6 50 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# Q_DUAL_NPN_NPN_C2E2C1E1B1B2\n#\nDEF Q_DUAL_NPN_NPN_C2E2C1E1B1B2 Q 0 0 Y N 2 L N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_DUAL_NPN_NPN_C2E2C1E1B1B2\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SC?70*\n SC?88*\n SOT?363*\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 0 -100 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C1 3 100 200 100 D 50 50 1 1 P\nX E1 4 100 -200 100 U 50 50 1 1 P\nX B1 5 -200 0 100 R 50 50 1 1 I\nX C2 1 100 200 100 D 50 50 2 1 P\nX E2 2 100 -200 100 U 50 50 2 1 P\nX B2 6 -200 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# Q_DUAL_NPN_NPN_E1B1C2E2B2C1\n#\nDEF Q_DUAL_NPN_NPN_E1B1C2E2B2C1 Q 0 0 Y N 2 L N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_DUAL_NPN_NPN_E1B1C2E2B2C1\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SC?70*\n SC?88*\n SOT?363*\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 0 -100 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E1 1 100 -200 100 U 50 50 1 1 P\nX B1 2 -200 0 100 R 50 50 1 1 I\nX C1 6 100 200 100 D 50 50 1 1 P\nX C2 3 100 200 100 D 50 50 2 1 P\nX E2 4 100 -200 100 U 50 50 2 1 P\nX B2 5 -200 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# Q_DUAL_NPN_PNP_BRT_E1B1C2E2B2C1\n#\nDEF Q_DUAL_NPN_PNP_BRT_E1B1C2E2B2C1 Q 0 20 Y N 2 F N\nF0 \"Q\" 150 50 50 H V L CNN\nF1 \"Q_DUAL_NPN_PNP_BRT_E1B1C2E2B2C1\" 150 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SC?70*\n SC?88*\n SOT*363*\n$ENDFPLIST\nDRAW\nC -150 0 10 0 1 0 F\nC 50 -120 10 0 1 0 F\nC 0 0 111 1 1 10 N\nC 0 0 111 2 1 10 N\nS -250 20 -190 -20 0 1 0 N\nS -170 -90 -130 -30 0 1 0 N\nP 2 0 1 0 -150 -30 -150 0 N\nP 2 0 1 0 -30 0 -190 0 N\nP 2 0 1 20 -25 60 -25 -60 N\nP 3 0 1 0 -150 -90 -150 -120 50 -120 N\nP 2 1 1 0 -25 25 50 100 N\nP 3 1 1 0 -25 -25 50 -100 50 -100 N\nP 5 1 1 0 0 -70 20 -50 40 -90 0 -70 0 -70 F\nP 2 2 1 0 -25 25 50 100 N\nP 3 2 1 0 -25 -25 50 -100 50 -100 N\nP 5 2 1 0 40 -70 20 -90 0 -50 40 -70 40 -70 F\nX E1 1 50 -200 100 U 50 50 1 1 P\nX B1 2 -350 0 100 R 50 50 1 1 I\nX C1 6 50 200 100 D 50 50 1 1 P\nX C1 3 50 200 100 D 50 50 2 1 P\nX E1 4 50 -200 100 U 50 50 2 1 P\nX B1 5 -350 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# Q_DUAL_NPN_PNP_E1B1C2E2B2C1\n#\nDEF Q_DUAL_NPN_PNP_E1B1C2E2B2C1 Q 0 0 Y N 2 L N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_DUAL_NPN_PNP_E1B1C2E2B2C1\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SC?70*\n SC?88*\n SOT?363*\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 0 -100 0 N\nP 2 1 1 0 25 25 100 100 N\nP 3 1 1 0 25 -25 100 -100 100 -100 N\nP 3 1 1 20 25 75 25 -75 25 -75 N\nP 5 1 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nP 2 2 1 0 25 25 100 100 N\nP 3 2 1 0 25 -25 100 -100 100 -100 N\nP 3 2 1 20 25 75 25 -75 25 -75 N\nP 5 2 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX E1 1 100 -200 100 U 50 50 1 1 P\nX B1 2 -200 0 100 R 50 50 1 1 I\nX C1 6 100 200 100 D 50 50 1 1 P\nX C2 3 100 200 100 D 50 50 2 1 P\nX E2 4 100 -200 100 U 50 50 2 1 P\nX B2 5 -200 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# Q_DUAL_PMOS_G1S2G2D2S1D1\n#\nDEF Q_DUAL_PMOS_G1S2G2D2S1D1 Q 0 0 Y N 2 F N\nF0 \"Q\" 250 50 50 H V C CNN\nF1 \"Q_DUAL_PMOS_G1S2G2D2S1D1\" 750 -50 50 H V C CNN\nF2 \"\" 50 0 50 H I C CNN\nF3 \"\" 50 0 50 H I C CNN\n$FPLIST\n TSOP*\n SC?70*\n SC?88*\n SOT?363*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX S 5 100 -200 100 U 50 50 1 1 P\nX D 6 100 200 100 D 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 2 1 P\nX G 3 -200 0 100 R 50 50 2 1 I\nX D 4 100 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# Q_DUAL_PMOS_S1G1D2S2G2D1\n#\nDEF Q_DUAL_PMOS_S1G1D2S2G2D1 Q 0 0 Y N 2 F N\nF0 \"Q\" 250 50 50 H V C CNN\nF1 \"Q_DUAL_PMOS_S1G1D2S2G2D1\" 750 -50 50 H V C CNN\nF2 \"\" 50 0 50 H I C CNN\nF3 \"\" 50 0 50 H I C CNN\n$FPLIST\n TSOP*\n SC?70*\n SC?88*\n SOT?363*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX D 6 100 200 100 D 50 50 1 1 P\nX D 3 100 200 100 D 50 50 2 1 P\nX S 4 100 -200 100 U 50 50 2 1 P\nX G 5 -200 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# Q_DUAL_PMOS_S1G1S2G2D2D2D1D1\n#\nDEF Q_DUAL_PMOS_S1G1S2G2D2D2D1D1 Q 0 0 Y N 2 F N\nF0 \"Q\" 250 50 50 H V C CNN\nF1 \"Q_DUAL_PMOS_S1G1S2G2D2D2D1D1\" 850 -50 50 H V C CNN\nF2 \"\" 50 0 50 H I C CNN\nF3 \"\" 50 0 50 H I C CNN\n$FPLIST\n SO*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nC 100 100 10 0 1 0 F\nS 200 100 100 100 0 1 0 N\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX D 7 100 200 100 D 50 50 1 1 P\nX G 8 200 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 2 1 P\nX G 4 -200 0 100 R 50 50 2 1 I\nX D 5 100 200 100 D 50 50 2 1 P\nX G 6 200 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# Q_DUAL_PNP_C2C1E1E2\n#\nDEF Q_DUAL_PNP_C2C1E1E2 Q 0 0 Y Y 1 F N\nF0 \"Q\" 300 50 50 H V L CNN\nF1 \"Q_DUAL_PNP_C2C1E1E2\" 300 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CIN\nF3 \"\" -100 0 50 H I L CNN\n$FPLIST\n SOT?143*\n$ENDFPLIST\nDRAW\nC -200 -120 10 0 1 0 F\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -200 -100 -125 -25 N\nP 2 0 1 0 -200 100 -125 25 N\nP 2 0 1 0 -200 100 -125 25 N\nP 2 0 1 0 125 0 -125 0 N\nP 2 0 1 0 200 -100 125 -25 N\nP 2 0 1 0 200 100 125 25 N\nP 3 0 1 20 -125 -75 -125 75 -125 75 F\nP 3 0 1 0 0 0 0 -120 -200 -120 N\nP 3 0 1 20 125 -75 125 75 125 75 F\nP 5 0 1 0 -155 75 -175 55 -135 35 -155 75 -155 75 F\nP 5 0 1 0 155 75 175 55 135 35 155 75 155 75 F\nX C2 1 -200 -200 100 U 50 50 1 1 P\nX C1 2 200 -200 100 U 50 50 1 1 P\nX E1 3 200 200 100 D 50 50 1 1 P\nX E2 4 -200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_DUAL_PNP_NPN_BRT_E1B1C2E2B2C1\n#\nDEF Q_DUAL_PNP_NPN_BRT_E1B1C2E2B2C1 Q 0 20 Y N 2 F N\nF0 \"Q\" 150 50 50 H V L CNN\nF1 \"Q_DUAL_PNP_NPN_BRT_E1B1C2E2B2C1\" 150 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SC?70*\n SC?88*\n SOT*363*\n$ENDFPLIST\nDRAW\nC -150 0 10 0 1 0 F\nC 50 -120 10 0 1 0 F\nC 0 0 111 1 1 10 N\nC 0 0 111 2 1 10 N\nS -250 20 -190 -20 0 1 0 N\nS -170 -90 -130 -30 0 1 0 N\nP 2 0 1 0 -150 -30 -150 0 N\nP 2 0 1 0 -30 0 -190 0 N\nP 2 0 1 20 -25 60 -25 -60 N\nP 3 0 1 0 -150 -90 -150 -120 50 -120 N\nP 2 1 1 0 -25 25 50 100 N\nP 3 1 1 0 -25 -25 50 -100 50 -100 N\nP 5 1 1 0 40 -70 20 -90 0 -50 40 -70 40 -70 F\nP 2 2 1 0 -25 25 50 100 N\nP 3 2 1 0 -25 -25 50 -100 50 -100 N\nP 5 2 1 0 0 -70 20 -50 40 -90 0 -70 0 -70 F\nX E1 1 50 -200 100 U 50 50 1 1 P\nX B1 2 -350 0 100 R 50 50 1 1 I\nX C1 6 50 200 100 D 50 50 1 1 P\nX C1 3 50 200 100 D 50 50 2 1 P\nX E1 4 50 -200 100 U 50 50 2 1 P\nX B1 5 -350 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# Q_DUAL_PNP_PNP_BRT_E1B1C2E2B2C1\n#\nDEF Q_DUAL_PNP_PNP_BRT_E1B1C2E2B2C1 Q 0 20 Y N 2 F N\nF0 \"Q\" 150 50 50 H V L CNN\nF1 \"Q_DUAL_PNP_PNP_BRT_E1B1C2E2B2C1\" 150 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SC?70*\n SC?88*\n SOT*363*\n$ENDFPLIST\nDRAW\nC -150 0 10 0 1 0 F\nC 50 -120 10 0 1 0 F\nC 0 0 111 1 1 10 N\nC 0 0 111 2 1 10 N\nS -250 20 -190 -20 0 1 0 N\nS -170 -90 -130 -30 0 1 0 N\nP 2 0 1 0 -150 -30 -150 0 N\nP 2 0 1 0 -30 0 -190 0 N\nP 2 0 1 20 -25 60 -25 -60 N\nP 3 0 1 0 -150 -90 -150 -120 50 -120 N\nP 5 0 1 0 40 -70 20 -90 0 -50 40 -70 40 -70 F\nP 2 1 1 0 -25 25 50 100 N\nP 3 1 1 0 -25 -25 50 -100 50 -100 N\nP 2 2 1 0 -25 25 50 100 N\nP 3 2 1 0 -25 -25 50 -100 50 -100 N\nX E1 1 50 -200 100 U 50 50 1 1 P\nX B1 2 -350 0 100 R 50 50 1 1 I\nX C1 6 50 200 100 D 50 50 1 1 P\nX C2 3 50 200 100 D 50 50 2 1 P\nX E2 4 50 -200 100 U 50 50 2 1 P\nX B2 5 -350 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# Q_DUAL_PNP_PNP_C1B1B2C2E2E1\n#\nDEF Q_DUAL_PNP_PNP_C1B1B2C2E2E1 Q 0 0 Y N 2 L N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_DUAL_PNP_PNP_C1B1B2C2E2E1\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SC?70*\n SC?88*\n SOT?363*\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 0 -100 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX C1 1 100 200 100 D 50 50 1 1 P\nX B1 2 -200 0 100 R 50 50 1 1 I\nX E1 6 100 -200 100 U 50 50 1 1 P\nX B2 3 -200 0 100 R 50 50 2 1 I\nX C2 4 100 200 100 D 50 50 2 1 P\nX E2 5 100 -200 100 U 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# Q_DUAL_PNP_PNP_C2E2C1E1B1B2\n#\nDEF Q_DUAL_PNP_PNP_C2E2C1E1B1B2 Q 0 0 Y N 2 L N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_DUAL_PNP_PNP_C2E2C1E1B1B2\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SC?70*\n SC?88*\n SOT?363*\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 0 -100 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX C1 3 100 200 100 D 50 50 1 1 P\nX E1 4 100 -200 100 U 50 50 1 1 P\nX B1 5 -200 0 100 R 50 50 1 1 I\nX C2 1 100 200 100 D 50 50 2 1 P\nX E2 2 100 -200 100 U 50 50 2 1 P\nX B2 6 -200 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# Q_DUAL_PNP_PNP_E1B1C2E2B2C1\n#\nDEF Q_DUAL_PNP_PNP_E1B1C2E2B2C1 Q 0 0 Y N 2 L N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_DUAL_PNP_PNP_E1B1C2E2B2C1\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SC?70*\n SC?88*\n SOT?363*\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 0 -100 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX E1 1 100 -200 100 U 50 50 1 1 P\nX B1 2 -200 0 100 R 50 50 1 1 I\nX C1 6 100 200 100 D 50 50 1 1 P\nX C2 3 100 200 100 D 50 50 2 1 P\nX E2 4 100 -200 100 U 50 50 2 1 P\nX B2 5 -200 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# Q_NIGBT_CEG\n#\nDEF Q_NIGBT_CEG Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NIGBT_CEG\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 10 30 -40 30 -80 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 80 30 40 N\nP 2 0 1 0 100 -95 30 -60 N\nP 2 0 1 0 100 -35 30 0 N\nP 2 0 1 0 100 95 30 60 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 4 0 1 0 55 -85 65 -65 100 -95 55 -85 F\nP 4 0 1 0 85 75 75 95 40 65 85 75 F\nX C 1 100 200 100 D 50 50 1 1 P\nX E 2 100 -200 100 U 50 50 1 1 P\nX G 3 -200 0 210 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_NIGBT_CGE\n#\nDEF Q_NIGBT_CGE Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NIGBT_CGE\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 10 30 -40 30 -80 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 80 30 40 N\nP 2 0 1 0 100 -95 30 -60 N\nP 2 0 1 0 100 -35 30 0 N\nP 2 0 1 0 100 95 30 60 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 4 0 1 0 55 -85 65 -65 100 -95 55 -85 F\nP 4 0 1 0 85 75 75 95 40 65 85 75 F\nX C 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 210 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NIGBT_ECG\n#\nDEF Q_NIGBT_ECG Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NIGBT_ECG\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 10 30 -40 30 -80 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 80 30 40 N\nP 2 0 1 0 100 -95 30 -60 N\nP 2 0 1 0 100 -35 30 0 N\nP 2 0 1 0 100 95 30 60 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 4 0 1 0 55 -85 65 -65 100 -95 55 -85 F\nP 4 0 1 0 85 75 75 95 40 65 85 75 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX G 3 -200 0 210 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_NIGBT_ECGC\n#\nDEF Q_NIGBT_ECGC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NIGBT_ECGC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 10 30 -40 30 -80 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 80 30 40 N\nP 2 0 1 0 100 -95 30 -60 N\nP 2 0 1 0 100 -35 30 0 N\nP 2 0 1 0 100 95 30 60 N\nP 2 0 1 0 100 100 200 100 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 4 0 1 0 55 -85 65 -65 100 -95 55 -85 F\nP 4 0 1 0 85 75 75 95 40 65 85 75 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX G 3 -200 0 210 R 50 50 1 1 I\nX C 4 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NIGBT_EGC\n#\nDEF Q_NIGBT_EGC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NIGBT_EGC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 10 30 -40 30 -80 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 80 30 40 N\nP 2 0 1 0 100 -95 30 -60 N\nP 2 0 1 0 100 -35 30 0 N\nP 2 0 1 0 100 95 30 60 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 4 0 1 0 55 -85 65 -65 100 -95 55 -85 F\nP 4 0 1 0 85 75 75 95 40 65 85 75 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 210 R 50 50 1 1 I\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NIGBT_GCE\n#\nDEF Q_NIGBT_GCE Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NIGBT_GCE\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 10 30 -40 30 -80 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 80 30 40 N\nP 2 0 1 0 100 -95 30 -60 N\nP 2 0 1 0 100 -35 30 0 N\nP 2 0 1 0 100 95 30 60 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 4 0 1 0 55 -85 65 -65 100 -95 55 -85 F\nP 4 0 1 0 85 75 75 95 40 65 85 75 F\nX G 1 -200 0 210 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NIGBT_GCEC\n#\nDEF Q_NIGBT_GCEC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NIGBT_GCEC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 10 30 -40 30 -80 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 80 30 40 N\nP 2 0 1 0 100 -95 30 -60 N\nP 2 0 1 0 100 -35 30 0 N\nP 2 0 1 0 100 95 30 60 N\nP 2 0 1 0 100 100 200 100 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 4 0 1 0 55 -85 65 -65 100 -95 55 -85 F\nP 4 0 1 0 85 75 75 95 40 65 85 75 F\nX G 1 -200 0 210 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nX C 4 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NIGBT_GEC\n#\nDEF Q_NIGBT_GEC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NIGBT_GEC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 10 30 -40 30 -80 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 80 30 40 N\nP 2 0 1 0 100 -95 30 -60 N\nP 2 0 1 0 100 -35 30 0 N\nP 2 0 1 0 100 95 30 60 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 4 0 1 0 55 -85 65 -65 100 -95 55 -85 F\nP 4 0 1 0 85 75 75 95 40 65 85 75 F\nX G 1 -200 0 210 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NJFET_DGS\n#\nDEF Q_NJFET_DGS Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NJFET_DGS\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 3 0 1 0 100 -100 100 -50 10 -50 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 0 0 -40 15 -40 -15 0 0 F\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 210 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NJFET_DSG\n#\nDEF Q_NJFET_DSG Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NJFET_DSG\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 3 0 1 0 100 -100 100 -50 10 -50 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 0 0 -40 15 -40 -15 0 0 F\nX D 1 100 200 100 D 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P\nX G 3 -200 0 210 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_NJFET_GDS\n#\nDEF Q_NJFET_GDS Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NJFET_GDS\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 3 0 1 0 100 -100 100 -50 10 -50 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 0 0 -40 15 -40 -15 0 0 F\nX G 1 -200 0 210 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NJFET_GSD\n#\nDEF Q_NJFET_GSD Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NJFET_GSD\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 3 0 1 0 100 -100 100 -50 10 -50 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 0 0 -40 15 -40 -15 0 0 F\nX G 1 -200 0 210 R 50 50 1 1 I\nX S 2 100 -200 100 U 50 50 1 1 P\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NJFET_SDG\n#\nDEF Q_NJFET_SDG Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NJFET_SDG\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 3 0 1 0 100 -100 100 -50 10 -50 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 0 0 -40 15 -40 -15 0 0 F\nX S 1 100 -200 100 U 50 50 1 1 P\nX D 2 100 200 100 D 50 50 1 1 P\nX G 3 -200 0 210 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_NJFET_SGD\n#\nDEF Q_NJFET_SGD Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NJFET_SGD\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 3 0 1 0 100 -100 100 -50 10 -50 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 0 0 -40 15 -40 -15 0 0 F\nX S 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 210 R 50 50 1 1 I\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NMOS_DGS\n#\nDEF Q_NMOS_DGS Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NMOS_DGS\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NMOS_DSG\n#\nDEF Q_NMOS_DSG Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NMOS_DSG\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P\nX G 3 -200 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_NMOS_GDS\n#\nDEF Q_NMOS_GDS Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NMOS_GDS\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NMOS_GDSD\n#\nDEF Q_NMOS_GDSD Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NMOS_GDSD\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 3 0 1 0 200 100 100 100 100 70 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nX D 4 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NMOS_GSD\n#\nDEF Q_NMOS_GSD Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NMOS_GSD\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX S 2 100 -200 100 U 50 50 1 1 P\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NMOS_SDG\n#\nDEF Q_NMOS_SDG Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NMOS_SDG\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX D 2 100 200 100 D 50 50 1 1 P\nX G 3 -200 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_NMOS_SDGD\n#\nDEF Q_NMOS_SDGD Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NMOS_SDGD\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 3 0 1 0 200 100 100 100 100 70 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX D 2 100 200 100 D 50 50 1 1 P\nX G 3 -200 0 100 R 50 50 1 1 I\nX D 4 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NMOS_SGD\n#\nDEF Q_NMOS_SGD Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NMOS_SGD\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 200 R 50 50 1 1 I\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_BCE\n#\nDEF Q_NPN_BCE Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NPN_BCE\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_BCEC\n#\nDEF Q_NPN_BCEC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NPN_BCEC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 2 0 1 0 100 100 200 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nX C 4 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_BEC\n#\nDEF Q_NPN_BEC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NPN_BEC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_BEC_BRT\n#\nDEF Q_NPN_BEC_BRT Q 0 20 Y N 1 F N\nF0 \"Q\" 150 50 50 H V L CNN\nF1 \"Q_NPN_BEC_BRT\" 150 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC -150 0 10 0 1 0 F\nC 50 -120 10 0 1 0 F\nC 0 0 111 1 1 10 N\nS -250 20 -190 -20 0 1 0 N\nS -170 -90 -130 -30 0 1 0 N\nP 2 0 1 0 -150 -30 -150 0 N\nP 2 0 1 0 -30 0 -190 0 N\nP 2 0 1 20 -25 60 -25 -60 N\nP 3 0 1 0 -150 -90 -150 -120 50 -120 N\nP 2 1 1 0 -25 25 50 100 N\nP 3 1 1 0 -25 -25 50 -100 50 -100 N\nP 5 1 1 0 0 -70 20 -50 40 -90 0 -70 0 -70 F\nX B 1 -350 0 100 R 50 50 1 1 I\nX E 2 50 -200 100 U 50 50 1 1 P\nX C 3 50 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_CBE\n#\nDEF Q_NPN_CBE Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NPN_CBE\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_CEB\n#\nDEF Q_NPN_CEB Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NPN_CEB\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX E 2 100 -200 100 U 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_NPN_Darlington_BCE\n#\nDEF Q_NPN_Darlington_BCE Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"Q_NPN_Darlington_BCE\" 180 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_Darlington_BCEC\n#\nDEF Q_NPN_Darlington_BCEC Q 0 0 Y N 1 F N\nF0 \"Q\" 220 50 50 H V L CNN\nF1 \"Q_NPN_Darlington_BCEC\" 220 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 2 0 1 0 200 100 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nX C2 4 200 200 100 D 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_NPN_Darlington_BEC\n#\nDEF Q_NPN_Darlington_BEC Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"Q_NPN_Darlington_BEC\" 180 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_Darlington_CBE\n#\nDEF Q_NPN_Darlington_CBE Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"Q_NPN_Darlington_CBE\" 180 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_Darlington_CEB\n#\nDEF Q_NPN_Darlington_CEB Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"Q_NPN_Darlington_CEB\" 180 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX E 2 100 -200 100 U 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_NPN_Darlington_EBC\n#\nDEF Q_NPN_Darlington_EBC Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"Q_NPN_Darlington_EBC\" 180 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_Darlington_ECB\n#\nDEF Q_NPN_Darlington_ECB Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"Q_NPN_Darlington_ECB\" 180 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_Darlington_ECBC\n#\nDEF Q_NPN_Darlington_ECBC Q 0 0 Y N 1 F N\nF0 \"Q\" 220 50 50 H V L CNN\nF1 \"Q_NPN_Darlington_ECBC\" 220 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 2 0 1 0 200 100 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 P\nX C2 4 200 200 100 D 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_NPN_EBC\n#\nDEF Q_NPN_EBC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NPN_EBC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_ECB\n#\nDEF Q_NPN_ECB Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NPN_ECB\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_ECBC\n#\nDEF Q_NPN_ECBC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NPN_ECBC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 2 0 1 0 100 100 200 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 P\nX C 4 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_NPN_ECB_BRT\n#\nDEF Q_NPN_ECB_BRT Q 0 20 Y N 1 F N\nF0 \"Q\" 150 50 50 H V L CNN\nF1 \"Q_NPN_ECB_BRT\" 150 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC -150 0 10 0 1 0 F\nC 50 -120 10 0 1 0 F\nC 0 0 111 1 1 10 N\nS -250 20 -190 -20 0 1 0 N\nS -170 -90 -130 -30 0 1 0 N\nP 2 0 1 0 -150 -30 -150 0 N\nP 2 0 1 0 -30 0 -190 0 N\nP 2 0 1 20 -25 60 -25 -60 N\nP 3 0 1 0 -150 -90 -150 -120 50 -120 N\nP 2 1 1 0 -25 25 50 100 N\nP 3 1 1 0 -25 -25 50 -100 50 -100 N\nP 5 1 1 0 0 -70 20 -50 40 -90 0 -70 0 -70 F\nX E 1 50 -200 100 U 50 50 1 1 P\nX C 2 50 200 100 D 50 50 1 1 P\nX B 3 -350 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_NUJT_BEB\n#\nDEF Q_NUJT_BEB Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_NUJT_BEB\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 -40 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 0 -100 0 -40 0 20 60 N\nP 3 0 1 10 20 75 20 -75 20 -75 N\nP 3 0 1 0 100 -100 100 -50 20 -50 N\nP 3 0 1 0 100 100 100 55 20 55 N\nP 4 0 1 0 -35 5 -20 50 10 20 -35 5 F\nX B2 1 100 200 100 D 50 50 1 1 P\nX E 2 -200 0 100 R 50 50 1 1 I\nX B1 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PJFET_DGS\n#\nDEF Q_PJFET_DGS Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PJFET_DGS\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 3 0 1 0 100 -100 100 -50 10 -50 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 -45 0 -5 15 -5 -15 -45 0 F\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 210 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PJFET_DSG\n#\nDEF Q_PJFET_DSG Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PJFET_DSG\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 3 0 1 0 100 -100 100 -50 10 -50 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 -45 0 -5 15 -5 -15 -45 0 F\nX D 1 100 200 100 D 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P\nX G 3 -200 0 210 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_PJFET_GDS\n#\nDEF Q_PJFET_GDS Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PJFET_GDS\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 3 0 1 0 100 -100 100 -50 10 -50 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 -45 0 -5 15 -5 -15 -45 0 F\nX G 1 -200 0 210 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PJFET_GSD\n#\nDEF Q_PJFET_GSD Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PJFET_GSD\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 3 0 1 0 100 -100 100 -50 10 -50 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 -45 0 -5 15 -5 -15 -45 0 F\nX G 1 -200 0 210 R 50 50 1 1 I\nX S 2 100 -200 100 U 50 50 1 1 P\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PJFET_SDG\n#\nDEF Q_PJFET_SDG Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PJFET_SDG\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 3 0 1 0 100 -100 100 -50 10 -50 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 -45 0 -5 15 -5 -15 -45 0 F\nX S 1 100 -200 100 U 50 50 1 1 P\nX D 2 100 200 100 D 50 50 1 1 P\nX G 3 -200 0 210 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_PJFET_SGD\n#\nDEF Q_PJFET_SGD Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PJFET_SGD\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 3 0 1 0 100 -100 100 -50 10 -50 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 -45 0 -5 15 -5 -15 -45 0 F\nX S 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 210 R 50 50 1 1 I\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PMOS_DGS\n#\nDEF Q_PMOS_DGS Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PMOS_DGS\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PMOS_DSG\n#\nDEF Q_PMOS_DSG Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PMOS_DSG\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P\nX G 3 -200 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_PMOS_GDS\n#\nDEF Q_PMOS_GDS Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PMOS_GDS\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PMOS_GDSD\n#\nDEF Q_PMOS_GDSD Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PMOS_GDSD\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 3 0 1 0 200 100 100 100 100 70 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nX D 4 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PMOS_GSD\n#\nDEF Q_PMOS_GSD Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PMOS_GSD\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX S 2 100 -200 100 U 50 50 1 1 P\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PMOS_SDG\n#\nDEF Q_PMOS_SDG Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PMOS_SDG\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX D 2 100 200 100 D 50 50 1 1 P\nX G 3 -200 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_PMOS_SDGD\n#\nDEF Q_PMOS_SDGD Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PMOS_SDGD\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 3 0 1 0 200 100 100 100 100 70 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX D 2 100 200 100 D 50 50 1 1 P\nX G 3 -200 0 100 R 50 50 1 1 I\nX D 4 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PMOS_SGD\n#\nDEF Q_PMOS_SGD Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PMOS_SGD\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_BCE\n#\nDEF Q_PNP_BCE Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PNP_BCE\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_BCEC\n#\nDEF Q_PNP_BCEC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PNP_BCEC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 2 0 1 0 200 100 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nX C 4 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_BEC\n#\nDEF Q_PNP_BEC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PNP_BEC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_BEC_BRT\n#\nDEF Q_PNP_BEC_BRT Q 0 20 Y N 1 F N\nF0 \"Q\" 150 50 50 H V L CNN\nF1 \"Q_PNP_BEC_BRT\" 150 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC -150 0 10 0 1 0 F\nC 50 -120 10 0 1 0 F\nC 0 0 111 1 1 10 N\nS -250 20 -190 -20 0 1 0 N\nS -170 -90 -130 -30 0 1 0 N\nP 2 0 1 0 -150 -30 -150 0 N\nP 2 0 1 0 -30 0 -190 0 N\nP 2 0 1 20 -25 60 -25 -60 N\nP 3 0 1 0 -150 -90 -150 -120 50 -120 N\nP 5 0 1 0 40 -70 20 -90 0 -50 40 -70 40 -70 F\nP 2 1 1 0 -25 25 50 100 N\nP 3 1 1 0 -25 -25 50 -100 50 -100 N\nX B 1 -350 0 100 R 50 50 1 1 I\nX E 2 50 -200 100 U 50 50 1 1 P\nX C 3 50 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_CBE\n#\nDEF Q_PNP_CBE Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PNP_CBE\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_CEB\n#\nDEF Q_PNP_CEB Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PNP_CEB\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX E 2 100 -200 100 U 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_PNP_Darlington_BCE\n#\nDEF Q_PNP_Darlington_BCE Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"Q_PNP_Darlington_BCE\" 180 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_Darlington_BCEC\n#\nDEF Q_PNP_Darlington_BCEC Q 0 0 Y N 1 F N\nF0 \"Q\" 220 50 50 H V L CNN\nF1 \"Q_PNP_Darlington_BCEC\" 220 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 2 0 1 0 200 100 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nX C 4 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_Darlington_BEC\n#\nDEF Q_PNP_Darlington_BEC Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"Q_PNP_Darlington_BEC\" 180 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_Darlington_CBE\n#\nDEF Q_PNP_Darlington_CBE Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"Q_PNP_Darlington_CBE\" 180 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_Darlington_CEB\n#\nDEF Q_PNP_Darlington_CEB Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"Q_PNP_Darlington_CEB\" 180 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX E 2 100 -200 100 U 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_PNP_Darlington_EBC\n#\nDEF Q_PNP_Darlington_EBC Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"Q_PNP_Darlington_EBC\" 180 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 I\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_Darlington_ECB\n#\nDEF Q_PNP_Darlington_ECB Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"Q_PNP_Darlington_ECB\" 180 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_PNP_Darlington_ECBC\n#\nDEF Q_PNP_Darlington_ECBC Q 0 0 Y N 1 F N\nF0 \"Q\" 220 50 50 H V L CNN\nF1 \"Q_PNP_Darlington_ECBC\" 220 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 2 0 1 0 200 100 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 I\nX C 4 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_EBC\n#\nDEF Q_PNP_EBC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PNP_EBC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 I\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_ECB\n#\nDEF Q_PNP_ECB Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PNP_ECB\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_PNP_ECBC\n#\nDEF Q_PNP_ECBC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PNP_ECBC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 2 0 1 0 200 100 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 I\nX C 4 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_PNP_ECB_BRT\n#\nDEF Q_PNP_ECB_BRT Q 0 20 Y N 1 F N\nF0 \"Q\" 150 50 50 H V L CNN\nF1 \"Q_PNP_ECB_BRT\" 150 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC -150 0 10 0 1 0 F\nC 50 -120 10 0 1 0 F\nC 0 0 111 1 1 10 N\nS -250 20 -190 -20 0 1 0 N\nS -170 -90 -130 -30 0 1 0 N\nP 2 0 1 0 -150 -30 -150 0 N\nP 2 0 1 0 -30 0 -190 0 N\nP 2 0 1 20 -25 60 -25 -60 N\nP 3 0 1 0 -150 -90 -150 -120 50 -120 N\nP 5 0 1 0 40 -70 20 -90 0 -50 40 -70 40 -70 F\nP 2 1 1 0 -25 25 50 100 N\nP 3 1 1 0 -25 -25 50 -100 50 -100 N\nX E 1 50 -200 100 U 50 50 1 1 P\nX C 2 50 200 100 D 50 50 1 1 P\nX B 3 -350 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_PUJT_BEB\n#\nDEF Q_PUJT_BEB Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_PUJT_BEB\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 0 -100 0 -40 0 20 -60 N\nP 3 0 1 10 20 75 20 -75 20 -75 N\nP 3 0 1 0 100 -100 100 -50 20 -50 N\nP 3 0 1 0 100 100 100 55 20 55 N\nP 4 0 1 0 0 -40 -15 5 -45 -25 0 -40 F\nX B2 1 100 200 100 D 50 50 1 1 P\nX E 2 -200 0 100 R 50 50 1 1 I\nX B1 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_Photo_NPN\n#\nDEF Q_Photo_NPN Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_Photo_NPN\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS Q_Photo_NPN_CE\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 -75 50 -100 50 N\nP 2 0 1 0 -50 100 -75 100 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 -150 125 -75 50 -75 75 N\nP 3 0 1 0 -125 175 -50 100 -50 125 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX E 2 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_Photo_NPN_CBE\n#\nDEF Q_Photo_NPN_CBE Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_Photo_NPN_CBE\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 -75 50 -100 50 N\nP 2 0 1 0 -50 100 -75 100 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 -150 125 -75 50 -75 75 N\nP 3 0 1 0 -125 175 -50 100 -50 125 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 200 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_Photo_NPN_EBC\n#\nDEF Q_Photo_NPN_EBC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_Photo_NPN_EBC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 -75 50 -100 50 N\nP 2 0 1 0 -50 100 -75 100 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 -150 125 -75 50 -75 75 N\nP 3 0 1 0 -125 175 -50 100 -50 125 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 200 R 50 50 1 1 I\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_Photo_NPN_EC\n#\nDEF Q_Photo_NPN_EC Q 0 0 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Q_Photo_NPN_EC\" 200 -50 50 H V L CNN\nF2 \"\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 -75 50 -100 50 N\nP 2 0 1 0 -50 100 -75 100 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 -150 125 -75 50 -75 75 N\nP 3 0 1 0 -125 175 -50 100 -50 125 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_SCR_AGK\n#\nDEF Q_SCR_AGK D 0 0 Y N 1 F N\nF0 \"D\" 75 25 50 H V L CNN\nF1 \"Q_SCR_AGK\" 75 -50 50 H V L CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nDRAW\nP 2 0 1 0 -50 -100 -25 -50 N\nP 2 0 1 8 -50 -50 50 -50 N\nP 2 0 1 0 0 -100 0 100 N\nP 4 0 1 8 -50 50 50 50 0 -50 -50 50 N\nX A 1 0 150 100 D 50 50 1 1 P\nX G 2 -150 -100 100 R 50 50 1 1 I\nX K 3 0 -150 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_SCR_AKG\n#\nDEF Q_SCR_AKG D 0 0 Y N 1 F N\nF0 \"D\" 75 25 50 H V L CNN\nF1 \"Q_SCR_AKG\" 75 -50 50 H V L CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nDRAW\nP 2 0 1 0 -50 -100 -25 -50 N\nP 2 0 1 8 -50 -50 50 -50 N\nP 2 0 1 0 0 -100 0 100 N\nP 4 0 1 8 -50 50 50 50 0 -50 -50 50 N\nX A 1 0 150 100 D 50 50 1 1 P\nX K 2 0 -150 100 U 50 50 1 1 P\nX G 3 -150 -100 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_SCR_GAK\n#\nDEF Q_SCR_GAK D 0 0 Y N 1 F N\nF0 \"D\" 75 25 50 H V L CNN\nF1 \"Q_SCR_GAK\" 75 -50 50 H V L CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nDRAW\nP 2 0 1 0 -50 -100 -25 -50 N\nP 2 0 1 8 -50 -50 50 -50 N\nP 2 0 1 0 0 -100 0 100 N\nP 4 0 1 8 -50 50 50 50 0 -50 -50 50 N\nX G 1 -150 -100 100 R 50 50 1 1 I\nX A 2 0 150 100 D 50 50 1 1 P\nX K 3 0 -150 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_SCR_GKA\n#\nDEF Q_SCR_GKA D 0 0 Y N 1 F N\nF0 \"D\" 75 25 50 H V L CNN\nF1 \"Q_SCR_GKA\" 75 -50 50 H V L CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nDRAW\nP 2 0 1 0 -50 -100 -25 -50 N\nP 2 0 1 8 -50 -50 50 -50 N\nP 2 0 1 0 0 -100 0 100 N\nP 4 0 1 8 -50 50 50 50 0 -50 -50 50 N\nX G 1 -150 -100 100 R 50 50 1 1 I\nX K 2 0 -150 100 U 50 50 1 1 P\nX A 3 0 150 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_SCR_KAG\n#\nDEF Q_SCR_KAG D 0 0 Y N 1 F N\nF0 \"D\" 75 25 50 H V L CNN\nF1 \"Q_SCR_KAG\" 75 -50 50 H V L CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nDRAW\nP 2 0 1 0 -50 -100 -25 -50 N\nP 2 0 1 8 -50 -50 50 -50 N\nP 2 0 1 0 0 -100 0 100 N\nP 4 0 1 8 -50 50 50 50 0 -50 -50 50 N\nX K 1 0 -150 100 U 50 50 1 1 P\nX A 2 0 150 100 D 50 50 1 1 P\nX G 3 -150 -100 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_SCR_KGA\n#\nDEF Q_SCR_KGA D 0 0 Y N 1 F N\nF0 \"D\" 75 25 50 H V L CNN\nF1 \"Q_SCR_KGA\" 75 -50 50 H V L CNN\nF2 \"\" 0 0 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nDRAW\nP 2 0 1 0 -50 -100 -25 -50 N\nP 2 0 1 8 -50 -50 50 -50 N\nP 2 0 1 0 0 -100 0 100 N\nP 4 0 1 8 -50 50 50 50 0 -50 -50 50 N\nX K 1 0 -150 100 U 50 50 1 1 P\nX G 2 -150 -100 100 R 50 50 1 1 I\nX A 3 0 150 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_TRIAC_A1A2G\n#\nDEF Q_TRIAC_A1A2G D 0 0 Y Y 1 F N\nF0 \"D\" 125 25 50 H V L CNN\nF1 \"Q_TRIAC_A1A2G\" 125 -50 50 H V L CNN\nF2 \"\" 75 25 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nDRAW\nP 2 0 1 8 -100 -50 100 -50 N\nP 2 0 1 8 -100 50 100 50 N\nP 2 0 1 0 -50 -100 -25 -50 N\nP 3 0 1 8 -100 50 -50 -50 0 50 N\nP 3 0 1 8 0 -50 50 50 100 -50 N\nX A1 1 0 -150 100 U 50 25 1 1 P\nX A2 2 0 150 100 D 50 25 1 1 P\nX G 3 -150 -100 100 R 50 25 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_TRIAC_A1GA2\n#\nDEF Q_TRIAC_A1GA2 D 0 0 Y Y 1 F N\nF0 \"D\" 125 25 50 H V L CNN\nF1 \"Q_TRIAC_A1GA2\" 125 -50 50 H V L CNN\nF2 \"\" 75 25 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nDRAW\nP 2 0 1 8 -100 -50 100 -50 N\nP 2 0 1 8 -100 50 100 50 N\nP 2 0 1 0 -50 -100 -25 -50 N\nP 3 0 1 8 -100 50 -50 -50 0 50 N\nP 3 0 1 8 0 -50 50 50 100 -50 N\nX A1 1 0 -150 100 U 50 25 1 1 P\nX G 2 -150 -100 100 R 50 25 1 1 I\nX A2 3 0 150 100 D 50 25 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_TRIAC_A2A1G\n#\nDEF Q_TRIAC_A2A1G D 0 0 Y Y 1 F N\nF0 \"D\" 125 25 50 H V L CNN\nF1 \"Q_TRIAC_A2A1G\" 125 -50 50 H V L CNN\nF2 \"\" 75 25 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nDRAW\nP 2 0 1 8 -100 -50 100 -50 N\nP 2 0 1 8 -100 50 100 50 N\nP 2 0 1 0 -50 -100 -25 -50 N\nP 3 0 1 8 -100 50 -50 -50 0 50 N\nP 3 0 1 8 0 -50 50 50 100 -50 N\nX A2 1 0 150 100 D 50 25 1 1 P\nX A1 2 0 -150 100 U 50 25 1 1 P\nX G 3 -150 -100 100 R 50 25 1 1 I\nENDDRAW\nENDDEF\n#\n# Q_TRIAC_A2GA1\n#\nDEF Q_TRIAC_A2GA1 D 0 0 Y Y 1 F N\nF0 \"D\" 125 25 50 H V L CNN\nF1 \"Q_TRIAC_A2GA1\" 125 -50 50 H V L CNN\nF2 \"\" 75 25 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nDRAW\nP 2 0 1 8 -100 -50 100 -50 N\nP 2 0 1 8 -100 50 100 50 N\nP 2 0 1 0 -50 -100 -25 -50 N\nP 3 0 1 8 -100 50 -50 -50 0 50 N\nP 3 0 1 8 0 -50 50 50 100 -50 N\nX A2 1 0 150 100 D 50 25 1 1 P\nX G 2 -150 -100 100 R 50 25 1 1 I\nX A1 3 0 -150 100 U 50 25 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_TRIAC_GA1A2\n#\nDEF Q_TRIAC_GA1A2 D 0 0 Y Y 1 F N\nF0 \"D\" 125 25 50 H V L CNN\nF1 \"Q_TRIAC_GA1A2\" 125 -50 50 H V L CNN\nF2 \"\" 75 25 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nDRAW\nP 2 0 1 8 -100 -50 100 -50 N\nP 2 0 1 8 -100 50 100 50 N\nP 2 0 1 0 -50 -100 -25 -50 N\nP 3 0 1 8 -100 50 -50 -50 0 50 N\nP 3 0 1 8 0 -50 50 50 100 -50 N\nX G 1 -150 -100 100 R 50 25 1 1 I\nX A1 2 0 -150 100 U 50 25 1 1 P\nX A2 3 0 150 100 D 50 25 1 1 P\nENDDRAW\nENDDEF\n#\n# Q_TRIAC_GA2A1\n#\nDEF Q_TRIAC_GA2A1 D 0 0 Y Y 1 F N\nF0 \"D\" 125 25 50 H V L CNN\nF1 \"Q_TRIAC_GA2A1\" 125 -50 50 H V L CNN\nF2 \"\" 75 25 50 V I C CNN\nF3 \"\" 0 0 50 V I C CNN\nDRAW\nP 2 0 1 8 -100 -50 100 -50 N\nP 2 0 1 8 -100 50 100 50 N\nP 2 0 1 0 -50 -100 -25 -50 N\nP 3 0 1 8 -100 50 -50 -50 0 50 N\nP 3 0 1 8 0 -50 50 50 100 -50 N\nX G 1 -150 -100 100 R 50 25 1 1 I\nX A2 2 0 150 100 D 50 25 1 1 P\nX A1 3 0 -150 100 U 50 25 1 1 P\nENDDRAW\nENDDEF\n#\n# R\n#\nDEF R R 0 0 N Y 1 F N\nF0 \"R\" 80 0 50 V V C CNN\nF1 \"R\" 0 0 50 V V C CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R_*\n$ENDFPLIST\nDRAW\nS -40 -100 40 100 0 1 10 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# RF_Shield_One_Piece\n#\nDEF RF_Shield_One_Piece J 0 40 Y Y 1 F N\nF0 \"J\" 0 200 50 H V C CNN\nF1 \"RF_Shield_One_Piece\" 0 100 50 H V C CNN\nF2 \"\" 0 -100 50 H I C CNN\nF3 \"\" 0 -100 50 H I C CNN\nDRAW\nP 2 0 1 10 -600 -200 -600 -100 N\nP 2 0 1 10 -600 -50 -600 50 N\nP 2 0 1 10 -600 100 -600 200 N\nP 2 0 1 10 -500 300 -400 300 N\nP 2 0 1 10 -400 -300 -500 -300 N\nP 2 0 1 10 -250 -300 -350 -300 N\nP 2 0 1 10 -250 300 -350 300 N\nP 2 0 1 10 -100 -300 -200 -300 N\nP 2 0 1 10 -100 300 -200 300 N\nP 2 0 1 10 -50 -300 50 -300 N\nP 2 0 1 10 50 300 -50 300 N\nP 2 0 1 10 100 -300 200 -300 N\nP 2 0 1 10 200 300 100 300 N\nP 2 0 1 10 250 -300 350 -300 N\nP 2 0 1 10 350 300 250 300 N\nP 2 0 1 10 400 -300 500 -300 N\nP 2 0 1 10 500 300 400 300 N\nP 2 0 1 10 600 -200 600 -100 N\nP 2 0 1 10 600 -50 600 50 N\nP 2 0 1 10 600 100 600 200 N\nP 3 0 1 10 -600 250 -600 300 -550 300 N\nP 3 0 1 10 -550 -300 -600 -300 -600 -250 N\nP 3 0 1 10 550 -300 600 -300 600 -250 N\nP 3 0 1 10 600 250 600 300 550 300 N\nX Shield 1 0 -400 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# RF_Shield_Two_Pieces\n#\nDEF RF_Shield_Two_Pieces J 0 40 Y Y 1 F N\nF0 \"J\" 0 200 50 H V C CNN\nF1 \"RF_Shield_Two_Pieces\" 0 100 50 H V C CNN\nF2 \"\" 0 -100 50 H I C CNN\nF3 \"\" 0 -100 50 H I C CNN\nDRAW\nP 2 0 1 10 -600 -200 -600 -100 N\nP 2 0 1 10 -600 -50 -600 50 N\nP 2 0 1 10 -600 100 -600 200 N\nP 2 0 1 10 -500 300 -400 300 N\nP 2 0 1 10 -400 -300 -500 -300 N\nP 2 0 1 10 -250 -300 -350 -300 N\nP 2 0 1 10 -250 300 -350 300 N\nP 2 0 1 10 -100 -300 -200 -300 N\nP 2 0 1 10 -100 300 -200 300 N\nP 2 0 1 10 -50 -300 50 -300 N\nP 2 0 1 10 50 300 -50 300 N\nP 2 0 1 10 100 -300 200 -300 N\nP 2 0 1 10 200 300 100 300 N\nP 2 0 1 10 250 -300 350 -300 N\nP 2 0 1 10 350 300 250 300 N\nP 2 0 1 10 400 -300 500 -300 N\nP 2 0 1 10 500 300 400 300 N\nP 2 0 1 10 600 -200 600 -100 N\nP 2 0 1 10 600 -50 600 50 N\nP 2 0 1 10 600 100 600 200 N\nP 3 0 1 10 -600 250 -600 300 -550 300 N\nP 3 0 1 10 -550 -300 -600 -300 -600 -250 N\nP 3 0 1 10 550 -300 600 -300 600 -250 N\nP 3 0 1 10 600 250 600 300 550 300 N\nP 4 0 1 10 -700 200 -700 450 700 450 700 200 N\nX Shield 1 0 -400 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# RTRIM\n#\nDEF RTRIM R 0 0 N Y 1 F N\nF0 \"R\" 100 -100 50 V V L CNN\nF1 \"RTRIM\" -100 -25 50 V V L CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R_*\n$ENDFPLIST\nDRAW\nS -40 -100 40 100 0 1 10 N\nP 4 0 1 0 -75 -75 75 75 100 50 50 100 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network03\n#\nDEF R_Network03 RN 0 0 Y N 1 F N\nF0 \"RN\" -200 0 50 V V C CNN\nF1 \"R_Network03\" 200 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP4\" 275 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nS -130 60 -70 -100 0 1 10 N\nS -150 -125 150 125 0 1 10 f\nS -30 60 30 -100 0 1 10 N\nS 70 60 130 -100 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -150 N\nP 2 0 1 0 0 -100 0 -150 N\nP 2 0 1 0 100 -100 100 -150 N\nP 4 0 1 0 -100 60 -100 90 0 90 0 60 N\nP 4 0 1 0 0 60 0 90 100 90 100 60 N\nX R1 2 -100 -200 50 U 50 50 1 1 P\nX R2 3 0 -200 50 U 50 50 1 1 P\nX R3 4 100 -200 50 U 50 50 1 1 P\nX common 1 -100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network03_Split\n#\nDEF R_Network03_Split RN 0 0 Y N 3 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Network03_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP4\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nT 900 35 125 50 0 2 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 3 1 \"1\" Normal 0 C C\nS 40 100 -40 -100 0 1 10 N\nP 2 2 1 0 0 100 0 150 N\nP 2 3 1 0 0 100 0 150 N\nX R1.1 1 0 150 50 D 50 50 1 1 P\nX R1.2 2 0 -150 50 U 50 50 1 1 P\nX R2.2 3 0 -150 50 U 50 50 2 1 P\nX R3.2 4 0 -150 50 U 50 50 3 1 P\nENDDRAW\nENDDEF\n#\n# R_Network03_US\n#\nDEF R_Network03_US RN 0 0 Y N 1 F N\nF0 \"RN\" -200 0 50 V V C CNN\nF1 \"R_Network03_US\" 200 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP4\" 275 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nS -150 -125 150 125 0 1 10 f\nP 10 0 1 0 -100 90 -100 60 -70 46 -130 20 -70 -6 -130 -33 -70 -60 -130 -86 -100 -100 -100 -150 N\nP 10 0 1 0 0 90 0 60 30 46 -30 20 30 -6 -30 -33 30 -60 -30 -86 0 -100 0 -150 N\nP 10 0 1 0 100 90 100 60 130 46 70 20 130 -6 70 -33 130 -60 70 -86 100 -100 100 -150 N\nP 2 0 1 0 -100 90 100 90 N\nX R1 2 -100 -200 50 U 50 50 1 1 P\nX R2 3 0 -200 50 U 50 50 1 1 P\nX R3 4 100 -200 50 U 50 50 1 1 P\nX common 1 -100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network04\n#\nDEF R_Network04 RN 0 0 Y N 1 F N\nF0 \"RN\" -300 0 50 V V C CNN\nF1 \"R_Network04\" 200 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP5\" 275 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nS -130 60 -70 -100 0 1 10 N\nS -230 60 -170 -100 0 1 10 N\nS -250 -125 150 125 0 1 10 f\nS -30 60 30 -100 0 1 10 N\nS 70 60 130 -100 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -150 N\nP 2 0 1 0 -200 -100 -200 -150 N\nP 2 0 1 0 0 -100 0 -150 N\nP 2 0 1 0 100 -100 100 -150 N\nP 4 0 1 0 -100 60 -100 90 0 90 0 60 N\nP 4 0 1 0 -200 60 -200 90 -100 90 -100 60 N\nP 4 0 1 0 0 60 0 90 100 90 100 60 N\nX R1 2 -200 -200 50 U 50 50 1 1 P\nX R2 3 -100 -200 50 U 50 50 1 1 P\nX R3 4 0 -200 50 U 50 50 1 1 P\nX R4 5 100 -200 50 U 50 50 1 1 P\nX common 1 -200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network04_Split\n#\nDEF R_Network04_Split RN 0 0 Y N 4 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Network04_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP5\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nT 900 35 125 50 0 2 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 3 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 4 1 \"1\" Normal 0 C C\nS 40 100 -40 -100 0 1 10 N\nP 2 2 1 0 0 100 0 150 N\nP 2 3 1 0 0 100 0 150 N\nP 2 4 1 0 0 100 0 150 N\nX R1.1 1 0 150 50 D 50 50 1 1 P\nX R1.2 2 0 -150 50 U 50 50 1 1 P\nX R2.2 3 0 -150 50 U 50 50 2 1 P\nX R3.2 4 0 -150 50 U 50 50 3 1 P\nX R4.2 5 0 -150 50 U 50 50 4 1 P\nENDDRAW\nENDDEF\n#\n# R_Network04_US\n#\nDEF R_Network04_US RN 0 0 Y N 1 F N\nF0 \"RN\" -300 0 50 V V C CNN\nF1 \"R_Network04_US\" 200 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP5\" 275 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nS -250 -125 150 125 0 1 10 f\nP 10 0 1 0 -100 90 -100 60 -70 46 -130 20 -70 -6 -130 -33 -70 -60 -130 -86 -100 -100 -100 -150 N\nP 10 0 1 0 -200 90 -200 60 -170 46 -230 20 -170 -6 -230 -33 -170 -60 -230 -86 -200 -100 -200 -150 N\nP 10 0 1 0 0 90 0 60 30 46 -30 20 30 -6 -30 -33 30 -60 -30 -86 0 -100 0 -150 N\nP 10 0 1 0 100 90 100 60 130 46 70 20 130 -6 70 -33 130 -60 70 -86 100 -100 100 -150 N\nP 2 0 1 0 -200 90 100 90 N\nX R1 2 -200 -200 50 U 50 50 1 1 P\nX R2 3 -100 -200 50 U 50 50 1 1 P\nX R3 4 0 -200 50 U 50 50 1 1 P\nX R4 5 100 -200 50 U 50 50 1 1 P\nX common 1 -200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network05\n#\nDEF R_Network05 RN 0 0 Y N 1 F N\nF0 \"RN\" -300 0 50 V V C CNN\nF1 \"R_Network05\" 300 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP6\" 375 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nS -130 60 -70 -100 0 1 10 N\nS -230 60 -170 -100 0 1 10 N\nS -250 -125 250 125 0 1 10 f\nS -30 60 30 -100 0 1 10 N\nS 170 60 230 -100 0 1 10 N\nS 70 60 130 -100 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -150 N\nP 2 0 1 0 -200 -100 -200 -150 N\nP 2 0 1 0 0 -100 0 -150 N\nP 2 0 1 0 100 -100 100 -150 N\nP 2 0 1 0 200 -100 200 -150 N\nP 4 0 1 0 -100 60 -100 90 0 90 0 60 N\nP 4 0 1 0 -200 60 -200 90 -100 90 -100 60 N\nP 4 0 1 0 0 60 0 90 100 90 100 60 N\nP 4 0 1 0 100 60 100 90 200 90 200 60 N\nX R1 2 -200 -200 50 U 50 50 1 1 P\nX R2 3 -100 -200 50 U 50 50 1 1 P\nX R3 4 0 -200 50 U 50 50 1 1 P\nX R4 5 100 -200 50 U 50 50 1 1 P\nX R5 6 200 -200 50 U 50 50 1 1 P\nX common 1 -200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network05_Split\n#\nDEF R_Network05_Split RN 0 0 Y N 5 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Network05_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP6\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nT 900 35 125 50 0 2 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 3 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 4 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 5 1 \"1\" Normal 0 C C\nS 40 100 -40 -100 0 1 10 N\nP 2 2 1 0 0 100 0 150 N\nP 2 3 1 0 0 100 0 150 N\nP 2 4 1 0 0 100 0 150 N\nP 2 5 1 0 0 100 0 150 N\nX R1.1 1 0 150 50 D 50 50 1 1 P\nX R1.2 2 0 -150 50 U 50 50 1 1 P\nX R2.2 3 0 -150 50 U 50 50 2 1 P\nX R3.2 4 0 -150 50 U 50 50 3 1 P\nX R4.2 5 0 -150 50 U 50 50 4 1 P\nX R5.2 6 0 -150 50 U 50 50 5 1 P\nENDDRAW\nENDDEF\n#\n# R_Network05_US\n#\nDEF R_Network05_US RN 0 0 Y N 1 F N\nF0 \"RN\" -300 0 50 V V C CNN\nF1 \"R_Network05_US\" 300 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP6\" 375 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nS -250 -125 250 125 0 1 10 f\nP 10 0 1 0 -100 90 -100 60 -70 46 -130 20 -70 -6 -130 -33 -70 -60 -130 -86 -100 -100 -100 -150 N\nP 10 0 1 0 -200 90 -200 60 -170 46 -230 20 -170 -6 -230 -33 -170 -60 -230 -86 -200 -100 -200 -150 N\nP 10 0 1 0 0 90 0 60 30 46 -30 20 30 -6 -30 -33 30 -60 -30 -86 0 -100 0 -150 N\nP 10 0 1 0 100 90 100 60 130 46 70 20 130 -6 70 -33 130 -60 70 -86 100 -100 100 -150 N\nP 10 0 1 0 200 90 200 60 230 46 170 20 230 -6 170 -33 230 -60 170 -86 200 -100 200 -150 N\nP 2 0 1 0 -200 90 200 90 N\nX R1 2 -200 -200 50 U 50 50 1 1 P\nX R2 3 -100 -200 50 U 50 50 1 1 P\nX R3 4 0 -200 50 U 50 50 1 1 P\nX R4 5 100 -200 50 U 50 50 1 1 P\nX R5 6 200 -200 50 U 50 50 1 1 P\nX common 1 -200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network06\n#\nDEF R_Network06 RN 0 0 Y N 1 F N\nF0 \"RN\" -400 0 50 V V C CNN\nF1 \"R_Network06\" 300 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP7\" 375 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nS -130 60 -70 -100 0 1 10 N\nS -230 60 -170 -100 0 1 10 N\nS -30 60 30 -100 0 1 10 N\nS -330 60 -270 -100 0 1 10 N\nS -350 -125 250 125 0 1 10 f\nS 170 60 230 -100 0 1 10 N\nS 70 60 130 -100 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -150 N\nP 2 0 1 0 -200 -100 -200 -150 N\nP 2 0 1 0 -300 -100 -300 -150 N\nP 2 0 1 0 0 -100 0 -150 N\nP 2 0 1 0 100 -100 100 -150 N\nP 2 0 1 0 200 -100 200 -150 N\nP 4 0 1 0 -100 60 -100 90 0 90 0 60 N\nP 4 0 1 0 -200 60 -200 90 -100 90 -100 60 N\nP 4 0 1 0 -300 60 -300 90 -200 90 -200 60 N\nP 4 0 1 0 0 60 0 90 100 90 100 60 N\nP 4 0 1 0 100 60 100 90 200 90 200 60 N\nX R1 2 -300 -200 50 U 50 50 1 1 P\nX R2 3 -200 -200 50 U 50 50 1 1 P\nX R3 4 -100 -200 50 U 50 50 1 1 P\nX R4 5 0 -200 50 U 50 50 1 1 P\nX R5 6 100 -200 50 U 50 50 1 1 P\nX R6 7 200 -200 50 U 50 50 1 1 P\nX common 1 -300 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network06_Split\n#\nDEF R_Network06_Split RN 0 0 Y N 6 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Network06_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP7\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nT 900 35 125 50 0 2 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 3 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 4 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 5 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 6 1 \"1\" Normal 0 C C\nS 40 100 -40 -100 0 1 10 N\nP 2 2 1 0 0 100 0 150 N\nP 2 3 1 0 0 100 0 150 N\nP 2 4 1 0 0 100 0 150 N\nP 2 5 1 0 0 100 0 150 N\nP 2 6 1 0 0 100 0 150 N\nX R1.1 1 0 150 50 D 50 50 1 1 P\nX R1.2 2 0 -150 50 U 50 50 1 1 P\nX R2.2 3 0 -150 50 U 50 50 2 1 P\nX R3.2 4 0 -150 50 U 50 50 3 1 P\nX R4.2 5 0 -150 50 U 50 50 4 1 P\nX R5.2 6 0 -150 50 U 50 50 5 1 P\nX R6.2 7 0 -150 50 U 50 50 6 1 P\nENDDRAW\nENDDEF\n#\n# R_Network06_US\n#\nDEF R_Network06_US RN 0 0 Y N 1 F N\nF0 \"RN\" -400 0 50 V V C CNN\nF1 \"R_Network06_US\" 300 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP7\" 375 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nS -350 -125 250 125 0 1 10 f\nP 10 0 1 0 -100 90 -100 60 -70 46 -130 20 -70 -6 -130 -33 -70 -60 -130 -86 -100 -100 -100 -150 N\nP 10 0 1 0 -200 90 -200 60 -170 46 -230 20 -170 -6 -230 -33 -170 -60 -230 -86 -200 -100 -200 -150 N\nP 10 0 1 0 -300 90 -300 60 -270 46 -330 20 -270 -6 -330 -33 -270 -60 -330 -86 -300 -100 -300 -150 N\nP 10 0 1 0 0 90 0 60 30 46 -30 20 30 -6 -30 -33 30 -60 -30 -86 0 -100 0 -150 N\nP 10 0 1 0 100 90 100 60 130 46 70 20 130 -6 70 -33 130 -60 70 -86 100 -100 100 -150 N\nP 10 0 1 0 200 90 200 60 230 46 170 20 230 -6 170 -33 230 -60 170 -86 200 -100 200 -150 N\nP 2 0 1 0 -300 90 200 90 N\nX R1 2 -300 -200 50 U 50 50 1 1 P\nX R2 3 -200 -200 50 U 50 50 1 1 P\nX R3 4 -100 -200 50 U 50 50 1 1 P\nX R4 5 0 -200 50 U 50 50 1 1 P\nX R5 6 100 -200 50 U 50 50 1 1 P\nX R6 7 200 -200 50 U 50 50 1 1 P\nX common 1 -300 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network07\n#\nDEF R_Network07 RN 0 0 Y N 1 F N\nF0 \"RN\" -400 0 50 V V C CNN\nF1 \"R_Network07\" 400 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP8\" 475 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nS -130 60 -70 -100 0 1 10 N\nS -230 60 -170 -100 0 1 10 N\nS -30 60 30 -100 0 1 10 N\nS -330 60 -270 -100 0 1 10 N\nS -350 -125 350 125 0 1 10 f\nS 170 60 230 -100 0 1 10 N\nS 270 60 330 -100 0 1 10 N\nS 70 60 130 -100 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -150 N\nP 2 0 1 0 -200 -100 -200 -150 N\nP 2 0 1 0 -300 -100 -300 -150 N\nP 2 0 1 0 0 -100 0 -150 N\nP 2 0 1 0 100 -100 100 -150 N\nP 2 0 1 0 200 -100 200 -150 N\nP 2 0 1 0 300 -100 300 -150 N\nP 4 0 1 0 -100 60 -100 90 0 90 0 60 N\nP 4 0 1 0 -200 60 -200 90 -100 90 -100 60 N\nP 4 0 1 0 -300 60 -300 90 -200 90 -200 60 N\nP 4 0 1 0 0 60 0 90 100 90 100 60 N\nP 4 0 1 0 100 60 100 90 200 90 200 60 N\nP 4 0 1 0 200 60 200 90 300 90 300 60 N\nX R1 2 -300 -200 50 U 50 50 1 1 P\nX R2 3 -200 -200 50 U 50 50 1 1 P\nX R3 4 -100 -200 50 U 50 50 1 1 P\nX R4 5 0 -200 50 U 50 50 1 1 P\nX R5 6 100 -200 50 U 50 50 1 1 P\nX R6 7 200 -200 50 U 50 50 1 1 P\nX R7 8 300 -200 50 U 50 50 1 1 P\nX common 1 -300 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network07_Split\n#\nDEF R_Network07_Split RN 0 0 Y N 7 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Network07_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP8\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nT 900 35 125 50 0 2 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 3 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 4 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 5 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 6 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 7 1 \"1\" Normal 0 C C\nS 40 100 -40 -100 0 1 10 N\nP 2 2 1 0 0 100 0 150 N\nP 2 3 1 0 0 100 0 150 N\nP 2 4 1 0 0 100 0 150 N\nP 2 5 1 0 0 100 0 150 N\nP 2 6 1 0 0 100 0 150 N\nP 2 7 1 0 0 100 0 150 N\nX R1.1 1 0 150 50 D 50 50 1 1 P\nX R1.2 2 0 -150 50 U 50 50 1 1 P\nX R2.2 3 0 -150 50 U 50 50 2 1 P\nX R3.2 4 0 -150 50 U 50 50 3 1 P\nX R4.2 5 0 -150 50 U 50 50 4 1 P\nX R5.2 6 0 -150 50 U 50 50 5 1 P\nX R6.2 7 0 -150 50 U 50 50 6 1 P\nX R7.2 8 0 -150 50 U 50 50 7 1 P\nENDDRAW\nENDDEF\n#\n# R_Network07_US\n#\nDEF R_Network07_US RN 0 0 Y N 1 F N\nF0 \"RN\" -400 0 50 V V C CNN\nF1 \"R_Network07_US\" 400 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP8\" 475 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nS -350 -125 350 125 0 1 10 f\nP 10 0 1 0 -100 90 -100 60 -70 46 -130 20 -70 -6 -130 -33 -70 -60 -130 -86 -100 -100 -100 -150 N\nP 10 0 1 0 -200 90 -200 60 -170 46 -230 20 -170 -6 -230 -33 -170 -60 -230 -86 -200 -100 -200 -150 N\nP 10 0 1 0 -300 90 -300 60 -270 46 -330 20 -270 -6 -330 -33 -270 -60 -330 -86 -300 -100 -300 -150 N\nP 10 0 1 0 0 90 0 60 30 46 -30 20 30 -6 -30 -33 30 -60 -30 -86 0 -100 0 -150 N\nP 10 0 1 0 100 90 100 60 130 46 70 20 130 -6 70 -33 130 -60 70 -86 100 -100 100 -150 N\nP 10 0 1 0 200 90 200 60 230 46 170 20 230 -6 170 -33 230 -60 170 -86 200 -100 200 -150 N\nP 10 0 1 0 300 90 300 60 330 46 270 20 330 -6 270 -33 330 -60 270 -86 300 -100 300 -150 N\nP 2 0 1 0 -300 90 300 90 N\nX R1 2 -300 -200 50 U 50 50 1 1 P\nX R2 3 -200 -200 50 U 50 50 1 1 P\nX R3 4 -100 -200 50 U 50 50 1 1 P\nX R4 5 0 -200 50 U 50 50 1 1 P\nX R5 6 100 -200 50 U 50 50 1 1 P\nX R6 7 200 -200 50 U 50 50 1 1 P\nX R7 8 300 -200 50 U 50 50 1 1 P\nX common 1 -300 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network08\n#\nDEF R_Network08 RN 0 0 Y N 1 F N\nF0 \"RN\" -500 0 50 V V C CNN\nF1 \"R_Network08\" 400 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP9\" 475 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC -400 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nS -130 60 -70 -100 0 1 10 N\nS -230 60 -170 -100 0 1 10 N\nS -30 60 30 -100 0 1 10 N\nS -330 60 -270 -100 0 1 10 N\nS -430 60 -370 -100 0 1 10 N\nS -450 -125 350 125 0 1 10 f\nS 170 60 230 -100 0 1 10 N\nS 270 60 330 -100 0 1 10 N\nS 70 60 130 -100 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -150 N\nP 2 0 1 0 -200 -100 -200 -150 N\nP 2 0 1 0 -300 -100 -300 -150 N\nP 2 0 1 0 -400 -100 -400 -150 N\nP 2 0 1 0 0 -100 0 -150 N\nP 2 0 1 0 100 -100 100 -150 N\nP 2 0 1 0 200 -100 200 -150 N\nP 2 0 1 0 300 -100 300 -150 N\nP 4 0 1 0 -100 60 -100 90 0 90 0 60 N\nP 4 0 1 0 -200 60 -200 90 -100 90 -100 60 N\nP 4 0 1 0 -300 60 -300 90 -200 90 -200 60 N\nP 4 0 1 0 -400 60 -400 90 -300 90 -300 60 N\nP 4 0 1 0 0 60 0 90 100 90 100 60 N\nP 4 0 1 0 100 60 100 90 200 90 200 60 N\nP 4 0 1 0 200 60 200 90 300 90 300 60 N\nX R1 2 -400 -200 50 U 50 50 1 1 P\nX R2 3 -300 -200 50 U 50 50 1 1 P\nX R3 4 -200 -200 50 U 50 50 1 1 P\nX R4 5 -100 -200 50 U 50 50 1 1 P\nX R5 6 0 -200 50 U 50 50 1 1 P\nX R6 7 100 -200 50 U 50 50 1 1 P\nX R7 8 200 -200 50 U 50 50 1 1 P\nX R8 9 300 -200 50 U 50 50 1 1 P\nX common 1 -400 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network08_Split\n#\nDEF R_Network08_Split RN 0 0 Y N 8 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Network08_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP9\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nT 900 35 125 50 0 2 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 3 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 4 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 5 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 6 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 7 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 8 1 \"1\" Normal 0 C C\nS 40 100 -40 -100 0 1 10 N\nP 2 2 1 0 0 100 0 150 N\nP 2 3 1 0 0 100 0 150 N\nP 2 4 1 0 0 100 0 150 N\nP 2 5 1 0 0 100 0 150 N\nP 2 6 1 0 0 100 0 150 N\nP 2 7 1 0 0 100 0 150 N\nP 2 8 1 0 0 100 0 150 N\nX R1.1 1 0 150 50 D 50 50 1 1 P\nX R1.2 2 0 -150 50 U 50 50 1 1 P\nX R2.2 3 0 -150 50 U 50 50 2 1 P\nX R3.2 4 0 -150 50 U 50 50 3 1 P\nX R4.2 5 0 -150 50 U 50 50 4 1 P\nX R5.2 6 0 -150 50 U 50 50 5 1 P\nX R6.2 7 0 -150 50 U 50 50 6 1 P\nX R7.2 8 0 -150 50 U 50 50 7 1 P\nX R8.2 9 0 -150 50 U 50 50 8 1 P\nENDDRAW\nENDDEF\n#\n# R_Network08_US\n#\nDEF R_Network08_US RN 0 0 Y N 1 F N\nF0 \"RN\" -500 0 50 V V C CNN\nF1 \"R_Network08_US\" 400 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP9\" 475 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC -400 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nS -450 -125 350 125 0 1 10 f\nP 10 0 1 0 -100 90 -100 60 -70 46 -130 20 -70 -6 -130 -33 -70 -60 -130 -86 -100 -100 -100 -150 N\nP 10 0 1 0 -200 90 -200 60 -170 46 -230 20 -170 -6 -230 -33 -170 -60 -230 -86 -200 -100 -200 -150 N\nP 10 0 1 0 -300 90 -300 60 -270 46 -330 20 -270 -6 -330 -33 -270 -60 -330 -86 -300 -100 -300 -150 N\nP 10 0 1 0 -400 90 -400 60 -370 46 -430 20 -370 -6 -430 -33 -370 -60 -430 -86 -400 -100 -400 -150 N\nP 10 0 1 0 0 90 0 60 30 46 -30 20 30 -6 -30 -33 30 -60 -30 -86 0 -100 0 -150 N\nP 10 0 1 0 100 90 100 60 130 46 70 20 130 -6 70 -33 130 -60 70 -86 100 -100 100 -150 N\nP 10 0 1 0 200 90 200 60 230 46 170 20 230 -6 170 -33 230 -60 170 -86 200 -100 200 -150 N\nP 10 0 1 0 300 90 300 60 330 46 270 20 330 -6 270 -33 330 -60 270 -86 300 -100 300 -150 N\nP 2 0 1 0 -400 90 300 90 N\nX R1 2 -400 -200 50 U 50 50 1 1 P\nX R2 3 -300 -200 50 U 50 50 1 1 P\nX R3 4 -200 -200 50 U 50 50 1 1 P\nX R4 5 -100 -200 50 U 50 50 1 1 P\nX R5 6 0 -200 50 U 50 50 1 1 P\nX R6 7 100 -200 50 U 50 50 1 1 P\nX R7 8 200 -200 50 U 50 50 1 1 P\nX R8 9 300 -200 50 U 50 50 1 1 P\nX common 1 -400 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network09\n#\nDEF R_Network09 RN 0 0 Y N 1 F N\nF0 \"RN\" -500 0 50 V V C CNN\nF1 \"R_Network09\" 500 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP10\" 575 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC -400 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nC 300 90 10 0 1 0 F\nS -130 60 -70 -100 0 1 10 N\nS -230 60 -170 -100 0 1 10 N\nS -30 60 30 -100 0 1 10 N\nS -330 60 -270 -100 0 1 10 N\nS -430 60 -370 -100 0 1 10 N\nS -450 -125 450 125 0 1 10 f\nS 170 60 230 -100 0 1 10 N\nS 270 60 330 -100 0 1 10 N\nS 370 60 430 -100 0 1 10 N\nS 70 60 130 -100 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -150 N\nP 2 0 1 0 -200 -100 -200 -150 N\nP 2 0 1 0 -300 -100 -300 -150 N\nP 2 0 1 0 -400 -100 -400 -150 N\nP 2 0 1 0 0 -100 0 -150 N\nP 2 0 1 0 100 -100 100 -150 N\nP 2 0 1 0 200 -100 200 -150 N\nP 2 0 1 0 300 -100 300 -150 N\nP 2 0 1 0 400 -100 400 -150 N\nP 4 0 1 0 -100 60 -100 90 0 90 0 60 N\nP 4 0 1 0 -200 60 -200 90 -100 90 -100 60 N\nP 4 0 1 0 -300 60 -300 90 -200 90 -200 60 N\nP 4 0 1 0 -400 60 -400 90 -300 90 -300 60 N\nP 4 0 1 0 0 60 0 90 100 90 100 60 N\nP 4 0 1 0 100 60 100 90 200 90 200 60 N\nP 4 0 1 0 200 60 200 90 300 90 300 60 N\nP 4 0 1 0 300 60 300 90 400 90 400 60 N\nX R1 2 -400 -200 50 U 50 50 1 1 P\nX R2 3 -300 -200 50 U 50 50 1 1 P\nX R3 4 -200 -200 50 U 50 50 1 1 P\nX R4 5 -100 -200 50 U 50 50 1 1 P\nX R5 6 0 -200 50 U 50 50 1 1 P\nX R6 7 100 -200 50 U 50 50 1 1 P\nX R7 8 200 -200 50 U 50 50 1 1 P\nX R8 9 300 -200 50 U 50 50 1 1 P\nX R9 10 400 -200 50 U 50 50 1 1 P\nX common 1 -400 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network09_Split\n#\nDEF R_Network09_Split RN 0 0 Y N 9 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Network09_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP10\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nT 900 35 125 50 0 2 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 3 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 4 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 5 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 6 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 7 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 8 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 9 1 \"1\" Normal 0 C C\nS 40 100 -40 -100 0 1 10 N\nP 2 2 1 0 0 100 0 150 N\nP 2 3 1 0 0 100 0 150 N\nP 2 4 1 0 0 100 0 150 N\nP 2 5 1 0 0 100 0 150 N\nP 2 6 1 0 0 100 0 150 N\nP 2 7 1 0 0 100 0 150 N\nP 2 8 1 0 0 100 0 150 N\nP 2 9 1 0 0 100 0 150 N\nX R1.1 1 0 150 50 D 50 50 1 1 P\nX R1.2 2 0 -150 50 U 50 50 1 1 P\nX R2.2 3 0 -150 50 U 50 50 2 1 P\nX R3.2 4 0 -150 50 U 50 50 3 1 P\nX R4.2 5 0 -150 50 U 50 50 4 1 P\nX R5.2 6 0 -150 50 U 50 50 5 1 P\nX R6.2 7 0 -150 50 U 50 50 6 1 P\nX R7.2 8 0 -150 50 U 50 50 7 1 P\nX R8.2 9 0 -150 50 U 50 50 8 1 P\nX R9.2 10 0 -150 50 U 50 50 9 1 P\nENDDRAW\nENDDEF\n#\n# R_Network09_US\n#\nDEF R_Network09_US RN 0 0 Y N 1 F N\nF0 \"RN\" -500 0 50 V V C CNN\nF1 \"R_Network09_US\" 500 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP10\" 575 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC -400 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nC 300 90 10 0 1 0 F\nS -450 -125 450 125 0 1 10 f\nP 10 0 1 0 -100 90 -100 60 -70 46 -130 20 -70 -6 -130 -33 -70 -60 -130 -86 -100 -100 -100 -150 N\nP 10 0 1 0 -200 90 -200 60 -170 46 -230 20 -170 -6 -230 -33 -170 -60 -230 -86 -200 -100 -200 -150 N\nP 10 0 1 0 -300 90 -300 60 -270 46 -330 20 -270 -6 -330 -33 -270 -60 -330 -86 -300 -100 -300 -150 N\nP 10 0 1 0 -400 90 -400 60 -370 46 -430 20 -370 -6 -430 -33 -370 -60 -430 -86 -400 -100 -400 -150 N\nP 10 0 1 0 0 90 0 60 30 46 -30 20 30 -6 -30 -33 30 -60 -30 -86 0 -100 0 -150 N\nP 10 0 1 0 100 90 100 60 130 46 70 20 130 -6 70 -33 130 -60 70 -86 100 -100 100 -150 N\nP 10 0 1 0 200 90 200 60 230 46 170 20 230 -6 170 -33 230 -60 170 -86 200 -100 200 -150 N\nP 10 0 1 0 300 90 300 60 330 46 270 20 330 -6 270 -33 330 -60 270 -86 300 -100 300 -150 N\nP 10 0 1 0 400 90 400 60 430 46 370 20 430 -6 370 -33 430 -60 370 -86 400 -100 400 -150 N\nP 2 0 1 0 -400 90 400 90 N\nX R1 2 -400 -200 50 U 50 50 1 1 P\nX R2 3 -300 -200 50 U 50 50 1 1 P\nX R3 4 -200 -200 50 U 50 50 1 1 P\nX R4 5 -100 -200 50 U 50 50 1 1 P\nX R5 6 0 -200 50 U 50 50 1 1 P\nX R6 7 100 -200 50 U 50 50 1 1 P\nX R7 8 200 -200 50 U 50 50 1 1 P\nX R8 9 300 -200 50 U 50 50 1 1 P\nX R9 10 400 -200 50 U 50 50 1 1 P\nX common 1 -400 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network10\n#\nDEF R_Network10 RN 0 0 Y N 1 F N\nF0 \"RN\" -600 0 50 V V C CNN\nF1 \"R_Network10\" 500 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP11\" 575 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC -400 90 10 0 1 0 F\nC -500 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nC 300 90 10 0 1 0 F\nS -130 60 -70 -100 0 1 10 N\nS -230 60 -170 -100 0 1 10 N\nS -30 60 30 -100 0 1 10 N\nS -330 60 -270 -100 0 1 10 N\nS -430 60 -370 -100 0 1 10 N\nS -530 60 -470 -100 0 1 10 N\nS -550 -125 450 125 0 1 10 f\nS 170 60 230 -100 0 1 10 N\nS 270 60 330 -100 0 1 10 N\nS 370 60 430 -100 0 1 10 N\nS 70 60 130 -100 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -150 N\nP 2 0 1 0 -200 -100 -200 -150 N\nP 2 0 1 0 -300 -100 -300 -150 N\nP 2 0 1 0 -400 -100 -400 -150 N\nP 2 0 1 0 -500 -100 -500 -150 N\nP 2 0 1 0 0 -100 0 -150 N\nP 2 0 1 0 100 -100 100 -150 N\nP 2 0 1 0 200 -100 200 -150 N\nP 2 0 1 0 300 -100 300 -150 N\nP 2 0 1 0 400 -100 400 -150 N\nP 4 0 1 0 -100 60 -100 90 0 90 0 60 N\nP 4 0 1 0 -200 60 -200 90 -100 90 -100 60 N\nP 4 0 1 0 -300 60 -300 90 -200 90 -200 60 N\nP 4 0 1 0 -400 60 -400 90 -300 90 -300 60 N\nP 4 0 1 0 -500 60 -500 90 -400 90 -400 60 N\nP 4 0 1 0 0 60 0 90 100 90 100 60 N\nP 4 0 1 0 100 60 100 90 200 90 200 60 N\nP 4 0 1 0 200 60 200 90 300 90 300 60 N\nP 4 0 1 0 300 60 300 90 400 90 400 60 N\nX R1 2 -500 -200 50 U 50 50 1 1 P\nX R10 11 400 -200 50 U 50 50 1 1 P\nX R2 3 -400 -200 50 U 50 50 1 1 P\nX R3 4 -300 -200 50 U 50 50 1 1 P\nX R4 5 -200 -200 50 U 50 50 1 1 P\nX R5 6 -100 -200 50 U 50 50 1 1 P\nX R6 7 0 -200 50 U 50 50 1 1 P\nX R7 8 100 -200 50 U 50 50 1 1 P\nX R8 9 200 -200 50 U 50 50 1 1 P\nX R9 10 300 -200 50 U 50 50 1 1 P\nX common 1 -500 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network10_Split\n#\nDEF R_Network10_Split RN 0 0 Y N 10 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Network10_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP11\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nT 900 35 125 50 0 10 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 2 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 3 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 4 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 5 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 6 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 7 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 8 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 9 1 \"1\" Normal 0 C C\nS 40 100 -40 -100 0 1 10 N\nP 2 10 1 0 0 100 0 150 N\nP 2 2 1 0 0 100 0 150 N\nP 2 3 1 0 0 100 0 150 N\nP 2 4 1 0 0 100 0 150 N\nP 2 5 1 0 0 100 0 150 N\nP 2 6 1 0 0 100 0 150 N\nP 2 7 1 0 0 100 0 150 N\nP 2 8 1 0 0 100 0 150 N\nP 2 9 1 0 0 100 0 150 N\nX R1.1 1 0 150 50 D 50 50 1 1 P\nX R1.2 2 0 -150 50 U 50 50 1 1 P\nX R10.2 11 0 -150 50 U 50 50 10 1 P\nX R2.2 3 0 -150 50 U 50 50 2 1 P\nX R3.2 4 0 -150 50 U 50 50 3 1 P\nX R4.2 5 0 -150 50 U 50 50 4 1 P\nX R5.2 6 0 -150 50 U 50 50 5 1 P\nX R6.2 7 0 -150 50 U 50 50 6 1 P\nX R7.2 8 0 -150 50 U 50 50 7 1 P\nX R8.2 9 0 -150 50 U 50 50 8 1 P\nX R9.2 10 0 -150 50 U 50 50 9 1 P\nENDDRAW\nENDDEF\n#\n# R_Network10_US\n#\nDEF R_Network10_US RN 0 0 Y N 1 F N\nF0 \"RN\" -600 0 50 V V C CNN\nF1 \"R_Network10_US\" 500 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP11\" 575 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC -400 90 10 0 1 0 F\nC -500 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nC 300 90 10 0 1 0 F\nS -550 -125 450 125 0 1 10 f\nP 10 0 1 0 -100 90 -100 60 -70 46 -130 20 -70 -6 -130 -33 -70 -60 -130 -86 -100 -100 -100 -150 N\nP 10 0 1 0 -200 90 -200 60 -170 46 -230 20 -170 -6 -230 -33 -170 -60 -230 -86 -200 -100 -200 -150 N\nP 10 0 1 0 -300 90 -300 60 -270 46 -330 20 -270 -6 -330 -33 -270 -60 -330 -86 -300 -100 -300 -150 N\nP 10 0 1 0 -400 90 -400 60 -370 46 -430 20 -370 -6 -430 -33 -370 -60 -430 -86 -400 -100 -400 -150 N\nP 10 0 1 0 -500 90 -500 60 -470 46 -530 20 -470 -6 -530 -33 -470 -60 -530 -86 -500 -100 -500 -150 N\nP 10 0 1 0 0 90 0 60 30 46 -30 20 30 -6 -30 -33 30 -60 -30 -86 0 -100 0 -150 N\nP 10 0 1 0 100 90 100 60 130 46 70 20 130 -6 70 -33 130 -60 70 -86 100 -100 100 -150 N\nP 10 0 1 0 200 90 200 60 230 46 170 20 230 -6 170 -33 230 -60 170 -86 200 -100 200 -150 N\nP 10 0 1 0 300 90 300 60 330 46 270 20 330 -6 270 -33 330 -60 270 -86 300 -100 300 -150 N\nP 10 0 1 0 400 90 400 60 430 46 370 20 430 -6 370 -33 430 -60 370 -86 400 -100 400 -150 N\nP 2 0 1 0 -500 90 400 90 N\nX R1 2 -500 -200 50 U 50 50 1 1 P\nX R10 11 400 -200 50 U 50 50 1 1 P\nX R2 3 -400 -200 50 U 50 50 1 1 P\nX R3 4 -300 -200 50 U 50 50 1 1 P\nX R4 5 -200 -200 50 U 50 50 1 1 P\nX R5 6 -100 -200 50 U 50 50 1 1 P\nX R6 7 0 -200 50 U 50 50 1 1 P\nX R7 8 100 -200 50 U 50 50 1 1 P\nX R8 9 200 -200 50 U 50 50 1 1 P\nX R9 10 300 -200 50 U 50 50 1 1 P\nX common 1 -500 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network11\n#\nDEF R_Network11 RN 0 0 Y N 1 F N\nF0 \"RN\" -600 0 50 V V C CNN\nF1 \"R_Network11\" 600 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP12\" 675 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC -400 90 10 0 1 0 F\nC -500 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nC 300 90 10 0 1 0 F\nC 400 90 10 0 1 0 F\nS -130 60 -70 -100 0 1 10 N\nS -230 60 -170 -100 0 1 10 N\nS -30 60 30 -100 0 1 10 N\nS -330 60 -270 -100 0 1 10 N\nS -430 60 -370 -100 0 1 10 N\nS -530 60 -470 -100 0 1 10 N\nS -550 -125 550 125 0 1 10 f\nS 170 60 230 -100 0 1 10 N\nS 270 60 330 -100 0 1 10 N\nS 370 60 430 -100 0 1 10 N\nS 470 60 530 -100 0 1 10 N\nS 70 60 130 -100 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -150 N\nP 2 0 1 0 -200 -100 -200 -150 N\nP 2 0 1 0 -300 -100 -300 -150 N\nP 2 0 1 0 -400 -100 -400 -150 N\nP 2 0 1 0 -500 -100 -500 -150 N\nP 2 0 1 0 0 -100 0 -150 N\nP 2 0 1 0 100 -100 100 -150 N\nP 2 0 1 0 200 -100 200 -150 N\nP 2 0 1 0 300 -100 300 -150 N\nP 2 0 1 0 400 -100 400 -150 N\nP 2 0 1 0 500 -100 500 -150 N\nP 4 0 1 0 -100 60 -100 90 0 90 0 60 N\nP 4 0 1 0 -200 60 -200 90 -100 90 -100 60 N\nP 4 0 1 0 -300 60 -300 90 -200 90 -200 60 N\nP 4 0 1 0 -400 60 -400 90 -300 90 -300 60 N\nP 4 0 1 0 -500 60 -500 90 -400 90 -400 60 N\nP 4 0 1 0 0 60 0 90 100 90 100 60 N\nP 4 0 1 0 100 60 100 90 200 90 200 60 N\nP 4 0 1 0 200 60 200 90 300 90 300 60 N\nP 4 0 1 0 300 60 300 90 400 90 400 60 N\nP 4 0 1 0 400 60 400 90 500 90 500 60 N\nX R1 2 -500 -200 50 U 50 50 1 1 P\nX R10 11 400 -200 50 U 50 50 1 1 P\nX R11 12 500 -200 50 U 50 50 1 1 P\nX R2 3 -400 -200 50 U 50 50 1 1 P\nX R3 4 -300 -200 50 U 50 50 1 1 P\nX R4 5 -200 -200 50 U 50 50 1 1 P\nX R5 6 -100 -200 50 U 50 50 1 1 P\nX R6 7 0 -200 50 U 50 50 1 1 P\nX R7 8 100 -200 50 U 50 50 1 1 P\nX R8 9 200 -200 50 U 50 50 1 1 P\nX R9 10 300 -200 50 U 50 50 1 1 P\nX common 1 -500 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network11_Split\n#\nDEF R_Network11_Split RN 0 0 Y N 11 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Network11_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP12\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nT 900 35 125 50 0 10 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 11 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 2 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 3 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 4 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 5 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 6 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 7 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 8 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 9 1 \"1\" Normal 0 C C\nS 40 100 -40 -100 0 1 10 N\nP 2 10 1 0 0 100 0 150 N\nP 2 11 1 0 0 100 0 150 N\nP 2 2 1 0 0 100 0 150 N\nP 2 3 1 0 0 100 0 150 N\nP 2 4 1 0 0 100 0 150 N\nP 2 5 1 0 0 100 0 150 N\nP 2 6 1 0 0 100 0 150 N\nP 2 7 1 0 0 100 0 150 N\nP 2 8 1 0 0 100 0 150 N\nP 2 9 1 0 0 100 0 150 N\nX R1.1 1 0 150 50 D 50 50 1 1 P\nX R1.2 2 0 -150 50 U 50 50 1 1 P\nX R10.2 11 0 -150 50 U 50 50 10 1 P\nX R11.2 12 0 -150 50 U 50 50 11 1 P\nX R2.2 3 0 -150 50 U 50 50 2 1 P\nX R3.2 4 0 -150 50 U 50 50 3 1 P\nX R4.2 5 0 -150 50 U 50 50 4 1 P\nX R5.2 6 0 -150 50 U 50 50 5 1 P\nX R6.2 7 0 -150 50 U 50 50 6 1 P\nX R7.2 8 0 -150 50 U 50 50 7 1 P\nX R8.2 9 0 -150 50 U 50 50 8 1 P\nX R9.2 10 0 -150 50 U 50 50 9 1 P\nENDDRAW\nENDDEF\n#\n# R_Network11_US\n#\nDEF R_Network11_US RN 0 0 Y N 1 F N\nF0 \"RN\" -600 0 50 V V C CNN\nF1 \"R_Network11_US\" 600 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP12\" 675 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC -400 90 10 0 1 0 F\nC -500 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nC 300 90 10 0 1 0 F\nC 400 90 10 0 1 0 F\nS -550 -125 550 125 0 1 10 f\nP 10 0 1 0 -100 90 -100 60 -70 46 -130 20 -70 -6 -130 -33 -70 -60 -130 -86 -100 -100 -100 -150 N\nP 10 0 1 0 -200 90 -200 60 -170 46 -230 20 -170 -6 -230 -33 -170 -60 -230 -86 -200 -100 -200 -150 N\nP 10 0 1 0 -300 90 -300 60 -270 46 -330 20 -270 -6 -330 -33 -270 -60 -330 -86 -300 -100 -300 -150 N\nP 10 0 1 0 -400 90 -400 60 -370 46 -430 20 -370 -6 -430 -33 -370 -60 -430 -86 -400 -100 -400 -150 N\nP 10 0 1 0 -500 90 -500 60 -470 46 -530 20 -470 -6 -530 -33 -470 -60 -530 -86 -500 -100 -500 -150 N\nP 10 0 1 0 0 90 0 60 30 46 -30 20 30 -6 -30 -33 30 -60 -30 -86 0 -100 0 -150 N\nP 10 0 1 0 100 90 100 60 130 46 70 20 130 -6 70 -33 130 -60 70 -86 100 -100 100 -150 N\nP 10 0 1 0 200 90 200 60 230 46 170 20 230 -6 170 -33 230 -60 170 -86 200 -100 200 -150 N\nP 10 0 1 0 300 90 300 60 330 46 270 20 330 -6 270 -33 330 -60 270 -86 300 -100 300 -150 N\nP 10 0 1 0 400 90 400 60 430 46 370 20 430 -6 370 -33 430 -60 370 -86 400 -100 400 -150 N\nP 10 0 1 0 500 90 500 60 530 46 470 20 530 -6 470 -33 530 -60 470 -86 500 -100 500 -150 N\nP 2 0 1 0 -500 90 500 90 N\nX R1 2 -500 -200 50 U 50 50 1 1 P\nX R10 11 400 -200 50 U 50 50 1 1 P\nX R11 12 500 -200 50 U 50 50 1 1 P\nX R2 3 -400 -200 50 U 50 50 1 1 P\nX R3 4 -300 -200 50 U 50 50 1 1 P\nX R4 5 -200 -200 50 U 50 50 1 1 P\nX R5 6 -100 -200 50 U 50 50 1 1 P\nX R6 7 0 -200 50 U 50 50 1 1 P\nX R7 8 100 -200 50 U 50 50 1 1 P\nX R8 9 200 -200 50 U 50 50 1 1 P\nX R9 10 300 -200 50 U 50 50 1 1 P\nX common 1 -500 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network12\n#\nDEF R_Network12 RN 0 0 Y N 1 F N\nF0 \"RN\" -700 0 50 V V C CNN\nF1 \"R_Network12\" 600 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP13\" 675 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC -400 90 10 0 1 0 F\nC -500 90 10 0 1 0 F\nC -600 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nC 300 90 10 0 1 0 F\nC 400 90 10 0 1 0 F\nS -130 60 -70 -100 0 1 10 N\nS -230 60 -170 -100 0 1 10 N\nS -30 60 30 -100 0 1 10 N\nS -330 60 -270 -100 0 1 10 N\nS -430 60 -370 -100 0 1 10 N\nS -530 60 -470 -100 0 1 10 N\nS -630 60 -570 -100 0 1 10 N\nS -650 -125 550 125 0 1 10 f\nS 170 60 230 -100 0 1 10 N\nS 270 60 330 -100 0 1 10 N\nS 370 60 430 -100 0 1 10 N\nS 470 60 530 -100 0 1 10 N\nS 70 60 130 -100 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -150 N\nP 2 0 1 0 -200 -100 -200 -150 N\nP 2 0 1 0 -300 -100 -300 -150 N\nP 2 0 1 0 -400 -100 -400 -150 N\nP 2 0 1 0 -500 -100 -500 -150 N\nP 2 0 1 0 -600 -100 -600 -150 N\nP 2 0 1 0 0 -100 0 -150 N\nP 2 0 1 0 100 -100 100 -150 N\nP 2 0 1 0 200 -100 200 -150 N\nP 2 0 1 0 300 -100 300 -150 N\nP 2 0 1 0 400 -100 400 -150 N\nP 2 0 1 0 500 -100 500 -150 N\nP 4 0 1 0 -100 60 -100 90 0 90 0 60 N\nP 4 0 1 0 -200 60 -200 90 -100 90 -100 60 N\nP 4 0 1 0 -300 60 -300 90 -200 90 -200 60 N\nP 4 0 1 0 -400 60 -400 90 -300 90 -300 60 N\nP 4 0 1 0 -500 60 -500 90 -400 90 -400 60 N\nP 4 0 1 0 -600 60 -600 90 -500 90 -500 60 N\nP 4 0 1 0 0 60 0 90 100 90 100 60 N\nP 4 0 1 0 100 60 100 90 200 90 200 60 N\nP 4 0 1 0 200 60 200 90 300 90 300 60 N\nP 4 0 1 0 300 60 300 90 400 90 400 60 N\nP 4 0 1 0 400 60 400 90 500 90 500 60 N\nX R1 2 -600 -200 50 U 50 50 1 1 P\nX R10 11 300 -200 50 U 50 50 1 1 P\nX R11 12 400 -200 50 U 50 50 1 1 P\nX R12 13 500 -200 50 U 50 50 1 1 P\nX R2 3 -500 -200 50 U 50 50 1 1 P\nX R3 4 -400 -200 50 U 50 50 1 1 P\nX R4 5 -300 -200 50 U 50 50 1 1 P\nX R5 6 -200 -200 50 U 50 50 1 1 P\nX R6 7 -100 -200 50 U 50 50 1 1 P\nX R7 8 0 -200 50 U 50 50 1 1 P\nX R8 9 100 -200 50 U 50 50 1 1 P\nX R9 10 200 -200 50 U 50 50 1 1 P\nX common 1 -600 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network12_Split\n#\nDEF R_Network12_Split RN 0 0 Y N 12 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Network12_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP13\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nT 900 35 125 50 0 10 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 11 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 12 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 2 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 3 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 4 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 5 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 6 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 7 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 8 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 9 1 \"1\" Normal 0 C C\nS 40 100 -40 -100 0 1 10 N\nP 2 10 1 0 0 100 0 150 N\nP 2 11 1 0 0 100 0 150 N\nP 2 12 1 0 0 100 0 150 N\nP 2 2 1 0 0 100 0 150 N\nP 2 3 1 0 0 100 0 150 N\nP 2 4 1 0 0 100 0 150 N\nP 2 5 1 0 0 100 0 150 N\nP 2 6 1 0 0 100 0 150 N\nP 2 7 1 0 0 100 0 150 N\nP 2 8 1 0 0 100 0 150 N\nP 2 9 1 0 0 100 0 150 N\nX R1.1 1 0 150 50 D 50 50 1 1 P\nX R1.2 2 0 -150 50 U 50 50 1 1 P\nX R10.2 11 0 -150 50 U 50 50 10 1 P\nX R11.2 12 0 -150 50 U 50 50 11 1 P\nX R12.2 13 0 -150 50 U 50 50 12 1 P\nX R2.2 3 0 -150 50 U 50 50 2 1 P\nX R3.2 4 0 -150 50 U 50 50 3 1 P\nX R4.2 5 0 -150 50 U 50 50 4 1 P\nX R5.2 6 0 -150 50 U 50 50 5 1 P\nX R6.2 7 0 -150 50 U 50 50 6 1 P\nX R7.2 8 0 -150 50 U 50 50 7 1 P\nX R8.2 9 0 -150 50 U 50 50 8 1 P\nX R9.2 10 0 -150 50 U 50 50 9 1 P\nENDDRAW\nENDDEF\n#\n# R_Network12_US\n#\nDEF R_Network12_US RN 0 0 Y N 1 F N\nF0 \"RN\" -700 0 50 V V C CNN\nF1 \"R_Network12_US\" 600 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP13\" 675 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC -400 90 10 0 1 0 F\nC -500 90 10 0 1 0 F\nC -600 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nC 300 90 10 0 1 0 F\nC 400 90 10 0 1 0 F\nS -650 -125 550 125 0 1 10 f\nP 10 0 1 0 -100 90 -100 60 -70 46 -130 20 -70 -6 -130 -33 -70 -60 -130 -86 -100 -100 -100 -150 N\nP 10 0 1 0 -200 90 -200 60 -170 46 -230 20 -170 -6 -230 -33 -170 -60 -230 -86 -200 -100 -200 -150 N\nP 10 0 1 0 -300 90 -300 60 -270 46 -330 20 -270 -6 -330 -33 -270 -60 -330 -86 -300 -100 -300 -150 N\nP 10 0 1 0 -400 90 -400 60 -370 46 -430 20 -370 -6 -430 -33 -370 -60 -430 -86 -400 -100 -400 -150 N\nP 10 0 1 0 -500 90 -500 60 -470 46 -530 20 -470 -6 -530 -33 -470 -60 -530 -86 -500 -100 -500 -150 N\nP 10 0 1 0 -600 90 -600 60 -570 46 -630 20 -570 -6 -630 -33 -570 -60 -630 -86 -600 -100 -600 -150 N\nP 10 0 1 0 0 90 0 60 30 46 -30 20 30 -6 -30 -33 30 -60 -30 -86 0 -100 0 -150 N\nP 10 0 1 0 100 90 100 60 130 46 70 20 130 -6 70 -33 130 -60 70 -86 100 -100 100 -150 N\nP 10 0 1 0 200 90 200 60 230 46 170 20 230 -6 170 -33 230 -60 170 -86 200 -100 200 -150 N\nP 10 0 1 0 300 90 300 60 330 46 270 20 330 -6 270 -33 330 -60 270 -86 300 -100 300 -150 N\nP 10 0 1 0 400 90 400 60 430 46 370 20 430 -6 370 -33 430 -60 370 -86 400 -100 400 -150 N\nP 10 0 1 0 500 90 500 60 530 46 470 20 530 -6 470 -33 530 -60 470 -86 500 -100 500 -150 N\nP 2 0 1 0 -600 90 500 90 N\nX R1 2 -600 -200 50 U 50 50 1 1 P\nX R10 11 300 -200 50 U 50 50 1 1 P\nX R11 12 400 -200 50 U 50 50 1 1 P\nX R12 13 500 -200 50 U 50 50 1 1 P\nX R2 3 -500 -200 50 U 50 50 1 1 P\nX R3 4 -400 -200 50 U 50 50 1 1 P\nX R4 5 -300 -200 50 U 50 50 1 1 P\nX R5 6 -200 -200 50 U 50 50 1 1 P\nX R6 7 -100 -200 50 U 50 50 1 1 P\nX R7 8 0 -200 50 U 50 50 1 1 P\nX R8 9 100 -200 50 U 50 50 1 1 P\nX R9 10 200 -200 50 U 50 50 1 1 P\nX common 1 -600 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network13\n#\nDEF R_Network13 RN 0 0 Y N 1 F N\nF0 \"RN\" -700 0 50 V V C CNN\nF1 \"R_Network13\" 700 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP14\" 775 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC -400 90 10 0 1 0 F\nC -500 90 10 0 1 0 F\nC -600 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nC 300 90 10 0 1 0 F\nC 400 90 10 0 1 0 F\nC 500 90 10 0 1 0 F\nS -130 60 -70 -100 0 1 10 N\nS -230 60 -170 -100 0 1 10 N\nS -30 60 30 -100 0 1 10 N\nS -330 60 -270 -100 0 1 10 N\nS -430 60 -370 -100 0 1 10 N\nS -530 60 -470 -100 0 1 10 N\nS -630 60 -570 -100 0 1 10 N\nS -650 -125 650 125 0 1 10 f\nS 170 60 230 -100 0 1 10 N\nS 270 60 330 -100 0 1 10 N\nS 370 60 430 -100 0 1 10 N\nS 470 60 530 -100 0 1 10 N\nS 570 60 630 -100 0 1 10 N\nS 70 60 130 -100 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -150 N\nP 2 0 1 0 -200 -100 -200 -150 N\nP 2 0 1 0 -300 -100 -300 -150 N\nP 2 0 1 0 -400 -100 -400 -150 N\nP 2 0 1 0 -500 -100 -500 -150 N\nP 2 0 1 0 -600 -100 -600 -150 N\nP 2 0 1 0 0 -100 0 -150 N\nP 2 0 1 0 100 -100 100 -150 N\nP 2 0 1 0 200 -100 200 -150 N\nP 2 0 1 0 300 -100 300 -150 N\nP 2 0 1 0 400 -100 400 -150 N\nP 2 0 1 0 500 -100 500 -150 N\nP 2 0 1 0 600 -100 600 -150 N\nP 4 0 1 0 -100 60 -100 90 0 90 0 60 N\nP 4 0 1 0 -200 60 -200 90 -100 90 -100 60 N\nP 4 0 1 0 -300 60 -300 90 -200 90 -200 60 N\nP 4 0 1 0 -400 60 -400 90 -300 90 -300 60 N\nP 4 0 1 0 -500 60 -500 90 -400 90 -400 60 N\nP 4 0 1 0 -600 60 -600 90 -500 90 -500 60 N\nP 4 0 1 0 0 60 0 90 100 90 100 60 N\nP 4 0 1 0 100 60 100 90 200 90 200 60 N\nP 4 0 1 0 200 60 200 90 300 90 300 60 N\nP 4 0 1 0 300 60 300 90 400 90 400 60 N\nP 4 0 1 0 400 60 400 90 500 90 500 60 N\nP 4 0 1 0 500 60 500 90 600 90 600 60 N\nX R1 2 -600 -200 50 U 50 50 1 1 P\nX R10 11 300 -200 50 U 50 50 1 1 P\nX R11 12 400 -200 50 U 50 50 1 1 P\nX R12 13 500 -200 50 U 50 50 1 1 P\nX R13 14 600 -200 50 U 50 50 1 1 P\nX R2 3 -500 -200 50 U 50 50 1 1 P\nX R3 4 -400 -200 50 U 50 50 1 1 P\nX R4 5 -300 -200 50 U 50 50 1 1 P\nX R5 6 -200 -200 50 U 50 50 1 1 P\nX R6 7 -100 -200 50 U 50 50 1 1 P\nX R7 8 0 -200 50 U 50 50 1 1 P\nX R8 9 100 -200 50 U 50 50 1 1 P\nX R9 10 200 -200 50 U 50 50 1 1 P\nX common 1 -600 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network13_Split\n#\nDEF R_Network13_Split RN 0 0 Y N 13 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Network13_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP14\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nT 900 35 125 50 0 10 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 11 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 12 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 13 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 2 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 3 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 4 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 5 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 6 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 7 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 8 1 \"1\" Normal 0 C C\nT 900 35 125 50 0 9 1 \"1\" Normal 0 C C\nS 40 100 -40 -100 0 1 10 N\nP 2 10 1 0 0 100 0 150 N\nP 2 11 1 0 0 100 0 150 N\nP 2 12 1 0 0 100 0 150 N\nP 2 13 1 0 0 100 0 150 N\nP 2 2 1 0 0 100 0 150 N\nP 2 3 1 0 0 100 0 150 N\nP 2 4 1 0 0 100 0 150 N\nP 2 5 1 0 0 100 0 150 N\nP 2 6 1 0 0 100 0 150 N\nP 2 7 1 0 0 100 0 150 N\nP 2 8 1 0 0 100 0 150 N\nP 2 9 1 0 0 100 0 150 N\nX R1.1 1 0 150 50 D 50 50 1 1 P\nX R1.2 2 0 -150 50 U 50 50 1 1 P\nX R10.2 11 0 -150 50 U 50 50 10 1 P\nX R11.2 12 0 -150 50 U 50 50 11 1 P\nX R12.2 13 0 -150 50 U 50 50 12 1 P\nX R13.2 14 0 -150 50 U 50 50 13 1 P\nX R2.2 3 0 -150 50 U 50 50 2 1 P\nX R3.2 4 0 -150 50 U 50 50 3 1 P\nX R4.2 5 0 -150 50 U 50 50 4 1 P\nX R5.2 6 0 -150 50 U 50 50 5 1 P\nX R6.2 7 0 -150 50 U 50 50 6 1 P\nX R7.2 8 0 -150 50 U 50 50 7 1 P\nX R8.2 9 0 -150 50 U 50 50 8 1 P\nX R9.2 10 0 -150 50 U 50 50 9 1 P\nENDDRAW\nENDDEF\n#\n# R_Network13_US\n#\nDEF R_Network13_US RN 0 0 Y N 1 F N\nF0 \"RN\" -700 0 50 V V C CNN\nF1 \"R_Network13_US\" 700 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP14\" 775 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -100 90 10 0 1 0 F\nC -200 90 10 0 1 0 F\nC -300 90 10 0 1 0 F\nC -400 90 10 0 1 0 F\nC -500 90 10 0 1 0 F\nC -600 90 10 0 1 0 F\nC 0 90 10 0 1 0 F\nC 100 90 10 0 1 0 F\nC 200 90 10 0 1 0 F\nC 300 90 10 0 1 0 F\nC 400 90 10 0 1 0 F\nC 500 90 10 0 1 0 F\nS -650 -125 650 125 0 1 10 f\nP 10 0 1 0 -100 90 -100 60 -70 46 -130 20 -70 -6 -130 -33 -70 -60 -130 -86 -100 -100 -100 -150 N\nP 10 0 1 0 -200 90 -200 60 -170 46 -230 20 -170 -6 -230 -33 -170 -60 -230 -86 -200 -100 -200 -150 N\nP 10 0 1 0 -300 90 -300 60 -270 46 -330 20 -270 -6 -330 -33 -270 -60 -330 -86 -300 -100 -300 -150 N\nP 10 0 1 0 -400 90 -400 60 -370 46 -430 20 -370 -6 -430 -33 -370 -60 -430 -86 -400 -100 -400 -150 N\nP 10 0 1 0 -500 90 -500 60 -470 46 -530 20 -470 -6 -530 -33 -470 -60 -530 -86 -500 -100 -500 -150 N\nP 10 0 1 0 -600 90 -600 60 -570 46 -630 20 -570 -6 -630 -33 -570 -60 -630 -86 -600 -100 -600 -150 N\nP 10 0 1 0 0 90 0 60 30 46 -30 20 30 -6 -30 -33 30 -60 -30 -86 0 -100 0 -150 N\nP 10 0 1 0 100 90 100 60 130 46 70 20 130 -6 70 -33 130 -60 70 -86 100 -100 100 -150 N\nP 10 0 1 0 200 90 200 60 230 46 170 20 230 -6 170 -33 230 -60 170 -86 200 -100 200 -150 N\nP 10 0 1 0 300 90 300 60 330 46 270 20 330 -6 270 -33 330 -60 270 -86 300 -100 300 -150 N\nP 10 0 1 0 400 90 400 60 430 46 370 20 430 -6 370 -33 430 -60 370 -86 400 -100 400 -150 N\nP 10 0 1 0 500 90 500 60 530 46 470 20 530 -6 470 -33 530 -60 470 -86 500 -100 500 -150 N\nP 10 0 1 0 600 90 600 60 630 46 570 20 630 -6 570 -33 630 -60 570 -86 600 -100 600 -150 N\nP 2 0 1 0 -600 90 600 90 N\nX R1 2 -600 -200 50 U 50 50 1 1 P\nX R10 11 300 -200 50 U 50 50 1 1 P\nX R11 12 400 -200 50 U 50 50 1 1 P\nX R12 13 500 -200 50 U 50 50 1 1 P\nX R13 14 600 -200 50 U 50 50 1 1 P\nX R2 3 -500 -200 50 U 50 50 1 1 P\nX R3 4 -400 -200 50 U 50 50 1 1 P\nX R4 5 -300 -200 50 U 50 50 1 1 P\nX R5 6 -200 -200 50 U 50 50 1 1 P\nX R6 7 -100 -200 50 U 50 50 1 1 P\nX R7 8 0 -200 50 U 50 50 1 1 P\nX R8 9 100 -200 50 U 50 50 1 1 P\nX R9 10 200 -200 50 U 50 50 1 1 P\nX common 1 -600 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network_Dividers_x02_SIP\n#\nDEF R_Network_Dividers_x02_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -300 0 50 V V C CNN\nF1 \"R_Network_Dividers_x02_SIP\" 200 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP4\" 275 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -200 0 10 0 1 0 F\nC -200 166 10 0 1 0 F\nC 0 0 10 0 1 0 F\nC 60 -166 10 0 1 0 F\nS -160 -133 -120 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nS -220 133 -180 33 0 1 10 N\nS -250 -200 150 200 0 1 10 f\nS 40 -133 80 -33 0 1 10 N\nP 2 0 1 0 -200 -200 -200 33 N\nP 2 0 1 0 -200 200 -200 133 N\nP 2 0 1 0 0 -200 0 33 N\nP 2 0 1 0 100 -166 100 200 N\nP 3 0 1 0 -140 -133 -140 -166 100 -166 N\nP 3 0 1 0 -200 0 -140 0 -140 -33 N\nP 3 0 1 0 -200 166 0 166 0 133 N\nP 3 0 1 0 0 0 60 0 60 -33 N\nP 3 0 1 0 60 -133 60 -166 100 -166 N\nX COM1 1 -200 300 100 D 50 50 1 1 P\nX COM2 4 100 300 100 D 50 50 1 1 P\nX R1 2 -200 -300 100 U 50 50 1 1 P\nX R2 3 0 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network_Dividers_x03_SIP\n#\nDEF R_Network_Dividers_x03_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -300 0 50 V V C CNN\nF1 \"R_Network_Dividers_x03_SIP\" 400 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP5\" 475 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -200 0 10 0 1 0 F\nC -200 166 10 0 1 0 F\nC 0 0 10 0 1 0 F\nC 0 166 10 0 1 0 F\nC 200 0 10 0 1 0 F\nC 260 -166 10 0 1 0 F\nC 60 -166 10 0 1 0 F\nS -160 -133 -120 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nS -220 133 -180 33 0 1 10 N\nS -250 -200 350 200 0 1 10 f\nS 180 133 220 33 0 1 10 N\nS 240 -133 280 -33 0 1 10 N\nS 40 -133 80 -33 0 1 10 N\nP 2 0 1 0 -200 -200 -200 33 N\nP 2 0 1 0 -200 200 -200 133 N\nP 2 0 1 0 0 -200 0 33 N\nP 2 0 1 0 200 -200 200 33 N\nP 2 0 1 0 300 -166 300 200 N\nP 3 0 1 0 -140 -133 -140 -166 300 -166 N\nP 3 0 1 0 -200 0 -140 0 -140 -33 N\nP 3 0 1 0 -200 166 0 166 0 133 N\nP 3 0 1 0 0 0 60 0 60 -33 N\nP 3 0 1 0 0 166 200 166 200 133 N\nP 3 0 1 0 200 0 260 0 260 -33 N\nP 3 0 1 0 260 -133 260 -166 300 -166 N\nP 3 0 1 0 60 -133 60 -166 300 -166 N\nX COM1 1 -200 300 100 D 50 50 1 1 P\nX COM2 5 300 300 100 D 50 50 1 1 P\nX R1 2 -200 -300 100 U 50 50 1 1 P\nX R2 3 0 -300 100 U 50 50 1 1 P\nX R3 4 200 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network_Dividers_x04_SIP\n#\nDEF R_Network_Dividers_x04_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -500 0 50 V V C CNN\nF1 \"R_Network_Dividers_x04_SIP\" 400 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP6\" 475 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -140 -166 10 0 1 0 F\nC -200 0 10 0 1 0 F\nC -200 166 10 0 1 0 F\nC -400 0 10 0 1 0 F\nC -400 166 10 0 1 0 F\nC 0 0 10 0 1 0 F\nC 0 166 10 0 1 0 F\nC 200 0 10 0 1 0 F\nC 260 -166 10 0 1 0 F\nC 60 -166 10 0 1 0 F\nS -160 -133 -120 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nS -220 133 -180 33 0 1 10 N\nS -360 -133 -320 -33 0 1 10 N\nS -420 133 -380 33 0 1 10 N\nS -450 -200 350 200 0 1 10 f\nS 180 133 220 33 0 1 10 N\nS 240 -133 280 -33 0 1 10 N\nS 40 -133 80 -33 0 1 10 N\nP 2 0 1 0 -200 -200 -200 33 N\nP 2 0 1 0 -400 -200 -400 33 N\nP 2 0 1 0 -400 200 -400 133 N\nP 2 0 1 0 0 -200 0 33 N\nP 2 0 1 0 200 -200 200 33 N\nP 2 0 1 0 300 -166 300 200 N\nP 3 0 1 0 -140 -133 -140 -166 300 -166 N\nP 3 0 1 0 -200 0 -140 0 -140 -33 N\nP 3 0 1 0 -200 166 0 166 0 133 N\nP 3 0 1 0 -340 -133 -340 -166 300 -166 N\nP 3 0 1 0 -400 0 -340 0 -340 -33 N\nP 3 0 1 0 -400 166 -200 166 -200 133 N\nP 3 0 1 0 0 0 60 0 60 -33 N\nP 3 0 1 0 0 166 200 166 200 133 N\nP 3 0 1 0 200 0 260 0 260 -33 N\nP 3 0 1 0 260 -133 260 -166 300 -166 N\nP 3 0 1 0 60 -133 60 -166 300 -166 N\nX COM1 1 -400 300 100 D 50 50 1 1 P\nX COM2 6 300 300 100 D 50 50 1 1 P\nX R1 2 -400 -300 100 U 50 50 1 1 P\nX R2 3 -200 -300 100 U 50 50 1 1 P\nX R3 4 0 -300 100 U 50 50 1 1 P\nX R4 5 200 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network_Dividers_x05_SIP\n#\nDEF R_Network_Dividers_x05_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -500 0 50 V V C CNN\nF1 \"R_Network_Dividers_x05_SIP\" 600 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP7\" 675 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -140 -166 10 0 1 0 F\nC -200 0 10 0 1 0 F\nC -200 166 10 0 1 0 F\nC -400 0 10 0 1 0 F\nC -400 166 10 0 1 0 F\nC 0 0 10 0 1 0 F\nC 0 166 10 0 1 0 F\nC 200 0 10 0 1 0 F\nC 200 166 10 0 1 0 F\nC 260 -166 10 0 1 0 F\nC 400 0 10 0 1 0 F\nC 460 -166 10 0 1 0 F\nC 60 -166 10 0 1 0 F\nS -160 -133 -120 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nS -220 133 -180 33 0 1 10 N\nS -360 -133 -320 -33 0 1 10 N\nS -420 133 -380 33 0 1 10 N\nS -450 -200 550 200 0 1 10 f\nS 180 133 220 33 0 1 10 N\nS 240 -133 280 -33 0 1 10 N\nS 380 133 420 33 0 1 10 N\nS 40 -133 80 -33 0 1 10 N\nS 440 -133 480 -33 0 1 10 N\nP 2 0 1 0 -200 -200 -200 33 N\nP 2 0 1 0 -400 -200 -400 33 N\nP 2 0 1 0 -400 200 -400 133 N\nP 2 0 1 0 0 -200 0 33 N\nP 2 0 1 0 200 -200 200 33 N\nP 2 0 1 0 400 -200 400 33 N\nP 2 0 1 0 500 -166 500 200 N\nP 3 0 1 0 -140 -133 -140 -166 500 -166 N\nP 3 0 1 0 -200 0 -140 0 -140 -33 N\nP 3 0 1 0 -200 166 0 166 0 133 N\nP 3 0 1 0 -340 -133 -340 -166 500 -166 N\nP 3 0 1 0 -400 0 -340 0 -340 -33 N\nP 3 0 1 0 -400 166 -200 166 -200 133 N\nP 3 0 1 0 0 0 60 0 60 -33 N\nP 3 0 1 0 0 166 200 166 200 133 N\nP 3 0 1 0 200 0 260 0 260 -33 N\nP 3 0 1 0 200 166 400 166 400 133 N\nP 3 0 1 0 260 -133 260 -166 500 -166 N\nP 3 0 1 0 400 0 460 0 460 -33 N\nP 3 0 1 0 460 -133 460 -166 500 -166 N\nP 3 0 1 0 60 -133 60 -166 500 -166 N\nX COM1 1 -400 300 100 D 50 50 1 1 P\nX COM2 7 500 300 100 D 50 50 1 1 P\nX R1 2 -400 -300 100 U 50 50 1 1 P\nX R2 3 -200 -300 100 U 50 50 1 1 P\nX R3 4 0 -300 100 U 50 50 1 1 P\nX R4 5 200 -300 100 U 50 50 1 1 P\nX R5 6 400 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network_Dividers_x06_SIP\n#\nDEF R_Network_Dividers_x06_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -700 0 50 V V C CNN\nF1 \"R_Network_Dividers_x06_SIP\" 600 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP8\" 675 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -140 -166 10 0 1 0 F\nC -200 0 10 0 1 0 F\nC -200 166 10 0 1 0 F\nC -340 -166 10 0 1 0 F\nC -400 0 10 0 1 0 F\nC -400 166 10 0 1 0 F\nC -600 0 10 0 1 0 F\nC -600 166 10 0 1 0 F\nC 0 0 10 0 1 0 F\nC 0 166 10 0 1 0 F\nC 200 0 10 0 1 0 F\nC 200 166 10 0 1 0 F\nC 260 -166 10 0 1 0 F\nC 400 0 10 0 1 0 F\nC 460 -166 10 0 1 0 F\nC 60 -166 10 0 1 0 F\nS -160 -133 -120 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nS -220 133 -180 33 0 1 10 N\nS -360 -133 -320 -33 0 1 10 N\nS -420 133 -380 33 0 1 10 N\nS -560 -133 -520 -33 0 1 10 N\nS -620 133 -580 33 0 1 10 N\nS -650 -200 550 200 0 1 10 f\nS 180 133 220 33 0 1 10 N\nS 240 -133 280 -33 0 1 10 N\nS 380 133 420 33 0 1 10 N\nS 40 -133 80 -33 0 1 10 N\nS 440 -133 480 -33 0 1 10 N\nP 2 0 1 0 -200 -200 -200 33 N\nP 2 0 1 0 -400 -200 -400 33 N\nP 2 0 1 0 -600 -200 -600 33 N\nP 2 0 1 0 -600 200 -600 133 N\nP 2 0 1 0 0 -200 0 33 N\nP 2 0 1 0 200 -200 200 33 N\nP 2 0 1 0 400 -200 400 33 N\nP 2 0 1 0 500 -166 500 200 N\nP 3 0 1 0 -140 -133 -140 -166 500 -166 N\nP 3 0 1 0 -200 0 -140 0 -140 -33 N\nP 3 0 1 0 -200 166 0 166 0 133 N\nP 3 0 1 0 -340 -133 -340 -166 500 -166 N\nP 3 0 1 0 -400 0 -340 0 -340 -33 N\nP 3 0 1 0 -400 166 -200 166 -200 133 N\nP 3 0 1 0 -540 -133 -540 -166 500 -166 N\nP 3 0 1 0 -600 0 -540 0 -540 -33 N\nP 3 0 1 0 -600 166 -400 166 -400 133 N\nP 3 0 1 0 0 0 60 0 60 -33 N\nP 3 0 1 0 0 166 200 166 200 133 N\nP 3 0 1 0 200 0 260 0 260 -33 N\nP 3 0 1 0 200 166 400 166 400 133 N\nP 3 0 1 0 260 -133 260 -166 500 -166 N\nP 3 0 1 0 400 0 460 0 460 -33 N\nP 3 0 1 0 460 -133 460 -166 500 -166 N\nP 3 0 1 0 60 -133 60 -166 500 -166 N\nX COM1 1 -600 300 100 D 50 50 1 1 P\nX COM2 8 500 300 100 D 50 50 1 1 P\nX R1 2 -600 -300 100 U 50 50 1 1 P\nX R2 3 -400 -300 100 U 50 50 1 1 P\nX R3 4 -200 -300 100 U 50 50 1 1 P\nX R4 5 0 -300 100 U 50 50 1 1 P\nX R5 6 200 -300 100 U 50 50 1 1 P\nX R6 7 400 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network_Dividers_x07_SIP\n#\nDEF R_Network_Dividers_x07_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -700 0 50 V V C CNN\nF1 \"R_Network_Dividers_x07_SIP\" 800 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP9\" 875 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -140 -166 10 0 1 0 F\nC -200 0 10 0 1 0 F\nC -200 166 10 0 1 0 F\nC -340 -166 10 0 1 0 F\nC -400 0 10 0 1 0 F\nC -400 166 10 0 1 0 F\nC -600 0 10 0 1 0 F\nC -600 166 10 0 1 0 F\nC 0 0 10 0 1 0 F\nC 0 166 10 0 1 0 F\nC 200 0 10 0 1 0 F\nC 200 166 10 0 1 0 F\nC 260 -166 10 0 1 0 F\nC 400 0 10 0 1 0 F\nC 400 166 10 0 1 0 F\nC 460 -166 10 0 1 0 F\nC 60 -166 10 0 1 0 F\nC 600 0 10 0 1 0 F\nC 660 -166 10 0 1 0 F\nS -160 -133 -120 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nS -220 133 -180 33 0 1 10 N\nS -360 -133 -320 -33 0 1 10 N\nS -420 133 -380 33 0 1 10 N\nS -560 -133 -520 -33 0 1 10 N\nS -620 133 -580 33 0 1 10 N\nS -650 -200 750 200 0 1 10 f\nS 180 133 220 33 0 1 10 N\nS 240 -133 280 -33 0 1 10 N\nS 380 133 420 33 0 1 10 N\nS 40 -133 80 -33 0 1 10 N\nS 440 -133 480 -33 0 1 10 N\nS 580 133 620 33 0 1 10 N\nS 640 -133 680 -33 0 1 10 N\nP 2 0 1 0 -200 -200 -200 33 N\nP 2 0 1 0 -400 -200 -400 33 N\nP 2 0 1 0 -600 -200 -600 33 N\nP 2 0 1 0 -600 200 -600 133 N\nP 2 0 1 0 0 -200 0 33 N\nP 2 0 1 0 200 -200 200 33 N\nP 2 0 1 0 400 -200 400 33 N\nP 2 0 1 0 600 -200 600 33 N\nP 2 0 1 0 700 -166 700 200 N\nP 3 0 1 0 -140 -133 -140 -166 700 -166 N\nP 3 0 1 0 -200 0 -140 0 -140 -33 N\nP 3 0 1 0 -200 166 0 166 0 133 N\nP 3 0 1 0 -340 -133 -340 -166 700 -166 N\nP 3 0 1 0 -400 0 -340 0 -340 -33 N\nP 3 0 1 0 -400 166 -200 166 -200 133 N\nP 3 0 1 0 -540 -133 -540 -166 700 -166 N\nP 3 0 1 0 -600 0 -540 0 -540 -33 N\nP 3 0 1 0 -600 166 -400 166 -400 133 N\nP 3 0 1 0 0 0 60 0 60 -33 N\nP 3 0 1 0 0 166 200 166 200 133 N\nP 3 0 1 0 200 0 260 0 260 -33 N\nP 3 0 1 0 200 166 400 166 400 133 N\nP 3 0 1 0 260 -133 260 -166 700 -166 N\nP 3 0 1 0 400 0 460 0 460 -33 N\nP 3 0 1 0 400 166 600 166 600 133 N\nP 3 0 1 0 460 -133 460 -166 700 -166 N\nP 3 0 1 0 60 -133 60 -166 700 -166 N\nP 3 0 1 0 600 0 660 0 660 -33 N\nP 3 0 1 0 660 -133 660 -166 700 -166 N\nX COM1 1 -600 300 100 D 50 50 1 1 P\nX COM2 9 700 300 100 D 50 50 1 1 P\nX R1 2 -600 -300 100 U 50 50 1 1 P\nX R2 3 -400 -300 100 U 50 50 1 1 P\nX R3 4 -200 -300 100 U 50 50 1 1 P\nX R4 5 0 -300 100 U 50 50 1 1 P\nX R5 6 200 -300 100 U 50 50 1 1 P\nX R6 7 400 -300 100 U 50 50 1 1 P\nX R7 8 600 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network_Dividers_x08_SIP\n#\nDEF R_Network_Dividers_x08_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -900 0 50 V V C CNN\nF1 \"R_Network_Dividers_x08_SIP\" 800 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP10\" 875 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -140 -166 10 0 1 0 F\nC -200 0 10 0 1 0 F\nC -200 166 10 0 1 0 F\nC -340 -166 10 0 1 0 F\nC -400 0 10 0 1 0 F\nC -400 166 10 0 1 0 F\nC -540 -166 10 0 1 0 F\nC -600 0 10 0 1 0 F\nC -600 166 10 0 1 0 F\nC -800 0 10 0 1 0 F\nC -800 166 10 0 1 0 F\nC 0 0 10 0 1 0 F\nC 0 166 10 0 1 0 F\nC 200 0 10 0 1 0 F\nC 200 166 10 0 1 0 F\nC 260 -166 10 0 1 0 F\nC 400 0 10 0 1 0 F\nC 400 166 10 0 1 0 F\nC 460 -166 10 0 1 0 F\nC 60 -166 10 0 1 0 F\nC 600 0 10 0 1 0 F\nC 660 -166 10 0 1 0 F\nS -160 -133 -120 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nS -220 133 -180 33 0 1 10 N\nS -360 -133 -320 -33 0 1 10 N\nS -420 133 -380 33 0 1 10 N\nS -560 -133 -520 -33 0 1 10 N\nS -620 133 -580 33 0 1 10 N\nS -760 -133 -720 -33 0 1 10 N\nS -820 133 -780 33 0 1 10 N\nS -850 -200 750 200 0 1 10 f\nS 180 133 220 33 0 1 10 N\nS 240 -133 280 -33 0 1 10 N\nS 380 133 420 33 0 1 10 N\nS 40 -133 80 -33 0 1 10 N\nS 440 -133 480 -33 0 1 10 N\nS 580 133 620 33 0 1 10 N\nS 640 -133 680 -33 0 1 10 N\nP 2 0 1 0 -200 -200 -200 33 N\nP 2 0 1 0 -400 -200 -400 33 N\nP 2 0 1 0 -600 -200 -600 33 N\nP 2 0 1 0 -800 -200 -800 33 N\nP 2 0 1 0 -800 200 -800 133 N\nP 2 0 1 0 0 -200 0 33 N\nP 2 0 1 0 200 -200 200 33 N\nP 2 0 1 0 400 -200 400 33 N\nP 2 0 1 0 600 -200 600 33 N\nP 2 0 1 0 700 -166 700 200 N\nP 3 0 1 0 -140 -133 -140 -166 700 -166 N\nP 3 0 1 0 -200 0 -140 0 -140 -33 N\nP 3 0 1 0 -200 166 0 166 0 133 N\nP 3 0 1 0 -340 -133 -340 -166 700 -166 N\nP 3 0 1 0 -400 0 -340 0 -340 -33 N\nP 3 0 1 0 -400 166 -200 166 -200 133 N\nP 3 0 1 0 -540 -133 -540 -166 700 -166 N\nP 3 0 1 0 -600 0 -540 0 -540 -33 N\nP 3 0 1 0 -600 166 -400 166 -400 133 N\nP 3 0 1 0 -740 -133 -740 -166 700 -166 N\nP 3 0 1 0 -800 0 -740 0 -740 -33 N\nP 3 0 1 0 -800 166 -600 166 -600 133 N\nP 3 0 1 0 0 0 60 0 60 -33 N\nP 3 0 1 0 0 166 200 166 200 133 N\nP 3 0 1 0 200 0 260 0 260 -33 N\nP 3 0 1 0 200 166 400 166 400 133 N\nP 3 0 1 0 260 -133 260 -166 700 -166 N\nP 3 0 1 0 400 0 460 0 460 -33 N\nP 3 0 1 0 400 166 600 166 600 133 N\nP 3 0 1 0 460 -133 460 -166 700 -166 N\nP 3 0 1 0 60 -133 60 -166 700 -166 N\nP 3 0 1 0 600 0 660 0 660 -33 N\nP 3 0 1 0 660 -133 660 -166 700 -166 N\nX COM1 1 -800 300 100 D 50 50 1 1 P\nX COM2 10 700 300 100 D 50 50 1 1 P\nX R1 2 -800 -300 100 U 50 50 1 1 P\nX R2 3 -600 -300 100 U 50 50 1 1 P\nX R3 4 -400 -300 100 U 50 50 1 1 P\nX R4 5 -200 -300 100 U 50 50 1 1 P\nX R5 6 0 -300 100 U 50 50 1 1 P\nX R6 7 200 -300 100 U 50 50 1 1 P\nX R7 8 400 -300 100 U 50 50 1 1 P\nX R8 9 600 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network_Dividers_x09_SIP\n#\nDEF R_Network_Dividers_x09_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -900 0 50 V V C CNN\nF1 \"R_Network_Dividers_x09_SIP\" 1000 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP11\" 1075 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -140 -166 10 0 1 0 F\nC -200 0 10 0 1 0 F\nC -200 166 10 0 1 0 F\nC -340 -166 10 0 1 0 F\nC -400 0 10 0 1 0 F\nC -400 166 10 0 1 0 F\nC -540 -166 10 0 1 0 F\nC -600 0 10 0 1 0 F\nC -600 166 10 0 1 0 F\nC -800 0 10 0 1 0 F\nC -800 166 10 0 1 0 F\nC 0 0 10 0 1 0 F\nC 0 166 10 0 1 0 F\nC 200 0 10 0 1 0 F\nC 200 166 10 0 1 0 F\nC 260 -166 10 0 1 0 F\nC 400 0 10 0 1 0 F\nC 400 166 10 0 1 0 F\nC 460 -166 10 0 1 0 F\nC 60 -166 10 0 1 0 F\nC 600 0 10 0 1 0 F\nC 600 166 10 0 1 0 F\nC 660 -166 10 0 1 0 F\nC 800 0 10 0 1 0 F\nC 860 -166 10 0 1 0 F\nS -160 -133 -120 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nS -220 133 -180 33 0 1 10 N\nS -360 -133 -320 -33 0 1 10 N\nS -420 133 -380 33 0 1 10 N\nS -560 -133 -520 -33 0 1 10 N\nS -620 133 -580 33 0 1 10 N\nS -760 -133 -720 -33 0 1 10 N\nS -820 133 -780 33 0 1 10 N\nS -850 -200 950 200 0 1 10 f\nS 180 133 220 33 0 1 10 N\nS 240 -133 280 -33 0 1 10 N\nS 380 133 420 33 0 1 10 N\nS 40 -133 80 -33 0 1 10 N\nS 440 -133 480 -33 0 1 10 N\nS 580 133 620 33 0 1 10 N\nS 640 -133 680 -33 0 1 10 N\nS 780 133 820 33 0 1 10 N\nS 840 -133 880 -33 0 1 10 N\nP 2 0 1 0 -200 -200 -200 33 N\nP 2 0 1 0 -400 -200 -400 33 N\nP 2 0 1 0 -600 -200 -600 33 N\nP 2 0 1 0 -800 -200 -800 33 N\nP 2 0 1 0 -800 200 -800 133 N\nP 2 0 1 0 0 -200 0 33 N\nP 2 0 1 0 200 -200 200 33 N\nP 2 0 1 0 400 -200 400 33 N\nP 2 0 1 0 600 -200 600 33 N\nP 2 0 1 0 800 -200 800 33 N\nP 2 0 1 0 900 -166 900 200 N\nP 3 0 1 0 -140 -133 -140 -166 900 -166 N\nP 3 0 1 0 -200 0 -140 0 -140 -33 N\nP 3 0 1 0 -200 166 0 166 0 133 N\nP 3 0 1 0 -340 -133 -340 -166 900 -166 N\nP 3 0 1 0 -400 0 -340 0 -340 -33 N\nP 3 0 1 0 -400 166 -200 166 -200 133 N\nP 3 0 1 0 -540 -133 -540 -166 900 -166 N\nP 3 0 1 0 -600 0 -540 0 -540 -33 N\nP 3 0 1 0 -600 166 -400 166 -400 133 N\nP 3 0 1 0 -740 -133 -740 -166 900 -166 N\nP 3 0 1 0 -800 0 -740 0 -740 -33 N\nP 3 0 1 0 -800 166 -600 166 -600 133 N\nP 3 0 1 0 0 0 60 0 60 -33 N\nP 3 0 1 0 0 166 200 166 200 133 N\nP 3 0 1 0 200 0 260 0 260 -33 N\nP 3 0 1 0 200 166 400 166 400 133 N\nP 3 0 1 0 260 -133 260 -166 900 -166 N\nP 3 0 1 0 400 0 460 0 460 -33 N\nP 3 0 1 0 400 166 600 166 600 133 N\nP 3 0 1 0 460 -133 460 -166 900 -166 N\nP 3 0 1 0 60 -133 60 -166 900 -166 N\nP 3 0 1 0 600 0 660 0 660 -33 N\nP 3 0 1 0 600 166 800 166 800 133 N\nP 3 0 1 0 660 -133 660 -166 900 -166 N\nP 3 0 1 0 800 0 860 0 860 -33 N\nP 3 0 1 0 860 -133 860 -166 900 -166 N\nX COM1 1 -800 300 100 D 50 50 1 1 P\nX COM2 11 900 300 100 D 50 50 1 1 P\nX R1 2 -800 -300 100 U 50 50 1 1 P\nX R2 3 -600 -300 100 U 50 50 1 1 P\nX R3 4 -400 -300 100 U 50 50 1 1 P\nX R4 5 -200 -300 100 U 50 50 1 1 P\nX R5 6 0 -300 100 U 50 50 1 1 P\nX R6 7 200 -300 100 U 50 50 1 1 P\nX R7 8 400 -300 100 U 50 50 1 1 P\nX R8 9 600 -300 100 U 50 50 1 1 P\nX R9 10 800 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network_Dividers_x10_SIP\n#\nDEF R_Network_Dividers_x10_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -1100 0 50 V V C CNN\nF1 \"R_Network_Dividers_x10_SIP\" 1000 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP12\" 1075 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -1000 0 10 0 1 0 F\nC -1000 166 10 0 1 0 F\nC -140 -166 10 0 1 0 F\nC -200 0 10 0 1 0 F\nC -200 166 10 0 1 0 F\nC -340 -166 10 0 1 0 F\nC -400 0 10 0 1 0 F\nC -400 166 10 0 1 0 F\nC -540 -166 10 0 1 0 F\nC -600 0 10 0 1 0 F\nC -600 166 10 0 1 0 F\nC -740 -166 10 0 1 0 F\nC -800 0 10 0 1 0 F\nC -800 166 10 0 1 0 F\nC 0 0 10 0 1 0 F\nC 0 166 10 0 1 0 F\nC 200 0 10 0 1 0 F\nC 200 166 10 0 1 0 F\nC 260 -166 10 0 1 0 F\nC 400 0 10 0 1 0 F\nC 400 166 10 0 1 0 F\nC 460 -166 10 0 1 0 F\nC 60 -166 10 0 1 0 F\nC 600 0 10 0 1 0 F\nC 600 166 10 0 1 0 F\nC 660 -166 10 0 1 0 F\nC 800 0 10 0 1 0 F\nC 860 -166 10 0 1 0 F\nS -1020 133 -980 33 0 1 10 N\nS -1050 -200 950 200 0 1 10 f\nS -160 -133 -120 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nS -220 133 -180 33 0 1 10 N\nS -360 -133 -320 -33 0 1 10 N\nS -420 133 -380 33 0 1 10 N\nS -560 -133 -520 -33 0 1 10 N\nS -620 133 -580 33 0 1 10 N\nS -760 -133 -720 -33 0 1 10 N\nS -820 133 -780 33 0 1 10 N\nS -960 -133 -920 -33 0 1 10 N\nS 180 133 220 33 0 1 10 N\nS 240 -133 280 -33 0 1 10 N\nS 380 133 420 33 0 1 10 N\nS 40 -133 80 -33 0 1 10 N\nS 440 -133 480 -33 0 1 10 N\nS 580 133 620 33 0 1 10 N\nS 640 -133 680 -33 0 1 10 N\nS 780 133 820 33 0 1 10 N\nS 840 -133 880 -33 0 1 10 N\nP 2 0 1 0 -1000 -200 -1000 33 N\nP 2 0 1 0 -1000 200 -1000 133 N\nP 2 0 1 0 -200 -200 -200 33 N\nP 2 0 1 0 -400 -200 -400 33 N\nP 2 0 1 0 -600 -200 -600 33 N\nP 2 0 1 0 -800 -200 -800 33 N\nP 2 0 1 0 0 -200 0 33 N\nP 2 0 1 0 200 -200 200 33 N\nP 2 0 1 0 400 -200 400 33 N\nP 2 0 1 0 600 -200 600 33 N\nP 2 0 1 0 800 -200 800 33 N\nP 2 0 1 0 900 -166 900 200 N\nP 3 0 1 0 -1000 0 -940 0 -940 -33 N\nP 3 0 1 0 -1000 166 -800 166 -800 133 N\nP 3 0 1 0 -140 -133 -140 -166 900 -166 N\nP 3 0 1 0 -200 0 -140 0 -140 -33 N\nP 3 0 1 0 -200 166 0 166 0 133 N\nP 3 0 1 0 -340 -133 -340 -166 900 -166 N\nP 3 0 1 0 -400 0 -340 0 -340 -33 N\nP 3 0 1 0 -400 166 -200 166 -200 133 N\nP 3 0 1 0 -540 -133 -540 -166 900 -166 N\nP 3 0 1 0 -600 0 -540 0 -540 -33 N\nP 3 0 1 0 -600 166 -400 166 -400 133 N\nP 3 0 1 0 -740 -133 -740 -166 900 -166 N\nP 3 0 1 0 -800 0 -740 0 -740 -33 N\nP 3 0 1 0 -800 166 -600 166 -600 133 N\nP 3 0 1 0 -940 -133 -940 -166 900 -166 N\nP 3 0 1 0 0 0 60 0 60 -33 N\nP 3 0 1 0 0 166 200 166 200 133 N\nP 3 0 1 0 200 0 260 0 260 -33 N\nP 3 0 1 0 200 166 400 166 400 133 N\nP 3 0 1 0 260 -133 260 -166 900 -166 N\nP 3 0 1 0 400 0 460 0 460 -33 N\nP 3 0 1 0 400 166 600 166 600 133 N\nP 3 0 1 0 460 -133 460 -166 900 -166 N\nP 3 0 1 0 60 -133 60 -166 900 -166 N\nP 3 0 1 0 600 0 660 0 660 -33 N\nP 3 0 1 0 600 166 800 166 800 133 N\nP 3 0 1 0 660 -133 660 -166 900 -166 N\nP 3 0 1 0 800 0 860 0 860 -33 N\nP 3 0 1 0 860 -133 860 -166 900 -166 N\nX COM1 1 -1000 300 100 D 50 50 1 1 P\nX COM2 12 900 300 100 D 50 50 1 1 P\nX R1 2 -1000 -300 100 U 50 50 1 1 P\nX R10 11 800 -300 100 U 50 50 1 1 P\nX R2 3 -800 -300 100 U 50 50 1 1 P\nX R3 4 -600 -300 100 U 50 50 1 1 P\nX R4 5 -400 -300 100 U 50 50 1 1 P\nX R5 6 -200 -300 100 U 50 50 1 1 P\nX R6 7 0 -300 100 U 50 50 1 1 P\nX R7 8 200 -300 100 U 50 50 1 1 P\nX R8 9 400 -300 100 U 50 50 1 1 P\nX R9 10 600 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Network_Dividers_x11_SIP\n#\nDEF R_Network_Dividers_x11_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -1100 0 50 V V C CNN\nF1 \"R_Network_Dividers_x11_SIP\" 1200 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP13\" 1275 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nC -1000 0 10 0 1 0 F\nC -1000 166 10 0 1 0 F\nC -140 -166 10 0 1 0 F\nC -200 0 10 0 1 0 F\nC -200 166 10 0 1 0 F\nC -340 -166 10 0 1 0 F\nC -400 0 10 0 1 0 F\nC -400 166 10 0 1 0 F\nC -540 -166 10 0 1 0 F\nC -600 0 10 0 1 0 F\nC -600 166 10 0 1 0 F\nC -740 -166 10 0 1 0 F\nC -800 0 10 0 1 0 F\nC -800 166 10 0 1 0 F\nC 0 0 10 0 1 0 F\nC 0 166 10 0 1 0 F\nC 1000 0 10 0 1 0 F\nC 1060 -166 10 0 1 0 F\nC 200 0 10 0 1 0 F\nC 200 166 10 0 1 0 F\nC 260 -166 10 0 1 0 F\nC 400 0 10 0 1 0 F\nC 400 166 10 0 1 0 F\nC 460 -166 10 0 1 0 F\nC 60 -166 10 0 1 0 F\nC 600 0 10 0 1 0 F\nC 600 166 10 0 1 0 F\nC 660 -166 10 0 1 0 F\nC 800 0 10 0 1 0 F\nC 800 166 10 0 1 0 F\nC 860 -166 10 0 1 0 F\nS -1020 133 -980 33 0 1 10 N\nS -1050 -200 1150 200 0 1 10 f\nS -160 -133 -120 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nS -220 133 -180 33 0 1 10 N\nS -360 -133 -320 -33 0 1 10 N\nS -420 133 -380 33 0 1 10 N\nS -560 -133 -520 -33 0 1 10 N\nS -620 133 -580 33 0 1 10 N\nS -760 -133 -720 -33 0 1 10 N\nS -820 133 -780 33 0 1 10 N\nS -960 -133 -920 -33 0 1 10 N\nS 1040 -133 1080 -33 0 1 10 N\nS 180 133 220 33 0 1 10 N\nS 240 -133 280 -33 0 1 10 N\nS 380 133 420 33 0 1 10 N\nS 40 -133 80 -33 0 1 10 N\nS 440 -133 480 -33 0 1 10 N\nS 580 133 620 33 0 1 10 N\nS 640 -133 680 -33 0 1 10 N\nS 780 133 820 33 0 1 10 N\nS 840 -133 880 -33 0 1 10 N\nS 980 133 1020 33 0 1 10 N\nP 2 0 1 0 -1000 -200 -1000 33 N\nP 2 0 1 0 -1000 200 -1000 133 N\nP 2 0 1 0 -200 -200 -200 33 N\nP 2 0 1 0 -400 -200 -400 33 N\nP 2 0 1 0 -600 -200 -600 33 N\nP 2 0 1 0 -800 -200 -800 33 N\nP 2 0 1 0 0 -200 0 33 N\nP 2 0 1 0 1000 -200 1000 33 N\nP 2 0 1 0 1100 -166 1100 200 N\nP 2 0 1 0 200 -200 200 33 N\nP 2 0 1 0 400 -200 400 33 N\nP 2 0 1 0 600 -200 600 33 N\nP 2 0 1 0 800 -200 800 33 N\nP 3 0 1 0 -1000 0 -940 0 -940 -33 N\nP 3 0 1 0 -1000 166 -800 166 -800 133 N\nP 3 0 1 0 -140 -133 -140 -166 1100 -166 N\nP 3 0 1 0 -200 0 -140 0 -140 -33 N\nP 3 0 1 0 -200 166 0 166 0 133 N\nP 3 0 1 0 -340 -133 -340 -166 1100 -166 N\nP 3 0 1 0 -400 0 -340 0 -340 -33 N\nP 3 0 1 0 -400 166 -200 166 -200 133 N\nP 3 0 1 0 -540 -133 -540 -166 1100 -166 N\nP 3 0 1 0 -600 0 -540 0 -540 -33 N\nP 3 0 1 0 -600 166 -400 166 -400 133 N\nP 3 0 1 0 -740 -133 -740 -166 1100 -166 N\nP 3 0 1 0 -800 0 -740 0 -740 -33 N\nP 3 0 1 0 -800 166 -600 166 -600 133 N\nP 3 0 1 0 -940 -133 -940 -166 1100 -166 N\nP 3 0 1 0 0 0 60 0 60 -33 N\nP 3 0 1 0 0 166 200 166 200 133 N\nP 3 0 1 0 1000 0 1060 0 1060 -33 N\nP 3 0 1 0 1060 -133 1060 -166 1100 -166 N\nP 3 0 1 0 200 0 260 0 260 -33 N\nP 3 0 1 0 200 166 400 166 400 133 N\nP 3 0 1 0 260 -133 260 -166 1100 -166 N\nP 3 0 1 0 400 0 460 0 460 -33 N\nP 3 0 1 0 400 166 600 166 600 133 N\nP 3 0 1 0 460 -133 460 -166 1100 -166 N\nP 3 0 1 0 60 -133 60 -166 1100 -166 N\nP 3 0 1 0 600 0 660 0 660 -33 N\nP 3 0 1 0 600 166 800 166 800 133 N\nP 3 0 1 0 660 -133 660 -166 1100 -166 N\nP 3 0 1 0 800 0 860 0 860 -33 N\nP 3 0 1 0 800 166 1000 166 1000 133 N\nP 3 0 1 0 860 -133 860 -166 1100 -166 N\nX COM1 1 -1000 300 100 D 50 50 1 1 P\nX COM2 13 1100 300 100 D 50 50 1 1 P\nX R1 2 -1000 -300 100 U 50 50 1 1 P\nX R10 11 800 -300 100 U 50 50 1 1 P\nX R11 12 1000 -300 100 U 50 50 1 1 P\nX R2 3 -800 -300 100 U 50 50 1 1 P\nX R3 4 -600 -300 100 U 50 50 1 1 P\nX R4 5 -400 -300 100 U 50 50 1 1 P\nX R5 6 -200 -300 100 U 50 50 1 1 P\nX R6 7 0 -300 100 U 50 50 1 1 P\nX R7 8 200 -300 100 U 50 50 1 1 P\nX R8 9 400 -300 100 U 50 50 1 1 P\nX R9 10 600 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_PHOTO\n#\nDEF R_PHOTO R 0 0 N Y 1 F N\nF0 \"R\" 50 50 50 H V L CNN\nF1 \"R_PHOTO\" 50 0 50 H V L TNN\nF2 \"\" 50 -250 50 V I L CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n *LDR*\n R?LDR*\n$ENDFPLIST\nDRAW\nS -40 100 40 -100 0 1 10 N\nP 2 0 1 0 -60 -90 -160 10 N\nP 2 0 1 0 -60 -90 -90 -90 N\nP 2 0 1 0 -60 -90 -60 -60 N\nP 2 0 1 0 -60 -30 -160 70 N\nP 2 0 1 0 -60 -30 -90 -30 N\nP 2 0 1 0 -60 -30 -60 0 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_POT\n#\nDEF R_POT RV 0 40 Y N 1 F N\nF0 \"RV\" -175 0 50 V V C CNN\nF1 \"R_POT\" -100 0 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Potentiometer*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nP 2 0 1 0 100 0 60 0 N\nP 4 0 1 0 45 0 90 20 90 -20 45 0 F\nX 1 1 0 150 50 D 50 50 1 1 P\nX 2 2 150 0 50 L 50 50 1 1 P\nX 3 3 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_POT_Dual\n#\nDEF R_POT_Dual RV 0 40 Y N 1 F N\nF0 \"RV\" 0 150 50 H V C CNN\nF1 \"R_POT_Dual\" 0 75 50 H V C CNN\nF2 \"\" 250 -75 50 H I C CNN\nF3 \"\" 250 -75 50 H I C CNN\n$FPLIST\n Potentiometer*\n$ENDFPLIST\nDRAW\nS -350 -60 -150 -140 0 1 10 N\nS 150 -60 350 -140 0 1 10 N\nP 2 0 1 0 -250 0 -250 -40 N\nP 2 0 1 0 -250 0 -250 -40 N\nP 2 0 1 0 -250 0 -230 20 N\nP 2 0 1 0 -220 20 -200 20 N\nP 2 0 1 0 -180 20 -160 20 N\nP 2 0 1 0 -140 20 -120 20 N\nP 2 0 1 0 -100 20 -80 20 N\nP 2 0 1 0 -60 20 -40 20 N\nP 2 0 1 0 -20 20 0 20 N\nP 2 0 1 0 20 20 40 20 N\nP 2 0 1 0 60 20 80 20 N\nP 2 0 1 0 100 20 120 20 N\nP 2 0 1 0 140 20 160 20 N\nP 2 0 1 0 180 20 200 20 N\nP 2 0 1 0 220 20 240 20 N\nP 2 0 1 0 250 0 250 -40 N\nP 2 0 1 0 250 0 250 -40 N\nP 3 0 1 0 260 20 270 20 250 0 N\nP 4 0 1 0 -250 -55 -270 -10 -230 -10 -250 -55 F\nP 4 0 1 0 250 -55 230 -10 270 -10 250 -55 F\nX 1 1 -400 -100 50 R 50 50 1 1 P\nX 2 2 -250 100 100 D 50 50 1 1 P\nX 3 3 -100 -100 50 L 50 50 1 1 P\nX 4 4 100 -100 50 R 50 50 1 1 P\nX 5 5 250 100 100 D 50 50 1 1 P\nX 6 6 400 -100 50 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_POT_Dual_Separate\n#\nDEF R_POT_Dual_Separate RV 0 40 Y N 2 F N\nF0 \"RV\" -175 0 50 V V C CNN\nF1 \"R_POT_Dual_Separate\" -100 0 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Potentiometer*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nP 2 0 1 0 100 0 60 0 N\nP 4 0 1 0 45 0 90 20 90 -20 45 0 F\nX 1 1 0 150 50 D 50 50 1 1 P\nX 2 2 150 0 50 L 50 50 1 1 P\nX 3 3 0 -150 50 U 50 50 1 1 P\nX 4 4 0 150 50 D 50 50 2 1 P\nX 5 5 150 0 50 L 50 50 2 1 P\nX 6 6 0 -150 50 U 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# R_POT_MountingPin\n#\nDEF R_POT_MountingPin RV 0 40 Y N 1 F N\nF0 \"RV\" -325 0 50 V V C CNN\nF1 \"R_POT_MountingPin\" -250 0 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Potentiometer*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nP 2 0 1 0 100 0 60 0 N\nP 3 0 1 0 45 0 90 20 90 -20 F\nT 900 -65 0 15 0 1 1 Mounting Normal 0 C C\nP 2 1 1 6 -80 40 -80 -40 N\nX 1 1 0 150 50 D 50 50 1 1 P\nX 2 2 150 0 50 L 50 50 1 1 P\nX 3 3 0 -150 50 U 50 50 1 1 P\nX MountPin MP -200 0 120 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_POT_Small\n#\nDEF R_POT_Small RV 0 40 Y N 1 F N\nF0 \"RV\" -175 0 50 V V C CNN\nF1 \"R_POT_Small\" -100 0 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Potentiometer*\n$ENDFPLIST\nDRAW\nS 30 71 -30 -71 0 1 10 N\nP 6 0 1 0 35 0 25 0 65 15 65 -15 25 0 35 0 F\nX 1 1 0 100 25 D 25 25 1 1 P\nX 2 2 100 0 39 L 25 25 1 1 P\nX 3 3 0 -100 25 U 25 25 1 1 P\nENDDRAW\nENDDEF\n#\n# R_POT_TRIM\n#\nDEF R_POT_TRIM RV 0 40 Y N 1 F N\nF0 \"RV\" -175 0 50 V V C CNN\nF1 \"R_POT_TRIM\" -100 0 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Potentiometer*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nP 2 0 1 0 60 30 60 -30 N\nP 2 0 1 0 100 0 60 0 N\nX 1 1 0 150 50 D 50 50 1 1 P\nX 2 2 150 0 50 L 50 50 1 1 P\nX 3 3 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_POT_TRIM_US\n#\nDEF R_POT_TRIM_US RV 0 40 Y N 1 F N\nF0 \"RV\" -175 0 50 V V C CNN\nF1 \"R_POT_TRIM_US\" -100 0 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Potentiometer*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 0 -90 0 -100 N\nP 2 0 1 0 0 90 0 100 N\nP 2 0 1 0 60 30 60 -30 N\nP 2 0 1 0 100 0 60 0 N\nP 5 0 1 0 0 -30 40 -45 0 -60 -40 -75 0 -90 N\nP 5 0 1 0 0 30 40 15 0 0 -40 -15 0 -30 N\nP 5 0 1 0 0 90 40 75 0 60 -40 45 0 30 N\nX 1 1 0 150 50 D 50 50 1 1 P\nX 2 2 150 0 50 L 50 50 1 1 P\nX 3 3 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_POT_US\n#\nDEF R_POT_US RV 0 40 Y N 1 F N\nF0 \"RV\" -175 0 50 V V C CNN\nF1 \"R_POT_US\" -100 0 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Potentiometer*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 0 -90 0 -100 N\nP 2 0 1 0 0 100 0 90 N\nP 2 0 1 0 100 0 60 0 N\nP 4 0 1 0 45 0 90 20 90 -20 45 0 F\nP 5 0 1 0 0 -30 40 -45 0 -60 -40 -75 0 -90 N\nP 5 0 1 0 0 30 40 15 0 0 -40 -15 0 -30 N\nP 5 0 1 0 0 90 40 75 0 60 -40 45 0 30 N\nX 1 1 0 150 50 D 50 50 1 1 P\nX 2 2 150 0 50 L 50 50 1 1 P\nX 3 3 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack02\n#\nDEF R_Pack02 RN 0 0 Y N 1 F N\nF0 \"RN\" -200 0 50 V V C CNN\nF1 \"R_Pack02\" 100 0 50 V V C CNN\nF2 \"\" 175 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS -125 75 -75 -75 0 1 10 N\nS -150 -95 50 95 0 1 10 f\nS -25 75 25 -75 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -75 N\nP 2 0 1 0 -100 75 -100 100 N\nP 2 0 1 0 0 -100 0 -75 N\nP 2 0 1 0 0 75 0 100 N\nX R1.1 1 -100 -200 100 U 50 50 1 1 P\nX R1.2 4 -100 200 100 D 50 50 1 1 P\nX R2.1 2 0 -200 100 U 50 50 1 1 P\nX R2.2 3 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack02_SIP\n#\nDEF R_Pack02_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -300 0 50 V V C CNN\nF1 \"R_Pack02_SIP\" 300 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP4\" 375 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nS -230 110 -170 -50 0 1 10 N\nS -250 -75 250 175 0 1 10 f\nS 70 110 130 -50 0 1 10 N\nP 4 0 1 0 -200 110 -200 140 -100 140 -100 -50 N\nP 4 0 1 0 100 110 100 140 200 140 200 -50 N\nX R1.1 1 -200 -200 150 U 50 50 1 1 P\nX R1.2 2 -100 -200 150 U 50 50 1 1 P\nX R2.1 3 100 -200 150 U 50 50 1 1 P\nX R2.2 4 200 -200 150 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack02_SIP_Split\n#\nDEF R_Pack02_SIP_Split RN 0 0 Y N 2 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack02_SIP_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP4\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 2 0 150 50 D 50 50 1 1 P\nX R2.1 3 0 -150 50 U 50 50 2 1 P\nX R2.2 4 0 150 50 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack02_Split\n#\nDEF R_Pack02_Split RN 0 0 Y N 2 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack02_Split\" 0 0 50 V V C CNN\nF2 \"\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 4 0 150 50 D 50 50 1 1 P\nX R2.1 2 0 -150 50 U 50 50 2 1 P\nX R2.2 3 0 150 50 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack03\n#\nDEF R_Pack03 RN 0 0 Y N 1 F N\nF0 \"RN\" -200 0 50 V V C CNN\nF1 \"R_Pack03\" 200 0 50 V V C CNN\nF2 \"\" 275 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS -125 75 -75 -75 0 1 10 N\nS -150 -95 150 95 0 1 10 f\nS -25 75 25 -75 0 1 10 N\nS 75 75 125 -75 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -75 N\nP 2 0 1 0 -100 75 -100 100 N\nP 2 0 1 0 0 -100 0 -75 N\nP 2 0 1 0 0 75 0 100 N\nP 2 0 1 0 100 -100 100 -75 N\nP 2 0 1 0 100 75 100 100 N\nX R1.1 1 -100 -200 100 U 50 50 1 1 P\nX R1.2 6 -100 200 100 D 50 50 1 1 P\nX R2.1 2 0 -200 100 U 50 50 1 1 P\nX R2.2 5 0 200 100 D 50 50 1 1 P\nX R3.1 3 100 -200 100 U 50 50 1 1 P\nX R3.2 4 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack03_SIP\n#\nDEF R_Pack03_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -400 0 50 V V C CNN\nF1 \"R_Pack03_SIP\" 500 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP6\" 575 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nS -30 110 30 -50 0 1 10 N\nS -330 110 -270 -50 0 1 10 N\nS -350 -75 450 175 0 1 10 f\nS 270 110 330 -50 0 1 10 N\nP 4 0 1 0 -300 110 -300 140 -200 140 -200 -50 N\nP 4 0 1 0 0 110 0 140 100 140 100 -50 N\nP 4 0 1 0 300 110 300 140 400 140 400 -50 N\nX R1.1 1 -300 -200 150 U 50 50 1 1 P\nX R1.2 2 -200 -200 150 U 50 50 1 1 P\nX R2.1 3 0 -200 150 U 50 50 1 1 P\nX R2.2 4 100 -200 150 U 50 50 1 1 P\nX R3.1 5 300 -200 150 U 50 50 1 1 P\nX R3.2 6 400 -200 150 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack03_SIP_Split\n#\nDEF R_Pack03_SIP_Split RN 0 0 Y N 3 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack03_SIP_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP6\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 2 0 150 50 D 50 50 1 1 P\nX R2.1 3 0 -150 50 U 50 50 2 1 P\nX R2.2 4 0 150 50 D 50 50 2 1 P\nX R3.1 5 0 -150 50 U 50 50 3 1 P\nX R3.2 6 0 150 50 D 50 50 3 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack03_Split\n#\nDEF R_Pack03_Split RN 0 0 Y N 3 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack03_Split\" 0 0 50 V V C CNN\nF2 \"\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 6 0 150 50 D 50 50 1 1 P\nX R2.1 2 0 -150 50 U 50 50 2 1 P\nX R2.2 5 0 150 50 D 50 50 2 1 P\nX R3.1 3 0 -150 50 U 50 50 3 1 P\nX R3.2 4 0 150 50 D 50 50 3 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack04\n#\nDEF R_Pack04 RN 0 0 Y N 1 F N\nF0 \"RN\" -300 0 50 V V C CNN\nF1 \"R_Pack04\" 200 0 50 V V C CNN\nF2 \"\" 275 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS -125 75 -75 -75 0 1 10 N\nS -225 75 -175 -75 0 1 10 N\nS -25 75 25 -75 0 1 10 N\nS -250 -95 150 95 0 1 10 f\nS 75 75 125 -75 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -75 N\nP 2 0 1 0 -100 75 -100 100 N\nP 2 0 1 0 -200 -100 -200 -75 N\nP 2 0 1 0 -200 75 -200 100 N\nP 2 0 1 0 0 -100 0 -75 N\nP 2 0 1 0 0 75 0 100 N\nP 2 0 1 0 100 -100 100 -75 N\nP 2 0 1 0 100 75 100 100 N\nX R1.1 1 -200 -200 100 U 50 50 1 1 P\nX R1.2 8 -200 200 100 D 50 50 1 1 P\nX R2.1 2 -100 -200 100 U 50 50 1 1 P\nX R2.2 7 -100 200 100 D 50 50 1 1 P\nX R3.1 3 0 -200 100 U 50 50 1 1 P\nX R3.2 6 0 200 100 D 50 50 1 1 P\nX R4.1 4 100 -200 100 U 50 50 1 1 P\nX R4.2 5 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack04_SIP\n#\nDEF R_Pack04_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -600 0 50 V V C CNN\nF1 \"R_Pack04_SIP\" 600 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP8\" 675 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nS -230 110 -170 -50 0 1 10 N\nS -530 110 -470 -50 0 1 10 N\nS -550 -75 550 175 0 1 10 f\nS 370 110 430 -50 0 1 10 N\nS 70 110 130 -50 0 1 10 N\nP 4 0 1 0 -200 110 -200 140 -100 140 -100 -50 N\nP 4 0 1 0 -500 110 -500 140 -400 140 -400 -50 N\nP 4 0 1 0 100 110 100 140 200 140 200 -50 N\nP 4 0 1 0 400 110 400 140 500 140 500 -50 N\nX R1.1 1 -500 -200 150 U 50 50 1 1 P\nX R1.2 2 -400 -200 150 U 50 50 1 1 P\nX R2.1 3 -200 -200 150 U 50 50 1 1 P\nX R2.2 4 -100 -200 150 U 50 50 1 1 P\nX R3.1 5 100 -200 150 U 50 50 1 1 P\nX R3.2 6 200 -200 150 U 50 50 1 1 P\nX R4.1 7 400 -200 150 U 50 50 1 1 P\nX R4.2 8 500 -200 150 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack04_SIP_Split\n#\nDEF R_Pack04_SIP_Split RN 0 0 Y N 4 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack04_SIP_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP8\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 2 0 150 50 D 50 50 1 1 P\nX R2.1 3 0 -150 50 U 50 50 2 1 P\nX R2.2 4 0 150 50 D 50 50 2 1 P\nX R3.1 5 0 -150 50 U 50 50 3 1 P\nX R3.2 6 0 150 50 D 50 50 3 1 P\nX R4.1 7 0 -150 50 U 50 50 4 1 P\nX R4.2 8 0 150 50 D 50 50 4 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack04_Split\n#\nDEF R_Pack04_Split RN 0 0 Y N 4 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack04_Split\" 0 0 50 V V C CNN\nF2 \"\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 8 0 150 50 D 50 50 1 1 P\nX R2.1 2 0 -150 50 U 50 50 2 1 P\nX R2.2 7 0 150 50 D 50 50 2 1 P\nX R3.1 3 0 -150 50 U 50 50 3 1 P\nX R3.2 6 0 150 50 D 50 50 3 1 P\nX R4.1 4 0 -150 50 U 50 50 4 1 P\nX R4.2 5 0 150 50 D 50 50 4 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack05\n#\nDEF R_Pack05 RN 0 0 Y N 1 F N\nF0 \"RN\" -300 0 50 V V C CNN\nF1 \"R_Pack05\" 300 0 50 V V C CNN\nF2 \"\" 375 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS -125 75 -75 -75 0 1 10 N\nS -225 75 -175 -75 0 1 10 N\nS -25 75 25 -75 0 1 10 N\nS -250 -95 250 95 0 1 10 f\nS 175 75 225 -75 0 1 10 N\nS 75 75 125 -75 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -75 N\nP 2 0 1 0 -100 75 -100 100 N\nP 2 0 1 0 -200 -100 -200 -75 N\nP 2 0 1 0 -200 75 -200 100 N\nP 2 0 1 0 0 -100 0 -75 N\nP 2 0 1 0 0 75 0 100 N\nP 2 0 1 0 100 -100 100 -75 N\nP 2 0 1 0 100 75 100 100 N\nP 2 0 1 0 200 -100 200 -75 N\nP 2 0 1 0 200 75 200 100 N\nX R1.1 1 -200 -200 100 U 50 50 1 1 P\nX R1.2 10 -200 200 100 D 50 50 1 1 P\nX R2.1 2 -100 -200 100 U 50 50 1 1 P\nX R2.2 9 -100 200 100 D 50 50 1 1 P\nX R3.1 3 0 -200 100 U 50 50 1 1 P\nX R3.2 8 0 200 100 D 50 50 1 1 P\nX R4.1 4 100 -200 100 U 50 50 1 1 P\nX R4.2 7 100 200 100 D 50 50 1 1 P\nX R5.1 5 200 -200 100 U 50 50 1 1 P\nX R5.2 6 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack05_SIP\n#\nDEF R_Pack05_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -700 0 50 V V C CNN\nF1 \"R_Pack05_SIP\" 800 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP10\" 875 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nS -30 110 30 -50 0 1 10 N\nS -330 110 -270 -50 0 1 10 N\nS -630 110 -570 -50 0 1 10 N\nS -650 -75 750 175 0 1 10 f\nS 270 110 330 -50 0 1 10 N\nS 570 110 630 -50 0 1 10 N\nP 4 0 1 0 -300 110 -300 140 -200 140 -200 -50 N\nP 4 0 1 0 -600 110 -600 140 -500 140 -500 -50 N\nP 4 0 1 0 0 110 0 140 100 140 100 -50 N\nP 4 0 1 0 300 110 300 140 400 140 400 -50 N\nP 4 0 1 0 600 110 600 140 700 140 700 -50 N\nX R1.1 1 -600 -200 150 U 50 50 1 1 P\nX R1.2 2 -500 -200 150 U 50 50 1 1 P\nX R2.1 3 -300 -200 150 U 50 50 1 1 P\nX R2.2 4 -200 -200 150 U 50 50 1 1 P\nX R3.1 5 0 -200 150 U 50 50 1 1 P\nX R3.2 6 100 -200 150 U 50 50 1 1 P\nX R4.1 7 300 -200 150 U 50 50 1 1 P\nX R4.2 8 400 -200 150 U 50 50 1 1 P\nX R5.1 9 600 -200 150 U 50 50 1 1 P\nX R5.2 10 700 -200 150 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack05_SIP_Split\n#\nDEF R_Pack05_SIP_Split RN 0 0 Y N 5 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack05_SIP_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP10\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 2 0 150 50 D 50 50 1 1 P\nX R2.1 3 0 -150 50 U 50 50 2 1 P\nX R2.2 4 0 150 50 D 50 50 2 1 P\nX R3.1 5 0 -150 50 U 50 50 3 1 P\nX R3.2 6 0 150 50 D 50 50 3 1 P\nX R4.1 7 0 -150 50 U 50 50 4 1 P\nX R4.2 8 0 150 50 D 50 50 4 1 P\nX R5.1 9 0 -150 50 U 50 50 5 1 P\nX R5.2 10 0 150 50 D 50 50 5 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack05_Split\n#\nDEF R_Pack05_Split RN 0 0 Y N 5 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack05_Split\" 0 0 50 V V C CNN\nF2 \"\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 10 0 150 50 D 50 50 1 1 P\nX R2.1 2 0 -150 50 U 50 50 2 1 P\nX R2.2 9 0 150 50 D 50 50 2 1 P\nX R3.1 3 0 -150 50 U 50 50 3 1 P\nX R3.2 8 0 150 50 D 50 50 3 1 P\nX R4.1 4 0 -150 50 U 50 50 4 1 P\nX R4.2 7 0 150 50 D 50 50 4 1 P\nX R5.1 5 0 -150 50 U 50 50 5 1 P\nX R5.2 6 0 150 50 D 50 50 5 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack06\n#\nDEF R_Pack06 RN 0 0 Y N 1 F N\nF0 \"RN\" -400 0 50 V V C CNN\nF1 \"R_Pack06\" 300 0 50 V V C CNN\nF2 \"\" 375 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS -125 75 -75 -75 0 1 10 N\nS -225 75 -175 -75 0 1 10 N\nS -25 75 25 -75 0 1 10 N\nS -325 75 -275 -75 0 1 10 N\nS -350 -95 250 95 0 1 10 f\nS 175 75 225 -75 0 1 10 N\nS 75 75 125 -75 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -75 N\nP 2 0 1 0 -100 75 -100 100 N\nP 2 0 1 0 -200 -100 -200 -75 N\nP 2 0 1 0 -200 75 -200 100 N\nP 2 0 1 0 -300 -100 -300 -75 N\nP 2 0 1 0 -300 75 -300 100 N\nP 2 0 1 0 0 -100 0 -75 N\nP 2 0 1 0 0 75 0 100 N\nP 2 0 1 0 100 -100 100 -75 N\nP 2 0 1 0 100 75 100 100 N\nP 2 0 1 0 200 -100 200 -75 N\nP 2 0 1 0 200 75 200 100 N\nX R1.1 1 -300 -200 100 U 50 50 1 1 P\nX R1.2 12 -300 200 100 D 50 50 1 1 P\nX R2.1 2 -200 -200 100 U 50 50 1 1 P\nX R2.2 11 -200 200 100 D 50 50 1 1 P\nX R3.1 3 -100 -200 100 U 50 50 1 1 P\nX R3.2 10 -100 200 100 D 50 50 1 1 P\nX R4.1 4 0 -200 100 U 50 50 1 1 P\nX R4.2 9 0 200 100 D 50 50 1 1 P\nX R5.1 5 100 -200 100 U 50 50 1 1 P\nX R5.2 8 100 200 100 D 50 50 1 1 P\nX R6.1 6 200 -200 100 U 50 50 1 1 P\nX R6.2 7 200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack06_SIP\n#\nDEF R_Pack06_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -900 0 50 V V C CNN\nF1 \"R_Pack06_SIP\" 900 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP12\" 975 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nS -230 110 -170 -50 0 1 10 N\nS -530 110 -470 -50 0 1 10 N\nS -830 110 -770 -50 0 1 10 N\nS -850 -75 850 175 0 1 10 f\nS 370 110 430 -50 0 1 10 N\nS 670 110 730 -50 0 1 10 N\nS 70 110 130 -50 0 1 10 N\nP 4 0 1 0 -200 110 -200 140 -100 140 -100 -50 N\nP 4 0 1 0 -500 110 -500 140 -400 140 -400 -50 N\nP 4 0 1 0 -800 110 -800 140 -700 140 -700 -50 N\nP 4 0 1 0 100 110 100 140 200 140 200 -50 N\nP 4 0 1 0 400 110 400 140 500 140 500 -50 N\nP 4 0 1 0 700 110 700 140 800 140 800 -50 N\nX R1.1 1 -800 -200 150 U 50 50 1 1 P\nX R1.2 2 -700 -200 150 U 50 50 1 1 P\nX R2.1 3 -500 -200 150 U 50 50 1 1 P\nX R2.2 4 -400 -200 150 U 50 50 1 1 P\nX R3.1 5 -200 -200 150 U 50 50 1 1 P\nX R3.2 6 -100 -200 150 U 50 50 1 1 P\nX R4.1 7 100 -200 150 U 50 50 1 1 P\nX R4.2 8 200 -200 150 U 50 50 1 1 P\nX R5.1 9 400 -200 150 U 50 50 1 1 P\nX R5.2 10 500 -200 150 U 50 50 1 1 P\nX R6.1 11 700 -200 150 U 50 50 1 1 P\nX R6.2 12 800 -200 150 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack06_SIP_Split\n#\nDEF R_Pack06_SIP_Split RN 0 0 Y N 6 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack06_SIP_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP12\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 2 0 150 50 D 50 50 1 1 P\nX R2.1 3 0 -150 50 U 50 50 2 1 P\nX R2.2 4 0 150 50 D 50 50 2 1 P\nX R3.1 5 0 -150 50 U 50 50 3 1 P\nX R3.2 6 0 150 50 D 50 50 3 1 P\nX R4.1 7 0 -150 50 U 50 50 4 1 P\nX R4.2 8 0 150 50 D 50 50 4 1 P\nX R5.1 9 0 -150 50 U 50 50 5 1 P\nX R5.2 10 0 150 50 D 50 50 5 1 P\nX R6.1 11 0 -150 50 U 50 50 6 1 P\nX R6.2 12 0 150 50 D 50 50 6 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack06_Split\n#\nDEF R_Pack06_Split RN 0 0 Y N 6 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack06_Split\" 0 0 50 V V C CNN\nF2 \"\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 12 0 150 50 D 50 50 1 1 P\nX R2.1 2 0 -150 50 U 50 50 2 1 P\nX R2.2 11 0 150 50 D 50 50 2 1 P\nX R3.1 3 0 -150 50 U 50 50 3 1 P\nX R3.2 10 0 150 50 D 50 50 3 1 P\nX R4.1 4 0 -150 50 U 50 50 4 1 P\nX R4.2 9 0 150 50 D 50 50 4 1 P\nX R5.1 5 0 -150 50 U 50 50 5 1 P\nX R5.2 8 0 150 50 D 50 50 5 1 P\nX R6.1 6 0 -150 50 U 50 50 6 1 P\nX R6.2 7 0 150 50 D 50 50 6 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack07\n#\nDEF R_Pack07 RN 0 0 Y N 1 F N\nF0 \"RN\" -400 0 50 V V C CNN\nF1 \"R_Pack07\" 400 0 50 V V C CNN\nF2 \"\" 475 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS -125 75 -75 -75 0 1 10 N\nS -225 75 -175 -75 0 1 10 N\nS -25 75 25 -75 0 1 10 N\nS -325 75 -275 -75 0 1 10 N\nS -350 -95 350 95 0 1 10 f\nS 175 75 225 -75 0 1 10 N\nS 275 75 325 -75 0 1 10 N\nS 75 75 125 -75 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -75 N\nP 2 0 1 0 -100 75 -100 100 N\nP 2 0 1 0 -200 -100 -200 -75 N\nP 2 0 1 0 -200 75 -200 100 N\nP 2 0 1 0 -300 -100 -300 -75 N\nP 2 0 1 0 -300 75 -300 100 N\nP 2 0 1 0 0 -100 0 -75 N\nP 2 0 1 0 0 75 0 100 N\nP 2 0 1 0 100 -100 100 -75 N\nP 2 0 1 0 100 75 100 100 N\nP 2 0 1 0 200 -100 200 -75 N\nP 2 0 1 0 200 75 200 100 N\nP 2 0 1 0 300 -100 300 -75 N\nP 2 0 1 0 300 75 300 100 N\nX R1.1 1 -300 -200 100 U 50 50 1 1 P\nX R1.2 14 -300 200 100 D 50 50 1 1 P\nX R2.1 2 -200 -200 100 U 50 50 1 1 P\nX R2.2 13 -200 200 100 D 50 50 1 1 P\nX R3.1 3 -100 -200 100 U 50 50 1 1 P\nX R3.2 12 -100 200 100 D 50 50 1 1 P\nX R4.1 4 0 -200 100 U 50 50 1 1 P\nX R4.2 11 0 200 100 D 50 50 1 1 P\nX R5.1 5 100 -200 100 U 50 50 1 1 P\nX R5.2 10 100 200 100 D 50 50 1 1 P\nX R6.1 6 200 -200 100 U 50 50 1 1 P\nX R6.2 9 200 200 100 D 50 50 1 1 P\nX R7.1 7 300 -200 100 U 50 50 1 1 P\nX R7.2 8 300 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack07_SIP\n#\nDEF R_Pack07_SIP RN 0 0 Y N 1 F N\nF0 \"RN\" -1000 0 50 V V C CNN\nF1 \"R_Pack07_SIP\" 1100 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP14\" 1175 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nS -30 110 30 -50 0 1 10 N\nS -330 110 -270 -50 0 1 10 N\nS -630 110 -570 -50 0 1 10 N\nS -930 110 -870 -50 0 1 10 N\nS -950 -75 1050 175 0 1 10 f\nS 270 110 330 -50 0 1 10 N\nS 570 110 630 -50 0 1 10 N\nS 870 110 930 -50 0 1 10 N\nP 4 0 1 0 -300 110 -300 140 -200 140 -200 -50 N\nP 4 0 1 0 -600 110 -600 140 -500 140 -500 -50 N\nP 4 0 1 0 -900 110 -900 140 -800 140 -800 -50 N\nP 4 0 1 0 0 110 0 140 100 140 100 -50 N\nP 4 0 1 0 300 110 300 140 400 140 400 -50 N\nP 4 0 1 0 600 110 600 140 700 140 700 -50 N\nP 4 0 1 0 900 110 900 140 1000 140 1000 -50 N\nX R1.1 1 -900 -200 150 U 50 50 1 1 P\nX R1.2 2 -800 -200 150 U 50 50 1 1 P\nX R2.1 3 -600 -200 150 U 50 50 1 1 P\nX R2.2 4 -500 -200 150 U 50 50 1 1 P\nX R3.1 5 -300 -200 150 U 50 50 1 1 P\nX R3.2 6 -200 -200 150 U 50 50 1 1 P\nX R4.1 7 0 -200 150 U 50 50 1 1 P\nX R4.2 8 100 -200 150 U 50 50 1 1 P\nX R5.1 9 300 -200 150 U 50 50 1 1 P\nX R5.2 10 400 -200 150 U 50 50 1 1 P\nX R6.1 11 600 -200 150 U 50 50 1 1 P\nX R6.2 12 700 -200 150 U 50 50 1 1 P\nX R7.1 13 900 -200 150 U 50 50 1 1 P\nX R7.2 14 1000 -200 150 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack07_SIP_Split\n#\nDEF R_Pack07_SIP_Split RN 0 0 Y N 7 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack07_SIP_Split\" 0 0 50 V V C CNN\nF2 \"Resistor_THT:R_Array_SIP14\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 2 0 150 50 D 50 50 1 1 P\nX R2.1 3 0 -150 50 U 50 50 2 1 P\nX R2.2 4 0 150 50 D 50 50 2 1 P\nX R3.1 5 0 -150 50 U 50 50 3 1 P\nX R3.2 6 0 150 50 D 50 50 3 1 P\nX R4.1 7 0 -150 50 U 50 50 4 1 P\nX R4.2 8 0 150 50 D 50 50 4 1 P\nX R5.1 9 0 -150 50 U 50 50 5 1 P\nX R5.2 10 0 150 50 D 50 50 5 1 P\nX R6.1 11 0 -150 50 U 50 50 6 1 P\nX R6.2 12 0 150 50 D 50 50 6 1 P\nX R7.1 13 0 -150 50 U 50 50 7 1 P\nX R7.2 14 0 150 50 D 50 50 7 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack07_Split\n#\nDEF R_Pack07_Split RN 0 0 Y N 7 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack07_Split\" 0 0 50 V V C CNN\nF2 \"\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 14 0 150 50 D 50 50 1 1 P\nX R2.1 2 0 -150 50 U 50 50 2 1 P\nX R2.2 13 0 150 50 D 50 50 2 1 P\nX R3.1 3 0 -150 50 U 50 50 3 1 P\nX R3.2 12 0 150 50 D 50 50 3 1 P\nX R4.1 4 0 -150 50 U 50 50 4 1 P\nX R4.2 11 0 150 50 D 50 50 4 1 P\nX R5.1 5 0 -150 50 U 50 50 5 1 P\nX R5.2 10 0 150 50 D 50 50 5 1 P\nX R6.1 6 0 -150 50 U 50 50 6 1 P\nX R6.2 9 0 150 50 D 50 50 6 1 P\nX R7.1 7 0 -150 50 U 50 50 7 1 P\nX R7.2 8 0 150 50 D 50 50 7 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack08\n#\nDEF R_Pack08 RN 0 0 Y N 1 F N\nF0 \"RN\" -500 0 50 V V C CNN\nF1 \"R_Pack08\" 400 0 50 V V C CNN\nF2 \"\" 475 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS -125 75 -75 -75 0 1 10 N\nS -225 75 -175 -75 0 1 10 N\nS -25 75 25 -75 0 1 10 N\nS -325 75 -275 -75 0 1 10 N\nS -425 75 -375 -75 0 1 10 N\nS -450 -95 350 95 0 1 10 f\nS 175 75 225 -75 0 1 10 N\nS 275 75 325 -75 0 1 10 N\nS 75 75 125 -75 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -75 N\nP 2 0 1 0 -100 75 -100 100 N\nP 2 0 1 0 -200 -100 -200 -75 N\nP 2 0 1 0 -200 75 -200 100 N\nP 2 0 1 0 -300 -100 -300 -75 N\nP 2 0 1 0 -300 75 -300 100 N\nP 2 0 1 0 -400 -100 -400 -75 N\nP 2 0 1 0 -400 75 -400 100 N\nP 2 0 1 0 0 -100 0 -75 N\nP 2 0 1 0 0 75 0 100 N\nP 2 0 1 0 100 -100 100 -75 N\nP 2 0 1 0 100 75 100 100 N\nP 2 0 1 0 200 -100 200 -75 N\nP 2 0 1 0 200 75 200 100 N\nP 2 0 1 0 300 -100 300 -75 N\nP 2 0 1 0 300 75 300 100 N\nX R1.1 1 -400 -200 100 U 50 50 1 1 P\nX R1.2 16 -400 200 100 D 50 50 1 1 P\nX R2.1 2 -300 -200 100 U 50 50 1 1 P\nX R2.2 15 -300 200 100 D 50 50 1 1 P\nX R3.1 3 -200 -200 100 U 50 50 1 1 P\nX R3.2 14 -200 200 100 D 50 50 1 1 P\nX R4.1 4 -100 -200 100 U 50 50 1 1 P\nX R4.2 13 -100 200 100 D 50 50 1 1 P\nX R5.1 5 0 -200 100 U 50 50 1 1 P\nX R5.2 12 0 200 100 D 50 50 1 1 P\nX R6.1 6 100 -200 100 U 50 50 1 1 P\nX R6.2 11 100 200 100 D 50 50 1 1 P\nX R7.1 7 200 -200 100 U 50 50 1 1 P\nX R7.2 10 200 200 100 D 50 50 1 1 P\nX R8.1 8 300 -200 100 U 50 50 1 1 P\nX R8.2 9 300 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack08_Split\n#\nDEF R_Pack08_Split RN 0 0 Y N 8 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack08_Split\" 0 0 50 V V C CNN\nF2 \"\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 16 0 150 50 D 50 50 1 1 P\nX R2.1 2 0 -150 50 U 50 50 2 1 P\nX R2.2 15 0 150 50 D 50 50 2 1 P\nX R3.1 3 0 -150 50 U 50 50 3 1 P\nX R3.2 14 0 150 50 D 50 50 3 1 P\nX R4.1 4 0 -150 50 U 50 50 4 1 P\nX R4.2 13 0 150 50 D 50 50 4 1 P\nX R5.1 5 0 -150 50 U 50 50 5 1 P\nX R5.2 12 0 150 50 D 50 50 5 1 P\nX R6.1 6 0 -150 50 U 50 50 6 1 P\nX R6.2 11 0 150 50 D 50 50 6 1 P\nX R7.1 7 0 -150 50 U 50 50 7 1 P\nX R7.2 10 0 150 50 D 50 50 7 1 P\nX R8.1 8 0 -150 50 U 50 50 8 1 P\nX R8.2 9 0 150 50 D 50 50 8 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack09\n#\nDEF R_Pack09 RN 0 0 Y N 1 F N\nF0 \"RN\" -500 0 50 V V C CNN\nF1 \"R_Pack09\" 500 0 50 V V C CNN\nF2 \"\" 575 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS -125 75 -75 -75 0 1 10 N\nS -225 75 -175 -75 0 1 10 N\nS -25 75 25 -75 0 1 10 N\nS -325 75 -275 -75 0 1 10 N\nS -425 75 -375 -75 0 1 10 N\nS -450 -95 450 95 0 1 10 f\nS 175 75 225 -75 0 1 10 N\nS 275 75 325 -75 0 1 10 N\nS 375 75 425 -75 0 1 10 N\nS 75 75 125 -75 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -75 N\nP 2 0 1 0 -100 75 -100 100 N\nP 2 0 1 0 -200 -100 -200 -75 N\nP 2 0 1 0 -200 75 -200 100 N\nP 2 0 1 0 -300 -100 -300 -75 N\nP 2 0 1 0 -300 75 -300 100 N\nP 2 0 1 0 -400 -100 -400 -75 N\nP 2 0 1 0 -400 75 -400 100 N\nP 2 0 1 0 0 -100 0 -75 N\nP 2 0 1 0 0 75 0 100 N\nP 2 0 1 0 100 -100 100 -75 N\nP 2 0 1 0 100 75 100 100 N\nP 2 0 1 0 200 -100 200 -75 N\nP 2 0 1 0 200 75 200 100 N\nP 2 0 1 0 300 -100 300 -75 N\nP 2 0 1 0 300 75 300 100 N\nP 2 0 1 0 400 -100 400 -75 N\nP 2 0 1 0 400 75 400 100 N\nX R1.1 1 -400 -200 100 U 50 50 1 1 P\nX R1.2 18 -400 200 100 D 50 50 1 1 P\nX R2.1 2 -300 -200 100 U 50 50 1 1 P\nX R2.2 17 -300 200 100 D 50 50 1 1 P\nX R3.1 3 -200 -200 100 U 50 50 1 1 P\nX R3.2 16 -200 200 100 D 50 50 1 1 P\nX R4.1 4 -100 -200 100 U 50 50 1 1 P\nX R4.2 15 -100 200 100 D 50 50 1 1 P\nX R5.1 5 0 -200 100 U 50 50 1 1 P\nX R5.2 14 0 200 100 D 50 50 1 1 P\nX R6.1 6 100 -200 100 U 50 50 1 1 P\nX R6.2 13 100 200 100 D 50 50 1 1 P\nX R7.1 7 200 -200 100 U 50 50 1 1 P\nX R7.2 12 200 200 100 D 50 50 1 1 P\nX R8.1 8 300 -200 100 U 50 50 1 1 P\nX R8.2 11 300 200 100 D 50 50 1 1 P\nX R9.1 9 400 -200 100 U 50 50 1 1 P\nX R9.2 10 400 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack09_Split\n#\nDEF R_Pack09_Split RN 0 0 Y N 9 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack09_Split\" 0 0 50 V V C CNN\nF2 \"\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 18 0 150 50 D 50 50 1 1 P\nX R2.1 2 0 -150 50 U 50 50 2 1 P\nX R2.2 17 0 150 50 D 50 50 2 1 P\nX R3.1 3 0 -150 50 U 50 50 3 1 P\nX R3.2 16 0 150 50 D 50 50 3 1 P\nX R4.1 4 0 -150 50 U 50 50 4 1 P\nX R4.2 15 0 150 50 D 50 50 4 1 P\nX R5.1 5 0 -150 50 U 50 50 5 1 P\nX R5.2 14 0 150 50 D 50 50 5 1 P\nX R6.1 6 0 -150 50 U 50 50 6 1 P\nX R6.2 13 0 150 50 D 50 50 6 1 P\nX R7.1 7 0 -150 50 U 50 50 7 1 P\nX R7.2 12 0 150 50 D 50 50 7 1 P\nX R8.1 8 0 -150 50 U 50 50 8 1 P\nX R8.2 11 0 150 50 D 50 50 8 1 P\nX R9.1 9 0 -150 50 U 50 50 9 1 P\nX R9.2 10 0 150 50 D 50 50 9 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack10\n#\nDEF R_Pack10 RN 0 0 Y N 1 F N\nF0 \"RN\" -600 0 50 V V C CNN\nF1 \"R_Pack10\" 500 0 50 V V C CNN\nF2 \"\" 575 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS -125 75 -75 -75 0 1 10 N\nS -225 75 -175 -75 0 1 10 N\nS -25 75 25 -75 0 1 10 N\nS -325 75 -275 -75 0 1 10 N\nS -425 75 -375 -75 0 1 10 N\nS -525 75 -475 -75 0 1 10 N\nS -550 -95 450 95 0 1 10 f\nS 175 75 225 -75 0 1 10 N\nS 275 75 325 -75 0 1 10 N\nS 375 75 425 -75 0 1 10 N\nS 75 75 125 -75 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -75 N\nP 2 0 1 0 -100 75 -100 100 N\nP 2 0 1 0 -200 -100 -200 -75 N\nP 2 0 1 0 -200 75 -200 100 N\nP 2 0 1 0 -300 -100 -300 -75 N\nP 2 0 1 0 -300 75 -300 100 N\nP 2 0 1 0 -400 -100 -400 -75 N\nP 2 0 1 0 -400 75 -400 100 N\nP 2 0 1 0 -500 -100 -500 -75 N\nP 2 0 1 0 -500 75 -500 100 N\nP 2 0 1 0 0 -100 0 -75 N\nP 2 0 1 0 0 75 0 100 N\nP 2 0 1 0 100 -100 100 -75 N\nP 2 0 1 0 100 75 100 100 N\nP 2 0 1 0 200 -100 200 -75 N\nP 2 0 1 0 200 75 200 100 N\nP 2 0 1 0 300 -100 300 -75 N\nP 2 0 1 0 300 75 300 100 N\nP 2 0 1 0 400 -100 400 -75 N\nP 2 0 1 0 400 75 400 100 N\nX R1.1 1 -500 -200 100 U 50 50 1 1 P\nX R1.2 20 -500 200 100 D 50 50 1 1 P\nX R10.1 10 400 -200 100 U 50 50 1 1 P\nX R10.2 11 400 200 100 D 50 50 1 1 P\nX R2.1 2 -400 -200 100 U 50 50 1 1 P\nX R2.2 19 -400 200 100 D 50 50 1 1 P\nX R3.1 3 -300 -200 100 U 50 50 1 1 P\nX R3.2 18 -300 200 100 D 50 50 1 1 P\nX R4.1 4 -200 -200 100 U 50 50 1 1 P\nX R4.2 17 -200 200 100 D 50 50 1 1 P\nX R5.1 5 -100 -200 100 U 50 50 1 1 P\nX R5.2 16 -100 200 100 D 50 50 1 1 P\nX R6.1 6 0 -200 100 U 50 50 1 1 P\nX R6.2 15 0 200 100 D 50 50 1 1 P\nX R7.1 7 100 -200 100 U 50 50 1 1 P\nX R7.2 14 100 200 100 D 50 50 1 1 P\nX R8.1 8 200 -200 100 U 50 50 1 1 P\nX R8.2 13 200 200 100 D 50 50 1 1 P\nX R9.1 9 300 -200 100 U 50 50 1 1 P\nX R9.2 12 300 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack10_Split\n#\nDEF R_Pack10_Split RN 0 0 Y N 10 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack10_Split\" 0 0 50 V V C CNN\nF2 \"\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 20 0 150 50 D 50 50 1 1 P\nX R10.1 10 0 -150 50 U 50 50 10 1 P\nX R10.2 11 0 150 50 D 50 50 10 1 P\nX R2.1 2 0 -150 50 U 50 50 2 1 P\nX R2.2 19 0 150 50 D 50 50 2 1 P\nX R3.1 3 0 -150 50 U 50 50 3 1 P\nX R3.2 18 0 150 50 D 50 50 3 1 P\nX R4.1 4 0 -150 50 U 50 50 4 1 P\nX R4.2 17 0 150 50 D 50 50 4 1 P\nX R5.1 5 0 -150 50 U 50 50 5 1 P\nX R5.2 16 0 150 50 D 50 50 5 1 P\nX R6.1 6 0 -150 50 U 50 50 6 1 P\nX R6.2 15 0 150 50 D 50 50 6 1 P\nX R7.1 7 0 -150 50 U 50 50 7 1 P\nX R7.2 14 0 150 50 D 50 50 7 1 P\nX R8.1 8 0 -150 50 U 50 50 8 1 P\nX R8.2 13 0 150 50 D 50 50 8 1 P\nX R9.1 9 0 -150 50 U 50 50 9 1 P\nX R9.2 12 0 150 50 D 50 50 9 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack11\n#\nDEF R_Pack11 RN 0 0 Y N 1 F N\nF0 \"RN\" -600 0 50 V V C CNN\nF1 \"R_Pack11\" 600 0 50 V V C CNN\nF2 \"\" 675 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS -125 75 -75 -75 0 1 10 N\nS -225 75 -175 -75 0 1 10 N\nS -25 75 25 -75 0 1 10 N\nS -325 75 -275 -75 0 1 10 N\nS -425 75 -375 -75 0 1 10 N\nS -525 75 -475 -75 0 1 10 N\nS -550 -95 550 95 0 1 10 f\nS 175 75 225 -75 0 1 10 N\nS 275 75 325 -75 0 1 10 N\nS 375 75 425 -75 0 1 10 N\nS 475 75 525 -75 0 1 10 N\nS 75 75 125 -75 0 1 10 N\nP 2 0 1 0 -100 -100 -100 -75 N\nP 2 0 1 0 -100 75 -100 100 N\nP 2 0 1 0 -200 -100 -200 -75 N\nP 2 0 1 0 -200 75 -200 100 N\nP 2 0 1 0 -300 -100 -300 -75 N\nP 2 0 1 0 -300 75 -300 100 N\nP 2 0 1 0 -400 -100 -400 -75 N\nP 2 0 1 0 -400 75 -400 100 N\nP 2 0 1 0 -500 -100 -500 -75 N\nP 2 0 1 0 -500 75 -500 100 N\nP 2 0 1 0 0 -100 0 -75 N\nP 2 0 1 0 0 75 0 100 N\nP 2 0 1 0 100 -100 100 -75 N\nP 2 0 1 0 100 75 100 100 N\nP 2 0 1 0 200 -100 200 -75 N\nP 2 0 1 0 200 75 200 100 N\nP 2 0 1 0 300 -100 300 -75 N\nP 2 0 1 0 300 75 300 100 N\nP 2 0 1 0 400 -100 400 -75 N\nP 2 0 1 0 400 75 400 100 N\nP 2 0 1 0 500 -100 500 -75 N\nP 2 0 1 0 500 75 500 100 N\nX R1.1 1 -500 -200 100 U 50 50 1 1 P\nX R1.2 22 -500 200 100 D 50 50 1 1 P\nX R10.1 10 400 -200 100 U 50 50 1 1 P\nX R10.2 13 400 200 100 D 50 50 1 1 P\nX R11.1 11 500 -200 100 U 50 50 1 1 P\nX R11.2 12 500 200 100 D 50 50 1 1 P\nX R2.1 2 -400 -200 100 U 50 50 1 1 P\nX R2.2 21 -400 200 100 D 50 50 1 1 P\nX R3.1 3 -300 -200 100 U 50 50 1 1 P\nX R3.2 20 -300 200 100 D 50 50 1 1 P\nX R4.1 4 -200 -200 100 U 50 50 1 1 P\nX R4.2 19 -200 200 100 D 50 50 1 1 P\nX R5.1 5 -100 -200 100 U 50 50 1 1 P\nX R5.2 18 -100 200 100 D 50 50 1 1 P\nX R6.1 6 0 -200 100 U 50 50 1 1 P\nX R6.2 17 0 200 100 D 50 50 1 1 P\nX R7.1 7 100 -200 100 U 50 50 1 1 P\nX R7.2 16 100 200 100 D 50 50 1 1 P\nX R8.1 8 200 -200 100 U 50 50 1 1 P\nX R8.2 15 200 200 100 D 50 50 1 1 P\nX R9.1 9 300 -200 100 U 50 50 1 1 P\nX R9.2 14 300 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Pack11_Split\n#\nDEF R_Pack11_Split RN 0 0 Y N 11 F N\nF0 \"RN\" 80 0 50 V V C CNN\nF1 \"R_Pack11_Split\" 0 0 50 V V C CNN\nF2 \"\" -80 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n DIP*\n SOIC*\n R*Array*Concave*\n R*Array*Convex*\n$ENDFPLIST\nDRAW\nS 40 100 -40 -100 0 1 10 N\nX R1.1 1 0 -150 50 U 50 50 1 1 P\nX R1.2 22 0 150 50 D 50 50 1 1 P\nX R10.1 10 0 -150 50 U 50 50 10 1 P\nX R10.2 13 0 150 50 D 50 50 10 1 P\nX R11.1 11 0 -150 50 U 50 50 11 1 P\nX R11.2 12 0 150 50 D 50 50 11 1 P\nX R2.1 2 0 -150 50 U 50 50 2 1 P\nX R2.2 21 0 150 50 D 50 50 2 1 P\nX R3.1 3 0 -150 50 U 50 50 3 1 P\nX R3.2 20 0 150 50 D 50 50 3 1 P\nX R4.1 4 0 -150 50 U 50 50 4 1 P\nX R4.2 19 0 150 50 D 50 50 4 1 P\nX R5.1 5 0 -150 50 U 50 50 5 1 P\nX R5.2 18 0 150 50 D 50 50 5 1 P\nX R6.1 6 0 -150 50 U 50 50 6 1 P\nX R6.2 17 0 150 50 D 50 50 6 1 P\nX R7.1 7 0 -150 50 U 50 50 7 1 P\nX R7.2 16 0 150 50 D 50 50 7 1 P\nX R8.1 8 0 -150 50 U 50 50 8 1 P\nX R8.2 15 0 150 50 D 50 50 8 1 P\nX R9.1 9 0 -150 50 U 50 50 9 1 P\nX R9.2 14 0 150 50 D 50 50 9 1 P\nENDDRAW\nENDDEF\n#\n# R_Shunt\n#\nDEF R_Shunt R 0 0 N Y 1 F N\nF0 \"R\" -175 0 50 V V C CNN\nF1 \"R_Shunt\" -100 0 50 V V C CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R_*Shunt*\n$ENDFPLIST\nDRAW\nS -40 -100 40 100 0 1 10 N\nP 2 0 1 0 0 -100 50 -100 N\nP 2 0 1 0 50 100 0 100 N\nX 1 1 0 200 100 D 50 50 1 1 P\nX 2 2 150 100 100 L 50 50 1 1 P\nX 3 3 150 -100 100 L 50 50 1 1 P\nX 4 4 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Shunt_US\n#\nDEF R_Shunt_US R 0 0 N Y 1 F N\nF0 \"R\" -200 0 50 V V C CNN\nF1 \"R_Shunt_US\" -120 0 50 V V C CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R_*Shunt*\n$ENDFPLIST\nDRAW\nP 2 1 1 0 0 -100 50 -100 N\nP 2 1 1 0 0 -90 0 -100 N\nP 2 1 1 0 0 90 0 100 N\nP 2 1 1 0 50 100 0 100 N\nP 5 1 1 0 0 -30 40 -45 0 -60 -40 -75 0 -90 N\nP 5 1 1 0 0 30 40 15 0 0 -40 -15 0 -30 N\nP 5 1 1 0 0 90 40 75 0 60 -40 45 0 30 N\nX 1 1 0 200 100 D 50 50 1 1 P\nX 2 2 150 100 100 L 50 50 1 1 P\nX 3 3 150 -100 100 L 50 50 1 1 P\nX 4 4 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Small\n#\nDEF R_Small R 0 10 N N 1 F N\nF0 \"R\" 30 20 50 H V L CNN\nF1 \"R_Small\" 30 -40 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R_*\n$ENDFPLIST\nDRAW\nS -30 70 30 -70 0 1 8 N\nX ~ 1 0 100 30 D 50 50 1 1 P\nX ~ 2 0 -100 30 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Small_US\n#\nDEF R_Small_US R 0 10 N N 1 F N\nF0 \"R\" 30 20 50 H V L CNN\nF1 \"R_Small_US\" 30 -40 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R_*\n$ENDFPLIST\nDRAW\nP 5 1 1 0 0 0 40 -15 0 -30 -40 -45 0 -60 N\nP 5 1 1 0 0 60 40 45 0 30 -40 15 0 0 N\nX ~ 1 0 100 40 D 50 50 1 1 P\nX ~ 2 0 -100 40 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_US\n#\nDEF R_US R 0 0 N Y 1 F N\nF0 \"R\" 100 0 50 V V C CNN\nF1 \"R_US\" -100 0 50 V V C CNN\nF2 \"\" 40 -10 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 0 -90 0 -100 N\nP 2 0 1 0 0 90 0 100 N\nP 5 0 1 0 0 -30 40 -45 0 -60 -40 -75 0 -90 N\nP 5 0 1 0 0 30 40 15 0 0 -40 -15 0 -30 N\nP 5 0 1 0 0 90 40 75 0 60 -40 45 0 30 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Variable\n#\nDEF R_Variable R 0 0 N Y 1 F N\nF0 \"R\" 100 -100 50 V V L CNN\nF1 \"R_Variable\" -100 -50 50 V V L CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R_*\n$ENDFPLIST\nDRAW\nS -40 -100 40 100 0 1 10 N\nP 5 0 1 0 100 60 100 100 60 100 100 100 -80 -80 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# R_Variable_US\n#\nDEF R_Variable_US R 0 0 N Y 1 F N\nF0 \"R\" 100 -100 50 V V L CNN\nF1 \"R_Variable_US\" -100 -50 50 V V L CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 0 -90 0 -100 N\nP 2 0 1 0 0 90 0 100 N\nP 5 0 1 0 0 -30 40 -45 0 -60 -40 -75 0 -90 N\nP 5 0 1 0 0 30 40 15 0 0 -40 -15 0 -30 N\nP 5 0 1 6 0 90 40 75 0 60 -40 45 0 30 N\nP 5 0 1 6 90 60 100 100 60 90 100 100 -80 -80 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Resonator\n#\nDEF Resonator Y 0 40 Y N 1 F N\nF0 \"Y\" 0 225 50 H V C CNN\nF1 \"Resonator\" 0 150 50 H V C CNN\nF2 \"\" -25 0 50 H I C CNN\nF3 \"\" -25 0 50 H I C CNN\n$FPLIST\n Filter*\n Resonator*\n$ENDFPLIST\nDRAW\nC -95 0 10 0 1 0 F\nC 0 -150 10 0 1 0 F\nC 95 0 10 0 1 0 F\nS -135 -125 -55 -135 0 1 0 F\nS -135 -95 -55 -105 0 1 0 F\nS -40 80 40 -80 0 1 12 N\nS 55 -125 135 -135 0 1 0 F\nS 55 -95 135 -105 0 1 0 F\nP 2 0 1 0 -95 -95 -95 0 N\nP 2 0 1 0 -75 0 -125 0 N\nP 2 0 1 20 -70 -50 -70 50 N\nP 2 0 1 20 70 -50 70 50 N\nP 2 0 1 0 75 0 100 0 N\nP 2 0 1 0 95 0 95 -100 N\nP 4 0 1 0 95 -130 95 -150 -95 -150 -95 -130 N\nX 1 1 -150 0 50 R 50 50 1 1 P\nX 2 2 0 -200 50 U 50 50 1 1 P\nX 3 3 150 0 50 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Resonator_Small\n#\nDEF Resonator_Small Y 0 40 Y N 1 F N\nF0 \"Y\" 125 75 50 H V L CNN\nF1 \"Resonator_Small\" 125 0 50 H V L CNN\nF2 \"\" -25 0 50 H I C CNN\nF3 \"\" -25 0 50 H I C CNN\n$FPLIST\n Filter*\n Resonator*\n$ENDFPLIST\nDRAW\nC -100 0 10 0 1 0 F\nC 0 -150 10 0 1 0 F\nC 100 0 10 0 1 0 F\nS -140 -100 -60 -110 0 1 0 F\nS -140 -70 -60 -80 0 1 0 F\nS -25 75 25 -75 0 1 12 N\nS 60 -100 140 -110 0 1 0 F\nS 60 -70 140 -80 0 1 0 F\nP 2 0 1 0 -100 -70 -100 0 N\nP 2 0 1 0 -100 0 -55 0 N\nP 2 0 1 0 -100 50 -100 0 N\nP 2 0 1 15 -50 -50 -50 50 N\nP 2 0 1 15 50 -50 50 50 N\nP 2 0 1 0 50 0 100 0 N\nP 2 0 1 0 100 0 100 -70 N\nP 2 0 1 0 100 50 100 0 N\nP 4 0 1 0 95 -110 95 -150 -95 -150 -95 -105 N\nX 1 1 -100 100 50 D 50 50 1 1 P\nX 2 2 0 -200 50 U 50 50 1 1 P\nX 3 3 100 100 50 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Rotary_Encoder\n#\nDEF Rotary_Encoder SW 0 10 Y N 1 F N\nF0 \"SW\" 0 260 50 H V C CNN\nF1 \"Rotary_Encoder\" 0 -260 50 H V C CNN\nF2 \"\" -150 160 50 H I C CNN\nF3 \"\" 0 260 50 H I C CNN\n$FPLIST\n RotaryEncoder*\n$ENDFPLIST\nDRAW\nA -15 -2 108 -899 899 0 1 10 N -15 -110 -15 105\nC -150 0 10 0 1 0 F\nC -15 0 75 0 1 10 N\nS -200 200 200 -200 0 1 10 f\nP 2 0 1 10 -25 -70 -25 70 N\nP 2 0 1 10 -15 -70 -15 70 N\nP 2 0 1 10 -5 70 -5 -70 N\nP 3 0 1 0 -200 -100 -150 -100 -150 -80 N\nP 3 0 1 0 -200 100 -150 100 -150 80 N\nP 3 0 1 10 10 -120 -20 -110 5 -95 N\nP 3 0 1 10 10 115 -20 105 5 90 N\nP 4 0 1 0 -200 0 -150 0 -150 -40 -130 -80 N\nP 4 0 1 0 -170 0 -150 0 -150 40 -130 80 N\nX A A -300 100 100 R 50 50 1 1 P\nX B B -300 -100 100 R 50 50 1 1 P\nX C C -300 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Rotary_Encoder_Switch\n#\nDEF Rotary_Encoder_Switch SW 0 10 Y N 1 F N\nF0 \"SW\" 0 260 50 H V C CNN\nF1 \"Rotary_Encoder_Switch\" 0 -260 50 H V C CNN\nF2 \"\" -150 160 50 H I C CNN\nF3 \"\" 0 260 50 H I C CNN\n$FPLIST\n RotaryEncoder*Switch*\n$ENDFPLIST\nDRAW\nA -15 -2 108 -899 899 0 1 10 N -15 -110 -15 105\nC -150 0 10 0 1 0 F\nC -15 0 75 0 1 10 N\nC 170 -40 5 0 1 10 N\nC 170 40 5 0 1 10 N\nS -200 200 200 -200 0 1 10 f\nP 2 0 1 10 -25 -70 -25 70 N\nP 2 0 1 10 -15 -70 -15 70 N\nP 2 0 1 10 -5 70 -5 -70 N\nP 2 0 1 10 150 0 135 0 N\nP 2 0 1 10 150 40 150 -40 N\nP 3 0 1 0 -200 -100 -150 -100 -150 -80 N\nP 3 0 1 0 -200 100 -150 100 -150 80 N\nP 3 0 1 10 10 -120 -20 -110 5 -95 N\nP 3 0 1 10 10 115 -20 105 5 90 N\nP 3 0 1 10 200 -100 170 -100 170 -40 N\nP 3 0 1 10 200 100 170 100 170 40 N\nP 4 0 1 0 -200 0 -150 0 -150 -40 -130 -80 N\nP 4 0 1 0 -170 0 -150 0 -150 40 -130 80 N\nX A A -300 100 100 R 50 50 1 1 P\nX B B -300 -100 100 R 50 50 1 1 P\nX C C -300 0 100 R 50 50 1 1 P\nX S1 S1 300 100 100 L 50 50 1 1 P\nX S2 S2 300 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SPARK_GAP\n#\nDEF SPARK_GAP E 0 0 N Y 1 F N\nF0 \"E\" 0 80 50 H V C CNN\nF1 \"SPARK_GAP\" 0 -75 50 H V C CNN\nF2 \"\" 0 -70 50 H I C CNN\nF3 \"\" 0 0 50 V I C CNN\n$FPLIST\n SG*\n$ENDFPLIST\nDRAW\nP 4 0 1 0 -100 25 -100 -25 -25 0 -100 25 N\nP 4 0 1 0 100 25 100 -25 25 0 100 25 N\nX ~ 1 -200 0 100 R 50 50 1 1 P\nX ~ 2 200 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Solar_Cell\n#\nDEF Solar_Cell SC 0 0 N N 1 F N\nF0 \"SC\" 100 100 50 H V L CNN\nF1 \"Solar_Cell\" 100 0 50 H V L CNN\nF2 \"\" 0 60 50 V I C CNN\nF3 \"\" 0 60 50 V I C CNN\nDRAW\nS -80 70 80 60 0 1 0 F\nS -52 47 50 27 0 1 0 F\nP 2 0 1 0 -80 90 -140 150 N\nP 2 0 1 0 -30 110 -90 170 N\nP 2 0 1 0 0 30 0 0 N\nP 2 0 1 0 0 70 0 100 N\nP 2 0 1 10 10 105 50 105 N\nP 2 0 1 10 30 125 30 85 N\nP 3 0 1 0 -80 120 -80 90 -110 90 N\nP 3 0 1 0 -30 140 -30 110 -60 110 N\nX + 1 0 200 100 D 50 50 1 1 P\nX - 2 0 -100 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Solar_Cells\n#\nDEF Solar_Cells SC 0 0 N N 1 F N\nF0 \"SC\" 100 100 50 H V L CNN\nF1 \"Solar_Cells\" 100 0 50 H V L CNN\nF2 \"\" 0 60 50 V I C CNN\nF3 \"\" 0 60 50 V I C CNN\nDRAW\nS -80 -55 80 -65 0 1 0 F\nS -80 70 80 60 0 1 0 F\nS -52 -78 50 -98 0 1 0 F\nS -52 47 50 27 0 1 0 F\nP 2 0 1 0 -100 10 -160 70 N\nP 2 0 1 0 -100 90 -160 150 N\nP 2 0 1 0 0 -60 0 -50 N\nP 2 0 1 0 0 -40 0 -30 N\nP 2 0 1 0 0 -20 0 -10 N\nP 2 0 1 0 0 0 0 10 N\nP 2 0 1 0 0 20 0 30 N\nP 2 0 1 0 0 70 0 100 N\nP 2 0 1 10 10 105 50 105 N\nP 2 0 1 10 30 125 30 85 N\nP 3 0 1 0 -100 40 -100 10 -130 10 N\nP 3 0 1 0 -100 120 -100 90 -130 90 N\nX + 1 0 200 100 D 50 50 1 1 P\nX - 2 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Speaker\n#\nDEF Speaker LS 0 0 Y N 1 F N\nF0 \"LS\" 50 225 50 H V R CNN\nF1 \"Speaker\" 50 150 50 H V R CNN\nF2 \"\" 0 -200 50 H I C CNN\nF3 \"\" -10 -50 50 H I C CNN\nDRAW\nS -100 50 40 -150 0 0 10 N\nP 4 0 0 10 40 50 140 150 140 -250 40 -150 N\nX 1 1 -200 0 100 R 50 50 1 1 I\nX 2 2 -200 -100 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Speaker_Crystal\n#\nDEF Speaker_Crystal LS 0 0 Y N 1 F N\nF0 \"LS\" 25 225 50 H V R CNN\nF1 \"Speaker_Crystal\" 25 150 50 H V R CNN\nF2 \"\" -35 -50 50 H I C CNN\nF3 \"\" -35 -50 50 H I C CNN\nALIAS Speaker_Ultrasound\nDRAW\nS -100 50 45 -150 0 0 10 N\nS -80 -25 25 -75 0 0 10 N\nP 2 0 0 0 -65 -90 15 -90 N\nP 2 0 0 0 -65 -10 15 -10 N\nP 2 0 0 0 -25 -90 -25 -120 N\nP 2 0 0 0 -25 -10 -25 20 N\nP 4 0 0 10 45 50 145 150 145 -250 45 -150 N\nX 1 1 -200 0 100 R 50 50 1 1 I\nX 2 2 -200 -100 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Thermistor\n#\nDEF Thermistor TH 0 0 N Y 1 F N\nF0 \"TH\" 100 50 50 V V C CNN\nF1 \"Thermistor\" -100 0 50 V V C BNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R_*\n$ENDFPLIST\nDRAW\nS -40 100 40 -100 0 1 8 N\nP 5 0 1 10 -75 125 -75 75 75 -75 75 -125 75 -125 N\nX ~ 1 0 200 100 D 50 50 1 1 P\nX ~ 2 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Thermistor_NTC\n#\nDEF Thermistor_NTC TH 0 0 N Y 1 F N\nF0 \"TH\" -175 0 50 V V C CNN\nF1 \"Thermistor_NTC\" 125 0 50 V V C CNN\nF2 \"\" 0 50 50 H I C CNN\nF3 \"\" 0 50 50 H I C CNN\n$FPLIST\n *NTC*\n *Thermistor*\n PIN?ARRAY*\n bornier*\n *Terminal?Block*\n R_*\n$ENDFPLIST\nDRAW\nA -126 88 7 -265 818 0 1 0 N -120 85 -125 95\nA -110 85 10 1800 -900 0 1 0 N -120 85 -110 75\nA -110 85 10 -900 0 0 1 0 N -110 75 -100 85\nA -110 110 10 0 900 0 1 0 N -100 110 -110 120\nA -110 110 10 900 1800 0 1 0 N -110 120 -120 110\nA -110 110 10 1800 -900 0 1 0 N -120 110 -110 100\nA -104 119 20 -1075 -253 0 1 0 N -110 100 -85 110\nS -40 100 40 -100 0 1 10 N\nP 2 0 1 0 -100 85 -100 110 N\nP 4 0 1 0 -70 100 -70 60 70 -60 70 -100 N\nP 6 0 1 0 -100 -145 -100 -55 -110 -85 -90 -85 -100 -55 -100 -65 F\nP 6 0 1 0 -70 -55 -70 -145 -80 -115 -60 -115 -70 -145 -70 -135 F\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Thermistor_NTC_3wire\n#\nDEF Thermistor_NTC_3wire TH 0 0 Y Y 1 F N\nF0 \"TH\" 75 150 50 H V L CNN\nF1 \"Thermistor_NTC_3wire\" 75 50 50 H V L CNN\nF2 \"\" 0 50 50 H I C CNN\nF3 \"\" 0 50 50 H I C CNN\n$FPLIST\n *NTC*\n *Thermistor*\n PIN?ARRAY*\n bornier*\n *Terminal?Block*\n$ENDFPLIST\nDRAW\nA -126 88 7 -265 818 0 1 0 N -120 85 -125 95\nA -110 85 10 1800 -900 0 1 0 N -120 85 -110 75\nA -110 85 10 -900 0 0 1 0 N -110 75 -100 85\nA -110 110 10 0 900 0 1 0 N -100 110 -110 120\nA -110 110 10 900 1800 0 1 0 N -110 120 -120 110\nA -110 110 10 1800 -900 0 1 0 N -120 110 -110 100\nA -104 119 20 -1075 -253 0 1 0 N -110 100 -85 110\nC 0 125 11 0 1 0 F\nS -40 100 40 -100 0 1 10 N\nP 2 0 1 0 -100 85 -100 110 N\nP 2 0 1 0 0 -150 0 -100 N\nP 2 0 1 0 0 150 0 100 N\nP 3 0 1 0 100 150 25 150 0 125 N\nP 4 0 1 0 -70 100 -70 60 70 -60 70 -100 N\nP 6 0 1 0 -100 -145 -100 -55 -110 -85 -90 -85 -100 -55 -100 -65 F\nP 6 0 1 0 -70 -55 -70 -145 -80 -115 -60 -115 -70 -145 -70 -135 F\nX ~ 1 0 250 100 D 50 50 1 1 P\nX ~ 2 100 250 100 D 50 50 1 1 P\nX ~ 3 0 -250 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Thermistor_NTC_4wire\n#\nDEF Thermistor_NTC_4wire TH 0 0 Y Y 1 F N\nF0 \"TH\" 75 150 50 H V L CNN\nF1 \"Thermistor_NTC_4wire\" 75 50 50 H V L CNN\nF2 \"\" 0 50 50 H I C CNN\nF3 \"\" 0 50 50 H I C CNN\n$FPLIST\n *NTC*\n *Thermistor*\n PIN?ARRAY*\n bornier*\n *Terminal?Block*\n$ENDFPLIST\nDRAW\nA -126 88 7 -265 818 0 1 0 N -120 85 -125 95\nA -110 85 10 1800 -900 0 1 0 N -120 85 -110 75\nA -110 85 10 -900 0 0 1 0 N -110 75 -100 85\nA -110 110 10 0 900 0 1 0 N -100 110 -110 120\nA -110 110 10 900 1800 0 1 0 N -110 120 -120 110\nA -110 110 10 1800 -900 0 1 0 N -120 110 -110 100\nA -104 119 20 -1075 -253 0 1 0 N -110 100 -85 110\nC 0 -130 10 0 1 0 F\nC 0 125 10 0 1 0 F\nS -40 100 40 -100 0 1 10 N\nP 2 0 1 0 -100 85 -100 110 N\nP 2 0 1 0 0 -150 0 -100 N\nP 2 0 1 0 0 125 0 125 N\nP 2 0 1 0 0 150 0 100 N\nP 3 0 1 0 100 -150 25 -150 0 -125 N\nP 3 0 1 0 100 150 25 150 0 125 N\nP 4 0 1 0 -70 100 -70 60 70 -60 70 -100 N\nP 6 0 1 0 -100 -145 -100 -55 -110 -85 -90 -85 -100 -55 -100 -65 F\nP 6 0 1 0 -70 -55 -70 -145 -80 -115 -60 -115 -70 -145 -70 -135 F\nX ~ 1 0 250 100 D 50 50 1 1 P\nX ~ 2 100 250 100 D 50 50 1 1 P\nX ~ 3 100 -250 100 U 50 50 1 1 P\nX ~ 4 0 -250 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Thermistor_NTC_US\n#\nDEF Thermistor_NTC_US TH 0 0 N Y 1 F N\nF0 \"TH\" -175 0 50 V V C CNN\nF1 \"Thermistor_NTC_US\" 125 0 50 V V C CNN\nF2 \"\" 0 50 50 H I C CNN\nF3 \"\" 0 50 50 H I C CNN\n$FPLIST\n *NTC*\n *Thermistor*\n PIN?ARRAY*\n bornier*\n *Terminal?Block*\n R_*\n$ENDFPLIST\nDRAW\nA -126 88 7 -265 818 0 1 0 N -120 85 -125 95\nA -110 85 10 1800 -900 0 1 0 N -120 85 -110 75\nA -110 85 10 -900 0 0 1 0 N -110 75 -100 85\nA -110 110 10 0 900 0 1 0 N -100 110 -110 120\nA -110 110 10 900 1800 0 1 0 N -110 120 -120 110\nA -110 110 10 1800 -900 0 1 0 N -120 110 -110 100\nA -104 119 20 -1075 -253 0 1 0 N -110 100 -85 110\nP 2 0 1 0 -100 85 -100 110 N\nP 2 0 1 0 0 -90 0 -100 N\nP 2 0 1 0 0 90 0 100 N\nP 4 0 1 0 -70 100 -70 60 70 -60 70 -100 N\nP 5 0 1 0 0 -30 40 -45 0 -60 -40 -75 0 -90 N\nP 5 0 1 0 0 30 40 15 0 0 -40 -15 0 -30 N\nP 5 0 1 0 0 90 40 75 0 60 -40 45 0 30 N\nP 6 0 1 0 -100 -145 -100 -55 -110 -85 -90 -85 -100 -55 -100 -65 F\nP 6 0 1 0 -70 -55 -70 -145 -80 -115 -60 -115 -70 -145 -70 -135 F\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Thermistor_PTC\n#\nDEF Thermistor_PTC TH 0 0 N Y 1 F N\nF0 \"TH\" -160 0 50 V V C CNN\nF1 \"Thermistor_PTC\" 120 0 50 V V C CNN\nF2 \"\" 50 -200 50 H I L CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n *PTC*\n *Thermistor*\n PIN?ARRAY*\n bornier*\n *Terminal?Block*\n R_*\n$ENDFPLIST\nDRAW\nA -126 88 7 -265 818 0 1 0 N -120 85 -125 95\nA -110 85 10 1800 -900 0 1 0 N -120 85 -110 75\nA -110 85 10 -900 0 0 1 0 N -110 75 -100 85\nA -110 110 10 0 900 0 1 0 N -100 110 -110 120\nA -110 110 10 900 1800 0 1 0 N -110 120 -120 110\nA -110 110 10 1800 -900 0 1 0 N -120 110 -110 100\nA -104 119 20 -1075 -253 0 1 0 N -110 100 -85 110\nS -40 100 40 -100 0 1 10 N\nP 2 0 1 0 -100 85 -100 110 N\nP 4 0 1 0 -70 100 -70 60 70 -60 70 -100 N\nP 6 0 1 0 -100 -145 -100 -55 -110 -85 -90 -85 -100 -55 -100 -65 F\nP 6 0 1 0 -70 -145 -70 -55 -80 -85 -60 -85 -70 -55 -70 -65 F\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Thermistor_PTC_3wire\n#\nDEF Thermistor_PTC_3wire TH 0 0 Y Y 1 F N\nF0 \"TH\" 75 50 50 H V L CNN\nF1 \"Thermistor_PTC_3wire\" 75 -50 50 H V L CNN\nF2 \"\" 0 50 50 H I C CNN\nF3 \"\" 0 50 50 H I C CNN\n$FPLIST\n PIN_ARRAY_3X1\n bornier3\n TerminalBlock*3pol\n$ENDFPLIST\nDRAW\nA -126 88 7 -265 818 0 1 0 N -120 85 -125 95\nA -110 85 10 1800 -900 0 1 0 N -120 85 -110 75\nA -110 85 10 -900 0 0 1 0 N -110 75 -100 85\nA -110 110 10 0 900 0 1 0 N -100 110 -110 120\nA -110 110 10 900 1800 0 1 0 N -110 120 -120 110\nA -110 110 10 1800 -900 0 1 0 N -120 110 -110 100\nA -104 119 20 -1075 -253 0 1 0 N -110 100 -85 110\nC 0 125 11 0 1 0 F\nS -40 100 40 -100 0 1 10 N\nP 2 0 1 0 -100 85 -100 110 N\nP 2 0 1 0 0 -150 0 -100 N\nP 2 0 1 0 0 150 0 100 N\nP 3 0 1 0 100 150 25 150 0 125 N\nP 4 0 1 0 -70 100 -70 60 70 -60 70 -100 N\nP 6 0 1 0 -100 -145 -100 -55 -110 -85 -90 -85 -100 -55 -100 -65 F\nP 6 0 1 0 -70 -145 -70 -55 -80 -85 -60 -85 -70 -55 -70 -65 F\nX ~ 1 0 250 100 D 50 50 1 1 P\nX ~ 2 100 250 100 D 50 50 1 1 P\nX ~ 3 0 -250 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Thermistor_PTC_4wire\n#\nDEF Thermistor_PTC_4wire TH 0 0 Y Y 1 F N\nF0 \"TH\" 75 75 50 H V L CNN\nF1 \"Thermistor_PTC_4wire\" 75 -25 50 H V L CNN\nF2 \"\" 0 50 50 H I C CNN\nF3 \"\" 0 50 50 H I C CNN\n$FPLIST\n PIN_ARRAY_4X1\n bornier4\n TerminalBlock*4pol\n$ENDFPLIST\nDRAW\nA -126 88 7 -265 818 0 1 0 N -120 85 -125 95\nA -110 85 10 1800 -900 0 1 0 N -120 85 -110 75\nA -110 85 10 -900 0 0 1 0 N -110 75 -100 85\nA -110 110 10 0 900 0 1 0 N -100 110 -110 120\nA -110 110 10 900 1800 0 1 0 N -110 120 -120 110\nA -110 110 10 1800 -900 0 1 0 N -120 110 -110 100\nA -104 119 20 -1075 -253 0 1 0 N -110 100 -85 110\nC 0 -130 10 0 1 0 F\nC 0 125 10 0 1 0 F\nS -40 100 40 -100 0 1 10 N\nP 2 0 1 0 -100 85 -100 110 N\nP 2 0 1 0 0 -150 0 -100 N\nP 2 0 1 0 0 125 0 125 N\nP 2 0 1 0 0 150 0 100 N\nP 3 0 1 0 100 -150 25 -150 0 -125 N\nP 3 0 1 0 100 150 25 150 0 125 N\nP 4 0 1 0 -70 100 -70 60 70 -60 70 -100 N\nP 6 0 1 0 -100 -145 -100 -55 -110 -85 -90 -85 -100 -55 -100 -65 F\nP 6 0 1 0 -70 -145 -70 -55 -80 -85 -60 -85 -70 -55 -70 -65 F\nX ~ 1 0 250 100 D 50 50 1 1 P\nX ~ 2 100 250 100 D 50 50 1 1 P\nX ~ 3 100 -250 100 U 50 50 1 1 P\nX ~ 4 0 -250 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Thermistor_PTC_US\n#\nDEF Thermistor_PTC_US TH 0 0 N Y 1 F N\nF0 \"TH\" -160 0 50 V V C CNN\nF1 \"Thermistor_PTC_US\" 120 0 50 V V C CNN\nF2 \"\" 50 -200 50 H I L CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n *PTC*\n *Thermistor*\n PIN?ARRAY*\n bornier*\n *Terminal?Block*\n R_*\n$ENDFPLIST\nDRAW\nA -126 88 7 -265 818 0 1 0 N -120 85 -125 95\nA -110 85 10 1800 -900 0 1 0 N -120 85 -110 75\nA -110 85 10 -900 0 0 1 0 N -110 75 -100 85\nA -110 110 10 0 900 0 1 0 N -100 110 -110 120\nA -110 110 10 900 1800 0 1 0 N -110 120 -120 110\nA -110 110 10 1800 -900 0 1 0 N -120 110 -110 100\nA -104 119 20 -1075 -253 0 1 0 N -110 100 -85 110\nP 2 0 1 0 -100 85 -100 110 N\nP 2 0 1 0 0 -90 0 -100 N\nP 2 0 1 0 0 90 0 100 N\nP 4 0 1 0 -70 100 -70 60 70 -60 70 -100 N\nP 5 0 1 0 0 -30 40 -45 0 -60 -40 -75 0 -90 N\nP 5 0 1 0 0 30 40 15 0 0 -40 -15 0 -30 N\nP 5 0 1 0 0 90 40 75 0 60 -40 45 0 30 N\nP 6 0 1 0 -100 -145 -100 -55 -110 -85 -90 -85 -100 -55 -100 -65 F\nP 6 0 1 0 -70 -145 -70 -55 -80 -85 -60 -85 -70 -55 -70 -65 F\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Thermistor_US\n#\nDEF Thermistor_US TH 0 0 N Y 1 F N\nF0 \"TH\" 100 50 50 V V C CNN\nF1 \"Thermistor_US\" -100 0 50 V V C BNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n R_*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 0 -90 0 -100 N\nP 2 0 1 0 0 90 0 100 N\nP 2 0 1 0 75 -50 75 -100 N\nP 3 0 1 0 -75 100 -75 50 75 -50 N\nP 5 0 1 0 0 -30 40 -45 0 -60 -40 -75 0 -90 N\nP 5 0 1 0 0 30 40 15 0 0 -40 -15 0 -30 N\nP 5 0 1 0 0 90 40 75 0 60 -40 45 0 30 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Thermocouple\n#\nDEF Thermocouple TC 0 0 N Y 1 F N\nF0 \"TC\" -120 150 50 H V C CNN\nF1 \"Thermocouple\" -200 -160 50 H V L CNN\nF2 \"\" -575 50 50 H I C CNN\nF3 \"\" -575 50 50 H I C CNN\n$FPLIST\n PIN?ARRAY*\n bornier*\n *Terminal?Block*\n Thermo*Couple*\n$ENDFPLIST\nDRAW\nC -120 0 10 0 1 0 F\nP 2 0 1 0 -160 -40 -170 -50 N\nP 2 0 1 0 -140 -20 -150 -30 N\nP 2 0 1 0 -120 0 -130 -10 N\nP 2 0 1 0 -100 20 -110 10 N\nP 2 0 1 0 -80 40 -90 30 N\nP 2 0 1 0 -60 60 -70 50 N\nP 2 0 1 0 -40 80 -50 70 N\nP 2 0 1 0 -20 100 -30 90 N\nP 2 0 1 0 0 -100 -10 -100 N\nP 2 0 1 0 0 100 -20 100 N\nP 3 0 1 0 10 -100 -20 -100 -170 50 N\nX + 1 100 100 100 L 50 50 1 1 P\nX - 2 100 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Thermocouple_ALT\n#\nDEF Thermocouple_ALT TC 0 0 N Y 1 F N\nF0 \"TC\" -120 150 50 H V C CNN\nF1 \"Thermocouple_ALT\" -180 -200 50 H V L CNN\nF2 \"\" -575 50 50 H I C CNN\nF3 \"\" -575 50 50 H I C CNN\n$FPLIST\n PIN?ARRAY*\n bornier*\n *Terminal?Block*\n Thermo*Couple*\n$ENDFPLIST\nDRAW\nC -120 0 10 0 1 0 F\nP 2 0 1 0 0 -100 -10 -100 N\nP 2 0 1 0 48 100 100 100 N\nP 2 0 1 0 60 -100 100 -100 N\nP 3 0 1 0 46 50 -18 50 -120 0 N\nP 3 0 1 0 46 98 -18 98 -118 -2 N\nP 3 0 1 0 60 -100 -20 -100 -120 0 N\nX + 1 100 100 100 L 50 50 1 1 P\nX - 2 100 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Thermocouple_Block\n#\nDEF Thermocouple_Block TC 0 0 N Y 1 F N\nF0 \"TC\" -120 150 50 H V C CNN\nF1 \"Thermocouple_Block\" -200 -160 50 H V L CNN\nF2 \"\" -575 50 50 H I C CNN\nF3 \"\" -575 50 50 H I C CNN\n$FPLIST\n PIN?ARRAY*\n bornier*\n *Terminal?Block*\n Thermo*Couple*\n$ENDFPLIST\nDRAW\nC -70 0 10 0 1 0 F\nC 80 -100 20 0 1 0 N\nC 80 100 20 0 1 0 N\nS 40 140 120 -140 0 1 0 N\nP 2 0 1 0 -110 -40 -120 -50 N\nP 2 0 1 0 -90 -20 -100 -30 N\nP 2 0 1 0 -70 0 -80 -10 N\nP 2 0 1 0 -50 20 -60 10 N\nP 2 0 1 0 -30 40 -40 30 N\nP 2 0 1 0 -10 60 -20 50 N\nP 2 0 1 0 10 80 0 70 N\nP 2 0 1 0 30 100 20 90 N\nP 2 0 1 0 50 -100 40 -100 N\nP 2 0 1 0 50 100 30 100 N\nP 3 0 1 0 60 -100 30 -100 -120 50 N\nX + 1 200 100 100 L 50 50 1 1 P\nX - 2 200 -100 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Transformer_1P_1S\n#\nDEF Transformer_1P_1S T 0 40 Y N 1 F N\nF0 \"T\" 0 250 50 H V C CNN\nF1 \"Transformer_1P_1S\" 0 -300 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nA -100 -150 50 899 1 0 1 0 N -100 -100 -50 -150\nA -100 -150 50 -1 -899 0 1 0 N -50 -150 -100 -199\nA -100 -50 50 899 1 0 1 0 N -100 0 -50 -50\nA -100 -50 50 -1 -899 0 1 0 N -50 -50 -100 -99\nA -100 50 50 899 1 0 1 0 N -100 100 -50 50\nA -100 50 50 -1 -899 0 1 0 N -50 50 -100 1\nA -100 150 50 899 1 0 1 0 N -100 200 -50 150\nA -100 150 50 -1 -899 0 1 0 N -50 150 -100 101\nA 100 -50 50 899 -1799 0 1 0 N 100 0 51 -50\nA 100 -50 50 1799 -899 0 1 0 N 51 -50 100 -99\nA 100 50 50 899 -1799 0 1 0 N 100 100 51 50\nA 100 50 50 1799 -899 0 1 0 N 51 50 100 1\nA 100 150 50 899 -1799 0 1 0 N 100 200 51 150\nA 100 150 50 1799 -899 0 1 0 N 51 150 100 101\nA 101 -150 50 910 -1799 0 1 0 N 101 -100 52 -150\nA 101 -150 50 -912 -1799 0 1 0 N 101 -199 52 -150\nP 2 0 1 0 -25 200 -25 -200 N\nP 2 0 1 0 25 -200 25 200 N\nX AA 1 -400 200 300 R 50 50 1 1 P\nX AB 2 -400 -200 300 R 50 50 1 1 P\nX SA 3 400 -200 300 L 50 50 1 1 P\nX SB 4 400 200 300 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Transformer_1P_1S_SO8\n#\nDEF Transformer_1P_1S_SO8 T 0 40 Y N 1 F N\nF0 \"T\" 0 250 50 H V C CNN\nF1 \"Transformer_1P_1S_SO8\" 0 -300 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nA -100 -150 50 899 1 0 1 0 N -100 -100 -50 -150\nA -100 -150 50 -1 -899 0 1 0 N -50 -150 -100 -199\nA -100 -50 50 899 1 0 1 0 N -100 0 -50 -50\nA -100 -50 50 -1 -899 0 1 0 N -50 -50 -100 -99\nA -100 50 50 899 1 0 1 0 N -100 100 -50 50\nA -100 50 50 -1 -899 0 1 0 N -50 50 -100 1\nA -100 150 50 899 1 0 1 0 N -100 200 -50 150\nA -100 150 50 -1 -899 0 1 0 N -50 150 -100 101\nA 100 -50 50 899 -1799 0 1 0 N 100 0 51 -50\nA 100 -50 50 1799 -899 0 1 0 N 51 -50 100 -99\nA 100 50 50 899 -1799 0 1 0 N 100 100 51 50\nA 100 50 50 1799 -899 0 1 0 N 51 50 100 1\nA 100 150 50 899 -1799 0 1 0 N 100 200 51 150\nA 100 150 50 1799 -899 0 1 0 N 51 150 100 101\nA 101 -150 50 910 -1799 0 1 0 N 101 -100 52 -150\nA 101 -150 50 -912 -1799 0 1 0 N 101 -199 52 -150\nP 2 0 1 0 -25 200 -25 -200 N\nP 2 0 1 0 25 -200 25 200 N\nX AA 1 -300 200 200 R 50 50 1 1 P\nX AB 4 -300 -200 200 R 50 50 1 1 P\nX SA 5 300 -200 200 L 50 50 1 1 P\nX SB 8 300 200 200 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Transformer_1P_2S\n#\nDEF Transformer_1P_2S T 0 40 Y N 1 F N\nF0 \"T\" 0 500 50 H V C CNN\nF1 \"Transformer_1P_2S\" 0 -500 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nA -100 -150 50 899 1 0 1 0 N -100 -100 -50 -150\nA -100 -150 50 -1 -899 0 1 0 N -50 -150 -100 -199\nA -100 -50 50 899 1 0 1 0 N -100 0 -50 -50\nA -100 -50 50 -1 -899 0 1 0 N -50 -50 -100 -99\nA -100 50 50 899 1 0 1 0 N -100 100 -50 50\nA -100 50 50 -1 -899 0 1 0 N -50 50 -100 1\nA -100 150 50 899 1 0 1 0 N -100 200 -50 150\nA -100 150 50 -1 -899 0 1 0 N -50 150 -100 101\nA 100 -350 50 899 -1799 0 1 0 N 100 -300 51 -350\nA 100 -350 50 1799 -899 0 1 0 N 51 -350 100 -399\nA 100 -250 50 899 -1799 0 1 0 N 100 -200 51 -250\nA 100 -250 50 1799 -899 0 1 0 N 51 -250 100 -299\nA 100 -150 50 899 -1799 0 1 0 N 100 -100 51 -150\nA 100 -150 50 1799 -899 0 1 0 N 51 -150 100 -199\nA 100 150 50 899 -1799 0 1 0 N 100 200 51 150\nA 100 150 50 1799 -899 0 1 0 N 51 150 100 101\nA 100 250 50 899 -1799 0 1 0 N 100 300 51 250\nA 100 250 50 1799 -899 0 1 0 N 51 250 100 201\nA 100 350 50 899 -1799 0 1 0 N 100 400 51 350\nA 100 350 50 1799 -899 0 1 0 N 51 350 100 301\nP 2 0 1 0 -20 -400 -20 400 N\nP 2 0 1 0 20 400 20 -400 N\nX AA 1 -400 200 300 R 50 50 1 1 P\nX AB 2 -400 -200 300 R 50 50 1 1 P\nX SA 3 400 400 300 L 50 50 1 1 P\nX SB 4 400 100 300 L 50 50 1 1 P\nX SC 5 400 -100 300 L 50 50 1 1 P\nX SD 6 400 -400 300 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Transformer_1P_SS\n#\nDEF Transformer_1P_SS T 0 40 Y N 1 F N\nF0 \"T\" 0 250 50 H V C CNN\nF1 \"Transformer_1P_SS\" 0 -300 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nA -100 -150 50 899 1 0 1 0 N -100 -100 -50 -150\nA -100 -150 50 -1 -899 0 1 0 N -50 -150 -100 -199\nA -100 -50 50 899 1 0 1 0 N -100 0 -50 -50\nA -100 -50 50 -1 -899 0 1 0 N -50 -50 -100 -99\nA -100 50 50 899 1 0 1 0 N -100 100 -50 50\nA -100 50 50 -1 -899 0 1 0 N -50 50 -100 1\nA -100 150 50 899 1 0 1 0 N -100 200 -50 150\nA -100 150 50 -1 -899 0 1 0 N -50 150 -100 101\nA 100 -50 50 899 -1799 0 1 0 N 100 0 51 -50\nA 100 -50 50 1799 -899 0 1 0 N 51 -50 100 -99\nA 100 50 50 899 -1799 0 1 0 N 100 100 51 50\nA 100 50 50 1799 -899 0 1 0 N 51 50 100 1\nA 100 150 50 899 -1799 0 1 0 N 100 200 51 150\nA 100 150 50 1799 -899 0 1 0 N 51 150 100 101\nA 101 -150 50 910 -1799 0 1 0 N 101 -100 52 -150\nA 101 -150 50 -912 -1799 0 1 0 N 101 -199 52 -150\nP 2 0 1 0 -25 200 -25 -200 N\nP 2 0 1 0 25 -200 25 200 N\nX AA 1 -400 200 300 R 50 50 1 1 P\nX AB 2 -400 -200 300 R 50 50 1 1 P\nX SA 3 400 -200 300 L 50 50 1 1 P\nX SC 4 400 0 300 L 50 50 1 1 P\nX SB 5 400 200 300 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Transformer_AUDIO\n#\nDEF Transformer_AUDIO T 0 40 Y N 1 F N\nF0 \"T\" 0 460 50 H V C CNN\nF1 \"Transformer_AUDIO\" 10 370 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nA -100 -150 50 899 1 0 1 0 N -100 -100 -50 -150\nA -100 -150 50 -1 -899 0 1 0 N -50 -150 -100 -199\nA -100 -50 50 899 1 0 1 0 N -100 0 -50 -50\nA -100 -50 50 -1 -899 0 1 0 N -50 -50 -100 -99\nA -100 50 50 899 1 0 1 0 N -100 100 -50 50\nA -100 50 50 -1 -899 0 1 0 N -50 50 -100 1\nA -100 150 50 899 1 0 1 0 N -100 200 -50 150\nA -100 150 50 -1 -899 0 1 0 N -50 150 -100 101\nA 100 -50 50 899 -1799 0 1 0 N 100 0 51 -50\nA 100 -50 50 1799 -899 0 1 0 N 51 -50 100 -99\nA 100 50 50 899 -1799 0 1 0 N 100 100 51 50\nA 100 50 50 1799 -899 0 1 0 N 51 50 100 1\nA 100 150 50 899 -1799 0 1 0 N 100 200 51 150\nA 100 150 50 1799 -899 0 1 0 N 51 150 100 101\nA 101 -150 50 910 -1799 0 1 0 N 101 -100 52 -150\nA 101 -150 50 -912 -1799 0 1 0 N 101 -199 52 -150\nP 2 0 1 0 -25 200 -25 -200 N\nP 2 0 1 0 25 -200 25 200 N\nP 9 0 1 10 -150 250 -100 300 100 300 150 250 150 -250 100 -300 -100 -300 -150 -250 -150 250 f\nX ~ 0 0 -400 100 U 50 50 1 1 I\nX AA 1 -400 200 300 R 50 50 1 1 P\nX AB 2 -400 -200 300 R 50 50 1 1 P\nX SA 3 400 -200 300 L 50 50 1 1 P\nX SB 4 400 200 300 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Transformer_SP_1S\n#\nDEF Transformer_SP_1S T 0 40 Y N 1 F N\nF0 \"T\" 0 250 50 H V C CNN\nF1 \"Transformer_SP_1S\" 0 -300 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nA -100 -150 50 899 1 0 1 0 N -100 -100 -50 -150\nA -100 -150 50 -1 -899 0 1 0 N -50 -150 -100 -199\nA -100 -50 50 899 1 0 1 0 N -100 0 -50 -50\nA -100 -50 50 -1 -899 0 1 0 N -50 -50 -100 -99\nA -100 50 50 899 1 0 1 0 N -100 100 -50 50\nA -100 50 50 -1 -899 0 1 0 N -50 50 -100 1\nA -100 150 50 899 1 0 1 0 N -100 200 -50 150\nA -100 150 50 -1 -899 0 1 0 N -50 150 -100 101\nA 100 -50 50 899 -1799 0 1 0 N 100 0 51 -50\nA 100 -50 50 1799 -899 0 1 0 N 51 -50 100 -99\nA 100 50 50 899 -1799 0 1 0 N 100 100 51 50\nA 100 50 50 1799 -899 0 1 0 N 51 50 100 1\nA 100 150 50 899 -1799 0 1 0 N 100 200 51 150\nA 100 150 50 1799 -899 0 1 0 N 51 150 100 101\nA 101 -150 50 910 -1799 0 1 0 N 101 -100 52 -150\nA 101 -150 50 -912 -1799 0 1 0 N 101 -199 52 -150\nP 2 0 1 0 -25 200 -25 -200 N\nP 2 0 1 0 25 -200 25 200 N\nX PR1 1 -400 200 300 R 50 50 1 1 P\nX PM 2 -400 0 300 R 50 50 1 1 P\nX PR2 3 -400 -200 300 R 50 50 1 1 P\nX S1 4 400 -200 300 L 50 50 1 1 P\nX S2 5 400 200 300 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Transformer_SP_2S\n#\nDEF Transformer_SP_2S T 0 40 Y N 1 F N\nF0 \"T\" 0 500 50 H V C CNN\nF1 \"Transformer_SP_2S\" 0 -500 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nA -100 -150 50 899 1 0 1 0 N -100 -100 -50 -150\nA -100 -150 50 -1 -899 0 1 0 N -50 -150 -100 -199\nA -100 -50 50 899 1 0 1 0 N -100 0 -50 -50\nA -100 -50 50 -1 -899 0 1 0 N -50 -50 -100 -99\nA -100 50 50 899 1 0 1 0 N -100 100 -50 50\nA -100 50 50 -1 -899 0 1 0 N -50 50 -100 1\nA -100 150 50 899 1 0 1 0 N -100 200 -50 150\nA -100 150 50 -1 -899 0 1 0 N -50 150 -100 101\nA 100 -350 50 899 -1799 0 1 0 N 100 -300 51 -350\nA 100 -350 50 1799 -899 0 1 0 N 51 -350 100 -399\nA 100 -250 50 899 -1799 0 1 0 N 100 -200 51 -250\nA 100 -250 50 1799 -899 0 1 0 N 51 -250 100 -299\nA 100 -150 50 899 -1799 0 1 0 N 100 -100 51 -150\nA 100 -150 50 1799 -899 0 1 0 N 51 -150 100 -199\nA 100 150 50 899 -1799 0 1 0 N 100 200 51 150\nA 100 150 50 1799 -899 0 1 0 N 51 150 100 101\nA 100 250 50 899 -1799 0 1 0 N 100 300 51 250\nA 100 250 50 1799 -899 0 1 0 N 51 250 100 201\nA 100 350 50 899 -1799 0 1 0 N 100 400 51 350\nA 100 350 50 1799 -899 0 1 0 N 51 350 100 301\nP 2 0 1 0 -20 -400 -20 400 N\nP 2 0 1 0 20 400 20 -400 N\nX IN+ 1 -400 200 300 R 50 50 1 1 P\nX PM 2 -400 0 300 R 50 50 1 1 P\nX IN- 3 -400 -200 300 R 50 50 1 1 P\nX OUT1A 4 400 400 300 L 50 50 1 1 P\nX OUT1B 5 400 100 300 L 50 50 1 1 P\nX OUT2A 6 400 -100 300 L 50 50 1 1 P\nX OUT2B 7 400 -400 300 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Varistor\n#\nDEF Varistor RV 0 0 N Y 1 F N\nF0 \"RV\" 125 0 50 V V C CNN\nF1 \"Varistor\" -125 0 50 V V C CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n RV_*\n Varistor*\n$ENDFPLIST\nDRAW\nT 0 -70 -80 50 0 0 0 U Normal 0 C C\nS -40 -100 40 100 0 1 10 N\nP 3 0 1 0 -75 100 -75 50 75 -50 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Varistor_US\n#\nDEF Varistor_US RV 0 0 N Y 1 F N\nF0 \"RV\" 125 0 50 V V C CNN\nF1 \"Varistor_US\" -125 0 50 V V C CNN\nF2 \"\" -70 0 50 V I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n RV_*\n Varistor*\n$ENDFPLIST\nDRAW\nT 0 -70 -80 50 0 0 0 U Normal 0 C C\nP 2 0 1 0 0 -90 0 -100 N\nP 2 0 1 0 0 90 0 100 N\nP 3 0 1 0 -75 100 -75 50 75 -50 N\nP 5 0 1 0 0 -30 40 -45 0 -60 -40 -75 0 -90 N\nP 5 0 1 0 0 30 40 15 0 0 -40 -15 0 -30 N\nP 5 0 1 0 0 90 40 75 0 60 -40 45 0 30 N\nX ~ 1 0 150 50 D 50 50 1 1 P\nX ~ 2 0 -150 50 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Voltage_Divider\n#\nDEF Voltage_Divider RN 0 0 Y N 1 F N\nF0 \"RN\" -175 0 50 V V C CNN\nF1 \"Voltage_Divider\" -100 0 50 V V C CNN\nF2 \"\" 475 0 50 V I C CNN\nF3 \"\" 200 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n SOT?23\n$ENDFPLIST\nDRAW\nC 0 1 10 0 1 0 F\nS -50 -150 50 150 0 1 10 f\nS -20 -133 20 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nP 2 0 1 0 0 -200 0 -135 N\nP 2 0 1 0 0 35 0 -35 N\nP 2 0 1 0 0 200 0 133 N\nP 2 0 1 0 50 0 0 0 N\nX ~ 1 0 250 100 D 50 50 1 1 P\nX ~ 2 150 0 100 L 50 50 1 1 P\nX ~ 3 0 -250 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Voltage_Divider_CenterPin1\n#\nDEF Voltage_Divider_CenterPin1 RN 0 0 Y N 1 F N\nF0 \"RN\" -175 0 50 V V C CNN\nF1 \"Voltage_Divider_CenterPin1\" -100 0 50 V V C CNN\nF2 \"\" 475 0 50 V I C CNN\nF3 \"\" 200 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n SOT?23\n$ENDFPLIST\nDRAW\nC 0 1 10 0 1 0 F\nS -50 -150 50 150 0 1 10 f\nS -20 -133 20 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nP 2 0 1 0 0 -200 0 -135 N\nP 2 0 1 0 0 35 0 -35 N\nP 2 0 1 0 0 200 0 133 N\nP 2 0 1 0 50 0 0 0 N\nX ~ 1 150 0 100 L 50 50 1 1 P\nX ~ 2 0 250 100 D 50 50 1 1 P\nX ~ 3 0 -250 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Voltage_Divider_CenterPin3\n#\nDEF Voltage_Divider_CenterPin3 RN 0 0 Y N 1 F N\nF0 \"RN\" -175 0 50 V V C CNN\nF1 \"Voltage_Divider_CenterPin3\" -100 0 50 V V C CNN\nF2 \"\" 475 0 50 V I C CNN\nF3 \"\" 200 0 50 H I C CNN\n$FPLIST\n R?Array?SIP*\n SOT?23\n$ENDFPLIST\nDRAW\nC 0 1 10 0 1 0 F\nS -50 -150 50 150 0 1 10 f\nS -20 -133 20 -33 0 1 10 N\nS -20 133 20 33 0 1 10 N\nP 2 0 1 0 0 -200 0 -135 N\nP 2 0 1 0 0 35 0 -35 N\nP 2 0 1 0 0 200 0 133 N\nP 2 0 1 0 50 0 0 0 N\nX ~ 1 0 250 100 D 50 50 1 1 P\nX ~ 2 0 -250 100 U 50 50 1 1 P\nX ~ 3 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Voltmeter_AC\n#\nDEF Voltmeter_AC MES 0 1 N N 1 F N\nF0 \"MES\" -130 40 50 H V R CNN\nF1 \"Voltmeter_AC\" -130 -30 50 H V R CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nA -20 -54 21 -1633 -167 0 1 0 N -40 -60 0 -60\nA 20 -65 21 140 1660 0 1 0 N 40 -60 0 -60\nC 0 0 100 0 1 10 N\nT 0 0 20 100 0 0 0 V Normal 0 C C\nP 2 0 0 0 -125 -125 -75 -75 N\nP 2 0 0 0 75 75 125 125 N\nP 3 0 0 0 75 125 125 125 125 75 N\nX ~ 1 0 -200 100 U 50 50 1 1 P\nX ~ 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Voltmeter_DC\n#\nDEF Voltmeter_DC MES 0 1 N N 1 F N\nF0 \"MES\" -130 40 50 H V R CNN\nF1 \"Voltmeter_DC\" -130 -30 50 H V R CNN\nF2 \"\" 0 100 50 V I C CNN\nF3 \"\" 0 100 50 V I C CNN\nDRAW\nC 0 0 100 0 1 10 N\nT 0 0 0 100 0 0 0 V Normal 0 C C\nP 2 0 0 0 -125 -125 -75 -75 N\nP 2 0 0 0 75 75 125 125 N\nP 3 0 0 0 75 125 125 125 125 75 N\nP 2 0 1 0 10 150 30 150 N\nP 2 0 1 0 20 160 20 140 N\nX - 1 0 -200 100 U 50 50 1 1 P\nX + 2 0 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Diode.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP 1.5KExxA\nD 1500W unidirectional TRANSZORB® Transient Voltage Suppressor, DO-201AE\nK diode TVS voltage suppressor\nF https://www.vishay.com/docs/88301/15ke.pdf\n$ENDCMP\n#\n$CMP 1.5KExxCA\nD 1500W bidirectional TRANSZORB® Transient Voltage Suppressor, DO-201AE\nK diode TVS voltage suppressor\nF https://www.vishay.com/docs/88301/15ke.pdf\n$ENDCMP\n#\n$CMP 1N4001\nD 50V 1A General Purpose Rectifier Diode, DO-41\nK diode\nF http://www.vishay.com/docs/88503/1n4001.pdf\n$ENDCMP\n#\n$CMP 1N4002\nD 100V 1A General Purpose Rectifier Diode, DO-41\nK diode\nF http://www.vishay.com/docs/88503/1n4001.pdf\n$ENDCMP\n#\n$CMP 1N4003\nD 200V 1A General Purpose Rectifier Diode, DO-41\nK diode\nF http://www.vishay.com/docs/88503/1n4001.pdf\n$ENDCMP\n#\n$CMP 1N4004\nD 400V 1A General Purpose Rectifier Diode, DO-41\nK diode\nF http://www.vishay.com/docs/88503/1n4001.pdf\n$ENDCMP\n#\n$CMP 1N4005\nD 600V 1A General Purpose Rectifier Diode, DO-41\nK diode\nF http://www.vishay.com/docs/88503/1n4001.pdf\n$ENDCMP\n#\n$CMP 1N4006\nD 800V 1A General Purpose Rectifier Diode, DO-41\nK diode\nF http://www.vishay.com/docs/88503/1n4001.pdf\n$ENDCMP\n#\n$CMP 1N4007\nD 1000V 1A General Purpose Rectifier Diode, DO-41\nK diode\nF http://www.vishay.com/docs/88503/1n4001.pdf\n$ENDCMP\n#\n$CMP 1N4148\nD 100V 0.15A standard switching diode, DO-35\nK diode\nF https://assets.nexperia.com/documents/data-sheet/1N4148_1N4448.pdf\n$ENDCMP\n#\n$CMP 1N4148W\nD 75V 0.15A Fast Switching Diode, SOD-123\nK diode\nF https://www.vishay.com/docs/85748/1n4148w.pdf\n$ENDCMP\n#\n$CMP 1N4148WS\nD 75V 0.15A Fast switching Diode, SOD-323\nK diode\nF https://www.vishay.com/docs/85751/1n4148ws.pdf\n$ENDCMP\n#\n$CMP 1N4148WT\nD 75V 0.15A Fast switching Diode, SOD-523\nK diode\nF https://www.diodes.com/assets/Datasheets/ds30396.pdf\n$ENDCMP\n#\n$CMP 1N4149\nD 75V Vrm 0.5A Ifsm standard switching diode, DO-35\nK diode\nF http://www.microsemi.com/document-portal/doc_view/11580-lds-0239\n$ENDCMP\n#\n$CMP 1N4151\nD 75V 0.5A standard switching diode, DO-35\nK diode\nF http://www.microsemi.com/document-portal/doc_view/11580-lds-0239\n$ENDCMP\n#\n$CMP 1N4448\nD 100V 0.15A High-speed standard diode, DO-35\nK diode\nF https://assets.nexperia.com/documents/data-sheet/1N4148_1N4448.pdf\n$ENDCMP\n#\n$CMP 1N4448W\nD 100V 0.15A High-speed standard diode, SOD-123\nK diode\nF https://www.vishay.com/docs/85722/1n4448w.pdf\n$ENDCMP\n#\n$CMP 1N4448WS\nD 75V 0.15A Small Signal Fast switching Diode, SOD-323\nK diode\nF https://www.vishay.com/docs/81387/1n4448ws.pdf\n$ENDCMP\n#\n$CMP 1N4448WT\nD 75V 0.15A Fast switching Diode, SOD-523\nK diode\nF http://www.mouser.com/ds/2/149/1N4148WT-461550.pdf\n$ENDCMP\n#\n$CMP 1N47xxA\nD 1300mW Silicon planar power Zener diodes, DO-41\nK zener diode\nF https://www.vishay.com/docs/85816/1n4728a.pdf\n$ENDCMP\n#\n$CMP 1N53xxB\nD 5000mW Zener Diode, DO-201\nK zener diode\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/1n5345b.pdf\n$ENDCMP\n#\n$CMP 1N5400\nD 50V 3A General Purpose Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88516/1n5400.pdf\n$ENDCMP\n#\n$CMP 1N5401\nD 100V 3A General Purpose Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88516/1n5400.pdf\n$ENDCMP\n#\n$CMP 1N5402\nD 200V 3A General Purpose Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88516/1n5400.pdf\n$ENDCMP\n#\n$CMP 1N5403\nD 300V 3A General Purpose Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88516/1n5400.pdf\n$ENDCMP\n#\n$CMP 1N5404\nD 400V 3A General Purpose Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88516/1n5400.pdf\n$ENDCMP\n#\n$CMP 1N5405\nD 500V 3A General Purpose Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88516/1n5400.pdf\n$ENDCMP\n#\n$CMP 1N5406\nD 600V 3A General Purpose Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88516/1n5400.pdf\n$ENDCMP\n#\n$CMP 1N5407\nD 800V 3A General Purpose Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88516/1n5400.pdf\n$ENDCMP\n#\n$CMP 1N5408\nD 1000V 3A General Purpose Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88516/1n5400.pdf\n$ENDCMP\n#\n$CMP 1N5711\nD 70V 33mA Schottky diode, DO-35\nK diode Schottky\nF https://www.microsemi.com/document-portal/doc_download/8865-lds-0040-datasheet\n$ENDCMP\n#\n$CMP 1N5711UR\nD 70V 33mA Schottky diode, MELF(DO-213AA)\nK diode Schottky\nF https://www.microsemi.com/document-portal/doc_download/131890-lds-0040-1-datasheet\n$ENDCMP\n#\n$CMP 1N5712\nD 20V 75mA Schottky diode, DO-35\nK diode Schottky\nF https://www.microsemi.com/document-portal/doc_download/8865-lds-0040-datasheet\n$ENDCMP\n#\n$CMP 1N5712UR\nD 20V 75mA Schottky diode, MELF(DO-213AA)\nK diode Schottky\nF https://www.microsemi.com/document-portal/doc_download/131890-lds-0040-1-datasheet\n$ENDCMP\n#\n$CMP 1N5817\nD 20V 1A Schottky Barrier Rectifier Diode, DO-41\nK diode Schottky\nF http://www.vishay.com/docs/88525/1n5817.pdf\n$ENDCMP\n#\n$CMP 1N5818\nD 30V 1A Schottky Barrier Rectifier Diode, DO-41\nK diode Schottky\nF http://www.vishay.com/docs/88525/1n5817.pdf\n$ENDCMP\n#\n$CMP 1N5819\nD 40V 1A Schottky Barrier Rectifier Diode, DO-41\nK diode Schottky\nF http://www.vishay.com/docs/88525/1n5817.pdf\n$ENDCMP\n#\n$CMP 1N5820\nD 20V 3A Schottky Barrier Rectifier Diode, DO-201AD\nK diode Schottky\nF http://www.vishay.com/docs/88526/1n5820.pdf\n$ENDCMP\n#\n$CMP 1N5821\nD 30V 3A Schottky Barrier Rectifier Diode, DO-201AD\nK diode Schottky\nF http://www.vishay.com/docs/88526/1n5820.pdf\n$ENDCMP\n#\n$CMP 1N5822\nD 40V 3A Schottky Barrier Rectifier Diode, DO-201AD\nK diode Schottky\nF http://www.vishay.com/docs/88526/1n5820.pdf\n$ENDCMP\n#\n$CMP 1N6263\nD 60V 15mA Schottky diode, DO-35\nK diode Schottky\nF www.st.com/resource/en/datasheet/1n6263.pdf\n$ENDCMP\n#\n$CMP 1N62xxA\nD 1500W unidirectional TRANSZORB® Transient Voltage Suppressor, DO-201AE\nK diode TVS voltage suppressor\nF https://www.vishay.com/docs/88301/15ke.pdf\n$ENDCMP\n#\n$CMP 1N62xxCA\nD 1500W bidirectional TRANSZORB® Transient Voltage Suppressor, DO-201AE\nK diode TVS voltage suppressor\nF https://www.vishay.com/docs/88301/15ke.pdf\n$ENDCMP\n#\n$CMP 1N630xA\nD 1500W unidirectional TRANSZORB® Transient Voltage Suppressor, DO-201AE\nK diode TVS voltage suppressor\nF https://www.vishay.com/docs/88301/15ke.pdf\n$ENDCMP\n#\n$CMP 1N630xCA\nD 1500W bidirectional TRANSZORB® Transient Voltage Suppressor, DO-201AE\nK diode TVS voltage suppressor\nF https://www.vishay.com/docs/88301/15ke.pdf\n$ENDCMP\n#\n$CMP 1N6857\nD 20V 150mA Schottky diode, DO-35\nK diode Schottky\nF https://www.microsemi.com/document-portal/doc_download/8865-lds-0040-datasheet\n$ENDCMP\n#\n$CMP 1N6857UR\nD 20V 150mA Schottky diode, MELF(DO-213AA)\nK diode Schottky\nF https://www.microsemi.com/document-portal/doc_download/131890-lds-0040-1-datasheet\n$ENDCMP\n#\n$CMP 1N6858\nD 70V 75mA Schottky diode, DO-35\nK diode Schottky\nF https://www.microsemi.com/document-portal/doc_download/8865-lds-0040-datasheet\n$ENDCMP\n#\n$CMP 1N6858UR\nD 70V 75mA Schottky diode, MELF(DO-213AA)\nK diode Schottky\nF https://www.microsemi.com/document-portal/doc_download/131890-lds-0040-1-datasheet\n$ENDCMP\n#\n$CMP 1N914\nD 100V 0.3A Small Signal Fast Switching Diode, DO-35\nK diode\nF http://www.vishay.com/docs/85622/1n914.pdf\n$ENDCMP\n#\n$CMP 1N914WT\nD 75V 0.15A Fast switching Diode, SOD-523\nK diode\nF http://www.mouser.com/ds/2/149/1N4148WT-461550.pdf\n$ENDCMP\n#\n$CMP 2BZX84Cxx\nD 300mW Double Zener Diode, SOT-23\nK zener diode\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/bzx84c2v4.pdf\n$ENDCMP\n#\n$CMP 5KPxxA\nD 5000W unidirectional Transient Voltage Suppressor, P-600\nK diode TVS voltage suppressor\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/5kp65.pdf\n$ENDCMP\n#\n$CMP 5KPxxCA\nD 5000W bidirectional Transient Voltage Suppressor, P-600\nK diode TVS voltage suppressor\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/5kp65.pdf\n$ENDCMP\n#\n$CMP B120-E3\nD 20V 1A Schottky Barrier Rectifier Diode, SMA(DO-214AC)\nK diode Schottky\nF http://www.vishay.com/docs/88946/b120.pdf\n$ENDCMP\n#\n$CMP B130-E3\nD 30V 1A Schottky Barrier Rectifier Diode, SMA(DO-214AC)\nK diode Schottky\nF http://www.vishay.com/docs/88946/b120.pdf\n$ENDCMP\n#\n$CMP B140-E3\nD 40V 1A Schottky Barrier Rectifier Diode, SMA(DO-214AC)\nK diode Schottky\nF http://www.vishay.com/docs/88946/b120.pdf\n$ENDCMP\n#\n$CMP B150-E3\nD 50V 1A Schottky Barrier Rectifier Diode, SMA(DO-214AC)\nK diode Schottky\nF http://www.vishay.com/docs/88946/b120.pdf\n$ENDCMP\n#\n$CMP B160-E3\nD 60V 1A Schottky Barrier Rectifier Diode, SMA(DO-214AC)\nK diode Schottky\nF http://www.vishay.com/docs/88946/b120.pdf\n$ENDCMP\n#\n$CMP B220\nD 20V 2A Schottky Barrier Rectifier Diode, SMB\nK diode Schottky\nF http://www.jameco.com/Jameco/Products/ProdDS/1538777.pdf\n$ENDCMP\n#\n$CMP B230\nD 30V 2A Schottky Barrier Rectifier Diode, SMB\nK diode Schottky\nF http://www.jameco.com/Jameco/Products/ProdDS/1538777.pdf\n$ENDCMP\n#\n$CMP B240\nD 40V 2A Schottky Barrier Rectifier Diode, SMB\nK diode Schottky\nF http://www.jameco.com/Jameco/Products/ProdDS/1538777.pdf\n$ENDCMP\n#\n$CMP B250\nD 50V 2A Schottky Barrier Rectifier Diode, SMB\nK diode Schottky\nF http://www.jameco.com/Jameco/Products/ProdDS/1538777.pdf\n$ENDCMP\n#\n$CMP B260\nD 60V 2A Schottky Barrier Rectifier Diode, SMB\nK diode Schottky\nF http://www.jameco.com/Jameco/Products/ProdDS/1538777.pdf\n$ENDCMP\n#\n$CMP B320\nD 20V 3A Schottky Barrier Rectifier Diode, SMC\nK diode Schottky\nF http://www.jameco.com/Jameco/Products/ProdDS/1538777.pdf\n$ENDCMP\n#\n$CMP B330\nD 30V 3A Schottky Barrier Rectifier Diode, SMC\nK diode Schottky\nF http://www.jameco.com/Jameco/Products/ProdDS/1538777.pdf\n$ENDCMP\n#\n$CMP B340\nD 40V 3A Schottky Barrier Rectifier Diode, SMC\nK diode Schottky\nF http://www.jameco.com/Jameco/Products/ProdDS/1538777.pdf\n$ENDCMP\n#\n$CMP B350\nD 50V 3A Schottky Barrier Rectifier Diode, SMC\nK diode Schottky\nF http://www.jameco.com/Jameco/Products/ProdDS/1538777.pdf\n$ENDCMP\n#\n$CMP B360\nD 60V 3A Schottky Barrier Rectifier Diode, SMC\nK diode Schottky\nF http://www.jameco.com/Jameco/Products/ProdDS/1538777.pdf\n$ENDCMP\n#\n$CMP BA157\nD 400V 1A Fast recovery Rectifier Diode, DO-41\nK diode\nF http://diotec.com/tl_files/diotec/files/pdf/datasheets/ba157\n$ENDCMP\n#\n$CMP BA158\nD 600V 1A Fast recovery Rectifier Diode, DO-41\nK diode\nF http://diotec.com/tl_files/diotec/files/pdf/datasheets/ba157\n$ENDCMP\n#\n$CMP BA159\nD 1000V 1A Fast recovery Rectifier Diode, DO-41\nK diode\nF http://diotec.com/tl_files/diotec/files/pdf/datasheets/ba157\n$ENDCMP\n#\n$CMP BA243\nD 20V 0.1A silicon planar diode for VHF tuner band selection, DO-35\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/BA243_TFK.pdf\n$ENDCMP\n#\n$CMP BA244\nD 20V 0.1A silicon planar diode for VHF tuner band selection, DO-35\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/BA243_TFK.pdf\n$ENDCMP\n#\n$CMP BA282\nD 35V 0.1A Band Switching Diode, DO-35\nK diode\nF http://docs-europe.electrocomponents.com/webdocs/1304/0900766b813040d6.pdf\n$ENDCMP\n#\n$CMP BA283\nD 35V 0.1A Band Switching Diode, DO-35\nK diode\nF http://docs-europe.electrocomponents.com/webdocs/1304/0900766b813040d6.pdf\n$ENDCMP\n#\n$CMP BAR42FILM\nD 30V 0.1A Small signal Schottky diode, SOT-23\nK diode Schottky\nF www.st.com/resource/en/datasheet/bar42.pdf\n$ENDCMP\n#\n$CMP BAR43FILM\nD 30V 0.1A Small signal Schottky diode, SOT-23\nK diode Schottky\nF www.st.com/resource/en/datasheet/bar43.pdf\n$ENDCMP\n#\n$CMP BAS16TW\nD Fast switching diode array 3 independent\nK diode\nF http://www.diodes.com/datasheets/ds30154.pdf\n$ENDCMP\n#\n$CMP BAS16VY\nD Fast switching diode array 3 independent\nK diode\nF https://assets.nexperia.com/documents/data-sheet/BAS16_SER.pdf\n$ENDCMP\n#\n$CMP BAS16W\nD 100V, 0.175A, High-speed Switching Diode, SOT-323\nK diode\nF https://assets.nexperia.com/documents/data-sheet/BAS16_SER.pdf\n$ENDCMP\n#\n$CMP BAS316\nD 100V, 0.25A, High-speed Switching Diode, SOD-323\nK diode\nF https://assets.nexperia.com/documents/data-sheet/BAS16_SER.pdf\n$ENDCMP\n#\n$CMP BAS40-04\nD 40V 0.2A Dual Small Signal Schottky Diodes\nK Schottky, Diode\nF http://www.vishay.com/docs/85701/bas40v.pdf\n$ENDCMP\n#\n$CMP BAS516\nD 100V, 0.25A, High-speed Switching Diode, SOD-523\nK diode\nF https://assets.nexperia.com/documents/data-sheet/BAS16_SER.pdf\n$ENDCMP\n#\n$CMP BAT41\nD 100V 0.1A Small Signal Schottky Diode, DO-35\nK diode Schottky\nF http://www.vishay.com/docs/85659/bat41.pdf\n$ENDCMP\n#\n$CMP BAT42\nD 30V 0.2A Small Signal Schottky Diode, DO-35\nK diode Schottky\nF http://www.vishay.com/docs/85660/bat42.pdf\n$ENDCMP\n#\n$CMP BAT42W-V\nD 30V 0.2A Small Signal Schottky diode, SOD-123\nK diode Schottky\nF http://www.vishay.com/docs/85660/bat42.pdf\n$ENDCMP\n#\n$CMP BAT43\nD 30V 0.2A Small Signal Schottky Diode, DO-35\nK diode Schottky\nF http://www.vishay.com/docs/85660/bat42.pdf\n$ENDCMP\n#\n$CMP BAT43W-V\nD 30V 0.2A Small Signal Schottky diode, SOD-123\nK diode Schottky\nF http://www.vishay.com/docs/85660/bat42.pdf\n$ENDCMP\n#\n$CMP BAT46\nD 100V 0.15A Small Signal Schottky Diode, DO-35\nK diode Schottky\nF http://www.vishay.com/docs/85662/bat46.pdf\n$ENDCMP\n#\n$CMP BAT48JFILM\nD 40V 0.35A Small Signal Schottky Diode, SOD-323\nK diode Schottky\nF www.st.com/resource/en/datasheet/bat48.pdf\n$ENDCMP\n#\n$CMP BAT48RL\nD 40V 0.35A Small Signal Schottky Diode, DO-35\nK diode Schottky\nF www.st.com/resource/en/datasheet/bat48.pdf\n$ENDCMP\n#\n$CMP BAT48ZFILM\nD 40V 0.35A Small Signal Schottky Diode, SOD-123\nK diode Schottky\nF www.st.com/resource/en/datasheet/bat48.pdf\n$ENDCMP\n#\n$CMP BAT54A\nD schottky barrier diode\nK schottky diode\nF http://www.diodes.com/_files/datasheets/ds11005.pdf\n$ENDCMP\n#\n$CMP BAT54ADW\nD Schottky diode array 2 pair Com A\nK diode\nF http://www.diodes.com/datasheets/ds30152.pdf\n$ENDCMP\n#\n$CMP BAT54AW\nD Dual schottky barrier diode, common anode, SOT-323\nK dual schottky diode\nF https://assets.nexperia.com/documents/data-sheet/BAT54W_SER.pdf\n$ENDCMP\n#\n$CMP BAT54C\nD dual schottky barrier diode, common cathode\nK schottky diode common cathode\nF http://www.diodes.com/_files/datasheets/ds11005.pdf\n$ENDCMP\n#\n$CMP BAT54CW\nD Dual schottky barrier diode, common cathode, SOT-323\nK dual schottky diode\nF https://assets.nexperia.com/documents/data-sheet/BAT54W_SER.pdf\n$ENDCMP\n#\n$CMP BAT54J\nD 30V 200mA Schottky diode, SOD-323F\nK diode Schottky\nF https://assets.nexperia.com/documents/data-sheet/BAT54J.pdf\n$ENDCMP\n#\n$CMP BAT54S\nD schottky barrier diode\nK schottky diode\nF https://www.diodes.com/assets/Datasheets/ds11005.pdf\n$ENDCMP\n#\n$CMP BAT54SW\nD Dual schottky barrier diode, in series, SOT-323\nK dual schottky diode\nF https://assets.nexperia.com/documents/data-sheet/BAT54W_SER.pdf\n$ENDCMP\n#\n$CMP BAT54W\nD Schottky barrier diode, SOT-323\nK schottky diode\nF https://assets.nexperia.com/documents/data-sheet/BAT54W_SER.pdf\n$ENDCMP\n#\n$CMP BAT60A\nD 10V 3A High Current Recitifier Schottky Diode, SOD-323\nK diode Schottky\nF https://www.infineon.com/dgdl/Infineon-BAT60ASERIES-DS-v01_01-en.pdf?fileId=db3a304313d846880113def70c9304a9\n$ENDCMP\n#\n$CMP BAT85\nD 30V 0.2A Schottky barrier single diode, DO-35\nK diode Schottky\nF https://assets.nexperia.com/documents/data-sheet/BAT85.pdf\n$ENDCMP\n#\n$CMP BAT86\nD 50V 0.2A Small Signal Schottky Diode, DO-35\nK diode Schottky\nF https://assets.nexperia.com/documents/data-sheet/BAT86.pdf\n$ENDCMP\n#\n$CMP BAT86S\nD 50V 0.2A Small Signal Schottky Diode, DO-35\nK diode Schottky\nF http://www.vishay.com/docs/85514/bat86s.pdf\n$ENDCMP\n#\n$CMP BAV16W\nD 75V 0.15A Fast Switching Diode, SOD-123\nK diode\nF https://www.diodes.com/assets/Datasheets/ds30086.pdf\n$ENDCMP\n#\n$CMP BAV17\nD 20V 0.25A Small Signal Switching Diode, High Voltage, DO-35\nK diode\nF http://www.vishay.com/docs/85543/bav17.pdf\n$ENDCMP\n#\n$CMP BAV18\nD 50V 0.25A Small Signal Switching Diode, High Voltage, DO-35\nK diode\nF http://www.vishay.com/docs/85543/bav17.pdf\n$ENDCMP\n#\n$CMP BAV19\nD 100V 0.25A Small Signal Switching Diode, High Voltage, DO-35\nK diode\nF http://www.vishay.com/docs/85543/bav17.pdf\n$ENDCMP\n#\n$CMP BAV199DW\nD Quad Surface Mount Low Leakage Diode, SOT-363\nK Quad diode\nF https://www.diodes.com/assets/Datasheets/ds30417.pdf\n$ENDCMP\n#\n$CMP BAV20\nD 150V 0.25A Small Signal Switching Diode, High Voltage, DO-35\nK diode\nF http://www.vishay.com/docs/85543/bav17.pdf\n$ENDCMP\n#\n$CMP BAV21\nD 200V 0.25A Small Signal Switching Diode, High Voltage, DO-35\nK diode\nF http://www.vishay.com/docs/85543/bav17.pdf\n$ENDCMP\n#\n$CMP BAV300\nD 50V 0.25A Switching Diode, High Voltage, MicroMELF\nK diode\nF http://www.vishay.com/docs/85545/bav300.pdf\n$ENDCMP\n#\n$CMP BAV301\nD 100V 0.25A Switching Diode, High Voltage, MicroMELF\nK diode\nF http://www.vishay.com/docs/85545/bav300.pdf\n$ENDCMP\n#\n$CMP BAV302\nD 150V 0.25A Switching Diode, High Voltage, MicroMELF\nK diode\nF http://www.vishay.com/docs/85545/bav300.pdf\n$ENDCMP\n#\n$CMP BAV303\nD 200V 0.25A Switching Diode, High Voltage, MicroMELF\nK diode\nF http://www.vishay.com/docs/85545/bav300.pdf\n$ENDCMP\n#\n$CMP BAV70\nD Dual 100V 215mA high-speed switching diodes, common cathode, SOT-23\nK diode\nF https://assets.nexperia.com/documents/data-sheet/BAV70_SER.pdf\n$ENDCMP\n#\n$CMP BAV70M\nD Dual 100V 150mA high-speed switching diodes, common cathode, SOT-883\nK diode\nF https://assets.nexperia.com/documents/data-sheet/BAV70_SER.pdf\n$ENDCMP\n#\n$CMP BAV70S\nD 100V 250mA high-speed switching diodes, dual common cathode, SOT-363\nK diode\nF https://assets.nexperia.com/documents/data-sheet/BAV70_SER.pdf\n$ENDCMP\n#\n$CMP BAV70T\nD Dual 100V 150mA high-speed switching diodes, common cathode, SOT-416\nK diode\nF https://assets.nexperia.com/documents/data-sheet/BAV70_SER.pdf\n$ENDCMP\n#\n$CMP BAV70W\nD Dual 100V 175mA high-speed switching diodes, common cathode, SOT-323\nK diode\nF https://assets.nexperia.com/documents/data-sheet/BAV70_SER.pdf\n$ENDCMP\n#\n$CMP BAV756S\nD High-speed switching diodes, dual common anode/common cathode, SOT-363\nK Diode\nF https://assets.nexperia.com/documents/data-sheet/BAV756S_BAW56_SER.pdf\n$ENDCMP\n#\n$CMP BAV99\nD BAV99 High-speed switching diodes, SOT-23\nK diode\nF https://assets.nexperia.com/documents/data-sheet/BAV99_SER.pdf\n$ENDCMP\n#\n$CMP BAV99S\nD High-speed switching diodes, dual series, SOT-363\nK Diode\nF https://assets.nexperia.com/documents/data-sheet/BAV99_SER.pdf\n$ENDCMP\n#\n$CMP BAW56DW\nD Switching diode array 2 pair Com A\nK diode\nF http://www.diodes.com/datasheets/ds30146.pdf\n$ENDCMP\n#\n$CMP BAW56S\nD High Speed Switching Diode Array 2 pair Com A\nK diode\nF https://assets.nexperia.com/documents/data-sheet/BAV756S_BAW56_SER.pdf\n$ENDCMP\n#\n$CMP BAW75\nD 25V 0.45A Small Signal Switching Diode, DO-35\nK diode\nF http://www.vishay.com/docs/85550/baw75.pdf\n$ENDCMP\n#\n$CMP BAW76\nD 50V 0.3A Small Signal Fast Switching Diode, DO-35\nK diode\nF http://www.vishay.com/docs/85551/baw76.pdf\n$ENDCMP\n#\n$CMP BAY93\nD 20V 0.115A Very Fast Switching Diode, DO-35\nK diode\nF https://cdn-reichelt.de/documents/datenblatt/A400/BAY93_TFK.pdf\n$ENDCMP\n#\n$CMP BYV79-100\nD 100V 14A Ultrafast Rectifier Diode, TO-220\nK diode\nF http://pdf.datasheetcatalog.com/datasheet/philips/BYV79-100.pdf\n$ENDCMP\n#\n$CMP BYV79-150\nD 150V 14A Ultrafast Rectifier Diode, TO-220\nK diode\nF http://pdf.datasheetcatalog.com/datasheet/philips/BYV79-100.pdf\n$ENDCMP\n#\n$CMP BYV79-200\nD 200V 14A Ultrafast Rectifier Diode, TO-220\nK diode\nF http://pdf.datasheetcatalog.com/datasheet/philips/BYV79-100.pdf\n$ENDCMP\n#\n$CMP BZD27Cxx\nD 800mW Zener Diode, 3.6-200V, SMF\nK zener diode\nF https://www.vishay.com/docs/85153/bzd27series.pdf\n$ENDCMP\n#\n$CMP BZM55Bxx\nD 500mW Zener Diode, 2%, MicroMELF\nK zener diode\nF http://www.vishay.com/docs/85597/bzm55.pdf\n$ENDCMP\n#\n$CMP BZM55Cxx\nD 500mW Zener Diode, 6%, MicroMELF\nK zener diode\nF http://www.vishay.com/docs/85597/bzm55.pdf\n$ENDCMP\n#\n$CMP BZT52Bxx\nD 500mW Zener Diode, SOD-123\nK zener diode\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/bzt52b2v4.pdf\n$ENDCMP\n#\n$CMP BZX384-xxx\nD 300mW Zener Diode, SOD-323\nK zener diode\nF https://assets.nexperia.com/documents/data-sheet/BZX384_SERIES.pdf\n$ENDCMP\n#\n$CMP BZX84Cxx\nD 300mW Zener Diode, SOT-23\nK zener diode\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/bzx84c2v4.pdf\n$ENDCMP\n#\n$CMP C3D02060A\nD 600V, 2A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/55/C3D02060A.pdf\n$ENDCMP\n#\n$CMP C3D02060E\nD 600V, 2A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/116/C3D02060E.pdf\n$ENDCMP\n#\n$CMP C3D02060F\nD 600V, 2A, SiC Schottky Diode, TO-220F\nK sic diode\nF https://www.wolfspeed.com/media/downloads/35/C3D02060F.pdf\n$ENDCMP\n#\n$CMP C3D02065E\nD 650V, 2A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/118/C3D02065E.pdf\n$ENDCMP\n#\n$CMP C3D03060A\nD 600V, 3A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/57/C3D03060A.pdf\n$ENDCMP\n#\n$CMP C3D03060E\nD 600V, 3A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/119/C3D03060E.pdf\n$ENDCMP\n#\n$CMP C3D03060F\nD 600V, 3A, SiC Schottky Diode, TO-220F\nK sic diode\nF https://www.wolfspeed.com/media/downloads/39/C3D03060F.pdf\n$ENDCMP\n#\n$CMP C3D03065E\nD 650V, 3A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/121/C3D03065E.pdf\n$ENDCMP\n#\n$CMP C3D04060A\nD 600V, 4A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/845/C3D04060A.pdf\n$ENDCMP\n#\n$CMP C3D04060E\nD 600V, 4A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/122/C3D04060E.pdf\n$ENDCMP\n#\n$CMP C3D04060F\nD 600V, 4A, SiC Schottky Diode, TO-220F\nK sic diode\nF https://www.wolfspeed.com/media/downloads/41/C3D04060F.pdf\n$ENDCMP\n#\n$CMP C3D04065A\nD 650V, 4A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/841/C3D04065A.pdf\n$ENDCMP\n#\n$CMP C3D04065E\nD 650V, 4A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/124/C3D04065E.pdf\n$ENDCMP\n#\n$CMP C3D06060A\nD 600V, 6A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/844/C3D06060A.pdf\n$ENDCMP\n#\n$CMP C3D06060F\nD 600V, 6A, SiC Schottky Diode, TO-220F\nK sic diode\nF https://www.wolfspeed.com/media/downloads/43/C3D06060F.pdf\n$ENDCMP\n#\n$CMP C3D06060G\nD 600V, 6A, SiC Schottky Diode, TO-263\nK sic diode\nF https://www.wolfspeed.com/media/downloads/137/C3D06060G.pdf\n$ENDCMP\n#\n$CMP C3D06065A\nD 650V, 6A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/65/C3D06065A.pdf\n$ENDCMP\n#\n$CMP C3D06065E\nD 650V, 6A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/125/C3D06065E.pdf\n$ENDCMP\n#\n$CMP C3D06065I\nD 650V, 6A, SiC Schottky Diode, Isolated TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/44/C3D06065I.pdf\n$ENDCMP\n#\n$CMP C3D08060A\nD 600V, 8A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/843/C3D08060A.pdf\n$ENDCMP\n#\n$CMP C3D08060G\nD 600V, 8A, SiC Schottky Diode, TO-263\nK sic diode\nF https://www.wolfspeed.com/media/downloads/141/C3D08060G.pdf\n$ENDCMP\n#\n$CMP C3D08065A\nD 650V, 8A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/840/C3D08065A.pdf\n$ENDCMP\n#\n$CMP C3D08065E\nD 650V, 8A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/839/C3D08065E.pdf\n$ENDCMP\n#\n$CMP C3D08065I\nD 650V, 8A, SiC Schottky Diode, Isolated TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/47/C3D08065I.pdf\n$ENDCMP\n#\n$CMP C3D10060A\nD 600V, 10A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/842/C3D10060A.pdf\n$ENDCMP\n#\n$CMP C3D10060G\nD 600V, 10A, SiC Schottky Diode, TO-263\nK sic diode\nF https://www.wolfspeed.com/media/downloads/143/C3D10060G.pdf\n$ENDCMP\n#\n$CMP C3D10065A\nD 650V, 10A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/73/C3D10065A.pdf\n$ENDCMP\n#\n$CMP C3D10065E\nD 650V, 10A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/127/C3D10065E.pdf\n$ENDCMP\n#\n$CMP C3D10065I\nD 650V, 10A, SiC Schottky Diode, Isolated TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/49/C3D10065I.pdf\n$ENDCMP\n#\n$CMP C3D10170H\nD 1700V, 10A, SiC Schottky Diode, TO-247\nK sic diode\nF https://www.wolfspeed.com/media/downloads/96/C3D10170H.pdf\n$ENDCMP\n#\n$CMP C3D12065A\nD 650V, 12A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/963/C3D12065A.pdf\n$ENDCMP\n#\n$CMP C3D16060D\nD 600V, 16A, SiC Schottky Diode, TO-247-3\nK sic diode\nF https://www.wolfspeed.com/media/downloads/98/C3D16060D.pdf\n$ENDCMP\n#\n$CMP C3D16065A\nD 650V, 16A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/964/C3D16065A.pdf\n$ENDCMP\n#\n$CMP C3D16065D\nD 650V, 16A, SiC Schottky Diode, TO-247-3\nK sic diode\nF https://www.wolfspeed.com/media/downloads/99/C3D16065D.pdf\n$ENDCMP\n#\n$CMP C3D1P7060Q\nD 600V, 1.7A, SiC Schottky Diode, QFN\nK sic diode\nF https://www.wolfspeed.com/media/downloads/846/C3D1P7060Q.pdf\n$ENDCMP\n#\n$CMP C3D20060D\nD 600V, 20A, SiC Schottky Diode, TO-247-3\nK sic diode\nF https://www.wolfspeed.com/media/downloads/100/C3D20060D.pdf\n$ENDCMP\n#\n$CMP C3D20065D\nD 650V, 20A, SiC Schottky Diode, TO-247-3\nK sic diode\nF https://www.wolfspeed.com/media/downloads/102/C3D20065D.pdf\n$ENDCMP\n#\n$CMP C3D25170H\nD 1700V, 25A, SiC Schottky Diode, TO-247\nK sic diode\nF https://www.wolfspeed.com/media/downloads/103/C3D25170H.pdf\n$ENDCMP\n#\n$CMP C3D30065D\nD 650V, 30A, SiC Schottky Diode, TO-247-3\nK sic diode\nF https://www.wolfspeed.com/media/downloads/969/C3D30065D.pdf\n$ENDCMP\n#\n$CMP C4D02120A\nD 1200V, 2A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/75/C4D02120A.pdf\n$ENDCMP\n#\n$CMP C4D02120E\nD 1200V, 2A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/128/C4D02120E.pdf\n$ENDCMP\n#\n$CMP C4D05120A\nD 1200V, 5A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/77/C4D05120A.pdf\n$ENDCMP\n#\n$CMP C4D05120E\nD 1200V, 5A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/130/C4D05120E.pdf\n$ENDCMP\n#\n$CMP C4D08120A\nD 1200V, 8A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/80/C4D08120A.pdf\n$ENDCMP\n#\n$CMP C4D08120E\nD 1200V, 8A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/132/C4D08120E.pdf\n$ENDCMP\n#\n$CMP C4D10120A\nD 1200V, 10A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/82/C4D10120A.pdf\n$ENDCMP\n#\n$CMP C4D10120D\nD 1200V, 10A, SiC Schottky Diode, TO-247-3\nK sic diode\nF https://www.wolfspeed.com/media/downloads/104/C4D10120D.pdf\n$ENDCMP\n#\n$CMP C4D10120E\nD 1200V, 10A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/134/C4D10120E.pdf\n$ENDCMP\n#\n$CMP C4D10120H\nD 1200V, 10A, SiC Schottky Diode, TO-247\nK sic diode\nF https://www.wolfspeed.com/media/downloads/1189/C4D10120H.pdf\n$ENDCMP\n#\n$CMP C4D15120A\nD 1200V, 15A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/84/C4D15120A.pdf\n$ENDCMP\n#\n$CMP C4D15120D\nD 1200V, 15A, SiC Schottky Diode, TO-247-3\nK sic diode\nF https://www.wolfspeed.com/media/downloads/848/C4D15120D.pdf\n$ENDCMP\n#\n$CMP C4D15120H\nD 1200V, 15A, SiC Schottky Diode, TO-247\nK sic diode\nF https://www.wolfspeed.com/media/downloads/1190/C4D15120H.pdf\n$ENDCMP\n#\n$CMP C4D20120A\nD 1200V, 20A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/85/C4D20120A.pdf\n$ENDCMP\n#\n$CMP C4D20120D\nD 1200V, 20A, SiC Schottky Diode, TO-247-3\nK sic diode\nF https://www.wolfspeed.com/media/downloads/106/C4D20120D.pdf\n$ENDCMP\n#\n$CMP C4D20120H\nD 1200V, 20A, SiC Schottky Diode, TO-247\nK sic diode\nF https://www.wolfspeed.com/media/downloads/1191/C4D20120H.pdf\n$ENDCMP\n#\n$CMP C4D30120D\nD 1200V, 30A, SiC Schottky Diode, TO-247-3\nK sic diode\nF https://www.wolfspeed.com/media/downloads/108/C4D30120D.pdf\n$ENDCMP\n#\n$CMP C4D40120D\nD 1200V, 40A, SiC Schottky Diode, TO-247-3\nK sic diode\nF https://www.wolfspeed.com/media/downloads/109/C4D40120D.pdf\n$ENDCMP\n#\n$CMP C5D50065D\nD 650V, 50A, SiC Schottky Diode, TO-247-3\nK sic diode\nF https://www.wolfspeed.com/media/downloads/111/C5D50065D.pdf\n$ENDCMP\n#\n$CMP CD4148W\nD 75V 0.15A Switching Diode, 0805\nK diode\nF https://www.dccomponents.com/upload/product/original/806236332588.pdf\n$ENDCMP\n#\n$CMP CSD01060A\nD 600V, 1A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/87/CSD01060.pdf\n$ENDCMP\n#\n$CMP CSD01060E\nD 600V, 1A, SiC Schottky Diode, TO-252\nK sic diode\nF https://www.wolfspeed.com/media/downloads/87/CSD01060.pdf\n$ENDCMP\n#\n$CMP CVFD20065A\nD 650V, 20A, SiC Schottky Diode, TO-220\nK sic diode\nF https://www.wolfspeed.com/media/downloads/89/CVFD20065A.pdf\n$ENDCMP\n#\n$CMP Central_Semi_CMKD4448\nD High speed switching diode array 3 independent\nK diode\nF http://www.centralsemi.com/PDFs/products/CMKD4448.PDF\n$ENDCMP\n#\n$CMP Central_Semi_CMKD6001\nD Ultra low leakage switching diode array 3 independent\nK diode\nF http://www.centralsemi.com/PDFs/products/CMKD6001.PDF\n$ENDCMP\n#\n$CMP Comchip_ACDSV6-4448TI-G\nD Small signal switching diode array 3 independent\nK diode\nF http://www.comchiptech.com/cms/UserFiles/ACDSV6-4448TI-G%20RevA285610.pdf\n$ENDCMP\n#\n$CMP Comchip_CDSV6-4148-G\nD Fast switching diode array 3 independent\nK diode\nF http://www.comchiptech.com/cms/UserFiles/CDSV6-16-G,4148-G%20RevA272279.pdf\n$ENDCMP\n#\n$CMP Comchip_CDSV6-4448TI-G\nD High speed switching diode array 3 independent\nK diode\nF http://www.comchiptech.com/cms/UserFiles/CDSV6-4448XX-G%20RevC285574.pdf\n$ENDCMP\n#\n$CMP DB3\nD 32V 2A Bidirectional trigger diode, DO-35\nK AC diode DIAC\nF http://cdn-reichelt.de/documents/datenblatt/A100/DB%203%23st.pdf\n$ENDCMP\n#\n$CMP DB4\nD 34V 2A Bidirectional trigger diode, DO-35\nK AC diode DIAC\nF http://cdn-reichelt.de/documents/datenblatt/A100/DB%203%23st.pdf\n$ENDCMP\n#\n$CMP DC34\nD 40V 2A Bidirectional trigger diode, DO-35\nK AC diode DIAC\nF http://cdn-reichelt.de/documents/datenblatt/A100/DB%203%23st.pdf\n$ENDCMP\n#\n$CMP DSB2810\nD 20V 75mA Schottky diode, DO-35\nK diode Schottky\nF https://www.microsemi.com/document-portal/doc_download/8865-lds-0040-datasheet\n$ENDCMP\n#\n$CMP DSB5712\nD 20V 75mA Schottky diode, DO-35\nK diode Schottky\nF https://www.microsemi.com/document-portal/doc_download/8865-lds-0040-datasheet\n$ENDCMP\n#\n$CMP DZ2S030X0L\nD 150mW Silicon Planar Zener Diode, 3.0V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S03000L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S033X0L\nD 150mW Silicon Planar Zener Diode, 3.3V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S03300L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S036X0L\nD 150mW Silicon Planar Zener Diode, 3.6V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S03600L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S039X0L\nD 150mW Silicon Planar Zener Diode, 3.9V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S03900L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S047X0L\nD 150mW Silicon Planar Zener Diode, 4.7V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S04700L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S051X0L\nD 150mW Silicon Planar Zener Diode, 5.1V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S05100L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S056X0L\nD 150mW Silicon Planar Zener Diode, 5.6V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S05600L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S068X0L\nD 150mW Silicon Planar Zener Diode, 6.8V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S06800L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S082X0L\nD 150mW Silicon Planar Zener Diode, 8.2V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S08200L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S100X0L\nD 150mW Silicon Planar Zener Diode, 10V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S10000L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S110X0L\nD 150mW Silicon Planar Zener Diode, 11V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S11000L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S120X0L\nD 150mW Silicon Planar Zener Diode, 12V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S12000L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S130X0L\nD 150mW Silicon Planar Zener Diode, 13V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S13000L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S150X0L\nD 150mW Silicon Planar Zener Diode, 15V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S15000L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S160X0L\nD 150mW Silicon Planar Zener Diode, 16V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S16000L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S180X0L\nD 150mW Silicon Planar Zener Diode, 18V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S18000L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S200X0L\nD 150mW Silicon Planar Zener Diode, 20V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S20000L_E.pdf\n$ENDCMP\n#\n$CMP DZ2S360X0L\nD 150mW Silicon Planar Zener Diode, 36V, SOD-523\nK zener diode\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/DZ2S36000L_E.pdf\n$ENDCMP\n#\n$CMP ESD9B3.3ST5G\nD ESD protection diode, 3.3Vrwm, SOD-923\nK diode TVS ESD\nF https://www.onsemi.com/pub/Collateral/ESD9B-D.PDF\n$ENDCMP\n#\n$CMP ESD9B5.0ST5G\nD ESD protection diode, 5.0Vrwm, SOD-923\nK diode TVS ESD\nF https://www.onsemi.com/pub/Collateral/ESD9B-D.PDF\n$ENDCMP\n#\n$CMP HN2D02FU\nD Ultra high speed switching diode array 3 independent\nK diode\nF http://www.onsemi.com/pub_link/Collateral/HN2D02FUTW1T1-D.PDF\n$ENDCMP\n#\n$CMP IDDD04G65C6\nD 650V, 4A, SiC Schottky Diode, CoolSiC, PG-HDSOP-10-1 (DDPAK)\nK sic diode\nF https://www.infineon.com/dgdl/Infineon-IDDD04G65C6-DS-v02_00-EN.pdf?fileId=5546d462625a528f01628f749daa0e03\n$ENDCMP\n#\n$CMP IDDD06G65C6\nD 650V, 6A, SiC Schottky Diode, CoolSiC, PG-HDSOP-10-1 (DDPAK)\nK sic diode\nF https://www.infineon.com/dgdl/Infineon-IDDD06G65C6-DS-v02_00-EN.pdf?fileId=5546d462625a528f01628f86ff8c0e09\n$ENDCMP\n#\n$CMP IDDD08G65C6\nD 650V, 8A, SiC Schottky Diode, CoolSiC, PG-HDSOP-10-1 (DDPAK)\nK sic diode\nF https://www.infineon.com/dgdl/Infineon-IDDD08G65C6-DS-v02_00-EN.pdf?fileId=5546d462625a528f01628ff7d31a104b\n$ENDCMP\n#\n$CMP IDDD10G65C6\nD 650V, 10A, SiC Schottky Diode, CoolSiC, PG-HDSOP-10-1 (DDPAK)\nK sic diode\nF https://www.infineon.com/dgdl/Infineon-IDDD10G65C6-DS-v02_00-EN.pdf?fileId=5546d462625a528f01628ff848ec1051\n$ENDCMP\n#\n$CMP IDDD12G65C6\nD 650V, 12A, SiC Schottky Diode, CoolSiC, PG-HDSOP-10-1 (DDPAK)\nK sic diode\nF https://www.infineon.com/dgdl/Infineon-IDDD12G65C6-DS-v02_00-EN.pdf?fileId=5546d462625a528f01628f86ec3e0e06\n$ENDCMP\n#\n$CMP IDDD16G65C6\nD 650V, 16A, SiC Schottky Diode, CoolSiC, PG-HDSOP-10-1 (DDPAK)\nK sic diode\nF https://www.infineon.com/dgdl/Infineon-IDDD16G65C6-DS-v02_00-EN.pdf?fileId=5546d462625a528f01628f8711b50e0c\n$ENDCMP\n#\n$CMP IDDD20G65C6\nD 650V, 20A, SiC Schottky Diode, CoolSiC, PG-HDSOP-10-1 (DDPAK)\nK sic diode\nF https://www.infineon.com/dgdl/Infineon-IDDD20G65C6-DS-v02_00-EN.pdf?fileId=5546d462625a528f01628ff837cf104e\n$ENDCMP\n#\n$CMP LL41\nD 100V 0.1A Small Signal Schottky diode, MiniMELF\nK diode Schottky\nF http://www.vishay.com/docs/85659/bat41.pdf\n$ENDCMP\n#\n$CMP LL4148\nD 100V 0.15A standard switching diode, MiniMELF\nK diode\nF http://www.vishay.com/docs/85557/ll4148.pdf\n$ENDCMP\n#\n$CMP LL42\nD 30V 0.2A Small Signal Schottky diode, MiniMELF\nK diode Schottky\nF http://www.vishay.com/docs/85672/ll42.pdf\n$ENDCMP\n#\n$CMP LL43\nD 30V 0.2A Small Signal Schottky diode, MiniMELF\nK diode Schottky\nF http://www.vishay.com/docs/85672/ll42.pdf\n$ENDCMP\n#\n$CMP LL4448\nD 100V 0.15A standard switching diode, MiniMELF\nK diode\nF http://www.vishay.com/docs/85557/ll4148.pdf\n$ENDCMP\n#\n$CMP MBR0520\nD 20V 0.5A Schottky Power Rectifier Diode, SOD-123\nK diode Schottky\nF http://www.mccsemi.com/up_pdf/MBR0520~MBR0580(SOD123).pdf\n$ENDCMP\n#\n$CMP MBR0520LT\nD 20V 0.5A Schottky Power Rectifier Diode, SOD-123\nK diode Schottky\nF http://www.onsemi.com/pub_link/Collateral/MBR0520LT1-D.PDF\n$ENDCMP\n#\n$CMP MBR0530\nD 30V 0.5A Schottky Power Rectifier Diode, SOD-123\nK diode Schottky\nF http://www.mccsemi.com/up_pdf/MBR0520~MBR0580(SOD123).pdf\n$ENDCMP\n#\n$CMP MBR0540\nD 40V 0.5A Schottky Power Rectifier Diode, SOD-123\nK diode Schottky\nF http://www.mccsemi.com/up_pdf/MBR0520~MBR0580(SOD123).pdf\n$ENDCMP\n#\n$CMP MBR0550\nD 50V 0.5A Schottky Power Rectifier Diode, SOD-123\nK diode Schottky\nF http://www.mccsemi.com/up_pdf/MBR0520~MBR0580(SOD123).pdf\n$ENDCMP\n#\n$CMP MBR0560\nD 60V 0.5A Schottky Power Rectifier Diode, SOD-123\nK diode Schottky\nF http://www.mccsemi.com/up_pdf/MBR0520~MBR0580(SOD123).pdf\n$ENDCMP\n#\n$CMP MBR0570\nD 70V 0.5A Schottky Power Rectifier Diode, SOD-123\nK diode Schottky\nF http://www.mccsemi.com/up_pdf/MBR0520~MBR0580(SOD123).pdf\n$ENDCMP\n#\n$CMP MBR0580\nD 80V 0.5A Schottky Power Rectifier Diode, SOD-123\nK diode Schottky\nF http://www.mccsemi.com/up_pdf/MBR0520~MBR0580(SOD123).pdf\n$ENDCMP\n#\n$CMP MBR340\nD 40V 3A Schottky Barrier Rectifier Diode, DO-201AD\nK diode Schottky\nF http://www.onsemi.com/pub_link/Collateral/MBR340-D.PDF\n$ENDCMP\n#\n$CMP MBR735\nD 35V 7.5A Schottky Barrier Rectifier Diode, TO-220\nK diode Schottky\nF http://www.onsemi.com/pub_link/Collateral/MBR735-D.PDF\n$ENDCMP\n#\n$CMP MBR745\nD 45V 7.5A Schottky Barrier Rectifier Diode, TO-220\nK diode Schottky\nF http://www.onsemi.com/pub_link/Collateral/MBR735-D.PDF\n$ENDCMP\n#\n$CMP MBRA340\nD 40V 3A Schottky Barrier Rectifier Diode, SMA(DO-214AC)\nK diode Schottky\nF https://www.onsemi.com/pub/Collateral/MBRA340T3-D.PDF\n$ENDCMP\n#\n$CMP MCL4148\nD 75V 0.2A Switching Diode, MicroMELF\nK diode\nF http://www.vishay.com/docs/85566/mlc4148.pdf\n$ENDCMP\n#\n$CMP MCL4448\nD 75V 0.2A Switching Diode, MicroMELF\nK diode\nF http://www.vishay.com/docs/85566/mlc4148.pdf\n$ENDCMP\n#\n$CMP MM3Zxx\nD 300mW Zener Diode, SOD-123F\nK zener diode\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/mm3z2v4.pdf\n$ENDCMP\n#\n$CMP MM5Zxx\nD 300mW Zener Diode, SOD-523\nK zener diode\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/mm5z2v4.pdf\n$ENDCMP\n#\n$CMP MMBD4148TW\nD Fast switching diode array 3 independent\nK diode\nF http://www.diodes.com/datasheets/ds30154.pdf\n$ENDCMP\n#\n$CMP MMBD4448HADW\nD Fast Switching Diode Array 2 pair Com A\nK diode\nF http://www.diodes.com/datasheets/ds30153.pdf\n$ENDCMP\n#\n$CMP MMBD4448HCQW\nD Quad Switching Diode Array Common Cathode\nK diode\nF http://www.diodes.com/datasheets/ds30153.pdf\n$ENDCMP\n#\n$CMP MMBD4448HTW\nD Fast switching diode array 3 independent\nK diode\nF http://www.diodes.com/datasheets/ds30153.pdf\n$ENDCMP\n#\n$CMP MMBZxx\nD Double Zener Diode, Common Anode, 225mW, SOT-23\nK dual zener diode\nF http://www.onsemi.com/pub/Collateral/MMBZ5V6ALT1-D.PDF\n$ENDCMP\n#\n$CMP MMSD4148\nD 100V 200mA Switching Diode, SOD-123\nK diode\nF https://www.onsemi.com/pub/Collateral/MMSD4148T1-D.PDF\n$ENDCMP\n#\n$CMP MMSD914\nD 100V 0.2A Switching Diode, SOD-123\nK diode\nF https://www.onsemi.com/pub/Collateral/MMSD914T1-D.PDF\n$ENDCMP\n#\n$CMP MRA4003T3G\nD 300V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK diode\nF http://www.onsemi.com/pub_link/Collateral/MRA4003T3-D.PDF\n$ENDCMP\n#\n$CMP MRA4004T3G\nD 400V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK diode\nF http://www.onsemi.com/pub_link/Collateral/MRA4003T3-D.PDF\n$ENDCMP\n#\n$CMP MRA4005T3G\nD 600V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK diode\nF http://www.onsemi.com/pub_link/Collateral/MRA4003T3-D.PDF\n$ENDCMP\n#\n$CMP MRA4006T3G\nD 800V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK diode\nF http://www.onsemi.com/pub_link/Collateral/MRA4003T3-D.PDF\n$ENDCMP\n#\n$CMP MRA4007T3G\nD 1000V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK diode\nF http://www.onsemi.com/pub_link/Collateral/MRA4003T3-D.PDF\n$ENDCMP\n#\n$CMP NRVA4003T3G\nD 300V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK AEC-Q101\nF http://www.onsemi.com/pub_link/Collateral/MRA4003T3-D.PDF\n$ENDCMP\n#\n$CMP NRVA4004T3G\nD 400V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK AEC-Q101\nF http://www.onsemi.com/pub_link/Collateral/MRA4003T3-D.PDF\n$ENDCMP\n#\n$CMP NRVA4005T3G\nD 600V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK AEC-Q101\nF http://www.onsemi.com/pub_link/Collateral/MRA4003T3-D.PDF\n$ENDCMP\n#\n$CMP NRVA4006T3G\nD 800V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK AEC-Q101\nF http://www.onsemi.com/pub_link/Collateral/MRA4003T3-D.PDF\n$ENDCMP\n#\n$CMP NRVA4007T3G\nD 1000V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK AEC-Q101\nF http://www.onsemi.com/pub_link/Collateral/MRA4003T3-D.PDF\n$ENDCMP\n#\n$CMP NSR0340HT1G\nD 40V 0.25A Schottky Diode, SOD-323\nK diode Schottky\nF https://www.onsemi.com/pub/Collateral/NSR0340H-D.PDF\n$ENDCMP\n#\n$CMP PMEG1020EH\nD 10V, 2A ultra low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG1020EH_EJ.pdf\n$ENDCMP\n#\n$CMP PMEG1020EJ\nD 10V, 2A ultra low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG1020EH_EJ.pdf\n$ENDCMP\n#\n$CMP PMEG1030EH\nD 10V, 3A ultra low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG1030EH_EJ.pdf\n$ENDCMP\n#\n$CMP PMEG1030EJ\nD 10V, 3A ultra low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG1030EH_EJ.pdf\n$ENDCMP\n#\n$CMP PMEG2005EH\nD 20V, 500mA very low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEGXX05EH_EJ_SER.pdf\n$ENDCMP\n#\n$CMP PMEG2005EJ\nD 20V, 500mA very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEGXX05EH_EJ_SER.pdf\n$ENDCMP\n#\n$CMP PMEG2010AEH\nD 20V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG2010AEH_PMEG2010AET.pdf\n$ENDCMP\n#\n$CMP PMEG2010AEJ\nD 20V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG2010AEJ.pdf\n$ENDCMP\n#\n$CMP PMEG2010AET\nD 20V, 1A very low Vf MEGA Schottky barrier rectifier, SOT-23\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG2010AEH_PMEG2010AET.pdf\n$ENDCMP\n#\n$CMP PMEG2010EH\nD 20V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG2010EH_EJ_ET.pdf\n$ENDCMP\n#\n$CMP PMEG2010EJ\nD 20V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG2010EH_EJ_ET.pdf\n$ENDCMP\n#\n$CMP PMEG2010ET\nD 20V, 1A very low Vf MEGA Schottky barrier rectifier, SOT-23\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG2010EH_EJ_ET.pdf\n$ENDCMP\n#\n$CMP PMEG2015EH\nD 20V, 1.5A very low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG2015EH_EJ.pdf\n$ENDCMP\n#\n$CMP PMEG2015EJ\nD 20V, 1.5A very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG2015EH_EJ.pdf\n$ENDCMP\n#\n$CMP PMEG2020EH\nD 20V, 2A very low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG2020EH_EJ.pdf\n$ENDCMP\n#\n$CMP PMEG2020EJ\nD 20V, 2A very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG2020EH_EJ.pdf\n$ENDCMP\n#\n$CMP PMEG3002EJ\nD 30V, 200mA low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG3002EJ.pdf\n$ENDCMP\n#\n$CMP PMEG3005EH\nD 30V, 500mA very low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEGXX05EH_EJ_SER.pdf\n$ENDCMP\n#\n$CMP PMEG3005EJ\nD 30V, 500mA very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEGXX05EH_EJ_SER.pdf\n$ENDCMP\n#\n$CMP PMEG3010CEH\nD 30V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG3010CEH_PMEG3010CEJ.pdf\n$ENDCMP\n#\n$CMP PMEG3010CEJ\nD 30V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG3010CEH_PMEG3010CEJ.pdf\n$ENDCMP\n#\n$CMP PMEG3010EH\nD 30V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG3010EH_EJ_ET.pdf\n$ENDCMP\n#\n$CMP PMEG3010EJ\nD 30V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG3010EH_EJ_ET.pdf\n$ENDCMP\n#\n$CMP PMEG3010ET\nD 30V, 1A very low Vf MEGA Schottky barrier rectifier, SOT-23\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG3010EH_EJ_ET.pdf\n$ENDCMP\n#\n$CMP PMEG3015EH\nD 30V, 1.5A ultra low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG3015EH_EJ.pdf\n$ENDCMP\n#\n$CMP PMEG3015EJ\nD 30V, 1.5A ultra low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG3015EH_EJ.pdf\n$ENDCMP\n#\n$CMP PMEG3020EH\nD 30V, 2A ultra low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG3020EH_EJ.pdf\n$ENDCMP\n#\n$CMP PMEG3020EJ\nD 30V, 2A ultra low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG3020EH_EJ.pdf\n$ENDCMP\n#\n$CMP PMEG4002EJ\nD 40V, 200mA low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG4002EJ.pdf\n$ENDCMP\n#\n$CMP PMEG4005CEJ\nD 40V, 500mA low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG4005CEJ.pdf\n$ENDCMP\n#\n$CMP PMEG4005EH\nD 40V, 500mA very low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEGXX05EH_EJ_SER.pdf\n$ENDCMP\n#\n$CMP PMEG4005EJ\nD 40V, 500mA very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEGXX05EH_EJ_SER.pdf\n$ENDCMP\n#\n$CMP PMEG4010CEH\nD 40V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG4010CEH_PMEG4010CEJ.pdf\n$ENDCMP\n#\n$CMP PMEG4010CEJ\nD 40V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG4010CEH_PMEG4010CEJ.pdf\n$ENDCMP\n#\n$CMP PMEG4010EH\nD 40V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG4010EH_EJ_ET.pdf\n$ENDCMP\n#\n$CMP PMEG4010EJ\nD 40V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG4010EH_EJ_ET.pdf\n$ENDCMP\n#\n$CMP PMEG4010ET\nD 40V, 1A very low Vf MEGA Schottky barrier rectifier, SOT-23\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG4010EH_EJ_ET.pdf\n$ENDCMP\n#\n$CMP PMEG4050EP\nD 40V, 5A low Vf Schottky barrier rectifier, SOD-128\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG4050EP.pdf\n$ENDCMP\n#\n$CMP PMEG6002EJ\nD 60V, 200mA very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG6002EJ.pdf\n$ENDCMP\n#\n$CMP PMEG6010CEH\nD 60V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-123F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG6010CEH_PMEG6010CEJ.pdf\n$ENDCMP\n#\n$CMP PMEG6010CEJ\nD 60V, 1A very low Vf MEGA Schottky barrier rectifier, SOD-323F\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG6010CEH_PMEG6010CEJ.pdf\n$ENDCMP\n#\n$CMP PMEG6030EP\nD 60V, 3A low Vf MEGA Schottky barrier rectifier, SOD-128\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG6030EP.pdf\n$ENDCMP\n#\n$CMP PMEG6045ETP\nD 60V, 4.5A High-Temperature Schottky barrier rectifier, SOD-128\nK forward voltage diode\nF https://assets.nexperia.com/documents/data-sheet/PMEG6045ETP.pdf\n$ENDCMP\n#\n$CMP Panasonic_MA5J002E\nD Quad Ultra high Speed Switching Diode Array Com K\nK diode\nF http://www.semicon.panasonic.co.jp/ds4/MA5J002E_BED_discon.pdf\n$ENDCMP\n#\n$CMP Rohm_UMN1N\nD High-speed switching diodes 2 pair Com A\nK diode\nF http://rohmfs.rohm.com/en/products/databook/datasheet/discrete/diode/switching/ump11n.pdf\n$ENDCMP\n#\n$CMP Rohm_UMP11N\nD  High-speed switching diodes 2 pair Com A\nK diode\nF http://rohmfs.rohm.com/en/products/databook/datasheet/discrete/diode/switching/ump11n.pdf\n$ENDCMP\n#\n$CMP S2JTR\nD 600V 2A General Purpose Rectifier Diode, SMB\nK diode\nF http://www.smc-diodes.com/propdf/S2A-S2M%20N0562%20REV.A.pdf\n$ENDCMP\n#\n$CMP SB120\nD 20V 1A Schottky Barrier Rectifier Diode, DO-41\nK diode Schottky\nF http://www.diodes.com/_files/datasheets/ds23022.pdf\n$ENDCMP\n#\n$CMP SB130\nD 30V 1A Schottky Barrier Rectifier Diode, DO-41\nK diode Schottky\nF http://www.diodes.com/_files/datasheets/ds23022.pdf\n$ENDCMP\n#\n$CMP SB140\nD 40V 1A Schottky Barrier Rectifier Diode, DO-41\nK diode Schottky\nF http://www.diodes.com/_files/datasheets/ds23022.pdf\n$ENDCMP\n#\n$CMP SB150\nD 50V 1A Schottky Barrier Rectifier Diode, DO-41\nK diode Schottky\nF http://www.diodes.com/_files/datasheets/ds23022.pdf\n$ENDCMP\n#\n$CMP SB160\nD 60V 1A Schottky Barrier Rectifier Diode, DO-41\nK diode Schottky\nF http://www.diodes.com/_files/datasheets/ds23022.pdf\n$ENDCMP\n#\n$CMP SD05_SOD323\nD 5V, 450W Discrete Bidirectional TVS Diode, SOD-323\nK transient voltage suppressor thyrector transil\nF https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sd_c_datasheet.pdf.pdf\n$ENDCMP\n#\n$CMP SD103ATW\nD Schottky Barrier Diode Array, SOT-363\nK schottky barrier diode array\nF https://www.diodes.com/assets/Datasheets/ds30374.pdf\n$ENDCMP\n#\n$CMP SD12_SOD323\nD 12V, 450W Discrete Bidirectional TVS Diode, SOD-323\nK transient voltage suppressor thyrector transil\nF https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sd_c_datasheet.pdf.pdf\n$ENDCMP\n#\n$CMP SD15_SOD323\nD 15V, 450W Discrete Bidirectional TVS Diode, SOD-323\nK transient voltage suppressor thyrector transil\nF https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sd_c_datasheet.pdf.pdf\n$ENDCMP\n#\n$CMP SD24_SOD323\nD 24V, 450W Discrete Bidirectional TVS Diode, SOD-323\nK transient voltage suppressor thyrector transil\nF https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sd_c_datasheet.pdf.pdf\n$ENDCMP\n#\n$CMP SD36_SOD323\nD 36V, 450W Discrete Bidirectional TVS Diode, SOD-323\nK transient voltage suppressor thyrector transil\nF https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sd_c_datasheet.pdf.pdf\n$ENDCMP\n#\n$CMP SM2000\nD 2000V 1A General Purpose Rectifier Diode, MELF\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/SMD1N400%23DIO.pdf\n$ENDCMP\n#\n$CMP SM4001\nD 50V 1A General Purpose Rectifier Diode, MELF\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/SMD1N400%23DIO.pdf\n$ENDCMP\n#\n$CMP SM4002\nD 100V 1A General Purpose Rectifier Diode, MELF\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/SMD1N400%23DIO.pdf\n$ENDCMP\n#\n$CMP SM4003\nD 200V 1A General Purpose Rectifier Diode, MELF\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/SMD1N400%23DIO.pdf\n$ENDCMP\n#\n$CMP SM4004\nD 400V 1A General Purpose Rectifier Diode, MELF\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/SMD1N400%23DIO.pdf\n$ENDCMP\n#\n$CMP SM4005\nD 600V 1A General Purpose Rectifier Diode, MELF\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/SMD1N400%23DIO.pdf\n$ENDCMP\n#\n$CMP SM4006\nD 800V 1A General Purpose Rectifier Diode, MELF\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/SMD1N400%23DIO.pdf\n$ENDCMP\n#\n$CMP SM4007\nD 1000V 1A General Purpose Rectifier Diode, MELF\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/SMD1N400%23DIO.pdf\n$ENDCMP\n#\n$CMP SM513\nD 130V 1A General Purpose Rectifier Diode, MELF\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/SMD1N400%23DIO.pdf\n$ENDCMP\n#\n$CMP SM516\nD 1600V 1A General Purpose Rectifier Diode, MELF\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/SMD1N400%23DIO.pdf\n$ENDCMP\n#\n$CMP SM518\nD 1800V 1A General Purpose Rectifier Diode, MELF\nK diode\nF http://cdn-reichelt.de/documents/datenblatt/A400/SMD1N400%23DIO.pdf\n$ENDCMP\n#\n$CMP SM712_SOT23\nD 7V/12V, 600W Asymmetrical TVS Diode Array, SOT-23\nK transient voltage suppressor thyrector transil\nF https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sm712_datasheet.pdf.pdf\n$ENDCMP\n#\n$CMP SMZxxx\nD 2000mW Zener Diode, MELF\nK zener diode\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/smz1.pdf\n$ENDCMP\n#\n$CMP STTH212S\nD 1200V 2A High Voltage Ultrafast Diode, SMC\nK diode\nF https://www.st.com/resource/en/datasheet/stth212.pdf\n$ENDCMP\n#\n$CMP STTH212U\nD 1200V 2A High Voltage Ultrafast Diode, SMB\nK diode\nF https://www.st.com/resource/en/datasheet/stth212.pdf\n$ENDCMP\n#\n$CMP SZESD9B5.0ST5G\nD ESD protection diode, 5.0Vrwm, SOD-923\nK diode TVS ESD\nF https://www.onsemi.com/pub/Collateral/ESD9B-D.PDF\n$ENDCMP\n#\n$CMP Toshiba_HN1D01FU\nD Ultra High Speed Switching Diode Array 2 pair Com A\nK diode\nF http://www.toshiba.com/taec/components2/Datasheet_Sync/200901/DST_HN1D01FU-TDE_EN_1882.pdf\n$ENDCMP\n#\n$CMP UF5400\nD 50V 3A Soft Recovery Ultrafast Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88756/uf5400.pdf\n$ENDCMP\n#\n$CMP UF5401\nD 100V 3A Soft Recovery Ultrafast Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88756/uf5400.pdf\n$ENDCMP\n#\n$CMP UF5402\nD 200V 3A Soft Recovery Ultrafast Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88756/uf5400.pdf\n$ENDCMP\n#\n$CMP UF5403\nD 300V 3A Soft Recovery Ultrafast Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88756/uf5400.pdf\n$ENDCMP\n#\n$CMP UF5404\nD 400V 3A Soft Recovery Ultrafast Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88756/uf5400.pdf\n$ENDCMP\n#\n$CMP UF5405\nD 500V 3A Soft Recovery Ultrafast Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88756/uf5400.pdf\n$ENDCMP\n#\n$CMP UF5406\nD 600V 3A Soft Recovery Ultrafast Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88756/uf5400.pdf\n$ENDCMP\n#\n$CMP UF5407\nD 800V 3A Soft Recovery Ultrafast Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88756/uf5400.pdf\n$ENDCMP\n#\n$CMP UF5408\nD 1000V 3A Soft Recovery Ultrafast Rectifier Diode, DO-201AD\nK diode\nF http://www.vishay.com/docs/88756/uf5400.pdf\n$ENDCMP\n#\n$CMP US1A\nD 50V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Ultra Fast\nF https://www.diodes.com/assets/Datasheets/ds16008.pdf\n$ENDCMP\n#\n$CMP US1B\nD 100V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Ultra Fast\nF https://www.diodes.com/assets/Datasheets/ds16008.pdf\n$ENDCMP\n#\n$CMP US1D\nD 200V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Ultra Fast\nF https://www.diodes.com/assets/Datasheets/ds16008.pdf\n$ENDCMP\n#\n$CMP US1G\nD 400V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Ultra Fast\nF https://www.diodes.com/assets/Datasheets/ds16008.pdf\n$ENDCMP\n#\n$CMP US1J\nD 600V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Ultra Fast\nF https://www.diodes.com/assets/Datasheets/ds16008.pdf\n$ENDCMP\n#\n$CMP US1K\nD 800V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Ultra Fast\nF https://www.diodes.com/assets/Datasheets/ds16008.pdf\n$ENDCMP\n#\n$CMP US1M\nD 1000V, 1A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Ultra Fast\nF https://www.diodes.com/assets/Datasheets/ds16008.pdf\n$ENDCMP\n#\n$CMP US2AA\nD 50V, 1.5A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Super Fast\nF https://www.onsemi.com/pub/Collateral/US2AA-D.PDF\n$ENDCMP\n#\n$CMP US2BA\nD 100V, 1.5A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Super Fast\nF https://www.onsemi.com/pub/Collateral/US2AA-D.PDF\n$ENDCMP\n#\n$CMP US2DA\nD 200V, 1.5A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Super Fast\nF https://www.onsemi.com/pub/Collateral/US2AA-D.PDF\n$ENDCMP\n#\n$CMP US2FA\nD 300V, 1.5A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Super Fast\nF https://www.onsemi.com/pub/Collateral/US2AA-D.PDF\n$ENDCMP\n#\n$CMP US2GA\nD 400V, 1.5A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Super Fast\nF https://www.onsemi.com/pub/Collateral/US2AA-D.PDF\n$ENDCMP\n#\n$CMP US2JA\nD 600V, 1.5A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Super Fast\nF https://www.onsemi.com/pub/Collateral/US2AA-D.PDF\n$ENDCMP\n#\n$CMP US2KA\nD 800V, 1.5A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Super Fast\nF https://www.onsemi.com/pub/Collateral/US2AA-D.PDF\n$ENDCMP\n#\n$CMP US2MA\nD 1000V, 1.5A, General Purpose Rectifier Diode, SMA(DO-214AC)\nK Super Fast\nF https://www.onsemi.com/pub/Collateral/US2AA-D.PDF\n$ENDCMP\n#\n$CMP VS-6ESU06\nD 600V 6.0A Ultrafast Rectifier, TO-277A\nK diode fred\nF https://www.vishay.com/docs/94987/vs-6esu06hm3.pdf\n$ENDCMP\n#\n$CMP Z1SMAxxx\nD 1000mW Zener Diode, SMA(DO-214AC)\nK zener diode\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/z1sma1.pdf\n$ENDCMP\n#\n$CMP Z2SMBxxx\nD 2000mW Zener Diode, SMB(DO-214AA)\nK zener diode\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/z2smb1.pdf\n$ENDCMP\n#\n$CMP Z3SMCxxx\nD 3000mW Zener Diode, SMC(DO-214AB)\nK zener diode\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/z3smc1.pdf\n$ENDCMP\n#\n$CMP ZMDxx\nD 1000mW Zener Diode, MiniMELF\nK zener diode\nF http://diotec.com/tl_files/diotec/files/pdf/datasheets/zmd1\n$ENDCMP\n#\n$CMP ZMMxx\nD 500mW Zener Diode, MiniMELF\nK zener diode\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/zmm1.pdf\n$ENDCMP\n#\n$CMP ZMYxx\nD 1300mW Zener Diode, MELF\nK zener diode\nF http://www.vishay.com/docs/85790/zpy3v9.pdf\n$ENDCMP\n#\n$CMP ZPDxx\nD 500mW Zener Diode, DO-35\nK diode\nF http://diotec.com/tl_files/diotec/files/pdf/datasheets/zpd1\n$ENDCMP\n#\n$CMP ZPYxx\nD 1300mW Zener Diode, DO-41\nK zener diode\nF http://www.vishay.com/docs/85790/zpy3v9.pdf\n$ENDCMP\n#\n$CMP ZYxxx\nD 2000mW Zener Diode, DO-41\nK zener diode\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/zy1\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Diode.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# 1.5KExxA\n#\nDEF 1.5KExxA D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"1.5KExxA\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_DO-201AE_P15.24mm_Horizontal\" 0 -200 50 H I C CNN\nF3 \"\" -50 0 50 H I C CNN\nALIAS 1N62xxA 1N630xA\n$FPLIST\n D?DO?201AE*\n$ENDFPLIST\nDRAW\nP 3 0 1 10 -30 50 -50 50 -50 -50 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX A1 1 -150 0 100 R 50 50 1 1 P\nX A2 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 1.5KExxCA\n#\nDEF 1.5KExxCA D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"1.5KExxCA\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_DO-201AE_P15.24mm_Horizontal\" 0 -200 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS 1N62xxCA 1N630xCA\n$FPLIST\n D?DO?201AE*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 -100 -50 0 0 -100 50 -100 -50 N\nP 4 0 1 10 20 50 0 50 0 -50 -20 -50 N\nP 4 0 1 10 100 50 100 -50 0 0 100 50 N\nX A1 1 -150 0 100 R 50 50 1 1 P\nX A2 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 1N4001\n#\nDEF 1N4001 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"1N4001\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS 1N4002 1N4003 1N4004 1N4005 1N4006 1N4007 BA157 BA158 BA159\n$FPLIST\n D*DO?41*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 1N4148\n#\nDEF 1N4148 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"1N4148\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_DO-35_SOD27_P7.62mm_Horizontal\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS 1N4448 1N4149 1N4151 1N914 BA243 BA244 BA282 BA283 BAV17 BAV18 BAV19 BAV20 BAV21 BAW75 BAW76 BAY93\n$FPLIST\n D*DO?35*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 1N4148WS\n#\nDEF 1N4148WS D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"1N4148WS\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-323\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS 1N4448WS BAS316\n$FPLIST\n D*SOD?323*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 1N4148WT\n#\nDEF 1N4148WT D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"1N4148WT\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-523\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS 1N4448WT 1N914WT BAS516\n$FPLIST\n D*SOD?523*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 1N53xxB\n#\nDEF 1N53xxB D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"1N53xxB\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_DO-201_P15.24mm_Horizontal\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*DO?201*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 1N5400\n#\nDEF 1N5400 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"1N5400\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_DO-201AD_P15.24mm_Horizontal\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS 1N5401 1N5402 1N5404 1N5405 1N5406 1N5407 1N5408 UF5400 UF5401 UF5402 UF5403 UF5404 UF5405 UF5406 UF5407 UF5408 1N5403\n$FPLIST\n D*DO?201AD*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 1N5711UR\n#\nDEF 1N5711UR D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"1N5711UR\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_MELF\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS 1N5712UR 1N6857UR 1N6858UR\n$FPLIST\n D?MELF*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 1N5820\n#\nDEF 1N5820 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"1N5820\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_DO-201AD_P15.24mm_Horizontal\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS 1N5821 1N5822 MBR340\n$FPLIST\n D*DO?201AD*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 1N6263\n#\nDEF 1N6263 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"1N6263\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_DO-35_SOD27_P7.62mm_Horizontal\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS BAT41 BAT42 BAT43 BAT46 BAT48RL BAT85 BAT86S BAT86 1N5711 1N5712 1N6857 1N6858 DSB5712 DSB2810\n$FPLIST\n D*DO?35*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 2BZX84Cxx\n#\nDEF 2BZX84Cxx D 0 40 Y N 1 F N\nF0 \"D\" 150 100 50 H V L CNN\nF1 \"2BZX84Cxx\" 150 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 150 -100 50 H I L CNN\nF3 \"\" -100 0 50 V I C CNN\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 0 -100 10 0 1 0 F\nP 2 0 1 0 -100 -50 -100 100 N\nP 2 0 1 0 100 -50 100 100 N\nP 3 0 1 10 -150 50 -50 50 -50 30 N\nP 3 0 1 10 50 50 150 50 150 30 N\nP 4 0 1 0 -100 0 -100 -100 100 -100 100 0 N\nP 4 1 1 8 -150 -50 -50 -50 -100 50 -150 -50 N\nP 4 1 1 8 50 -50 150 -50 100 50 50 -50 N\nX K 1 -100 200 100 D 50 50 1 1 P\nX K 2 100 200 100 D 50 50 1 1 P\nX A 3 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 5KPxxA\n#\nDEF 5KPxxA D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"5KPxxA\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_P600_R-6_P20.00mm_Horizontal\" 0 -200 50 H I C CNN\nF3 \"\" -50 0 50 H I C CNN\n$FPLIST\n D?P600*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -30 50 -50 50 -50 -50 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX A1 1 -150 0 100 R 50 50 1 1 P\nX A2 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 5KPxxCA\n#\nDEF 5KPxxCA D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"5KPxxCA\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_P600_R-6_P20.00mm_Horizontal\" 0 -200 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D?P600*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 -100 -50 0 0 -100 50 -100 -50 N\nP 4 0 1 10 20 50 0 50 0 -50 -20 -50 N\nP 4 0 1 10 100 50 100 -50 0 0 100 50 N\nX A1 1 -150 0 100 R 50 50 1 1 P\nX A2 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# B120-E3\n#\nDEF B120-E3 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"B120-E3\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SMA\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS B130-E3 B140-E3 B150-E3 B160-E3 MBRA340\n$FPLIST\n D*SMA*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# B220\n#\nDEF B220 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"B220\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SMB\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS B230 B240 B250 B260\n$FPLIST\n D*SMB*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# B320\n#\nDEF B320 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"B320\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SMC\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS B330 B340 B350 B360\n$FPLIST\n D*SMC*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAR42FILM\n#\nDEF BAR42FILM D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BAR42FILM\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS BAR43FILM\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX A 1 150 0 100 L 50 50 1 1 P\nX NC 2 150 100 100 L 50 50 1 1 N N\nX K 3 -150 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAS16TW\n#\nDEF BAS16TW D 0 40 Y N 3 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BAS16TW\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 0 -175 50 H I C CNN\nF3 \"\" 0 100 50 H I C CNN\nALIAS BAS16VY MMBD4148TW MMBD4448HTW HN2D02FU Comchip_ACDSV6-4448TI-G Central_Semi_CMKD6001 Central_Semi_CMKD4448 Comchip_CDSV6-4148-G Comchip_CDSV6-4448TI-G\n$FPLIST\n *SOT?363*\n$ENDFPLIST\nDRAW\nP 2 0 1 6 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 2 0 1 0 50 50 50 -50 N\nP 3 0 1 0 50 50 -50 0 50 -50 N\nX A 1 150 0 100 L 50 50 1 1 P\nX K 6 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 2 1 P\nX K 5 -150 0 100 R 50 50 2 1 P\nX A 3 150 0 100 L 50 50 3 1 P\nX K 4 -150 0 100 R 50 50 3 1 P\nENDDRAW\nENDDEF\n#\n# BAS16W\n#\nDEF BAS16W D 0 20 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BAS16W\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-323_SC-70\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT?323*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX A 1 150 0 100 L 50 50 1 1 P\nX NC 2 -50 0 100 R 50 50 1 1 N N\nX K 3 -150 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAS40-04\n#\nDEF BAS40-04 D 0 40 Y Y 1 F N\nF0 \"D\" 25 -50 50 H V L CNN\nF1 \"BAS40-04\" -250 225 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" -250 300 50 H I L CNN\nF3 \"\" -120 100 50 H I C CNN\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 0 100 10 0 1 0 F\nP 2 0 1 0 -150 100 -50 100 N\nP 2 0 1 0 -125 50 -125 60 N\nP 2 0 1 0 -100 50 -125 50 N\nP 2 0 1 0 -100 50 -100 150 N\nP 2 0 1 0 -100 150 -75 150 N\nP 2 0 1 0 -75 100 75 100 N\nP 2 0 1 0 -75 150 -75 140 N\nP 2 0 1 0 50 100 150 100 N\nP 2 0 1 0 125 50 125 60 N\nP 2 0 1 0 150 50 125 50 N\nP 2 0 1 0 150 50 150 150 N\nP 2 0 1 0 150 150 175 150 N\nP 2 0 1 0 175 150 175 140 N\nP 4 0 1 0 -175 150 -175 50 -100 100 -175 150 N\nP 4 0 1 0 75 150 75 50 150 100 75 150 N\nX ~ 1 -300 100 150 R 50 50 1 1 P\nX ~ 2 300 100 150 L 50 50 1 1 P\nX ~ 3 0 -100 200 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAT48JFILM\n#\nDEF BAT48JFILM D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BAT48JFILM\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-323\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS NSR0340HT1G BAT60A\n$FPLIST\n D*SOD?323*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAT48ZFILM\n#\nDEF BAT48ZFILM D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BAT48ZFILM\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-123\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS MBR0520LT MBR0520 MBR0530 MBR0540 MBR0550 MBR0560 MBR0570 MBR0580 BAT42W-V BAT43W-V\n$FPLIST\n D*SOD?123*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAT54A\n#\nDEF BAT54A D 0 40 Y Y 1 F N\nF0 \"D\" 25 -150 50 H V L CNN\nF1 \"BAT54A\" -250 125 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 75 125 50 H I L CNN\nF3 \"\" -120 0 50 H I C CNN\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -175 50 -175 40 N\nP 2 0 1 0 -150 -50 -150 50 N\nP 2 0 1 0 -150 -50 -125 -50 N\nP 2 0 1 0 -150 0 -50 0 N\nP 2 0 1 0 -150 50 -175 50 N\nP 2 0 1 0 -125 -50 -125 -40 N\nP 2 0 1 0 -75 0 75 0 N\nP 2 0 1 0 50 0 150 0 N\nP 2 0 1 0 125 -50 125 -40 N\nP 2 0 1 0 150 -50 125 -50 N\nP 2 0 1 0 150 -50 150 50 N\nP 2 0 1 0 150 50 175 50 N\nP 2 0 1 0 175 50 175 40 N\nP 4 0 1 0 -75 50 -75 -50 -150 0 -75 50 N\nP 4 0 1 0 75 50 75 -50 150 0 75 50 N\nX ~ 1 -300 0 150 R 50 50 1 1 P\nX ~ 2 300 0 150 L 50 50 1 1 P\nX ~ 3 0 -200 200 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAT54ADW\n#\nDEF BAT54ADW D 0 40 Y N 4 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BAT54ADW\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 0 -175 50 H I C CNN\nF3 \"\" 0 100 50 H I C CNN\n$FPLIST\n SOT?363*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 -50 50 50 N\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 0 50 50 -50 0 50 -50 N\nP 6 0 1 0 -25 25 -25 50 -50 50 -50 -50 -75 -50 -75 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 6 150 0 100 L 50 50 1 1 P\nX K 2 -150 0 100 R 50 50 2 1 P\nX A 6 150 0 100 L 50 50 2 1 P\nX A 3 150 0 100 L 50 50 3 1 P\nX K 4 -150 0 100 R 50 50 3 1 P\nX A 3 150 0 100 L 50 50 4 1 P\nX K 5 -150 0 100 R 50 50 4 1 P\nENDDRAW\nENDDEF\n#\n# BAT54AW\n#\nDEF BAT54AW D 0 40 Y Y 1 F N\nF0 \"D\" 25 -150 50 H V L CNN\nF1 \"BAT54AW\" -250 125 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-323_SC-70\" 75 125 50 H I L CNN\nF3 \"\" -120 0 50 H I C CNN\n$FPLIST\n SOT?323*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -175 50 -175 40 N\nP 2 0 1 0 -150 -50 -150 50 N\nP 2 0 1 0 -150 -50 -125 -50 N\nP 2 0 1 0 -150 0 -50 0 N\nP 2 0 1 0 -150 50 -175 50 N\nP 2 0 1 0 -125 -50 -125 -40 N\nP 2 0 1 0 -75 0 75 0 N\nP 2 0 1 0 50 0 150 0 N\nP 2 0 1 0 125 -50 125 -40 N\nP 2 0 1 0 150 -50 125 -50 N\nP 2 0 1 0 150 -50 150 50 N\nP 2 0 1 0 150 50 175 50 N\nP 2 0 1 0 175 50 175 40 N\nP 4 0 1 0 -75 50 -75 -50 -150 0 -75 50 N\nP 4 0 1 0 75 50 75 -50 150 0 75 50 N\nX ~ 1 -300 0 150 R 50 50 1 1 P\nX ~ 2 300 0 150 L 50 50 1 1 P\nX ~ 3 0 -200 200 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAT54C\n#\nDEF BAT54C D 0 40 Y Y 1 F N\nF0 \"D\" 25 -150 50 H V L CNN\nF1 \"BAT54C\" -250 125 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 75 125 50 H I L CNN\nF3 \"\" -80 0 50 H I C CNN\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -75 0 75 0 N\nP 2 0 1 0 -75 50 -75 40 N\nP 2 0 1 0 -50 -50 -25 -50 N\nP 2 0 1 0 -50 0 -150 0 N\nP 2 0 1 0 -50 50 -75 50 N\nP 2 0 1 0 -50 50 -50 -50 N\nP 2 0 1 0 -25 -50 -25 -40 N\nP 2 0 1 0 25 -50 25 -40 N\nP 2 0 1 0 50 -50 25 -50 N\nP 2 0 1 0 50 50 50 -50 N\nP 2 0 1 0 50 50 75 50 N\nP 2 0 1 0 75 50 75 40 N\nP 2 0 1 0 150 0 50 0 N\nP 4 0 1 0 -125 -50 -125 50 -50 0 -125 -50 N\nP 4 0 1 0 125 -50 125 50 50 0 125 -50 N\nX ~ 1 -300 0 150 R 50 50 1 1 P\nX ~ 2 300 0 150 L 50 50 1 1 P\nX ~ 3 0 -200 200 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAT54CW\n#\nDEF BAT54CW D 0 40 Y Y 1 F N\nF0 \"D\" 25 -150 50 H V L CNN\nF1 \"BAT54CW\" -250 125 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-323_SC-70\" 75 125 50 H I L CNN\nF3 \"\" -80 0 50 H I C CNN\n$FPLIST\n SOT?323*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -75 0 75 0 N\nP 2 0 1 0 -75 50 -75 40 N\nP 2 0 1 0 -50 -50 -25 -50 N\nP 2 0 1 0 -50 0 -150 0 N\nP 2 0 1 0 -50 50 -75 50 N\nP 2 0 1 0 -50 50 -50 -50 N\nP 2 0 1 0 -25 -50 -25 -40 N\nP 2 0 1 0 25 -50 25 -40 N\nP 2 0 1 0 50 -50 25 -50 N\nP 2 0 1 0 50 50 50 -50 N\nP 2 0 1 0 50 50 75 50 N\nP 2 0 1 0 75 50 75 40 N\nP 2 0 1 0 150 0 50 0 N\nP 4 0 1 0 -125 -50 -125 50 -50 0 -125 -50 N\nP 4 0 1 0 125 -50 125 50 50 0 125 -50 N\nX ~ 1 -300 0 150 R 50 50 1 1 P\nX ~ 2 300 0 150 L 50 50 1 1 P\nX ~ 3 0 -200 200 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAT54J\n#\nDEF BAT54J D 0 20 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BAT54J\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-323F\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*SOD?323F*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAT54S\n#\nDEF BAT54S D 0 40 Y Y 1 F N\nF0 \"D\" 25 -150 50 H V L CNN\nF1 \"BAT54S\" -250 125 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 75 125 50 H I L CNN\nF3 \"\" -120 0 50 H I C CNN\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 -50 0 N\nP 2 0 1 0 -125 -50 -125 -40 N\nP 2 0 1 0 -100 -50 -125 -50 N\nP 2 0 1 0 -100 -50 -100 50 N\nP 2 0 1 0 -100 50 -75 50 N\nP 2 0 1 0 -75 0 75 0 N\nP 2 0 1 0 -75 50 -75 40 N\nP 2 0 1 0 50 0 150 0 N\nP 2 0 1 0 125 -50 125 -40 N\nP 2 0 1 0 150 -50 125 -50 N\nP 2 0 1 0 150 -50 150 50 N\nP 2 0 1 0 150 50 175 50 N\nP 2 0 1 0 175 50 175 40 N\nP 4 0 1 0 -175 50 -175 -50 -100 0 -175 50 N\nP 4 0 1 0 75 50 75 -50 150 0 75 50 N\nX ~ 1 -300 0 150 R 50 50 1 1 P\nX ~ 2 300 0 150 L 50 50 1 1 P\nX ~ 3 0 -200 200 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAT54SW\n#\nDEF BAT54SW D 0 40 Y Y 1 F N\nF0 \"D\" 25 -150 50 H V L CNN\nF1 \"BAT54SW\" -250 125 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-323_SC-70\" 75 125 50 H I L CNN\nF3 \"\" -120 0 50 H I C CNN\n$FPLIST\n SOT?323*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 -50 0 N\nP 2 0 1 0 -125 -50 -125 -40 N\nP 2 0 1 0 -100 -50 -125 -50 N\nP 2 0 1 0 -100 -50 -100 50 N\nP 2 0 1 0 -100 50 -75 50 N\nP 2 0 1 0 -75 0 75 0 N\nP 2 0 1 0 -75 50 -75 40 N\nP 2 0 1 0 50 0 150 0 N\nP 2 0 1 0 125 -50 125 -40 N\nP 2 0 1 0 150 -50 125 -50 N\nP 2 0 1 0 150 -50 150 50 N\nP 2 0 1 0 150 50 175 50 N\nP 2 0 1 0 175 50 175 40 N\nP 4 0 1 0 -175 50 -175 -50 -100 0 -175 50 N\nP 4 0 1 0 75 50 75 -50 150 0 75 50 N\nX ~ 1 -300 0 150 R 50 50 1 1 P\nX ~ 2 300 0 150 L 50 50 1 1 P\nX ~ 3 0 -200 200 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAT54W\n#\nDEF BAT54W D 0 40 Y N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BAT54W\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-323_SC-70\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT?323*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX A 1 150 0 100 L 50 50 1 1 P\nX NC 2 0 0 100 U 50 50 1 1 N N\nX K 3 -150 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAV70\n#\nDEF BAV70 D 0 30 Y N 1 F N\nF0 \"D\" 25 -100 50 H V L CNN\nF1 \"BAV70\" 0 100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 50 -50 50 50 50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX A 2 300 0 150 L 50 50 0 1 P\nX K 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# BAV70M\n#\nDEF BAV70M D 0 30 Y N 1 F N\nF0 \"D\" 25 -100 50 H V L CNN\nF1 \"BAV70M\" 0 100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-883\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT?883*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 50 -50 50 50 50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX A 2 300 0 150 L 50 50 0 1 P\nX K 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# BAV70S\n#\nDEF BAV70S D 0 30 Y N 2 F N\nF0 \"D\" 25 -100 50 H V L CNN\nF1 \"BAV70S\" 0 100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT?363*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 50 -50 50 50 50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX A 1 -300 0 150 R 50 50 1 1 P\nX A 2 300 0 150 L 50 50 1 1 P\nX K 6 0 -200 100 U 50 50 1 1 P\nX K 3 0 -200 100 U 50 50 2 1 P\nX A 4 -300 0 150 R 50 50 2 1 P\nX A 5 300 0 150 L 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# BAV70T\n#\nDEF BAV70T D 0 30 Y N 1 F N\nF0 \"D\" 25 -100 50 H V L CNN\nF1 \"BAV70T\" 0 100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-416\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT?416*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 50 -50 50 50 50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX A 2 300 0 150 L 50 50 0 1 P\nX K 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# BAV70W\n#\nDEF BAV70W D 0 30 Y N 1 F N\nF0 \"D\" 25 -100 50 H V L CNN\nF1 \"BAV70W\" 0 100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-323_SC-70\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT?323*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -150 0 150 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 50 -50 50 50 50 50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nX A 1 -300 0 150 R 50 50 0 1 P\nX A 2 300 0 150 L 50 50 0 1 P\nX K 3 0 -200 100 U 50 50 0 1 P\nENDDRAW\nENDDEF\n#\n# BAV756S\n#\nDEF BAV756S D 0 1 Y N 2 L N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BAV756S\" 0 200 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 0 -400 50 H I C CNN\nF3 \"\" 0 -400 50 H I C CNN\n$FPLIST\n SOT?363*\n$ENDFPLIST\nDRAW\nC 0 0 10 1 1 0 F\nC 0 0 5 2 1 0 N\nP 2 1 1 0 -200 0 200 0 N\nP 2 1 1 0 0 0 0 -100 N\nP 3 1 1 8 -50 -50 -50 50 -50 50 N\nP 3 1 1 8 50 -50 50 50 50 50 N\nP 6 1 1 8 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 1 1 8 150 -50 50 0 150 50 150 -50 150 -50 150 -50 N\nP 2 2 1 0 -200 0 200 0 N\nP 2 2 1 0 0 0 0 -100 N\nP 3 2 1 8 -150 50 -150 -50 -150 -50 N\nP 3 2 1 8 150 50 150 -50 150 -50 N\nP 6 2 1 8 -50 -50 -150 0 -50 50 -50 -50 -50 -50 -50 -50 N\nP 6 2 1 8 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX A1 1 -300 0 100 R 50 50 1 1 P\nX A4 5 300 0 100 L 50 50 1 1 P\nX CK 6 0 -200 100 U 50 50 1 1 P\nX K2 2 -300 0 100 R 50 50 2 1 P\nX CA 3 0 -200 100 U 50 50 2 1 P\nX K3 4 300 0 100 L 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# BAV99\n#\nDEF BAV99 D 0 20 Y N 1 F N\nF0 \"D\" 0 200 50 H V C CNN\nF1 \"BAV99\" 0 100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 0 -500 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 0 0 10 1 1 0 F\nP 2 0 1 0 -200 0 200 0 N\nP 2 1 1 0 0 0 0 -100 N\nP 3 1 1 8 -50 -50 -50 50 -50 50 N\nP 3 1 1 8 150 50 150 -50 150 -50 N\nP 6 1 1 8 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 1 1 8 50 50 150 0 50 -50 50 50 50 50 50 50 N\nX K 1 -300 0 100 R 50 50 1 1 P\nX A 2 300 0 100 L 50 50 1 1 P\nX K 3 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BAV99S\n#\nDEF BAV99S D 0 1 Y N 2 L N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BAV99S\" 0 200 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 0 -500 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS BAV199DW\n$FPLIST\n SOT?363*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -200 0 200 0 N\nP 2 0 1 0 0 0 0 -100 N\nP 3 0 1 10 -50 -50 -50 50 -50 50 N\nP 3 0 1 10 150 50 150 -50 150 -50 N\nP 6 0 1 10 -150 50 -50 0 -150 -50 -150 50 -150 50 -150 50 N\nP 6 0 1 10 50 50 150 0 50 -50 50 50 50 50 50 50 N\nP 2 1 1 0 250 0 300 0 N\nP 2 2 1 0 250 0 300 0 N\nX A1 1 -300 0 100 R 50 50 1 1 P\nX K2 2 300 0 100 L 50 50 1 1 P\nX K3A4 6 0 -200 100 U 50 50 1 1 P\nX K1A2 3 0 -200 100 U 50 50 2 1 P\nX A3 4 -300 0 100 R 50 50 2 1 P\nX K4 5 300 0 100 L 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# BYV79-100\n#\nDEF BYV79-100 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BYV79-100\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_THT:TO-220-2_Vertical\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS BYV79-200 BYV79-150\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BZD27Cxx\n#\nDEF BZD27Cxx D 0 20 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BZD27Cxx\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SMF\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*SMF*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BZM55Bxx\n#\nDEF BZM55Bxx D 0 20 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BZM55Bxx\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_MicroMELF\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS BZM55Cxx\n$FPLIST\n D*MicroMELF*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BZT52Bxx\n#\nDEF BZT52Bxx D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BZT52Bxx\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-123\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D?SOD?123*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BZX384-xxx\n#\nDEF BZX384-xxx D 0 20 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BZX384-xxx\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-323\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*SOD*323*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BZX84Cxx\n#\nDEF BZX84Cxx D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"BZX84Cxx\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOT-23_ANK\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*SOT?23*ANK*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# C3D02060F\n#\nDEF C3D02060F D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"C3D02060F\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_THT:TO-220F-2_Vertical\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS C3D03060F C3D04060F C3D06060F\n$FPLIST\n TO?220F*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# C3D06060G\n#\nDEF C3D06060G D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"C3D06060G\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:TO-263-2_TabPin1\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS C3D08060G C3D10060G\n$FPLIST\n TO?263*TabPin1*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# C3D16060D\n#\nDEF C3D16060D D 0 40 N N 1 F N\nF0 \"D\" 0 200 50 H V C CNN\nF1 \"C3D16060D\" 0 -200 50 H V C CNN\nF2 \"Package_TO_SOT_THT:TO-247-3_Vertical\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS C3D20060D C3D16065D C3D20065D C3D30065D C5D50065D C4D10120D C4D15120D C4D20120D C4D30120D C4D40120D\n$FPLIST\n TO?247*\n$ENDFPLIST\nDRAW\nC 100 0 10 0 1 0 F\nP 2 0 1 0 -100 -100 0 -100 N\nP 2 0 1 0 -100 -100 0 -100 N\nP 2 0 1 0 -100 100 0 100 N\nP 4 0 1 10 -100 -150 -100 -50 0 -100 -100 -150 N\nP 4 0 1 10 -100 -150 -100 -50 0 -100 -100 -150 N\nP 4 0 1 10 -100 50 -100 150 0 100 -100 50 N\nP 4 0 1 0 0 100 100 100 100 -100 0 -100 N\nP 6 0 1 10 25 -125 25 -150 0 -150 0 -50 -25 -50 -25 -75 N\nP 6 0 1 10 25 -125 25 -150 0 -150 0 -50 -25 -50 -25 -75 N\nP 6 0 1 10 25 75 25 50 0 50 0 150 -25 150 -25 125 N\nX A1 1 -200 100 100 R 50 50 1 1 P\nX K 2 200 0 100 L 50 50 1 1 P\nX A2 3 -200 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# C3D1P7060Q\n#\nDEF C3D1P7060Q D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"C3D1P7060Q\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_QFN_3.3x3.3mm_P0.65mm\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*QFN*3.3x3.3mm*P0.65mm*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# C4D10120H\n#\nDEF C4D10120H D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"C4D10120H\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_THT:TO-247-2_Vertical\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS C4D15120H C4D20120H C3D10170H C3D25170H\n$FPLIST\n TO?247*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CD4148W\n#\nDEF CD4148W D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"CD4148W\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_0805_2012Metric\" 0 -200 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*0805*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CSD01060E\n#\nDEF CSD01060E D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"CSD01060E\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:TO-252-2_TabPin1\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS C3D02060E C3D03060E C3D04060E C3D02065E C3D03065E C3D04065E C3D06065E C3D08065E C3D10065E C4D02120E C4D05120E C4D08120E C4D10120E\n$FPLIST\n TO?252*TabPin1*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DB3\n#\nDEF DB3 D 0 40 N N 1 F N\nF0 \"D\" 0 150 50 H V C CNN\nF1 \"DB3\" 0 -150 50 H V C CNN\nF2 \"Diode_THT:D_DO-35_SOD27_P7.62mm_Horizontal\" 0 -225 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS DB4 DC34\n$FPLIST\n D*DO?35*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 0 -50 -100 N\nP 2 0 1 10 50 100 50 0 N\nP 4 0 1 10 -50 100 -50 0 50 50 -50 100 N\nP 4 0 1 10 50 0 50 -100 -50 -50 50 0 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# ESD9B5.0ST5G\n#\nDEF ESD9B5.0ST5G D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"ESD9B5.0ST5G\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-923\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS ESD9B3.3ST5G SZESD9B5.0ST5G\n$FPLIST\n D*SOD?923*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 8 -100 -50 0 0 -100 50 -100 -50 N\nP 4 0 1 8 20 50 0 50 0 -50 -20 -50 N\nP 4 0 1 8 100 50 100 -50 0 0 100 50 N\nX A1 1 -150 0 100 R 50 50 1 1 P\nX A2 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IDDD04G65C6\n#\nDEF IDDD04G65C6 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"IDDD04G65C6\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:Infineon_PG-HDSOP-10-1\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS IDDD06G65C6 IDDD08G65C6 IDDD10G65C6 IDDD12G65C6 IDDD16G65C6 IDDD20G65C6\n$FPLIST\n Infineon*PG*HDSOP*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX NC 1 -100 0 100 R 50 50 1 1 N N\nX K 10 -150 0 100 R 50 50 1 1 P N\nX NC 2 100 0 100 L 50 50 1 1 N N\nX A 3 150 0 100 L 50 50 1 1 P\nX A 4 150 0 100 L 50 50 1 1 P N\nX A 5 150 0 100 L 50 50 1 1 P N\nX K 6 -150 0 100 R 50 50 1 1 P\nX K 7 -150 0 100 R 50 50 1 1 P N\nX K 8 -150 0 100 R 50 50 1 1 P N\nX K 9 -150 0 100 R 50 50 1 1 P N\nENDDRAW\nENDDEF\n#\n# LL41\n#\nDEF LL41 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"LL41\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_MiniMELF\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS LL42 LL43\n$FPLIST\n D*MiniMELF*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LL4148\n#\nDEF LL4148 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"LL4148\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_MiniMELF\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS LL4448\n$FPLIST\n D*MiniMELF*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MBR735\n#\nDEF MBR735 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"MBR735\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_THT:TO-220-2_Vertical\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS MBR745 CSD01060A C3D02060A C3D03060A C3D04060A C3D06060A C3D08060A C3D10060A C3D04065A C3D06065I C3D06065A C3D08065A C3D08065I C3D10065I C3D10065A C3D12065A C3D16065A CVFD20065A C4D02120A C4D05120A C4D08120A C4D10120A C4D15120A C4D20120A\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MCL4148\n#\nDEF MCL4148 D 0 20 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"MCL4148\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_MicroMELF\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS MCL4448 BAV300 BAV301 BAV302 BAV303\n$FPLIST\n D*MicroMELF*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MM3Zxx\n#\nDEF MM3Zxx D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"MM3Zxx\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-123F\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D?SOD?123F*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MM5Zxx\n#\nDEF MM5Zxx D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"MM5Zxx\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-523\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS DZ2S030X0L DZ2S033X0L DZ2S036X0L DZ2S039X0L DZ2S047X0L DZ2S051X0L DZ2S056X0L DZ2S068X0L DZ2S082X0L DZ2S100X0L DZ2S120X0L DZ2S130X0L DZ2S150X0L DZ2S160X0L DZ2S180X0L DZ2S200X0L DZ2S360X0L DZ2S110X0L\n$FPLIST\n D?SOD?523*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MMBZxx\n#\nDEF MMBZxx D 0 40 Y N 1 F N\nF0 \"D\" 150 100 50 H V L CNN\nF1 \"MMBZxx\" 150 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 150 -100 50 H I L CNN\nF3 \"\" -100 0 50 V I C CNN\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 0 -100 10 0 1 0 F\nP 2 0 1 0 -100 -50 -100 100 N\nP 2 0 1 0 100 -50 100 100 N\nP 3 0 1 10 -150 50 -50 50 -50 30 N\nP 3 0 1 10 50 50 150 50 150 30 N\nP 4 0 1 0 -100 0 -100 -100 100 -100 100 0 N\nP 4 1 1 8 -150 -50 -50 -50 -100 50 -150 -50 N\nP 4 1 1 8 50 -50 150 -50 100 50 50 -50 N\nX K 1 -100 200 100 D 50 50 1 1 P\nX K 2 100 200 100 D 50 50 1 1 P\nX A 3 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MMSD914\n#\nDEF MMSD914 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"MMSD914\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-123\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS 1N4148W BAV16W 1N4448W MMSD4148\n$FPLIST\n D*SOD?123*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MRA4003T3G\n#\nDEF MRA4003T3G D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"MRA4003T3G\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SMA\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS MRA4004T3G MRA4005T3G MRA4006T3G MRA4007T3G NRVA4003T3G NRVA4004T3G NRVA4005T3G NRVA4006T3G NRVA4007T3G US1A US1B US1D US1G US1J US1K US1M US2AA US2BA US2DA US2FA US2GA US2JA US2KA US2MA\n$FPLIST\n D*SMA*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# PMEG2005EH\n#\nDEF PMEG2005EH D 0 20 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"PMEG2005EH\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-123F\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS PMEG1020EH PMEG1030EH PMEG2010AEH PMEG2010EH PMEG2015EH PMEG2020EH PMEG3010CEH PMEG3010EH PMEG3015EH PMEG3020EH PMEG4010CEH PMEG4010EH PMEG3005EH PMEG4005EH PMEG6010CEH\n$FPLIST\n D*SOD?123F*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 8 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 8 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# PMEG2005EJ\n#\nDEF PMEG2005EJ D 0 20 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"PMEG2005EJ\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-323F\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS PMEG1020EJ PMEG1030EJ PMEG2010AEJ PMEG2010EJ PMEG2015EJ PMEG2020EJ PMEG3002EJ PMEG3010CEJ PMEG3010EJ PMEG3015EJ PMEG3020EJ PMEG4002EJ PMEG4005CEJ PMEG4010CEJ PMEG4010EJ PMEG6002EJ PMEG3005EJ PMEG4005EJ PMEG6010CEJ\n$FPLIST\n D*SOD?323F*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 8 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 8 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# PMEG2010AET\n#\nDEF PMEG2010AET D 0 20 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"PMEG2010AET\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOT-23_ANK\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS PMEG2010ET PMEG3010ET PMEG4010ET\n$FPLIST\n D*SOT?23*ANK*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 8 50 -50 50 50 -50 0 50 -50 N\nP 6 0 1 8 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# PMEG4050EP\n#\nDEF PMEG4050EP D 0 20 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"PMEG4050EP\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-128\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS PMEG6030EP PMEG6045ETP\n$FPLIST\n D*SOD?128*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Rohm_UMN1N\n#\nDEF Rohm_UMN1N D 0 40 Y N 4 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"Rohm_UMN1N\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-353_SC-70-5\" 0 -175 50 H I C CNN\nF3 \"\" 0 100 50 H I C CNN\nALIAS MMBD4448HCQW Panasonic_MA5J002E\n$FPLIST\n SOT?353*\n$ENDFPLIST\nDRAW\nP 2 0 1 6 -50 50 -50 -50 N\nP 2 0 1 0 50 -50 50 50 N\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 0 50 50 -50 0 50 -50 N\nX A 1 150 0 100 L 50 50 1 1 P\nX K 2 -150 0 100 R 50 50 1 1 P\nX K 2 -150 0 100 R 50 50 2 1 P\nX A 3 150 0 100 L 50 50 2 1 P\nX K 2 -150 0 100 R 50 50 3 1 P\nX A 4 150 0 100 L 50 50 3 1 P\nX K 2 -150 0 100 R 50 50 4 1 P\nX A 5 150 0 100 L 50 50 4 1 P\nENDDRAW\nENDDEF\n#\n# Rohm_UMP11N\n#\nDEF Rohm_UMP11N D 0 40 Y N 4 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"Rohm_UMP11N\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 0 -175 50 H I C CNN\nF3 \"\" 0 100 50 H I C CNN\nALIAS BAW56DW BAW56S MMBD4448HADW Toshiba_HN1D01FU\n$FPLIST\n SOT?363*\n$ENDFPLIST\nDRAW\nP 2 0 1 6 -50 50 -50 -50 N\nP 2 0 1 0 50 -50 50 50 N\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 0 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 6 150 0 100 L 50 50 1 1 P\nX K 2 -150 0 100 R 50 50 2 1 P\nX A 6 150 0 100 L 50 50 2 1 P\nX A 3 150 0 100 L 50 50 3 1 P\nX K 4 -150 0 100 R 50 50 3 1 P\nX A 3 150 0 100 L 50 50 4 1 P\nX K 5 -150 0 100 R 50 50 4 1 P\nENDDRAW\nENDDEF\n#\n# S2JTR\n#\nDEF S2JTR D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"S2JTR\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SMB\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS STTH212U\n$FPLIST\n *D?SMB*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SB120\n#\nDEF SB120 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"SB120\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS SB130 SB140 SB150 SB160 1N5817 1N5818 1N5819\n$FPLIST\n D*DO?41*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SD05_SOD323\n#\nDEF SD05_SOD323 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"SD05_SOD323\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SOD-323\" 0 -200 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS SD12_SOD323 SD15_SOD323 SD24_SOD323 SD36_SOD323\n$FPLIST\n D?SOD?323*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 8 -100 -50 0 0 -100 50 -100 -50 N\nP 4 0 1 8 20 50 0 50 0 -50 -20 -50 N\nP 4 0 1 8 100 50 100 -50 0 0 100 50 N\nX A1 1 -150 0 100 R 50 50 1 1 P\nX A2 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SD103ATW\n#\nDEF SD103ATW D 0 20 Y N 3 F N\nF0 \"D\" -50 100 50 H V C CNN\nF1 \"SD103ATW\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 0 -200 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT?363*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 6 0 1 10 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 6 150 0 100 L 50 50 1 1 P\nX K 2 -150 0 100 R 50 50 2 1 P\nX A 5 150 0 100 L 50 50 2 1 P\nX K 3 -150 0 100 R 50 50 3 1 P\nX A 4 150 0 100 L 50 50 3 1 P\nENDDRAW\nENDDEF\n#\n# SM4001\n#\nDEF SM4001 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"SM4001\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_MELF\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS SM4002 SM4003 SM4004 SM4005 SM4006 SM4007 SM513 SM516 SM518 SM2000\n$FPLIST\n D*MELF*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SM712_SOT23\n#\nDEF SM712_SOT23 D 0 40 Y N 1 F N\nF0 \"D\" 0 175 50 H V C CNN\nF1 \"SM712_SOT23\" 0 100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 0 -350 50 H I C CNN\nF3 \"\" -150 0 50 H I C CNN\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 0 0 10 0 1 0 F\nP 2 0 0 0 0 -50 0 0 N\nP 2 0 1 0 -250 0 250 0 N\nP 4 0 1 8 -130 50 -150 50 -150 -50 -170 -50 N\nP 4 0 1 8 170 50 150 50 150 -50 130 -50 N\nP 5 0 1 8 -250 -50 -50 50 -50 -50 -250 50 -250 -50 N\nP 5 0 1 8 50 -50 50 50 250 -50 250 50 50 -50 N\nX A1 1 -350 0 100 R 50 50 1 1 P\nX A2 2 350 0 100 L 50 50 1 1 P\nX common 3 0 -150 100 U 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# STTH212S\n#\nDEF STTH212S D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"STTH212S\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SMC\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D?SMC*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# VS-6ESU06\n#\nDEF VS-6ESU06 D 0 20 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"VS-6ESU06\" 0 -100 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:TO-277A\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n TO?277A*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 0 50 0 -50 0 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nX A 1 150 0 100 L 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P N\nX K 3 -150 0 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Z1SMAxxx\n#\nDEF Z1SMAxxx D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"Z1SMAxxx\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SMA\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D?SMA*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Z2SMBxxx\n#\nDEF Z2SMBxxx D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"Z2SMBxxx\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SMB\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D?SMB*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Z3SMCxxx\n#\nDEF Z3SMCxxx D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"Z3SMCxxx\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_SMC\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D?SMC*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# ZMDxx\n#\nDEF ZMDxx D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"ZMDxx\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_MiniMELF\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS ZMMxx\n$FPLIST\n D*MiniMELF*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# ZMYxx\n#\nDEF ZMYxx D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"ZMYxx\" 0 -100 50 H V C CNN\nF2 \"Diode_SMD:D_MELF\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS SMZxxx\n$FPLIST\n D*MELF*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# ZPDxx\n#\nDEF ZPDxx D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"ZPDxx\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_DO-35_SOD27_P10.16mm_Horizontal\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n D*DO?35*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# ZPYxx\n#\nDEF ZPYxx D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"ZPYxx\" 0 -100 50 H V C CNN\nF2 \"Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal\" 0 -175 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS 1N47xxA ZYxxx\n$FPLIST\n D*DO?41*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 50 0 -50 0 N\nP 3 0 1 10 -50 -50 -50 50 -30 50 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/LED.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP APA-106-F5\nD RGB LED with integrated controller, 5mm Package\nK RGB LED addressable 8bit pwm 5bit greyscale\nF https://cdn.sparkfun.com/datasheets/Components/LED/COM-12877.pdf\n$ENDCMP\n#\n$CMP APA102\nD RGB LED with integrated controller\nK RGB LED addressable 8bit pwm 5bit greyscale\nF http://www.led-color.com/upload/201506/APA102%20LED.pdf\n$ENDCMP\n#\n$CMP APA102-2020\nD RGB LED with integrated controller\nK RGB LED addressable 8bit pwm 5bit greyscale\nF http://www.led-color.com/upload/201604/APA102-2020%20SMD%20LED.pdf\n$ENDCMP\n#\n$CMP APFA3010\nD LED RGB, Common Anode, SMD, 3.0x1.5mm, Horizontal\nK LED RGB SMD Kingbright APFA3010 Horizontal\nF http://www.kingbrightusa.com/images/catalog/SPEC/APFA3010LSEEZGKQBKC.pdf\n$ENDCMP\n#\n$CMP ASMB-MTB0-0A3A2\nD Tricolor Black Surface LED, Common Anode Pin 1, PLCC-4\nK led rgb diode\nF https://docs.broadcom.com/docs/AV02-4186EN\n$ENDCMP\n#\n$CMP ASMB-MTB1-0A3A2\nD Tricolor Black Surface LED, Common Anode Pin 4, PLCC-4\nK led rgb diode\nF https://docs.broadcom.com/docs/AV02-4194EN\n$ENDCMP\n#\n$CMP ASMT-YTB7-0AA02\nD Triple LED RVB (Avago Technology)\nK LED RGB\nF https://docs.broadcom.com/docs/AV02-3793EN\n$ENDCMP\n#\n$CMP ASMT-YTC2-0AA02\nD Triple LED RVB (Avago Technology)\nK LED RGB\nF http://www.avagotech.com/docs/AV02-2589EN\n$ENDCMP\n#\n$CMP CLS6B-FKW\nD Cree PLCC6 3 in 1 SMD LED, PLCC-6\nK LED RGB\nF https://www.cree.com/led-components/media/documents/CLS6B-FKW.pdf\n$ENDCMP\n#\n$CMP CLV1L-FKB\nD Cree PLCC4 3 in 1 SMD LED\nK led rgb diode\nF http://www.cree.com/led-components/media/documents/CLV1L-FKB-1238.pdf\n$ENDCMP\n#\n$CMP CQY99\nD 950nm IR-LED, 5mm\nK IR LED\nF https://www.prtice.info/IMG/pdf/CQY99.pdf\n$ENDCMP\n#\n$CMP HDSP-4830\nD 10-element LED arrays, high effecient red\nK display LED array\nF https://docs.broadcom.com/docs/AV02-1798EN\n$ENDCMP\n#\n$CMP HDSP-4830_2\nD BAR GRAPH 10 segment block, high efficiency red\nK display LED array\nF https://docs.broadcom.com/docs/AV02-1798EN\n$ENDCMP\n#\n$CMP HDSP-4832\nD 10-element LED arrays, Mix of high effecient red, yellow and green\nK display LED array\nF https://docs.broadcom.com/docs/AV02-1798EN\n$ENDCMP\n#\n$CMP HDSP-4832_2\nD BAR GRAPH 10 segment block, Mix of high efficiency red, yellow and green\nK display LED array\nF https://docs.broadcom.com/docs/AV02-1798EN\n$ENDCMP\n#\n$CMP HDSP-4836\nD 10-element LED arrays, Mix of high effecient red, yellow and green\nK display LED array\nF https://docs.broadcom.com/docs/AV02-1798EN\n$ENDCMP\n#\n$CMP HDSP-4836_2\nD BAR GRAPH 10 segment block, Mix of high efficiency red, yellow and green\nK display LED array\nF https://docs.broadcom.com/docs/AV02-1798EN\n$ENDCMP\n#\n$CMP HDSP-4840\nD 10-element LED arrays, Yellow\nK display LED array\nF https://docs.broadcom.com/docs/AV02-1798EN\n$ENDCMP\n#\n$CMP HDSP-4840_2\nD BAR GRAPH 10 segment block, yellow\nK display LED array\nF https://docs.broadcom.com/docs/AV02-1798EN\n$ENDCMP\n#\n$CMP HDSP-4850\nD 10-element LED arrays, Green\nK display LED array\nF https://docs.broadcom.com/docs/AV02-1798EN\n$ENDCMP\n#\n$CMP HDSP-4850_2\nD BAR GRAPH 10 segment block, green\nK display LED array\nF https://docs.broadcom.com/docs/AV02-1798EN\n$ENDCMP\n#\n$CMP HLCP-J100\nD 10-element LED arrays, AIGaAs Red\nK display LED array\nF https://docs.broadcom.com/docs/AV02-1798EN\n$ENDCMP\n#\n$CMP HLCP-J100_2\nD BAR GRAPH 10 segment block, AlGaAs red\nK display LED array\nF https://docs.broadcom.com/docs/AV02-1798EN\n$ENDCMP\n#\n$CMP IR204A\nD Infrared LED , 3mm LED package\nK opto IR LED\nF http://www.everlight.com/file/ProductFile/IR204-A.pdf\n$ENDCMP\n#\n$CMP IR26-21C_L110_TR8\nD 940nm, 20 deg, Infrared LED, 1206\nK IR LED\nF http://www.everlight.com/file/ProductFile/IR26-21C-L110-TR8.pdf\n$ENDCMP\n#\n$CMP IRL81A\nD 850nm High Power Infrared Emitter, Side-Emitter package\nK IR LED\nF http://www.osram-os.com/Graphics/XPic0/00203825_0.pdf\n$ENDCMP\n#\n$CMP Inolux_IN-PI554FCH\nD 5050 RGB LED 4-Pin with integrated IC\nK RGB LED NeoPixel addressable\nF http://www.inolux-corp.com/datasheet/SMDLED/Addressable%20LED/IN-PI554FCH.pdf\n$ENDCMP\n#\n$CMP Inolux_IN-PI556FCH\nD 5050 RGB LED 6-Pin with integrated IC\nK RGB LED NeoPixel addressable\nF http://www.inolux-corp.com/datasheet/SMDLED/Addressable%20LED/IN-PI556FCH.pdf\n$ENDCMP\n#\n$CMP LD271\nD 940nm IR-LED, 5mm\nK IR LED\nF http://www.alliedelec.com/m/d/40788c34903a719969df15f1fbea1056.pdf\n$ENDCMP\n#\n$CMP LD274\nD 950nm IR-LED, 5mm\nK IR LED\nF http://pdf.datasheetcatalog.com/datasheet/siemens/LD274.pdf\n$ENDCMP\n#\n$CMP LED_Cree_XHP50_12V\nD XLamp® XHP50 LED, 12V footprint (all 4 LEDs in series)\nK led diode\nF http://www.cree.com/%7E/media/Files/Cree/LED%20Components%20and%20Modules/XLamp/Data%20and%20Binning/ds%20XHP50.pdf\n$ENDCMP\n#\n$CMP LED_Cree_XHP50_6V\nD XLamp® XHP50 LED, 6V footprint (2x2 serial LEDs in parallel)\nK led diode\nF http://www.cree.com/%7E/media/Files/Cree/LED%20Components%20and%20Modules/XLamp/Data%20and%20Binning/ds%20XHP50.pdf\n$ENDCMP\n#\n$CMP LED_Cree_XHP70_12V\nD XLamp® XHP70 LED, 12V footprint (all 4 LEDs in series)\nK led diode\nF http://www.cree.com/%7E/media/Files/Cree/LED%20Components%20and%20Modules/XLamp/Data%20and%20Binning/ds%20XHP70.pdf\n$ENDCMP\n#\n$CMP LED_Cree_XHP70_6V\nD XLamp® XHP70 LED, 6V footprint (2x2 serial LEDs in parallel)\nK led diode\nF http://www.cree.com/%7E/media/Files/Cree/LED%20Components%20and%20Modules/XLamp/Data%20and%20Binning/ds%20XHP70.pdf\n$ENDCMP\n#\n$CMP NeoPixel_THT\nD RGB LED with integrated controller, 5mm/8mm LED package\nK RGB LED NeoPixel addressable\nF https://www.adafruit.com/product/1938\n$ENDCMP\n#\n$CMP QLS6A-FKW\nD Cree PLCC6 3 in 1 SMD LED with zener protection, PLCC-6\nK LED RGB\nF https://www.cree.com/led-components/media/documents/1381-QLS6AFKW.pdf\n$ENDCMP\n#\n$CMP QLS6B-FKW\nD Cree PLCC6 3 in 1 SMD LED, PLCC-6\nK LED RGB\nF https://www.cree.com/led-components/media/documents/1397-QLS6BFKW.pdf\n$ENDCMP\n#\n$CMP SFH4346\nD Infrared LED , 3mm LED package\nK opto IR LED\nF http://cdn-reichelt.de/documents/datenblatt/A500/SFH4346.pdf\n$ENDCMP\n#\n$CMP SFH4356P\nD Infrared LED , 3mm LED package\nK opto IR LED\nF http://www.osram-os.com/Graphics/XPic5/00181708_0.pdf\n$ENDCMP\n#\n$CMP SFH4546\nD High-Power IR LED 940nm\nK IR LED\nF http://www.osram-os.com/Graphics/XPic1/00101982_0.pdf\n$ENDCMP\n#\n$CMP SFH4550\nD 950nm High-Power IR-LED, 5mm\nK IR LED\nF http://www.osram-os.com/Graphics/XPic3/00116140_0.pdf\n$ENDCMP\n#\n$CMP SFH460\nD GaAlAs Infrared LED, TO-18 package\nK opto IR LED\nF http://www.osram-os.com/Graphics/XPic6/00029609_0.pdf/SFh%20460.pdf\n$ENDCMP\n#\n$CMP SFH480\nD GaAlAs Infrared LED (880 nm), TO-18 package\nK IR LED Opto\nF http://www.osram-os.com/Graphics/XPic1/00083613_0.pdf\n$ENDCMP\n#\n$CMP SFH482\nD GaAlAs Infrared LED (880 nm), TO-18 package\nK opto IR LED\nF http://www.osram-os.com/Graphics/XPic2/00182155_0.pdf/SFH%20482%20E7800,%20Lead%20(Pb)%20Free%20Product%20-%20RoHS%20Compliant.pdf\n$ENDCMP\n#\n$CMP SK6805\nD RGB LED with integrated controller\nK RGB LED NeoPixel Nano addressable\nF https://cdn-shop.adafruit.com/product-files/3484/3484_Datasheet.pdf\n$ENDCMP\n#\n$CMP SK6812\nD RGB LED with integrated controller\nK RGB LED NeoPixel addressable\nF https://cdn-shop.adafruit.com/product-files/1138/SK6812+LED+datasheet+.pdf\n$ENDCMP\n#\n$CMP SK6812MINI\nD RGB LED with integrated controller\nK RGB LED NeoPixel Mini addressable\nF https://cdn-shop.adafruit.com/product-files/2686/SK6812MINI_REV.01-1-2.pdf\n$ENDCMP\n#\n$CMP SMLVN6RGB\nD High Brightness Tri-Color LED, RGB, 3.5x2.8mm\nK LED RGB Diode\nF https://www.rohm.com/datasheet/SMLVN6RGB1U\n$ENDCMP\n#\n$CMP TSAL4400\nD Infrared LED , 3mm LED package\nK opto IR LED\nF http://www.vishay.com/docs/81006/tsal4400.pdf\n$ENDCMP\n#\n$CMP WS2812\nD RGB LED with integrated controller\nK RGB LED NeoPixel addressable\nF https://cdn-shop.adafruit.com/datasheets/WS2812.pdf\n$ENDCMP\n#\n$CMP WS2812B\nD RGB LED with integrated controller\nK RGB LED NeoPixel addressable\nF https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf\n$ENDCMP\n#\n$CMP WS2812S\nD RGB LED with integrated controller\nK RGB LED addressable\nF http://www.world-semi.com/DownLoadFile/115\n$ENDCMP\n#\n$CMP WS2813\nD RGB LED with integrated controller\nK RGB LED addressable\nF http://www.normandled.com/upload/201605/WS2813%20LED%20Datasheet.pdf\n$ENDCMP\n#\n$CMP WS2822S\nD RGB LED with integrated controller\nK RGB LED addressable\nF http://akizukidenshi.com/download/ds/worldsemi/WS2822S.pdf\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/LED.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# APA-106-F5\n#\nDEF APA-106-F5 D 0 20 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"APA-106-F5\" 50 -225 50 H V L TNN\nF2 \"LED_THT:LED_D5.0mm-4_RGB\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\n$FPLIST\n LED*D5.0mm*RGB*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS 200 200 -200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX DO 1 300 100 100 L 50 50 1 1 O\nX GND 2 0 -300 100 U 50 50 1 1 W\nX VDD 3 0 300 100 D 50 50 1 1 W\nX DI 4 -300 100 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# APA102\n#\nDEF APA102 D 0 20 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"APA102\" 50 -225 50 H V L TNN\nF2 \"LED_SMD:LED_RGB_5050-6\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\n$FPLIST\n LED*RGB*5050*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS 200 200 -200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX DI 1 -300 100 100 R 50 50 1 1 I\nX CI 2 -300 0 100 R 50 50 1 1 I\nX GND 3 0 -300 100 U 50 50 1 1 W\nX VCC 4 0 300 100 D 50 50 1 1 W\nX CO 5 300 0 100 L 50 50 1 1 O\nX DO 6 300 100 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# APA102-2020\n#\nDEF APA102-2020 D 0 20 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"APA102-2020\" 50 -225 50 H V L TNN\nF2 \"LED_SMD:LED-APA102-2020\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\n$FPLIST\n LED*APA102*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS 200 200 -200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX VDD 1 0 300 100 D 50 50 1 1 W\nX CKO 2 300 0 100 L 50 50 1 1 O\nX SDO 3 300 100 100 L 50 50 1 1 O\nX SDI 4 -300 100 100 R 50 50 1 1 I\nX CKI 5 -300 0 100 R 50 50 1 1 I\nX GND 6 0 -300 100 U 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# APFA3010\n#\nDEF APFA3010 D 0 0 Y N 1 F N\nF0 \"D\" 0 400 50 H V C CNN\nF1 \"APFA3010\" 0 -400 50 H V C CNN\nF2 \"LED_SMD:LED_Kingbright_APFA3010_3x1.5mm_Horizontal\" 0 500 50 H I C CNN\nF3 \"\" 0 -450 50 H I C CNN\n$FPLIST\n *Kingbright*APFA3010*3x1.5mm*Horizontal*\n$ENDFPLIST\nDRAW\nC 80 0 10 0 1 0 F\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS -100 -350 100 350 0 1 10 f\nS 50 250 50 250 0 1 0 N\nP 2 0 1 0 -100 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 200 -100 200 N\nP 2 0 1 0 100 0 -100 0 N\nP 4 0 1 0 50 -200 80 -200 80 200 50 200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX R 1 -200 200 100 R 50 50 1 1 I\nX A 2 200 0 100 L 50 50 1 1 W\nX G 3 -200 0 100 R 50 50 1 1 I\nX B 4 -200 -200 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# ASMB-MTB0-0A3A2\n#\nDEF ASMB-MTB0-0A3A2 D 0 0 Y N 1 F N\nF0 \"D\" 0 400 50 H V C CNN\nF1 \"ASMB-MTB0-0A3A2\" 0 -400 50 H V C CNN\nF2 \"LED_SMD:LED_Avago_PLCC4_3.2x2.8mm_CW\" 0 500 50 H I C CNN\nF3 \"\" 0 -450 50 H I C CNN\n$FPLIST\n *Avago*PLCC4*3.2x2.8mm*\n$ENDFPLIST\nDRAW\nC 80 0 10 0 1 0 F\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS -100 -350 100 350 0 1 10 f\nS 50 250 50 250 0 1 0 N\nP 2 0 1 0 -100 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 200 -100 200 N\nP 2 0 1 0 100 0 -100 0 N\nP 4 0 1 0 50 -200 80 -200 80 200 50 200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX A 1 200 0 100 L 50 50 1 1 P\nX BK 2 -200 -200 100 R 50 50 1 1 P\nX GK 3 -200 0 100 R 50 50 1 1 P\nX RK 4 -200 200 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# ASMB-MTB1-0A3A2\n#\nDEF ASMB-MTB1-0A3A2 D 0 0 Y N 1 F N\nF0 \"D\" 0 500 50 H V C CNN\nF1 \"ASMB-MTB1-0A3A2\" 50 -450 50 H V C CNN\nF2 \"LED_SMD:LED_Avago_PLCC4_3.2x2.8mm_CW\" 0 600 50 H I C CNN\nF3 \"\" 0 -450 50 H I C CNN\n$FPLIST\n *Avago*PLCC4*3.2x2.8mm*\n$ENDFPLIST\nDRAW\nC 80 0 10 0 1 0 F\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS 50 250 50 250 0 1 0 N\nS 100 -350 -100 400 0 1 10 f\nP 2 0 1 0 -100 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 200 -100 200 N\nP 2 0 1 0 100 0 -100 0 N\nP 4 0 1 0 50 -200 80 -200 80 200 50 200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX RK 1 -200 200 100 R 50 50 1 1 P\nX GK 2 -200 0 100 R 50 50 1 1 P\nX BK 3 -200 -200 100 R 50 50 1 1 P\nX A 4 200 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# ASMT-YTC2-0AA02\n#\nDEF ASMT-YTC2-0AA02 D 0 20 Y N 1 F N\nF0 \"D\" -200 250 50 H V L CNN\nF1 \"ASMT-YTC2-0AA02\" -200 -250 50 H V L CNN\nF2 \"LED_SMD:LED_Avago_PLCC6_3x2.8mm\" -200 -320 50 H I L CNN\nF3 \"\" 150 0 50 H I L CNN\nALIAS ASMT-YTB7-0AA02\n$FPLIST\n LED?Avago?PLCC6?3x2.8mm*\n$ENDFPLIST\nDRAW\nT 0 -20 -136 30 0 0 0 B Normal 0 C C\nT 0 179 -33 30 0 0 0 G Normal 0 C C\nT 0 -15 71 30 0 0 0 R Normal 0 C C\nS -200 200 200 -200 0 1 10 f\nP 2 0 1 0 -200 -100 200 -100 N\nP 2 0 1 0 -200 0 200 0 N\nP 2 0 1 0 -200 100 200 100 N\nP 2 0 1 0 -110 -50 -70 -10 N\nP 2 0 1 0 -110 150 -70 190 N\nP 2 0 1 0 -70 -50 -30 -10 N\nP 2 0 1 0 -70 150 -30 190 N\nP 2 0 1 10 -50 -50 -50 -150 N\nP 2 0 1 10 -50 150 -50 50 N\nP 2 0 1 0 90 50 130 90 N\nP 2 0 1 0 130 50 170 90 N\nP 2 0 1 10 150 50 150 -50 N\nP 3 0 1 0 -100 180 -70 190 -80 160 N\nP 3 0 1 0 -80 -40 -70 -10 -100 -20 N\nP 3 0 1 0 -60 -20 -30 -10 -40 -40 N\nP 3 0 1 0 -60 180 -30 190 -40 160 N\nP 3 0 1 0 120 60 130 90 100 80 N\nP 3 0 1 0 140 80 170 90 160 60 N\nP 4 0 1 10 -150 -50 -150 -150 -50 -100 -150 -50 N\nP 4 0 1 10 -150 150 -150 50 -50 100 -150 150 N\nP 4 0 1 10 50 50 50 -50 150 0 50 50 N\nX KB 1 300 -100 100 L 50 50 1 1 P\nX KG 2 300 0 100 L 50 50 1 1 P\nX KR 3 300 100 100 L 50 50 1 1 P\nX AR 4 -300 100 100 R 50 50 1 1 P\nX AG 5 -300 0 100 R 50 50 1 1 P\nX AB 6 -300 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CLS6B-FKW\n#\nDEF CLS6B-FKW D 0 20 Y N 1 F N\nF0 \"D\" -200 250 50 H V L CNN\nF1 \"CLS6B-FKW\" -200 -250 50 H V L CNN\nF2 \"LED_SMD:LED_Cree-PLCC6_4.7x1.5mm\" -200 -320 50 H I L CNN\nF3 \"\" -200 -400 50 H I L CNN\nALIAS QLS6B-FKW\n$FPLIST\n LED*Cree*PLCC*4.7x1.5mm*\n$ENDFPLIST\nDRAW\nT 0 -25 -131 30 0 0 0 B Normal 0 C C\nT 0 174 -28 30 0 0 0 G Normal 0 C C\nT 0 -25 71 30 0 0 0 R Normal 0 C C\nS -200 200 200 -200 0 1 10 f\nP 2 0 1 0 -200 -100 200 -100 N\nP 2 0 1 0 -200 0 200 0 N\nP 2 0 1 0 -200 100 200 100 N\nP 2 0 1 0 -110 -50 -70 -10 N\nP 2 0 1 0 -110 150 -70 190 N\nP 2 0 1 0 -70 -50 -30 -10 N\nP 2 0 1 0 -70 150 -30 190 N\nP 2 0 1 10 -50 -50 -50 -150 N\nP 2 0 1 10 -50 150 -50 50 N\nP 2 0 1 0 90 50 130 90 N\nP 2 0 1 0 130 50 170 90 N\nP 2 0 1 10 150 50 150 -50 N\nP 3 0 1 0 -100 180 -70 190 -80 160 N\nP 3 0 1 0 -80 -40 -70 -10 -100 -20 N\nP 3 0 1 0 -60 -20 -30 -10 -40 -40 N\nP 3 0 1 0 -60 180 -30 190 -40 160 N\nP 3 0 1 0 120 60 130 90 100 80 N\nP 3 0 1 0 140 80 170 90 160 60 N\nP 4 0 1 10 -150 -50 -150 -150 -50 -100 -150 -50 N\nP 4 0 1 10 -150 150 -150 50 -50 100 -150 150 N\nP 4 0 1 10 50 50 50 -50 150 0 50 50 N\nX AB 1 -300 -100 100 R 50 50 1 1 P\nX KB 2 300 -100 100 L 50 50 1 1 P\nX AR 3 -300 100 100 R 50 50 1 1 P\nX KR 4 300 100 100 L 50 50 1 1 P\nX AG 5 -300 0 100 R 50 50 1 1 P\nX KR 6 300 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CLV1L-FKB\n#\nDEF CLV1L-FKB D 0 0 Y N 1 F N\nF0 \"D\" 0 370 50 H V C CNN\nF1 \"CLV1L-FKB\" 0 -350 50 H V C CNN\nF2 \"LED_SMD:LED_Cree-PLCC4_3.2x2.8mm_CCW\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n *Cree*PLCC4*3.2x2.8mm*\n$ENDFPLIST\nDRAW\nC 80 0 10 0 1 0 F\nT 0 -75 -250 50 0 0 0 B Normal 0 C C\nT 0 -75 -50 50 0 0 0 G Normal 0 C C\nT 0 -75 150 50 0 0 0 R Normal 0 C C\nS 50 250 50 250 0 1 0 N\nS 110 330 -110 -300 0 1 10 f\nP 2 0 1 0 -100 -200 50 -200 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 50 200 -100 200 N\nP 2 0 1 0 100 0 -100 0 N\nP 4 0 1 0 50 -200 80 -200 80 200 50 200 N\nP 4 0 1 10 50 -150 50 -250 -50 -200 50 -150 N\nP 4 0 1 10 50 50 50 -50 -50 0 50 50 N\nP 4 0 1 10 50 250 50 150 -50 200 50 250 N\nP 5 0 1 0 -40 -150 20 -90 -10 -90 20 -90 20 -120 N\nP 5 0 1 0 -40 50 20 110 -10 110 20 110 20 80 N\nP 5 0 1 0 -40 250 20 310 -10 310 20 310 20 280 N\nP 5 0 1 0 0 -150 60 -90 30 -90 60 -90 60 -120 N\nP 5 0 1 0 0 50 60 110 30 110 60 110 60 80 N\nP 5 0 1 0 0 250 60 310 30 310 60 310 60 280 N\nX A 1 200 0 100 L 50 50 1 1 P\nX RK 2 -200 200 100 R 50 50 1 1 P\nX GK 3 -200 0 100 R 50 50 1 1 P\nX BK 4 -200 -200 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# HDSP-4830\n#\nDEF HDSP-4830 BAR 0 40 Y N 10 F N\nF0 \"BAR\" 0 150 50 H V C CNN\nF1 \"HDSP-4830\" 0 -150 50 H V C CNN\nF2 \"Display:HDSP-4830\" 0 -300 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n HDSP?48*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -100 0 100 0 N\nP 2 0 1 10 50 -50 50 50 N\nP 4 0 1 10 -50 50 -50 -50 50 0 -50 50 N\nX A 1 -200 0 100 R 50 50 1 1 P\nX K 20 200 0 100 L 50 50 1 1 P\nX K 19 200 0 100 L 50 50 2 1 P\nX A 2 -200 0 100 R 50 50 2 1 P\nX K 18 200 0 100 L 50 50 3 1 P\nX A 3 -200 0 100 R 50 50 3 1 P\nX K 17 200 0 100 L 50 50 4 1 P\nX A 4 -200 0 100 R 50 50 4 1 P\nX K 16 200 0 100 L 50 50 5 1 P\nX A 5 -200 0 100 R 50 50 5 1 P\nX K 15 200 0 100 L 50 50 6 1 P\nX A 6 -200 0 100 R 50 50 6 1 P\nX K 14 200 0 100 L 50 50 7 1 P\nX A 7 -200 0 100 R 50 50 7 1 P\nX K 13 200 0 100 L 50 50 8 1 P\nX A 8 -200 0 100 R 50 50 8 1 P\nX K 12 200 0 100 L 50 50 9 1 P\nX A 9 -200 0 100 R 50 50 9 1 P\nX A 10 -200 0 100 R 50 50 10 1 P\nX K 11 200 0 100 L 50 50 10 1 P\nENDDRAW\nENDDEF\n#\n# HDSP-4830_2\n#\nDEF HDSP-4830_2 BAR 0 40 Y N 1 F N\nF0 \"BAR\" 0 600 50 H V C CNN\nF1 \"HDSP-4830_2\" 0 -700 50 H V C CNN\nF2 \"Display:HDSP-4830\" 0 -800 50 H I C CNN\nF3 \"\" -2000 200 50 H I C CNN\n$FPLIST\n HDSP?48*\n$ENDFPLIST\nDRAW\nS -100 500 100 -600 0 1 10 f\nP 2 0 1 0 -100 -500 100 -500 N\nP 2 0 1 0 -100 -400 100 -400 N\nP 2 0 1 0 -100 -300 100 -300 N\nP 2 0 1 0 -100 -200 100 -200 N\nP 2 0 1 0 -100 0 100 0 N\nP 2 0 1 0 -100 200 100 200 N\nP 2 0 1 0 -100 300 100 300 N\nP 2 0 1 0 -100 400 100 400 N\nP 2 0 1 10 50 -460 50 -540 N\nP 2 0 1 10 50 -360 50 -440 N\nP 2 0 1 10 50 -260 50 -340 N\nP 2 0 1 10 50 -160 50 -240 N\nP 2 0 1 10 50 -60 50 -140 N\nP 2 0 1 10 50 40 50 -40 N\nP 2 0 1 10 50 140 50 60 N\nP 2 0 1 10 50 240 50 160 N\nP 2 0 1 10 50 340 50 260 N\nP 2 0 1 10 50 440 50 360 N\nP 2 0 1 0 100 -100 -100 -100 N\nP 2 0 1 0 100 100 -100 100 N\nP 4 0 1 10 -30 -460 -30 -540 50 -500 -30 -460 N\nP 4 0 1 10 -30 -360 -30 -440 50 -400 -30 -360 N\nP 4 0 1 10 -30 -260 -30 -340 50 -300 -30 -260 N\nP 4 0 1 10 -30 -160 -30 -240 50 -200 -30 -160 N\nP 4 0 1 10 -30 -60 -30 -140 50 -100 -30 -60 N\nP 4 0 1 10 -30 40 -30 -40 50 0 -30 40 N\nP 4 0 1 10 -30 140 -30 60 50 100 -30 140 N\nP 4 0 1 10 -30 240 -30 160 50 200 -30 240 N\nP 4 0 1 10 -30 340 -30 260 50 300 -30 340 N\nP 4 0 1 10 -30 440 -30 360 50 400 -30 440 N\nX A 1 -200 400 100 R 50 50 1 1 P\nX A 10 -200 -500 100 R 50 50 1 1 P\nX K 11 200 -500 100 L 50 50 1 1 P\nX K 12 200 -400 100 L 50 50 1 1 P\nX K 13 200 -300 100 L 50 50 1 1 P\nX K 14 200 -200 100 L 50 50 1 1 P\nX K 15 200 -100 100 L 50 50 1 1 P\nX K 16 200 0 100 L 50 50 1 1 P\nX K 17 200 100 100 L 50 50 1 1 P\nX K 18 200 200 100 L 50 50 1 1 P\nX K 19 200 300 100 L 50 50 1 1 P\nX A 2 -200 300 100 R 50 50 1 1 P\nX K 20 200 400 100 L 50 50 1 1 P\nX A 3 -200 200 100 R 50 50 1 1 P\nX A 4 -200 100 100 R 50 50 1 1 P\nX A 5 -200 0 100 R 50 50 1 1 P\nX A 6 -200 -100 100 R 50 50 1 1 P\nX A 7 -200 -200 100 R 50 50 1 1 P\nX A 8 -200 -300 100 R 50 50 1 1 P\nX A 9 -200 -400 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# HDSP-4832\n#\nDEF HDSP-4832 BAR 0 40 Y N 10 F N\nF0 \"BAR\" 0 150 50 H V C CNN\nF1 \"HDSP-4832\" 0 -150 50 H V C CNN\nF2 \"Display:HDSP-4832\" 0 -300 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n HDSP?48*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -100 0 100 0 N\nP 2 0 1 10 50 -50 50 50 N\nP 4 0 1 10 -50 50 -50 -50 50 0 -50 50 N\nX A 1 -200 0 100 R 50 50 1 1 P\nX K 20 200 0 100 L 50 50 1 1 P\nX K 19 200 0 100 L 50 50 2 1 P\nX A 2 -200 0 100 R 50 50 2 1 P\nX K 18 200 0 100 L 50 50 3 1 P\nX A 3 -200 0 100 R 50 50 3 1 P\nX K 17 200 0 100 L 50 50 4 1 P\nX A 4 -200 0 100 R 50 50 4 1 P\nX K 16 200 0 100 L 50 50 5 1 P\nX A 5 -200 0 100 R 50 50 5 1 P\nX K 15 200 0 100 L 50 50 6 1 P\nX A 6 -200 0 100 R 50 50 6 1 P\nX K 14 200 0 100 L 50 50 7 1 P\nX A 7 -200 0 100 R 50 50 7 1 P\nX K 13 200 0 100 L 50 50 8 1 P\nX A 8 -200 0 100 R 50 50 8 1 P\nX K 12 200 0 100 L 50 50 9 1 P\nX A 9 -200 0 100 R 50 50 9 1 P\nX A 10 -200 0 100 R 50 50 10 1 P\nX K 11 200 0 100 L 50 50 10 1 P\nENDDRAW\nENDDEF\n#\n# HDSP-4832_2\n#\nDEF HDSP-4832_2 BAR 0 40 Y N 1 F N\nF0 \"BAR\" 0 600 50 H V C CNN\nF1 \"HDSP-4832_2\" 0 -700 50 H V C CNN\nF2 \"Display:HDSP-4832\" 0 -800 50 H I C CNN\nF3 \"\" -2000 200 50 H I C CNN\n$FPLIST\n HDSP?48*\n$ENDFPLIST\nDRAW\nS -100 500 100 -600 0 1 10 f\nP 2 0 1 0 -100 -500 100 -500 N\nP 2 0 1 0 -100 -400 100 -400 N\nP 2 0 1 0 -100 -300 100 -300 N\nP 2 0 1 0 -100 -200 100 -200 N\nP 2 0 1 0 -100 0 100 0 N\nP 2 0 1 0 -100 200 100 200 N\nP 2 0 1 0 -100 300 100 300 N\nP 2 0 1 0 -100 400 100 400 N\nP 2 0 1 10 50 -460 50 -540 N\nP 2 0 1 10 50 -360 50 -440 N\nP 2 0 1 10 50 -260 50 -340 N\nP 2 0 1 10 50 -160 50 -240 N\nP 2 0 1 10 50 -60 50 -140 N\nP 2 0 1 10 50 40 50 -40 N\nP 2 0 1 10 50 140 50 60 N\nP 2 0 1 10 50 240 50 160 N\nP 2 0 1 10 50 340 50 260 N\nP 2 0 1 10 50 440 50 360 N\nP 2 0 1 0 100 -100 -100 -100 N\nP 2 0 1 0 100 100 -100 100 N\nP 4 0 1 10 -30 -460 -30 -540 50 -500 -30 -460 N\nP 4 0 1 10 -30 -360 -30 -440 50 -400 -30 -360 N\nP 4 0 1 10 -30 -260 -30 -340 50 -300 -30 -260 N\nP 4 0 1 10 -30 -160 -30 -240 50 -200 -30 -160 N\nP 4 0 1 10 -30 -60 -30 -140 50 -100 -30 -60 N\nP 4 0 1 10 -30 40 -30 -40 50 0 -30 40 N\nP 4 0 1 10 -30 140 -30 60 50 100 -30 140 N\nP 4 0 1 10 -30 240 -30 160 50 200 -30 240 N\nP 4 0 1 10 -30 340 -30 260 50 300 -30 340 N\nP 4 0 1 10 -30 440 -30 360 50 400 -30 440 N\nX A 1 -200 400 100 R 50 50 1 1 P\nX A 10 -200 -500 100 R 50 50 1 1 P\nX K 11 200 -500 100 L 50 50 1 1 P\nX K 12 200 -400 100 L 50 50 1 1 P\nX K 13 200 -300 100 L 50 50 1 1 P\nX K 14 200 -200 100 L 50 50 1 1 P\nX K 15 200 -100 100 L 50 50 1 1 P\nX K 16 200 0 100 L 50 50 1 1 P\nX K 17 200 100 100 L 50 50 1 1 P\nX K 18 200 200 100 L 50 50 1 1 P\nX K 19 200 300 100 L 50 50 1 1 P\nX A 2 -200 300 100 R 50 50 1 1 P\nX K 20 200 400 100 L 50 50 1 1 P\nX A 3 -200 200 100 R 50 50 1 1 P\nX A 4 -200 100 100 R 50 50 1 1 P\nX A 5 -200 0 100 R 50 50 1 1 P\nX A 6 -200 -100 100 R 50 50 1 1 P\nX A 7 -200 -200 100 R 50 50 1 1 P\nX A 8 -200 -300 100 R 50 50 1 1 P\nX A 9 -200 -400 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# HDSP-4836\n#\nDEF HDSP-4836 BAR 0 40 Y N 10 F N\nF0 \"BAR\" 0 150 50 H V C CNN\nF1 \"HDSP-4836\" 0 -150 50 H V C CNN\nF2 \"Display:HDSP-4836\" 0 -300 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n HDSP?48*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -100 0 100 0 N\nP 2 0 1 10 50 -50 50 50 N\nP 4 0 1 10 -50 50 -50 -50 50 0 -50 50 N\nX A 1 -200 0 100 R 50 50 1 1 P\nX K 20 200 0 100 L 50 50 1 1 P\nX K 19 200 0 100 L 50 50 2 1 P\nX A 2 -200 0 100 R 50 50 2 1 P\nX K 18 200 0 100 L 50 50 3 1 P\nX A 3 -200 0 100 R 50 50 3 1 P\nX K 17 200 0 100 L 50 50 4 1 P\nX A 4 -200 0 100 R 50 50 4 1 P\nX K 16 200 0 100 L 50 50 5 1 P\nX A 5 -200 0 100 R 50 50 5 1 P\nX K 15 200 0 100 L 50 50 6 1 P\nX A 6 -200 0 100 R 50 50 6 1 P\nX K 14 200 0 100 L 50 50 7 1 P\nX A 7 -200 0 100 R 50 50 7 1 P\nX K 13 200 0 100 L 50 50 8 1 P\nX A 8 -200 0 100 R 50 50 8 1 P\nX K 12 200 0 100 L 50 50 9 1 P\nX A 9 -200 0 100 R 50 50 9 1 P\nX A 10 -200 0 100 R 50 50 10 1 P\nX K 11 200 0 100 L 50 50 10 1 P\nENDDRAW\nENDDEF\n#\n# HDSP-4836_2\n#\nDEF HDSP-4836_2 BAR 0 40 Y N 1 F N\nF0 \"BAR\" 0 600 50 H V C CNN\nF1 \"HDSP-4836_2\" 0 -700 50 H V C CNN\nF2 \"Display:HDSP-4836\" 0 -800 50 H I C CNN\nF3 \"\" -2000 200 50 H I C CNN\n$FPLIST\n HDSP?48*\n$ENDFPLIST\nDRAW\nS -100 500 100 -600 0 1 10 f\nP 2 0 1 0 -100 -500 100 -500 N\nP 2 0 1 0 -100 -400 100 -400 N\nP 2 0 1 0 -100 -300 100 -300 N\nP 2 0 1 0 -100 -200 100 -200 N\nP 2 0 1 0 -100 0 100 0 N\nP 2 0 1 0 -100 200 100 200 N\nP 2 0 1 0 -100 300 100 300 N\nP 2 0 1 0 -100 400 100 400 N\nP 2 0 1 10 50 -460 50 -540 N\nP 2 0 1 10 50 -360 50 -440 N\nP 2 0 1 10 50 -260 50 -340 N\nP 2 0 1 10 50 -160 50 -240 N\nP 2 0 1 10 50 -60 50 -140 N\nP 2 0 1 10 50 40 50 -40 N\nP 2 0 1 10 50 140 50 60 N\nP 2 0 1 10 50 240 50 160 N\nP 2 0 1 10 50 340 50 260 N\nP 2 0 1 10 50 440 50 360 N\nP 2 0 1 0 100 -100 -100 -100 N\nP 2 0 1 0 100 100 -100 100 N\nP 4 0 1 10 -30 -460 -30 -540 50 -500 -30 -460 N\nP 4 0 1 10 -30 -360 -30 -440 50 -400 -30 -360 N\nP 4 0 1 10 -30 -260 -30 -340 50 -300 -30 -260 N\nP 4 0 1 10 -30 -160 -30 -240 50 -200 -30 -160 N\nP 4 0 1 10 -30 -60 -30 -140 50 -100 -30 -60 N\nP 4 0 1 10 -30 40 -30 -40 50 0 -30 40 N\nP 4 0 1 10 -30 140 -30 60 50 100 -30 140 N\nP 4 0 1 10 -30 240 -30 160 50 200 -30 240 N\nP 4 0 1 10 -30 340 -30 260 50 300 -30 340 N\nP 4 0 1 10 -30 440 -30 360 50 400 -30 440 N\nX A 1 -200 400 100 R 50 50 1 1 P\nX A 10 -200 -500 100 R 50 50 1 1 P\nX K 11 200 -500 100 L 50 50 1 1 P\nX K 12 200 -400 100 L 50 50 1 1 P\nX K 13 200 -300 100 L 50 50 1 1 P\nX K 14 200 -200 100 L 50 50 1 1 P\nX K 15 200 -100 100 L 50 50 1 1 P\nX K 16 200 0 100 L 50 50 1 1 P\nX K 17 200 100 100 L 50 50 1 1 P\nX K 18 200 200 100 L 50 50 1 1 P\nX K 19 200 300 100 L 50 50 1 1 P\nX A 2 -200 300 100 R 50 50 1 1 P\nX K 20 200 400 100 L 50 50 1 1 P\nX A 3 -200 200 100 R 50 50 1 1 P\nX A 4 -200 100 100 R 50 50 1 1 P\nX A 5 -200 0 100 R 50 50 1 1 P\nX A 6 -200 -100 100 R 50 50 1 1 P\nX A 7 -200 -200 100 R 50 50 1 1 P\nX A 8 -200 -300 100 R 50 50 1 1 P\nX A 9 -200 -400 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# HDSP-4840\n#\nDEF HDSP-4840 BAR 0 40 Y N 10 F N\nF0 \"BAR\" 0 150 50 H V C CNN\nF1 \"HDSP-4840\" 0 -150 50 H V C CNN\nF2 \"Display:HDSP-4840\" 0 -300 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n HDSP?48*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -100 0 100 0 N\nP 2 0 1 10 50 -50 50 50 N\nP 4 0 1 10 -50 50 -50 -50 50 0 -50 50 N\nX A 1 -200 0 100 R 50 50 1 1 P\nX K 20 200 0 100 L 50 50 1 1 P\nX K 19 200 0 100 L 50 50 2 1 P\nX A 2 -200 0 100 R 50 50 2 1 P\nX K 18 200 0 100 L 50 50 3 1 P\nX A 3 -200 0 100 R 50 50 3 1 P\nX K 17 200 0 100 L 50 50 4 1 P\nX A 4 -200 0 100 R 50 50 4 1 P\nX K 16 200 0 100 L 50 50 5 1 P\nX A 5 -200 0 100 R 50 50 5 1 P\nX K 15 200 0 100 L 50 50 6 1 P\nX A 6 -200 0 100 R 50 50 6 1 P\nX K 14 200 0 100 L 50 50 7 1 P\nX A 7 -200 0 100 R 50 50 7 1 P\nX K 13 200 0 100 L 50 50 8 1 P\nX A 8 -200 0 100 R 50 50 8 1 P\nX K 12 200 0 100 L 50 50 9 1 P\nX A 9 -200 0 100 R 50 50 9 1 P\nX A 10 -200 0 100 R 50 50 10 1 P\nX K 11 200 0 100 L 50 50 10 1 P\nENDDRAW\nENDDEF\n#\n# HDSP-4840_2\n#\nDEF HDSP-4840_2 BAR 0 40 Y N 1 F N\nF0 \"BAR\" 0 600 50 H V C CNN\nF1 \"HDSP-4840_2\" 0 -700 50 H V C CNN\nF2 \"Display:HDSP-4840\" 0 -800 50 H I C CNN\nF3 \"\" -2000 200 50 H I C CNN\n$FPLIST\n HDSP?48*\n$ENDFPLIST\nDRAW\nS -100 500 100 -600 0 1 10 f\nP 2 0 1 0 -100 -500 100 -500 N\nP 2 0 1 0 -100 -400 100 -400 N\nP 2 0 1 0 -100 -300 100 -300 N\nP 2 0 1 0 -100 -200 100 -200 N\nP 2 0 1 0 -100 0 100 0 N\nP 2 0 1 0 -100 200 100 200 N\nP 2 0 1 0 -100 300 100 300 N\nP 2 0 1 0 -100 400 100 400 N\nP 2 0 1 10 50 -460 50 -540 N\nP 2 0 1 10 50 -360 50 -440 N\nP 2 0 1 10 50 -260 50 -340 N\nP 2 0 1 10 50 -160 50 -240 N\nP 2 0 1 10 50 -60 50 -140 N\nP 2 0 1 10 50 40 50 -40 N\nP 2 0 1 10 50 140 50 60 N\nP 2 0 1 10 50 240 50 160 N\nP 2 0 1 10 50 340 50 260 N\nP 2 0 1 10 50 440 50 360 N\nP 2 0 1 0 100 -100 -100 -100 N\nP 2 0 1 0 100 100 -100 100 N\nP 4 0 1 10 -30 -460 -30 -540 50 -500 -30 -460 N\nP 4 0 1 10 -30 -360 -30 -440 50 -400 -30 -360 N\nP 4 0 1 10 -30 -260 -30 -340 50 -300 -30 -260 N\nP 4 0 1 10 -30 -160 -30 -240 50 -200 -30 -160 N\nP 4 0 1 10 -30 -60 -30 -140 50 -100 -30 -60 N\nP 4 0 1 10 -30 40 -30 -40 50 0 -30 40 N\nP 4 0 1 10 -30 140 -30 60 50 100 -30 140 N\nP 4 0 1 10 -30 240 -30 160 50 200 -30 240 N\nP 4 0 1 10 -30 340 -30 260 50 300 -30 340 N\nP 4 0 1 10 -30 440 -30 360 50 400 -30 440 N\nX A 1 -200 400 100 R 50 50 1 1 P\nX A 10 -200 -500 100 R 50 50 1 1 P\nX K 11 200 -500 100 L 50 50 1 1 P\nX K 12 200 -400 100 L 50 50 1 1 P\nX K 13 200 -300 100 L 50 50 1 1 P\nX K 14 200 -200 100 L 50 50 1 1 P\nX K 15 200 -100 100 L 50 50 1 1 P\nX K 16 200 0 100 L 50 50 1 1 P\nX K 17 200 100 100 L 50 50 1 1 P\nX K 18 200 200 100 L 50 50 1 1 P\nX K 19 200 300 100 L 50 50 1 1 P\nX A 2 -200 300 100 R 50 50 1 1 P\nX K 20 200 400 100 L 50 50 1 1 P\nX A 3 -200 200 100 R 50 50 1 1 P\nX A 4 -200 100 100 R 50 50 1 1 P\nX A 5 -200 0 100 R 50 50 1 1 P\nX A 6 -200 -100 100 R 50 50 1 1 P\nX A 7 -200 -200 100 R 50 50 1 1 P\nX A 8 -200 -300 100 R 50 50 1 1 P\nX A 9 -200 -400 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# HDSP-4850\n#\nDEF HDSP-4850 BAR 0 40 Y N 10 F N\nF0 \"BAR\" 0 150 50 H V C CNN\nF1 \"HDSP-4850\" 0 -150 50 H V C CNN\nF2 \"Display:HDSP-4850\" 0 -300 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n HDSP?48*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -100 0 100 0 N\nP 2 0 1 10 50 -50 50 50 N\nP 4 0 1 10 -50 50 -50 -50 50 0 -50 50 N\nX A 1 -200 0 100 R 50 50 1 1 P\nX K 20 200 0 100 L 50 50 1 1 P\nX K 19 200 0 100 L 50 50 2 1 P\nX A 2 -200 0 100 R 50 50 2 1 P\nX K 18 200 0 100 L 50 50 3 1 P\nX A 3 -200 0 100 R 50 50 3 1 P\nX K 17 200 0 100 L 50 50 4 1 P\nX A 4 -200 0 100 R 50 50 4 1 P\nX K 16 200 0 100 L 50 50 5 1 P\nX A 5 -200 0 100 R 50 50 5 1 P\nX K 15 200 0 100 L 50 50 6 1 P\nX A 6 -200 0 100 R 50 50 6 1 P\nX K 14 200 0 100 L 50 50 7 1 P\nX A 7 -200 0 100 R 50 50 7 1 P\nX K 13 200 0 100 L 50 50 8 1 P\nX A 8 -200 0 100 R 50 50 8 1 P\nX K 12 200 0 100 L 50 50 9 1 P\nX A 9 -200 0 100 R 50 50 9 1 P\nX A 10 -200 0 100 R 50 50 10 1 P\nX K 11 200 0 100 L 50 50 10 1 P\nENDDRAW\nENDDEF\n#\n# HDSP-4850_2\n#\nDEF HDSP-4850_2 BAR 0 40 Y N 1 F N\nF0 \"BAR\" 0 600 50 H V C CNN\nF1 \"HDSP-4850_2\" 0 -700 50 H V C CNN\nF2 \"Display:HDSP-4850\" 0 -800 50 H I C CNN\nF3 \"\" -2000 200 50 H I C CNN\n$FPLIST\n HDSP?48*\n$ENDFPLIST\nDRAW\nS -100 500 100 -600 0 1 10 f\nP 2 0 1 0 -100 -500 100 -500 N\nP 2 0 1 0 -100 -400 100 -400 N\nP 2 0 1 0 -100 -300 100 -300 N\nP 2 0 1 0 -100 -200 100 -200 N\nP 2 0 1 0 -100 0 100 0 N\nP 2 0 1 0 -100 200 100 200 N\nP 2 0 1 0 -100 300 100 300 N\nP 2 0 1 0 -100 400 100 400 N\nP 2 0 1 10 50 -460 50 -540 N\nP 2 0 1 10 50 -360 50 -440 N\nP 2 0 1 10 50 -260 50 -340 N\nP 2 0 1 10 50 -160 50 -240 N\nP 2 0 1 10 50 -60 50 -140 N\nP 2 0 1 10 50 40 50 -40 N\nP 2 0 1 10 50 140 50 60 N\nP 2 0 1 10 50 240 50 160 N\nP 2 0 1 10 50 340 50 260 N\nP 2 0 1 10 50 440 50 360 N\nP 2 0 1 0 100 -100 -100 -100 N\nP 2 0 1 0 100 100 -100 100 N\nP 4 0 1 10 -30 -460 -30 -540 50 -500 -30 -460 N\nP 4 0 1 10 -30 -360 -30 -440 50 -400 -30 -360 N\nP 4 0 1 10 -30 -260 -30 -340 50 -300 -30 -260 N\nP 4 0 1 10 -30 -160 -30 -240 50 -200 -30 -160 N\nP 4 0 1 10 -30 -60 -30 -140 50 -100 -30 -60 N\nP 4 0 1 10 -30 40 -30 -40 50 0 -30 40 N\nP 4 0 1 10 -30 140 -30 60 50 100 -30 140 N\nP 4 0 1 10 -30 240 -30 160 50 200 -30 240 N\nP 4 0 1 10 -30 340 -30 260 50 300 -30 340 N\nP 4 0 1 10 -30 440 -30 360 50 400 -30 440 N\nX A 1 -200 400 100 R 50 50 1 1 P\nX A 10 -200 -500 100 R 50 50 1 1 P\nX K 11 200 -500 100 L 50 50 1 1 P\nX K 12 200 -400 100 L 50 50 1 1 P\nX K 13 200 -300 100 L 50 50 1 1 P\nX K 14 200 -200 100 L 50 50 1 1 P\nX K 15 200 -100 100 L 50 50 1 1 P\nX K 16 200 0 100 L 50 50 1 1 P\nX K 17 200 100 100 L 50 50 1 1 P\nX K 18 200 200 100 L 50 50 1 1 P\nX K 19 200 300 100 L 50 50 1 1 P\nX A 2 -200 300 100 R 50 50 1 1 P\nX K 20 200 400 100 L 50 50 1 1 P\nX A 3 -200 200 100 R 50 50 1 1 P\nX A 4 -200 100 100 R 50 50 1 1 P\nX A 5 -200 0 100 R 50 50 1 1 P\nX A 6 -200 -100 100 R 50 50 1 1 P\nX A 7 -200 -200 100 R 50 50 1 1 P\nX A 8 -200 -300 100 R 50 50 1 1 P\nX A 9 -200 -400 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# HLCP-J100\n#\nDEF HLCP-J100 BAR 0 40 Y N 10 F N\nF0 \"BAR\" 0 150 50 H V C CNN\nF1 \"HLCP-J100\" 0 -150 50 H V C CNN\nF2 \"Display:HLCP-J100\" 0 -300 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n HLCP*J100*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -100 0 100 0 N\nP 2 0 1 10 50 -50 50 50 N\nP 4 0 1 10 -50 50 -50 -50 50 0 -50 50 N\nX A 1 -200 0 100 R 50 50 1 1 P\nX K 20 200 0 100 L 50 50 1 1 P\nX K 19 200 0 100 L 50 50 2 1 P\nX A 2 -200 0 100 R 50 50 2 1 P\nX K 18 200 0 100 L 50 50 3 1 P\nX A 3 -200 0 100 R 50 50 3 1 P\nX K 17 200 0 100 L 50 50 4 1 P\nX A 4 -200 0 100 R 50 50 4 1 P\nX K 16 200 0 100 L 50 50 5 1 P\nX A 5 -200 0 100 R 50 50 5 1 P\nX K 15 200 0 100 L 50 50 6 1 P\nX A 6 -200 0 100 R 50 50 6 1 P\nX K 14 200 0 100 L 50 50 7 1 P\nX A 7 -200 0 100 R 50 50 7 1 P\nX K 13 200 0 100 L 50 50 8 1 P\nX A 8 -200 0 100 R 50 50 8 1 P\nX K 12 200 0 100 L 50 50 9 1 P\nX A 9 -200 0 100 R 50 50 9 1 P\nX A 10 -200 0 100 R 50 50 10 1 P\nX K 11 200 0 100 L 50 50 10 1 P\nENDDRAW\nENDDEF\n#\n# HLCP-J100_2\n#\nDEF HLCP-J100_2 BAR 0 40 Y N 1 F N\nF0 \"BAR\" 0 600 50 H V C CNN\nF1 \"HLCP-J100_2\" 0 -700 50 H V C CNN\nF2 \"Display:HLCP-J100\" 0 -800 50 H I C CNN\nF3 \"\" -2000 200 50 H I C CNN\n$FPLIST\n HLCP?J100*\n$ENDFPLIST\nDRAW\nS -100 500 100 -600 0 1 10 f\nP 2 0 1 0 -100 -500 100 -500 N\nP 2 0 1 0 -100 -400 100 -400 N\nP 2 0 1 0 -100 -300 100 -300 N\nP 2 0 1 0 -100 -200 100 -200 N\nP 2 0 1 0 -100 0 100 0 N\nP 2 0 1 0 -100 200 100 200 N\nP 2 0 1 0 -100 300 100 300 N\nP 2 0 1 0 -100 400 100 400 N\nP 2 0 1 10 50 -460 50 -540 N\nP 2 0 1 10 50 -360 50 -440 N\nP 2 0 1 10 50 -260 50 -340 N\nP 2 0 1 10 50 -160 50 -240 N\nP 2 0 1 10 50 -60 50 -140 N\nP 2 0 1 10 50 40 50 -40 N\nP 2 0 1 10 50 140 50 60 N\nP 2 0 1 10 50 240 50 160 N\nP 2 0 1 10 50 340 50 260 N\nP 2 0 1 10 50 440 50 360 N\nP 2 0 1 0 100 -100 -100 -100 N\nP 2 0 1 0 100 100 -100 100 N\nP 4 0 1 10 -30 -460 -30 -540 50 -500 -30 -460 N\nP 4 0 1 10 -30 -360 -30 -440 50 -400 -30 -360 N\nP 4 0 1 10 -30 -260 -30 -340 50 -300 -30 -260 N\nP 4 0 1 10 -30 -160 -30 -240 50 -200 -30 -160 N\nP 4 0 1 10 -30 -60 -30 -140 50 -100 -30 -60 N\nP 4 0 1 10 -30 40 -30 -40 50 0 -30 40 N\nP 4 0 1 10 -30 140 -30 60 50 100 -30 140 N\nP 4 0 1 10 -30 240 -30 160 50 200 -30 240 N\nP 4 0 1 10 -30 340 -30 260 50 300 -30 340 N\nP 4 0 1 10 -30 440 -30 360 50 400 -30 440 N\nX A 1 -200 400 100 R 50 50 1 1 P\nX A 10 -200 -500 100 R 50 50 1 1 P\nX K 11 200 -500 100 L 50 50 1 1 P\nX K 12 200 -400 100 L 50 50 1 1 P\nX K 13 200 -300 100 L 50 50 1 1 P\nX K 14 200 -200 100 L 50 50 1 1 P\nX K 15 200 -100 100 L 50 50 1 1 P\nX K 16 200 0 100 L 50 50 1 1 P\nX K 17 200 100 100 L 50 50 1 1 P\nX K 18 200 200 100 L 50 50 1 1 P\nX K 19 200 300 100 L 50 50 1 1 P\nX A 2 -200 300 100 R 50 50 1 1 P\nX K 20 200 400 100 L 50 50 1 1 P\nX A 3 -200 200 100 R 50 50 1 1 P\nX A 4 -200 100 100 R 50 50 1 1 P\nX A 5 -200 0 100 R 50 50 1 1 P\nX A 6 -200 -100 100 R 50 50 1 1 P\nX A 7 -200 -200 100 R 50 50 1 1 P\nX A 8 -200 -300 100 R 50 50 1 1 P\nX A 9 -200 -400 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IR26-21C_L110_TR8\n#\nDEF IR26-21C_L110_TR8 D 0 40 N N 1 F N\nF0 \"D\" 0 100 50 H V C CNN\nF1 \"IR26-21C_L110_TR8\" 0 -150 50 H V C CNN\nF2 \"LED_SMD:LED_1206_3216Metric\" 0 200 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n LED*1206*3216Metric*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -50 -50 -50 50 N\nP 2 0 1 0 -50 0 50 0 N\nP 4 0 1 10 50 -50 50 50 -50 0 50 -50 N\nP 5 0 1 0 -120 -30 -180 -90 -150 -90 -180 -90 -180 -60 N\nP 5 0 1 0 -70 -30 -130 -90 -100 -90 -130 -90 -130 -60 N\nX K 1 -150 0 100 R 50 50 1 1 P\nX A 2 150 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRL81A\n#\nDEF IRL81A D 0 40 N N 1 F N\nF0 \"D\" 20 70 50 H V L CNN\nF1 \"IRL81A\" -40 -110 50 H V C CNN\nF2 \"LED_THT:LED_SideEmitter_Rectangular_W4.5mm_H1.6mm\" 0 175 50 H I C CNN\nF3 \"\" -50 0 50 H I C CNN\n$FPLIST\n LED*SideEmitter*Rectangular*W4.5mm*H1.6mm*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -100 0 0 0 N\nP 2 0 1 10 -100 50 -100 -50 N\nP 2 0 1 0 15 125 -5 125 N\nP 3 0 1 0 -45 65 15 125 15 105 N\nP 4 0 1 10 0 -50 0 50 -100 0 0 -50 N\nP 5 0 1 0 -95 65 -35 125 -35 105 -35 125 -55 125 N\nX K 1 -200 0 100 R 50 50 1 1 P\nX A 2 100 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Inolux_IN-PI554FCH\n#\nDEF Inolux_IN-PI554FCH D 0 10 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"Inolux_IN-PI554FCH\" 50 -225 50 H V L TNN\nF2 \"LED_SMD:LED_Inolux_IN-PI554FCH_PLCC4_5.0x5.0mm_P3.2mm\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\n$FPLIST\n LED*IN-PI554FCH*PLCC*5.0x5.0mm*P3.2mm*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS 200 200 -200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX VSS 1 0 -300 100 U 50 50 1 1 W\nX DIN 2 -300 0 100 R 50 50 1 1 I\nX VDD 3 0 300 100 D 50 50 1 1 W\nX DO 4 300 0 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# Inolux_IN-PI556FCH\n#\nDEF Inolux_IN-PI556FCH D 0 10 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"Inolux_IN-PI556FCH\" 50 -225 50 H V L TNN\nF2 \"LED_SMD:LED_WS2812_PLCC6_5.0x5.0mm_P1.6mm\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\n$FPLIST\n LED*WS2812*PLCC*5.0x5.0mm*P1.6mm*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS 200 200 -200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX DO 1 300 0 100 L 50 50 1 1 O\nX DIN 2 -300 0 100 R 50 50 1 1 I\nX VDD 3 -100 300 100 D 50 50 1 1 W\nX NC 4 200 100 100 L 50 50 1 1 N N\nX VCC 5 0 300 100 D 50 50 1 1 W\nX VSS 6 0 -300 100 U 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# LD271\n#\nDEF LD271 D 0 40 N N 1 F N\nF0 \"D\" 20 70 50 H V L CNN\nF1 \"LD271\" -40 -110 50 H V C CNN\nF2 \"LED_THT:LED_D5.0mm_IRGrey\" 0 175 50 H I C CNN\nF3 \"\" -50 0 50 H I C CNN\nALIAS SFH4546 CQY99 LD274 SFH4550\n$FPLIST\n LED*5.0mm*IRGrey*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -100 50 -100 -50 N\nP 2 0 1 0 0 0 -100 0 N\nP 2 0 1 0 15 125 -5 125 N\nP 3 0 1 0 -45 65 15 125 15 105 N\nP 4 0 1 10 0 -50 -100 0 0 50 0 -50 N\nP 5 0 1 0 -95 65 -35 125 -35 105 -35 125 -55 125 N\nX K 1 -200 0 100 R 50 50 1 1 P\nX A 2 100 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_Cree_XHP50_12V\n#\nDEF LED_Cree_XHP50_12V D 0 40 Y N 1 F N\nF0 \"D\" 0 250 50 H V C CNN\nF1 \"LED_Cree_XHP50_12V\" 0 175 50 H V C CNN\nF2 \"LED_SMD:LED_Cree-XHP50_12V\" 0 325 50 H I C CNN\nF3 \"\" -200 0 50 H I C CNN\n$FPLIST\n LED?Cree?XHP50?12V*\n$ENDFPLIST\nDRAW\nC -270 0 10 0 1 10 F\nC 0 -120 10 0 1 10 F\nC 0 0 10 0 1 10 F\nC 270 0 10 0 1 10 F\nP 2 0 1 0 -250 0 250 0 N\nP 2 0 1 10 -245 -50 -245 50 N\nP 2 0 1 10 -125 -50 -125 50 N\nP 2 0 1 0 0 -150 0 -180 N\nP 2 0 1 0 0 0 0 -180 N\nP 2 0 1 10 30 -50 30 50 N\nP 2 0 1 10 145 -50 145 50 N\nP 4 0 1 0 -270 0 -270 -120 270 -120 270 0 N\nP 4 0 1 10 -145 -50 -145 50 -245 0 -145 -50 N\nP 4 0 1 10 -90 -160 -100 -150 -100 -90 -110 -80 N\nP 4 0 1 10 -25 -50 -25 50 -125 0 -25 -50 N\nP 4 0 1 10 130 -50 130 50 30 0 130 -50 N\nP 4 0 1 10 170 -160 160 -150 160 -90 150 -80 N\nP 4 0 1 10 245 -50 245 50 145 0 245 -50 N\nP 5 0 1 0 -230 55 -170 115 -200 115 -170 115 -170 85 N\nP 5 0 1 0 -180 55 -120 115 -150 115 -120 115 -120 85 N\nP 5 0 1 10 -160 -150 -160 -90 -100 -120 -160 -150 -160 -140 N\nP 5 0 1 0 -110 55 -50 115 -80 115 -50 115 -50 85 N\nP 5 0 1 0 -60 55 0 115 -30 115 0 115 0 85 N\nP 5 0 1 0 45 55 105 115 75 115 105 115 105 85 N\nP 5 0 1 0 95 55 155 115 125 115 155 115 155 85 N\nP 5 0 1 10 100 -150 100 -90 160 -120 100 -150 100 -140 N\nP 5 0 1 0 160 55 220 115 190 115 220 115 220 85 N\nP 5 0 1 0 210 55 270 115 240 115 270 115 270 85 N\nX K 1 -350 0 100 R 50 50 1 1 P\nX A 2 350 0 100 L 50 50 1 1 P\nX PAD 3 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_Cree_XHP50_6V\n#\nDEF LED_Cree_XHP50_6V D 0 40 Y N 1 F N\nF0 \"D\" 0 450 50 H V C CNN\nF1 \"LED_Cree_XHP50_6V\" 0 375 50 H V C CNN\nF2 \"LED_SMD:LED_Cree-XHP50_6V\" 0 525 50 H I C CNN\nF3 \"\" -75 -100 50 H I C CNN\n$FPLIST\n LED?Cree?XHP50?6V*\n$ENDFPLIST\nDRAW\nC -150 -100 14 0 1 0 F\nC -150 0 14 0 1 0 F\nC -150 100 14 0 1 0 F\nC 150 -100 14 0 1 0 F\nC 150 0 14 0 1 0 F\nC 150 100 14 0 1 0 F\nP 2 0 1 0 -150 -100 150 -100 N\nP 2 0 1 10 -120 -150 -120 -50 N\nP 2 0 1 10 -120 50 -120 150 N\nP 2 0 1 10 -5 50 -5 150 N\nP 2 0 1 10 0 -150 0 -50 N\nP 2 0 1 0 150 100 -150 100 N\nP 4 0 1 0 -190 -200 -190 -300 190 -300 190 -200 N\nP 4 0 1 10 -20 -150 -20 -50 -120 -100 -20 -150 N\nP 4 0 1 10 -20 50 -20 150 -120 100 -20 50 N\nP 4 0 1 10 20 240 10 250 10 310 0 320 N\nP 4 0 1 10 35 -260 25 -250 25 -190 15 -180 N\nP 4 0 1 10 95 50 95 150 -5 100 95 50 N\nP 4 0 1 10 100 -150 100 -50 0 -100 100 -150 N\nP 5 0 1 0 -150 -220 -150 280 150 280 150 -220 -150 -220 N\nP 5 0 1 0 -105 -45 -45 15 -75 15 -45 15 -45 -15 N\nP 5 0 1 0 -105 155 -45 215 -75 215 -45 215 -45 185 N\nP 5 0 1 0 -55 -45 5 15 -25 15 5 15 5 -15 N\nP 5 0 1 0 -55 155 5 215 -25 215 5 215 5 185 N\nP 5 0 1 10 -50 250 -50 310 10 280 -50 250 -50 260 N\nP 5 0 1 10 -35 -250 -35 -190 25 -220 -35 -250 -35 -240 N\nP 5 0 1 0 10 155 70 215 40 215 70 215 70 185 N\nP 5 0 1 0 15 -45 75 15 45 15 75 15 75 -15 N\nP 5 0 1 0 60 155 120 215 90 215 120 215 120 185 N\nP 5 0 1 0 65 -45 125 15 95 15 125 15 125 -15 N\nX K 1 -250 0 100 R 50 50 1 1 P\nX A 2 250 0 100 L 50 50 1 1 P\nX PAD 3 0 -400 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_Cree_XHP70_12V\n#\nDEF LED_Cree_XHP70_12V D 0 40 Y N 1 F N\nF0 \"D\" 0 250 50 H V C CNN\nF1 \"LED_Cree_XHP70_12V\" 0 175 50 H V C CNN\nF2 \"LED_SMD:LED_Cree-XHP70_12V\" 0 325 50 H I C CNN\nF3 \"\" -200 0 50 H I C CNN\n$FPLIST\n LED?Cree?XHP70?12V*\n$ENDFPLIST\nDRAW\nC -270 0 10 0 1 10 F\nC 0 -120 14 0 1 0 F\nC 0 0 14 0 1 0 F\nC 270 0 10 0 1 10 F\nP 2 0 1 0 -250 0 250 0 N\nP 2 0 1 10 -245 -50 -245 50 N\nP 2 0 1 10 -125 -50 -125 50 N\nP 2 0 1 0 0 -150 0 -180 N\nP 2 0 1 0 0 0 0 -180 N\nP 2 0 1 10 30 -50 30 50 N\nP 2 0 1 10 145 -50 145 50 N\nP 4 0 1 0 -270 0 -270 -120 270 -120 270 0 N\nP 4 0 1 10 -145 -50 -145 50 -245 0 -145 -50 N\nP 4 0 1 10 -90 -160 -100 -150 -100 -90 -110 -80 N\nP 4 0 1 10 -25 -50 -25 50 -125 0 -25 -50 N\nP 4 0 1 10 130 -50 130 50 30 0 130 -50 N\nP 4 0 1 10 170 -160 160 -150 160 -90 150 -80 N\nP 4 0 1 10 245 -50 245 50 145 0 245 -50 N\nP 5 0 1 0 -230 55 -170 115 -200 115 -170 115 -170 85 N\nP 5 0 1 0 -180 55 -120 115 -150 115 -120 115 -120 85 N\nP 5 0 1 10 -160 -150 -160 -90 -100 -120 -160 -150 -160 -140 N\nP 5 0 1 0 -110 55 -50 115 -80 115 -50 115 -50 85 N\nP 5 0 1 0 -60 55 0 115 -30 115 0 115 0 85 N\nP 5 0 1 0 45 55 105 115 75 115 105 115 105 85 N\nP 5 0 1 0 95 55 155 115 125 115 155 115 155 85 N\nP 5 0 1 10 100 -150 100 -90 160 -120 100 -150 100 -140 N\nP 5 0 1 0 160 55 220 115 190 115 220 115 220 85 N\nP 5 0 1 0 210 55 270 115 240 115 270 115 270 85 N\nX K 1 -350 0 100 R 50 50 1 1 P\nX A 2 350 0 100 L 50 50 1 1 P\nX PAD 3 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# LED_Cree_XHP70_6V\n#\nDEF LED_Cree_XHP70_6V D 0 40 Y N 1 F N\nF0 \"D\" 0 450 50 H V C CNN\nF1 \"LED_Cree_XHP70_6V\" 0 375 50 H V C CNN\nF2 \"LED_SMD:LED_Cree-XHP70_6V\" 0 525 50 H I C CNN\nF3 \"\" -75 -100 50 H I C CNN\n$FPLIST\n LED?Cree?XHP70?6V*\n$ENDFPLIST\nDRAW\nC -150 -100 14 0 1 0 F\nC -150 0 14 0 1 0 F\nC -150 100 14 0 1 0 F\nC 150 -100 14 0 1 0 F\nC 150 0 14 0 1 0 F\nC 150 100 14 0 1 0 F\nP 2 0 1 0 -150 -100 150 -100 N\nP 2 0 1 10 -120 -150 -120 -50 N\nP 2 0 1 10 -120 50 -120 150 N\nP 2 0 1 10 -5 50 -5 150 N\nP 2 0 1 10 0 -150 0 -50 N\nP 2 0 1 0 150 100 -150 100 N\nP 4 0 1 0 -190 -200 -190 -300 190 -300 190 -200 N\nP 4 0 1 10 -20 -150 -20 -50 -120 -100 -20 -150 N\nP 4 0 1 10 -20 50 -20 150 -120 100 -20 50 N\nP 4 0 1 10 20 240 10 250 10 310 0 320 N\nP 4 0 1 8 35 -260 25 -250 25 -190 15 -180 N\nP 4 0 1 10 95 50 95 150 -5 100 95 50 N\nP 4 0 1 10 100 -150 100 -50 0 -100 100 -150 N\nP 5 0 1 0 -150 -220 -150 280 150 280 150 -220 -150 -220 N\nP 5 0 1 0 -105 -45 -45 15 -75 15 -45 15 -45 -15 N\nP 5 0 1 0 -105 155 -45 215 -75 215 -45 215 -45 185 N\nP 5 0 1 0 -55 -45 5 15 -25 15 5 15 5 -15 N\nP 5 0 1 0 -55 155 5 215 -25 215 5 215 5 185 N\nP 5 0 1 10 -50 250 -50 310 10 280 -50 250 -50 260 N\nP 5 0 1 8 -35 -250 -35 -190 25 -220 -35 -250 -35 -240 N\nP 5 0 1 0 10 155 70 215 40 215 70 215 70 185 N\nP 5 0 1 0 15 -45 75 15 45 15 75 15 75 -15 N\nP 5 0 1 0 60 155 120 215 90 215 120 215 120 185 N\nP 5 0 1 0 65 -45 125 15 95 15 125 15 125 -15 N\nX K 1 -250 0 100 R 50 50 1 1 P\nX A 2 250 0 100 L 50 50 1 1 P\nX PAD 3 0 -400 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# NeoPixel_THT\n#\nDEF NeoPixel_THT D 0 10 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"NeoPixel_THT\" 50 -225 50 H V L TNN\nF2 \"\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\n$FPLIST\n LED*D5.0mm*\n LED*D8.0mm*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS 200 200 -200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX DOUT 1 300 0 100 L 50 50 1 1 O\nX GND 2 0 -300 100 U 50 50 1 1 W\nX VDD 3 0 300 100 D 50 50 1 1 W\nX DIN 4 -300 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# QLS6A-FKW\n#\nDEF QLS6A-FKW D 0 20 Y N 1 F N\nF0 \"D\" -200 350 50 H V L CNN\nF1 \"QLS6A-FKW\" 0 350 50 H V L CNN\nF2 \"LED_SMD:LED_Cree-PLCC6_4.7x1.5mm\" -200 -350 50 H I L CNN\nF3 \"\" -200 -550 50 H I L CNN\n$FPLIST\n LED*Cree*PLCC*4.7x1.5mm*\n$ENDFPLIST\nDRAW\nC -175 -200 10 1 1 10 F\nC -175 0 10 1 1 10 F\nC 150 -200 10 1 1 10 F\nC 150 0 10 1 1 10 F\nT 0 -20 -236 30 0 0 0 B Normal 0 C C\nT 0 -21 -33 30 0 0 0 G Normal 0 C C\nT 0 -25 171 30 0 0 0 R Normal 0 C C\nS -200 300 200 -300 0 1 10 f\nP 2 0 1 0 -200 -200 200 -200 N\nP 2 0 1 0 -200 0 200 0 N\nP 2 0 1 10 -50 -150 -50 -250 N\nP 2 0 1 10 -50 50 -50 -50 N\nP 2 0 1 10 -50 250 -50 150 N\nP 2 0 1 0 25 -75 15 -75 N\nP 2 0 1 0 25 -75 25 -125 N\nP 2 0 1 0 25 75 35 75 N\nP 2 0 1 0 25 125 15 125 N\nP 2 0 1 0 25 125 25 75 N\nP 2 0 1 0 35 -125 25 -125 N\nP 2 0 1 0 100 -125 110 -125 N\nP 2 0 1 0 100 -75 90 -75 N\nP 2 0 1 0 100 -75 100 -125 N\nP 2 0 1 0 100 75 100 125 N\nP 2 0 1 0 100 75 110 75 N\nP 2 0 1 0 100 125 90 125 N\nP 4 0 1 0 -175 0 -175 100 150 100 150 0 N\nP 4 0 1 10 -150 -150 -150 -250 -50 -200 -150 -150 N\nP 4 0 1 10 -150 50 -150 -50 -50 0 -150 50 N\nP 4 0 1 10 -150 250 -50 200 -150 150 -150 250 N\nP 4 0 1 0 25 -100 50 -125 50 -75 25 -100 F\nP 4 0 1 0 50 125 50 75 25 100 50 125 F\nP 4 0 1 0 75 -75 75 -125 100 -100 75 -75 F\nP 4 0 1 0 75 125 75 75 100 100 75 125 F\nP 4 0 1 0 150 -200 150 -100 -175 -100 -175 -200 N\nP 2 1 1 0 -200 200 200 200 N\nP 2 1 1 0 -110 -150 -70 -110 N\nP 2 1 1 0 -110 50 -70 90 N\nP 2 1 1 0 -110 250 -70 290 N\nP 2 1 1 0 -70 -150 -30 -110 N\nP 2 1 1 0 -70 50 -30 90 N\nP 2 1 1 0 -70 250 -30 290 N\nP 3 1 1 0 -100 -120 -70 -110 -80 -140 N\nP 3 1 1 0 -100 80 -70 90 -80 60 N\nP 3 1 1 0 -100 280 -70 290 -80 260 N\nP 3 1 1 0 -60 -120 -30 -110 -40 -140 N\nP 3 1 1 0 -60 80 -30 90 -40 60 N\nP 3 1 1 0 -60 280 -30 290 -40 260 N\nX AB 1 -300 -200 100 R 50 50 1 1 P\nX KB 2 300 -200 100 L 50 50 1 1 P\nX AR 3 -300 200 100 R 50 50 1 1 P\nX KR 4 300 200 100 L 50 50 1 1 P\nX AG 5 -300 0 100 R 50 50 1 1 P\nX KR 6 300 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SFH4356P\n#\nDEF SFH4356P D 0 40 N N 1 F N\nF0 \"D\" 20 70 50 H V L CNN\nF1 \"SFH4356P\" -40 -110 50 H V C CNN\nF2 \"LED_THT:LED_D3.0mm_IRBlack\" 0 175 50 H I C CNN\nF3 \"\" -50 0 50 H I C CNN\nALIAS IR204A TSAL4400 SFH4346\n$FPLIST\n LED*3.0mm*IRBlack*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -100 50 -100 -50 N\nP 2 0 1 0 0 0 -100 0 N\nP 2 0 1 0 15 125 -5 125 N\nP 3 0 1 0 -45 65 15 125 15 105 N\nP 4 0 1 10 0 50 -100 0 0 -50 0 50 N\nP 5 0 1 0 -95 65 -35 125 -35 105 -35 125 -55 125 N\nX K 1 -200 0 100 R 50 50 1 1 P\nX A 2 100 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SFH460\n#\nDEF SFH460 D 0 40 N N 1 F N\nF0 \"D\" 20 70 50 H V L CNN\nF1 \"SFH460\" -40 -110 50 H V C CNN\nF2 \"Package_TO_SOT_THT:TO-18-2_Window\" 0 175 50 H I C CNN\nF3 \"\" -50 0 50 H I C CNN\n$FPLIST\n TO?18*Window*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -100 50 -100 -50 N\nP 2 0 1 0 0 0 -100 0 N\nP 2 0 1 0 15 125 -5 125 N\nP 3 0 1 0 -45 65 15 125 15 105 N\nP 4 0 1 10 0 50 0 -50 -100 0 0 50 N\nP 5 0 1 0 -95 65 -35 125 -35 105 -35 125 -55 125 N\nX K 1 -200 0 100 R 50 50 1 1 P\nX A 2 100 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SFH482\n#\nDEF SFH482 D 0 40 N N 1 F N\nF0 \"D\" 20 70 50 H V L CNN\nF1 \"SFH482\" -40 -110 50 H V C CNN\nF2 \"Package_TO_SOT_THT:TO-18-2_Window\" 0 175 50 H I C CNN\nF3 \"\" -50 0 50 H I C CNN\nALIAS SFH480\n$FPLIST\n TO?18*Window*\n$ENDFPLIST\nDRAW\nP 2 0 1 10 -100 50 -100 -50 N\nP 2 0 1 0 0 0 -100 0 N\nP 2 0 1 0 15 125 -5 125 N\nP 3 0 1 0 -45 65 15 125 15 105 N\nP 4 0 1 10 0 50 0 -50 -100 0 0 50 N\nP 5 0 1 0 -95 65 -35 125 -35 105 -35 125 -55 125 N\nX K 1 -200 0 100 R 50 50 1 1 P\nX A 2 100 0 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SK6805\n#\nDEF SK6805 D 0 10 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"SK6805\" 50 -225 50 H V L TNN\nF2 \"LED_SMD:LED_SK6805_PLCC4_2.4x2.7mm_P1.3mm\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\n$FPLIST\n LED*SK6805*PLCC*2.4x2.7mm*P1.3mm*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS 200 200 -200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX DOUT 1 300 0 100 L 50 50 1 1 O\nX VSS 2 0 -300 100 U 50 50 1 1 W\nX DIN 3 -300 0 100 R 50 50 1 1 I\nX VDD 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SK6812\n#\nDEF SK6812 D 0 10 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"SK6812\" 50 -225 50 H V L TNN\nF2 \"LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\n$FPLIST\n LED*SK6812*PLCC*5.0x5.0mm*P3.2mm*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS 200 200 -200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX VSS 1 0 -300 100 U 50 50 1 1 W\nX DIN 2 -300 0 100 R 50 50 1 1 I\nX VDD 3 0 300 100 D 50 50 1 1 W\nX DOUT 4 300 0 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# SK6812MINI\n#\nDEF SK6812MINI D 0 10 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"SK6812MINI\" 50 -225 50 H V L TNN\nF2 \"LED_SMD:LED_SK6812MINI_PLCC4_3.5x3.5mm_P1.75mm\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\n$FPLIST\n LED*SK6812MINI*PLCC*3.5x3.5mm*P1.75mm*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS 200 200 -200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX DOUT 1 300 0 100 L 50 50 1 1 O\nX VSS 2 0 -300 100 U 50 50 1 1 W\nX DIN 3 -300 0 100 R 50 50 1 1 I\nX VDD 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SMLVN6RGB\n#\nDEF SMLVN6RGB D 0 0 Y N 1 F N\nF0 \"D\" 0 500 50 H V C CNN\nF1 \"SMLVN6RGB\" 0 400 50 H V C CNN\nF2 \"LED_SMD:LED_ROHM_SMLVN6\" 0 -350 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n LED*ROHM*SMLVN6*\n$ENDFPLIST\nDRAW\nT 0 75 150 50 0 0 0 B Normal 0 C C\nT 0 75 -250 50 0 0 0 G Normal 0 C C\nT 0 75 -50 50 0 0 0 R Normal 0 C C\nS -110 330 110 -300 0 1 10 f\nS -50 -50 -50 50 0 1 0 N\nS -50 50 -50 50 0 1 0 N\nS -50 150 -50 250 0 1 0 N\nS -50 250 -50 250 0 1 0 N\nP 2 0 1 0 -50 -200 -100 -200 N\nP 2 0 1 0 -50 0 -100 0 N\nP 2 0 1 0 -50 0 50 0 N\nP 2 0 1 0 -50 200 -100 200 N\nP 2 0 1 0 50 -200 -50 -200 N\nP 2 0 1 0 50 -200 100 -200 N\nP 2 0 1 10 50 -150 50 -250 N\nP 2 0 1 0 50 0 100 0 N\nP 2 0 1 10 50 50 50 -50 N\nP 2 0 1 0 50 200 -50 200 N\nP 2 0 1 0 50 200 100 200 N\nP 2 0 1 10 50 250 50 150 N\nP 3 0 1 0 50 50 50 -50 50 -50 N\nP 3 0 1 0 50 250 50 150 50 150 N\nP 4 0 1 10 -50 -150 -50 -250 50 -200 -50 -150 N\nP 4 0 1 10 -50 50 -50 -50 50 0 -50 50 N\nP 4 0 1 10 -50 250 -50 150 50 200 -50 250 N\nP 5 0 1 0 0 -150 -60 -90 -30 -90 -60 -90 -60 -120 N\nP 5 0 1 0 0 50 -60 110 -30 110 -60 110 -60 80 N\nP 5 0 1 0 0 250 -60 310 -30 310 -60 310 -60 280 N\nP 5 0 1 0 40 -150 -20 -90 10 -90 -20 -90 -20 -120 N\nP 5 0 1 0 40 50 -20 110 10 110 -20 110 -20 80 N\nP 5 0 1 0 40 250 -20 310 10 310 -20 310 -20 280 N\nX BA 1 -200 200 100 R 50 50 1 1 P\nX RA 2 -200 0 100 R 50 50 1 1 P\nX GA 3 -200 -200 100 R 50 50 1 1 P\nX GK 4 200 -200 100 L 50 50 1 1 P\nX RK 5 200 0 100 L 50 50 1 1 P\nX BK 6 200 200 100 L 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# WS2812B\n#\nDEF WS2812B D 0 10 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"WS2812B\" 50 -225 50 H V L TNN\nF2 \"LED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\n$FPLIST\n LED*WS2812*PLCC*5.0x5.0mm*P3.2mm*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS 200 200 -200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX VDD 1 0 300 100 D 50 50 1 1 W\nX DOUT 2 300 0 100 L 50 50 1 1 O\nX VSS 3 0 -300 100 U 50 50 1 1 W\nX DIN 4 -300 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# WS2812S\n#\nDEF WS2812S D 0 10 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"WS2812S\" 50 -225 50 H V L TNN\nF2 \"LED_SMD:LED_WS2812_PLCC6_5.0x5.0mm_P1.6mm\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\nALIAS WS2812\n$FPLIST\n LED*WS2812*PLCC*5.0x5.0mm*P1.6mm*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS 200 200 -200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX DOUT 1 300 0 100 L 50 50 1 1 O\nX DIN 2 -300 0 100 R 50 50 1 1 I\nX VCC 3 0 300 100 D 50 50 1 1 W\nX NC 4 200 100 100 L 50 50 1 1 N N\nX VDD 5 -100 300 100 D 50 50 1 1 W\nX VSS 6 0 -300 100 U 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# WS2813\n#\nDEF WS2813 D 0 10 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"WS2813\" 50 -225 50 H V L TNN\nF2 \"LED_SMD:LED_WS2812_PLCC6_5.0x5.0mm_P1.6mm\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\n$FPLIST\n LED*WS2812*PLCC*5.0x5.0mm*P1.6mm*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS 200 200 -200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX VCC 1 0 300 100 D 50 50 1 1 W\nX VDD 2 -100 300 100 D 50 50 1 1 W\nX DOUT 3 300 0 100 L 50 50 1 1 O\nX DIN 4 -300 0 100 R 50 50 1 1 I\nX GND 5 0 -300 100 U 50 50 1 1 W\nX BIN 6 -300 -100 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# WS2822S\n#\nDEF WS2822S D 0 10 Y Y 1 F N\nF0 \"D\" 200 225 50 H V R BNN\nF1 \"WS2822S\" 50 -225 50 H V L TNN\nF2 \"LED_SMD:LED_WS2812_PLCC6_5.0x5.0mm_P1.6mm\" 50 -300 50 H I L TNN\nF3 \"\" 100 -375 50 H I L TNN\n$FPLIST\n LED*WS2812*PLCC*5.0x5.0mm*P1.6mm*\n$ENDFPLIST\nDRAW\nT 0 90 -165 30 0 0 0 RGB Normal 0 C C\nS -200 200 200 -200 0 1 10 f\nP 2 0 1 0 50 -140 70 -140 N\nP 2 0 1 0 50 -100 70 -100 N\nP 2 0 1 0 185 -140 105 -140 N\nP 3 0 1 0 90 -100 50 -140 50 -120 N\nP 3 0 1 0 90 -60 50 -100 50 -80 N\nP 3 0 1 0 145 -40 145 -140 145 -160 N\nP 4 0 1 0 185 -60 105 -60 145 -140 185 -60 N\nX DAI 1 -300 -100 100 R 50 50 1 1 I\nX ADRI 2 -300 0 100 R 50 50 1 1 I\nX VCC 3 0 300 100 D 50 50 1 1 W\nX GND 4 0 -300 100 U 50 50 1 1 W\nX ADRO 5 300 0 100 L 50 50 1 1 O\nX VDD 6 -100 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Motor.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP Fan\nD Fan\nK Fan Motor\nF ~\n$ENDCMP\n#\n$CMP Fan_3pin\nD Fan, tacho output, 3-pin connector\nK Fan Motor tacho\nF http://www.hardwarecanucks.com/forum/attachments/new-builds/16287d1330775095-help-chassis-power-fan-connectors-motherboard-asus_p8z68.jpg\n$ENDCMP\n#\n$CMP Fan_4pin\nD Fan, tacho output, PWM input, 4-pin connector\nK Fan Motor tacho PWM\nF http://www.formfactors.org/developer%5Cspecs%5Crev1_2_public.pdf\n$ENDCMP\n#\n$CMP Fan_ALT\nD Fan without PWM or tach, alternative symbol\nK Fan Motor\nF ~\n$ENDCMP\n#\n$CMP Fan_CPU_4pin\nD CPU Fan, tacho output, PWM input, 4-pin connector\nK Fan Motor tacho PWM\nF http://www.formfactors.org/developer%5Cspecs%5Crev1_2_public.pdf\n$ENDCMP\n#\n$CMP Fan_IEC60617\nD Fan (according to IEC-60617)\nK Fan Motor IEC-60617\nF ~\n$ENDCMP\n#\n$CMP Fan_PC_Chassis\nD PC chassis fan, tacho output, 3-pin connector\nK Fan Motor tacho\nF http://www.hardwarecanucks.com/forum/attachments/new-builds/16287d1330775095-help-chassis-power-fan-connectors-motherboard-asus_p8z68.jpg\n$ENDCMP\n#\n$CMP Fan_Tacho\nD Fan, tacho output, 3-pin connector\nK Fan Motor tacho\nF http://www.hardwarecanucks.com/forum/attachments/new-builds/16287d1330775095-help-chassis-power-fan-connectors-motherboard-asus_p8z68.jpg\n$ENDCMP\n#\n$CMP Fan_Tacho_PWM\nD Fan, tacho output, PWM input, 4-pin connector\nK Fan Motor tacho PWM\nF http://www.formfactors.org/developer%5Cspecs%5Crev1_2_public.pdf\n$ENDCMP\n#\n$CMP Motor_AC\nD AC Motor\nK AC Motor\nF ~\n$ENDCMP\n#\n$CMP Motor_DC\nD DC Motor\nK DC Motor\nF ~\n$ENDCMP\n#\n$CMP Motor_DC_ALT\nD DC Motor, alternative symbol\nK DC Motor\nF ~\n$ENDCMP\n#\n$CMP Motor_Servo\nD Servo Motor (Futaba, HiTec, JR connector)\nK Servo Motor\nF http://forums.parallax.com/uploads/attachments/46831/74481.png\n$ENDCMP\n#\n$CMP Motor_Servo_AirTronics\nD Servo Motor (AirTronics connector)\nK Servo Motor\nF http://forums.parallax.com/uploads/attachments/46831/74481.png\n$ENDCMP\n#\n$CMP Motor_Servo_Futaba_J\nD Servo Motor (Futuba J-connector)\nK Servo Motor\nF http://forums.parallax.com/uploads/attachments/46831/74481.png\n$ENDCMP\n#\n$CMP Motor_Servo_Grapner_JR\nD Servo Motor (Graupner JR connector)\nK Servo Motor\nF http://forums.parallax.com/uploads/attachments/46831/74481.png\n$ENDCMP\n#\n$CMP Motor_Servo_Hitec\nD Servo Motor (HiTec connector)\nK Servo Motor\nF http://forums.parallax.com/uploads/attachments/46831/74481.png\n$ENDCMP\n#\n$CMP Motor_Servo_JR\nD Servo Motor (JR connector)\nK Servo Motor\nF http://forums.parallax.com/uploads/attachments/46831/74481.png\n$ENDCMP\n#\n$CMP Motor_Servo_Robbe\nD Servo Motor (Robbe connector)\nK Servo Motor\nF http://forums.parallax.com/uploads/attachments/46831/74481.png\n$ENDCMP\n#\n$CMP Stepper_Motor_bipolar\nD 4-wire bipolar stepper motor\nK bipolar stepper motor\nF http://www.infineon.com/dgdl/Application-Note-TLE8110EE_driving_UniPolarStepperMotor_V1.1.pdf?fileId=db3a30431be39b97011be5d0aa0a00b0\n$ENDCMP\n#\n$CMP Stepper_Motor_unipolar_5pin\nD 5-wire unipolar stepper motor\nK unipolar stepper motor\nF http://www.infineon.com/dgdl/Application-Note-TLE8110EE_driving_UniPolarStepperMotor_V1.1.pdf?fileId=db3a30431be39b97011be5d0aa0a00b0\n$ENDCMP\n#\n$CMP Stepper_Motor_unipolar_6pin\nD 6-wire unipolar stepper motor\nK unipolar stepper motor\nF http://www.infineon.com/dgdl/Application-Note-TLE8110EE_driving_UniPolarStepperMotor_V1.1.pdf?fileId=db3a30431be39b97011be5d0aa0a00b0\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Motor.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# Fan\n#\nDEF Fan M 0 0 Y Y 1 F N\nF0 \"M\" 100 200 50 H V L CNN\nF1 \"Fan\" 100 -100 50 H V L TNN\nF2 \"\" 0 10 50 H I C CNN\nF3 \"\" 0 10 50 H I C CNN\n$FPLIST\n PinHeader*P2.54mm*\n TerminalBlock*\n$ENDFPLIST\nDRAW\nA -98 94 113 297 -910 0 1 0 N 0 150 -100 -20\nA 0 -70 112 1534 266 0 1 0 N -100 -20 100 -20\nA 103 95 115 -915 1519 0 1 0 N 100 -20 0 150\nC 0 40 128 0 1 10 N\nP 2 0 1 0 0 -200 0 -180 N\nP 2 0 1 0 0 -88 0 -104 N\nP 2 0 1 0 0 168 0 182 N\nP 2 0 1 0 0 180 0 200 N\nX + 1 0 300 100 D 50 50 1 1 P\nX - 2 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Fan_ALT\n#\nDEF Fan_ALT M 0 0 N Y 1 F N\nF0 \"M\" 150 200 50 H V L BNN\nF1 \"Fan_ALT\" 150 100 50 H V L BNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\n$FPLIST\n PinHeader*P2.54mm*\n TerminalBlock*\n$ENDFPLIST\nDRAW\nA -160 -90 184 294 -294 0 1 0 N 0 0 0 -180\nA -142 -45 149 176 -568 0 1 0 N 0 0 -60 -170\nA -90 160 184 -606 -1194 0 1 0 N 0 0 -180 0\nA -45 142 149 -724 -1468 0 1 0 N 0 0 -170 60\nA 45 -142 149 1076 332 0 1 0 N 0 0 170 -60\nA 90 -160 184 1194 606 0 1 0 N 0 0 180 0\nA 142 45 149 -1624 1232 0 1 0 N 0 0 60 170\nA 160 90 184 -1506 1506 0 1 0 N 0 0 0 180\nC 0 0 180 0 1 10 N\nP 2 0 1 0 0 -200 0 -180 N\nP 2 0 1 0 0 180 0 200 N\nX + 1 0 300 100 D 50 50 1 1 P\nX - 2 0 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Fan_IEC60617\n#\nDEF Fan_IEC60617 M 0 0 Y Y 1 F N\nF0 \"M\" 150 150 50 H V L CNN\nF1 \"Fan_IEC60617\" 150 100 50 H V L TNN\nF2 \"\" 50 -140 50 H I L CNN\nF3 \"\" 0 10 50 H I C CNN\n$FPLIST\n PinHeader*P2.54mm*\n TerminalBlock*\n$ENDFPLIST\nDRAW\nC 0 40 100 0 1 0 N\nS -130 170 130 -90 0 1 10 f\nP 2 0 1 0 -60 -40 90 0 N\nP 2 0 1 0 -60 120 90 80 N\nP 2 0 1 0 0 -200 0 -180 N\nP 2 0 1 0 0 -88 0 -104 N\nP 2 0 1 0 0 168 0 182 N\nP 2 0 1 0 0 180 0 200 N\nX + 1 0 300 100 D 50 50 1 1 P\nX - 2 0 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Fan_Tacho\n#\nDEF Fan_Tacho M 0 0 Y Y 1 F N\nF0 \"M\" 100 100 50 H V L CNN\nF1 \"Fan_Tacho\" 100 -200 50 H V L TNN\nF2 \"\" 0 -90 50 H I C CNN\nF3 \"\" 0 -90 50 H I C CNN\nALIAS Fan_3pin Fan_PC_Chassis\n$FPLIST\n FanPinHeader*P2.54mm*Vertical*\n PinHeader*P2.54mm*Vertical*\n TerminalBlock*\n$ENDFPLIST\nDRAW\nA -200 -40 20 1800 900 0 0 0 N -220 -40 -200 -20\nA -200 -40 20 -1799 -1 0 0 0 N -220 -40 -180 -40\nA -98 -6 113 297 -910 0 1 0 N 0 50 -100 -120\nA 0 -170 112 1534 266 0 1 0 N -100 -120 100 -120\nA 103 -5 115 -915 1519 0 1 0 N 100 -120 0 50\nC 0 -60 128 0 1 10 N\nP 2 0 0 0 -200 -20 -210 -15 N\nP 2 0 0 0 -200 -20 -205 -30 N\nP 3 0 0 0 -160 0 -160 -60 -130 -60 N\nP 2 0 1 0 -160 0 -200 0 N\nP 2 0 1 0 0 -300 0 -280 N\nP 2 0 1 0 0 -188 0 -204 N\nP 2 0 1 0 0 68 0 82 N\nP 2 0 1 0 0 80 0 100 N\nX Tacho 1 -300 0 100 R 50 50 1 1 P\nX + 2 0 200 100 D 50 50 1 1 P\nX - 3 0 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Fan_Tacho_PWM\n#\nDEF Fan_Tacho_PWM M 0 0 Y Y 1 F N\nF0 \"M\" 100 200 50 H V L CNN\nF1 \"Fan_Tacho_PWM\" 100 -100 50 H V L TNN\nF2 \"\" 0 10 50 H I C CNN\nF3 \"\" 0 10 50 H I C CNN\nALIAS Fan_CPU_4pin Fan_4pin\n$FPLIST\n FanPinHeader*P2.54mm*Vertical*\n PinHeader*P2.54mm*Vertical*\n TerminalBlock*\n$ENDFPLIST\nDRAW\nA -200 60 20 1800 900 0 0 0 N -220 60 -200 80\nA -200 60 20 -1799 -1 0 0 0 N -220 60 -180 60\nA -98 94 113 297 -910 0 1 0 N 0 150 -100 -20\nA 0 -70 112 1534 266 0 1 0 N -100 -20 100 -20\nA 103 95 115 -915 1519 0 1 0 N 100 -20 0 150\nC 0 40 128 0 1 10 N\nP 2 0 0 0 -200 80 -210 85 N\nP 2 0 0 0 -200 80 -205 70 N\nP 3 0 0 0 -160 100 -160 40 -130 40 N\nP 2 0 1 0 -160 100 -200 100 N\nP 2 0 1 0 0 -200 0 -180 N\nP 2 0 1 0 0 -88 0 -104 N\nP 2 0 1 0 0 168 0 182 N\nP 2 0 1 0 0 180 0 200 N\nP 4 0 1 0 -100 -40 -160 -40 -160 -100 -200 -100 N\nP 10 0 1 0 -210 -130 -200 -130 -200 -120 -190 -120 -190 -130 -170 -130 -170 -120 -160 -120 -160 -130 -140 -130 N\nX - 1 0 -200 100 U 50 50 1 1 P\nX + 2 0 300 100 D 50 50 1 1 P\nX Tacho 3 -300 100 100 R 50 50 1 1 P\nX PWM 4 -300 -100 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Motor_AC\n#\nDEF Motor_AC M 0 0 Y Y 1 F N\nF0 \"M\" 100 100 50 H V L CNN\nF1 \"Motor_AC\" 100 -200 50 H V L TNN\nF2 \"\" 0 -90 50 H I C CNN\nF3 \"\" 0 -90 50 H I C CNN\n$FPLIST\n PinHeader*P2.54mm*\n TerminalBlock*\n$ENDFPLIST\nDRAW\nA -29 -108 31 -1763 -225 0 0 0 N -60 -110 0 -120\nA 28 -132 30 1568 36 0 0 0 N 0 -120 60 -130\nC 0 -60 128 0 1 10 N\nP 5 0 0 0 -40 -80 -40 40 0 -40 40 40 40 -80 N\nP 2 0 1 0 0 -300 0 -280 N\nP 2 0 1 0 0 -188 0 -204 N\nP 2 0 1 0 0 68 0 82 N\nP 2 0 1 0 0 80 0 100 N\nX ~ 1 0 200 100 D 50 50 1 1 P\nX ~ 2 0 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Motor_DC\n#\nDEF Motor_DC M 0 0 Y Y 1 F N\nF0 \"M\" 100 100 50 H V L CNN\nF1 \"Motor_DC\" 100 -200 50 H V L TNN\nF2 \"\" 0 -90 50 H I C CNN\nF3 \"\" 0 -90 50 H I C CNN\n$FPLIST\n PinHeader*P2.54mm*\n TerminalBlock*\n$ENDFPLIST\nDRAW\nC 0 -60 128 0 1 10 N\nP 5 0 0 0 -50 -130 -50 20 0 -80 50 20 50 -130 N\nP 2 0 1 0 0 -300 0 -280 N\nP 2 0 1 0 0 -188 0 -204 N\nP 2 0 1 0 0 68 0 82 N\nP 2 0 1 0 0 80 0 100 N\nX + 1 0 200 100 D 50 50 1 1 P\nX - 2 0 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Motor_DC_ALT\n#\nDEF Motor_DC_ALT M 0 0 Y Y 1 F N\nF0 \"M\" 100 100 50 H V L CNN\nF1 \"Motor_DC_ALT\" 100 -200 50 H V L TNN\nF2 \"\" 0 -90 50 H I C CNN\nF3 \"\" 0 -90 50 H I C CNN\n$FPLIST\n PinHeader*P2.54mm*\n TerminalBlock*\n$ENDFPLIST\nDRAW\nC 0 -60 117 0 0 10 N\nP 4 0 0 0 -50 -170 -50 -200 50 -200 50 -170 N\nP 4 0 0 0 -50 50 -50 80 50 80 50 50 N\nP 5 0 0 0 -50 -130 -50 20 0 -80 50 20 50 -130 N\nP 2 0 1 0 0 80 0 100 N\nX + 1 0 200 100 D 50 50 1 1 P\nX - 2 0 -300 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Motor_Servo\n#\nDEF Motor_Servo M 0 1 Y Y 1 F N\nF0 \"M\" -200 175 50 H V L CNN\nF1 \"Motor_Servo\" -200 -160 50 H V L TNN\nF2 \"\" 0 -190 50 H I C CNN\nF3 \"\" 0 -190 50 H I C CNN\nALIAS Motor_Servo_JR Motor_Servo_Hitec Motor_Servo_Futaba_J Motor_Servo_Robbe Motor_Servo_Grapner_JR\n$FPLIST\n PinHeader*P2.54mm*\n$ENDFPLIST\nDRAW\nA 125 0 76 1132 -1132 0 1 0 N 95 70 95 -70\nA 267 142 37 1173 -273 0 1 0 N 250 175 300 125\nC 125 0 7 0 1 0 N\nC 125 0 56 0 1 0 N\nC 235 110 5 0 1 0 N\nC 255 130 5 0 1 0 N\nC 275 150 5 0 1 0 N\nP 2 0 1 0 95 -70 80 -70 N\nP 2 0 1 0 95 -70 90 -55 N\nP 2 0 1 0 95 70 75 70 N\nP 2 0 1 0 95 70 90 55 N\nP 2 0 1 0 250 175 100 50 N\nP 2 0 1 0 300 125 165 -40 N\nP 5 0 1 10 200 140 -200 140 -200 -140 250 -140 250 60 N\nX PWM 1 -300 100 100 R 50 50 1 1 P\nX + 2 -300 0 100 R 50 50 1 1 P\nX - 3 -300 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Motor_Servo_AirTronics\n#\nDEF Motor_Servo_AirTronics M 0 1 Y Y 1 F N\nF0 \"M\" -200 175 50 H V L CNN\nF1 \"Motor_Servo_AirTronics\" -200 -160 50 H V L TNN\nF2 \"\" 0 -190 50 H I C CNN\nF3 \"\" 0 -190 50 H I C CNN\n$FPLIST\n PinHeader*P2.54mm*\n$ENDFPLIST\nDRAW\nA 125 0 76 1132 -1132 0 1 0 N 95 70 95 -70\nA 267 142 37 1173 -273 0 1 0 N 250 175 300 125\nC 125 0 7 0 1 0 N\nC 125 0 56 0 1 0 N\nC 235 110 5 0 1 0 N\nC 255 130 5 0 1 0 N\nC 275 150 5 0 1 0 N\nP 2 0 1 0 95 -70 80 -70 N\nP 2 0 1 0 95 -70 90 -55 N\nP 2 0 1 0 95 70 75 70 N\nP 2 0 1 0 95 70 90 55 N\nP 2 0 1 0 250 175 100 50 N\nP 2 0 1 0 300 125 165 -40 N\nP 5 0 1 10 250 60 250 -140 -200 -140 -200 140 200 140 N\nX + 1 -300 0 100 R 50 50 1 1 P\nX - 2 -300 -100 100 R 50 50 1 1 P\nX PWM 3 -300 100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Stepper_Motor_bipolar\n#\nDEF Stepper_Motor_bipolar M 0 0 Y N 1 F N\nF0 \"M\" 150 100 50 H V L CNN\nF1 \"Stepper_Motor_bipolar\" 150 50 50 H V L TNN\nF2 \"\" 10 -10 50 H I C CNN\nF3 \"\" 10 -10 50 H I C CNN\n$FPLIST\n PinHeader*P2.54mm*Vertical*\n TerminalBlock*\n Motor*\n$ENDFPLIST\nDRAW\nA -175 -75 25 -899 899 0 1 0 N -175 -100 -175 -50\nA -175 -25 25 -899 899 0 1 0 N -175 -50 -175 0\nA -175 25 25 -899 899 0 1 0 N -175 0 -175 50\nA -175 75 25 -899 899 0 1 0 N -175 50 -175 100\nA -75 175 25 -1799 -1 0 1 0 N -100 175 -50 175\nA -25 175 25 -1799 -1 0 1 0 N -50 175 0 175\nA 25 175 25 -1799 -1 0 1 0 N 0 175 50 175\nA 75 175 25 -1799 -1 0 1 0 N 50 175 100 175\nC 0 0 128 0 1 10 N\nP 5 0 0 0 -50 -70 -50 80 0 -20 50 80 50 -70 N\nP 2 0 1 0 -200 -100 -175 -100 N\nP 2 0 1 0 -200 100 -175 100 N\nP 2 0 1 0 -100 200 -100 175 N\nP 2 0 1 0 100 200 100 175 N\nX ~ 1 -100 300 100 D 50 50 1 1 P\nX - 2 100 300 100 D 50 50 1 1 P\nX ~ 3 -300 100 100 R 50 50 1 1 P\nX ~ 4 -300 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Stepper_Motor_unipolar_5pin\n#\nDEF Stepper_Motor_unipolar_5pin M 0 0 Y N 1 F N\nF0 \"M\" 150 100 50 H V L CNN\nF1 \"Stepper_Motor_unipolar_5pin\" 150 50 50 H V L TNN\nF2 \"\" 10 -10 50 H I C CNN\nF3 \"\" 10 -10 50 H I C CNN\n$FPLIST\n PinHeader*P2.54mm*\n TerminalBlock*\n$ENDFPLIST\nDRAW\nA -175 -75 25 -899 899 0 1 0 N -175 -100 -175 -50\nA -175 -25 25 -899 899 0 1 0 N -175 -50 -175 0\nA -175 25 25 -899 899 0 1 0 N -175 0 -175 50\nA -175 75 25 -899 899 0 1 0 N -175 50 -175 100\nA -75 175 25 -1799 -1 0 1 0 N -100 175 -50 175\nA -25 175 25 -1799 -1 0 1 0 N -50 175 0 175\nA 25 175 25 -1799 -1 0 1 0 N 0 175 50 175\nA 75 175 25 -1799 -1 0 1 0 N 50 175 100 175\nC -200 200 0 0 1 0 F\nC -200 200 10 0 1 0 F\nC 0 0 128 0 1 10 N\nP 5 0 0 0 -50 -70 -50 80 0 -20 50 80 50 -70 N\nP 2 0 1 0 -200 -100 -175 -100 N\nP 2 0 1 0 -200 100 -175 100 N\nP 2 0 1 0 -100 175 -100 200 N\nP 2 0 1 0 100 175 100 200 N\nP 3 0 1 0 -200 200 -200 0 -175 0 N\nP 3 0 1 0 0 175 0 200 -200 200 N\nX ~ 1 -200 300 100 D 50 50 1 1 P\nX ~ 2 -100 300 100 D 50 50 1 1 P\nX - 3 100 300 100 D 50 50 1 1 P\nX ~ 4 -300 100 100 R 50 50 1 1 P\nX ~ 5 -300 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Stepper_Motor_unipolar_6pin\n#\nDEF Stepper_Motor_unipolar_6pin M 0 0 Y N 1 F N\nF0 \"M\" 150 100 50 H V L CNN\nF1 \"Stepper_Motor_unipolar_6pin\" 150 50 50 H V L TNN\nF2 \"\" 10 -10 50 H I C CNN\nF3 \"\" 10 -10 50 H I C CNN\n$FPLIST\n PinHeader*P2.54mm*\n TerminalBlock*\n$ENDFPLIST\nDRAW\nA -175 -75 25 -899 899 0 1 0 N -175 -100 -175 -50\nA -175 -25 25 -899 899 0 1 0 N -175 -50 -175 0\nA -175 25 25 -899 899 0 1 0 N -175 0 -175 50\nA -175 75 25 -899 899 0 1 0 N -175 50 -175 100\nA -75 175 25 -1799 -1 0 1 0 N -100 175 -50 175\nA -25 175 25 -1799 -1 0 1 0 N -50 175 0 175\nA 25 175 25 -1799 -1 0 1 0 N 0 175 50 175\nA 75 175 25 -1799 -1 0 1 0 N 50 175 100 175\nC 0 0 128 0 1 10 N\nP 5 0 0 0 -50 -70 -50 80 0 -20 50 80 50 -70 N\nP 2 0 1 0 -200 -100 -175 -100 N\nP 2 0 1 0 -200 100 -175 100 N\nP 2 0 1 0 -175 0 -200 0 N\nP 2 0 1 0 -100 175 -100 200 N\nP 2 0 1 0 0 175 0 200 N\nP 2 0 1 0 100 175 100 200 N\nX ~ 1 -100 300 100 D 50 50 1 1 P\nX ~ 2 0 300 100 D 50 50 1 1 P\nX - 3 100 300 100 D 50 50 1 1 P\nX ~ 4 -300 100 100 R 50 50 1 1 P\nX ~ 5 -300 0 100 R 50 50 1 1 P\nX ~ 6 -300 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Oscillator.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP 5P49V6965\nD Programmable Clock Generator, I2C interface, 1kHz-350MHz, QFN-24\nK Low-noise PLL Reference Clock\nF https://www.idt.com/document/dst/5p49v6965-datasheet\n$ENDCMP\n#\n$CMP ABLNO\nD LVCMOS Ultra Low Phase Noise XO / VCXO, Abracon ABLNO\nK XO VCXO\nF https://abracon.com/Precisiontiming/ABLNO.pdf\n$ENDCMP\n#\n$CMP ACO-xxxMHz\nD HCMOS Crystal Clock Oscillator, DIP14-style metal package\nK Crystal Clock Oscillator\nF http://www.conwin.com/datasheets/cx/cx030.pdf\n$ENDCMP\n#\n$CMP ACO-xxxMHz-A\nD HCMOS Crystal Clock Oscillator, DIP14-style metal package\nK Crystal Clock Oscillator\nF http://www.conwin.com/datasheets/cx/cx030.pdf\n$ENDCMP\n#\n$CMP ASCO\nD Crystal Clock Oscillator, Abracon ASCO\nK Crystal Clock Oscillator\nF https://abracon.com/Oscillators/ASCO.pdf\n$ENDCMP\n#\n$CMP ASDMB-xxxMHz\nD 1.8-3.3V SMD Ultra Miniature Crystal Clock Oscillator, Abracon\nK 1.8-3.3V SMD Ultra Miniature Crystal Clock Oscillator\nF https://abracon.com/Oscillators/ASDMB.pdf\n$ENDCMP\n#\n$CMP ASE-xxxMHz\nD 3.3V CMOS SMD Crystal Clock Oscillator, Abracon\nK 3.3V CMOS SMD Crystal Clock Oscillator\nF http://www.abracon.com/Oscillators/ASV.pdf\n$ENDCMP\n#\n$CMP ASV-xxxMHz\nD 3.3V HCMOS SMD Crystal Clock Oscillator, Abracon\nK 3.3V HCMOS SMD Crystal Clock Oscillator\nF http://www.abracon.com/Oscillators/ASV.pdf\n$ENDCMP\n#\n$CMP CXO_DIP14\nD Crystal Clock Oscillator, DIP14-style metal package\nK Crystal Clock Oscillator\nF http://cdn-reichelt.de/documents/datenblatt/B400/OSZI.pdf\n$ENDCMP\n#\n$CMP CXO_DIP8\nD Crystal Clock Oscillator, DIP8-style metal package\nK Crystal Clock Oscillator\nF http://cdn-reichelt.de/documents/datenblatt/B400/OSZI.pdf\n$ENDCMP\n#\n$CMP DFA-S11\nD Temperature compensated Crystal Clock Oscillator\nK Temperature compensated Crystal Clock Oscillator\nF http://www.metatech.com.hk/product/fordahl/pdf/2002%20TCXO%20Page%2043-58.pdf\n$ENDCMP\n#\n$CMP DFA-S15\nD Temperature compensated Crystal Clock Oscillator\nK Temperature compensated Crystal Clock Oscillator\nF http://www.metatech.com.hk/product/fordahl/pdf/2002%20TCXO%20Page%2043-58.pdf\n$ENDCMP\n#\n$CMP DFA-S2\nD Temperature compensated Crystal Clock Oscillator\nK Temperature compensated Crystal Clock Oscillator\nF http://www.metatech.com.hk/product/fordahl/pdf/2002%20TCXO%20Page%2043-58.pdf\n$ENDCMP\n#\n$CMP DFA-S3\nD Temperature compensated Crystal Clock Oscillator\nK Temperature compensated Crystal Clock Oscillator\nF http://www.metatech.com.hk/product/fordahl/pdf/2002%20TCXO%20Page%2043-58.pdf\n$ENDCMP\n#\n$CMP DGOF5S3\nD HCMOS Crystal Clock Oscillator, DIP14-style metal package\nK Crystal Clock Oscillator\nF http://www.conwin.com/datasheets/cx/cx030.pdf\n$ENDCMP\n#\n$CMP ECS-2520MV-xxx-xx\nD HCMOS Crystal Clock Oscillator, 2.5x2.0 mm SMD\nK Crystal Clock Oscillator ECS SMD\nF https://www.ecsxtal.com/store/pdf/ECS-2520MV.pdf\n$ENDCMP\n#\n$CMP GTXO-14T\nD Crystal Clock Oscillator, DIP14-style metal package\nK Crystal Clock Oscillator\nF http://www.golledge.com/pdf/products/tcxos/gtxo14.pdf\n$ENDCMP\n#\n$CMP GTXO-14V\nD Voltage-Controlled Crystal Clock Oscillator, DIP14-style metal package\nK Crystal Clock Oscillator\nF http://www.golledge.com/pdf/products/tcxos/gtxo14.pdf\n$ENDCMP\n#\n$CMP GTXO-S14T\nD 3.3 & 5V Stratum 3 Sinewave TCXO, DIP14-style metal package\nK Crystal Clock Oscillator\nF http://www.golledge.com/pdf/products/tcxos/gtxos14.pdf\n$ENDCMP\n#\n$CMP GTXO-S14V\nD 3.3 & 5V Stratum 3 Sinewave TCXO, DIP14-style metal package\nK Crystal Clock Oscillator\nF http://www.golledge.com/pdf/products/tcxos/gtxos14.pdf\n$ENDCMP\n#\n$CMP IQXO-70\nD Crystal Clock Oscillator, SMD package 7.5x5.0mm²\nK Crystal Clock Oscillator\nF http://www.iqdfrequencyproducts.com/products/details/iqxo-70-11-30.pdf\n$ENDCMP\n#\n$CMP JTOS-25\nD Voltage Controlled Oscillator, 12.5 to 25 MHz, Mini-Circuits BK377\nK VCXO\nF https://www.minicircuits.com/pdfs/JTOS-25+.pdf\n$ENDCMP\n#\n$CMP JTOS-50\nD Voltage Controlled Oscillator, 25 to 47 MHz, Mini-Circuits BK377\nK VCXO\nF https://www.minicircuits.com/pdfs/JTOS-50+.pdf\n$ENDCMP\n#\n$CMP KT2520K-T\nD 10-60MHz Temperature Compensated Crystal Oscillator, Kyocera 2520\nK tcxo\nF https://global.kyocera.com/prdct/electro/product/pdf/kt2520_e.pdf\n$ENDCMP\n#\n$CMP LTC6905xS5-100\nD 2.7-5.5V 100MHz Precision Fixed Frequency Silicon Oscillator, TSOT-23-5\nK oscillator fixed frequency divider silicon\nF https://www.analog.com/media/en/technical-documentation/data-sheets/6905xfa.pdf\n$ENDCMP\n#\n$CMP LTC6905xS5-133\nD 2.7-5.5V 133MHz Precision Fixed Frequency Silicon Oscillator, TSOT-23-5\nK oscillator fixed frequency divider silicon\nF https://www.analog.com/media/en/technical-documentation/data-sheets/6905xfa.pdf\n$ENDCMP\n#\n$CMP LTC6905xS5-80\nD 2.7-5.5V 80MHz Precision Fixed Frequency Silicon Oscillator, TSOT-23-5\nK oscillator fixed frequency divider silicon\nF https://www.analog.com/media/en/technical-documentation/data-sheets/6905xfa.pdf\n$ENDCMP\n#\n$CMP LTC6905xS5-96\nD 2.7-5.5V 96MHz Precision Fixed Frequency Silicon Oscillator, TSOT-23-5\nK oscillator fixed frequency divider silicon\nF https://www.analog.com/media/en/technical-documentation/data-sheets/6905xfa.pdf\n$ENDCMP\n#\n$CMP MAX7375AXR105\nD Silicon Clock Oscillator 1MHz, SC-70-3\nK Silicon Clock Oscillator 1MHz 1000kHz\nF https://datasheets.maximintegrated.com/en/ds/MAX7375.pdf\n$ENDCMP\n#\n$CMP MAX7375AXR185\nD Silicon Clock Oscillator 1.84MHz, SC-70-3\nK Silicon Clock Oscillator 1,84MHz 1840kHz\nF https://datasheets.maximintegrated.com/en/ds/MAX7375.pdf\n$ENDCMP\n#\n$CMP MAX7375AXR365\nD Silicon Clock Oscillator 3.58MHz, SC-70-3\nK Silicon Clock Oscillator 3.58MHz 3580kHz\nF https://datasheets.maximintegrated.com/en/ds/MAX7375.pdf\n$ENDCMP\n#\n$CMP MAX7375AXR375\nD Silicon Clock Oscillator 3.69MHz, SC-70-3\nK Silicon Clock Oscillator 3.69MHz 3690kHz\nF https://datasheets.maximintegrated.com/en/ds/MAX7375.pdf\n$ENDCMP\n#\n$CMP MAX7375AXR405\nD Silicon Clock Oscillator 4MHz, SC-70-3\nK Silicon Clock Oscillator 4MHz 4000kHz\nF https://datasheets.maximintegrated.com/en/ds/MAX7375.pdf\n$ENDCMP\n#\n$CMP MAX7375AXR425\nD Silicon Clock Oscillator 4.19MHz, SC-70-3\nK Silicon Clock Oscillator 4.19MHz 4190kHz\nF https://datasheets.maximintegrated.com/en/ds/MAX7375.pdf\n$ENDCMP\n#\n$CMP MAX7375AXR805\nD Silicon Clock Oscillator 8MHz, SC-70-3\nK Silicon Clock Oscillator 8MHz 8000kHz\nF https://datasheets.maximintegrated.com/en/ds/MAX7375.pdf\n$ENDCMP\n#\n$CMP MV267\nD 5/10 MHz Low Phase-Noise Precision OCXO, Morion MV267\nK OCXO\nF http://www.morion.com.ru/catalog_pdf/MV267.pdf\n$ENDCMP\n#\n$CMP MV317\nD 60, 80, 100, 120 & 122.76 MHz OCXO, Morion MV317\nK OCXO\nF https://www.morion-us.com/catalog_pdf/mv317.pdf\n$ENDCMP\n#\n$CMP NB3N502\nD 3.3V / 5.0V 14 MHz to 190 MHz PLL Clock Multiplier, SOIC-8\nK oscillator clock multiplier PLL\nF http://www.onsemi.com/pub/Collateral/NB3N502-D.PDF\n$ENDCMP\n#\n$CMP NB3N511\nD 3.3V / 5.0V 14 MHz to 200 MHz PLL Clock Multiplier, SOIC-8\nK oscillator clock multiplier PLL\nF http://www.onsemi.com/pub/Collateral/NB3N511-D.PDF\n$ENDCMP\n#\n$CMP OCXO-14\nD Voltage-Controlled Crystal Clock Oscillator, DIP14-style metal package\nK Crystal Clock Oscillator\nF http://www.petermann-technik.de/fileadmin/petermann/pdf/crystal-oscillators/OCXO-14_PETERMANN-TECHNIK.pdf\n$ENDCMP\n#\n$CMP OH300\nD 100MHz Sinewave output OCXO, low phase-noise, high stability, Connor-Winfield OH300\nK OCXO\nF http://www.conwin.com/datasheets/cx/cx282.pdf\n$ENDCMP\n#\n$CMP SG-210SCD\nD Crystal Oscillator Low Profile / High Stability SPXO\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-210SED\n$ENDCMP\n#\n$CMP SG-210SDD\nD Crystal Oscillator Low Profile / High Stability SPXO\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-210SED\n$ENDCMP\n#\n$CMP SG-210SED\nD Crystal Oscillator Low Profile / High Stability SPXO\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-210SED\n$ENDCMP\n#\n$CMP SG-210STF\nD CMOS Crystal Oscillator SPXO\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-210STF\n$ENDCMP\n#\n$CMP SG-211\nD CMOS Crystal Oscillator SPXO\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-211SEE\n$ENDCMP\n#\n$CMP SG-3030CM\nD 32.768kHz Crystal Oscillator (SPXO)\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-3030CM\n$ENDCMP\n#\n$CMP SG-5032CAN\nD CMOS Clock Oscillator 1 to 75 MHz\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?dl=brief_SG5032CAN&lang=en\n$ENDCMP\n#\n$CMP SG-5032CBN\nD CMOS Clock Oscillator 80 to 170 MHz\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?dl=brief_SG5032CBN&lang=en\n$ENDCMP\n#\n$CMP SG-5032CCN\nD CMOS Clock Oscillator 2.5 to 50 MHz\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?dl=brief_SG5032CCN&lang=en\n$ENDCMP\n#\n$CMP SG-51\nD CMOS Crystal Clock Oscillator, DIP14-style plastic package\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-51P\n$ENDCMP\n#\n$CMP SG-531\nD CMOS Crystal Clock Oscillator, DIP8-style plastic package\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-51P\n$ENDCMP\n#\n$CMP SG-615\nD CMOS Clock Oscillator\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-51P\n$ENDCMP\n#\n$CMP SG-7050CAN\nD CMOS Clock Oscillator 1 to 75 MHz\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?dl=brief_SG7050CAN&lang=en\n$ENDCMP\n#\n$CMP SG-7050CBN\nD CMOS Clock Oscillator 80 to 170 MHz\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?dl=brief_SG7050CBN&lang=en\n$ENDCMP\n#\n$CMP SG-7050CCN\nD CMOS Clock Oscillator 2.5 to 50 MHz\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?dl=brief_SG7050CAN&lang=en\n$ENDCMP\n#\n$CMP SG-8002CA\nD CMOS Clock Oscillator 1 to 125 MHz\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-8002DC\n$ENDCMP\n#\n$CMP SG-8002CE\nD CMOS Clock Oscillator\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-8002DC\n$ENDCMP\n#\n$CMP SG-8002DB\nD Crystal Clock Oscillator, DIP14-style plastic package\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?dl=brief_SG-8002DB&lang=en\n$ENDCMP\n#\n$CMP SG-8002DC\nD Crystal Clock Oscillator, DIP8-style plastic package\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-8002DC\n$ENDCMP\n#\n$CMP SG-8002JA\nD CMOS Clock Oscillator\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-8002DC\n$ENDCMP\n#\n$CMP SG-8002JC\nD CMOS Clock Oscillator\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?mode=dl&lang=en&Parts=SG-8002DC\n$ENDCMP\n#\n$CMP SG-8002LB\nD CMOS Clock Oscillator 1 to 125 MHz\nK Crystal Clock Oscillator\nF https://support.epson.biz/td/api/doc_check.php?dl=brief_SG-8002LB&lang=en\n$ENDCMP\n#\n$CMP Si512A_2.5x3.2mm\nD Dual frequency crystal oscillator (XO) 100 kHz to 250 MHz, Single-ended CMOS output\nK Dual frequency crystal oscillator\nF https://www.silabs.com/documents/public/data-sheets/si512-13.pdf\n$ENDCMP\n#\n$CMP Si513A_2.5x3.2mm\nD Dual frequency crystal oscillator (XO) 100 kHz to 250 MHz, Single-ended CMOS output\nK Dual frequency crystal oscillator\nF https://www.silabs.com/documents/public/data-sheets/si512-13.pdf\n$ENDCMP\n#\n$CMP Si5351A-B-GM\nD I2C Programmable Any-Frequency CMOS Clock Generator, QFN-20\nK CMOS Synth Oscillator I2C\nF https://www.silabs.com/documents/public/data-sheets/Si5351-B.pdf\n$ENDCMP\n#\n$CMP Si5351A-B-GT\nD I2C Programmable Any-Frequency CMOS Clock Generator, MSOP-8\nK CMOS Synth Oscillator I2C\nF https://www.silabs.com/documents/public/data-sheets/Si5351-B.pdf\n$ENDCMP\n#\n$CMP Si5351B-B-GM\nD I2C Programmable Any-Frequency CMOS Clock Generator + VCXO, QFN-20\nK CMOS Synth Oscillator I2C VCXO\nF https://www.silabs.com/documents/public/data-sheets/Si5351-B.pdf\n$ENDCMP\n#\n$CMP Si5351C-B-GM\nD I2C Programmable Any-Frequency CMOS Clock Generator, QFN-20\nK CMOS Synth Oscillator I2C\nF https://www.silabs.com/documents/public/data-sheets/Si5351-B.pdf\n$ENDCMP\n#\n$CMP Si570\nD 10 MHZ TO 1.4 GHZ I2C PROGRAMMABLE XO/VCXO\nK 10 MHZ TO 1.4 GHZ I2C PROGRAMMABLE XO/VCXO\nF http://www.silabs.com/Support%20Documents/TechnicalDocs/si570.pdf\n$ENDCMP\n#\n$CMP Si571\nD 10 MHZ TO 1.4 GHZ I2C PROGRAMMABLE XO/VCXO\nK 10 MHZ TO 1.4 GHZ I2C PROGRAMMABLE XO/VCXO\nF http://www.silabs.com/Support%20Documents/TechnicalDocs/si570.pdf\n$ENDCMP\n#\n$CMP TCXO-14\nD Temperature Compensated Crystal Clock Oscillator, DIP14-style metal package\nK Crystal Clock Oscillator\nF http://www.golledge.com/pdf/products/tcxos/gtxos14.pdf\n$ENDCMP\n#\n$CMP TCXO3\nD Temperature compensated crystal oscillator\nK Temperature compensated crystal oscillator\nF http://www.hcelectronics.cz/PDF/TCXO3_A.pdf\n$ENDCMP\n#\n$CMP TFT660\nD Crystal Clock Oscillator, DIP8-style metal package\nK Crystal Clock Oscillator\nF http://cdn-reichelt.de/documents/datenblatt/B400/OSZI.pdf\n$ENDCMP\n#\n$CMP TFT680\nD Crystal Clock Oscillator, DIP14-style metal package\nK Crystal Clock Oscillator\nF http://cdn-reichelt.de/documents/datenblatt/B400/OSZI.pdf\n$ENDCMP\n#\n$CMP TXC-7C\nD CMOS SMD Crystal Clock Oscillator, TXC\nK CMOS SMD Crystal Clock Oscillator\nF http://www.txccorp.com/download/products/osc/7C_o.pdf\n$ENDCMP\n#\n$CMP VC-81\nD Voltage-Controlled Crystal Clock Oscillator, DIP8-style metal package\nK Crystal Clock Oscillator\nF http://www.scsiglobal.com/Hosonic/Documents/SCSI-VC-81&83.pdf\n$ENDCMP\n#\n$CMP VC-83\nD Voltage-Controlled Crystal Clock Oscillator, DIP8-style metal package\nK Crystal Clock Oscillator\nF http://www.scsiglobal.com/Hosonic/Documents/SCSI-VC-81&83.pdf\n$ENDCMP\n#\n$CMP VTCXO-14\nD Voltage-Controlled Crystal Clock Oscillator, DIP14-style metal package\nK Crystal Clock Oscillator\nF http://www.golledge.com/pdf/products/tcxos/gtxos14.pdf\n$ENDCMP\n#\n$CMP XO32\nD HCMOS Clock Oscillator\nK Crystal Clock Oscillator\nF http://cdn-reichelt.de/documents/datenblatt/B400/XO32.pdf\n$ENDCMP\n#\n$CMP XO53\nD Low Power Consumption Clock Oscillator\nK Crystal Clock Oscillator\nF http://cdn-reichelt.de/documents/datenblatt/B400/XO53.pdf\n$ENDCMP\n#\n$CMP XO91\nD HCMOS Clock Oscillator\nK Crystal Clock Oscillator\nF http://cdn-reichelt.de/documents/datenblatt/B400/XO91.pdf\n$ENDCMP\n#\n$CMP XUX51\nD Low phase noise, quartz-based PLL oscillator, 0.016-1500 MHz, complementary output\nK OTP XHCMOS 1.8V VCXO\nF https://www.idt.com/document/dst/xu-family-datasheet\n$ENDCMP\n#\n$CMP XUX52\nD Low phase noise, quartz-based PLL oscillator, 0.016-1500 MHz, complementary output\nK OTP XHCMOS 2.5V VCXO\nF https://www.idt.com/document/dst/xu-family-datasheet\n$ENDCMP\n#\n$CMP XUX53\nD Low phase noise, quartz-based PLL oscillator, 0.016-1500 MHz, complementary output\nK OTP XHCMOS 3.3V VCXO\nF https://www.idt.com/document/dst/xu-family-datasheet\n$ENDCMP\n#\n$CMP XUX71\nD Low phase noise, quartz-based PLL oscillator, 0.016-1500 MHz, complementary output\nK OTP XHCMOS 1.8V VCXO\nF https://www.idt.com/document/dst/xu-family-datasheet\n$ENDCMP\n#\n$CMP XUX72\nD Low phase noise, quartz-based PLL oscillator, 0.016-1500 MHz, complementary output\nK OTP XHCMOS 2.5V VCXO\nF https://www.idt.com/document/dst/xu-family-datasheet\n$ENDCMP\n#\n$CMP XUX73\nD Low phase noise, quartz-based PLL oscillator, 0.016-1500 MHz, complementary output\nK OTP XHCMOS 3.3V VCXO\nF https://www.idt.com/document/dst/xu-family-datasheet\n$ENDCMP\n#\n$CMP XUY51\nD Low phase noise, quartz-based PLL oscillator, 0.016-1500 MHz, complementary output\nK OTP HCMOS 1.8V VCXO\nF https://www.idt.com/document/dst/xu-family-datasheet\n$ENDCMP\n#\n$CMP XUY52\nD Low phase noise, quartz-based PLL oscillator, 0.016-1500 MHz, complementary output\nK OTP XHCMOS 2.5V VCXO\nF https://www.idt.com/document/dst/xu-family-datasheet\n$ENDCMP\n#\n$CMP XUY53\nD Low phase noise, quartz-based PLL oscillator, 0.016-1500 MHz, complementary output\nK OTP XHCMOS 3.3V VCXO\nF https://www.idt.com/document/dst/xu-family-datasheet\n$ENDCMP\n#\n$CMP XUY71\nD Low phase noise, quartz-based PLL oscillator, 0.016-1500 MHz, complementary output\nK OTP HCMOS 1.8V VCXO\nF https://www.idt.com/document/dst/xu-family-datasheet\n$ENDCMP\n#\n$CMP XUY72\nD Low phase noise, quartz-based PLL oscillator, 0.016-1500 MHz, complementary output\nK OTP XHCMOS 2.5V VCXO\nF https://www.idt.com/document/dst/xu-family-datasheet\n$ENDCMP\n#\n$CMP XUY73\nD Low phase noise, quartz-based PLL oscillator, 0.016-1500 MHz, complementary output\nK OTP XHCMOS 3.3V VCXO\nF https://www.idt.com/document/dst/xu-family-datasheet\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Oscillator.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# 5P49V6965\n#\nDEF 5P49V6965 U 0 20 Y Y 1 F N\nF0 \"U\" -450 1150 50 H V C CNN\nF1 \"5P49V6965\" 550 1150 50 H V C CNN\nF2 \"Package_DFN_QFN:QFN-24-1EP_4x4mm_P0.5mm_EP2.8x2.8mm\" -50 -1100 50 H I C CNN\nF3 \"\" -450 1150 50 H I C CNN\n$FPLIST\n QFN*1EP*4x4mm*P0.5mm*\n$ENDFPLIST\nDRAW\nS -400 1100 400 -1000 0 1 10 f\nX CLKIN 1 -500 300 100 R 50 50 1 1 I\nX VDDO4 10 300 1200 100 D 50 50 1 1 W\nX OUT4 11 500 -400 100 L 50 50 1 1 O\nX OUT4B 12 500 -500 100 L 50 50 1 1 O\nX OUT3B 13 500 -200 100 L 50 50 1 1 O\nX OUT3 14 500 -100 100 L 50 50 1 1 O\nX VDDO3 15 200 1200 100 D 50 50 1 1 W\nX OUT2B 16 500 100 100 L 50 50 1 1 O\nX OUT2 17 500 200 100 L 50 50 1 1 O\nX VDDO2 18 100 1200 100 D 50 50 1 1 W\nX OUT1B 19 500 400 100 L 50 50 1 1 O\nX CLKINB 2 -500 200 100 R 50 50 1 1 I\nX OUT1 20 500 500 100 L 50 50 1 1 O\nX VDDO1 21 0 1200 100 D 50 50 1 1 W\nX VDDD 22 -200 1200 100 D 50 50 1 1 W\nX VDDO0 23 -100 1200 100 D 50 50 1 1 W\nX OUT0_SEL_I2CB 24 500 -700 100 L 50 50 1 1 B\nX GND 25 0 -1100 100 U 50 50 1 1 W\nX XOUT 3 -500 700 100 R 50 50 1 1 O\nX XIN/REF 4 -500 500 100 R 50 50 1 1 I\nX VDDA 5 -300 1200 100 D 50 50 1 1 W\nX CLKSEL 6 -500 0 100 R 50 50 1 1 I\nX SD/OE 7 -500 -500 100 R 50 50 1 1 I\nX SEL1/SDA 8 -500 -200 100 R 50 50 1 1 B\nX SEL0/SCL 9 -500 -300 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# ABLNO\n#\nDEF ABLNO X 0 20 Y Y 1 F N\nF0 \"X\" -350 250 50 H V L CNN\nF1 \"ABLNO\" 150 250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_Abracon_ABLNO\" 0 -350 50 H I C CNN\nF3 \"\" -200 100 50 H I C CNN\n$FPLIST\n Oscillator*Abracon*ABLNO*\n$ENDFPLIST\nDRAW\nS -300 200 300 -200 0 1 10 f\nP 9 0 1 0 -225 75 -200 75 -200 125 -175 125 -175 75 -150 75 -150 125 -125 125 -125 75 N\nX Vctrl 1 -400 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX RFout 3 400 0 100 L 50 50 1 1 O\nX VDD 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# ACO-xxxMHz-A\n#\nDEF ACO-xxxMHz-A X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"ACO-xxxMHz-A\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_DIP-14\" 450 -350 50 H I C CNN\nF3 \"\" -275 125 50 H I C CNN\n$FPLIST\n Oscillator*DIP*14*\n$ENDFPLIST\nDRAW\nS -400 200 200 -200 0 1 10 f\nP 9 0 1 0 -275 100 -250 100 -250 150 -225 150 -225 100 -200 100 -200 150 -175 150 -175 100 N\nX Tri-State 1 -500 0 100 R 50 50 1 1 T\nX Vcc 14 0 300 100 D 50 50 1 1 W\nX GND 7 0 -300 100 U 50 50 1 1 W\nX OUT 8 300 0 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# ASCO\n#\nDEF ASCO X 0 20 Y Y 1 F N\nF0 \"X\" -300 250 50 H V L CNN\nF1 \"ASCO\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_Abracon_ASCO-4Pin_1.6x1.2mm\" 100 -350 50 H I C CNN\nF3 \"\" -225 125 50 H I C CNN\n$FPLIST\n Oscillator*Abracon*ASCO*1.6x1.2mm*\n$ENDFPLIST\nDRAW\nS -300 200 300 -200 0 1 10 f\nP 9 0 1 0 -225 100 -200 100 -200 150 -175 150 -175 100 -150 100 -150 150 -125 150 -125 100 N\nX Tri-State 1 -400 0 100 R 50 50 1 1 T\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 400 0 100 L 50 50 1 1 O\nX VDD 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# ASDMB-xxxMHz\n#\nDEF ASDMB-xxxMHz U 0 20 Y Y 1 F N\nF0 \"U\" -250 250 50 H V C CNN\nF1 \"ASDMB-xxxMHz\" 450 250 50 H V C CNN\nF2 \"Oscillator:Oscillator_SMD_Abracon_ASDMB-4Pin_2.5x2.0mm\" 0 0 50 H I C CNN\nF3 \"\" 300 450 50 H I C CNN\n$FPLIST\n Oscillator*SMD*Abracon*ASDMB*2.5x2.0mm*\n$ENDFPLIST\nDRAW\nS -300 200 300 -200 1 1 10 f\nP 9 1 1 0 -175 100 -150 100 -150 150 -125 150 -125 100 -100 100 -100 150 -75 150 -75 100 N\nX Standby 1 -400 0 100 R 50 50 1 1 I\nX GND 2 100 -300 100 U 50 50 1 1 W\nX Out 3 400 0 100 L 50 50 1 1 O\nX VDD 4 100 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# ASE-xxxMHz\n#\nDEF ASE-xxxMHz X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"ASE-xxxMHz\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_Abracon_ASE-4Pin_3.2x2.5mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*Abracon*ASE*3.2x2.5mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX EN 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX Vdd 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# ASV-xxxMHz\n#\nDEF ASV-xxxMHz X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"ASV-xxxMHz\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_Abracon_ASV-4Pin_7.0x5.1mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*Abracon*ASV*7.0x5.1mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX EN 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX Vdd 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# CXO_DIP14\n#\nDEF CXO_DIP14 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"CXO_DIP14\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_DIP-14\" 450 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS TFT680 GTXO-14T\n$FPLIST\n Oscillator*DIP*14*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 9 0 1 0 -75 -25 -50 -25 -50 25 -25 25 -25 -25 0 -25 0 25 25 25 25 -25 N\nX EN 1 -300 0 100 R 50 50 1 1 I\nX Vcc 14 0 300 100 D 50 50 1 1 W\nX GND 7 0 -300 100 U 50 50 1 1 W\nX OUT 8 300 0 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# CXO_DIP8\n#\nDEF CXO_DIP8 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"CXO_DIP8\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_DIP-8\" 450 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS TFT660\n$FPLIST\n Oscillator*DIP*8*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 9 0 1 0 -75 -25 -50 -25 -50 25 -25 25 -25 -25 0 -25 0 25 25 25 25 -25 N\nX EN 1 -300 0 100 R 50 50 1 1 I\nX GND 4 0 -300 100 U 50 50 1 1 W\nX OUT 5 300 0 100 L 50 50 1 1 O\nX Vcc 8 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# DFA-S11\n#\nDEF DFA-S11 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"DFA-S11\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_Fordahl_DFAS11-4Pin_7.0x5.0mm\" 1100 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*Fordahl*DFAS11*7.0x5.0mm*\n$ENDFPLIST\nDRAW\nS -200 200 300 -200 0 1 10 f\nP 8 0 1 0 25 -25 50 -25 50 25 75 25 75 -25 100 -25 100 25 125 25 N\nX Vctrl 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 400 0 100 L 50 50 1 1 O\nX V+ 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# DFA-S15\n#\nDEF DFA-S15 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"DFA-S15\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_Fordahl_DFAS15-4Pin_5.0x3.2mm\" 1100 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*Fordahl*DFAS15*5.0x3.2mm*\n$ENDFPLIST\nDRAW\nS -200 200 300 -200 0 1 10 f\nP 8 0 1 0 25 -25 50 -25 50 25 75 25 75 -25 100 -25 100 25 125 25 N\nX Vctrl 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 400 0 100 L 50 50 1 1 O\nX V+ 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# DFA-S2\n#\nDEF DFA-S2 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"DFA-S2\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_Fordahl_DFAS2-4Pin_7.3x5.1mm\" 1100 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*Fordahl*DFAS2*7.3x5.1mm*\n$ENDFPLIST\nDRAW\nS -200 200 300 -200 0 1 10 f\nP 8 0 1 0 25 -25 50 -25 50 25 75 25 75 -25 100 -25 100 25 125 25 N\nX Vctrl 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 400 0 100 L 50 50 1 1 O\nX V+ 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# DFA-S3\n#\nDEF DFA-S3 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"DFA-S3\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_Fordahl_DFAS3-4Pin_9.1x7.2mm\" 1100 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*Fordahl*DFAS3*9.1x7.2mm*\n$ENDFPLIST\nDRAW\nS -200 200 300 -200 0 1 10 f\nP 8 0 1 0 25 -25 50 -25 50 25 75 25 75 -25 100 -25 100 25 125 25 N\nX Vctrl 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 400 0 100 L 50 50 1 1 O\nX V+ 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# DGOF5S3\n#\nDEF DGOF5S3 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"DGOF5S3\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_DIP-14\" 450 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS ACO-xxxMHz GTXO-S14T TCXO-14\n$FPLIST\n Oscillator*DIP*14*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 9 0 1 0 -100 -25 -75 -25 -75 25 -50 25 -50 -25 -25 -25 -25 25 0 25 0 -25 N\nX NC 1 -300 0 100 R 50 50 1 1 N N\nX Vcc 14 0 300 100 D 50 50 1 1 W\nX GND 7 0 -300 100 U 50 50 1 1 W\nX OUT 8 300 0 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# ECS-2520MV-xxx-xx\n#\nDEF ECS-2520MV-xxx-xx X 0 20 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"ECS-2520MV-xxx-xx\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_ECS_2520MV-xxx-xx-4Pin_2.5x2.0mm\" 450 -350 50 H I C CNN\nF3 \"\" -175 125 50 H I C CNN\n$FPLIST\n Oscillator*SMD*ECS*2520MV*2.5x2.0mm*\n$ENDFPLIST\nDRAW\nS -300 200 300 -200 0 1 10 f\nP 9 0 1 0 -175 100 -150 100 -150 150 -125 150 -125 100 -100 100 -100 150 -75 150 -75 100 N\nX Tri-State 1 -400 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 400 0 100 L 50 50 1 1 O\nX VDD 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# IQXO-70\n#\nDEF IQXO-70 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"IQXO-70\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_IQD_IQXO70-4Pin_7.5x5.0mm\" 675 -325 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*IQD*IQXO70*7.5x5.0mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 -40 -30 -30 -30 -30 30 -10 30 -10 -30 10 -30 10 30 30 30 30 -30 40 -30 N\nX E/B 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX V+ 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# JTOS-50\n#\nDEF JTOS-50 X 0 20 Y Y 1 F N\nF0 \"X\" -300 250 50 H V L CNN\nF1 \"JTOS-50\" 100 250 50 H V L CNN\nF2 \"RF_Mini-Circuits:Mini-Circuits_BK377_LandPatternPL-005\" 0 -400 50 H I C CNN\nF3 \"\" -200 100 50 H I C CNN\nALIAS JTOS-25\n$FPLIST\n Mini?Circuits*BK377*\n$ENDFPLIST\nDRAW\nA -225 100 25 -1799 -1 0 1 10 N -250 100 -200 100\nA -175 100 25 1 1799 0 1 10 N -150 100 -200 100\nA -125 100 25 -1799 -1 0 1 10 N -150 100 -100 100\nA -75 100 25 1 1799 0 1 10 N -50 100 -100 100\nS -300 200 300 -200 0 1 10 f\nX GND 1 0 -300 100 U 50 50 1 1 W\nX GND 10 0 -300 100 U 50 50 1 1 P N\nX GND 11 0 -300 100 U 50 50 1 1 P N\nX GND 12 0 -300 100 U 50 50 1 1 P N\nX RFout 13 400 0 100 L 50 50 1 1 O\nX GND 14 0 -300 100 U 50 50 1 1 P N\nX VCC 2 0 300 100 D 50 50 1 1 W\nX GND 3 0 -300 100 U 50 50 1 1 P N\nX GND 4 0 -300 100 U 50 50 1 1 P N\nX Vtune 5 -400 0 100 R 50 50 1 1 I\nX GND 6 0 -300 100 U 50 50 1 1 P N\nX GND 7 0 -300 100 U 50 50 1 1 P N\nX GND 8 0 -300 100 U 50 50 1 1 P N\nX GND 9 0 -300 100 U 50 50 1 1 P N\nENDDRAW\nENDDEF\n#\n# KT2520K-T\n#\nDEF KT2520K-T U 0 20 Y Y 1 F N\nF0 \"U\" -160 240 50 H V C CNN\nF1 \"KT2520K-T\" 170 240 50 H V C CNN\nF2 \"Oscillator:Oscillator_SMD_Kyocera_2520-6Pin_2.5x2.0mm\" -100 -100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*Kyocera*2.5x2.0mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 9 0 1 0 -180 -20 -150 -20 -150 30 -120 30 -120 -20 -90 -20 -90 30 -60 30 -60 -20 N\nX GND 1 0 -300 100 U 50 50 1 1 W\nX NC 2 -200 100 100 R 50 50 1 1 N N\nX GND 3 0 -300 100 U 50 50 1 1 P N\nX OUT 4 300 0 100 L 50 50 1 1 O\nX NC 5 -200 -100 100 R 50 50 1 1 N N\nX VCC 6 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# LTC6905xS5-80\n#\nDEF LTC6905xS5-80 U 0 20 Y Y 1 F N\nF0 \"U\" -250 250 50 H V C CNN\nF1 \"LTC6905xS5-80\" 300 250 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:TSOT-23-5\" 50 -250 50 H I L CNN\nF3 \"\" 300 450 50 H I C CNN\nALIAS LTC6905xS5-96 LTC6905xS5-100 LTC6905xS5-133\n$FPLIST\n TSOT?23?5*\n$ENDFPLIST\nDRAW\nS -300 200 300 -200 1 1 10 f\nP 9 1 1 0 125 50 150 50 150 100 175 100 175 50 200 50 200 100 225 100 225 50 N\nX VDD 1 0 300 100 D 50 50 1 1 W\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OE 3 -400 100 100 R 50 50 1 1 I\nX DIV 4 -400 -100 100 R 50 50 1 1 I\nX OUT 5 400 0 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# MAX7375AXR805\n#\nDEF MAX7375AXR805 U 0 10 Y Y 1 F N\nF0 \"U\" -100 250 50 H V R CNN\nF1 \"MAX7375AXR805\" 50 -250 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-323_SC-70\" 1100 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS MAX7375AXR105 MAX7375AXR185 MAX7375AXR365 MAX7375AXR375 MAX7375AXR405 MAX7375AXR425\n$FPLIST\n *SC?70*\n$ENDFPLIST\nDRAW\nS -200 200 300 -200 0 1 10 f\nP 8 0 1 0 -125 -25 -100 -25 -100 25 -75 25 -75 -25 -50 -25 -50 25 -25 25 N\nX V+ 1 0 300 100 D 50 50 1 1 W\nX CLOCK 2 400 0 100 L 50 50 1 1 O\nX GND 3 0 -300 100 U 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# MV267\n#\nDEF MV267 U 0 20 Y Y 1 F N\nF0 \"U\" -300 250 50 H V C CNN\nF1 \"MV267\" 300 250 50 H V C CNN\nF2 \"Oscillator:Oscillator_OCXO_Morion_MV267\" 0 -350 50 H I C CNN\nF3 \"\" 0 250 50 H I C CNN\n$FPLIST\n Oscillator*OCXO*Morion*MV267*\n$ENDFPLIST\nDRAW\nA -175 0 25 -1799 -1 0 1 10 N -200 0 -150 0\nA -125 0 25 1 1799 0 1 10 N -100 0 -150 0\nA -75 0 25 -1799 -1 0 1 10 N -100 0 -50 0\nA -25 0 25 1 1799 0 1 10 N 0 0 -50 0\nS -300 200 300 -200 0 1 10 f\nX Uref 1 -400 100 100 R 50 50 1 1 O\nX Us 2 0 300 100 D 50 50 1 1 W\nX RF 3 400 0 100 L 50 50 1 1 O\nX GND 4 0 -300 100 U 50 50 1 1 W\nX Uin 5 -400 -100 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# MV317\n#\nDEF MV317 U 0 20 Y Y 1 F N\nF0 \"U\" -300 250 50 H V C CNN\nF1 \"MV317\" 300 250 50 H V C CNN\nF2 \"Oscillator:Oscillator_OCXO_Morion_MV317\" 0 -300 50 H I C CNN\nF3 \"\" 0 250 50 H I C CNN\n$FPLIST\n Oscillator*OCXO*Morion*MV317*\n$ENDFPLIST\nDRAW\nA -175 0 25 -1799 -1 0 1 10 N -200 0 -150 0\nA -125 0 25 1 1799 0 1 10 N -100 0 -150 0\nA -75 0 25 -1799 -1 0 1 10 N -100 0 -50 0\nA -25 0 25 1 1799 0 1 10 N 0 0 -50 0\nS -300 200 300 -200 0 1 10 f\nX Uref 1 -400 100 100 R 50 50 1 1 O\nX Us 2 0 300 100 D 50 50 1 1 W\nX RF 3 400 0 100 L 50 50 1 1 O\nX GND 4 0 -300 100 U 50 50 1 1 W\nX Uin 5 -400 -100 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# NB3N502\n#\nDEF NB3N502 U 0 20 Y Y 1 F N\nF0 \"U\" 100 600 50 H V L TNN\nF1 \"NB3N502\" 100 500 50 H V L TNN\nF2 \"Package_SO:SOIC-8_3.9x4.9mm_P1.27mm\" 50 -750 50 H I C CNN\nF3 \"\" 50 -850 50 H I C CNN\n$FPLIST\n SOIC*3.9x4.9mm*P1.27mm*\n$ENDFPLIST\nDRAW\nS -300 400 300 -400 0 1 10 f\nX X1/CLK 1 -400 100 100 R 50 50 1 1 I\nX VDD 2 0 500 100 D 50 50 1 1 W\nX GND 3 0 -500 100 U 50 50 1 1 W\nX REF 4 400 0 100 L 50 50 1 1 O\nX CLKOUT 5 400 -100 100 L 50 50 1 1 O\nX S0 6 -400 -100 100 R 50 50 1 1 I\nX S1 7 -400 -200 100 R 50 50 1 1 I\nX X2 8 -400 0 100 R 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# NB3N511\n#\nDEF NB3N511 U 0 20 Y Y 1 F N\nF0 \"U\" 100 600 50 H V L TNN\nF1 \"NB3N511\" 100 500 50 H V L TNN\nF2 \"Package_SO:SOIC-8_3.9x4.9mm_P1.27mm\" 50 -750 50 H I C CNN\nF3 \"\" 50 -850 50 H I C CNN\n$FPLIST\n SOIC*3.9x4.9mm*P1.27mm*\n$ENDFPLIST\nDRAW\nS -300 400 300 -300 0 1 10 f\nX X1/ICLK 1 -400 200 100 R 50 50 1 1 I\nX VDD 2 0 500 100 D 50 50 1 1 W\nX GND 3 0 -400 100 U 50 50 1 1 W\nX S1 4 -400 -100 100 R 50 50 1 1 I\nX CLKOUT 5 400 0 100 L 50 50 1 1 O\nX S0 6 -400 0 100 R 50 50 1 1 I\nX OE 7 -400 -200 100 R 50 50 1 1 I\nX X2 8 -400 100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# OCXO-14\n#\nDEF OCXO-14 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"OCXO-14\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_DIP-14\" 450 -350 50 H I C CNN\nF3 \"\" -300 100 50 H I C CNN\nALIAS GTXO-14V GTXO-S14V VTCXO-14\n$FPLIST\n Oscillator*DIP*14*\n$ENDFPLIST\nDRAW\nS -400 200 200 -200 0 1 10 f\nP 9 0 1 0 -275 75 -250 75 -250 125 -225 125 -225 75 -200 75 -200 125 -175 125 -175 75 N\nX Vcontrol 1 -500 0 100 R 50 50 1 1 I\nX Vcc 14 0 300 100 D 50 50 1 1 W\nX GND 7 0 -300 100 U 50 50 1 1 W\nX OUT 8 300 0 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# OH300\n#\nDEF OH300 X 0 20 Y Y 1 F N\nF0 \"X\" -300 250 50 H V L CNN\nF1 \"OH300\" 150 250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_OCXO_ConnorWinfield_OH300\" 0 -350 50 H I C CNN\nF3 \"\" -200 100 50 H I C CNN\n$FPLIST\n Oscillator*SMD*OH300*\n$ENDFPLIST\nDRAW\nA -225 100 25 -1799 -1 0 1 10 N -250 100 -200 100\nA -175 100 25 1 1799 0 1 10 N -150 100 -200 100\nA -125 100 25 -1799 -1 0 1 10 N -150 100 -100 100\nA -75 100 25 1 1799 0 1 10 N -50 100 -100 100\nS -300 200 300 -200 0 1 10 f\nX Vcontrol 1 -400 0 100 R 50 50 1 1 I\nX NC 2 100 -200 100 U 50 50 1 1 N N\nX VCC 3 0 300 100 D 50 50 1 1 W\nX OUT 4 400 0 100 L 50 50 1 1 O\nX NC 5 -100 -200 100 U 50 50 1 1 N N\nX NC 6 -200 -200 100 U 50 50 1 1 N N\nX GND 7 0 -300 100 U 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SG-210SED\n#\nDEF SG-210SED X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"SG-210SED\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_SeikoEpson_SG210-4Pin_2.5x2.0mm\" 450 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS SG-210SDD SG-210SCD\n$FPLIST\n Oscillator*SMD*SeikoEpson*SG210*2.5x2.0mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 9 0 1 0 -75 -25 -50 -25 -50 25 -25 25 -25 -25 0 -25 0 25 25 25 25 -25 N\nX OE 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX Vcc 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SG-210STF\n#\nDEF SG-210STF X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"SG-210STF\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_SeikoEpson_SG210-4Pin_2.5x2.0mm\" 450 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS SG-211\n$FPLIST\n Oscillator*SMD*SeikoEpson*SG210*2.5x2.0mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 9 0 1 0 -75 -25 -50 -25 -50 25 -25 25 -25 -25 0 -25 0 25 25 25 25 -25 N\nX ~ST~ 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX Vcc 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SG-3030CM\n#\nDEF SG-3030CM X 0 20 Y Y 1 F N\nF0 \"X\" -200 -250 50 H V L CNN\nF1 \"SG-3030CM\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_SeikoEpson_SG3030CM\" 0 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*SeikoEpson*SG3030CM*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 9 0 1 0 -75 -25 -50 -25 -50 25 -25 25 -25 -25 0 -25 0 25 25 25 25 -25 N\nX VIO 1 100 300 100 D 50 50 1 1 W\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX Vcc 4 -100 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SG-5032CAN\n#\nDEF SG-5032CAN X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"SG-5032CAN\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_SeikoEpson_SG8002LB-4Pin_5.0x3.2mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS SG-5032CBN\n$FPLIST\n Oscillator*SMD*SeikoEpson*SG8002LB*5.0x3.2mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX ~ST 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX VCC 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SG-7050CAN\n#\nDEF SG-7050CAN X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"SG-7050CAN\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_SeikoEpson_SG8002CA-4Pin_7.0x5.0mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS SG-7050CBN\n$FPLIST\n Oscillator*SMD*SeikoEpson*SG8002CA*7.0x5.0mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX ~ST 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX VCC 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SG-8002CA\n#\nDEF SG-8002CA X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"SG-8002CA\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_SeikoEpson_SG8002CA-4Pin_7.0x5.0mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS SG-7050CCN\n$FPLIST\n Oscillator*SMD*SeikoEpson*SG8002CA*7.0x5.0mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX OE 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX Vcc 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SG-8002CE\n#\nDEF SG-8002CE X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"SG-8002CE\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_SeikoEpson_SG8002CE-4Pin_3.2x2.5mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*SeikoEpson*SG8002CE*3.2x2.5mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX OE 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX Vcc 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SG-8002DB\n#\nDEF SG-8002DB X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"SG-8002DB\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SeikoEpson_SG-8002DB\" 450 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS SG-51\n$FPLIST\n Oscillator*SeikoEpson*SG?8002DB*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 9 0 1 0 -75 -25 -50 -25 -50 25 -25 25 -25 -25 0 -25 0 25 25 25 25 -25 N\nX OE 1 -300 0 100 R 50 50 1 1 I\nX Vcc 14 0 300 100 D 50 50 1 1 W\nX GND 7 0 -300 100 U 50 50 1 1 W\nX OUT 8 300 0 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# SG-8002DC\n#\nDEF SG-8002DC X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"SG-8002DC\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SeikoEpson_SG-8002DC\" 450 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS SG-531\n$FPLIST\n Oscillator*SeikoEpson*SG?8002DC*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 9 0 1 0 -75 -25 -50 -25 -50 25 -25 25 -25 -25 0 -25 0 25 25 25 25 -25 N\nX OE 1 -300 0 100 R 50 50 1 1 I\nX GND 4 0 -300 100 U 50 50 1 1 W\nX OUT 5 300 0 100 L 50 50 1 1 O\nX Vcc 8 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SG-8002JA\n#\nDEF SG-8002JA X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"SG-8002JA\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_SeikoEpson_SG8002JA-4Pin_14.0x8.7mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS SG-615\n$FPLIST\n Oscillator*SMD*SeikoEpson*SG8002JA*14.0x8.7mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX OE 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX Vcc 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SG-8002JC\n#\nDEF SG-8002JC X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"SG-8002JC\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_SeikoEpson_SG8002JC-4Pin_10.5x5.0mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*SeikoEpson*SG8002JC*10.5x5.0mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX OE 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX Vcc 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# SG-8002LB\n#\nDEF SG-8002LB X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"SG-8002LB\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_SeikoEpson_SG8002LB-4Pin_5.0x3.2mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS SG-5032CCN\n$FPLIST\n Oscillator*SMD*SeikoEpson*SG8002LB*5.0x3.2mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX OE 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX Vcc 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# Si512A_2.5x3.2mm\n#\nDEF Si512A_2.5x3.2mm U 0 20 Y Y 1 F N\nF0 \"U\" -300 350 50 H V L CNN\nF1 \"Si512A_2.5x3.2mm\" 100 -350 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_Silicon_Labs_LGA-6_2.5x3.2mm_P1.25mm\" 0 -450 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*Silicon*Labs*LGA*2.5x3.2mm*P1.25mm*\n$ENDFPLIST\nDRAW\nS -300 300 300 -300 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX FS 1 -400 100 100 R 50 50 1 1 I\nX OE 2 -400 -100 100 R 50 50 1 1 I\nX GND 3 0 -400 100 U 50 50 1 1 W\nX CLK 4 400 -100 100 L 50 50 1 1 O\nX NC 5 300 100 100 L 50 50 1 1 N N\nX VDD 6 0 400 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# Si513A_2.5x3.2mm\n#\nDEF Si513A_2.5x3.2mm U 0 20 Y Y 1 F N\nF0 \"U\" -250 350 50 H V L CNN\nF1 \"Si513A_2.5x3.2mm\" 100 -350 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_Silicon_Labs_LGA-6_2.5x3.2mm_P1.25mm\" 0 -450 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*Silicon*Labs*LGA*2.5x3.2mm*P1.25mm*\n$ENDFPLIST\nDRAW\nS -300 300 300 -300 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX OE 1 -400 100 100 R 50 50 1 1 I\nX FS 2 -400 -100 100 R 50 50 1 1 I\nX GND 3 0 -400 100 U 50 50 1 1 W\nX CLK 4 400 -100 100 L 50 50 1 1 O\nX NC 5 300 100 100 L 50 50 1 1 N N\nX VDD 6 0 400 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# Si5351A-B-GM\n#\nDEF Si5351A-B-GM U 0 20 Y Y 1 F N\nF0 \"U\" -500 850 50 H V C CNN\nF1 \"Si5351A-B-GM\" -550 -900 50 H V C CNN\nF2 \"Package_DFN_QFN:QFN-20-1EP_4x4mm_P0.5mm_EP2.7x2.7mm\" 0 -1200 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n QFN*1EP*4x4mm*P0.5mm*\n$ENDFPLIST\nDRAW\nS -500 800 500 -800 1 1 10 f\nX XA 1 -600 700 100 R 50 50 1 1 I\nX VDDOB 10 0 900 100 D 50 50 1 1 W\nX VDDOA 11 -100 900 100 D 50 50 1 1 W\nX CLK1 12 600 500 100 L 50 50 1 1 O\nX CLK0 13 600 700 100 L 50 50 1 1 O\nX VDDOD 14 200 900 100 D 50 50 1 1 W\nX CLK7 15 600 -700 100 L 50 50 1 1 O\nX CLK6 16 600 -500 100 L 50 50 1 1 O\nX CLK5 17 600 -300 100 L 50 50 1 1 O\nX VDDOC 18 100 900 100 D 50 50 1 1 W\nX CLK4 19 600 -100 100 L 50 50 1 1 O\nX XB 2 -600 500 100 R 50 50 1 1 I\nX VDD 20 -200 900 100 D 50 50 1 1 W\nX GND 21 0 -900 100 U 50 50 1 1 W\nX A0 3 -600 -100 100 R 50 50 1 1 I\nX SCL 4 -600 -300 100 R 50 50 1 1 I\nX SDA 5 -600 -200 100 R 50 50 1 1 B\nX SSEN 6 -600 -700 100 R 50 50 1 1 I\nX OEB 7 -600 -600 100 R 50 50 1 1 I\nX CLK3 8 600 100 100 L 50 50 1 1 O\nX CLK2 9 600 300 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# Si5351A-B-GT\n#\nDEF Si5351A-B-GT U 0 20 Y Y 1 F N\nF0 \"U\" -350 450 50 H V C CNN\nF1 \"Si5351A-B-GT\" -500 -500 50 H V C CNN\nF2 \"Package_SO:MSOP-10_3x3mm_P0.5mm\" 0 -800 50 H I C CNN\nF3 \"\" -350 -100 50 H I C CNN\n$FPLIST\n MSOP*3x3mm*P0.5mm*\n$ENDFPLIST\nDRAW\nS -400 400 400 -400 0 1 10 f\nX VDD 1 -100 500 100 D 50 50 1 1 W\nX CLK0 10 500 200 100 L 50 50 1 1 O\nX XA 2 -500 300 100 R 50 50 1 1 I\nX XB 3 -500 100 100 R 50 50 1 1 I\nX SCL 4 -500 -200 100 R 50 50 1 1 I\nX SDA 5 -500 -300 100 R 50 50 1 1 B\nX CLK2 6 500 -200 100 L 50 50 1 1 O\nX VDDO 7 100 500 100 D 50 50 1 1 W\nX GND 8 0 -500 100 U 50 50 1 1 W\nX CLK1 9 500 0 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# Si5351B-B-GM\n#\nDEF Si5351B-B-GM U 0 20 Y Y 1 F N\nF0 \"U\" -500 850 50 H V C CNN\nF1 \"Si5351B-B-GM\" -550 -900 50 H V C CNN\nF2 \"Package_DFN_QFN:QFN-20-1EP_4x4mm_P0.5mm_EP2.7x2.7mm\" 0 -1200 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n QFN*1EP*4x4mm*P0.5mm*\n$ENDFPLIST\nDRAW\nS -500 800 500 -800 1 1 10 f\nX XA 1 -600 700 100 R 50 50 1 1 I\nX VDDOB 10 0 900 100 D 50 50 1 1 W\nX VDDOA 11 -100 900 100 D 50 50 1 1 W\nX CLK1 12 600 500 100 L 50 50 1 1 O\nX CLK0 13 600 700 100 L 50 50 1 1 O\nX VDDOD 14 200 900 100 D 50 50 1 1 W\nX CLK7 15 600 -700 100 L 50 50 1 1 O\nX CLK6 16 600 -500 100 L 50 50 1 1 O\nX CLK5 17 600 -300 100 L 50 50 1 1 O\nX VDDOC 18 100 900 100 D 50 50 1 1 W\nX CLK4 19 600 -100 100 L 50 50 1 1 O\nX XB 2 -600 500 100 R 50 50 1 1 I\nX VDD 20 -200 900 100 D 50 50 1 1 W\nX GND 21 0 -900 100 U 50 50 1 1 W\nX VC 3 -600 200 100 R 50 50 1 1 I\nX SCL 4 -600 -300 100 R 50 50 1 1 I\nX SDA 5 -600 -200 100 R 50 50 1 1 B\nX SSEN 6 -600 -700 100 R 50 50 1 1 I\nX OEB 7 -600 -600 100 R 50 50 1 1 I\nX CLK3 8 600 100 100 L 50 50 1 1 O\nX CLK2 9 600 300 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# Si5351C-B-GM\n#\nDEF Si5351C-B-GM U 0 20 Y Y 1 F N\nF0 \"U\" -500 850 50 H V C CNN\nF1 \"Si5351C-B-GM\" -550 -900 50 H V C CNN\nF2 \"Package_DFN_QFN:QFN-20-1EP_4x4mm_P0.5mm_EP2.7x2.7mm\" 0 -1200 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n QFN*1EP*4x4mm*P0.5mm*\n$ENDFPLIST\nDRAW\nS -500 800 500 -800 1 1 10 f\nX XA 1 -600 700 100 R 50 50 1 1 I\nX VDDOB 10 0 900 100 D 50 50 1 1 W\nX VDDOA 11 -100 900 100 D 50 50 1 1 W\nX CLK1 12 600 500 100 L 50 50 1 1 O\nX CLK0 13 600 700 100 L 50 50 1 1 O\nX VDDOD 14 200 900 100 D 50 50 1 1 W\nX CLK7 15 600 -700 100 L 50 50 1 1 O\nX CLK6 16 600 -500 100 L 50 50 1 1 O\nX CLK5 17 600 -300 100 L 50 50 1 1 O\nX VDDOC 18 100 900 100 D 50 50 1 1 W\nX CLK4 19 600 -100 100 L 50 50 1 1 O\nX XB 2 -600 500 100 R 50 50 1 1 I\nX VDD 20 -200 900 100 D 50 50 1 1 W\nX GND 21 0 -900 100 U 50 50 1 1 W\nX INTR 3 -600 -400 100 R 50 50 1 1 O\nX SCL 4 -600 -300 100 R 50 50 1 1 I\nX SDA 5 -600 -200 100 R 50 50 1 1 B\nX CLKIN 6 -600 200 100 R 50 50 1 1 I\nX OEB 7 -600 -600 100 R 50 50 1 1 I\nX CLK3 8 600 100 100 L 50 50 1 1 O\nX CLK2 9 600 300 100 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# Si570\n#\nDEF Si570 U 0 40 Y Y 1 F N\nF0 \"U\" -350 350 50 H V C CNN\nF1 \"Si570\" 300 -350 50 H V C CNN\nF2 \"Oscillator:Oscillator_SMD_SI570_SI571_Standard\" 0 -300 50 H I C CNN\nF3 \"\" -400 700 50 H I C CNN\n$FPLIST\n Oscillator*SI570*SI571*\n$ENDFPLIST\nDRAW\nS -400 300 400 -300 0 1 10 f\nP 10 0 1 0 -75 -50 -50 -50 -50 50 0 50 0 -50 50 -50 50 50 100 50 100 -50 125 -50 N\nX NC 1 -400 200 100 R 50 50 1 1 N N\nX OE 2 -500 100 100 R 50 50 1 1 I\nX GND 3 0 -400 100 U 50 50 1 1 W\nX CLK+ 4 500 100 100 L 50 50 1 1 O\nX CLK- 5 500 -100 100 L 50 50 1 1 O\nX Vcc 6 0 400 100 D 50 50 1 1 W\nX SDA 7 -500 -100 100 R 50 50 1 1 B\nX SCL 8 -500 -200 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# Si571\n#\nDEF Si571 U 0 40 Y Y 1 F N\nF0 \"U\" -400 400 50 H V C CNN\nF1 \"Si571\" 350 -400 50 H V C CNN\nF2 \"Oscillator:Oscillator_SMD_SI570_SI571_Standard\" -550 600 50 H I C CNN\nF3 \"\" -400 700 50 H I C CNN\n$FPLIST\n Oscillator*SI570*SI571*\n$ENDFPLIST\nDRAW\nS -450 350 450 -350 0 1 10 f\nP 10 0 1 0 -75 -50 -50 -50 -50 50 0 50 0 -50 50 -50 50 50 100 50 100 -50 125 -50 N\nX Vc 1 -600 200 150 R 50 50 1 1 I\nX OE 2 -600 100 150 R 50 50 1 1 I\nX GND 3 0 -500 150 U 50 50 1 1 W\nX CLK+ 4 600 100 150 L 50 50 1 1 O\nX CLK- 5 600 -100 150 L 50 50 1 1 O\nX Vcc 6 0 500 150 D 50 50 1 1 W\nX SDA 7 -600 -100 150 R 50 50 1 1 B\nX SCL 8 -600 -200 150 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# TCXO3\n#\nDEF TCXO3 X 0 20 Y Y 1 F N\nF0 \"X\" 325 450 50 H V L CNN\nF1 \"TCXO3\" 325 350 50 H V L CNN\nF2 \"\" -550 250 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nS -500 -200 400 300 0 1 10 f\nP 10 0 1 0 -100 0 -75 0 -75 100 -25 100 -25 0 25 0 25 100 75 100 75 0 100 0 N\nX FREQ 1 500 100 100 L 50 50 1 1 O\nX GND 10 -200 -300 100 U 50 50 1 1 W\nX GND 11 -100 -300 100 U 50 50 1 1 W\nX GND 12 0 -300 100 U 50 50 1 1 W\nX NC 13 300 -200 100 U 50 50 1 1 N N\nX NC 14 400 0 100 L 50 50 1 1 N N\nX +5V 15 0 400 100 D 50 50 1 1 W\nX NC 16 200 300 100 D 50 50 1 1 N N\nX NC 17 -100 300 100 D 50 50 1 1 N N\nX Vctrl 18 -600 100 100 R 50 50 1 1 I\nX NC 19 -300 300 100 D 50 50 1 1 N N\nX NC 2 400 200 100 L 50 50 1 1 N N\nX NC 20 -400 300 100 D 50 50 1 1 N N\nX NC 21 300 300 100 D 50 50 1 1 N N\nX NC 22 400 -100 100 L 50 50 1 1 N N\nX GND 23 100 -300 100 U 50 50 1 1 W\nX URef 3 -200 400 100 D 50 50 1 1 w\nX NC 4 -500 200 100 R 50 50 1 1 N N\nX NC 5 100 300 100 D 50 50 1 1 N N\nX NC 6 -500 0 100 R 50 50 1 1 N N\nX NC 7 -500 -100 100 R 50 50 1 1 N N\nX NC 8 -300 -200 100 U 50 50 1 1 N N\nX NC 9 200 -200 100 U 50 50 1 1 N N\nENDDRAW\nENDDEF\n#\n# TXC-7C\n#\nDEF TXC-7C X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"TXC-7C\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_TXC_7C-4Pin_5.0x3.2mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*TXC*7C*5.0x3.2mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX EN 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX Vdd 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# VC-81\n#\nDEF VC-81 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"VC-81\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_DIP-8\" 450 -350 50 H I C CNN\nF3 \"\" -300 100 50 H I C CNN\nALIAS VC-83\n$FPLIST\n Oscillator*DIP*8*\n$ENDFPLIST\nDRAW\nS -400 200 200 -200 0 1 10 f\nP 9 0 1 0 -275 75 -250 75 -250 125 -225 125 -225 75 -200 75 -200 125 -175 125 -175 75 N\nX Vcontrol 1 -500 0 100 R 50 50 1 1 I\nX GND 4 0 -300 100 U 50 50 1 1 W\nX OUT 5 300 0 100 L 50 50 1 1 O\nX Vcc 8 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# XO32\n#\nDEF XO32 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"XO32\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_EuroQuartz_XO32-4Pin_3.2x2.5mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*EuroQuartz*XO32*3.2x2.5mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 -50 -30 -40 -30 -40 30 -20 30 -20 -30 0 -30 0 30 20 30 20 -30 30 -30 N\nX EN 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX V+ 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# XO53\n#\nDEF XO53 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"XO53\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_EuroQuartz_XO53-4Pin_5.0x3.2mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*EuroQuartz*XO53*5.0x3.2mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 30 -30 20 -30 20 30 0 30 0 -30 -20 -30 -20 30 -40 30 -40 -30 -50 -30 N\nX EN 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX V+ 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# XO91\n#\nDEF XO91 X 0 10 Y Y 1 F N\nF0 \"X\" -200 250 50 H V L CNN\nF1 \"XO91\" 50 -250 50 H V L CNN\nF2 \"Oscillator:Oscillator_SMD_EuroQuartz_XO91-4Pin_7.0x5.0mm\" 700 -350 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Oscillator*SMD*EuroQuartz*XO91*7.0x5.0mm*\n$ENDFPLIST\nDRAW\nS -200 200 200 -200 0 1 10 f\nP 10 0 1 0 30 -30 20 -30 20 30 0 30 0 -30 -20 -30 -20 30 -40 30 -40 -30 -50 -30 N\nX EN 1 -300 0 100 R 50 50 1 1 I\nX GND 2 0 -300 100 U 50 50 1 1 W\nX OUT 3 300 0 100 L 50 50 1 1 O\nX V+ 4 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# XUX51\n#\nDEF XUX51 U 0 20 Y Y 1 F N\nF0 \"U\" -250 250 50 H V C CNN\nF1 \"XUX51\" 200 250 50 H V C CNN\nF2 \"Oscillator:Oscillator_SMD_IDT_JS6-6_5.0x3.2mm_P1.27mm\" 50 -350 50 H I C CNN\nF3 \"\" -400 700 50 H I C CNN\nALIAS XUX52 XUX53\n$FPLIST\n Oscillator*JS6*\n$ENDFPLIST\nDRAW\nS -300 200 300 -200 0 1 10 f\nP 9 0 1 0 -200 100 -175 100 -175 150 -150 150 -150 100 -125 100 -125 150 -100 150 -100 100 N\nX E/D 1 -400 0 100 R 50 50 1 1 I\nX NC 2 -300 -100 100 R 50 50 1 1 N N\nX GND 3 0 -300 100 U 50 50 1 1 W\nX OUT 4 400 0 100 L 50 50 1 1 O\nX OUT2 5 400 -100 100 L 50 50 1 1 O\nX VDD 6 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# XUX71\n#\nDEF XUX71 U 0 20 Y Y 1 F N\nF0 \"U\" -250 250 50 H V C CNN\nF1 \"XUX71\" 200 250 50 H V C CNN\nF2 \"Oscillator:Oscillator_SMD_IDT_JU6-6_7.0x5.0mm_P2.54mm\" 50 -350 50 H I C CNN\nF3 \"\" -400 700 50 H I C CNN\nALIAS XUX72 XUX73\n$FPLIST\n Oscillator*JU6*\n$ENDFPLIST\nDRAW\nS -300 200 300 -200 0 1 10 f\nP 9 1 1 0 -200 100 -175 100 -175 150 -150 150 -150 100 -125 100 -125 150 -100 150 -100 100 N\nX E/D 1 -400 0 100 R 50 50 1 1 I\nX NC 2 -300 -100 100 R 50 50 1 1 N N\nX GND 3 0 -300 100 U 50 50 1 1 W\nX OUT 4 400 0 100 L 50 50 1 1 O\nX OUT2 5 400 -100 100 L 50 50 1 1 O\nX VDD 6 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# XUY51\n#\nDEF XUY51 U 0 20 Y Y 1 F N\nF0 \"U\" -250 250 50 H V C CNN\nF1 \"XUY51\" 200 250 50 H V C CNN\nF2 \"Oscillator:Oscillator_SMD_IDT_JS6-6_5.0x3.2mm_P1.27mm\" 50 -350 50 H I C CNN\nF3 \"\" -400 700 50 H I C CNN\nALIAS XUY52 XUY53\n$FPLIST\n Oscillator*JS6*\n$ENDFPLIST\nDRAW\nS -300 200 300 -200 0 1 10 f\nP 9 1 1 0 -200 100 -175 100 -175 150 -150 150 -150 100 -125 100 -125 150 -100 150 -100 100 N\nX NC 1 -300 -100 100 R 50 50 1 1 N N\nX E/D 2 -400 0 100 R 50 50 1 1 I\nX GND 3 0 -300 100 U 50 50 1 1 W\nX OUT 4 400 0 100 L 50 50 1 1 O\nX OUT2 5 400 -100 100 L 50 50 1 1 O\nX VDD 6 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# XUY71\n#\nDEF XUY71 U 0 20 Y Y 1 F N\nF0 \"U\" -250 250 50 H V C CNN\nF1 \"XUY71\" 200 250 50 H V C CNN\nF2 \"Oscillator:Oscillator_SMD_IDT_JU6-6_7.0x5.0mm_P2.54mm\" 50 -350 50 H I C CNN\nF3 \"\" -400 700 50 H I C CNN\nALIAS XUY72 XUY73\n$FPLIST\n Oscillator*JU6*\n$ENDFPLIST\nDRAW\nS -300 200 300 -200 0 1 10 f\nP 9 1 1 0 -200 100 -175 100 -175 150 -150 150 -150 100 -125 100 -125 150 -100 150 -100 100 N\nX NC 1 -300 -100 100 R 50 50 1 1 N N\nX E/D 2 -400 0 100 R 50 50 1 1 I\nX GND 3 0 -300 100 U 50 50 1 1 W\nX OUT 4 400 0 100 L 50 50 1 1 O\nX OUT2 5 400 -100 100 L 50 50 1 1 O\nX VDD 6 0 300 100 D 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Transistor_FET.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP 2N7000\nD 0.2A Id, 200V Vds, N-Channel MOSFET, 2.6V Logic Level, TO-92\nK N-Channel MOSFET Logic-Level\nF https://www.fairchildsemi.com/datasheets/2N/2N7000.pdf\n$ENDCMP\n#\n$CMP 2N7002\nD 0.115A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel Switching MOSFET\nF https://www.fairchildsemi.com/datasheets/2N/2N7002.pdf\n$ENDCMP\n#\n$CMP 2N7002E\nD 0.24A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ds30376.pdf\n$ENDCMP\n#\n$CMP 2N7002H\nD 0.21A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/2N7002H.pdf\n$ENDCMP\n#\n$CMP 2N7002K\nD 0.38A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF https://www.diodes.com/assets/Datasheets/ds30896.pdf\n$ENDCMP\n#\n$CMP 3SK263\nD 30mA Id, 15V Vds, N-Channel Dual Gate MOSFET, SOT-143/343\nK N-Channel MOSFET Dual Gate\nF http://www.onsemi.com/pub_link/Collateral/EN4423-D.PDF\n$ENDCMP\n#\n$CMP AO3401A\nD -4.0A Id, -30V Vds, P-Channel MOSFET, SOT-23\nK P-Channel MOSFET\nF http://www.aosmd.com/pdfs/datasheet/AO3401A.pdf\n$ENDCMP\n#\n$CMP BF244A\nD 50mA Id, 30V Vgs, N-Channel FET Transistor, TO-92\nK N-Channel FET Transistor Low Voltage\nF http://www.fairchildsemi.com/ds/BF/BF244A.pdf\n$ENDCMP\n#\n$CMP BF244B\nD 50mA Id, 30V Vgs, N-Channel FET Transistor, TO-92\nK N-Channel FET Transistor Low Voltage\nF http://www.fairchildsemi.com/ds/BF/BF244A.pdf\n$ENDCMP\n#\n$CMP BF244C\nD 10mA Id, 30V Vgs, N-Channel FET Transistor, TO-92\nK N-Channel FET Transistor Low Voltage\nF http://www.fairchildsemi.com/ds/BF/BF244A.pdf\n$ENDCMP\n#\n$CMP BF245A\nD 50mA Id, 30V Vgs, N-Channel FET Transistor, TO-92\nK N-Channel FET Transistor Low Voltage\nF http://www.fairchildsemi.com/ds/BF/BF245A.pdf\n$ENDCMP\n#\n$CMP BF245B\nD 10mA Id, 30V Vgs, N-Channel FET Transistor, TO-92\nK N-Channel FET Transistor Low Voltage\nF http://www.fairchildsemi.com/ds/BF/BF245A.pdf\n$ENDCMP\n#\n$CMP BF245C\nD 10mA Id, 30V Vgs, N-Channel FET Transistor, TO-92\nK N-Channel FET Transistor Low Voltage\nF http://www.fairchildsemi.com/ds/BF/BF245A.pdf\n$ENDCMP\n#\n$CMP BF545A\nD 5mA Idss, 30V Vgs, N-Channel JFET, SOT-23\nK N-Channel FET Transistor Low Voltage\nF https://www.nxp.com/docs/en/data-sheet/BF545A_BF545B_BF545C.pdf\n$ENDCMP\n#\n$CMP BF545B\nD 15mA Idss, 30V Vgs, N-Channel JFET, SOT-23\nK N-Channel FET Transistor Low Voltage\nF https://www.nxp.com/docs/en/data-sheet/BF545A_BF545B_BF545C.pdf\n$ENDCMP\n#\n$CMP BF545C\nD 25mA Idss, 30V Vgs, N-Channel JFET, SOT-23\nK N-Channel FET Transistor Low Voltage\nF https://www.nxp.com/docs/en/data-sheet/BF545A_BF545B_BF545C.pdf\n$ENDCMP\n#\n$CMP BS107\nD 0.25A Id, 200V Vds, N-Channel MOSFET, TO-92\nK N-Channel MOSFET\nF http://www.onsemi.com/pub_link/Collateral/BS107-D.PDF\n$ENDCMP\n#\n$CMP BS108\nD 0.25A Id, 200V Vds, N-Channel MOSFET, TO-92\nK N-Channel MOSFET\nF http://www.redrok.com/MOSFET_BS108_200V_250mA_8O_Vth1.5_TO-92.PDF\n$ENDCMP\n#\n$CMP BS170\nD 0.5A Id, 60V Vds, N-Channel MOSFET, TO-92\nK N-Channel MOSFET\nF http://www.fairchildsemi.com/ds/BS/BS170.pdf\n$ENDCMP\n#\n$CMP BS170F\nD 0.15A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/BS170F.pdf\n$ENDCMP\n#\n$CMP BS250\nD -0.18A Id, -45V Vds, P-Channel MOSFET, TO-92\nK P-Channel MOSFET\nF http://www.vishay.com/docs/70209/70209.pdf\n$ENDCMP\n#\n$CMP BS870\nD 0.25A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ds11302.pdf\n$ENDCMP\n#\n$CMP BSB008NE2LX\nD 180A Id, 25V Vds, 0.8mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSB008NE2LX-DS-v02_00-EN.pdf?fileId=db3a30432e564707012e5745ca7d000e\n$ENDCMP\n#\n$CMP BSB012NE2LXI\nD 170A Id, 25V Vds, 1.2mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSB012NE2LXI-DS-v02_01-EN.pdf?fileId=db3a30433f764301013f805e3eb247c1\n$ENDCMP\n#\n$CMP BSB013NE2LXI\nD 163A Id, 25V Vds, 1.3mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSB013NE2LXI-DS-v02_04-en.pdf?fileId=db3a30432e398416012e47a158802577\n$ENDCMP\n#\n$CMP BSB014N04LX3\nD 180A Id, 40V Vds, 1.4mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSB014N04LX3G-DS-v02_03-en.pdf?fileId=db3a304320d39d590121a02c6c737a9b\n$ENDCMP\n#\n$CMP BSB015N04NX3\nD 180A Id, 40V Vds, 1.5mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSB015N04NX3G-DS-v02_04-en.pdf?fileId=db3a304320d39d590121a03bbfcd7aac\n$ENDCMP\n#\n$CMP BSB028N06NN3\nD 90A Id, 60V Vds, 2.8mOhm Rds, N-Channel MOSFET, DirectFET MN\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSB028N06NN3-DS-v02_00-en.pdf?fileId=db3a30432e25b009012e29fda4e23838\n$ENDCMP\n#\n$CMP BSB044N08NN3\nD 90A Id, 80V Vds, 4.4mOhm Rds, N-Channel MOSFET, DirectFET MN\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSB044N08NN3_G-DS-v02_00-en.pdf?fileId=db3a30435819ae2e012e385cde7b70d4\n$ENDCMP\n#\n$CMP BSB056N10NN3\nD 83A Id, 100V Vds, 5.1mOhm Rds, N-Channel MOSFET, DirectFET MN\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSB056N10NN3_G-DS-v02_05-en.pdf?fileId=db3a30442e152e91012e390b9a631459\n$ENDCMP\n#\n$CMP BSB104N08NP3\nD 50A Id, 80V Vds, 10.4mOhm Rds, N-Channel MOSFET, DirectFET MP\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSB104N08NP3_G-DS-v02_01-en.pdf?fileId=db3a304341e0aed00141efc548ca1b2b\n$ENDCMP\n#\n$CMP BSB165N15NZ3\nD 45A Id, 150V Vds, 16.5mOhm Rds, N-Channel MOSFET, DirectFET MZ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSB165N15NZ3-DS-v02_02-en.pdf?fileId=db3a30432e779412012e7b04a1353843\n$ENDCMP\n#\n$CMP BSB280N15NZ3\nD 30A Id, 150V Vds, 28mOhm Rds, N-Channel MOSFET, DirectFET MZ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSB280N15NZ3-DS-v02_05-en.pdf?fileId=db3a30432e779412012e7b0b544c3852\n$ENDCMP\n#\n$CMP BSC026N08NS5\nD 100A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 2.6mOhm Ron, Qg (typ) 74.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC026N08NS5-DS-v02_01-EN.pdf?fileId=5546d4624ad04ef9014ae2eace7629e0\n$ENDCMP\n#\n$CMP BSC028N06LS3\nD 100A Id, 60V Vds, OptiMOS N-Channel Power MOSFET, 2.8mOhm Ron, Qg (typ) 31.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC028N06LS3-DS-v02_02-en.pdf?fileId=db3a30431ddc9372011ebafa4c607f8c\n$ENDCMP\n#\n$CMP BSC030N08NS5\nD 100A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 3.0mOhm Ron, Qg (typ) 61.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC030N08NS5-DS-v02_02-EN.pdf?fileId=5546d4624ad04ef9014aed52f4210acf\n$ENDCMP\n#\n$CMP BSC035N10NS5\nD 100A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 3.5mOhm Ron, Qg (typ) 70.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC035N10NS5-DS-v02_00-EN.pdf?fileId=5546d4624ad04ef9014ae8b5f3bc1b6f\n$ENDCMP\n#\n$CMP BSC037N08NS5\nD 100A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 3.7mOhm Ron, Qg (typ) 46.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC037N08NS5-DS-v02_00-EN.pdf?fileId=5546d4624ad04ef9014ae9ad3b8e1c33\n$ENDCMP\n#\n$CMP BSC040N08NS5\nD 100A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 4.0mOhm Ron, Qg (typ) 43.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC040N08NS5-DS-v02_00-EN.pdf?fileId=5546d4624ad04ef9014ae3065a7e2a05\n$ENDCMP\n#\n$CMP BSC040N10NS5\nD 100A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 4.0mOhm Ron, Qg (typ) 58.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC040N10NS5-DS-v02_01-EN.pdf?fileId=5546d4624a0bf290014a0fbcee2e6b38\n$ENDCMP\n#\n$CMP BSC046N10NS3G\nD 100A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 4.6mOhm Ron, Qg (typ) 63.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC046N10NS3-DS-v02_00-en.pdf?fileId=db3a304332fc1ee7013316f966a4713c\n$ENDCMP\n#\n$CMP BSC047N08NS3G\nD 100A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 4.7mOhm Ron, Qg (typ) 52.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC047N08NS3G-DS-v02_07-en.pdf?fileId=db3a30431add1d95011ae7e8dacf5611\n$ENDCMP\n#\n$CMP BSC052N08NS5\nD 95A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 5.2mOhm Ron, Qg (typ) 32.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC052N08NS5-DS-v02_00-EN.pdf?fileId=5546d4624ad04ef9014ae38fc94f2b40\n$ENDCMP\n#\n$CMP BSC057N08NS3G\nD 100A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 5.7mOhm Ron, Qg (typ) 42.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC057N08NS3G-DS-v02_04-en.pdf?fileId=db3a30431add1d95011ae803c9345616\n$ENDCMP\n#\n$CMP BSC060N10NS3G\nD 90A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 6.0mOhm Ron, Qg (typ) 51.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC060N10NS3-DS-v02_04-en.pdf?fileId=db3a30431ce5fb52011d1aab7f90133a\n$ENDCMP\n#\n$CMP BSC061N08NS5\nD 82A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 6.1mOhm Ron, Qg (typ) 27.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC061N08NS5-DS-v02_00-EN.pdf?fileId=5546d4624ad04ef9014ae3ab1bb62b69\n$ENDCMP\n#\n$CMP BSC070N10NS3G\nD 90A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 7.0mOhm Ron, Qg (typ) 42.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC070N10NS3-DS-v02_01-en.pdf?fileId=db3a304327b89750012824712c6c6f2f\n$ENDCMP\n#\n$CMP BSC070N10NS5\nD 80A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 7.0mOhm Ron, Qg (typ) 30.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC070N10NS5-DS-v02_01-EN.pdf?fileId=5546d4624a0bf290014a0fc62d9d6b3c\n$ENDCMP\n#\n$CMP BSC072N08NS5\nD 74A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 7.2mOhm Ron, Qg (typ) 24.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC072N08NS5-DS-v02_00-EN.pdf?fileId=5546d4624ad04ef9014ae3d8e8192c7c\n$ENDCMP\n#\n$CMP BSC079N10NSG\nD 100A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 7.9mOhm Ron, Qg (typ) 66.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC079N10NS-DS-v01_06-en.pdf?fileId=db3a3043163797a601167b174f951147\n$ENDCMP\n#\n$CMP BSC082N10LSG\nD 100A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 8.2mOhm Ron, Qg (typ) 78.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC082N10LS-DS-v01_07-en.pdf?fileId=db3a3043163797a6011647faad240719\n$ENDCMP\n#\n$CMP BSC098N10NS5\nD 60A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 9.8mOhm Ron, Qg (typ) 22.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC098N10NS5-DS-v02_00-EN.pdf?fileId=5546d4624ad04ef9014ae95ab4221bfd\n$ENDCMP\n#\n$CMP BSC100N10NSFG\nD 90A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 10.0mOhm Ron, Qg (typ) 33.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC100N10NSF-DS-v02_08-en.pdf?fileId=db3a30431b3e89eb011b49a75b607b57\n$ENDCMP\n#\n$CMP BSC105N10LSFG\nD 90A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 10.5mOhm Ron, Qg (typ) 40.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC105N10LSF-DS-v02_09-en.pdf?fileId=db3a30431b3e89eb011b499b2aa07b26\n$ENDCMP\n#\n$CMP BSC109N10NS3G\nD 63A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 10.9mOhm Ron, Qg (typ) 26.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC109N10NS3-DS-v02_00-en.pdf?fileId=db3a304327b897500128247bdae36f3f\n$ENDCMP\n#\n$CMP BSC117N08NS5\nD 49A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 11.7mOhm Ron, Qg (typ) 15.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC117N08NS5-DS-v02_00-EN.pdf?fileId=5546d4624ad04ef9014ae97632721c1b\n$ENDCMP\n#\n$CMP BSC118N10NSG\nD 71A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 11.8mOhm Ron, Qg (typ) 42.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC118N10NS-DS-v01_08-en.pdf?fileId=db3a3043163797a6011647fdc2d4071c\n$ENDCMP\n#\n$CMP BSC123N08NS3G\nD 55A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 12.3mOhm Ron, Qg (typ) 19.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC123N08NS3G-DS-v02_05-en.pdf?fileId=db3a30431add1d95011ae80eb8555625\n$ENDCMP\n#\n$CMP BSC123N10LSG\nD 71A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 12.3mOhm Ron, Qg (typ) 51.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC123N10LS-DS-v02_08-en.pdf?fileId=db3a30431b3e89eb011b4626974b7df5\n$ENDCMP\n#\n$CMP BSC13DN30NSFD\nD 16A Id, 300V Vds, OptiMOS N-Channel Power MOSFET, 130mOhm Ron, Qg (typ) 30.0nC, PG-TDSON-8\nK NexFET Power MOSFET N-MOS\nF https://www.infineon.com/dgdl/Infineon-BSC13DN30NSFD-DS-v02_01-EN.pdf?fileId=5546d46259b0420a0159d5c940fc0d9a\n$ENDCMP\n#\n$CMP BSC159N10LSFG\nD 63A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 15.9mOhm Ron, Qg (typ) 26.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC159N10LSF-DS-v02_09-en.pdf?fileId=db3a30431b3e89eb011b499f85d47b36\n$ENDCMP\n#\n$CMP BSC160N10NS3G\nD 42A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 16.0mOhm Ron, Qg (typ) 19.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC160N10NS3-DS-v02_04-en.pdf?fileId=db3a30432239cccd01226040189a7f47\n$ENDCMP\n#\n$CMP BSC196N10NSG\nD 45A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 19.6mOhm Ron, Qg (typ) 25.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC196N10NS-DS-v01_07-en.pdf?fileId=db3a3043163797a601164800549d071f\n$ENDCMP\n#\n$CMP BSC252N10NSFG\nD 40A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 25.2mOhm Ron, Qg (typ) 13.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC252N10NSF-DS-v02_08-en.pdf?fileId=db3a30431b3e89eb011b498909e97b17\n$ENDCMP\n#\n$CMP BSC265N10LSFG\nD 40A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 26.5mOhm Ron, Qg (typ) 16.0nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC265N10LSFG-DS-v02_08-en.pdf?fileId=db3a30431b3e89eb011b49a375207b46\n$ENDCMP\n#\n$CMP BSC340N08NS3G\nD 23A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 34.0mOhm Ron, Qg (typ) 6.8nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC340N08NS3G-DS-v02_06-en.pdf?fileId=db3a30431add1d95011ae81c21f2563a\n$ENDCMP\n#\n$CMP BSC440N10NS3G\nD 18A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 44.0mOhm Ron, Qg (typ) 8.1nC, PG-TDSON-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-BSC440N10NS3-DS-v02_04-en.pdf?fileId=db3a30432239cccd0122604520d47f56\n$ENDCMP\n#\n$CMP BSF030NE2LQ\nD 75A Id, 25V Vds, 3mOhm Rds, N-Channel MOSFET, DirectFET SQ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSF030NE2LQ-DS-v02_03-en.pdf?fileId=db3a30432e398416012e47a8f0792588\n$ENDCMP\n#\n$CMP BSF035NE2LQ\nD 69A Id, 25V Vds, 3.5mOhm Rds, N-Channel MOSFET, DirectFET SQ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSF035NE2LQ-DS-v01_03-en.pdf?fileId=db3a30433f764301013f7fe8a925463c\n$ENDCMP\n#\n$CMP BSF450NE7NH3\nD 15A Id, 75V Vds, 45mOhm Rds, N-Channel MOSFET, DirectFET ST\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSF450NE7NH3-DS-v02_02-EN.pdf?fileId=db3a30433a047ba0013a687e2ae403da\n$ENDCMP\n#\n$CMP BSN20\nD 0.5A Id, 50V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ds31898.pdf\n$ENDCMP\n#\n$CMP BSP129\nD 0.35A Id, 240V Vds, N-Channel MOSFET, SOT-223\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSP129-DS-v01_42-en.pdf?fileId=db3a30433c1a8752013c1fc296d2395f\n$ENDCMP\n#\n$CMP BSP89\nD 0.35A Id, 240V Vds, N-Channel Enhancement Mode MOSFET, SOT-223\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSP89-DS-v02_02-en.pdf?fileId=db3a30433b47825b013b4b8a07f90d55\n$ENDCMP\n#\n$CMP BSR56\nD 50mA min, 40V, 25mOhm max, 4-10V Vgs(off), N-Channel JFET, SOT-23\nK N-Channel FET Transistor\nF https://www.nxp.com/docs/en/data-sheet/BSR56_57_58.pdf\n$ENDCMP\n#\n$CMP BSR57\nD 20mA min, 40V, 40mOhm max, 2-6V Vgs(off), N-Channel JFET, SOT-23\nK N-Channel FET Transistor\nF https://www.nxp.com/docs/en/data-sheet/BSR56_57_58.pdf\n$ENDCMP\n#\n$CMP BSR58\nD 80mA min, 40V, 60mOhm max, 0.8-4V Vgs(off), N-Channel JFET, SOT-23\nK N-Channel FET Transistor\nF https://www.nxp.com/docs/en/data-sheet/BSR56_57_58.pdf\n$ENDCMP\n#\n$CMP BSS123\nD 0.17A Id, 100V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ds30366.pdf\n$ENDCMP\n#\n$CMP BSS127S\nD 0.07A Id, 600V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/BSS127.pdf\n$ENDCMP\n#\n$CMP BSS138\nD 50V Vds, 0.22A Id, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF https://www.fairchildsemi.com/datasheets/BS/BSS138.pdf\n$ENDCMP\n#\n$CMP BSS214NW\nD 20V Vds, 1.5A Id, N-Channel MOSFET, SOT-323\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-BSS214NW-DS-v02_02-en.pdf?fileId=db3a30431b3e89eb011b695aebc01bde\n$ENDCMP\n#\n$CMP BSS83P\nD -0.33A Id, -60V Vds, P-Channel MOSFET, SOT-23\nK P-Channel MOSFET\nF http://www.farnell.com/datasheets/1835997.pdf\n$ENDCMP\n#\n$CMP BSS84\nD -0.13A Id, -50V Vds, P-Channel MOSFET, SOT-23\nK P-Channel MOSFET\nF http://assets.nexperia.com/documents/data-sheet/BSS84.pdf\n$ENDCMP\n#\n$CMP BUK7M10-40EX\nD 56A Id, 40V Vds, N-Channel TrenchMOS MOSFET, 10mOhm Ron, 19.5nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M10-40E.pdf\n$ENDCMP\n#\n$CMP BUK7M12-40EX\nD 48A Id, 40V Vds, N-Channel TrenchMOS MOSFET, 12mOhm Ron, 15.8nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M12-40E.pdf\n$ENDCMP\n#\n$CMP BUK7M12-60EX\nD 53A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 12mOhm Ron, 24.8nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M12-60E.pdf\n$ENDCMP\n#\n$CMP BUK7M15-60EX\nD 42.9A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 15mOhm Ron, 19.4nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M15-60E.pdf\n$ENDCMP\n#\n$CMP BUK7M17-80EX\nD 43A Id, 80V Vds, N-Channel TrenchMOS MOSFET, 17mOhm Ron, 29.6nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M17-80E.pdf\n$ENDCMP\n#\n$CMP BUK7M19-60EX\nD 35.8A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 19mOhm Ron, 17.3nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M19-60E.pdf\n$ENDCMP\n#\n$CMP BUK7M21-40EX\nD 33A Id, 40V Vds, N-Channel TrenchMOS MOSFET, 21mOhm Ron, 10.7nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M21-40E.pdf\n$ENDCMP\n#\n$CMP BUK7M22-80EX\nD 37A Id, 80V Vds, N-Channel TrenchMOS MOSFET, 22mOhm Ron, 23.9nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M22-80E.pdf\n$ENDCMP\n#\n$CMP BUK7M27-80EX\nD 30A Id, 80V Vds, N-Channel TrenchMOS MOSFET, 27mOhm Ron, 19.5nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M27-80E.pdf\n$ENDCMP\n#\n$CMP BUK7M33-60EX\nD 24A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 33mOhm Ron, 10.9nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M33-60E.pdf\n$ENDCMP\n#\n$CMP BUK7M42-60EX\nD 20A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 42mOhm Ron, 9nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M42-60E.pdf\n$ENDCMP\n#\n$CMP BUK7M45-40EX\nD 19A Id, 40V Vds, N-Channel TrenchMOS MOSFET, 45mOhm Ron, 6.2nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M45-40E.pdf\n$ENDCMP\n#\n$CMP BUK7M67-60EX\nD 14A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 67mOhm Ron, 6.7nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M67-60E.pdf\n$ENDCMP\n#\n$CMP BUK7M6R3-40EX\nD 70A Id, 40V Vds, N-Channel TrenchMOS MOSFET, 6.3mOhm Ron, 28.1nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M6R3-40E.pdf\n$ENDCMP\n#\n$CMP BUK7M8R0-40EX\nD 69A Id, 40V Vds, N-Channel TrenchMOS MOSFET, 8mOhm Ron, 23.8nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M8R0-40E.pdf\n$ENDCMP\n#\n$CMP BUK7M9R9-60EX\nD 60A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 9.9mOhm Ron, 30.1nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK7M9R9-60E.pdf\n$ENDCMP\n#\n$CMP BUK9M10-30EX\nD 54A Id, 30V Vds, N-Channel TrenchMOS MOSFET, 7.8mOhm Ron, 12.2nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M10-30E.pdf\n$ENDCMP\n#\n$CMP BUK9M11-40EX\nD 53A Id, 40V Vds, N-Channel TrenchMOS MOSFET, 9mOhm Ron, 13.4nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M11-40E.pdf\n$ENDCMP\n#\n$CMP BUK9M12-60EX\nD 54A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 11mOhm Ron, - Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M12-60E.pdf\n$ENDCMP\n#\n$CMP BUK9M120-100EX\nD 11.5A Id, 100V Vds, N-Channel TrenchMOS MOSFET, 119mOhm Ron, 8.8nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M120-100E.pdf\n$ENDCMP\n#\n$CMP BUK9M14-40EX\nD 44A Id, 40V Vds, N-Channel TrenchMOS MOSFET, 11mOhm Ron, 11.3nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M14-40E.pdf\n$ENDCMP\n#\n$CMP BUK9M15-60EX\nD 47A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 13mOhm Ron, 17nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M15-60E.pdf\n$ENDCMP\n#\n$CMP BUK9M156-100EX\nD 9.3A Id, 100V Vds, N-Channel TrenchMOS MOSFET, 150mOhm Ron, 7.4nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M156-100E.pdf\n$ENDCMP\n#\n$CMP BUK9M17-30EX\nD 37A Id, 30V Vds, N-Channel TrenchMOS MOSFET, 14mOhm Ron, 8nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M17-30E.pdf\n$ENDCMP\n#\n$CMP BUK9M19-60EX\nD 38A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 17mOhm Ron, 13.8nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M19-60E.pdf\n$ENDCMP\n#\n$CMP BUK9M23-80EX\nD 37A Id, 80V Vds, N-Channel TrenchMOS MOSFET, 20mOhm Ron, 20nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M23-80E.pdf\n$ENDCMP\n#\n$CMP BUK9M24-40EX\nD 30A Id, 40V Vds, N-Channel TrenchMOS MOSFET, 20mOhm Ron, 7.7nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M24-40E.pdf\n$ENDCMP\n#\n$CMP BUK9M24-60EX\nD 32A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 21mOhm Ron, 12.4nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M24-60E.pdf\n$ENDCMP\n#\n$CMP BUK9M28-80EX\nD 33A Id, 80V Vds, N-Channel TrenchMOS MOSFET, 25mOhm Ron, 16.7nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M28-80E.pdf\n$ENDCMP\n#\n$CMP BUK9M34-100EX\nD 29A Id, 100V Vds, N-Channel TrenchMOS MOSFET, 34mOhm Ron, 24.7nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M34-100E.pdf\n$ENDCMP\n#\n$CMP BUK9M35-80EX\nD 26A Id, 80V Vds, N-Channel TrenchMOS MOSFET, 31mOhm Ron, 13.5nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M35-80E.pdf\n$ENDCMP\n#\n$CMP BUK9M42-60EX\nD 22A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 37mOhm Ron, 8.3nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M42-60E.pdf\n$ENDCMP\n#\n$CMP BUK9M43-100EX\nD 25A Id, 100V Vds, N-Channel TrenchMOS MOSFET, 43mOhm Ron, 20.2nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M43-100E.pdf\n$ENDCMP\n#\n$CMP BUK9M52-40EX\nD 17.6A Id, 40V Vds, N-Channel TrenchMOS MOSFET, 40mOhm Ron, 4.5nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M52-40E.pdf\n$ENDCMP\n#\n$CMP BUK9M53-60EX\nD 17A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 46mOhm Ron, 6nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M53-60E.pdf\n$ENDCMP\n#\n$CMP BUK9M5R2-30EX\nD 70A Id, 30V Vds, N-Channel TrenchMOS MOSFET, 4.1mOhm Ron, 22.5nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M5R2-30E.pdf\n$ENDCMP\n#\n$CMP BUK9M6R6-30EX\nD 70A Id, 30V Vds, N-Channel TrenchMOS MOSFET, 5.3mOhm Ron, 18nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M6R6-30E.pdf\n$ENDCMP\n#\n$CMP BUK9M7R2-40EX\nD 70A Id, 40V Vds, N-Channel TrenchMOS MOSFET, 5.8mOhm Ron, 19.7nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M7R2-40E.pdf\n$ENDCMP\n#\n$CMP BUK9M85-60EX\nD 12.8A Id, 60V Vds, N-Channel TrenchMOS MOSFET, 73mOhm Ron, 4.4nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M85-60E.pdf\n$ENDCMP\n#\n$CMP BUK9M9R1-40EX\nD 64A Id, 40V Vds, N-Channel TrenchMOS MOSFET, 7.3mOhm Ron, 16.2nC Qqd, -55 to 175 °C, LFPAK33\nK Power MOSFET N-MOS\nF https://assets.nexperia.com/documents/data-sheet/BUK9M9R1-40E.pdf\n$ENDCMP\n#\n$CMP BUZ11\nD 30A Id, 50V Vds, N-Channel Power MOSFET, TO-220\nK N-Channel Power MOSFET\nF http://www.fairchildsemi.com/ds/BU/BUZ11.pdf\n$ENDCMP\n#\n$CMP C2M0025120D\nD 90A Id, 1200V Vds, 25mOhm, N-Channel SiC MOSFET, TO-247\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/161/C2M0025120D.pdf\n$ENDCMP\n#\n$CMP C2M0040120D\nD 60A Id, 1200V Vds, 40mOhm, N-Channel SiC MOSFET, TO-247\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/165/C2M0040120D.pdf\n$ENDCMP\n#\n$CMP C2M0045170D\nD 72A Id, 1700V Vds, 45mOhm, N-Channel SiC MOSFET, TO-247\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/960/C2M0045170D.000.pdf\n$ENDCMP\n#\n$CMP C2M0080120D\nD 36A Id, 1200V Vds, 80mOhm, N-Channel SiC MOSFET, TO-247\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/167/C2M0080120D.pdf\n$ENDCMP\n#\n$CMP C2M0160120D\nD 19A Id, 1200V Vds, 160mOhm, N-Channel SiC MOSFET, TO-247\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/169/C2M0160120D.pdf\n$ENDCMP\n#\n$CMP C2M0280120D\nD 10A Id, 1200V Vds, 280mOhm, N-Channel SiC MOSFET, TO-247\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/171/C2M0280120D.pdf\n$ENDCMP\n#\n$CMP C2M1000170D\nD 5A Id, 1700V Vds, 1000mOhm, N-Channel SiC MOSFET, TO-247\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/173/C2M1000170D.pdf\n$ENDCMP\n#\n$CMP C2M1000170J\nD 5.3A Id, 1700V Vds, 1000mOhm, N-Channel SiC MOSFET, TO-263-7\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/820/C2M1000170J.pdf\n$ENDCMP\n#\n$CMP C3M0030090K\nD 63A Id, 900V Vds, 30mOhm, N-Channel SiC MOSFET, TO-247-4\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/1185/C3M0030090K.pdf\n$ENDCMP\n#\n$CMP C3M0065090D\nD 36A Id, 900V Vds, 65mOhm, N-Channel SiC MOSFET, TO-247\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/176/C3M0065090D.pdf\n$ENDCMP\n#\n$CMP C3M0065090J\nD 35A Id, 900V Vds, 65mOhm, N-Channel SiC MOSFET, TO-263-7\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/145/C3M0065090J.pdf\n$ENDCMP\n#\n$CMP C3M0065100J\nD 35A Id, 1000V Vds, 65mOhm, N-Channel SiC MOSFET, TO-263-7\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/958/C3M0065100J.pdf\n$ENDCMP\n#\n$CMP C3M0065100K\nD 35A Id, 1000V Vds, 65mOhm, N-Channel SiC MOSFET, TO-247-4\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/961/C3M0065100K.pdf\n$ENDCMP\n#\n$CMP C3M0075120J\nD 30A Id, 1200V Vds, 75mOhm, N-Channel SiC MOSFET, TO-263-7\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/997/C3M0075120J.pdf\n$ENDCMP\n#\n$CMP C3M0075120K\nD 30A Id, 1200V Vds, 75mOhm, N-Channel SiC MOSFET, TO-247-4\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/959/c3m0075120k.pdf\n$ENDCMP\n#\n$CMP C3M0120090D\nD 23A Id, 900V Vds, 120mOhm, N-Channel SiC MOSFET, TO-247\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/824/C3M0120090D.pdf\n$ENDCMP\n#\n$CMP C3M0120090J\nD 22A Id, 900V Vds, 120mOhm, N-Channel SiC MOSFET, TO-263-7\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/834/C3M0120090J.pdf\n$ENDCMP\n#\n$CMP C3M0120100J\nD 22A Id, 1000V Vds, 120mOhm, N-Channel SiC MOSFET, TO-263-7\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/957/C3M0120100J.pdf\n$ENDCMP\n#\n$CMP C3M0120100K\nD 22A Id, 1000V Vds, 120mOhm, N-Channel SiC MOSFET, TO-247-4\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/962/C3M0120100K.pdf\n$ENDCMP\n#\n$CMP C3M0280090D\nD 11.5A Id, 900V Vds, 280mOhm, N-Channel SiC MOSFET, TO-247\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/825/C3M0280090D.pdf\n$ENDCMP\n#\n$CMP C3M0280090J\nD 11.5A Id, 900V Vds, 280mOhm, N-Channel SiC MOSFET, TO-263-7\nK N-Channel SiC MOSFET\nF https://www.wolfspeed.com/media/downloads/835/C3M0280090J.pdf\n$ENDCMP\n#\n$CMP CSD16301Q2\nD 5A Id, 25V Vds, NexFET N-Channel Power MOSFET, 19mOhm Ron, SON-6\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/ds/symlink/csd16301q2.pdf\n$ENDCMP\n#\n$CMP CSD16321Q5\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 2.6mOhm Ron, 14nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16321q5\n$ENDCMP\n#\n$CMP CSD16322Q5\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 5.8mOhm Ron, Qg (typ) 6.8nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16322q5\n$ENDCMP\n#\n$CMP CSD16325Q5\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 2.2mOhm Ron, 18nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16325q5\n$ENDCMP\n#\n$CMP CSD16342Q5A\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 5.5mOhm Ron, Qg (typ) 6.5nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16342q5a\n$ENDCMP\n#\n$CMP CSD16401Q5\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 1.6mOhm Ron, 21nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16401q5\n$ENDCMP\n#\n$CMP CSD16403Q5A\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 2.8mOhm Ron, Qg (typ) 13.3nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16403q5a\n$ENDCMP\n#\n$CMP CSD16404Q5A\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 5.1mOhm Ron, Qg (typ) 6.5nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16404q5a\n$ENDCMP\n#\n$CMP CSD16407Q5\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 2.4mOhm Ron, Qg (typ) 13.3nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16407q5\n$ENDCMP\n#\n$CMP CSD16408Q5\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 4.5mOhm Ron, Qg (typ) 6.7nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16408q5\n$ENDCMP\n#\n$CMP CSD16410Q5A\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 8.5mOhm Ron, Qg (typ) 3.9nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16410q5a\n$ENDCMP\n#\n$CMP CSD16412Q5A\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 11mOhm Ron, Qg (typ) 2.9nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16412q5a\n$ENDCMP\n#\n$CMP CSD16413Q5A\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 3.9mOhm Ron, 9nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16413q5a\n$ENDCMP\n#\n$CMP CSD16414Q5\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 1.9mOhm Ron, Qg (typ) 16.6nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16414q5\n$ENDCMP\n#\n$CMP CSD16415Q5\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 1.15mOhm Ron, 21nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16415q5\n$ENDCMP\n#\n$CMP CSD16570Q5B\nD 100A Id, 25V Vds, NexFET N-Channel Power MOSFET, 0.59mOhm Ron, 95nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd16570q5b\n$ENDCMP\n#\n$CMP CSD17301Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 3mOhm Ron, 19nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17301q5a\n$ENDCMP\n#\n$CMP CSD17302Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 9mOhm Ron, Qg (typ) 5.4nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17302q5a\n$ENDCMP\n#\n$CMP CSD17303Q5\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 2.6mOhm Ron, 18nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17303q5\n$ENDCMP\n#\n$CMP CSD17305Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 2.8mOhm Ron, Qg (typ) 14.1nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17305q5a\n$ENDCMP\n#\n$CMP CSD17306Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 4.2mOhm Ron, Qg (typ) 11.8nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17306q5a\n$ENDCMP\n#\n$CMP CSD17307Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 12.1mOhm Ron, 4nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17307q5a\n$ENDCMP\n#\n$CMP CSD17310Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 5.9mOhm Ron, Qg (typ) 8.9nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17310q5a\n$ENDCMP\n#\n$CMP CSD17311Q5\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 2.3mOhm Ron, 24nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17311q5\n$ENDCMP\n#\n$CMP CSD17312Q5\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 1.7mOhm Ron, 28nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17312q5\n$ENDCMP\n#\n$CMP CSD17313Q2\nD 5A Id, 30V Vds, NexFET N-Channel Power MOSFET, 24mOhm Ron, SON-6\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/ds/symlink/csd17313q2.pdf\n$ENDCMP\n#\n$CMP CSD17322Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 12.4mOhm Ron, Qg (typ) 3.6nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17322q5a\n$ENDCMP\n#\n$CMP CSD17327Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 15.5mOhm Ron, Qg (typ) 2.8nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17327q5a\n$ENDCMP\n#\n$CMP CSD17501Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 2.9mOhm Ron, Qg (typ) 13.2nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17501q5a\n$ENDCMP\n#\n$CMP CSD17505Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 3.5mOhm Ron, 10nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17505q5a\n$ENDCMP\n#\n$CMP CSD17506Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 4mOhm Ron, Qg (typ) 8.3nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17506q5a\n$ENDCMP\n#\n$CMP CSD17507Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 10.8mOhm Ron, Qg (typ) 2.8nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17507q5a\n$ENDCMP\n#\n$CMP CSD17510Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 5.2mOhm Ron, Qg (typ) 6.4nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17510q5a\n$ENDCMP\n#\n$CMP CSD17522Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 8.1mOhm Ron, Qg (typ) 3.6nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17522q5a\n$ENDCMP\n#\n$CMP CSD17527Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 10.8mOhm Ron, Qg (typ) 2.8nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17527q5a\n$ENDCMP\n#\n$CMP CSD17551Q5A\nD 48A Id, 30V Vds, NexFET N-Channel Power MOSFET, 8.8mOhm Ron, 6nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17551q5a\n$ENDCMP\n#\n$CMP CSD17552Q5A\nD 60A Id, 30V Vds, NexFET N-Channel Power MOSFET, 6.2mOhm Ron, 9nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17552q5a\n$ENDCMP\n#\n$CMP CSD17553Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 3.1mOhm Ron, Qg (typ) 17.5nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17553q5a\n$ENDCMP\n#\n$CMP CSD17555Q5A\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 2.7mOhm Ron, 23nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17555q5a\n$ENDCMP\n#\n$CMP CSD17556Q5B\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 1.4mOhm Ron, Qg (typ) 28.5nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17556q5b\n$ENDCMP\n#\n$CMP CSD17559Q5\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 1.15mOhm Ron, 39nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17559q5\n$ENDCMP\n#\n$CMP CSD17570Q5B\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 0.69mOhm Ron, 93nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17570q5b\n$ENDCMP\n#\n$CMP CSD17573Q5B\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 1mOhm Ron, 49nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17573q5b\n$ENDCMP\n#\n$CMP CSD17576Q5B\nD 100A Id, 30V Vds, NexFET N-Channel Power MOSFET, 2mOhm Ron, 25nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17576q5b\n$ENDCMP\n#\n$CMP CSD17577Q5A\nD 60A Id, 30V Vds, NexFET N-Channel Power MOSFET, 4.2mOhm Ron, 13nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17577q5a\n$ENDCMP\n#\n$CMP CSD17578Q5A\nD 25A Id, 30V Vds, NexFET N-Channel Power MOSFET, 6.9mOhm Ron, Qg (typ) 7.9nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17578q5a\n$ENDCMP\n#\n$CMP CSD17579Q5A\nD 25A Id, 30V Vds, NexFET N-Channel Power MOSFET, 9.7mOhm Ron, Qg (typ) 5.4nC, SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd17579q5a\n$ENDCMP\n#\n$CMP CSD18501Q5A\nD 100A Id, 40V Vds, NexFET N-Channel Power MOSFET, 3.2mOhm Ron, 42nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18501q5a\n$ENDCMP\n#\n$CMP CSD18502Q5B\nD 100A Id, 40V Vds, NexFET N-Channel Power MOSFET, 2.3mOhm Ron, 52nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18502q5b\n$ENDCMP\n#\n$CMP CSD18503Q5A\nD 100A Id, 40V Vds, NexFET N-Channel Power MOSFET, 4.3mOhm Ron, 26nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18503q5a\n$ENDCMP\n#\n$CMP CSD18504Q5A\nD 50A Id, 40V Vds, NexFET N-Channel Power MOSFET, 6.6mOhm Ron, 16nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18504q5a\n$ENDCMP\n#\n$CMP CSD18509Q5B\nD 100A Id, 40V Vds, NexFET N-Channel Power MOSFET, 1.2mOhm Ron, 150nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18509q5b\n$ENDCMP\n#\n$CMP CSD18531Q5A\nD 100A Id, 60V Vds, NexFET N-Channel Power MOSFET, 4.6mOhm Ron, 36nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18531q5a\n$ENDCMP\n#\n$CMP CSD18532NQ5B\nD 100A Id, 60V Vds, NexFET N-Channel Power MOSFET, 3.4mOhm Ron, 49nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18532nq5b\n$ENDCMP\n#\n$CMP CSD18532Q5B\nD 100A Id, 60V Vds, NexFET N-Channel Power MOSFET, 3.2mOhm Ron, 44nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18532q5b\n$ENDCMP\n#\n$CMP CSD18533Q5A\nD 100A Id, 60V Vds, NexFET N-Channel Power MOSFET, 5.9mOhm Ron, 29nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18533q5a\n$ENDCMP\n#\n$CMP CSD18534Q5A\nD 50A Id, 60V Vds, NexFET N-Channel Power MOSFET, 9.8mOhm Ron, 17nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18534q5a\n$ENDCMP\n#\n$CMP CSD18537NQ5A\nD 50A Id, 60V Vds, NexFET N-Channel Power MOSFET, 13mOhm Ron, 14nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18537nq5a\n$ENDCMP\n#\n$CMP CSD18540Q5B\nD 100A Id, 60V Vds, NexFET N-Channel Power MOSFET, 2.2mOhm Ron, 41nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18540q5b\n$ENDCMP\n#\n$CMP CSD18563Q5A\nD 100A Id, 60V Vds, NexFET N-Channel Power MOSFET, 6.8mOhm Ron, 15nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd18563q5a\n$ENDCMP\n#\n$CMP CSD19502Q5B\nD 100A Id, 80V Vds, NexFET N-Channel Power MOSFET, 4.1mOhm Ron, 48nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd19502q5b\n$ENDCMP\n#\n$CMP CSD19531Q5A\nD 100A Id, 100V Vds, NexFET N-Channel Power MOSFET, 6.4mOhm Ron, 37nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd19531q5a\n$ENDCMP\n#\n$CMP CSD19532Q5B\nD 100A Id, 100V Vds, NexFET N-Channel Power MOSFET, 4.9mOhm Ron, 48nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd19532q5b\n$ENDCMP\n#\n$CMP CSD19533Q5A\nD 100A Id, 100V Vds, NexFET N-Channel Power MOSFET, 9.5mOhm Ron, 27nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd19533q5a\n$ENDCMP\n#\n$CMP CSD19534Q5A\nD 50A Id, 100V Vds, NexFET N-Channel Power MOSFET, 15.1mOhm Ron, 17nC Qg(typ), SON8 5x6mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/gpn/csd19534q5a\n$ENDCMP\n#\n$CMP CSD19537Q3\nD 50A Id, 100V Vds, NexFET N-Channel Power MOSFET, 13mOhm Ron, Qg Typ 16.0nC, VSON8 3.3x3.3mm\nK NexFET Power MOSFET N-MOS\nF http://www.ti.com/lit/ds/symlink/csd19537q3.pdf\n$ENDCMP\n#\n$CMP CSD25302Q2\nD 5A Id, 20V Vds, NexFET P-Channel Power MOSFET, 39mOhm Ron, SON-6\nK NexFET Power MOSFET P-MOS\nF https://www.ti.com/lit/ds/slps234b/slps234b.pdf\n$ENDCMP\n#\n$CMP DMC2053UVT\nD 4.6A/-3.2A Id, 20V Vds, Complementary pair enhancement mode P-Channel and N-Channel MOSFET, TSOT-23-6\nK complementary mosfet\nF https://www.diodes.com/assets/Datasheets/DMC2053UVT.pdf\n$ENDCMP\n#\n$CMP DMC3071LVT\nD 3.4A/-2.7A Id, 30V Vds, Complementary pair enhancement mode P-Channel and N-Channel MOSFET, TSOT-23-6\nK complementary mosfet\nF https://www.diodes.com/assets/Datasheets/DMC3071LVT.pdf\n$ENDCMP\n#\n$CMP DMG1012T\nD 20V Vds, 0.63 Id, N-Channel MOSFET with ESD protection, SOT-523\nK N-Channel MOSFET\nF https://www.diodes.com/assets/Datasheets/ds31783.pdf\n$ENDCMP\n#\n$CMP DMG2301L\nD -3A Id, -20V Vds, P-Channel MOSFET, SOT-23\nK P-Channel MOSFET\nF https://www.diodes.com/assets/Datasheets/DMG2301L.pdf\n$ENDCMP\n#\n$CMP DMG2302U\nD 4.2A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMG2302U.pdf\n$ENDCMP\n#\n$CMP DMG3402L\nD 4A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMG3402L.pdf\n$ENDCMP\n#\n$CMP DMG3404L\nD 5.8A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMG3404L.pdf\n$ENDCMP\n#\n$CMP DMG3406L\nD 3.6A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMG3406L.pdf\n$ENDCMP\n#\n$CMP DMG3414U\nD 4.2A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ds31739.pdf\n$ENDCMP\n#\n$CMP DMG3418L\nD 4A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMG3418L.pdf\n$ENDCMP\n#\n$CMP DMN10H220L\nD 1.6A Id, 100V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN10H220L.pdf\n$ENDCMP\n#\n$CMP DMN10H700S\nD 0.7A Id, 100V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN10H700S.pdf\n$ENDCMP\n#\n$CMP DMN13H750S\nD 1A Id, 130V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN13H750S.pdf\n$ENDCMP\n#\n$CMP DMN2041L\nD 6.4A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF https://www.diodes.com/assets/Datasheets/products_inactive_data/DMN2041L.pdf\n$ENDCMP\n#\n$CMP DMN2050L\nD 5.9A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ds31502.pdf\n$ENDCMP\n#\n$CMP DMN2056U\nD 4A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN2056U.pdf\n$ENDCMP\n#\n$CMP DMN2058U\nD 4.6A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN2058U.pdf\n$ENDCMP\n#\n$CMP DMN2075U\nD 4.2A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN2075U.pdf\n$ENDCMP\n#\n$CMP DMN2230U\nD 2A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ds31180.pdf\n$ENDCMP\n#\n$CMP DMN24H11DS\nD 0.27A Id, 240V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN24H11DS.pdf\n$ENDCMP\n#\n$CMP DMN24H3D5L\nD 0.48A Id, 240V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN24H3D5L.pdf\n$ENDCMP\n#\n$CMP DMN3042L\nD 5.8A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN3042L.pdf\n$ENDCMP\n#\n$CMP DMN3051L\nD 5.8A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ds31347.pdf\n$ENDCMP\n#\n$CMP DMN30H4D0L\nD 0.25A Id, 300V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN30H4D0L.pdf\n$ENDCMP\n#\n$CMP DMN3110S\nD 3.3A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN3110S.pdf\n$ENDCMP\n#\n$CMP DMN3150L\nD 3.8A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ds31126.pdf\n$ENDCMP\n#\n$CMP DMN3300U\nD 2A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ds31181.pdf\n$ENDCMP\n#\n$CMP DMN3404L\nD 5.8A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ds31787.pdf\n$ENDCMP\n#\n$CMP DMN6075S\nD 2.5A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN6075S.pdf\n$ENDCMP\n#\n$CMP DMN6140L\nD 2.3A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN6140L.pdf\n$ENDCMP\n#\n$CMP DMN67D7L\nD 0.21A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN67D7L.pdf\n$ENDCMP\n#\n$CMP DMN67D8L\nD 0.21A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/DMN67D8L.pdf\n$ENDCMP\n#\n$CMP DMP3013SFV\nD -12A Id, -30V Vds, P-Channel Power MOSFET, 9.5mOhm Ron, 33.7nC Qg (typ), PowerDI3333-8\nK P-Channel MOSFET\nF https://www.diodes.com/assets/Datasheets/DMP3013SFV.pdf\n$ENDCMP\n#\n$CMP FDC6330L\nD -2.3A, 20V Vds, Integrated load switch, P-Channel MOSFET driven by small N-Channel MOSFET, TSOT-23-6\nK complementary mosfet\nF https://www.onsemi.com/pub/Collateral/FDC6330L-D.PDF\n$ENDCMP\n#\n$CMP FDG1024NZ\nD 1.2A Id, 20V Vds, Dual N-Channel MOSFET, 175mOhm Ron, SC-70-6\nK Dual N-Channel MOSFET Logic Level\nF http://www.fairchildsemi.com/ds/FD/FDG1024NZ.pdf\n$ENDCMP\n#\n$CMP FDG6335N\nD 0.7A Id, 20V Vds, Dual N-Channel MOSFET, 300mOhm Ron, SC-70-6\nK Dual N-Channel MOSFET\nF http://www.gneic.com/product/datasheet/FDG6335N-1122853.pdf\n$ENDCMP\n#\n$CMP FDMC8032L\nD 7A Id, 40V Vds, Dual N-Channel MOSFET, 20mOhm Ron, Power33 Package\nK Dual N-Channel MOSFET\nF https://www.fairchildsemi.com/datasheets/FD/FDMC8032L.pdf\n$ENDCMP\n#\n$CMP FDMS8050\nD 55A Id, 30V Vds, N-Channel PowerTrench MOSFET, 0.65mOhm Ron, 285nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS8050.pdf\n$ENDCMP\n#\n$CMP FDMS8050ET30\nD 55A Id, 30V Vds, N-Channel PowerTrench MOSFET, 0.65mOhm Ron, 285nC Qgmax, -55 to 175 °C, 5x6mm SON8\nK powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS8050ET30.pdf\n$ENDCMP\n#\n$CMP FDMS8350L\nD 47A Id, 40V Vds, N-Channel PowerTrench MOSFET, 0.85mOhm Ron, 242nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS8350L.pdf\n$ENDCMP\n#\n$CMP FDMS8350LET40\nD 49A Id, 40V Vds, N-Channel PowerTrench MOSFET, 0.85mOhm Ron, 242nC Qgmax, -55 to 175 °C, 5x6mm SON8\nK powertrench-MOSFET MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS8350LET40.pdf\n$ENDCMP\n#\n$CMP FDMS86150\nD 16A Id, 100V Vds, N-Channel PowerTrench MOSFET, 4.85mOhm Ron, 62nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS86150.pdf\n$ENDCMP\n#\n$CMP FDMS86150ET100\nD 16A Id, 100V Vds, N-Channel PowerTrench MOSFET, 4.85mOhm Ron, 62nC Qgmax, -55 to 175 °C, 5x6mm SON8\nK powertrench-MOSFET MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS86150ET100.pdf\n$ENDCMP\n#\n$CMP FDMS86152\nD 14A Id, 100V Vds, N-Channel PowerTrench MOSFET, 6mOhm Ron, 50nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS86152.pdf\n$ENDCMP\n#\n$CMP FDMS86202\nD 13.5A Id, 120V Vds, N-Channel Shielded Gate PowerTrench MOSFET, 7.2mOhm Ron, 64nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK shielded-gate-powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS86202.pdf\n$ENDCMP\n#\n$CMP FDMS86202ET120\nD 13.5A Id, 120V Vds, N-Channel Shielded Gate PowerTrench MOSFET, 7.2mOhm Ron, 64nC Qgmax, -55 to 175 °C, 5x6mm SON8\nK shielded-gate-powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS86202ET120.pdf\n$ENDCMP\n#\n$CMP FDMS86255\nD 10A Id, 150V Vds, N-Channel Shielded Gate PowerTrench MOSFET, 12.4mOhm Ron, 63nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK shielded-gate-powertrench-MOSFET MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS86255.pdf\n$ENDCMP\n#\n$CMP FDMS86255ET150\nD 10A Id, 150V Vds, N-Channel Shielded Gate PowerTrench MOSFET, 12.4mOhm Ron, 63nC Qgmax, -55 to 175 °C, 5x6mm SON8\nK shielded-gate-powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS86255ET150.pdf\n$ENDCMP\n#\n$CMP FDMS86350\nD 25A Id, 80V Vds, N-Channel PowerTrench MOSFET, 2.4mOhm Ron, 155nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS86350.pdf\n$ENDCMP\n#\n$CMP FDMS86350ET80\nD 25A Id, 80V Vds, N-Channel PowerTrench MOSFET, 2.4mOhm Ron, 155nC Qgmax, -55 to 175 °C, 5x6mm SON8\nK powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS86350ET80.pdf\n$ENDCMP\n#\n$CMP FDMS86550\nD 32A Id, 60V Vds, N-Channel PowerTrench MOSFET, 1.65mOhm Ron, 154nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS86550.pdf\n$ENDCMP\n#\n$CMP FDMS86550ET60\nD 32A Id, 60V Vds, N-Channel PowerTrench MOSFET, 1.65mOhm Ron, 154nC Qgmax, -55 to 175 °C, 5x6mm SON8\nK powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMS86550ET60.pdf\n$ENDCMP\n#\n$CMP FDMT800100DC\nD 24A Id, 100V Vds, N-Channel Dual Cool PowerTrench MOSFET, 2.95mOhm Ron, 111nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK dual-cool-powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMT800100DC.pdf\n$ENDCMP\n#\n$CMP FDMT800120DC\nD 20A Id, 120V Vds, N-Channel Dual cool 88 PowerTrench MOSFET, 4.2mOhm Ron, 107nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK dual-cool-powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMT800120DC.pdf\n$ENDCMP\n#\n$CMP FDMT800150DC\nD 15A Id, 150V Vds, N-Channel Dual cool PowerTrench MOSFET, 6.5mOhm Ron, 108nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK dual-cool-powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMT800150DC.pdf\n$ENDCMP\n#\n$CMP FDMT800152DC\nD 13A Id, 150V Vds, N-Channel Dual Cool PowerTrench MOSFET, 9.0mOhm Ron, 83nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK dual-cool-powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMT800152DC.pdf\n$ENDCMP\n#\n$CMP FDMT80060DC\nD 43A Id, 60V Vds, N-Channel Dual Cool PowerTrench MOSFET, 1.1mOhm Ron, 238nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK dual-cool-powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMT80060DC.pdf\n$ENDCMP\n#\n$CMP FDMT80080DC\nD 36A Id, 80V Vds, N-Channel Dual Cool PowerTrench MOSFET, 1.35mOhm Ron, 273nC Qgmax, -55 to 150 °C, 5x6mm SON8\nK dual-cool-powertrench MOSFET fairchild\nF https://www.fairchildsemi.com/datasheets/FD/FDMT80080DC.pdf\n$ENDCMP\n#\n$CMP FDS2734\nD 3.0A Id, 250V Vds, N-Channel MOSFET, 117mOhm Ron, SOIC-8\nK N-Channel MOSFET\nF http://www.onsemi.com/pub/Collateral/FDS2734-D.pdf\n$ENDCMP\n#\n$CMP FDS4559\nD 4.5A Id, 60V Vds, Dual N and P Channel MOSFET, 55mOhm Ron, 10V Vgs, SO8L\nK Dual N-Channel P-Channel MOSFET\nF https://www.fairchildsemi.com/datasheets/FD/FDS4559.pdf\n$ENDCMP\n#\n$CMP FDS4897AC\nD 6.1A Id, 40V Vds, Dual N and P Channel MOSFET, 26mOhm Ron, 10V Vgs, SO8L\nK Dual N-Channel P-Channel MOSFET\nF https://www.fairchildsemi.com/datasheets/FD/FDS4897AC.pdf\n$ENDCMP\n#\n$CMP FDS4897C\nD 6.2A Id, 40V Vds, Dual N and P Channel MOSFET, 29mOhm Ron, 10V Vgs, SO8L\nK Dual N-Channel P-Channel MOSFET\nF https://www.fairchildsemi.com/datasheets/FD/FDS4897C.pdf\n$ENDCMP\n#\n$CMP FDS6630A\nD 6.5A Id, 30V Vds, N-Channel MOSFET, 38mOhm Ron, SOIC-8\nK N-Channel MOSFET\nF http://www.onsemi.com/pub/Collateral/FDS6630A-D.pdf\n$ENDCMP\n#\n$CMP FDS6890A\nD 7.5A Id, 20V Vds, Dual N-Channel MOSFET, 18mOhm Ron, SO-8\nK Dual N-Channel MOSFET\nF http://www.fairchildsemi.com/ds/FD/FDS6890A.pdf\n$ENDCMP\n#\n$CMP FDS6892A\nD 7.5A Id, 20V Vds, Dual N-Channel MOSFET PWM Optimized, 18mOhm Ron, SO-8\nK Dual N-Channel MOSFET Low Gate Charge\nF http://www.fairchildsemi.com/ds/FD/FDS6892A.pdf\n$ENDCMP\n#\n$CMP FDS6898A\nD 9.4A Id, 20V Vds, Dual N-Channel MOSFET, 14mOhm Ron, SO-8\nK Dual N-Channel MOSFET\nF http://www.fairchildsemi.com/ds/FD/FDS6898A.pdf\n$ENDCMP\n#\n$CMP FDS6930A\nD 5.5A Id, 30V Vds, Dual N-Channel Logic Level MOSFET, 40mOhm Ron, SO-8\nK Dual N-Channel MOSFET\nF http://www.onsemi.com/pub/Collateral/FDS6930A-D.PDF\n$ENDCMP\n#\n$CMP FDS6930B\nD 5.5A Id, 30V Vds, Dual N-Channel Logic Level MOSFET, 38mOhm Ron, SO-8\nK Dual N-Channel MOSFET\nF http://www.onsemi.com/pub/Collateral/FDS6930B-D.PDF\n$ENDCMP\n#\n$CMP FDS8960C\nD 7A Id, 35V Vds, Dual N and P Channel MOSFET, 24mOhm Ron, 10V Vgs, SO8L\nK Dual N-Channel P-Channel MOSFET\nF https://www.fairchildsemi.com/datasheets/FD/FDS8960C.pdf\n$ENDCMP\n#\n$CMP FDS9435A\nD -5.3A Id, -30V Vds, P-Channel MOSFET, 50mOhm Ron, SO-8\nK P-Channel MOSFET\nF https://www.onsemi.com/pub/Collateral/FDS9435A-D.PDF\n$ENDCMP\n#\n$CMP FDS9926A\nD 6.5A Id, 20V Vds, Dual N-Channel MOSFET, 30mOhm Ron, SO-8\nK Dual N-Channel MOSFET\nF http://www.fairchildsemi.com/ds/FD/FDS9926A.pdf\n$ENDCMP\n#\n$CMP FDS9934C\nD 6.5A Id, 20V Vds, Dual N and P Channel MOSFET, 30mOhm Ron, 4.5V Vgs, SO8L\nK Dual N-Channel P-Channel MOSFET\nF https://www.fairchildsemi.com/datasheets/FD/FDS9934C.pdf\n$ENDCMP\n#\n$CMP FQP27P06\nD -27A Id, -60V Vds, QFET P-Channel MOSFET, TO-220\nK QFET P-Channel MOSFET\nF https://www.onsemi.com/pub/Collateral/FQP27P06-D.PDF\n$ENDCMP\n#\n$CMP IPD50R380CE\nD 14.1A Id, 500V Vds, CoolMOS N-Channel Power MOSFET, 380mOhm Ron, 24.8nC Qg (typ), TO-252-2\nK CoolMOS Power MOSFET N-MOS\nF https://www.infineon.com/dgdl/Infineon-IPD50R380CE-DS-v02_01-en.pdf?fileId=db3a30433ecb86d4013ed0a2ef580f38\n$ENDCMP\n#\n$CMP IPD50R3K0CE\nD 1.7A Id, 500V Vds, CoolMOS N-Channel Power MOSFET, 3Ohm Ron, 4.3nC Qg (typ), TO-252-2\nK CoolMOS Power MOSFET N-MOS\nF https://www.infineon.com/dgdl/IPx50R3K0CE_2_0.pdf?folderId=db3a3043163797a6011637d4bae7003b&fileId=db3a304339dcf4b10139e7e9ff592ce4\n$ENDCMP\n#\n$CMP IPDD60R050G7\nD 47A Id, 600V Vds, 50mOhm, N-Channel MOSFET, CoolMOS G7, PG-HDSOP-10-1 (DDPAK)\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IPDD60R050G7-DS-v02_00-EN.pdf?fileId=5546d4626102d35a0161707eb2f97810\n$ENDCMP\n#\n$CMP IPDD60R080G7\nD 29A Id, 600V Vds, 80mOhm, N-Channel MOSFET, CoolMOS G7, PG-HDSOP-10-1 (DDPAK)\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IPDD60R080G7-DS-v02_00-EN.pdf?fileId=5546d4626102d35a016170882f757a07\n$ENDCMP\n#\n$CMP IPDD60R102G7\nD 23A Id, 600V Vds, 102mOhm, N-Channel MOSFET, CoolMOS G7, PG-HDSOP-10-1 (DDPAK)\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IPDD60R102G7-DS-v02_00-EN.pdf?fileId=5546d4626102d35a01617087ee7379ed\n$ENDCMP\n#\n$CMP IPDD60R125G7\nD 20A Id, 600V Vds, 125mOhm, N-Channel MOSFET, CoolMOS G7, PG-HDSOP-10-1 (DDPAK)\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IPDD60R125G7-DS-v02_00-EN.pdf?fileId=5546d4626102d35a0161706cba27778f\n$ENDCMP\n#\n$CMP IPDD60R150G7\nD 16A Id, 600V Vds, 150mOhm, N-Channel MOSFET, CoolMOS G7, PG-HDSOP-10-1 (DDPAK)\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IPDD60R150G7-DS-v02_00-EN.pdf?fileId=5546d4626102d35a016170806aa57863\n$ENDCMP\n#\n$CMP IPDD60R190G7\nD 13A Id, 600V Vds, 190mOhm, N-Channel MOSFET, CoolMOS G7, PG-HDSOP-10-1 (DDPAK)\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IPDD60R190G7-DS-v02_00-EN.pdf?fileId=5546d4626102d35a01617087dc0f79ea\n$ENDCMP\n#\n$CMP IPP060N06N\nD 45A Id, 60V Vds, Single N-Channel Power MOSFET, 6mOhm Ron, TO-220\nK N-Channel Power MOSFET Infineon\nF https://www.infineon.com/dgdl/Infineon-IPP060N06N-DS-v02_02-en.pdf?fileId=db3a30433727a44301372c06d9d7498a\n$ENDCMP\n#\n$CMP IPT012N08N5\nD 300A Id, 80V Vds, OptiMOS N-Channel Power MOSFET, 1.2mOhm Ron, Qg (typ) 178.0nC, PG-HSOF-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-IPT012N08N5-DS-v02_01-EN.pdf?fileId=5546d4624a75e5f1014aca59127a1eb9\n$ENDCMP\n#\n$CMP IPT015N10N5\nD 300A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 1.5mOhm Ron, Qg (typ) 169.0nC, PG-HSOF-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-IPT015N10N5-DS-v02_01-EN.pdf?fileId=5546d4624a75e5f1014ac94680661aff\n$ENDCMP\n#\n$CMP IPT020N10N3\nD 300A Id, 100V Vds, OptiMOS N-Channel Power MOSFET, 2.0mOhm Ron, Qg (typ) 156.0nC, PG-HSOF-8\nK OptiMOS Power MOSFET N-MOS\nF http://www.infineon.com/dgdl/Infineon-IPT020N10N3-DS-v02_00-en.pdf?fileId=db3a30433e9d5d11013e9e58035b0158\n$ENDCMP\n#\n$CMP IRF3205\nD 110A Id, 55V Vds, Single N-Channel HEXFET Power MOSFET, 8mOhm Ron, TO-220AB\nK Single N-Channel HEXFET Power MOSFET\nF http://www.irf.com/product-info/datasheets/data/irf3205.pdf\n$ENDCMP\n#\n$CMP IRF40DM229\nD 159A Id, 40V Vds, 1.85mOhm Rds, N-Channel MOSFET, DirectFET MF\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IRF40DM229-DS-v02_00-EN.pdf?fileId=5546d462557e6e890155a15c899160ea\n$ENDCMP\n#\n$CMP IRF4905\nD -74A Id, -55V Vds, Single P-Channel HEXFET Power MOSFET, 20mOhm Ron, TO-220AB\nK Single P-Channel HEXFET Power MOSFET\nF http://www.infineon.com/dgdl/irf4905.pdf?fileId=5546d462533600a4015355e32165197c\n$ENDCMP\n#\n$CMP IRF540N\nD 33A Id, 100V Vds, HEXFET N-Channel MOSFET, TO-220\nK HEXFET N-Channel MOSFET\nF http://www.irf.com/product-info/datasheets/data/irf540n.pdf\n$ENDCMP\n#\n$CMP IRF60DM206\nD 130A Id, 60V Vds, 2.9mOhm Rds, N-Channel MOSFET, DirectFET ME\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf60dm206.pdf?fileId=5546d462533600a4015355e433aa19ca\n$ENDCMP\n#\n$CMP IRF6613\nD 150A Id, 40V Vds, 3.4mOhm Rds, N-Channel MOSFET, DirectFET MT\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6613pbf.pdf?fileId=5546d462533600a4015355e82b9b1a0d\n$ENDCMP\n#\n$CMP IRF6614\nD 12.7A Id, 40V Vds, 8.3mOhm Rds, N-Channel MOSFET, DirectFET ST\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6614pbf.pdf?fileId=5546d462533600a4015355e8346c1a0f\n$ENDCMP\n#\n$CMP IRF6616\nD 19A Id, 40V Vds, 5mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6616pbf.pdf?fileId=5546d462533600a4015355e843461a13\n$ENDCMP\n#\n$CMP IRF6617\nD 55A Id, 30V Vds, 8.1mOhm Rds, N-Channel MOSFET, DirectFET ST\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6617pbf.pdf?fileId=5546d462533600a4015355e853f21a17\n$ENDCMP\n#\n$CMP IRF6618\nD 170A Id, 30V Vds, 2.2mOhm Rds, N-Channel MOSFET, DirectFET MT\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6618pbf.pdf?fileId=5546d462533600a4015355e862c21a1b\n$ENDCMP\n#\n$CMP IRF6620\nD 150A Id, 20V Vds, 2.7mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6620pbf.pdf?fileId=5546d462533600a4015355e8831d1a23\n$ENDCMP\n#\n$CMP IRF6621\nD 12A Id, 30V Vds, 9.1mOhm Rds, N-Channel MOSFET, DirectFET SQ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6621pbf.pdf?fileId=5546d462533600a4015355e8923b1a27\n$ENDCMP\n#\n$CMP IRF6622\nD 15A Id, 25V Vds, 6.3mOhm Rds, N-Channel MOSFET, DirectFET SQ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6622pbf.pdf?fileId=5546d462533600a4015355e89a3a1a29\n$ENDCMP\n#\n$CMP IRF6623\nD 55A Id, 20V Vds, 5.7mOhm Rds, N-Channel MOSFET, DirectFET ST\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6623pbf.pdf?fileId=5546d462533600a4015355e8aa811a2d\n$ENDCMP\n#\n$CMP IRF6628\nD 27A Id, 25V Vds, 2.5mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6628pbf.pdf?fileId=5546d462533600a4015355e8c0d71a33\n$ENDCMP\n#\n$CMP IRF6631\nD 13A Id, 30V Vds, 7.8mOhm Rds, N-Channel MOSFET, DirectFET SQ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6631pbf.pdf?fileId=5546d462533600a4015355e8d0561a37\n$ENDCMP\n#\n$CMP IRF6635\nD 32A Id, 30V Vds, 1.8mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6635pbf.pdf?fileId=5546d462533600a4015355e8e7ab1a3d\n$ENDCMP\n#\n$CMP IRF6636\nD 18A Id, 20V Vds, 4.5mOhm Rds, N-Channel MOSFET, DirectFET ST\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6636pbf.pdf?fileId=5546d462533600a4015355e8f7b31a41\n$ENDCMP\n#\n$CMP IRF6637\nD 14A Id, 30V Vds, 7.7mOhm Rds, N-Channel MOSFET, DirectFET MP\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6637pbf.pdf?fileId=5546d462533600a4015355ec1fab1a45\n$ENDCMP\n#\n$CMP IRF6641\nD 26A Id, 200V Vds, 59.9mOhm Rds, N-Channel MOSFET, DirectFET MZ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6641pbf.pdf?fileId=5546d462533600a4015355ec30311a49\n$ENDCMP\n#\n$CMP IRF6643\nD 35A Id, 150V Vds, 34.5mOhm Rds, N-Channel MOSFET, DirectFET MZ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6643pbf.pdf?fileId=5546d462533600a4015355ec388f1a4b\n$ENDCMP\n#\n$CMP IRF6644\nD 57A Id, 100V Vds, 13mOhm Rds, N-Channel MOSFET, DirectFET MN\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IRF6644-DS-v01_01-EN.pdf?fileId=5546d462533600a4015355ec47ac1a4f\n$ENDCMP\n#\n$CMP IRF6646\nD 12A Id, 80V Vds, 9.5mOhm Rds, N-Channel MOSFET, DirectFET MN\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6646pbf.pdf?fileId=5546d462533600a4015355ec5f071a55\n$ENDCMP\n#\n$CMP IRF6648\nD 86A Id, 60V Vds, 7mOhm Rds, N-Channel MOSFET, DirectFET MN\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IRF6648-DS-v01_02-EN.pdf?fileId=5546d462533600a4015355ec6e561a59\n$ENDCMP\n#\n$CMP IRF6655\nD 4.2A Id, 100V Vds, 62mOhm Rds, N-Channel MOSFET, DirectFET SH\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6655pbf.pdf?fileId=5546d462533600a4015355ec76961a5b\n$ENDCMP\n#\n$CMP IRF6662\nD 8.3A Id, 100V Vds, 22mOhm Rds, N-Channel MOSFET, DirectFET MN\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6662pbf.pdf?fileId=5546d462533600a4015355ec7edc1a5d\n$ENDCMP\n#\n$CMP IRF6665\nD 19A Id, 100V Vds, 62mOhm Rds, N-Channel MOSFET, DirectFET SH\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6665pbf.pdf?fileId=5546d462533600a4015355ec8dcb1a62\n$ENDCMP\n#\n$CMP IRF6668\nD 55A Id, 80V Vds, 15mOhm Rds, N-Channel MOSFET, DirectFET MN\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6668pbf.pdf?fileId=5546d462533600a4015355ec96b91a64\n$ENDCMP\n#\n$CMP IRF6674\nD 13.4A Id, 60V Vds, 11mOhm Rds, N-Channel MOSFET, DirectFET MZ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6674pbf.pdf?fileId=5546d462533600a4015355ec9f0d1a66\n$ENDCMP\n#\n$CMP IRF6710S2\nD 12A Id, 25V Vds, 5.9mOhm Rds, N-Channel MOSFET, DirectFET S1\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6710s2pbf.pdf?fileId=5546d462533600a4015355ece3db1a78\n$ENDCMP\n#\n$CMP IRF6711S\nD 19A Id, 25V Vds, 3.8mOhm Rds, N-Channel MOSFET, DirectFET SQ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6711spbf.pdf?fileId=5546d462533600a4015355ecec0b1a7a\n$ENDCMP\n#\n$CMP IRF6712S\nD 17A Id, 25V Vds, 4.9mOhm Rds, N-Channel MOSFET, DirectFET SQ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6712spbf.pdf?fileId=5546d462533600a4015355ecf4331a7c\n$ENDCMP\n#\n$CMP IRF6713S\nD 22A Id, 25V Vds, 3mOhm Rds, N-Channel MOSFET, DirectFET SQ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6713spbf.pdf?fileId=5546d462533600a4015355ecfc5c1a7e\n$ENDCMP\n#\n$CMP IRF6714M\nD 29A Id, 25V Vds, 2.1mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6714mpbf.pdf?fileId=5546d462533600a4015355ed04be1a80\n$ENDCMP\n#\n$CMP IRF6715M\nD 34A Id, 25V Vds, 1.6mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6715mpbf.pdf?fileId=5546d462533600a4015355ed0d221a82\n$ENDCMP\n#\n$CMP IRF6716M\nD 39A Id, 25V Vds, 1.6mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6716mpbf.pdf?fileId=5546d462533600a4015355ed15241a84\n$ENDCMP\n#\n$CMP IRF6717M\nD 38A Id, 25V Vds, 1.25mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6717mpbf.pdf?fileId=5546d462533600a4015355ed1d801a86\n$ENDCMP\n#\n$CMP IRF6718L2\nD 61A Id, 25V Vds, 0.7mOhm Rds, N-Channel MOSFET, DirectFET L6\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6718l2pbf.pdf?fileId=5546d462533600a4015355ed25bd1a88\n$ENDCMP\n#\n$CMP IRF6721S\nD 14A Id, 30V Vds, 7.3mOhm Rds, N-Channel MOSFET, DirectFET SQ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6721spbf.pdf?fileId=5546d462533600a4015355ed33b51a8c\n$ENDCMP\n#\n$CMP IRF6722M\nD 13A Id, 30V Vds, 7.7mOhm Rds, N-Channel MOSFET, DirectFET MP\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6722mpbf.pdf?fileId=5546d462533600a4015355ed3c661a8e\n$ENDCMP\n#\n$CMP IRF6724M\nD 27A Id, 30V Vds, 2.5mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6724mpbf.pdf?fileId=5546d462533600a4015355ed51a01a94\n$ENDCMP\n#\n$CMP IRF6725M\nD 28A Id, 30V Vds, 2.2mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6725mpbf.pdf?fileId=5546d462533600a4015355ed59ca1a96\n$ENDCMP\n#\n$CMP IRF6726M\nD 32A Id, 30V Vds, 1.7mOhm Rds, N-Channel MOSFET, DirectFET MT\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6726mpbf.pdf?fileId=5546d462533600a4015355ed61db1a98\n$ENDCMP\n#\n$CMP IRF6727M\nD 32A Id, 30V Vds, 1.7mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6727mpbf.pdf?fileId=5546d462533600a4015355ed6a331a9a\n$ENDCMP\n#\n$CMP IRF6728M\nD 23A Id, 30V Vds, 2.5mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6728mpbf.pdf?fileId=5546d462533600a4015355ed73701a9c\n$ENDCMP\n#\n$CMP IRF6775M\nD 28A Id, 150V Vds, 56mOhm Rds, N-Channel MOSFET, DirectFET MZ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6775mpbf.pdf?fileId=5546d462533600a4015355ed84751aa0\n$ENDCMP\n#\n$CMP IRF6785\nD 19A Id, 200V Vds, 100mOhm Rds, N-Channel MOSFET, DirectFET MZ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6785mpbf.pdf?fileId=5546d462533600a4015355ed8cc31aa2\n$ENDCMP\n#\n$CMP IRF6795M\nD 32A Id, 25V Vds, 1.8mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6795mpbf.pdf?fileId=5546d462533600a4015355ed99cd1aa6\n$ENDCMP\n#\n$CMP IRF6797M\nD 36A Id, 25V Vds, 1.4mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6797mpbf.pdf?fileId=5546d462533600a4015355eda2091aa9\n$ENDCMP\n#\n$CMP IRF6798M\nD 37A Id, 25V Vds, 1.3mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6798mpbf.pdf?fileId=5546d462533600a4015355edaa4b1aab\n$ENDCMP\n#\n$CMP IRF6802SD\nD 16A Id, 25V Vds, 4.2mOhm Rds, Dual N-Channel MOSFET, DirectFET SA\nK Dual N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6802sdpbf.pdf?fileId=5546d462533600a4015355f0a3021ab2\n$ENDCMP\n#\n$CMP IRF6810S\nD 16A Id, 25V Vds, 5.2mOhm Rds, N-Channel MOSFET, DirectFET S1\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6810spbf.pdf?fileId=5546d462533600a4015355f0ab331ab4\n$ENDCMP\n#\n$CMP IRF6811S\nD 19A Id, 25V Vds, 3.7mOhm Rds, N-Channel MOSFET, DirectFET SQ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6811spbf.pdf?fileId=5546d462533600a4015355f0b3661ab6\n$ENDCMP\n#\n$CMP IRF6892S\nD 28A Id, 25V Vds, 1.7mOhm Rds, N-Channel MOSFET, DirectFET S3C\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6892spbf.pdf?fileId=5546d462533600a4015355f0bb961ab8\n$ENDCMP\n#\n$CMP IRF6893M\nD 29A Id, 25V Vds, 1.6mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6893mpbf.pdf?fileId=5546d462533600a4015355f0c3de1aba\n$ENDCMP\n#\n$CMP IRF6894M\nD 37A Id, 25V Vds, 1.3mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IRF6894M-DS-v02_00-EN.pdf?fileId=5546d462533600a4015355f0cc041abc\n$ENDCMP\n#\n$CMP IRF6898M\nD 35A Id, 25V Vds, 1.1mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf6898mpbf.pdf?fileId=5546d462533600a4015355f0d4611abe\n$ENDCMP\n#\n$CMP IRF7171M\nD 93A Id, 100V Vds, 6.5mOhm Rds, N-Channel MOSFET, DirectFET MN\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf7171mpbf.pdf?fileId=5546d462533600a4015355f1326f1ad6\n$ENDCMP\n#\n$CMP IRF7309IPBF\nD 3A Id, 30V Vds, Dual HEXFET MOSFET, SO-8\nK Dual HEXFET N-Channel P-Channel MOSFET\nF http://www.irf.com/product-info/datasheets/data/irf7309ipbf.pdf\n$ENDCMP\n#\n$CMP IRF7324\nD 9A Id, -20V Vds, Dual HEXFET P-Channel MOSFET, SO-8\nK Dual HEXFET P-Channel MOSFET\nF http://www.infineon.com/dgdl/irf7324pbf.pdf?fileId=5546d462533600a4015355f5f0861b4b\n$ENDCMP\n#\n$CMP IRF7343PBF\nD 4A Id, 55V Vds, Dual HEXFET MOSFET, SO-8\nK Dual HEXFET N-Channel P-Channel MOSFET\nF http://www.irf.com/product-info/datasheets/data/irf7343ipbf.pdf\n$ENDCMP\n#\n$CMP IRF740\nD 10A Id, 400V Vds, N-Channel Power MOSFET, 500mOhm Rds, TO-220AB\nK N Channel\nF http://www.vishay.com/docs/91054/91054.pdf\n$ENDCMP\n#\n$CMP IRF7403\nD 9.7A Id, 30V Vds, N-Channel HEXFET Power MOSFET, SO-8\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf7403pbf.pdf?fileId=5546d462533600a4015355fa23541b9c\n$ENDCMP\n#\n$CMP IRF7404\nD -6.7A Id, -20V Vds, P-Channel HEXFET Power MOSFET, SO-8\nK P-Channel MOSFET\nF http://www.infineon.com/dgdl/irf7404.pdf?fileId=5546d462533600a4015355fa2b5b1b9e\n$ENDCMP\n#\n$CMP IRF7480M\nD 330A Id, 40V Vds, 1.2mOhm Rds, N-Channel MOSFET, DirectFET ME\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IRF7480M-DS-v01_02-EN.pdf?fileId=5546d462533600a4015355ff8fa41c30\n$ENDCMP\n#\n$CMP IRF7483M\nD 135A Id, 40V Vds, 2.3mOhm Rds, N-Channel MOSFET, DirectFET MF\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf7483mpbf.pdf?fileId=5546d462533600a4015355ff98011c32\n$ENDCMP\n#\n$CMP IRF7486M\nD 209A Id, 40V Vds, 1.25mOhm Rds, N-Channel MOSFET, DirectFET ME\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IRL7486M-DS-v01_00-EN.pdf?fileId=5546d46258fc0bc10158fec7a83a0629\n$ENDCMP\n#\n$CMP IRF7580M\nD 114A Id, 60V Vds, 3.6mOhm Rds, N-Channel MOSFET, DirectFET ME\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf7580mpbf.pdf?fileId=5546d462533600a401535603855c1c72\n$ENDCMP\n#\n$CMP IRF7606PBF\nD -3.6A Id, -30V Vds, HexFET P-MOS Power MOSFET, Ronon 0.09R, Micro8\nK HexFET Power MOSFET P-MOS\nF http://www.irf.com/product-info/datasheets/data/irf7606pbf.pdf\n$ENDCMP\n#\n$CMP IRF7607PBF\nD 5.2A Id, 20V Vds, HexFET N-MOS Power MOSFET, Ronon 0.03R, Micro8\nK HexFET Power MOSFET N-MOS\nF http://www.irf.com/product-info/datasheets/data/irf7607pbf.pdf\n$ENDCMP\n#\n$CMP IRF7665S2\nD 14.4A Id, 100V Vds, 62mOhm Rds, N-Channel MOSFET, DirectFET SB\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf7665s2pbf.pdf?fileId=5546d462533600a401535603d3ba1c86\n$ENDCMP\n#\n$CMP IRF7739L1\nD 270A Id, 40V Vds, 1.0mOhm Rds, N-Channel MOSFET, DirectFET L8\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf7739l1pbf.pdf?fileId=5546d462533600a40153560423d91c9a\n$ENDCMP\n#\n$CMP IRF7748L1\nD 104A Id, 60V Vds, 2.2mOhm Rds, N-Channel MOSFET, DirectFET L6\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf7748l1pbf.pdf?fileId=5546d462533600a40153560434c11c9e\n$ENDCMP\n#\n$CMP IRF7759L2\nD 160A Id, 75V Vds, 2.3mOhm Rds, N-Channel MOSFET, DirectFET L8\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf7759l2pbf.pdf?fileId=5546d462533600a40153560478171cb0\n$ENDCMP\n#\n$CMP IRF7769L1\nD 88A Id, 100V Vds, 3.5mOhm Rds, N-Channel MOSFET, DirectFET L8\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IRF7769L1-DS-v02_00-EN.pdf?fileId=5546d462533600a4015356079bd91cb4\n$ENDCMP\n#\n$CMP IRF7779L2\nD 67A Id, 150V Vds, 11mOhm Rds, N-Channel MOSFET, DirectFET L8\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf7779l2pbf.pdf?fileId=5546d462533600a401535607ac011cb8\n$ENDCMP\n#\n$CMP IRF7780M\nD 89A Id, 75V Vds, 5.7mOhm Rds, N-Channel MOSFET, DirectFET ME\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf7780mpbf.pdf?fileId=5546d462533600a401535607b41f1cba\n$ENDCMP\n#\n$CMP IRF7799L2\nD 35A Id, 250V Vds, 38mOhm Rds, N-Channel MOSFET, DirectFET L8\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf7799l2pbf.pdf?fileId=5546d462533600a401535607bc471cbc\n$ENDCMP\n#\n$CMP IRF7946\nD 198A Id, 40V Vds, 1.4mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf7946pbf.pdf?fileId=5546d462533600a40153560cc0a41d43\n$ENDCMP\n#\n$CMP IRF8301M\nD 34A Id, 30V Vds, 1.5mOhm Rds, N-Channel MOSFET, DirectFET MT\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf8301mpbf.pdf?fileId=5546d462533600a40153560d0e7a1d58\n$ENDCMP\n#\n$CMP IRF8302M\nD 31A Id, 30V Vds, 1.8mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf8302mpbf.pdf?fileId=5546d462533600a40153560d16e41d5b\n$ENDCMP\n#\n$CMP IRF8304M\nD 28A Id, 30V Vds, 2.2mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf8304mpbf.pdf?fileId=5546d462533600a40153560d20db1d5d\n$ENDCMP\n#\n$CMP IRF8306M\nD 23A Id, 30V Vds, 2.5mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf8306mpbf.pdf?fileId=5546d462533600a40153560d29371d5f\n$ENDCMP\n#\n$CMP IRF8308M\nD 27A Id, 30V Vds, 2.5mOhm Rds, N-Channel MOSFET, DirectFET MX\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf8308mpbf.pdf?fileId=5546d462533600a40153560d319d1d61\n$ENDCMP\n#\n$CMP IRF8327S\nD 13A Id, 30V Vds, 7.3mOhm Rds, N-Channel MOSFET, DirectFET SQ\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irf8327spbf.pdf?fileId=5546d462533600a40153560d40c41d65\n$ENDCMP\n#\n$CMP IRF8721PBF-1\nD 14A Id, 30V Vds, HEXFET N-Channel MOSFET, SO-8\nK HEXFET N-Channel MOSFET\nF http://www.irf.com/product-info/datasheets/data/irf8721pbf-1.pdf\n$ENDCMP\n#\n$CMP IRF9383M\nD -22A Id, -30V Vds, 2.9mOhm Rds, P-Channel MOSFET, DirectFET MX\nK P-Channel MOSFET\nF https://www.infineon.com/dgdl/irf9383mpbf.pdf?fileId=5546d462533600a40153561169a11dab\n$ENDCMP\n#\n$CMP IRF9394M\nD -14A Id, -30V Vds, 6.5mOhm Rds, P-Channel MOSFET, DirectFET MC\nK P-Channel MOSFET\nF https://www.infineon.com/dgdl/irf9394mpbf.pdf?fileId=5546d462533600a4015356118ff01db5\n$ENDCMP\n#\n$CMP IRF9395M\nD -14A Id, -30V Vds, 7mOhm Rds, P-Channel MOSFET, DirectFET MC\nK P-Channel MOSFET\nF https://www.infineon.com/dgdl/irf9395mpbf.pdf?fileId=5546d462533600a40153561198461db7\n$ENDCMP\n#\n$CMP IRF9540N\nD -23A Id, -100V Vds, HEXFET P-Channel MOSFET, TO-220\nK HEXFET P-Channel MOSFET\nF http://www.irf.com/product-info/datasheets/data/irf9540n.pdf\n$ENDCMP\n#\n$CMP IRFI4019H\nD 8.7A Id, 150V Vds, 80mOhm, Dual Half Bridge N-Channel MOSFET, TO-220-5\nK Dual N-Channel MOSFET\nF https://www.infineon.com/dgdl/irfi4019h-117p.pdf?fileId=5546d462533600a401535623d74d1f6f\n$ENDCMP\n#\n$CMP IRFI4020H\nD 9.1A Id, 200V Vds, 80mOhm, Dual Half Bridge N-Channel MOSFET, TO-220-5\nK Dual N-Channel MOSFET\nF https://www.infineon.com/dgdl/irfi4020h-117p.pdf?fileId=5546d462533600a401535623e7271f73\n$ENDCMP\n#\n$CMP IRFI4212H\nD 11A Id, 100V Vds, 58mOhm, Dual Half Bridge N-Channel MOSFET, TO-220-5\nK Dual N-Channel MOSFET\nF https://www.infineon.com/dgdl/irfi4212h-117p.pdf?fileId=5546d462533600a401535623fc841f7a\n$ENDCMP\n#\n$CMP IRL6283M\nD 38A Id, 20V Vds, 0.75mOhm Rds, N-Channel MOSFET, DirectFET MD\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irl6283mpbf.pdf?fileId=5546d462533600a40153565fe9452573\n$ENDCMP\n#\n$CMP IRL6297SD\nD 15A Id, 20V Vds, 4.9mOhm Rds, Dual N-Channel MOSFET, DirectFET SA\nK Dual N-Channel MOSFET\nF https://www.infineon.com/dgdl/irl6297sdpbf.pdf?fileId=5546d462533600a40153565ff22f2575\n$ENDCMP\n#\n$CMP IRL7472L1\nD 375A Id, 40V Vds, 0.45mOhm Rds, N-Channel MOSFET, DirectFET L8\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/Infineon-IRL7472L1-DS-v02_00-EN.pdf?fileId=5546d46254e133b401555d17178250d8\n$ENDCMP\n#\n$CMP IRLB8721PBF\nD 62A Id, 30V Vds, N-Channel MOSFET, TO-220\nK N-Channel HEXFET Power MOSFET\nF http://www.infineon.com/dgdl/irlb8721pbf.pdf?fileId=5546d462533600a40153566056732591\n$ENDCMP\n#\n$CMP IRLIZ44N\nD 30A Id, 55V Vds, Single N-Channel HEXFET Power MOSFET, 22mOhm Ron, TO-220AB\nK Single N-Channel HEXFET Power MOSFET\nF http://www.irf.com/product-info/datasheets/data/irliz44n.pdf\n$ENDCMP\n#\n$CMP IRLML0030\nD 5.3A Id, 30V Vds, N-Channel HEXFET Power MOSFET, 27mOhm Rds, SOT-23\nK N-Channel HEXFET Power MOSFET\nF https://www.infineon.com/dgdl/irlml0030pbf.pdf?fileId=5546d462533600a401535664773825df\n$ENDCMP\n#\n$CMP IRLML2060\nD 1.2A Id, 60V Vds, N-Channel MOSFET, 480mOhm Rds, SOT-23\nK N-Channel MOSFET\nF https://www.infineon.com/dgdl/irlml2060pbf.pdf?fileId=5546d462533600a401535664b7fb25ee\n$ENDCMP\n#\n$CMP IRLML5203\nD -3.0A Id, -30V Vds, P-Channel HEXFET Power MOSFET, 98mOhm Rds, SOT-23\nK P-Channel MOSFET\nF https://www.infineon.com/dgdl/irlml5203pbf.pdf?fileId=5546d462533600a40153566868da261d\n$ENDCMP\n#\n$CMP IRLML6402\nD -3.7A Id, -20V Vds, P-Channel MOSFET, 65mOhm Rds, SOT-23\nK P-Channel MOSFET\nF https://www.infineon.com/dgdl/irlml6402pbf.pdf?fileId=5546d462533600a401535668d5c2263c\n$ENDCMP\n#\n$CMP IRLML9301\nD -3.6A Id, -30V Vds, P-Channel HEXFET Power MOSFET, 64mOhm Rds, SOT-23\nK P-Channel MOSFET\nF https://www.infineon.com/dgdl/irlml9301pbf.pdf?fileId=5546d462533600a401535668e5e42640\n$ENDCMP\n#\n$CMP IRLZ34N\nD 30A Id, 55V Vds, Single N-Channel HEXFET Power MOSFET, 35mOhm Ron, TO-220AB\nK Single N-Channel HEXFET Power MOSFET\nF http://www.infineon.com/dgdl/irlz34npbf.pdf?fileId=5546d462533600a40153567206892720\n$ENDCMP\n#\n$CMP IRLZ44N\nD 47A Id, 55V Vds, Single N-Channel HEXFET Power MOSFET, 22mOhm Ron, TO-220AB\nK Single N-Channel HEXFET Power MOSFET\nF http://www.irf.com/product-info/datasheets/data/irlz44n.pdf\n$ENDCMP\n#\n$CMP MMBF170\nD 0.5A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF https://www.diodes.com/assets/Datasheets/ds30104.pdf\n$ENDCMP\n#\n$CMP MMBF4391\nD 50mA min, 30V, 30mOhm max, 4-10V Vgs(off), N-Channel JFET, SOT-23\nK N-Channel FET Transistor\nF https://www.onsemi.com/pub/Collateral/MMBF4391LT1-D.PDF\n$ENDCMP\n#\n$CMP MMBF4392\nD 25mA min, 30V, 60mOhm max, 2-5V Vgs(off), N-Channel JFET, SOT-23\nK N-Channel FET Transistor\nF https://www.onsemi.com/pub/Collateral/MMBF4391LT1-D.PDF\n$ENDCMP\n#\n$CMP MMBF4393\nD 5mA min, 30V, 100mOhm max, 0.5-3V Vgs(off), N-Channel JFET, SOT-23\nK N-Channel FET Transistor\nF https://www.onsemi.com/pub/Collateral/MMBF4391LT1-D.PDF\n$ENDCMP\n#\n$CMP MMBFJ111\nD 20mA min, 35V, 30mOhm max, 3-10V Vgs(off), N-Channel JFET, SOT-23\nK N-Channel FET Transistor\nF https://www.onsemi.com/pub/Collateral/MMBFJ113-D.PDF\n$ENDCMP\n#\n$CMP MMBFJ112\nD 5mA min, 35V, 50mOhm max, 1-5V Vgs(off), N-Channel JFET, SOT-23\nK N-Channel FET Transistor\nF https://www.onsemi.com/pub/Collateral/MMBFJ113-D.PDF\n$ENDCMP\n#\n$CMP MMBFJ113\nD 2mA min, 35V, 100mOhm max, 0.5-3V Vgs(off), N-Channel JFET, SOT-23\nK N-Channel FET Transistor\nF https://www.onsemi.com/pub/Collateral/MMBFJ113-D.PDF\n$ENDCMP\n#\n$CMP NTR2101P\nD -3.7A Id, -8V Vds, P-Channel MOSFET, SOT-23\nK P-Channel MOSFET\nF http://www.onsemi.com/pub/Collateral/NTR2101P-D.PDF\n$ENDCMP\n#\n$CMP PGA26E07BA\nD 26A Id, 600V Vds, 56mOhm, N-Channel GaN MOSFET, DFN-8\nK N-Channel GaN MOSFET\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/PGA26E07BA_E.pdf\n$ENDCMP\n#\n$CMP PGA26E19BA\nD 13A Id, 600V Vds, 140mOhm, N-Channel GaN MOSFET, DFN-8\nK N-Channel GaN MOSFET\nF https://industrial.panasonic.com/content/data/SC/ds/ds4/PGA26E19BA_E.pdf\n$ENDCMP\n#\n$CMP PSMN5R2-60YL\nD 100A, 60V Vds, N-Channel MOSFET, 5.2mOhm Ron, LFPAK56\nK N-Channel MOSFET\nF https://assets.nexperia.com/documents/data-sheet/PSMN5R2-60YL.pdf\n$ENDCMP\n#\n$CMP QM6006D\nD 35A Id, 60V Vds, N-Channel Power MOSFET, 18mOhm Ron, 19.3nC Qg (typ), TO252\nK N-Channel MOSFET\nF http://www.jaolen.com/images/pdf/QM6006D.pdf\n$ENDCMP\n#\n$CMP QM6015D\nD -35A Id, -60V Vds, P-Channel Power MOSFET, 25mOhm Ron, 25.0nC Qg (typ), TO252\nK P-Channel MOSFET\nF http://www.jaolen.com/images/pdf/QM6015D.pdf\n$ENDCMP\n#\n$CMP STS2DNE60\nD 2A Id, 60V Vds, Dual N-Channel MOSFET, 180mOhm Ron, SO-8\nK Dual N-Channel MOSFET\nF https://www.st.com/resource/en/datasheet/CD00001537.pdf\n$ENDCMP\n#\n$CMP SUD08P06-155L\nD 8.4A Id, 60V Vds, TrenchFET P-Channel Power MOSFET, 155mOhm Ron, 19nC Qg, -55 to 150 °C, TO-252-2\nK TrenchFET P-Channel Power MOSFET\nF https://www.vishay.com/docs/62843/sud08p06-155l-ge3.pdf\n$ENDCMP\n#\n$CMP SUD09P10-195\nD 8.8A Id, 100V Vds, TrenchFET P-Channel Power MOSFET, 195mOhm Ron, 34.8nC Qg, -55 to 150 °C, TO-252-2\nK TrenchFET P-Channel Power MOSFET\nF https://www.vishay.com/docs/65903/SUD09P10.pdf\n$ENDCMP\n#\n$CMP SUD19P06-60\nD 19A Id, 60V Vds, TrenchFET P-Channel Power MOSFET, 60mOhm Ron, 40nC Qg, -55 to 150 °C, TO-252-2\nK TrenchFET P-Channel Power MOSFET\nF https://www.vishay.com/docs/69253/sud19p06.pdf\n$ENDCMP\n#\n$CMP SUD45P03-09\nD 45A Id, 30V Vds, TrenchFET P-Channel Power MOSFET, 8.7mOhm Ron, 90nC Qg, -55 to 150 °C, TO-252-2\nK TrenchFET P-Channel Power MOSFET\nF https://www.vishay.com/docs/65595/sud45p03.pdf\n$ENDCMP\n#\n$CMP SUD50P04-08\nD 50A Id, 40V Vds, TrenchFET P-Channel Power MOSFET, 8.1mOhm Ron, 159nC Qg, -55 to 150 °C, TO-252-2\nK TrenchFET P-Channel Power MOSFET\nF https://www.vishay.com/docs/65594/sud50p04-08.pdf\n$ENDCMP\n#\n$CMP SUD50P06-15\nD 50A Id, 60V Vds, TrenchFET P-Channel Power MOSFET, 15mOhm Ron, 165nC Qg, -55 to 150 °C, TO-252-2\nK TrenchFET P-Channel Power MOSFET\nF https://www.vishay.com/docs/68940/sud50p06.pdf\n$ENDCMP\n#\n$CMP SUD50P08-25L\nD 50A Id, 80V Vds, TrenchFET P-Channel Power MOSFET, 25.2mOhm Ron, 160nC Qg, -55 to 175 °C, TO-252-2\nK TrenchFET P-Channel Power MOSFET\nF https://www.vishay.com/docs/73443/sud50p08.pdf\n$ENDCMP\n#\n$CMP SUD50P10-43L\nD 37A Id, 100V Vds, TrenchFET P-Channel Power MOSFET, 43mOhm Ron, 160nC Qg, -55 to 150 °C, TO-252-2\nK TrenchFET P-Channel Power MOSFET\nF https://www.vishay.com/docs/62504/sud50p10-43l-ge3.pdf\n$ENDCMP\n#\n$CMP Si1442DH\nD 12V Vds, TrenchFET N-Channel Power MOSFET, SC-70-6\nK TrenchFET N-Channel Power MOSFET\nF http://www.vishay.com/docs/63772/si1442dh.pdf\n$ENDCMP\n#\n$CMP Si2319CDS\nD -4.4A Id, -40V Vds, P-Channel MOSFET, SOT-23\nK P-Channel MOSFET\nF http://www.vishay.com/docs/66709/si2319cd.pdf\n$ENDCMP\n#\n$CMP Si2371EDS\nD -3.6A Id, -30V Vds, P-Channel MOSFET, SOT-23\nK P-Channel MOSFET\nF http://www.vishay.com/docs/63924/si2371eds.pdf\n$ENDCMP\n#\n$CMP Si4162DY\nD 19.3A Id, 30V Vds, TrenchFET N-Channel Power MOSFET, SO-8\nK N-Channel MOSFET\nF http://www.vishay.com/docs/68967/si4162dy.pdf\n$ENDCMP\n#\n$CMP Si4532DY\nD 3.9A Id, 30V Vds, Dual N and P Channel MOSFET, 65mOhm Ron, 10V Vgs, SO8L\nK Dual N-Channel P-Channel MOSFET\nF https://www.fairchildsemi.com/datasheets/SI/SI4532DY.pdf\n$ENDCMP\n#\n$CMP Si4542DY\nD Dual N and P Channel MOSFET, 6A Id, 30V Vds, 28mOhm Ron, 10V Vgs, SO8L\nK Dual N-Channel P-Channel MOSFET\nF https://www.fairchildsemi.com/datasheets/SI/SI4542DY.pdf\n$ENDCMP\n#\n$CMP Si7141DP\nD 60A Id, 20V Vds, 1.9 mOhm Ron, PowerPAK-8\nK P-Channel MOSFET\nF https://www.vishay.com/docs/65596/si7141dp.pdf\n$ENDCMP\n#\n$CMP Si7336ADP\nD 30A Id, 30V Vds, 2.4mOhm Ron, PowerPAK-8\nK N-Channel MOSFET\nF https://www.vishay.com/docs/73152/si7336adp.pdf\n$ENDCMP\n#\n$CMP Si7450DP\nD 5.3A Id, 200V Vds, 80mOhm Ron, PowerPAK-8\nK N-Channel MOSFET\nF https://www.vishay.com/docs/71432/si7450dp.pdf\n$ENDCMP\n#\n$CMP SiA449DJ\nD -12A Id, -30V Vds, P-Channel MOSFET, PowerPAK SC70-6\nK P-Channel MOSFET\nF http://www.vishay.com/docs/62644/sia449dj.pdf\n$ENDCMP\n#\n$CMP SiA453EDJ\nD -10A Id, -30V Vds, P-Channel MOSFET\nK P-Channel MOSFET\nF http://www.vishay.com/docs/62864/sia453edj.pdf\n$ENDCMP\n#\n$CMP SiS415DNT\nD -35A Id, -20V Vds, P-Channel MOSFET, PowerPAK 1212-8 Single\nK P-Channel MOSFET\nF https://www.vishay.com/docs/63684/sis415dnt.pdf\n$ENDCMP\n#\n$CMP SiSS27DN\nD -50A Id, -30V Vds, P-Channel MOSFET, PowerPAK 1212-8 Single\nK P-Channel MOSFET\nF http://www.vishay.com/docs/62847/siss27dn.pdf\n$ENDCMP\n#\n$CMP TP0610L\nD -0.18A Id, -60V Vds, P-Channel MOSFET, TO-92\nK P-Channel MOSFET\nF http://www.vishay.com/docs/70209/70209.pdf\n$ENDCMP\n#\n$CMP TP0610T\nD -0.18A Id, -60V Vds, P-Channel MOSFET, SOT-23\nK P-Channel MOSFET\nF http://www.vishay.com/docs/70209/70209.pdf\n$ENDCMP\n#\n$CMP TSM2301ACX\nD -2.8A Id, -20V Vds, P-Channel MOSFET, SOT-23\nK P-Channel MOSFET\nF https://www.taiwansemi.com/products/datasheet/TSM2301A_C15.pdf\n$ENDCMP\n#\n$CMP TSM2302CX\nD 3.9A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF https://www.taiwansemi.com/products/datasheet/TSM2302CX_E1608.pdf\n$ENDCMP\n#\n$CMP VN10LF\nD 0.15A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/VN10LF.pdf\n$ENDCMP\n#\n$CMP VNP10N07\nD 10A Id, 70V Vds, N-Channel Power MOSFET, fully autoprotected, TO-220\nK N-Channel Power MOSFET OMNIFET\nF https://www.st.com/resource/en/datasheet/vnp10n07.pdf\n$ENDCMP\n#\n$CMP VP0610L\nD -0.18A Id, -60V Vds, P-Channel MOSFET, TO-92\nK P-Channel MOSFET\nF http://www.vishay.com/docs/70209/70209.pdf\n$ENDCMP\n#\n$CMP VP0610T\nD -0.18A Id, -60V Vds, P-Channel MOSFET, SOT-23\nK P-Channel MOSFET\nF http://www.vishay.com/docs/70209/70209.pdf\n$ENDCMP\n#\n$CMP ZVN3306F\nD 0.15A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZVN3306F.pdf\n$ENDCMP\n#\n$CMP ZVN3310F\nD 0.1A Id, 100V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZVN3310F.pdf\n$ENDCMP\n#\n$CMP ZVN3320F\nD 0.06A Id, 200V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZVN3320F.pdf\n$ENDCMP\n#\n$CMP ZVN4106F\nD 0.2A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZVN4106F.pdf\n$ENDCMP\n#\n$CMP ZXM61N02F\nD 1.7A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXM61N02F.pdf\n$ENDCMP\n#\n$CMP ZXM61N03F\nD 1.4A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXM61N03F.pdf\n$ENDCMP\n#\n$CMP ZXMN10A07F\nD 0.76A Id, 100V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN10A07F.pdf\n$ENDCMP\n#\n$CMP ZXMN2A01F\nD 2.2A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN2A01F.pdf\n$ENDCMP\n#\n$CMP ZXMN2A14F\nD 4.1A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN2A14F.pdf\n$ENDCMP\n#\n$CMP ZXMN2B01F\nD 2.4A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN2B01F.pdf\n$ENDCMP\n#\n$CMP ZXMN2B14FH\nD 4.3A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN2B14FH.pdf\n$ENDCMP\n#\n$CMP ZXMN2F30FH\nD 4.9A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN2F30FH.pdf\n$ENDCMP\n#\n$CMP ZXMN2F34FH\nD 4A Id, 20V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN2F34FH.pdf\n$ENDCMP\n#\n$CMP ZXMN3A01F\nD 2A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN3A01F.pdf\n$ENDCMP\n#\n$CMP ZXMN3A14F\nD 3.2A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN3A14F.pdf\n$ENDCMP\n#\n$CMP ZXMN3B01F\nD 2A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN3B01F.pdf\n$ENDCMP\n#\n$CMP ZXMN3B14F\nD 3.5A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN3B14F.pdf\n$ENDCMP\n#\n$CMP ZXMN3F30FH\nD 4.6A Id, 30V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN3F30FH.pdf\n$ENDCMP\n#\n$CMP ZXMN6A07F\nD 1.4A Id, 60V Vds, N-Channel MOSFET, SOT-23\nK N-Channel MOSFET\nF http://www.diodes.com/assets/Datasheets/ZXMN6A07F.pdf\n$ENDCMP\n#\n$CMP ZXMP4A16G\nD -6.4A Id, -40V Vds, P-Channel MOSFET, SOT-223\nK P-Channel MOSFET\nF https://www.diodes.com/assets/Datasheets/ZXMP4A16G.pdf\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Transistor_FET.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# 2N7000\n#\nDEF 2N7000 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2N7000\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 3SK263\n#\nDEF 3SK263 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"3SK263\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-143\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?143*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 10 10 -80 10 -50 N\nP 2 0 1 10 10 80 10 50 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 10 -65 -100 -65 -100 -100 N\nP 3 0 1 0 10 65 -100 65 -100 100 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P\nX G1 3 -200 100 100 R 50 50 1 1 P\nX G2 4 -200 -100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BF244A\n#\nDEF BF244A Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BF244A\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BF244B BF244C\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 3 0 1 0 100 -100 100 -55 10 -55 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 0 0 -40 15 -40 -15 0 0 F\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BF245A\n#\nDEF BF245A Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BF245A\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BF245B BF245C\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 3 0 1 0 100 -100 100 -55 10 -55 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 0 0 -40 15 -40 -15 0 0 F\nX G 1 -200 0 100 R 50 50 1 1 I\nX S 2 100 -200 100 U 50 50 1 1 P\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BF545A\n#\nDEF BF545A Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BF545A\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BF545B BF545C\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 3 0 1 0 100 -100 100 -55 10 -55 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 0 0 -40 15 -40 -15 0 0 F\nX S 1 100 -200 100 U 50 50 1 1 P\nX D 2 100 200 100 D 50 50 1 1 P\nX G 3 -200 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# BS107\n#\nDEF BS107 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BS107\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BS108 BS170\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BS250\n#\nDEF BS250 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BS250\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BSB008NE2LX\n#\nDEF BSB008NE2LX Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BSB008NE2LX\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_MX\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BSB012NE2LXI BSB013NE2LXI BSB014N04LX3 BSB015N04NX3 IRF6616 IRF6620 IRF6628 IRF6635 IRF6714M IRF6715M IRF6716M IRF6717M IRF6724M IRF6725M IRF6727M IRF6728M IRF6795M IRF6797M IRF6798M IRF6893M IRF6894M IRF6898M IRF7946 IRF8302M IRF8304M IRF8306M IRF8308M\n$FPLIST\n DirectFET*MX*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BSB028N06NN3\n#\nDEF BSB028N06NN3 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BSB028N06NN3\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_MN\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BSB044N08NN3 BSB056N10NN3 IRF6644 IRF6646 IRF6648 IRF6662 IRF6668 IRF7171M\n$FPLIST\n DirectFET*MN*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BSB104N08NP3\n#\nDEF BSB104N08NP3 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BSB104N08NP3\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_MP\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF6637 IRF6722M\n$FPLIST\n DirectFET*MP*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BSB165N15NZ3\n#\nDEF BSB165N15NZ3 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BSB165N15NZ3\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_MZ\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BSB280N15NZ3 IRF6641 IRF6643 IRF6674 IRF6775M IRF6785\n$FPLIST\n DirectFET*MZ*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BSC13DN30NSFD\n#\nDEF BSC13DN30NSFD Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BSC13DN30NSFD\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:TDSON-8-1\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 V I L CNN\n$FPLIST\n TDSON*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P N\nX S 3 100 -200 100 U 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 P\nX D 5 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BSF030NE2LQ\n#\nDEF BSF030NE2LQ Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BSF030NE2LQ\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_SQ\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BSF035NE2LQ IRF6621 IRF6622 IRF6631 IRF6711S IRF6712S IRF6713S IRF6721S IRF6811S IRF8327S\n$FPLIST\n DirectFET*SQ*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BSF450NE7NH3\n#\nDEF BSF450NE7NH3 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BSF450NE7NH3\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_ST\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF6614 IRF6617 IRF6623 IRF6636\n$FPLIST\n DirectFET*ST*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BSP129\n#\nDEF BSP129 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BSP129\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-223-3_TabPin2\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?223*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 200 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BSP89\n#\nDEF BSP89 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BSP89\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-223-3_TabPin2\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?223*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BSR56\n#\nDEF BSR56 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BSR56\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BSR57 BSR58 MMBF4391 MMBF4392 MMBF4393 MMBFJ111 MMBFJ112 MMBFJ113\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 3 0 1 0 100 -100 100 -55 10 -55 N\nP 3 0 1 0 100 100 100 55 10 55 N\nP 4 0 1 0 0 0 -40 15 -40 -15 0 0 F\nX D 1 100 200 100 D 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P\nX G 3 -200 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# BSS138\n#\nDEF BSS138 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BSS138\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS 2N7002 2N7002E 2N7002H 2N7002K BS170F BS870 BSN20 BSS123 BSS127S DMG2302U DMG3402L DMG3404L DMG3406L DMG3414U DMG3418L DMN10H220L DMN10H700S DMN13H750S DMN2041L DMN2050L DMN2056U DMN2058U DMN2075U DMN2230U DMN24H11DS DMN24H3D5L DMN3042L DMN3051L DMN30H4D0L DMN3110S DMN3150L DMN3300U DMN3404L DMN6075S DMN6140L DMN67D7L DMN67D8L MMBF170 VN10LF ZVN3306F ZVN3310F ZVN3320F ZVN4106F ZXM61N02F ZXM61N03F ZXMN10A07F ZXMN2A01F ZXMN2A14F ZXMN2B01F ZXMN2B14FH ZXMN2F30FH ZXMN2F34FH ZXMN3A01F ZXMN3A14F ZXMN3B01F ZXMN3B14F ZXMN3F30FH ZXMN6A07F IRLML0030 IRLML2060 TSM2302CX\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX S 2 100 -200 100 U 50 50 1 1 P\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BSS214NW\n#\nDEF BSS214NW Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BSS214NW\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-323_SC-70\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?323*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX S 2 100 -200 100 U 50 50 1 1 P\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BUK9M53-60EX\n#\nDEF BUK9M53-60EX Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BUK9M53-60EX\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:LFPAK33\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 V I L CNN\nALIAS BUK9M85-60EX BUK7M45-40EX BUK9M52-40EX BUK9M42-60EX BUK9M14-40EX BUK9M24-60EX BUK9M10-30EX BUK9M11-40EX BUK7M10-40EX BUK7M15-60EX BUK7M19-60EX BUK9M9R1-40EX BUK9M6R6-30EX BUK9M12-60EX BUK7M9R9-60EX BUK7M42-60EX BUK9M156-100EX BUK7M33-60EX BUK7M21-40EX BUK9M43-100EX BUK7M12-60EX BUK9M15-60EX BUK7M27-80EX BUK9M19-60EX BUK9M5R2-30EX BUK7M17-80EX BUK9M7R2-40EX BUK9M34-100EX BUK9M23-80EX BUK7M67-60EX BUK9M24-40EX BUK9M120-100EX BUK9M17-30EX BUK7M12-40EX BUK9M28-80EX BUK7M8R0-40EX BUK9M35-80EX BUK7M6R3-40EX BUK7M22-80EX\n$FPLIST\n LFPAK33*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P N\nX S 3 100 -200 100 U 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 P\nX D 5 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BUZ11\n#\nDEF BUZ11 Q 0 20 Y N 1 F N\nF0 \"Q\" 250 75 50 H V L CNN\nF1 \"BUZ11\" 250 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 250 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF3205 IRF540N IRF740 IRLB8721PBF IRLZ34N IRLZ44N VNP10N07 IPP060N06N\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# C3M0030090K\n#\nDEF C3M0030090K Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"C3M0030090K\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-247-4_Vertical\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS C3M0065100K C3M0075120K C3M0120100K\n$FPLIST\n TO?247*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -125 11 0 1 0 F\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 -100 -100 -100 -125 100 -125 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P\nX DS 3 -200 -100 100 R 50 50 1 1 P\nX G 4 -200 0 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# C3M0065090D\n#\nDEF C3M0065090D Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"C3M0065090D\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-247-3_Vertical\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS C3M0120090D C3M0280090D C2M0025120D C2M0040120D C2M0080120D C2M0160120D C2M0280120D C2M0045170D C2M1000170D\n$FPLIST\n TO?247*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# C3M0065090J\n#\nDEF C3M0065090J Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"C3M0065090J\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:TO-263-7_TabPin8\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS C3M0065100J C3M0075120J C3M0280090J C2M1000170J C3M0120090J C3M0120100J\n$FPLIST\n TO?263*TabPin8*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -125 11 0 1 0 F\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 -100 -100 -100 -125 100 -125 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX DS 2 -200 -100 100 R 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nX S 4 100 -200 100 U 50 50 1 1 P N\nX S 5 100 -200 100 U 50 50 1 1 P N\nX S 6 100 -200 100 U 50 50 1 1 P N\nX S 7 100 -200 100 U 50 50 1 1 P N\nX D 8 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CSD16301Q2\n#\nDEF CSD16301Q2 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"CSD16301Q2\" 200 0 50 H V L CNN\nF2 \"Package_SON:Texas_DQK\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 V I L CNN\nALIAS CSD17313Q2\n$FPLIST\n Texas*DQK*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX D 2 100 200 100 D 50 50 1 1 P N\nX G 3 -200 0 100 R 50 50 1 1 P\nX S 4 100 -200 100 U 50 50 1 1 P\nX D 5 100 200 100 D 50 50 1 1 P N\nX D 6 100 200 100 D 50 50 1 1 P N\nX S 7 100 -200 100 U 50 50 1 1 P N\nX D 8 100 200 100 D 50 50 1 1 P N\nENDDRAW\nENDDEF\n#\n# CSD17578Q5A\n#\nDEF CSD17578Q5A Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"CSD17578Q5A\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:TDSON-8-1\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 V I L CNN\nALIAS CSD17579Q5A CSD16570Q5B CSD17577Q5A CSD18509Q5B CSD18540Q5B CSD17573Q5B CSD17576Q5B CSD19534Q5A CSD17570Q5B CSD19533Q5A CSD19502Q5B CSD19532Q5B CSD19531Q5A CSD18563Q5A CSD18537NQ5A CSD18532NQ5B CSD17556Q5B CSD18502Q5B CSD18532Q5B CSD17552Q5A CSD17559Q5 CSD18534Q5A CSD18533Q5A CSD17555Q5A CSD17551Q5A CSD18501Q5A CSD18503Q5A CSD18504Q5A CSD18531Q5A CSD17553Q5A CSD16342Q5A CSD17322Q5A CSD17327Q5A CSD17522Q5A CSD17527Q5A CSD17501Q5A CSD17506Q5A CSD17505Q5A CSD17507Q5A CSD17510Q5A CSD17311Q5 CSD17312Q5 CSD17303Q5 CSD16415Q5 CSD17302Q5A CSD17305Q5A CSD17306Q5A CSD17307Q5A CSD17310Q5A CSD17301Q5A CSD16408Q5 CSD16322Q5 CSD16325Q5 CSD16321Q5 CSD16414Q5 CSD16401Q5 CSD16403Q5A CSD16404Q5A CSD16407Q5 CSD16410Q5A CSD16412Q5A CSD16413Q5A BSC026N08NS5 BSC030N08NS5 BSC035N10NS5 BSC037N08NS5 BSC040N10NS5 BSC040N08NS5 BSC046N10NS3G BSC047N08NS3G BSC052N08NS5 BSC057N08NS3G BSC060N10NS3G BSC061N08NS5 BSC070N10NS3G BSC070N10NS5 BSC072N08NS5 BSC079N10NSG BSC082N10LSG BSC098N10NS5 BSC100N10NSFG BSC105N10LSFG BSC109N10NS3G BSC117N08NS5 BSC118N10NSG BSC123N08NS3G BSC123N10LSG BSC159N10LSFG BSC160N10NS3G BSC196N10NSG BSC252N10NSFG BSC265N10LSFG BSC340N08NS3G BSC440N10NS3G BSC028N06LS3 FDMS8350LET40 FDMT80060DC FDMT80080DC FDMT800120DC FDMT800100DC FDMT800150DC FDMT800152DC FDMS8050ET30 FDMS86202ET120 FDMS86150ET100 FDMS86255ET150 FDMS86350ET80 FDMS86550ET60 FDMS8050 FDMS8350L FDMS86255 FDMS86550 FDMS86202 FDMS86350 FDMS86152 FDMS86150\n$FPLIST\n TDSON*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P N\nX S 3 100 -200 100 U 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 P\nX D 5 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CSD19537Q3\n#\nDEF CSD19537Q3 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"CSD19537Q3\" 200 0 50 H V L CNN\nF2 \"Package_SON:VSON-8_3.3x3.3mm_P0.65mm_NexFET\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 V I L CNN\n$FPLIST\n VSON*3.3x3.3mm*P0.65mm*NexFET*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P N\nX S 3 100 -200 100 U 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 P\nX D 5 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# CSD25302Q2\n#\nDEF CSD25302Q2 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 50 50 H V C CNN\nF1 \"CSD25302Q2\" 150 -50 50 H V L CNN\nF2 \"Package_SON:Texas_DQK\" 500 -150 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\n$FPLIST\n Texas*DQK*\n$ENDFPLIST\nDRAW\nC -35 0 110 0 1 10 N\nC 0 -70 10 0 1 0 F\nC 0 70 10 0 1 0 F\nP 2 0 1 0 -90 0 -200 0 N\nP 2 0 1 10 -90 75 -90 -75 N\nP 2 0 1 10 -70 -50 -70 -90 N\nP 2 0 1 10 -70 20 -70 -20 N\nP 2 0 1 10 -70 90 -70 50 N\nP 2 0 1 0 0 100 0 70 N\nP 3 0 1 0 0 -100 0 0 -70 0 N\nP 4 0 1 0 -70 70 30 70 30 -70 -70 -70 N\nP 4 0 1 0 -10 0 -50 15 -50 -15 -10 0 F\nP 4 0 1 0 10 -20 15 -15 45 -15 50 -10 N\nP 4 0 1 0 30 -15 15 10 45 10 30 -15 N\nX S 1 0 -200 100 U 50 50 1 1 P\nX S 2 0 -200 100 U 50 50 1 1 P N\nX G 3 -300 0 100 R 50 50 1 1 P\nX D 4 0 200 100 D 50 50 1 1 P\nX S 5 0 -200 100 U 50 50 1 1 P N\nX S 6 0 -200 100 U 50 50 1 1 P N\nX D 7 0 200 100 D 50 50 1 1 P N\nX S 8 0 -200 100 U 50 50 1 1 P N\nENDDRAW\nENDDEF\n#\n# DMC2053UVT\n#\nDEF DMC2053UVT Q 0 20 Y N 2 F N\nF0 \"Q\" 125 50 50 H V L CNN\nF1 \"DMC2053UVT\" 125 -50 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:TSOT-23-6\" -50 -475 50 H I C CNN\nF3 \"\" -100 0 50 H I C CNN\nALIAS DMC3071LVT\n$FPLIST\n TSOT?23*\n$ENDFPLIST\nDRAW\nC -35 0 110 0 1 10 N\nC 0 -70 10 0 1 0 F\nC 0 70 10 0 1 0 F\nP 2 0 1 0 -90 0 -200 0 N\nP 2 0 1 10 -90 75 -90 -75 N\nP 2 0 1 10 -70 -50 -70 -90 N\nP 2 0 1 10 -70 20 -70 -20 N\nP 2 0 1 10 -70 90 -70 50 N\nP 2 0 1 0 0 100 0 70 N\nP 3 0 1 0 0 -100 0 0 -70 0 N\nP 4 0 1 0 -70 -70 30 -70 30 70 -70 70 N\nP 4 1 1 0 -60 0 -20 15 -20 -15 -60 0 F\nP 4 1 1 0 10 20 15 15 45 15 50 10 N\nP 4 1 1 0 30 15 15 -10 45 -10 30 15 N\nP 4 2 1 0 -10 0 -50 15 -50 -15 -10 0 F\nP 4 2 1 0 10 -20 15 -15 45 -15 50 -10 N\nP 4 2 1 0 30 -15 15 10 45 10 30 -15 N\nX G 1 -300 0 100 R 50 50 1 1 P\nX S 5 0 -200 100 U 50 50 1 1 P\nX D 6 0 200 100 D 50 50 1 1 P\nX S 2 0 -200 100 U 50 50 2 1 P\nX G 3 -300 0 100 R 50 50 2 1 P\nX D 4 0 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# DMG1012T\n#\nDEF DMG1012T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DMG1012T\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-523\" 200 -75 50 H I L CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT?523*\n$ENDFPLIST\nDRAW\nC -90 0 10 1 1 0 F\nC 65 0 110 1 1 10 N\nC 100 -150 10 1 1 0 F\nC 100 -70 10 1 1 0 F\nC 100 70 10 1 1 0 F\nP 3 0 1 0 100 -150 -90 -150 -90 0 N\nP 2 1 1 0 10 0 -100 0 N\nP 2 1 1 10 10 75 10 -75 N\nP 2 1 1 10 30 -50 30 -90 N\nP 2 1 1 10 30 20 30 -20 N\nP 2 1 1 10 30 90 30 50 N\nP 2 1 1 0 100 100 100 70 N\nP 3 1 1 0 100 -100 100 0 30 0 N\nP 4 1 1 0 -40 -170 -35 -165 -35 -135 -30 -130 N\nP 4 1 1 0 -35 -150 -10 -165 -10 -135 -35 -150 N\nP 4 1 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 1 1 0 40 0 80 15 80 -15 40 0 F\nP 4 1 1 0 45 -150 20 -135 20 -165 45 -150 N\nP 4 1 1 0 50 -130 45 -135 45 -165 40 -170 N\nP 4 1 1 0 110 20 115 15 145 15 150 10 N\nP 4 1 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX S 2 100 -200 100 U 50 50 1 1 P\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DMP3013SFV\n#\nDEF DMP3013SFV Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DMP3013SFV\" 200 0 50 H V L CNN\nF2 \"Package_SON:Diodes_PowerDI3333-8\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 V I L CNN\n$FPLIST\n Diodes*PowerDI3333*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P N\nX S 3 100 -200 100 U 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 P\nX D 5 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# FDC6330L\n#\nDEF FDC6330L Q 0 20 Y N 1 F N\nF0 \"Q\" 125 -50 50 H V L CNN\nF1 \"FDC6330L\" 125 -150 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:TSOT-23-6\" -50 -575 50 H I C CNN\nF3 \"\" -100 -100 50 H I C CNN\n$FPLIST\n TSOT?23*\n$ENDFPLIST\nDRAW\nC -35 -100 110 0 1 10 N\nC 0 -170 10 0 1 0 F\nC 0 -30 10 0 1 0 F\nC -105 300 10 1 1 0 F\nC -35 100 10 1 1 0 F\nC -35 265 110 1 1 10 N\nC 35 300 10 1 1 0 F\nP 2 0 1 0 -90 -100 -200 -100 N\nP 2 0 1 10 -90 -25 -90 -175 N\nP 2 0 1 10 -70 -150 -70 -190 N\nP 2 0 1 10 -70 -80 -70 -120 N\nP 2 0 1 10 -70 -10 -70 -50 N\nP 2 0 1 0 0 0 0 -30 N\nP 2 0 1 0 200 300 65 300 N\nP 3 0 1 0 -200 100 0 100 0 0 N\nP 3 0 1 0 0 -200 0 -100 -70 -100 N\nP 4 0 1 0 -70 -170 30 -170 30 -30 -70 -30 N\nP 2 1 1 0 -125 300 -235 300 N\nP 2 1 1 10 -85 230 -125 230 N\nP 2 1 1 0 -35 210 -35 100 N\nP 2 1 1 10 -15 230 -55 230 N\nP 2 1 1 10 40 210 -110 210 N\nP 2 1 1 10 55 230 15 230 N\nP 2 1 1 0 65 300 35 300 N\nP 3 1 1 0 -135 300 -35 300 -35 230 N\nP 4 1 1 0 -105 230 -105 330 35 330 35 230 N\nP 4 1 1 0 -60 -100 -20 -85 -20 -115 -60 -100 F\nP 4 1 1 0 -55 310 -50 315 -50 345 -45 350 N\nP 4 1 1 0 -50 330 -25 315 -25 345 -50 330 N\nP 4 1 1 0 -35 290 -20 250 -50 250 -35 290 F\nP 4 1 1 0 10 -80 15 -85 45 -85 50 -90 N\nP 4 1 1 0 30 -85 15 -110 45 -110 30 -85 N\nX S1 1 0 -300 100 U 50 50 1 1 P\nX D2 2 300 300 100 L 50 50 1 1 P N\nX D2 3 300 300 100 L 50 50 1 1 P\nX S2 4 -300 300 100 R 50 50 1 1 P\nX G1 5 -300 -100 100 R 50 50 1 1 P\nX D1 6 -300 100 100 R 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# FDG1024NZ\n#\nDEF FDG1024NZ Q 0 20 Y N 2 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"FDG1024NZ\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS FDG6335N\n$FPLIST\n SOT?363*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 P\nX D 6 100 200 100 D 50 50 1 1 P\nX D 3 100 200 100 D 50 50 2 1 P\nX S 4 100 -200 100 U 50 50 2 1 P\nX G 5 -200 0 100 R 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# FDMC8032L\n#\nDEF FDMC8032L Q 0 20 Y N 2 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"FDMC8032L\" 200 0 50 H V L CNN\nF2 \"Package_SON:Fairchild_DualPower33-6_3x3mm\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n Fairchild*DualPower33*3x3mm*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G1 1 -200 0 100 R 50 50 1 1 P\nX S1 2 100 -200 100 U 50 50 1 1 P\nX D1 5 100 200 100 D 50 50 1 1 P\nX S2 3 100 -200 100 U 50 50 2 1 P\nX G2 4 -200 0 100 R 50 50 2 1 P\nX D2 6 100 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# FDS6890A\n#\nDEF FDS6890A Q 0 20 Y N 2 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"FDS6890A\" 200 0 50 H V L CNN\nF2 \"Package_SO:SOIC-8_3.9x4.9mm_P1.27mm\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS FDS6892A FDS6898A FDS9926A STS2DNE60 FDS6930A FDS6930B\n$FPLIST\n SOIC*3.9x4.9mm*P1.27mm*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S1 1 100 -200 100 U 50 50 1 1 P\nX G1 2 -200 0 100 R 50 50 1 1 P\nX D1 7 100 200 100 D 50 50 1 1 P N\nX D1 8 100 200 100 D 50 50 1 1 P\nX S2 3 100 -200 100 U 50 50 2 1 P\nX G2 4 -200 0 100 R 50 50 2 1 P\nX D2 5 100 200 100 D 50 50 2 1 P\nX D2 6 100 200 100 D 50 50 2 1 P N\nENDDRAW\nENDDEF\n#\n# IPD50R380CE\n#\nDEF IPD50R380CE Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IPD50R380CE\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:TO-252-2\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IPD50R3K0CE QM6006D\n$FPLIST\n TO?252*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IPDD60R050G7\n#\nDEF IPDD60R050G7 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IPDD60R050G7\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:Infineon_PG-HDSOP-10-1\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IPDD60R080G7 IPDD60R102G7 IPDD60R125G7 IPDD60R150G7 IPDD60R190G7\n$FPLIST\n Infineon*PG*HDSOP*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -125 11 0 1 0 F\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 -100 -100 -100 -125 100 -125 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 10 100 200 100 D 50 50 1 1 P N\nX DS 2 -200 -100 100 R 50 50 1 1 P\nX PS 3 100 -200 100 U 50 50 1 1 P\nX PS 4 100 -200 100 U 50 50 1 1 P N\nX PS 5 100 -200 100 U 50 50 1 1 P N\nX D 6 100 200 100 D 50 50 1 1 P\nX D 7 100 200 100 D 50 50 1 1 P N\nX D 8 100 200 100 D 50 50 1 1 P N\nX D 9 100 200 100 D 50 50 1 1 P N\nENDDRAW\nENDDEF\n#\n# IPT012N08N5\n#\nDEF IPT012N08N5 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IPT012N08N5\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:Infineon_PG-HSOF-8-1\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IPT015N10N5 IPT020N10N3\n$FPLIST\n Infineon*PG*HSOF*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX S 2 100 -200 100 U 50 50 1 1 P\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF40DM229\n#\nDEF IRF40DM229 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF40DM229\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_MF\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF7483M\n$FPLIST\n DirectFET*MF*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF60DM206\n#\nDEF IRF60DM206 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF60DM206\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_ME\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF7480M IRF7486M IRF7580M IRF7780M\n$FPLIST\n DirectFET*ME*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF6613\n#\nDEF IRF6613 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF6613\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_MT\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF6618 IRF6726M IRF8301M\n$FPLIST\n DirectFET*MT*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF6655\n#\nDEF IRF6655 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF6655\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_SH\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF6665\n$FPLIST\n DirectFET*SH*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF6710S2\n#\nDEF IRF6710S2 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF6710S2\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_S1\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF6810S\n$FPLIST\n DirectFET*S1*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF6718L2\n#\nDEF IRF6718L2 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF6718L2\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_L6\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF7748L1\n$FPLIST\n DirectFET*L6*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF6802SD\n#\nDEF IRF6802SD Q 0 20 Y N 2 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF6802SD\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_SA\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRL6297SD\n$FPLIST\n DirectFET*SA*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G1 2 -200 0 100 R 50 50 1 1 I\nX S1 3 100 -200 100 U 50 50 1 1 P\nX D 1 100 200 100 D 50 50 2 1 P\nX G2 4 -200 0 100 R 50 50 2 1 I\nX S2 5 100 -200 100 U 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# IRF6892S\n#\nDEF IRF6892S Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF6892S\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_S3C\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n DirectFET*S3C*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF7309IPBF\n#\nDEF IRF7309IPBF Q 0 20 Y N 2 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF7309IPBF\" 200 0 50 H V L CNN\nF2 \"Package_SO:SOIC-8_3.9x4.9mm_P1.27mm\" 200 -75 50 H I L CNN\nF3 \"\" 100 0 50 H I L CNN\nALIAS FDS4559 FDS4897AC FDS4897C FDS8960C FDS9934C IRF7343PBF Si4532DY Si4542DY\n$FPLIST\n SOIC*3.9x4.9mm*P1.27mm*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 1 1 0 40 0 80 15 80 -15 40 0 F\nP 4 1 1 0 110 20 115 15 145 15 150 10 N\nP 4 1 1 0 130 15 115 -10 145 -10 130 15 N\nP 4 2 1 0 90 0 50 15 50 -15 90 0 F\nP 4 2 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 2 1 0 130 -15 115 10 145 10 130 -15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX D 7 100 200 100 D 50 50 1 1 P N\nX D 8 100 200 100 D 50 50 1 1 P\nX 1 3 100 -200 100 U 50 50 2 1 P\nX G 4 -200 0 100 R 50 50 2 1 I\nX D 5 100 200 100 D 50 50 2 1 P N\nX D 6 100 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# IRF7324\n#\nDEF IRF7324 Q 0 20 Y N 2 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF7324\" 200 0 50 H V L CNN\nF2 \"Package_SO:SOIC-8_3.9x4.9mm_P1.27mm\" 200 -75 50 H I L CNN\nF3 \"\" 100 0 50 H I L CNN\n$FPLIST\n SOIC*3.9x4.9mm*P1.27mm*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX S1 1 100 -200 100 U 50 50 1 1 P\nX G1 2 -200 0 100 R 50 50 1 1 I\nX D1 7 100 200 100 D 50 50 1 1 P N\nX D1 8 100 200 100 D 50 50 1 1 P\nX S2 3 100 -200 100 U 50 50 2 1 P\nX G2 4 -200 0 100 R 50 50 2 1 I\nX D2 5 100 200 100 D 50 50 2 1 P N\nX D2 6 100 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# IRF7404\n#\nDEF IRF7404 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF7404\" 200 0 50 H V L CNN\nF2 \"Package_SO:SOIC-8_3.9x4.9mm_P1.27mm\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 V I L CNN\nALIAS FDS9435A\n$FPLIST\n SOIC*3.9x4.9mm*P1.27mm*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P N\nX S 3 100 -200 100 U 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 P\nX D 5 100 200 100 D 50 50 1 1 P N\nX D 6 100 200 100 D 50 50 1 1 P N\nX D 7 100 200 100 D 50 50 1 1 P N\nX D 8 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF7606PBF\n#\nDEF IRF7606PBF Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF7606PBF\" 200 0 50 H V L CNN\nF2 \"Package_SO:MSOP-8_3x3mm_P0.65mm\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 V I L CNN\n$FPLIST\n MSOP*3x3mm*P0.65mm*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P N\nX S 3 100 -200 100 U 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 P\nX D 5 100 200 100 D 50 50 1 1 P N\nX D 6 100 200 100 D 50 50 1 1 P N\nX D 7 100 200 100 D 50 50 1 1 P N\nX D 8 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF7607PBF\n#\nDEF IRF7607PBF Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF7607PBF\" 200 0 50 H V L CNN\nF2 \"Package_SO:MSOP-8_3x3mm_P0.65mm\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 V I L CNN\n$FPLIST\n MSOP*3x3mm*P0.65mm*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 200 100 D 50 50 1 1 P\nX S 2 100 200 100 D 50 50 1 1 P N\nX S 3 100 200 100 D 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 P\nX D 5 100 -200 100 U 50 50 1 1 P N\nX D 6 100 -200 100 U 50 50 1 1 P N\nX D 7 100 -200 100 U 50 50 1 1 P N\nX D 8 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF7665S2\n#\nDEF IRF7665S2 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF7665S2\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_SB\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n DirectFET*SB*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF7739L1\n#\nDEF IRF7739L1 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF7739L1\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_L8\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF7759L2 IRF7769L1 IRF7779L2 IRF7799L2 IRL7472L1\n$FPLIST\n DirectFET*L8*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF8721PBF-1\n#\nDEF IRF8721PBF-1 Q 0 20 Y N 1 F N\nF0 \"Q\" 200 100 50 H V L CNN\nF1 \"IRF8721PBF-1\" 200 0 50 H V L CNN\nF2 \"Package_SO:SOIC-8_3.9x4.9mm_P1.27mm\" 200 -100 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF7403 FDS2734 FDS6630A Si4162DY\n$FPLIST\n SOIC*3.9x4.9mm*P1.27mm*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P N\nX S 3 100 -200 100 U 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 I\nX D 5 100 200 100 D 50 50 1 1 P N\nX D 6 100 200 100 D 50 50 1 1 P N\nX D 7 100 200 100 D 50 50 1 1 P N\nX D 8 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF9383M\n#\nDEF IRF9383M Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF9383M\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_MX\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n DirectFET*MX*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF9394M\n#\nDEF IRF9394M Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF9394M\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_MC\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF9395M\n$FPLIST\n DirectFET*MC*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRF9540N\n#\nDEF IRF9540N Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRF9540N\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRF4905 FQP27P06\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRFI4019H\n#\nDEF IRFI4019H Q 0 20 Y N 1 F N\nF0 \"Q\" 200 175 50 H V L CNN\nF1 \"IRFI4019H\" 200 100 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220F-5_P3.4x2.06mm_StaggerEven_Lead1.86mm_Vertical\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS IRFI4020H IRFI4212H\n$FPLIST\n TO?220F*P3.4x2.06mm*StaggerEven*Lead1.86mm*\n$ENDFPLIST\nDRAW\nC 65 -200 110 0 1 10 N\nC 65 200 110 0 1 10 N\nC 100 -270 10 0 1 0 F\nC 100 -130 10 0 1 0 F\nC 100 0 10 0 1 0 F\nC 100 130 10 0 1 0 F\nC 100 270 10 0 1 0 F\nP 2 0 1 0 10 -200 -100 -200 N\nP 2 0 1 10 10 -125 10 -275 N\nP 2 0 1 0 10 200 -100 200 N\nP 2 0 1 10 10 275 10 125 N\nP 2 0 1 10 30 -250 30 -290 N\nP 2 0 1 10 30 -180 30 -220 N\nP 2 0 1 10 30 -110 30 -150 N\nP 2 0 1 10 30 150 30 110 N\nP 2 0 1 10 30 220 30 180 N\nP 2 0 1 10 30 290 30 250 N\nP 2 0 1 0 100 300 100 270 N\nP 3 0 1 0 100 -300 100 -200 30 -200 N\nP 3 0 1 0 100 -130 100 200 30 200 N\nP 4 0 1 0 30 -270 130 -270 130 -130 30 -130 N\nP 4 0 1 0 30 130 130 130 130 270 30 270 N\nP 4 0 1 0 40 -200 80 -185 80 -215 40 -200 F\nP 4 0 1 0 40 200 80 215 80 185 40 200 F\nP 4 0 1 0 110 -180 115 -185 145 -185 150 -190 N\nP 4 0 1 0 110 220 115 215 145 215 150 210 N\nP 4 0 1 0 130 -185 115 -210 145 -210 130 -185 N\nP 4 0 1 0 130 215 115 190 145 190 130 215 N\nX S2 1 100 -400 100 U 50 50 1 1 P\nX G2 2 -200 -200 100 R 50 50 1 1 I\nX S1/D2 3 200 0 100 L 50 50 1 1 P\nX G1 4 -200 200 100 R 50 50 1 1 I\nX D1 5 100 400 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRL6283M\n#\nDEF IRL6283M Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRL6283M\" 200 0 50 H V L CNN\nF2 \"Package_DirectFET:DirectFET_MD\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n DirectFET*MD*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# IRLIZ44N\n#\nDEF IRLIZ44N Q 0 20 Y N 1 F N\nF0 \"Q\" 250 75 50 H V L CNN\nF1 \"IRLIZ44N\" 250 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220F-3_Vertical\" 250 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?220F*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# PGA26E07BA\n#\nDEF PGA26E07BA Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"PGA26E07BA\" 200 0 50 H V L CNN\nF2 \"Package_DFN_QFN:Panasonic_HSON-8_8x8mm_P2.00mm\" 0 0 50 H I C CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS PGA26E19BA\n$FPLIST\n Panasonic*HSON*8x8mm*P2.00mm*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -125 11 0 1 0 F\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 -100 -100 -100 -125 100 -125 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX D 2 100 200 100 D 50 50 1 1 P N\nX D 3 100 200 100 D 50 50 1 1 P N\nX D 4 100 200 100 D 50 50 1 1 P N\nX S2 5 100 -200 100 U 50 50 1 1 P\nX S2 6 100 -200 100 U 50 50 1 1 P N\nX S1 7 -200 -100 100 R 50 50 1 1 P\nX G 8 -200 0 100 R 50 50 1 1 I\nX S2 9 100 -200 100 U 50 50 1 1 P N\nENDDRAW\nENDDEF\n#\n# PSMN5R2-60YL\n#\nDEF PSMN5R2-60YL Q 0 20 Y N 1 F N\nF0 \"Q\" 250 100 50 H V C CNN\nF1 \"PSMN5R2-60YL\" 500 0 50 H V C CNN\nF2 \"Package_TO_SOT_SMD:LFPAK56\" 150 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n LFPAK56*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P N\nX S 3 100 -200 100 U 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 P\nX D 5 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# QM6015D\n#\nDEF QM6015D Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"QM6015D\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:TO-252-2\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 V I L CNN\n$FPLIST\n TO?252*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX G 1 -200 0 100 R 50 50 1 1 P\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SUD19P06-60\n#\nDEF SUD19P06-60 Q 0 20 Y N 1 F N\nF0 \"Q\" 195 75 50 H V L CNN\nF1 \"SUD19P06-60\" 195 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:TO-252-2\" 195 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I C CNN\nALIAS SUD50P08-25L SUD45P03-09 SUD09P10-195 SUD08P06-155L SUD50P10-43L SUD50P06-15 SUD50P04-08\n$FPLIST\n TO?252*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Si1442DH\n#\nDEF Si1442DH Q 0 20 Y N 1 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"Si1442DH\" 200 -50 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 100 -400 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT?363*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX D 2 100 200 100 D 50 50 1 1 P N\nX G 3 -200 0 200 R 50 50 1 1 I\nX S 4 100 -200 100 U 50 50 1 1 P\nX D 5 100 200 100 D 50 50 1 1 P N\nX D 6 100 200 100 D 50 50 1 1 P N\nENDDRAW\nENDDEF\n#\n# Si7141DP\n#\nDEF Si7141DP Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"Si7141DP\" 200 0 50 H V L CNN\nF2 \"Package_SO:PowerPAK_SO-8_Single\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n PowerPAK*SO*Single*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P N\nX S 3 100 -200 100 U 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 I\nX D 5 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# Si7336ADP\n#\nDEF Si7336ADP Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"Si7336ADP\" 200 0 50 H V L CNN\nF2 \"Package_SO:PowerPAK_SO-8_Single\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS Si7450DP\n$FPLIST\n PowerPAK*SO*Single*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 -70 130 -70 130 70 30 70 N\nP 4 0 1 0 40 0 80 15 80 -15 40 0 F\nP 4 0 1 0 110 20 115 15 145 15 150 10 N\nP 4 0 1 0 130 15 115 -10 145 -10 130 15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P N\nX S 3 100 -200 100 U 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 I\nX D 5 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SiA453EDJ\n#\nDEF SiA453EDJ Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"SiA453EDJ\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:Vishay_PowerPAK_SC70-6L_Single\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 V I L CNN\nALIAS SiA449DJ\n$FPLIST\n Vishay*PowerPAK*SC70*Single*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 3 -200 0 100 R 50 50 1 1 P\nX S 4 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SiS415DNT\n#\nDEF SiS415DNT Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"SiS415DNT\" 200 0 50 H V L CNN\nF2 \"Package_SO:Vishay_PowerPAK_1212-8_Single\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 V I L CNN\nALIAS SiSS27DN\n$FPLIST\n Vishay*PowerPAK*1212*Single*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX S 2 100 -200 100 U 50 50 1 1 P N\nX S 3 100 -200 100 U 50 50 1 1 P N\nX G 4 -200 0 100 R 50 50 1 1 P\nX D 5 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# TP0610L\n#\nDEF TP0610L Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"TP0610L\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92L_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS VP0610L\n$FPLIST\n TO?92L*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX S 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 100 R 50 50 1 1 I\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# TP0610T\n#\nDEF TP0610T Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"TP0610T\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS VP0610T BSS84 NTR2101P BSS83P Si2319CDS IRLML6402 DMG2301L AO3401A IRLML9301 IRLML5203 Si2371EDS TSM2301ACX\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX S 2 100 -200 100 U 50 50 1 1 P\nX D 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# ZXMP4A16G\n#\nDEF ZXMP4A16G Q 0 20 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"ZXMP4A16G\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-223-3_TabPin2\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?223*\n$ENDFPLIST\nDRAW\nC 65 0 110 0 1 10 N\nC 100 -70 10 0 1 0 F\nC 100 70 10 0 1 0 F\nP 2 0 1 0 10 0 -100 0 N\nP 2 0 1 10 10 75 10 -75 N\nP 2 0 1 10 30 -50 30 -90 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 90 30 50 N\nP 2 0 1 0 100 100 100 70 N\nP 3 0 1 0 100 -100 100 0 30 0 N\nP 4 0 1 0 30 70 130 70 130 -70 30 -70 N\nP 4 0 1 0 90 0 50 15 50 -15 90 0 F\nP 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N\nP 4 0 1 0 130 -15 115 10 145 10 130 -15 N\nX G 1 -200 0 100 R 50 50 1 1 I\nX D 2 100 200 100 D 50 50 1 1 P\nX S 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Transistor_IGBT.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP IRG4PF50W\nD 28A, 900V, N-Channel IGBT\nK N-Channel IGBT Power Transistor\nF http://www.irf.com/product-info/datasheets/data/irg4pf50w.pdf\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Transistor_IGBT.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# IRG4PF50W\n#\nDEF IRG4PF50W Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"IRG4PF50W\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-247-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?247*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 10 0 N\nP 2 0 1 10 30 -40 30 -80 N\nP 2 0 1 10 30 20 30 -20 N\nP 2 0 1 10 30 80 30 40 N\nP 2 0 1 0 100 -95 30 -60 N\nP 2 0 1 0 100 -35 30 0 N\nP 2 0 1 0 100 95 30 60 N\nP 3 0 1 10 10 75 10 -75 10 -75 N\nP 4 0 1 0 55 -85 65 -65 100 -95 55 -85 F\nP 4 0 1 0 85 75 75 95 40 65 85 75 F\nX G 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Triac_Thyristor.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP BT136-500\nD 4A RMS, 500V Off-State Voltage, Triac, TO-220\nK Triac\nF http://www.micropik.com/PDF/BT136-600.pdf\n$ENDCMP\n#\n$CMP BT136-600\nD 4A RMS, 500V Off-State Voltage, Triac, TO-220\nK Triac\nF http://www.micropik.com/PDF/BT136-600.pdf\n$ENDCMP\n#\n$CMP BT136-800\nD 4A RMS, 800V Off-State Voltage, Triac, TO-220\nK Triac\nF http://www.micropik.com/PDF/BT136-600.pdf\n$ENDCMP\n#\n$CMP BT138-600\nD 12A RMS, 600V Off-State Voltage, Triac, TO-220\nK Triac\nF https://assets.nexperia.com/documents/data-sheet/BT138_SER_D_E.pdf\n$ENDCMP\n#\n$CMP BT138-800\nD 12A RMS, 800V Off-State Voltage, Triac, TO-220\nK Triac\nF https://assets.nexperia.com/documents/data-sheet/BT138_SER_D_E.pdf\n$ENDCMP\n#\n$CMP BT139-600\nD 16A RMS, 600V Off-State Voltage, 4Q Triac, TO-220\nK Triac\nF https://www.rapidonline.com/pdf/47-3240.pdf\n$ENDCMP\n#\n$CMP BT169B\nD 0.5A Ion, 200V Voff, Thyristors logic level, Silicon Controlled Rectifier (Thyristor), TO-92\nK thyristor logic level\nF https://media.digikey.com/pdf/Data%20Sheets/NXP%20PDFs/BT169_Series.pdf\n$ENDCMP\n#\n$CMP BT169D\nD 0.5A Ion, 400V Voff, Thyristors logic level, Silicon Controlled Rectifier (Thyristor), TO-92\nK thyristor logic level\nF https://media.digikey.com/pdf/Data%20Sheets/NXP%20PDFs/BT169_Series.pdf\n$ENDCMP\n#\n$CMP BT169G\nD 0.5A Ion, 600V Voff, Thyristors logic level, Silicon Controlled Rectifier (Thyristor), TO-92\nK thyristor logic level\nF https://media.digikey.com/pdf/Data%20Sheets/NXP%20PDFs/BT169_Series.pdf\n$ENDCMP\n#\n$CMP BTA16-600B\nD 16A RMS, 600V Off-State Voltage, 50mA Sensitivity, Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTA16-600BW\nD 16A RMS, 600V Off-State Voltage, 50mA Sensitivity, Snubberless, Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTA16-600C\nD 16A RMS, 600V Off-State Voltage, 35mA Sensitivity, Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTA16-600CW\nD 16A RMS, 600V Off-State Voltage, 35mA Sensitivity, Snubberless, Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTA16-600SW\nD 16A RMS, 600V Off-State Voltage, 10mA Sensitivity, Snubberless, Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTA16-800B\nD 16A RMS, 800V Off-State Voltage, 50mA Sensitivity, Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTA16-800BW\nD 16A RMS, 800V Off-State Voltage, 50mA Sensitivity, Snubberless, Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTA16-800C\nD 16A RMS, 800V Off-State Voltage, 35mA Sensitivity, Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTA16-800CW\nD 16A RMS, 800V Off-State Voltage, 35mA Sensitivity, Snubberless, Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTA16-800SW\nD 16A RMS, 800V Off-State Voltage, 10mA Sensitivity, Snubberless, Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTB16-600B\nD 16A RMS, 600V Off-State Voltage, 50mA Sensitivity, Non-Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTB16-600BW\nD 16A RMS, 600V Off-State Voltage, 50mA Sensitivity, Snubberless, Non-Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTB16-600C\nD 16A RMS, 600V Off-State Voltage, 35mA Sensitivity, Non-Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTB16-600CW\nD 16A RMS, 600V Off-State Voltage, 35mA Sensitivity, Snubberless, Non-Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTB16-600SW\nD 16A RMS, 600V Off-State Voltage, 10mA Sensitivity, Snubberless, Non-Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTB16-800B\nD 16A RMS, 800V Off-State Voltage, 50mA Sensitivity, Non-Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTB16-800BW\nD 16A RMS, 800V Off-State Voltage, 50mA Sensitivity, Snubberless, Non-Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTB16-800C\nD 16A RMS, 800V Off-State Voltage, 35mA Sensitivity, Non-Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTB16-800CW\nD 16A RMS, 800V Off-State Voltage, 35mA Sensitivity, Snubberless, Non-Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP BTB16-800SW\nD 16A RMS, 800V Off-State Voltage, 10mA Sensitivity, Snubberless, Non-Insulated, Triac, TO-220\nK Triac\nF https://www.st.com/resource/en/datasheet/bta16.pdf\n$ENDCMP\n#\n$CMP TIC106\nD 5A Ion, 400-800V Voff, Silicon Controlled Rectifier (Thyristor), TO-220\nK thyristor\nF http://pdf.datasheetcatalog.com/datasheet/PowerInnovations/mXyzrtvs.pdf\n$ENDCMP\n#\n$CMP TIC116\nD 8A Ion, 400-800V Voff, Silicon Controlled Rectifier (Thyristor), TO-220\nK thyristor\nF https://www.princeton.edu/~mae412/HANDOUTS/Datasheets/TIC116.pdf\n$ENDCMP\n#\n$CMP TIC126\nD 12A Ion, 400-800V Voff, Silicon Controlled Rectifier (Thyristor), TO-220\nK thyristor\nF https://cdn-reichelt.de/documents/datenblatt/A400/TIC126.pdf\n$ENDCMP\n#\n$CMP TIC206\nD 4A RMS, 400-700V Off-State Voltage, Sensitive Gate Triac, TO-220\nK Triac\nF http://www.farnell.com/datasheets/56922.pdf\n$ENDCMP\n#\n$CMP TIC216\nD 6A RMS, 400-800V Off-State Voltage, Triac, TO-220\nK Triac\nF http://www.mouser.com/ds/2/54/tic216-37811.pdf\n$ENDCMP\n#\n$CMP TIC226\nD 8A RMS, 400-800V Off-State Voltage, Triac, TO-220\nK Triac\nF http://pdf.datasheetcatalog.com/datasheet/PowerInnovations/mXuqxvy.pdf\n$ENDCMP\n#\n$CMP Z0103MN\nD 4Q Triac, 1A RMS, 600V VDRM, 3mA Igt, 7mA Ih, SOT-223\nK 4Q Triac\nF http://www.st.com/resource/en/datasheet/z01.pdf\n$ENDCMP\n#\n$CMP Z0103NN\nD 4Q Triac, 1A RMS, 800V VDRM, 3mA Igt, 7mA Ih, SOT-223\nK 4Q Triac\nF http://www.st.com/resource/en/datasheet/z01.pdf\n$ENDCMP\n#\n$CMP Z0107MN\nD 4Q Triac, 1A RMS, 600V VDRM, 5mA Igt, 10mA Ih, SOT-223\nK 4Q Triac\nF http://www.st.com/resource/en/datasheet/z01.pdf\n$ENDCMP\n#\n$CMP Z0107NN\nD 4Q Triac, 1A RMS, 800V VDRM, 5mA Igt, 10mA Ih, SOT-223\nK 4Q Triac\nF http://www.st.com/resource/en/datasheet/z01.pdf\n$ENDCMP\n#\n$CMP Z0109MN\nD 4Q Triac, 1A RMS, 600V VDRM, 10mA Igt, 10mA Ih, SOT-223\nK 4Q Triac\nF http://www.st.com/resource/en/datasheet/z01.pdf\n$ENDCMP\n#\n$CMP Z0109NN\nD 4Q Triac, 1A RMS, 800V VDRM, 10mA Igt, 10mA Ih, SOT-223\nK 4Q Triac\nF http://www.st.com/resource/en/datasheet/z01.pdf\n$ENDCMP\n#\n$CMP Z0110MN\nD 4Q Triac, 1A RMS, 600V VDRM, 25mA Igt, 25mA Ih, SOT-223\nK 4Q Triac\nF http://www.st.com/resource/en/datasheet/z01.pdf\n$ENDCMP\n#\n$CMP Z0110NN\nD 4Q Triac, 1A RMS, 800V VDRM, 25mA Igt, 25mA Ih, SOT-223\nK 4Q Triac\nF http://www.st.com/resource/en/datasheet/z01.pdf\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/Triac_Thyristor.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# BT169B\n#\nDEF BT169B Q 0 0 Y N 1 F N\nF0 \"Q\" 100 75 50 H V L CNN\nF1 \"BT169B\" 100 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 100 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BT169D BT169G\n$FPLIST\n TO?92*Inline*Narrow*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -50 -100 -25 -50 N\nP 2 0 1 8 -50 -50 50 -50 N\nP 2 0 1 0 0 -100 0 100 N\nP 4 0 1 8 -50 50 50 50 0 -50 -50 50 N\nX A 1 0 150 100 D 50 50 1 1 P\nX G 2 -150 -100 100 R 50 50 1 1 I\nX K 3 0 -150 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# TIC106\n#\nDEF TIC106 Q 0 0 Y N 1 F N\nF0 \"Q\" 100 75 50 H V L CNN\nF1 \"TIC106\" 100 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 100 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS TIC116 TIC126\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nP 2 0 1 0 -50 -100 -25 -50 N\nP 2 0 1 8 -50 -50 50 -50 N\nP 2 0 1 0 0 -100 0 100 N\nP 4 0 1 8 -50 50 50 50 0 -50 -50 50 N\nX K 1 0 -150 100 U 50 50 1 1 P\nX A 2 0 150 100 D 50 50 1 1 P\nX G 3 -150 -100 100 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# TIC226\n#\nDEF TIC226 Q 0 0 Y Y 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"TIC226\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS TIC206 BT138-600 BT138-800 TIC216 BT136-500 BT136-600 BT136-800 BT139-600 BTA16-600B BTA16-600BW BTA16-600C BTA16-600CW BTA16-600SW BTA16-800B BTA16-800BW BTA16-800C BTA16-800CW BTA16-800SW BTB16-600B BTB16-600BW BTB16-600C BTB16-600CW BTB16-600SW BTB16-800B BTB16-800BW BTB16-800C BTB16-800CW BTB16-800SW\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nP 2 0 1 8 -100 -50 100 -50 N\nP 2 0 1 8 -100 50 100 50 N\nP 2 0 1 0 -50 -100 -25 -50 N\nP 3 0 1 8 -100 50 -50 -50 0 50 N\nP 3 0 1 8 0 -50 50 50 100 -50 N\nX A1 1 0 -150 100 U 50 25 1 1 P\nX A2 2 0 150 100 D 50 25 1 1 P\nX G 3 -150 -100 100 R 50 25 1 1 I\nENDDRAW\nENDDEF\n#\n# Z0103MN\n#\nDEF Z0103MN D 0 0 Y N 1 F N\nF0 \"D\" 125 25 50 H V L CNN\nF1 \"Z0103MN\" 125 -50 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-223\" 750 -150 50 H I C CNN\nF3 \"\" 150 300 50 H I C CNN\nALIAS Z0103NN Z0107MN Z0107NN Z0109MN Z0109NN Z0110MN Z0110NN\n$FPLIST\n SOT*223*\n$ENDFPLIST\nDRAW\nP 2 0 1 8 -100 -50 100 -50 N\nP 2 0 1 8 -100 50 100 50 N\nP 2 0 1 0 -50 -100 -25 -50 N\nP 3 0 1 8 -100 50 -50 -50 0 50 N\nP 3 0 1 8 0 -50 50 50 100 -50 N\nX A1 1 0 -150 100 U 50 50 1 1 P\nX A2 2 0 150 100 D 50 50 1 1 P\nX G 3 -150 -100 100 R 50 50 1 1 I\nX A4 4 0 150 100 D 50 50 1 1 P N\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/eSim_Hybrid.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n#End Doc Library"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/additional/eSim_Hybrid.lib",
    "content": "EESchema-LIBRARY Version 2.3\n#encoding utf-8\n#\n# adc_bridge_1\n#\nDEF adc_bridge_1 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"adc_bridge_1\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -50 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX OUT1 2 550 50 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# adc_bridge_2\n#\nDEF adc_bridge_2 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"adc_bridge_2\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -100 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX IN2 2 -600 -50 200 R 50 50 1 1 I\nX OUT1 3 550 50 200 L 50 50 1 1 O\nX OUT2 4 550 -50 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# adc_bridge_3\n#\nDEF adc_bridge_3 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"adc_bridge_3\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -200 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX IN2 2 -600 -50 200 R 50 50 1 1 I\nX IN3 3 -600 -150 200 R 50 50 1 1 I\nX OUT1 4 550 50 200 L 50 50 1 1 O\nX OUT2 5 550 -50 200 L 50 50 1 1 O\nX OUT3 6 550 -150 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# adc_bridge_4\n#\nDEF adc_bridge_4 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"adc_bridge_4\" 0 300 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -350 350 350 -200 0 1 0 N\nX IN1 1 -550 200 200 R 50 50 1 1 I\nX IN2 2 -550 100 200 R 50 50 1 1 I\nX IN3 3 -550 0 200 R 50 50 1 1 I\nX IN4 4 -550 -100 200 R 50 50 1 1 I\nX OUT1 5 550 200 200 L 50 50 1 1 O\nX OUT2 6 550 100 200 L 50 50 1 1 O\nX OUT3 7 550 0 200 L 50 50 1 1 O\nX OUT4 8 550 -100 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# adc_bridge_5\n#\nDEF adc_bridge_5 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"adc_bridge_5\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -400 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX IN2 2 -600 -50 200 R 50 50 1 1 I\nX IN3 3 -600 -150 200 R 50 50 1 1 I\nX IN4 4 -600 -250 200 R 50 50 1 1 I\nX IN5 5 -600 -350 200 R 50 50 1 1 I\nX OUT1 6 550 50 200 L 50 50 1 1 O\nX OUT2 7 550 -50 200 L 50 50 1 1 O\nX OUT3 8 550 -150 200 L 50 50 1 1 O\nX OUT4 9 550 -250 200 L 50 50 1 1 O\nX OUT5 10 550 -350 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# adc_bridge_6\n#\nDEF adc_bridge_6 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"adc_bridge_6\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -500 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX IN2 2 -600 -50 200 R 50 50 1 1 I\nX IN3 3 -600 -150 200 R 50 50 1 1 I\nX IN4 4 -600 -250 200 R 50 50 1 1 I\nX IN5 5 -600 -350 200 R 50 50 1 1 I\nX IN6 6 -600 -450 200 R 50 50 1 1 I\nX OUT1 7 550 50 200 L 50 50 1 1 O\nX OUT2 8 550 -50 200 L 50 50 1 1 O\nX OUT3 9 550 -150 200 L 50 50 1 1 O\nX OUT4 10 550 -250 200 L 50 50 1 1 O\nX OUT5 11 550 -350 200 L 50 50 1 1 O\nX OUT6 12 550 -450 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# adc_bridge_7\n#\nDEF adc_bridge_7 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"adc_bridge_7\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -600 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX IN2 2 -600 -50 200 R 50 50 1 1 I\nX IN3 3 -600 -150 200 R 50 50 1 1 I\nX IN4 4 -600 -250 200 R 50 50 1 1 I\nX IN5 5 -600 -350 200 R 50 50 1 1 I\nX IN6 6 -600 -450 200 R 50 50 1 1 I\nX IN7 7 -600 -550 200 R 50 50 1 1 I\nX OUT1 8 550 50 200 L 50 50 1 1 O\nX OUT2 9 550 -50 200 L 50 50 1 1 O\nX OUT3 10 550 -150 200 L 50 50 1 1 O\nX OUT4 11 550 -250 200 L 50 50 1 1 O\nX OUT5 12 550 -350 200 L 50 50 1 1 O\nX OUT6 13 550 -450 200 L 50 50 1 1 O\nX OUT7 14 550 -550 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# adc_bridge_8\n#\nDEF adc_bridge_8 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"adc_bridge_8\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -700 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX IN2 2 -600 -50 200 R 50 50 1 1 I\nX IN3 3 -600 -150 200 R 50 50 1 1 I\nX IN4 4 -600 -250 200 R 50 50 1 1 I\nX IN5 5 -600 -350 200 R 50 50 1 1 I\nX IN6 6 -600 -450 200 R 50 50 1 1 I\nX IN7 7 -600 -550 200 R 50 50 1 1 I\nX IN8 8 -600 -650 200 R 50 50 1 1 I\nX OUT1 9 550 50 200 L 50 50 1 1 O\nX OUT2 10 550 -50 200 L 50 50 1 1 O\nX OUT3 11 550 -150 200 L 50 50 1 1 O\nX OUT4 12 550 -250 200 L 50 50 1 1 O\nX OUT5 13 550 -350 200 L 50 50 1 1 O\nX OUT6 14 550 -450 200 L 50 50 1 1 O\nX OUT7 15 550 -550 200 L 50 50 1 1 O\nX OUT8 16 550 -650 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# dac_bridge_1\n#\nDEF dac_bridge_1 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"dac_bridge_1\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -50 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX OUT1 2 550 50 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# dac_bridge_2\n#\nDEF dac_bridge_2 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"dac_bridge_2\" 50 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -250 200 350 -100 0 1 0 N\nX IN1 1 -450 50 200 R 50 50 1 1 I\nX IN2 2 -450 -50 200 R 50 50 1 1 I\nX OUT1 3 550 50 200 L 50 50 1 1 O\nX OUT4 4 550 -50 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# dac_bridge_3\n#\nDEF dac_bridge_3 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"dac_bridge_3\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -200 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX IN2 2 -600 -50 200 R 50 50 1 1 I\nX IN3 3 -600 -150 200 R 50 50 1 1 I\nX OUT1 4 550 50 200 L 50 50 1 1 O\nX OUT2 5 550 -50 200 L 50 50 1 1 O\nX OUT3 6 550 -150 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# dac_bridge_4\n#\nDEF dac_bridge_4 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"dac_bridge_4\" 0 300 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -350 350 350 -200 0 1 0 N\nX IN1 1 -550 200 200 R 50 50 1 1 I\nX IN2 2 -550 100 200 R 50 50 1 1 I\nX IN3 3 -550 0 200 R 50 50 1 1 I\nX IN4 4 -550 -100 200 R 50 50 1 1 I\nX OUT1 5 550 200 200 L 50 50 1 1 O\nX OUT2 6 550 100 200 L 50 50 1 1 O\nX OUT3 7 550 0 200 L 50 50 1 1 O\nX OUT4 8 550 -100 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# dac_bridge_5\n#\nDEF dac_bridge_5 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"dac_bridge_5\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -400 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX IN2 2 -600 -50 200 R 50 50 1 1 I\nX IN3 3 -600 -150 200 R 50 50 1 1 I\nX IN4 4 -600 -250 200 R 50 50 1 1 I\nX IN5 5 -600 -350 200 R 50 50 1 1 I\nX OUT1 6 550 50 200 L 50 50 1 1 O\nX OUT2 7 550 -50 200 L 50 50 1 1 O\nX OUT3 8 550 -150 200 L 50 50 1 1 O\nX OUT4 9 550 -250 200 L 50 50 1 1 O\nX OUT5 10 550 -350 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# dac_bridge_6\n#\nDEF dac_bridge_6 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"dac_bridge_6\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -500 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX IN2 2 -600 -50 200 R 50 50 1 1 I\nX IN3 3 -600 -150 200 R 50 50 1 1 I\nX IN4 4 -600 -250 200 R 50 50 1 1 I\nX IN5 5 -600 -350 200 R 50 50 1 1 I\nX IN6 6 -600 -450 200 R 50 50 1 1 I\nX OUT1 7 550 50 200 L 50 50 1 1 O\nX OUT2 8 550 -50 200 L 50 50 1 1 O\nX OUT3 9 550 -150 200 L 50 50 1 1 O\nX OUT4 10 550 -250 200 L 50 50 1 1 O\nX OUT5 11 550 -350 200 L 50 50 1 1 O\nX OUT6 12 550 -450 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# dac_bridge_7\n#\nDEF dac_bridge_7 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"dac_bridge_7\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -600 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX IN2 2 -600 -50 200 R 50 50 1 1 I\nX IN3 3 -600 -150 200 R 50 50 1 1 I\nX IN4 4 -600 -250 200 R 50 50 1 1 I\nX IN5 5 -600 -350 200 R 50 50 1 1 I\nX IN6 6 -600 -450 200 R 50 50 1 1 I\nX IN7 7 -600 -550 200 R 50 50 1 1 I\nX OUT1 8 550 50 200 L 50 50 1 1 O\nX OUT2 9 550 -50 200 L 50 50 1 1 O\nX OUT3 10 550 -150 200 L 50 50 1 1 O\nX OUT4 11 550 -250 200 L 50 50 1 1 O\nX OUT5 12 550 -350 200 L 50 50 1 1 O\nX OUT6 13 550 -450 200 L 50 50 1 1 O\nX OUT7 14 550 -550 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n# dac_bridge_8\n#\nDEF dac_bridge_8 U 0 40 Y Y 1 F N\nF0 \"U\" 0 0 60 H V C CNN\nF1 \"dac_bridge_8\" 0 150 60 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\nDRAW\nS -400 200 350 -700 0 1 0 N\nX IN1 1 -600 50 200 R 50 50 1 1 I\nX IN2 2 -600 -50 200 R 50 50 1 1 I\nX IN3 3 -600 -150 200 R 50 50 1 1 I\nX IN4 4 -600 -250 200 R 50 50 1 1 I\nX IN5 5 -600 -350 200 R 50 50 1 1 I\nX IN6 6 -600 -450 200 R 50 50 1 1 I\nX IN7 7 -600 -550 200 R 50 50 1 1 I\nX IN8 8 -600 -650 200 R 50 50 1 1 I\nX OUT1 9 550 50 200 L 50 50 1 1 O\nX OUT2 10 550 -50 200 L 50 50 1 1 O\nX OUT3 11 550 -150 200 L 50 50 1 1 O\nX OUT4 12 550 -250 200 L 50 50 1 1 O\nX OUT5 13 550 -350 200 L 50 50 1 1 O\nX OUT6 14 550 -450 200 L 50 50 1 1 O\nX OUT7 15 550 -550 200 L 50 50 1 1 O\nX OUT8 16 550 -650 200 L 50 50 1 1 O\nENDDRAW\nENDDEF\n#\n#End Library"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/default/Transistor_BJT.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP 2N2219\nD 800mA Ic, 50V Vce, NPN Transistor, TO-39\nK NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/2N2219-D.PDF\n$ENDCMP\n#\n$CMP 2N2646\nD Unijunction Transistor, TO-18\nK UJT\nF http://www.bucek.name/pdf/2n2646,2647.pdf\n$ENDCMP\n#\n$CMP 2N2647\nD Unijunction Transistor, TO-18\nK UJT\nF http://www.bucek.name/pdf/2n2646,2647.pdf\n$ENDCMP\n#\n$CMP 2N3055\nD 15A Ic, 60V Vce, Power NPN Transistor, TO-3\nK power NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/2N3055-D.PDF\n$ENDCMP\n#\n$CMP 2N3904\nD 0.2A Ic, 40V Vce, Small Signal NPN Transistor, TO-92\nK NPN Transistor\nF https://www.fairchildsemi.com/datasheets/2N/2N3904.pdf\n$ENDCMP\n#\n$CMP 2N3905\nD -0.2A Ic, -40V Vce, Small Signal PNP Transistor, TO-92\nK PNP Transistor\nF https://www.fairchildsemi.com/datasheets/2N/2N3905.pdf\n$ENDCMP\n#\n$CMP 2N3906\nD -0.2A Ic, -40V Vce, Small Signal PNP Transistor, TO-92\nK PNP Transistor\nF https://www.fairchildsemi.com/datasheets/2N/2N3906.pdf\n$ENDCMP\n#\n$CMP 2SA1015\nD -0.15A Ic, -50V Vce, Low Noise Audio PNP Transistor, TO-92\nK Low Noise Audio PNP Transistor\nF http://www.datasheetcatalog.org/datasheet/toshiba/905.pdf\n$ENDCMP\n#\n$CMP 2SB631\nD -1A Ic, -100V Vce, High Voltage Power PNP Transistor, TO-126\nK High Voltage Transistor\nF http://pdf.datasheetcatalog.com/datasheet/sanyo/ds_pdf_e/2SB631.pdf\n$ENDCMP\n#\n$CMP 2SB817\nD -12A Ic, -140V Vce, Silicon Power PNP Transistors, TO-3PB\nK Power PNP Transistor\nF http://skory.gylcomp.hu/alkatresz/2SB817.pdf\n$ENDCMP\n#\n$CMP 2SC1815\nD 0.15A Ic, 50V Vce, Low Noise Audio NPN Transistor, TO-92\nK Low Noise Audio NPN Transistor\nF https://media.digikey.com/pdf/Data%20Sheets/Toshiba%20PDFs/2SC1815.pdf\n$ENDCMP\n#\n$CMP 2SC1941\nD 50mA Ic, 160V Vce, Audio High Voltage NPN Transistor, TO-92\nK Audio High Voltage NPN Transistor\nF http://rtellason.com/transdata/2sc1941.pdf\n$ENDCMP\n#\n$CMP 2SC1945\nD 6A Ic, 80V Vce, Silicon 27MHz RF Power NPN Transistors, TO-220\nK RF Power NPN Transistor\nF http://rtellason.com/transdata/2sc1945.pdf\n$ENDCMP\n#\n$CMP 2SC4213\nD 0.3A Ic, 20V Vce, NPN Transistor, For Muting and Switching, SOT-323\nK NPN Transistor\nF https://toshiba.semicon-storage.com/info/docget.jsp?did=19305&prodName=2SC4213\n$ENDCMP\n#\n$CMP 2SD1047\nD 12A Ic, 140V Vce, Silicon Power NPN Transistors, TO-3PB\nK Power NPN Transistor\nF http://www.st.com/resource/en/datasheet/2sd1047.pdf\n$ENDCMP\n#\n$CMP 2SD600\nD 1A Ic, 100V Vce, High Voltage Power NPN Transistor, TO-126\nK High Voltage Power Transistor\nF http://pdf.datasheetcatalog.com/datasheet/sanyo/ds_pdf_e/2SB631.pdf\n$ENDCMP\n#\n$CMP BC107\nD 0.1A Ic, 50V Vce, Low Noise General Purpose NPN Transistor, TO-18\nK NPN low noise transistor\nF http://www.b-kainka.de/Daten/Transistor/BC108.pdf\n$ENDCMP\n#\n$CMP BC108\nD 0.1A Ic, 30V Vce, Low Noise General Purpose NPN Transistor, TO-18\nK NPN low noise transistor\nF http://www.b-kainka.de/Daten/Transistor/BC108.pdf\n$ENDCMP\n#\n$CMP BC109\nD 0.2A Ic, 25V Vce, Low Noise General Purpose NPN Transistor, TO-18\nK NPN low noise transistor\nF http://www.farnell.com/datasheets/296634.pdf\n$ENDCMP\n#\n$CMP BC140\nD 1A Ic, 40V Vce, NPN Transistor, TO-39\nK NPN Transistor\nF http://www.farnell.com/datasheets/296634.pdf\n$ENDCMP\n#\n$CMP BC141\nD 1A Ic, 60V Vce, NPN Transistor, TO-39\nK NPN Transistor\nF http://www.farnell.com/datasheets/296634.pdf\n$ENDCMP\n#\n$CMP BC160\nD 1A Ic, 40V Vce, Power PNP Transistor, TO-39\nK power PNP Transistor\nF http://www.farnell.com/datasheets/1697389.pdf\n$ENDCMP\n#\n$CMP BC161\nD 1A Ic, 60V Vce, Power PNP Transistor, TO-39\nK power PNP Transistor\nF http://www.farnell.com/datasheets/1697389.pdf\n$ENDCMP\n#\n$CMP BC237\nD 100mA Ic, 50V Vce, Epitaxial Silicon NPN Transistor, TO-92\nK Epitaxial Silicon NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/BC237-D.PDF\n$ENDCMP\n#\n$CMP BC240\nD 50mA Ic, 40V Vce, RF Signal NPN Transistor, TO-92\nK RF NPN Transistor\nF http://www.fairchildsemi.com/ds/BF/BF240.pdf\n$ENDCMP\n#\n$CMP BC307\nD 100mA Ic, 45V Vce, Epitaxial Silicon PNP Transistor, TO-92\nK Epitaxial Silicon PNP Transistor\nF http://www.onsemi.com/pub_link/Collateral/BC307-D.PDF\n$ENDCMP\n#\n$CMP BC327\nD 0.8A Ic, 45V Vce, PNP Transistor, TO-92\nK PNP Transistor\nF http://www.onsemi.com/pub_link/Collateral/BC327-D.PDF\n$ENDCMP\n#\n$CMP BC328\nD 0.8A Ic, 25V Vce, PNP Transistor, TO-92\nK PNP Transistor\nF http://www.redrok.com/PNP_BC327_-45V_-800mA_0.625W_Hfe100_TO-92.pdf\n$ENDCMP\n#\n$CMP BC337\nD 0.8A Ic, 45V Vce, NPN Transistor, TO-92\nK NPN Transistor\nF https://diotec.com/tl_files/diotec/files/pdf/datasheets/bc337.pdf\n$ENDCMP\n#\n$CMP BC338\nD 0.8A Ic, 25V Vce, NPN Transistor, TO-92\nK NPN Transistor\nF http://diotec.com/tl_files/diotec/files/pdf/datasheets/bc337\n$ENDCMP\n#\n$CMP BC413\nD 0.1A Ic, 30V Vce, Small Signal NPN Transistor, TO-92\nK NPN Transistor\nF http://www.cdil.com/datasheets/bc413_14_b_c.pdf\n$ENDCMP\n#\n$CMP BC413B\nD 0.1A Ic, 30V Vce, Small Signal NPN Transistor, TO-92\nK NPN Transistor\nF http://www.cdil.com/datasheets/bc413_14_b_c.pdf\n$ENDCMP\n#\n$CMP BC413C\nD 0.1A Ic, 30V Vce, Small Signal NPN Transistor, TO-92\nK NPN Transistor\nF http://www.cdil.com/datasheets/bc413_14_b_c.pdf\n$ENDCMP\n#\n$CMP BC414\nD 0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92\nK NPN Transistor\nF http://www.cdil.com/datasheets/bc413_14_b_c.pdf\n$ENDCMP\n#\n$CMP BC414B\nD 0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92\nK NPN Transistor\nF http://www.cdil.com/datasheets/bc413_14_b_c.pdf\n$ENDCMP\n#\n$CMP BC414C\nD 0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92\nK NPN Transistor\nF http://www.cdil.com/datasheets/bc413_14_b_c.pdf\n$ENDCMP\n#\n$CMP BC516\nD 1A Ic, 30V Vce, Darlington PNP Transistor, TO-92\nK PNP Darlington Darl Transistor\nF http://www.fairchildsemi.com/ds/BC/BC516.pdf\n$ENDCMP\n#\n$CMP BC517\nD 1A Ic, 30V Vce, Darlington NPN Transistor, TO-92\nK NPN Darlington Darl Transistor\nF http://www.fairchildsemi.com/ds/BC/BC517.pdf\n$ENDCMP\n#\n$CMP BC546\nD 0.1A Ic, 65V Vce, Small Signal NPN Transistor, TO-92\nK NPN Transistor\nF http://www.fairchildsemi.com/ds/BC/BC547.pdf\n$ENDCMP\n#\n$CMP BC547\nD 0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92\nK NPN Transistor\nF http://www.fairchildsemi.com/ds/BC/BC547.pdf\n$ENDCMP\n#\n$CMP BC548\nD 0.1A Ic, 30V Vce, Small Signal NPN Transistor, TO-92\nK NPN Transistor\nF http://www.fairchildsemi.com/ds/BC/BC547.pdf\n$ENDCMP\n#\n$CMP BC549\nD 0.1A Ic, 30V Vce, Small Signal NPN Transistor, TO-92\nK NPN Transistor\nF http://www.fairchildsemi.com/ds/BC/BC547.pdf\n$ENDCMP\n#\n$CMP BC550\nD 0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92\nK NPN Transistor\nF http://www.fairchildsemi.com/ds/BC/BC547.pdf\n$ENDCMP\n#\n$CMP BC556\nD 0.1A Ic, 65V Vce, PNP Small Signal Transistor, TO-92\nK PNP Transistor\nF http://www.fairchildsemi.com/ds/BC/BC557.pdf\n$ENDCMP\n#\n$CMP BC557\nD 0.1A Ic, 45V Vce, PNP Small Signal Transistor, TO-92\nK PNP Transistor\nF http://www.fairchildsemi.com/ds/BC/BC557.pdf\n$ENDCMP\n#\n$CMP BC558\nD 0.1A Ic, 30V Vce, PNP Small Signal Transistor, TO-92\nK PNP Transistor\nF http://www.fairchildsemi.com/ds/BC/BC557.pdf\n$ENDCMP\n#\n$CMP BC559\nD 0.1A Ic, 30V Vce, PNP Small Signal Transistor, TO-92\nK PNP Transistor\nF http://www.fairchildsemi.com/ds/BC/BC557.pdf\n$ENDCMP\n#\n$CMP BC560\nD 0.1A Ic, 45V Vce, PNP Small Signal Transistor, TO-92\nK PNP Transistor\nF http://www.fairchildsemi.com/ds/BC/BC557.pdf\n$ENDCMP\n#\n$CMP BC636\nD 1A Ic, 45V Vce, PNP Medium Power Transistor, TO-92\nK PNP Transistor\nF http://www.fairchildsemi.com/ds/BC/BC636.pdf\n$ENDCMP\n#\n$CMP BC807\nD 0.8A Ic, 45V Vce, PNP Transistor, SOT-23\nK PNP Transistor\nF http://www.fairchildsemi.com/ds/BC/BC807.pdf\n$ENDCMP\n#\n$CMP BC807W\nD 0.8A Ic, 45V Vce, PNP Transistor, SOT-323\nK PNP transistor\nF http://www.fairchildsemi.com/ds/BC/BC807.pdf\n$ENDCMP\n#\n$CMP BC808\nD 0.8A Ic, 25V Vce, PNP Transistor, SOT-23\nK PNP Transistor\nF http://www.fairchildsemi.com/ds/BC/BC807.pdf\n$ENDCMP\n#\n$CMP BC808W\nD 0.8A Ic, 25V Vce, PNP Transistor, SOT-323\nK PNP transistor\nF http://www.fairchildsemi.com/ds/BC/BC807.pdf\n$ENDCMP\n#\n$CMP BC817\nD 0.8A Ic, 45V Vce, NPN Transistor, SOT-23\nK NPN Transistor\nF http://www.fairchildsemi.com/ds/BC/BC817.pdf\n$ENDCMP\n#\n$CMP BC817W\nD 0.8A Ic, 45V Vce, NPN Transistor, SOT-323\nK NPN Transistor\nF http://www.fairchildsemi.com/ds/BC/BC817.pdf\n$ENDCMP\n#\n$CMP BC818\nD 0.8A Ic, 25V Vce, NPN Transistor, SOT-23\nK NPN Transistor\nF https://www.fairchildsemi.com/datasheets/BC/BC818.pdf\n$ENDCMP\n#\n$CMP BC818W\nD 0.8A Ic, 25V Vce, NPN Transistor, SOT-323\nK NPN Transistor\nF https://www.fairchildsemi.com/datasheets/BC/BC818.pdf\n$ENDCMP\n#\n$CMP BC846\nD 0.1A Ic, 65V Vce, NPN Transistor, SOT-23\nK NPN Transistor\nF https://assets.nexperia.com/documents/data-sheet/BC846_SER.pdf\n$ENDCMP\n#\n$CMP BC846BDW1\nD 100mA IC, 65V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/BC846BDW1T1-D.PDF\n$ENDCMP\n#\n$CMP BC846BPDW1\nD 100mA IC, 65V Vce, Dual NPN/PNP Transistors, SOT-363\nK NPN/PNP Transistor\nF http://www.onsemi.com/pub_link/Collateral/BC846BPDW1T1-D.PDF\n$ENDCMP\n#\n$CMP BC846BPN\nD 100mA IC, 65V Vce, Dual NPN/PNP Transistors, SOT-363\nK NPN/PNP Transistor\nF https://assets.nexperia.com/documents/data-sheet/BC846BPN.pdf\n$ENDCMP\n#\n$CMP BC846BS\nD 100mA IC, 65V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF https://assets.nexperia.com/documents/data-sheet/BC846BS.pdf\n$ENDCMP\n#\n$CMP BC847\nD 0.1A Ic, 45V Vce, NPN Transistor, SOT-23\nK NPN Small Signal Transistor\nF http://www.infineon.com/dgdl/Infineon-BC847SERIES_BC848SERIES_BC849SERIES_BC850SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541d4630a1657\n$ENDCMP\n#\n$CMP BC847BDW1\nD 100mA IC, 45V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/BC846BDW1T1-D.PDF\n$ENDCMP\n#\n$CMP BC847BPDW1\nD 100mA IC, 45V Vce, Dual NPN/PNP Transistors, SOT-363\nK NPN/PNP Transistor\nF http://www.onsemi.com/pub_link/Collateral/BC846BPDW1T1-D.PDF\n$ENDCMP\n#\n$CMP BC847BPN\nD 100mA IC, 45V Vce, Dual NPN/PNP Transistors, SOT-363\nK NPN/PNP Transistor\nF https://assets.nexperia.com/documents/data-sheet/BC847BPN.pdf\n$ENDCMP\n#\n$CMP BC847BS\nD 100mA IC, 45V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF https://assets.nexperia.com/documents/data-sheet/BC847BS.pdf\n$ENDCMP\n#\n$CMP BC847W\nD 0.1A Ic, 45V Vce, NPN Transistor, SOT-323\nK NPN Small Signal Transistor\nF http://www.infineon.com/dgdl/Infineon-BC847SERIES_BC848SERIES_BC849SERIES_BC850SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541d4630a1657\n$ENDCMP\n#\n$CMP BC848\nD 0.1A Ic, 30V Vce, NPN Transistor, SOT-23\nK NPN Small Signal Transistor\nF http://www.infineon.com/dgdl/Infineon-BC847SERIES_BC848SERIES_BC849SERIES_BC850SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541d4630a1657\n$ENDCMP\n#\n$CMP BC848W\nD 0.1A Ic, 30V Vce, NPN Transistor, SOT-323\nK NPN Small Signal Transistor\nF http://www.infineon.com/dgdl/Infineon-BC847SERIES_BC848SERIES_BC849SERIES_BC850SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541d4630a1657\n$ENDCMP\n#\n$CMP BC849\nD 0.1A Ic, 30V Vce, NPN Transistor, SOT-23\nK NPN Small Signal Transistor\nF http://www.infineon.com/dgdl/Infineon-BC847SERIES_BC848SERIES_BC849SERIES_BC850SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541d4630a1657\n$ENDCMP\n#\n$CMP BC849W\nD 0.1A Ic, 30V Vce, NPN Transistor, SOT-323\nK NPN Small Signal Transistor\nF http://www.infineon.com/dgdl/Infineon-BC847SERIES_BC848SERIES_BC849SERIES_BC850SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541d4630a1657\n$ENDCMP\n#\n$CMP BC850\nD 0.1A Ic, 45V Vce, NPN Transistor, SOT-23\nK NPN Small Signal Transistor\nF http://www.infineon.com/dgdl/Infineon-BC847SERIES_BC848SERIES_BC849SERIES_BC850SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541d4630a1657\n$ENDCMP\n#\n$CMP BC850W\nD 0.1A Ic, 45V Vce, NPN Transistor, SOT-323\nK NPN Small Signal Transistor\nF http://www.infineon.com/dgdl/Infineon-BC847SERIES_BC848SERIES_BC849SERIES_BC850SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541d4630a1657\n$ENDCMP\n#\n$CMP BC856\nD 0.1A Ic, 65V Vce, PNP Transistor, SOT-23\nK PNP transistor\nF http://www.fairchildsemi.com/ds/BC/BC856.pdf\n$ENDCMP\n#\n$CMP BC856BDW1\nD 100mA IC, 65V Vce, Dual PNP/PNP Transistors, SOT-363\nK PNP/PNP Transistor\nF http://www.onsemi.com/pub_link/Collateral/BC856BDW1T1-D.PDF\n$ENDCMP\n#\n$CMP BC856BS\nD 100mA IC, 65V Vce, Dual PNP/PNP Transistors, SOT-363\nK PNP/PNP Transistor\nF https://assets.nexperia.com/documents/data-sheet/BC856BS.pdf\n$ENDCMP\n#\n$CMP BC856W\nD 0.1A Ic, 65V Vce, PNP Transistor, SOT-323\nK PNP transistor\nF http://www.fairchildsemi.com/ds/BC/BC856.pdf\n$ENDCMP\n#\n$CMP BC857\nD 0.1A Ic, 45V Vce, PNP Transistor, SOT-23\nK PNP transistor\nF http://www.fairchildsemi.com/ds/BC/BC856.pdf\n$ENDCMP\n#\n$CMP BC857BDW1\nD 100mA IC, 45V Vce, Dual PNP/PNP Transistors, SOT-363\nK PNP/PNP Transistor\nF http://www.onsemi.com/pub_link/Collateral/BC856BDW1T1-D.PDF\n$ENDCMP\n#\n$CMP BC857BS\nD 100mA IC, 45V Vce, Dual PNP/PNP Transistors, SOT-363\nK PNP/PNP Transistor\nF https://assets.nexperia.com/documents/data-sheet/BC857BS.pdf\n$ENDCMP\n#\n$CMP BC857W\nD 0.1A Ic, 45V Vce, PNP Small Signal Transistor, SOT-323\nK PNP Transistor\nF http://www.infineon.com/dgdl/Infineon-BC857SERIES_BC858SERIES_BC859SERIES_BC860SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541da0e3a1661\n$ENDCMP\n#\n$CMP BC858\nD 0.1A Ic, 30V Vce, PNP Transistor, SOT-23\nK PNP transistor\nF http://www.fairchildsemi.com/ds/BC/BC856.pdf\n$ENDCMP\n#\n$CMP BC858W\nD 0.1A Ic, 30V Vce, PNP Small Signal Transistor, SOT-323\nK PNP Transistor\nF http://www.infineon.com/dgdl/Infineon-BC857SERIES_BC858SERIES_BC859SERIES_BC860SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541da0e3a1661\n$ENDCMP\n#\n$CMP BC859\nD 0.1A Ic, 30V Vce, PNP Small Signal Transistor, SOT-23\nK PNP Transistor\nF http://www.infineon.com/dgdl/Infineon-BC857SERIES_BC858SERIES_BC859SERIES_BC860SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541da0e3a1661\n$ENDCMP\n#\n$CMP BC859W\nD 0.1A Ic, 30V Vce, PNP Small Signal Transistor, SOT-323\nK PNP Transistor\nF http://www.infineon.com/dgdl/Infineon-BC857SERIES_BC858SERIES_BC859SERIES_BC860SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541da0e3a1661\n$ENDCMP\n#\n$CMP BC860\nD 0.1A Ic, 45V Vce, PNP Small Signal Transistor, SOT-23\nK PNP Transistor\nF http://www.infineon.com/dgdl/Infineon-BC857SERIES_BC858SERIES_BC859SERIES_BC860SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541da0e3a1661\n$ENDCMP\n#\n$CMP BC860W\nD 0.1A Ic, 45V Vce, PNP Small Signal Transistor, SOT-323\nK PNP Transistor\nF http://www.infineon.com/dgdl/Infineon-BC857SERIES_BC858SERIES_BC859SERIES_BC860SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541da0e3a1661\n$ENDCMP\n#\n$CMP BCP51\nD 1A Ic, 45V Vce, PNP Medium Power Transistor, SOT-223\nK PNP Transistor\nF http://www.fairchildsemi.com/ds/BC/BCP51.pdf\n$ENDCMP\n#\n$CMP BCP53\nD 1A Ic, 80V Vce, PNP Medium Power Transistor, SOT-223\nK PNP Transistor\nF http://www.onsemi.com/pub_link/Collateral/BCP53T1-D.PDF\n$ENDCMP\n#\n$CMP BCP56\nD 1A Ic, 80V Vce, NPN Medium Power Transistor, SOT-223\nK NPN Transistor\nF http://cache.nxp.com/documents/data_sheet/BCP56_BCX56_BC56PA.pdf?pspll=1\n$ENDCMP\n#\n$CMP BCV29\nD NPN Darlington transistor, 30Vce, 500mA, SOT-89\nK transistor NPN Darlington\nF https://assets.nexperia.com/documents/data-sheet/BCV29_49.pdf\n$ENDCMP\n#\n$CMP BCV49\nD NPN Darlington transistor, 60Vce, 500mA, SOT-89\nK transistor NPN Darlington\nF https://assets.nexperia.com/documents/data-sheet/BCV29_49.pdf\n$ENDCMP\n#\n$CMP BCV61\nD 100mA IC, 30V Vce, Double NPN Transistors, Current mirror configuration, SOT-143\nK Transistor Double NPN\nF https://assets.nexperia.com/documents/data-sheet/BCV61.pdf\n$ENDCMP\n#\n$CMP BCV62\nD 100mA IC, 30V Vce, Double PNP Transistors, Current mirror configuration, SOT-143\nK Transistor Double PNP\nF https://assets.nexperia.com/documents/data-sheet/BCV62.pdf\n$ENDCMP\n#\n$CMP BCX51\nD 1A Ic, 45V Vce, PNP Medium Power Transistor, SOT-89\nK PNP Transistor\nF http://www.infineon.com/dgdl/bcx51_bcx52_bcx53.pdf\n$ENDCMP\n#\n$CMP BCX52\nD 1A Ic, 60V Vce, PNP Medium Power Transistor, SOT-89\nK PNP Transistor\nF http://www.infineon.com/dgdl/bcx51_bcx52_bcx53.pdf\n$ENDCMP\n#\n$CMP BCX53\nD 1A Ic, 80V Vce, PNP Medium Power Transistor, SOT-89\nK PNP Transistor\nF http://www.infineon.com/dgdl/bcx51_bcx52_bcx53.pdf\n$ENDCMP\n#\n$CMP BCX56\nD 1A Ic, 80V Vce, NPN Medium Power Transistor, SOT-89\nK NPN Transistor\nF http://cache.nxp.com/documents/data_sheet/BCP56_BCX56_BC56PA.pdf?pspll=1\n$ENDCMP\n#\n$CMP BD135\nD 1.5A Ic, 45V Vce, Low Voltage Transistor, TO-126\nK Low Voltage Transistor\nF http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00001225.pdf\n$ENDCMP\n#\n$CMP BD136\nD 1.5A Ic, 45V Vce, Low Voltage Transistor, TO-126\nK Low Voltage Transistor\nF http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00001225.pdf\n$ENDCMP\n#\n$CMP BD137\nD 1.5A Ic, 60V Vce, Low Voltage Transistor, TO-126\nK Low Voltage Transistor\nF http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00001225.pdf\n$ENDCMP\n#\n$CMP BD138\nD 1.5A Ic, 60V Vce, Low Voltage Transistor, TO-126\nK Low Voltage Transistor\nF http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00001225.pdf\n$ENDCMP\n#\n$CMP BD139\nD 1.5A Ic, 80V Vce, Low Voltage Transistor, TO-126\nK Low Voltage Transistor\nF http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00001225.pdf\n$ENDCMP\n#\n$CMP BD140\nD 1.5A Ic, 80V Vce, Low Voltage Transistor, TO-126\nK Low Voltage Transistor\nF http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00001225.pdf\n$ENDCMP\n#\n$CMP BD233\nD 2A Ic, 45V Vce, Low Voltage Transistor, TO-126\nK Low Voltage Transistor\nF http://www.fairchildsemi.com/ds/BD/BD233.pdf\n$ENDCMP\n#\n$CMP BD234\nD 2A Ic, 45V Vce, Low Voltage Transistor, TO-126\nK Low Voltage Transistor\nF http://www.electronica-pt.com/datasheets/bd/BD234.pdf\n$ENDCMP\n#\n$CMP BD235\nD 2A Ic, 60V Vce, Low Voltage Transistor, TO-126\nK Low Voltage Transistor\nF http://www.fairchildsemi.com/ds/BD/BD233.pdf\n$ENDCMP\n#\n$CMP BD236\nD 60V Vce, 2A, Low Voltage Transistor, TO-126\nK Low Voltage Transistor\nF http://www.electronica-pt.com/datasheets/bd/BD234.pdf\n$ENDCMP\n#\n$CMP BD237\nD 2A Ic, 80V Vce, Low Voltage Transistor, TO-126\nK Low Voltage Transistor\nF http://www.fairchildsemi.com/ds/BD/BD233.pdf\n$ENDCMP\n#\n$CMP BD238\nD 2A Ic, 80V Vce, Low Voltage Transistor, TO-126\nK Low Voltage Transistor\nF http://www.electronica-pt.com/datasheets/bd/BD234.pdf\n$ENDCMP\n#\n$CMP BD249\nD 25A Ic, 55V Vce, Silicon Power NPN Transistors, SOT-93/TO247\nK Power NPN Transistor\nF http://www.mospec.com.tw/pdf/power/BD249.pdf\n$ENDCMP\n#\n$CMP BD249A\nD 25A Ic, 70V Vce, Silicon Power NPN Transistors, SOT-93/TO247\nK Power NPN Transistor\nF http://www.mospec.com.tw/pdf/power/BD249.pdf\n$ENDCMP\n#\n$CMP BD249B\nD 25A Ic, 90V Vce, Silicon Power NPN Transistors, SOT-93/TO247\nK Power NPN Transistor\nF http://www.mospec.com.tw/pdf/power/BD249.pdf\n$ENDCMP\n#\n$CMP BD249C\nD 25A Ic, 115V Vce, Silicon Power NPN Transistors, SOT-93/TO247\nK Power NPN Transistor\nF http://www.mospec.com.tw/pdf/power/BD249.pdf\n$ENDCMP\n#\n$CMP BD250\nD 25A Ic, 55V Vce, Silicon Power PNP Transistors, SOT-93/TO247\nK Power PNP Transistor\nF http://www.mospec.com.tw/pdf/power/BD249.pdf\n$ENDCMP\n#\n$CMP BD250A\nD 25A Ic, 70V Vce, Silicon Power PNP Transistors, SOT-93/TO247\nK Power PNP Transistor\nF http://www.mospec.com.tw/pdf/power/BD249.pdf\n$ENDCMP\n#\n$CMP BD250B\nD 25A Ic, 90V Vce, Silicon Power PNP Transistors, SOT-93/TO247\nK Power PNP Transistor\nF http://www.mospec.com.tw/pdf/power/BD249.pdf\n$ENDCMP\n#\n$CMP BD250C\nD 25A Ic, 115V Vce, Silicon Power PNP Transistors, SOT-93/TO247\nK Power PNP Transistor\nF http://www.mospec.com.tw/pdf/power/BD249.pdf\n$ENDCMP\n#\n$CMP BD433\nD 4A Ic, 22V Vce, Power NPN Transistor, TO-126\nK Power NPN Transistor\nF http://www.cdil.com/datasheets/bd433_42.pdf\n$ENDCMP\n#\n$CMP BD434\nD 4A Ic, 22V Vce, Power PNP Transistor, TO-126\nK Power PNP Transistor\nF http://www.cdil.com/datasheets/bd433_42.pdf\n$ENDCMP\n#\n$CMP BD435\nD 4A Ic, 32V Vce, Power NPN Transistor, TO-126\nK Power NPN Transistor\nF http://www.cdil.com/datasheets/bd433_42.pdf\n$ENDCMP\n#\n$CMP BD436\nD 4A Ic, 32V Vce, Power PNP Transistor, TO-126\nK Power PNP Transistor\nF http://www.cdil.com/datasheets/bd433_42.pdf\n$ENDCMP\n#\n$CMP BD437\nD 4A Ic, 45V Vce, Power NPN Transistor, TO-126\nK Power NPN Transistor\nF http://www.cdil.com/datasheets/bd433_42.pdf\n$ENDCMP\n#\n$CMP BD438\nD 4A Ic, 45V Vce, Power PNP Transistor, TO-126\nK Power PNP Transistor\nF http://www.cdil.com/datasheets/bd433_42.pdf\n$ENDCMP\n#\n$CMP BD439\nD 4A Ic, 60V Vce, Power NPN Transistor, TO-126\nK Power NPN Transistor\nF http://www.cdil.com/datasheets/bd433_42.pdf\n$ENDCMP\n#\n$CMP BD440\nD 4A Ic, 60V Vce, Power PNP Transistor, TO-126\nK Power PNP Transistor\nF http://www.cdil.com/datasheets/bd433_42.pdf\n$ENDCMP\n#\n$CMP BD441\nD 4A Ic, 80V Vce, Power NPN Transistor, TO-126\nK Power NPN Transistor\nF http://www.cdil.com/datasheets/bd433_42.pdf\n$ENDCMP\n#\n$CMP BD442\nD 4A Ic, 80V Vce, Power PNP Transistor, TO-126\nK Power PNP Transistor\nF http://www.cdil.com/datasheets/bd433_42.pdf\n$ENDCMP\n#\n$CMP BD909\nD 15A, Silicon Power NPN Transistors, TO-220\nK Power NPN Transistor\nF http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00001277.pdf\n$ENDCMP\n#\n$CMP BD910\nD 15A, Silicon Power PNP Transistors, TO-220\nK Power PNP Transistor\nF http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00001277.pdf\n$ENDCMP\n#\n$CMP BD911\nD 15A, Silicon Power NPN Transistors, TO-220\nK Power NPN Transistor\nF http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00001277.pdf\n$ENDCMP\n#\n$CMP BD912\nD BD910, 15A, Silicon Power PNP Transistors, TO-220\nK Power PNP Transistor\nF http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00001277.pdf\n$ENDCMP\n#\n$CMP BDW93\nD 12A Ic, 45V Vce, Power Darlington NPN Transistor, TO-220\nK Darlington NPN Transistor\nF https://www.fairchildsemi.com/datasheets/BD/BDW93C.pdf\n$ENDCMP\n#\n$CMP BDW93A\nD 12A Ic, 60V Vce, Power Darlington NPN Transistor, TO-220\nK Darlington NPN Transistor\nF https://www.fairchildsemi.com/datasheets/BD/BDW93C.pdf\n$ENDCMP\n#\n$CMP BDW93B\nD 12A Ic, 80V Vce, Power Darlington NPN Transistor, TO-220\nK Darlington NPN Transistor\nF https://www.fairchildsemi.com/datasheets/BD/BDW93C.pdf\n$ENDCMP\n#\n$CMP BDW93C\nD 12A Ic, 100V Vce, Power Darlington NPN Transistor, TO-220\nK Darlington NPN Transistor\nF https://www.fairchildsemi.com/datasheets/BD/BDW93C.pdf\n$ENDCMP\n#\n$CMP BDW94\nD 12A Ic, 45V Vce, Power Darlington PNP Transistor, TO-220\nK Darlington PNP Transistor\nF http://www.bourns.com/data/global/pdfs/bdw94.pdf\n$ENDCMP\n#\n$CMP BDW94A\nD 12A Ic, 60V Vce, Power Darlington PNP Transistor, TO-220\nK Darlington PNP Transistor\nF http://www.bourns.com/data/global/pdfs/bdw94.pdf\n$ENDCMP\n#\n$CMP BDW94B\nD 12A Ic, 80V Vce, Power Darlington PNP Transistor, TO-220\nK Darlington PNP Transistor\nF http://www.bourns.com/data/global/pdfs/bdw94.pdf\n$ENDCMP\n#\n$CMP BDW94C\nD 12A Ic, 100V Vce, Power Darlington PNP Transistor, TO-220\nK Darlington PNP Transistor\nF http://www.bourns.com/data/global/pdfs/bdw94.pdf\n$ENDCMP\n#\n$CMP BF199\nD 50mA Ic, 25V Vce, NPN Radio Frequency Transistor, TO-220\nK RF NPN Transistor\nF http://www.micropik.com/PDF/BF199.pdf\n$ENDCMP\n#\n$CMP BF457\nD 0.1A Ic, 160V Vce, High Voltage NPN Transistor, TO-126\nK NPN HV High Voltage Transistor\nF https://www.pcpaudio.com/pcpfiles/transistores/BF457-8-9.pdf\n$ENDCMP\n#\n$CMP BF458\nD 0.1A Ic, 250V Vce, High Voltage NPN Transistor, TO-126\nK NPN HV High Voltage Transistor\nF https://www.pcpaudio.com/pcpfiles/transistores/BF457-8-9.pdf\n$ENDCMP\n#\n$CMP BF459\nD 0.1A Ic, 300V Vce, High Voltage NPN Transistor, TO-126\nK NPN HV High Voltage Transistor\nF https://www.pcpaudio.com/pcpfiles/transistores/BF457-8-9.pdf\n$ENDCMP\n#\n$CMP BFR92\nD 0.025A Ic, 15V Vce, 5GHz Wideband NPN Transistor, SOT-323\nK RF 5GHz NPN Transistor\nF https://assets.nexperia.com/documents/data-sheet/BFR92A_N.pdf\n$ENDCMP\n#\n$CMP BFT92\nD 0.025A Ic, 15V Vce, 5GHz Wideband PNP Transistor, SOT-23\nK RF 5GHz NPN Transistor\nF https://assets.nexperia.com/documents/data-sheet/BFT92_CNV.pdf\n$ENDCMP\n#\n$CMP BUT11\nD 5A Ic, 400V Vce, Silicon Power NPN Transistors, TO-220\nK High Voltage Power NPN Transistor\nF http://www.fairchildsemi.com/ds/BU/BUT11.pdf\n$ENDCMP\n#\n$CMP BUT11A\nD 5A Ic, 450V Vce, Silicon Power NPN Transistors, TO-220\nK High Voltage Power NPN Transistor\nF http://www.fairchildsemi.com/ds/BU/BUT11.pdf\n$ENDCMP\n#\n$CMP DTA113T\nD Digital PNP Transistor, 1k/NONE, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA113Z\nD Digital PNP Transistor, 1k/10k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA114E\nD Digital PNP Transistor, 10k/10k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA114G\nD Digital PNP Transistor, 0k/10k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA114T\nD Digital PNP Transistor, 10k/NONE, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA114W\nD Digital PNP Transistor, 10k/4.7k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA114Y\nD Digital PNP Transistor, 10k/47k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA115E\nD Digital PNP Transistor, 100k/100k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA115G\nD Digital PNP Transistor, 0k/100k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA115T\nD Digital PNP Transistor, 100k/NONE, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA115U\nD Digital PNP Transistor, 100k/10k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA123E\nD Digital PNP Transistor, 2k2/2k2, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA123J\nD Digital PNP Transistor, 2k2/47k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA123Y\nD Digital PNP Transistor, 2k2/10k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA124E\nD Digital PNP Transistor, 22k/22k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA124G\nD Digital PNP Transistor, 0k/22k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA124T\nD Digital PNP Transistor, 22k/NONE, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA124X\nD Digital PNP Transistor, 22k/47k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA125T\nD Digital PNP Transistor, 200k/NONE, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA143E\nD Digital PNP Transistor, 4k7/4k7, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA143T\nD Digital PNP Transistor, 4k7/NONE, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA143X\nD Digital PNP Transistor, 4k7/10k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA143Y\nD Digital PNP Transistor, 4k7/22k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA143Z\nD Digital PNP Transistor, 4k7/47k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA144E\nD Digital PNP Transistor, 47k/47k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA144G\nD Digital PNP Transistor, 0k/47k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA144T\nD Digital PNP Transistor, 47k/NONE, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA144V\nD Digital PNP Transistor, 47k/10k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA144W\nD Digital PNP Transistor, 47k/22k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA1D3R\nD Digital PNP Transistor, 2k7/1k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTA214Y\nD Digital PNP Transistor, 10k/47k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTB113E\nD Digital PNP Transistor, 1k/1k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTB113Z\nD Digital PNP Transistor, 1k/10k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTB114E\nD Digital PNP Transistor, 10k/10k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTB114G\nD Digital PNP Transistor, 0k/10k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTB114T\nD Digital PNP Transistor, 10k/NONE, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTB122J\nD Digital PNP Transistor, 0k22/4k7, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTB123E\nD Digital PNP Transistor, 2k2/2k2, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTB123T\nD Digital PNP Transistor, 2k2/NONE, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTB123Y\nD Digital PNP Transistor, 2k2/10k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTB133H\nD Digital PNP Transistor, 3k3/10k, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTB143T\nD Digital PNP Transistor, 4k7/NONE, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTB163T\nD Digital PNP Transistor, 6k8/NONE, SOT-23\nK ROHM Digital PNP Transistor\n$ENDCMP\n#\n$CMP DTC113T\nD Digital NPN Transistor, 1k/NONE, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC113Z\nD Digital NPN Transistor, 1k/10k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC114E\nD Digital NPN Transistor, 10k/10k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC114G\nD Digital NPN Transistor, 0k/10k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC114T\nD Digital NPN Transistor, 10k/NONE, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC114W\nD Digital NPN Transistor, 10k/4k7, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC114Y\nD Digital NPN Transistor, 10k/47k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC115E\nD Digital NPN Transistor, 100k/100k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC115G\nD Digital NPN Transistor, 0k/100k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC115T\nD Digital NPN Transistor, 100k/NONE, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC115U\nD Digital NPN Transistor, 100k/10k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC123E\nD Digital NPN Transistor, 2k2/2k2, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC123J\nD Digital NPN Transistor, 2k2/47k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC123Y\nD Digital NPN Transistor, 2k2/10k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC124E\nD Digital NPN Transistor, 22k/22k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC124G\nD Digital NPN Transistor, 0k/22k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC124T\nD Digital NPN Transistor, 22k/NONE, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC124X\nD Digital NPN Transistor, 22k/47k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC125T\nD Digital NPN Transistor, 200k/NONE, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC143E\nD Digital NPN Transistor, 4k7/4k7, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC143T\nD Digital NPN Transistor, 4k7/NONE, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC143X\nD Digital NPN Transistor, 4k7/10k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC143Y\nD Digital NPN Transistor, 4k7/22k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC143Z\nD Digital NPN Transistor, 4k7/47k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC144E\nD Digital NPN Transistor, 47k/47k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC144G\nD Digital NPN Transistor, 0k/47k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC144T\nD Digital NPN Transistor, 47k/NONE, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC144V\nD Digital NPN Transistor, 47k/10k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC144W\nD Digital NPN Transistor, 47k/22k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC1D3R\nD Digital NPN Transistor, 2k7/1k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTC214Y\nD Digital NPN Transistor, 10k/47k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTD113E\nD Digital NPN Transistor, 1k/1k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTD113Z\nD Digital NPN Transistor, 1k/10k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTD114E\nD Digital NPN Transistor, 10k/10k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTD114G\nD Digital NPN Transistor, 0k/10k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTD114T\nD Digital NPN Transistor, 10k/NONE, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTD122J\nD Digital NPN Transistor, 0k22/4k7, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTD123E\nD Digital NPN Transistor, 2k2/2k2, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTD123T\nD Digital NPN Transistor, 2k2/NONE, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTD123Y\nD Digital NPN Transistor, 2k2/10k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTD133H\nD Digital NPN Transistor, 3k3/10k, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTD143T\nD Digital NPN Transistor, 4k7/NONE, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP DTD163T\nD Digital NPN Transistor, 6k8/NONE, SOT-23\nK ROHM Digital NPN Transistor\n$ENDCMP\n#\n$CMP FFB2222A\nD 600mA IC, 40V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF https://www.fairchildsemi.com/datasheets/FF/FFB2222A.pdf\n$ENDCMP\n#\n$CMP FFB2227A\nD 500mA IC, 30V Vce, Dual NPN/PNP Transistors, SC-70-6\nK NPN/PNP Transistor\nF http://www.onsemi.com/pub/Collateral/FMB2227A-D.PDF\n$ENDCMP\n#\n$CMP FFB3904\nD 200mA IC, 40V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF https://www.fairchildsemi.com/datasheets/FF/FFB3904.pdf\n$ENDCMP\n#\n$CMP FFB3906\nD 200mA IC, 40V Vce, Dual PNP/PNP Transistors, SOT-363\nK PNP/PNP Transistor\nF https://www.fairchildsemi.com/datasheets/FF/FFB3906.pdf\n$ENDCMP\n#\n$CMP FFB3946\nD 200mA IC, 40V Vce, Dual NPN/PNP Transistors, SOT-363\nK NPN/PNP Transistor\nF http://www.onsemi.com/pub/Collateral/FMB3946-D.pdf\n$ENDCMP\n#\n$CMP FFB5551\nD 200mA IC, 160V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF https://www.fairchildsemi.com/datasheets/FF/FFB5551.pdf\n$ENDCMP\n#\n$CMP FMB2227A\nD 500mA IC, 30V Vce, Dual NPN/PNP Transistors, SuperSOT-6\nK NPN/PNP Transistor\nF http://www.onsemi.com/pub/Collateral/FMB2227A-D.PDF\n$ENDCMP\n#\n$CMP FMB3946\nD 200mA IC, 40V Vce, Dual NPN/PNP Transistors, SuperSOT-6\nK NPN/PNP Transistor\nF http://www.onsemi.com/pub/Collateral/FMB3946-D.pdf\n$ENDCMP\n#\n$CMP KTD1624\nD Epitaxial Planar NPN Transistor, SOT-89\nK Switching NPN Transistor\nF http://www2.kec.co.kr/data/databook/pdf/KTD/Eng/KTD1624.pdf\n$ENDCMP\n#\n$CMP MAT02\nD 20mA Ic, 40V Vce, Precision Dual Monolithic Low Noise, Low Offset Transistor, TO-78\nK Precision Dual Monolithic Transistor Low Noise EOL\nF http://www.elenota.pl/datasheet_download/93431/MAT02\n$ENDCMP\n#\n$CMP MBT2222ADW1T1\nD 600mA IC, 40V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/MBT2222ADW1T1-D.PDF\n$ENDCMP\n#\n$CMP MBT3904DW1\nD 200mA IC, 40V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/MBT3904DW1T1-D.PDF\n$ENDCMP\n#\n$CMP MBT3906DW1\nD 200mA IC, 40V Vce, Dual PNP/PNP Transistors, SOT-363\nK PNP/PNP Transistor\nF http://www.onsemi.com/pub_link/Collateral/MBT3906DW1T1-D.PDF\n$ENDCMP\n#\n$CMP MBT3946DW1T1\nD 200mA IC, 40V Vce, Dual NPN/PNP Transistors, SOT-363\nK NPN/PNP Transistor\nF http://www.onsemi.com/pub_link/Collateral/MBT3946DW1T1-D.PDF\n$ENDCMP\n#\n$CMP MJ2955\nD -15A Ic, -60V Vce, Power PNP Transistor, TO-3\nK power PNP Transistor\nF http://www.onsemi.com/pub_link/Collateral/2N3055-D.PDF\n$ENDCMP\n#\n$CMP MJE13003\nD 1.5A Ic, 400V Vce, Silicon Switching Power NPN Transistor, TO-225\nK Switching Power High Voltage NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/MJE13003-D.PDF\n$ENDCMP\n#\n$CMP MJE13005G\nD 4A Ic, 400V Vce, Silicon Switching Power NPN Transistors, TO-220\nK Switching Power NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/MJE13005-D.PDF\n$ENDCMP\n#\n$CMP MJE13007G\nD 8A Ic, 400V Vce, Silicon Switching Power NPN Transistors, TO-220\nK Switching Power NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/MJE13007-D.PDF\n$ENDCMP\n#\n$CMP MJE13009G\nD 12A Ic, 400V Vce, Silicon Switching Power NPN Transistors, TO-220\nK Switching Power NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/MJE13009-D.PDF\n$ENDCMP\n#\n$CMP MMBT3904\nD 0.2A Ic, 40V Vce, Small Signal NPN Transistor, SOT-23\nK NPN Transistor\nF https://www.fairchildsemi.com/datasheets/2N/2N3904.pdf\n$ENDCMP\n#\n$CMP MMBT3906\nD -0.2A Ic, -40V Vce, Small Signal PNP Transistor, SOT-23\nK PNP Transistor\nF https://www.fairchildsemi.com/datasheets/2N/2N3906.pdf\n$ENDCMP\n#\n$CMP MMBT5550L\nD 0.6A Ic, 140V Vce, NPN Transistor, SOT-23\nK NPN Transistor\nF www.onsemi.com/pub/Collateral/MMBT5550LT1-D.PDF\n$ENDCMP\n#\n$CMP MMBT5551L\nD 0.6A Ic, 160V Vce, NPN Transistor, SOT-23\nK NPN Transistor\nF www.onsemi.com/pub/Collateral/MMBT5550LT1-D.PDF\n$ENDCMP\n#\n$CMP MMBTA42\nD 0.5A Ic, 300V Vce, NPN High Voltage Transistor, SOT-23\nK NPN High Voltage Transistor\nF https://www.onsemi.com/pub/Collateral/MMBTA42LT1-D.PDF\n$ENDCMP\n#\n$CMP MMBTA92\nD 0.5A Ic, 300V Vce, PNP High Voltage Transistor, SOT-23\nK PNP High Voltage Transistor\nF https://www.onsemi.com/pub/Collateral/MMBTA92LT1-D.PDF\n$ENDCMP\n#\n$CMP MMDT2222A\nD 600mA IC, 40V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF http://www.diodes.com/_files/datasheets/ds30125.pdf\n$ENDCMP\n#\n$CMP MMDT3904\nD 200mA IC, 40V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF http://www.diodes.com/_files/datasheets/ds30088.pdf\n$ENDCMP\n#\n$CMP MMDT3906\nD 200mA IC, 40V Vce, Dual PNP/PNP Transistors, SOT-363\nK PNP/PNP Transistor\nF http://www.diodes.com/_files/datasheets/ds30124.pdf\n$ENDCMP\n#\n$CMP MMDT3946\nD 200mA IC, 40V Vce, Dual NPN/PNP Transistors, SOT-363\nK NPN/PNP Transistor\nF http://www.diodes.com/_files/datasheets/ds30123.pdf\n$ENDCMP\n#\n$CMP MMDT5401\nD 200mA IC, 160V Vce, Dual PNP/PNP Transistors, SOT-363\nK PNP/PNP Transistor\nF http://www.diodes.com/_files/datasheets/ds30169.pdf\n$ENDCMP\n#\n$CMP MMDT5551\nD 200mA IC, 160V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF http://www.diodes.com/_files/datasheets/ds30172.pdf\n$ENDCMP\n#\n$CMP MPSA42\nD 0.5A Ic, 300V Vce, NPN High Voltage Transistor, TO-92\nK NPN High Voltage Transistor\nF http://www.onsemi.com/pub_link/Collateral/MPSA42-D.PDF\n$ENDCMP\n#\n$CMP MPSA92\nD 0.5A Ic, 300V Vce, PNP High Voltage Transistor, TO-92\nK PNP High Voltage Transistor\nF http://www.onsemi.com/pub_link/Collateral/MPSA92-D.PDF\n$ENDCMP\n#\n$CMP MUN5211DW1\nD 0.1A Ic, 50V Vce, Dual NPN Bias Resistor Transistors, SOT-363\nK Dual NPN Transistor\nF http://www.onsemi.com/pub/Collateral/DTC114ED-D.PDF\n$ENDCMP\n#\n$CMP PBSS301PZ\nD -5.7A Ic, -12V Vce, Small Signal PNP Transistor, SOT-223\nK PNP Transistor\nF https://assets.nexperia.com/documents/data-sheet/PBSS301PZ.pdf\n$ENDCMP\n#\n$CMP PMBT2222AYS\nD 600mA IC, 40V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF https://assets.nexperia.com/documents/data-sheet/PMBT2222AYS.pdf\n$ENDCMP\n#\n$CMP PMBT3904YS\nD 200mA IC, 40V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF https://assets.nexperia.com/documents/data-sheet/PMBT3904YS.pdf\n$ENDCMP\n#\n$CMP PMBT3906YS\nD 200mA IC, 40V Vce, Dual PNP/PNP Transistors, SOT-363\nK PNP/PNP Transistor\nF https://assets.nexperia.com/documents/data-sheet/PMBT3906YS.pdf\n$ENDCMP\n#\n$CMP PMBT3946YPN\nD 200mA IC, 40V Vce, Dual NPN/PNP Transistors, SOT-363\nK NPN/PNP Transistor\nF https://assets.nexperia.com/documents/data-sheet/PMBT3946YPN.pdf\n$ENDCMP\n#\n$CMP PN2222A\nD 1A Ic, 40V Vce, NPN Transistor, General Purpose Transistor, TO-92\nK NPN Transistor\nF http://www.fairchildsemi.com/ds/PN/PN2222A.pdf\n$ENDCMP\n#\n$CMP PUMT1\nD 100mA IC, 40V Vce, Dual PNP/PNP Transistors, SOT-363\nK PNP/PNP Transistor\nF https://assets.nexperia.com/documents/data-sheet/PUMT1.pdf\n$ENDCMP\n#\n$CMP PUMX1\nD 100mA IC, 40V Vce, Dual NPN/NPN Transistors, SOT-363\nK NPN/NPN Transistor\nF https://assets.nexperia.com/documents/data-sheet/PUMX1.pdf\n$ENDCMP\n#\n$CMP PZT2222A\nD 1A Ic, 40V Vce, NPN Transistor, General Purpose Transistor, SOT-223\nK NPN General Puprose Transistor SMD\nF http://www.fairchildsemi.com/ds/PN/PN2222A.pdf\n$ENDCMP\n#\n$CMP PZT3904\nD 0.2A Ic, 40V Vce, Small Signal NPN Transistor, SOT-223\nK NPN Transistor\nF https://www.fairchildsemi.com/datasheets/2N/2N3904.pdf\n$ENDCMP\n#\n$CMP PZT3906\nD -0.2A Ic, -40V Vce, Small Signal PNP Transistor, SOT-223\nK PNP Transistor\nF https://www.fairchildsemi.com/datasheets/2N/2N3906.pdf\n$ENDCMP\n#\n$CMP PZTA42\nD 0.5A Ic, 300V Vce, NPN High Voltage Transistor, SOT-223\nK NPN High Voltage Transistor SMD\nF https://www.onsemi.com/pub/Collateral/PZTA42T1-D.PDF\n$ENDCMP\n#\n$CMP PZTA92\nD 0.5A Ic, 300V Vce, PNP High Voltage Transistor, SOT-223\nK PNP High Voltage Transistor\nF https://www.onsemi.com/pub/Collateral/PZTA92T1-D.PDF\n$ENDCMP\n#\n$CMP S8050\nD 0.7A Ic, 20V Vce, Low Voltage High Current NPN Transistor, TO-92\nK S8050 NPN Low Voltage High Current Transistor\nF http://www.unisonic.com.tw/datasheet/S8050.pdf\n$ENDCMP\n#\n$CMP S8550\nD 0.7A Ic, 20V Vce, Low Voltage High Current PNP Transistor, TO-92\nK S8550 PNP Low Voltage High Current Transistor\nF http://www.unisonic.com.tw/datasheet/S8550.pdf\n$ENDCMP\n#\n$CMP SSM2210\nD Audio Dual Matched NPN transistor, DIP-8/SOIC-8\nK audio npn dual\nF https://www.analog.com/media/en/technical-documentation/obsolete-data-sheets/SSM2210.pdf\n$ENDCMP\n#\n$CMP SSM2220\nD Audio Dual Matched PNP transistor, DIP-8/SOIC-8\nK audio pnp dual\nF https://www.analog.com/media/en/technical-documentation/data-sheets/SSM2220.pdf\n$ENDCMP\n#\n$CMP TIP120\nD 5A Ic, 60V Vce, Silicon Darlington Power NPN Transistor, TO-220\nK Darlington Power NPN Transistor\nF http://www.fairchildsemi.com/ds/TI/TIP120.pdf\n$ENDCMP\n#\n$CMP TIP121\nD 5A Ic, 80V Vce, Silicon Darlington Power NPN Transistor, TO-220\nK Darlington Power NPN Transistor\nF http://www.fairchildsemi.com/ds/TI/TIP120.pdf\n$ENDCMP\n#\n$CMP TIP122\nD 5A Ic, 100V Vce, Silicon Darlington Power NPN Transistor, TO-220\nK Darlington Power NPN Transistor\nF http://www.fairchildsemi.com/ds/TI/TIP120.pdf\n$ENDCMP\n#\n$CMP TIP125\nD 5A Ic, 60V Vce, Silicon Darlington Power PNP Transistor, TO-220\nK Darlington Power PNP Transistor\nF http://www.fairchildsemi.com/ds/TI/TIP125.pdf\n$ENDCMP\n#\n$CMP TIP126\nD 5A Ic, 80V Vce, Silicon Darlington Power PNP Transistor, TO-220\nK Darlington Power PNP Transistor\nF http://www.fairchildsemi.com/ds/TI/TIP125.pdf\n$ENDCMP\n#\n$CMP TIP127\nD 5A Ic, 100V Vce, Silicon Darlington Power PNP Transistor, TO-220\nK Darlington Power PNP Transistor\nF http://www.fairchildsemi.com/ds/TI/TIP125.pdf\n$ENDCMP\n#\n$CMP TIP2955\nD -15A Ic, -60V Vce, Power PNP Transistor, TO-218\nK power PNP Transistor\nF http://www.onsemi.com/pub_link/Collateral/TIP3055-D.PDF\n$ENDCMP\n#\n$CMP TIP2955G\nD -15A Ic, -60V Vce, Power PNP Transistor, TO-247\nK power PNP Transistor\nF http://www.onsemi.com/pub_link/Collateral/TIP3055-D.PDF\n$ENDCMP\n#\n$CMP TIP3055\nD 15A Ic, 60V Vce, Power NPN Transistor, TO-218\nK power NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/TIP3055-D.PDF\n$ENDCMP\n#\n$CMP TIP3055G\nD 15A Ic, 60V Vce, Power NPN Transistor, TO-247\nK power NPN Transistor\nF http://www.onsemi.com/pub_link/Collateral/TIP3055-D.PDF\n$ENDCMP\n#\n$CMP TIP41\nD 6A Ic, 40V Vce, Power NPN Transistor, TO-220\nK power NPN Transistor\nF https://www.centralsemi.com/get_document.php?cmp=1&mergetype=pd&mergepath=pd&pdf_id=tip41.PDF\n$ENDCMP\n#\n$CMP TIP41A\nD 6A Ic, 60V Vce, Power NPN Transistor, TO-220\nK power NPN Transistor\nF https://www.centralsemi.com/get_document.php?cmp=1&mergetype=pd&mergepath=pd&pdf_id=tip41.PDF\n$ENDCMP\n#\n$CMP TIP41B\nD 6A Ic, 80V Vce, Power NPN Transistor, TO-220\nK power NPN Transistor\nF https://www.centralsemi.com/get_document.php?cmp=1&mergetype=pd&mergepath=pd&pdf_id=tip41.PDF\n$ENDCMP\n#\n$CMP TIP41C\nD 6A Ic, 100V Vce, Power NPN Transistor, TO-220\nK power NPN Transistor\nF https://www.centralsemi.com/get_document.php?cmp=1&mergetype=pd&mergepath=pd&pdf_id=tip41.PDF\n$ENDCMP\n#\n$CMP TIP42\nD -6A Ic, -40V Vce, Power PNP Transistor, TO-220\nK power PNP Transistor\nF https://www.centralsemi.com/get_document.php?cmp=1&mergetype=pd&mergepath=pd&pdf_id=TIP42.PDF\n$ENDCMP\n#\n$CMP TIP42A\nD -6A Ic, -60V Vce, Power PNP Transistor, TO-220\nK power PNP Transistor\nF https://www.centralsemi.com/get_document.php?cmp=1&mergetype=pd&mergepath=pd&pdf_id=TIP42.PDF\n$ENDCMP\n#\n$CMP TIP42B\nD -6A Ic, -80V Vce, Power PNP Transistor, TO-220\nK power PNP Transistor\nF https://www.centralsemi.com/get_document.php?cmp=1&mergetype=pd&mergepath=pd&pdf_id=TIP42.PDF\n$ENDCMP\n#\n$CMP TIP42C\nD -6A Ic, -100V Vce, Power PNP Transistor, TO-220\nK power PNP Transistor\nF https://www.centralsemi.com/get_document.php?cmp=1&mergetype=pd&mergepath=pd&pdf_id=TIP42.PDF\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/default/Transistor_BJT.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# 2N2219\n#\nDEF 2N2219 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2N2219\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-39-3\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BC140 BC141\n$FPLIST\n TO?39*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 2N2646\n#\nDEF 2N2646 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2N2646\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-18-3\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS 2N2647\n$FPLIST\n TO?18*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 3 0 1 0 -100 0 -40 0 20 -60 N\nP 3 0 1 10 20 75 20 -75 20 -75 N\nP 3 0 1 0 100 -100 100 -50 20 -50 N\nP 3 0 1 0 100 100 100 55 20 55 N\nP 4 0 1 0 0 -40 -15 5 -45 -25 0 -40 F\nX B2 1 100 200 100 D 50 50 1 1 P\nX E 2 -200 0 100 R 50 50 1 1 I\nX B1 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 2N3055\n#\nDEF 2N3055 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2N3055\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-3\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?3*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 2N3904\n#\nDEF 2N3904 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2N3904\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 2N3906\n#\nDEF 2N3906 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2N3906\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS 2N3905\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 I\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 2SA1015\n#\nDEF 2SA1015 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2SA1015\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 70 -90 90 -70 50 -50 70 -90 70 -90 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 200 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# 2SB631\n#\nDEF 2SB631 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2SB631\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-126-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?126*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 70 -90 90 -70 50 -50 70 -90 70 -90 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 200 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# 2SB817\n#\nDEF 2SB817 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2SB817\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-3PB-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?3PB*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 70 -90 90 -70 50 -50 70 -90 70 -90 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 2SC1815\n#\nDEF 2SC1815 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2SC1815\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 20 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 200 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# 2SC1941\n#\nDEF 2SC1941 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2SC1941\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 200 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# 2SC1945\n#\nDEF 2SC1945 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2SC1945\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 12 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 3 0 1 0 90 -90 70 -70 70 -70 N\nP 3 0 1 0 100 -100 25 -25 50 -50 F\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 2SD1047\n#\nDEF 2SD1047 Q 0 0 Y N 1 F N\nF0 \"Q\" 250 75 50 H V L CNN\nF1 \"2SD1047\" 250 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-3PB-3_Vertical\" 250 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?3PB*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 30 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# 2SD600\n#\nDEF 2SD600 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"2SD600\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-126-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?126*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 12 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 200 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# BC107\n#\nDEF BC107 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC107\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-18-3\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BC108 BC109\n$FPLIST\n TO?18*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 I\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC160\n#\nDEF BC160 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC160\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-39-3\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BC161\n$FPLIST\n TO?39*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 I\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC237\n#\nDEF BC237 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC237\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 200 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC240\n#\nDEF BC240 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC240\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX E 2 100 -200 100 U 50 50 1 1 P\nX B 3 -200 0 200 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# BC307\n#\nDEF BC307 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC307\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 55 -75 75 -55 35 -35 55 -75 55 -75 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 200 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC413\n#\nDEF BC413 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC413\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BC413B BC413C BC414 BC414B BC414C\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 200 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC516\n#\nDEF BC516 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC516\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC517\n#\nDEF BC517 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC517\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC547\n#\nDEF BC547 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC547\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BC546 BC548 BC549 BC550 BC337 BC338\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 200 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC557\n#\nDEF BC557 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC557\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BC556 BC558 BC559 BC560 BC327 BC328\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 225 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC636\n#\nDEF BC636 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC636\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 55 -75 75 -55 35 -35 55 -75 55 -75 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 200 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# BC807\n#\nDEF BC807 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC807\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BC808 BC856 BC857 BC858 BC859 BC860 MMBT3906\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC807W\n#\nDEF BC807W Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC807W\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-323_SC-70\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BC808W BC856W BC857W BC858W BC859W BC860W\n$FPLIST\n SOT?323*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC817\n#\nDEF BC817 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC817\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BC818 BC846 BC847 BC848 BC849 BC850 MMBT3904 MMBT5550L MMBT5551L\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC817W\n#\nDEF BC817W Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BC817W\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-323_SC-70\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BC818W BC847W BC848W BC849W BC850W 2SC4213\n$FPLIST\n SOT?323*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BC846BPN\n#\nDEF BC846BPN Q 0 0 Y N 2 L N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"BC846BPN\" 200 -50 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS BC846BPDW1 BC847BPN BC847BPDW1 PMBT3946YPN MMDT3946 MBT3946DW1T1 FFB3946 FFB2227A\n$FPLIST\n SOT?363*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 0 -100 0 N\nP 2 1 1 0 25 25 100 100 N\nP 3 1 1 0 25 -25 100 -100 100 -100 N\nP 3 1 1 20 25 75 25 -75 25 -75 N\nP 5 1 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nP 2 2 1 0 25 25 100 100 N\nP 3 2 1 0 25 -25 100 -100 100 -100 N\nP 3 2 1 20 25 75 25 -75 25 -75 N\nP 5 2 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX E1 1 100 -200 100 U 50 50 1 1 P\nX B1 2 -200 0 100 R 50 50 1 1 I\nX C1 6 100 200 100 D 50 50 1 1 P\nX C2 3 100 200 100 D 50 50 2 1 P\nX E2 4 100 -200 100 U 50 50 2 1 P\nX B2 5 -200 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# BC846BS\n#\nDEF BC846BS Q 0 0 Y N 2 L N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"BC846BS\" 200 -50 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS BC846BDW1 BC847BS BC847BDW1 PMBT2222AYS MMDT2222A MBT2222ADW1T1 FFB2222A PMBT3904YS MMDT3904 MBT3904DW1 FFB3904 MMDT5551 FFB5551 PUMX1\n$FPLIST\n SOT?363*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 0 -100 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E1 1 100 -200 100 U 50 50 1 1 P\nX B1 2 -200 0 100 R 50 50 1 1 I\nX C1 6 100 200 100 D 50 50 1 1 P\nX C2 3 100 200 100 D 50 50 2 1 P\nX E2 4 100 -200 100 U 50 50 2 1 P\nX B2 5 -200 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# BC856BS\n#\nDEF BC856BS Q 0 0 Y N 2 L N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"BC856BS\" 200 -50 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS BC856BDW1 BC857BS BC857BDW1 PMBT3906YS MMDT3906 MBT3906DW1 FFB3906 MMDT5401 PUMT1\n$FPLIST\n SOT?363*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 0 -100 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX E1 1 100 -200 100 U 50 50 1 1 P\nX B1 2 -200 0 100 R 50 50 1 1 I\nX C1 6 100 200 100 D 50 50 1 1 P\nX C2 3 100 200 100 D 50 50 2 1 P\nX E2 4 100 -200 100 U 50 50 2 1 P\nX B2 5 -200 0 100 R 50 50 2 1 I\nENDDRAW\nENDDEF\n#\n# BCP51\n#\nDEF BCP51 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BCP51\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-223-3_TabPin2\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?223*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 55 -75 75 -55 35 -35 55 -75 55 -75 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BCV29\n#\nDEF BCV29 Q 0 0 Y N 1 F N\nF0 \"Q\" 180 50 50 H V L CNN\nF1 \"BCV29\" 180 -50 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-89-3\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS BCV49\n$FPLIST\n SOT?89*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BCV61\n#\nDEF BCV61 Q 0 0 Y Y 1 F N\nF0 \"Q\" 300 50 50 H V L CNN\nF1 \"BCV61\" 300 -50 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-143\" 0 0 50 H I C CIN\nF3 \"\" -100 0 50 H I L CNN\n$FPLIST\n SOT?143*\n$ENDFPLIST\nDRAW\nC -200 120 10 0 1 0 F\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -200 -100 -125 -25 N\nP 2 0 1 0 -200 100 -125 25 N\nP 2 0 1 0 -200 100 -125 25 N\nP 2 0 1 0 125 0 -125 0 N\nP 2 0 1 0 200 -100 125 -25 N\nP 2 0 1 0 200 100 125 25 N\nP 3 0 1 20 -125 -75 -125 75 -125 75 F\nP 3 0 1 0 0 0 0 120 -200 120 N\nP 3 0 1 20 125 -75 125 75 125 75 F\nP 5 0 1 0 -150 -70 -170 -50 -190 -90 -150 -70 -150 -70 F\nP 5 0 1 0 150 -70 170 -50 190 -90 150 -70 150 -70 F\nX C2 1 -200 200 100 D 50 50 1 1 P\nX C1 2 200 200 100 D 50 50 1 1 P\nX E1 3 200 -200 100 U 50 50 1 1 P\nX E2 4 -200 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BCV62\n#\nDEF BCV62 Q 0 0 Y Y 1 F N\nF0 \"Q\" 300 50 50 H V L CNN\nF1 \"BCV62\" 300 -50 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-143\" 0 0 50 H I C CIN\nF3 \"\" -100 0 50 H I L CNN\n$FPLIST\n SOT?143*\n$ENDFPLIST\nDRAW\nC -200 -120 10 0 1 0 F\nC 0 0 10 0 1 0 F\nP 2 0 1 0 -200 -100 -125 -25 N\nP 2 0 1 0 -200 100 -125 25 N\nP 2 0 1 0 -200 100 -125 25 N\nP 2 0 1 0 125 0 -125 0 N\nP 2 0 1 0 200 -100 125 -25 N\nP 2 0 1 0 200 100 125 25 N\nP 3 0 1 20 -125 -75 -125 75 -125 75 F\nP 3 0 1 0 0 0 0 -120 -200 -120 N\nP 3 0 1 20 125 -75 125 75 125 75 F\nP 5 0 1 0 -155 75 -175 55 -135 35 -155 75 -155 75 F\nP 5 0 1 0 155 75 175 55 135 35 155 75 155 75 F\nX C2 1 -200 -200 100 U 50 50 1 1 P\nX C1 2 200 -200 100 U 50 50 1 1 P\nX E1 3 200 200 100 D 50 50 1 1 P\nX E2 4 -200 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BCX51\n#\nDEF BCX51 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BCX51\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-89-3\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BCX52 BCX53\n$FPLIST\n SOT?89*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 55 -75 75 -55 35 -35 55 -75 55 -75 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BCX56\n#\nDEF BCX56 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BCX56\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-89-3\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?89*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BD139\n#\nDEF BD139 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BD139\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-126-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BD135 BD137 BD233 BD235 BD237\n$FPLIST\n TO?126*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 12 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 49 -70 69 -50 90 -90 49 -70 49 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 200 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# BD140\n#\nDEF BD140 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BD140\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-126-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BD136 BD138 BD234 BD236 BD238\n$FPLIST\n TO?126*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 12 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 70 -90 90 -70 50 -50 70 -90 70 -90 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 200 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# BD249\n#\nDEF BD249 Q 0 0 Y N 1 F N\nF0 \"Q\" 250 75 50 H V L CNN\nF1 \"BD249\" 250 0 50 H V L CNN\nF2 \"\" 250 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BD249A BD249B BD249C\n$FPLIST\n TO?218*\n TO?247*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 12 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 3 0 1 0 90 -90 70 -70 70 -70 N\nP 3 0 1 0 100 -100 25 -25 50 -50 F\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BD250\n#\nDEF BD250 Q 0 0 Y N 1 F N\nF0 \"Q\" 205 70 50 H V L CNN\nF1 \"BD250\" 205 -5 50 H V L CNN\nF2 \"\" 205 -80 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BD250A BD250B BD250C\n$FPLIST\n TO?218*\n TO?247*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 12 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 70 -90 90 -70 50 -50 70 -90 70 -90 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BD433\n#\nDEF BD433 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BD433\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-126-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BD435 BD437 BD439 BD441\n$FPLIST\n TO?126*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 12 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 49 -70 69 -50 90 -90 49 -70 49 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 200 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# BD434\n#\nDEF BD434 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BD434\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-126-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BD436 BD438 BD440 BD442\n$FPLIST\n TO?126*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 12 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 91 -70 71 -90 50 -50 91 -70 91 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 200 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# BD910\n#\nDEF BD910 Q 0 0 Y N 1 F N\nF0 \"Q\" 250 75 50 H V L CNN\nF1 \"BD910\" 250 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 250 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BD912 TIP42 TIP42A TIP42B TIP42C\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BD911\n#\nDEF BD911 Q 0 0 Y N 1 F N\nF0 \"Q\" 250 75 50 H V L CNN\nF1 \"BD911\" 250 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 250 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BD909 TIP41A TIP41B TIP41C TIP41\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BDW93\n#\nDEF BDW93 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BDW93\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BDW93A BDW93B BDW93C\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nP 2 1 1 0 0 0 20 0 N\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BDW94\n#\nDEF BDW94 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BDW94\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BDW94A BDW94B BDW94C\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 0 25 0 100 75 100 100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BF199\n#\nDEF BF199 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BF199\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX E 2 100 -200 100 U 50 50 1 1 P\nX B 3 -200 0 225 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# BF457\n#\nDEF BF457 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BF457\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-126-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BF458 BF459\n$FPLIST\n TO?126*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX C 2 100 200 100 D 50 50 1 1 P\nX B 3 -200 0 200 R 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# BFR92\n#\nDEF BFR92 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BFR92\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-323_SC-70\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?323*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 2 0 1 0 100 -100 25 -25 N\nP 4 0 1 20 25 75 25 0 25 -75 25 -75 N\nP 5 0 1 0 90 -90 70 -50 50 -70 90 -90 90 -90 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BFT92\n#\nDEF BFT92 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BFT92\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 2 0 1 0 100 -100 25 -25 N\nP 4 0 1 20 25 75 25 0 25 -75 25 -75 N\nP 5 0 1 0 50 -50 70 -90 90 -70 50 -50 50 -50 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# BUT11\n#\nDEF BUT11 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"BUT11\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BUT11A\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 12 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 3 0 1 0 90 -90 70 -70 70 -70 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA113T\n#\nDEF DTA113T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA113T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -115 35 20 0 0 0 1k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA113Z\n#\nDEF DTA113Z Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA113Z\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -130 35 20 0 0 0 1k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA114E\n#\nDEF DTA114E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA114E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 10k Normal 0 C C\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA114G\n#\nDEF DTA114G Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA114G\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nP 2 0 0 0 -135 0 0 0 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA114T\n#\nDEF DTA114T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA114T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -115 35 20 0 0 0 10k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA114W\n#\nDEF DTA114W Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA114W\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 10k Normal 0 C C\nT 900 -85 -60 20 0 0 0 4k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA114Y\n#\nDEF DTA114Y Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA114Y\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 10k Normal 0 C C\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA115E\n#\nDEF DTA115E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA115E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -115 35 20 0 0 0 100k Normal 0 C C\nT 900 -85 -60 20 0 0 0 100k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA115G\n#\nDEF DTA115G Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA115G\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 100k Normal 0 C C\nP 2 0 0 0 -135 0 0 0 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA115T\n#\nDEF DTA115T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA115T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -115 35 20 0 0 0 100k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA115U\n#\nDEF DTA115U Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA115U\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -115 35 20 0 0 0 100k Normal 0 C C\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA123E\n#\nDEF DTA123E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA123E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -115 35 20 0 0 0 2k2 Normal 0 C C\nT 900 -85 -60 20 0 0 0 2k2 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA123J\n#\nDEF DTA123J Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA123J\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -115 35 20 0 0 0 2k2 Normal 0 C C\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA123Y\n#\nDEF DTA123Y Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA123Y\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -115 35 20 0 0 0 2k2 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA124E\n#\nDEF DTA124E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA124E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -115 35 20 0 0 0 22k Normal 0 C C\nT 900 -85 -60 20 0 0 0 22k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA124G\n#\nDEF DTA124G Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA124G\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 22k Normal 0 C C\nP 2 0 0 0 -135 0 0 0 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA124T\n#\nDEF DTA124T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA124T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -115 35 20 0 0 0 22k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA124X\n#\nDEF DTA124X Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA124X\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -115 35 20 0 0 0 22k Normal 0 C C\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA125T\n#\nDEF DTA125T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA125T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -115 35 20 0 0 0 200k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA143E\n#\nDEF DTA143E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA143E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -115 35 20 0 0 0 4k7 Normal 0 C C\nT 900 -85 -60 20 0 0 0 4k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA143T\n#\nDEF DTA143T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA143T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -115 35 20 0 0 0 4k7 Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA143X\n#\nDEF DTA143X Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA143X\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -115 35 20 0 0 0 4k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA143Y\n#\nDEF DTA143Y Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA143Y\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 22k Normal 0 C C\nT 0 -115 35 20 0 0 0 4k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA143Z\n#\nDEF DTA143Z Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA143Z\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nT 0 -115 35 20 0 0 0 4k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA144E\n#\nDEF DTA144E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA144E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -115 35 20 0 0 0 47k Normal 0 C C\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA144G\n#\nDEF DTA144G Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA144G\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nP 2 0 0 0 -135 0 0 0 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA144T\n#\nDEF DTA144T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA144T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -115 35 20 0 0 0 47k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA144V\n#\nDEF DTA144V Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA144V\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -115 35 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA144W\n#\nDEF DTA144W Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA144W\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 22k Normal 0 C C\nT 0 -115 35 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA1D3R\n#\nDEF DTA1D3R Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA1D3R\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 1k Normal 0 C C\nT 0 -115 35 20 0 0 0 2k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTA214Y\n#\nDEF DTA214Y Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTA214Y\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -115 35 20 0 0 0 10k Normal 0 C C\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTB113E\n#\nDEF DTB113E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTB113E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 1k Normal 0 C C\nT 900 -85 -60 20 0 0 0 1k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTB113Z\n#\nDEF DTB113Z Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTB113Z\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -130 35 20 0 0 0 1k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTB114E\n#\nDEF DTB114E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTB114E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 10k Normal 0 C C\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTB114G\n#\nDEF DTB114G Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTB114G\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nP 2 0 0 0 -135 0 0 0 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTB114T\n#\nDEF DTB114T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTB114T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -115 35 20 0 0 0 10k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTB122J\n#\nDEF DTB122J Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTB122J\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 220R Normal 0 C C\nT 900 -85 -60 20 0 0 0 4k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTB123E\n#\nDEF DTB123E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTB123E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 2k2 Normal 0 C C\nT 900 -85 -60 20 0 0 0 2k2 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTB123T\n#\nDEF DTB123T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTB123T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -115 35 20 0 0 0 2k2 Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTB123Y\n#\nDEF DTB123Y Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTB123Y\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -130 35 20 0 0 0 2k2 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTB133H\n#\nDEF DTB133H Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTB133H\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -130 35 20 0 0 0 3k3 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTB143T\n#\nDEF DTB143T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTB143T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -115 35 20 0 0 0 4k7 Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTB163T\n#\nDEF DTB163T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTB163T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -115 35 20 0 0 0 6k8 Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 55 -65 75 -45 35 -25 55 -65 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC113T\n#\nDEF DTC113T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC113T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -120 35 20 0 0 0 1k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC113Z\n#\nDEF DTC113Z Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC113Z\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -130 35 20 0 0 0 1k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC114E\n#\nDEF DTC114E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC114E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 10k Normal 0 C C\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC114G\n#\nDEF DTC114G Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC114G\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nP 2 0 0 0 -135 0 0 0 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC114T\n#\nDEF DTC114T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC114T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -120 35 20 0 0 0 10k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC114W\n#\nDEF DTC114W Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC114W\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 10k Normal 0 C C\nT 900 -85 -60 20 0 0 0 4k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC114Y\n#\nDEF DTC114Y Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC114Y\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 10k Normal 0 C C\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC115E\n#\nDEF DTC115E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC115E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 100k Normal 0 C C\nT 900 -85 -60 20 0 0 0 100k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC115G\n#\nDEF DTC115G Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC115G\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 100k Normal 0 C C\nP 2 0 0 0 -135 0 0 0 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC115T\n#\nDEF DTC115T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC115T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -120 35 20 0 0 0 100k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC115U\n#\nDEF DTC115U Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC115U\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 100k Normal 0 C C\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC123E\n#\nDEF DTC123E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC123E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 2k2 Normal 0 C C\nT 900 -85 -60 20 0 0 0 2k2 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC123J\n#\nDEF DTC123J Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC123J\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 2k2 Normal 0 C C\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC123Y\n#\nDEF DTC123Y Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC123Y\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -130 35 20 0 0 0 2k2 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC124E\n#\nDEF DTC124E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC124E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 22k Normal 0 C C\nT 900 -85 -60 20 0 0 0 22k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC124G\n#\nDEF DTC124G Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC124G\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 22k Normal 0 C C\nP 2 0 0 0 -135 0 0 0 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC124T\n#\nDEF DTC124T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC124T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -120 35 20 0 0 0 22k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC124X\n#\nDEF DTC124X Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC124X\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 22k Normal 0 C C\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC125T\n#\nDEF DTC125T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC125T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -120 35 20 0 0 0 200k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC143E\n#\nDEF DTC143E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC143E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 4k7 Normal 0 C C\nT 900 -85 -60 20 0 0 0 4k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC143T\n#\nDEF DTC143T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC143T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -120 35 20 0 0 0 4k7 Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC143X\n#\nDEF DTC143X Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC143X\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -130 35 20 0 0 0 4k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC143Y\n#\nDEF DTC143Y Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC143Y\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 22k Normal 0 C C\nT 0 -130 35 20 0 0 0 4k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC143Z\n#\nDEF DTC143Z Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC143Z\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nT 0 -130 35 20 0 0 0 4k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC144E\n#\nDEF DTC144E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC144E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 47k Normal 0 C C\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC144G\n#\nDEF DTC144G Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC144G\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nP 2 0 0 0 -135 0 0 0 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC144T\n#\nDEF DTC144T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC144T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -120 35 20 0 0 0 47k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC144V\n#\nDEF DTC144V Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC144V\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -130 35 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC144W\n#\nDEF DTC144W Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC144W\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 22k Normal 0 C C\nT 0 -130 35 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC1D3R\n#\nDEF DTC1D3R Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC1D3R\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 1k Normal 0 C C\nT 0 -130 35 20 0 0 0 2k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTC214Y\n#\nDEF DTC214Y Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTC214Y\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 10k Normal 0 C C\nT 900 -85 -60 20 0 0 0 47k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTD113E\n#\nDEF DTD113E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTD113E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 1k Normal 0 C C\nT 900 -85 -60 20 0 0 0 1k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTD113Z\n#\nDEF DTD113Z Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTD113Z\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -130 35 20 0 0 0 1k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTD114E\n#\nDEF DTD114E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTD114E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 10k Normal 0 C C\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTD114G\n#\nDEF DTD114G Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTD114G\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nP 2 0 0 0 -135 0 0 0 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTD114T\n#\nDEF DTD114T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTD114T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -120 35 20 0 0 0 10k Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTD122J\n#\nDEF DTD122J Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTD122J\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 220R Normal 0 C C\nT 900 -85 -60 20 0 0 0 4k7 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTD123E\n#\nDEF DTD123E Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTD123E\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 0 -130 35 20 0 0 0 2k2 Normal 0 C C\nT 900 -85 -60 20 0 0 0 2k2 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTD123T\n#\nDEF DTD123T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTD123T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -120 35 20 0 0 0 2k2 Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTD123Y\n#\nDEF DTD123Y Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTD123Y\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -130 35 20 0 0 0 2k2 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTD133H\n#\nDEF DTD133H Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTD133H\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nC -50 0 5 0 1 0 N\nC 100 -90 5 0 1 0 N\nT 900 -85 -60 20 0 0 0 10k Normal 0 C C\nT 0 -130 35 20 0 0 0 3k3 Normal 0 C C\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nP 11 0 1 0 -50 0 -50 -15 -30 -20 -70 -30 -30 -40 -70 -50 -30 -60 -70 -70 -50 -75 -50 -90 100 -90 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTD143T\n#\nDEF DTD143T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTD143T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -120 35 20 0 0 0 4k7 Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# DTD163T\n#\nDEF DTD163T Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"DTD163T\" 200 0 50 H V L CNN\nF2 \"\" 0 0 50 H I L CNN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n SC?59*\n$ENDFPLIST\nDRAW\nA -50 0 125 901 -901 0 1 10 N -50 125 -50 -125\nA 25 0 125 -899 899 0 1 10 N 25 -125 25 125\nT 0 -120 35 20 0 0 0 6k8 Normal 0 C C\nP 2 0 0 0 100 -90 100 -100 N\nP 2 0 1 0 -135 0 -150 0 N\nP 2 0 1 10 -50 -125 25 -125 N\nP 2 0 1 10 -50 125 25 125 N\nP 2 0 1 0 0 -10 100 90 N\nP 2 0 1 20 5 60 5 -65 F\nP 2 0 1 0 100 90 100 100 N\nP 3 0 1 0 100 -90 0 10 0 10 N\nP 4 0 1 0 35 -45 55 -25 75 -65 35 -45 F\nP 9 0 1 0 0 0 -75 0 -80 20 -90 -20 -100 20 -110 -20 -120 20 -130 -20 -135 0 N\nX B 1 -250 0 100 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# FMB2227A\n#\nDEF FMB2227A Q 0 0 Y N 2 L N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"FMB2227A\" 200 -50 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SuperSOT-6\" 200 100 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS FMB3946\n$FPLIST\n SuperSOT*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 0 -100 0 N\nP 2 1 1 0 25 25 100 100 N\nP 3 1 1 0 25 -25 100 -100 100 -100 N\nP 3 1 1 20 25 75 25 -75 25 -75 N\nP 5 1 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nP 2 2 1 0 25 25 100 100 N\nP 3 2 1 0 25 -25 100 -100 100 -100 N\nP 3 2 1 20 25 75 25 -75 25 -75 N\nP 5 2 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B1 1 -200 0 100 R 50 50 1 1 I\nX E1 5 100 -200 100 U 50 50 1 1 P\nX C1 6 100 200 100 D 50 50 1 1 P\nX E2 2 100 -200 100 U 50 50 2 1 P\nX B2 3 -200 0 100 R 50 50 2 1 I\nX C2 4 100 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# KTD1624\n#\nDEF KTD1624 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"KTD1624\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-89-3\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?89*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MAT02\n#\nDEF MAT02 Q 0 0 Y N 2 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"MAT02\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-78-6\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?78*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C 1 100 200 100 D 50 50 1 1 P\nX B 2 -200 0 200 R 50 50 1 1 I\nX E 3 100 -200 100 U 50 50 1 1 P\nX E 4 100 -200 100 U 50 50 2 1 P\nX B 5 -200 0 200 R 50 50 2 1 I\nX C 6 100 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# MJ2955\n#\nDEF MJ2955 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"MJ2955\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-3\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?3*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MJE13003\n#\nDEF MJE13003 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"MJE13003\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-126-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?126*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 12 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 49 -70 69 -50 90 -90 49 -70 49 -70 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MJE13007G\n#\nDEF MJE13007G Q 0 0 Y N 1 F N\nF0 \"Q\" 250 75 50 H V L CNN\nF1 \"MJE13007G\" 250 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 250 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS MJE13005G MJE13009G\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 12 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 3 0 1 0 90 -90 70 -70 70 -70 N\nP 3 0 1 0 100 -100 25 -25 50 -50 F\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MMBTA42\n#\nDEF MMBTA42 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"MMBTA42\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MMBTA92\n#\nDEF MMBTA92 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"MMBTA92\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-23\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?23*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 75 -95 95 -75 55 -55 75 -95 75 -95 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX E 2 100 -200 100 U 50 50 1 1 P\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MPSA42\n#\nDEF MPSA42 Q 0 40 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"MPSA42\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 200 R 50 50 1 1 I\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MPSA92\n#\nDEF MPSA92 Q 0 40 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"MPSA92\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 75 -95 95 -75 55 -55 75 -95 75 -95 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 200 R 50 50 1 1 I\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# MUN5211DW1\n#\nDEF MUN5211DW1 Q 0 20 Y N 2 F N\nF0 \"Q\" 150 50 50 H V L CNN\nF1 \"MUN5211DW1\" 150 -50 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-363_SC-70-6\" 5 -440 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOT*363*\n$ENDFPLIST\nDRAW\nC -150 0 10 0 1 0 F\nC 50 -120 10 0 1 0 F\nC 0 0 111 1 1 10 N\nC 0 0 111 2 1 10 N\nS -250 20 -190 -20 0 1 0 N\nS -170 -90 -130 -30 0 1 0 N\nP 2 0 1 0 -150 -30 -150 0 N\nP 2 0 1 0 -30 0 -190 0 N\nP 2 0 1 20 -25 60 -25 -60 N\nP 3 0 1 0 -150 -90 -150 -120 50 -120 N\nP 2 1 1 0 -25 25 50 100 N\nP 3 1 1 0 -25 -25 50 -100 50 -100 N\nP 5 1 1 0 0 -70 20 -50 40 -90 0 -70 0 -70 F\nP 2 2 1 0 -25 25 50 100 N\nP 3 2 1 0 -25 -25 50 -100 50 -100 N\nP 5 2 1 0 0 -70 20 -50 40 -90 0 -70 0 -70 F\nX C1 3 50 200 100 D 50 50 1 1 P\nX E1 4 50 -200 100 U 50 50 1 1 P\nX B1 5 -350 0 100 R 50 50 1 1 I\nX E1 1 50 -200 100 U 50 50 2 1 P\nX B1 2 -350 0 100 R 50 50 2 1 I\nX C1 6 50 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# PN2222A\n#\nDEF PN2222A Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"PN2222A\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 3 0 1 0 95 -95 75 -75 75 -75 N\nP 5 0 1 0 45 -65 65 -45 85 -85 45 -65 45 -65 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 200 R 50 50 1 1 I\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# PZT2222A\n#\nDEF PZT2222A Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"PZT2222A\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-223-3_TabPin2\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?223*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 3 0 1 0 90 -90 70 -70 70 -70 N\nP 5 0 1 0 45 -65 65 -45 85 -85 45 -65 45 -65 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# PZT3904\n#\nDEF PZT3904 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"PZT3904\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-223-3_TabPin2\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BCP56\n$FPLIST\n SOT?223*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nX C 4 100 200 100 D 50 50 1 1 P N\nENDDRAW\nENDDEF\n#\n# PZT3906\n#\nDEF PZT3906 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"PZT3906\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-223-3_TabPin2\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS BCP53 PBSS301PZ\n$FPLIST\n SOT?223*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nX C 4 100 200 100 D 50 50 1 1 P N\nENDDRAW\nENDDEF\n#\n# PZTA42\n#\nDEF PZTA42 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"PZTA42\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-223-3_TabPin2\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?223*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 3 0 1 0 90 -90 70 -70 70 -70 N\nP 5 0 1 0 55 -75 75 -55 95 -95 55 -75 55 -75 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# PZTA92\n#\nDEF PZTA92 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"PZTA92\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_SMD:SOT-223-3_TabPin2\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n SOT?223*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 75 -95 95 -75 55 -55 75 -95 75 -95 F\nX B 1 -200 0 200 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# S8050\n#\nDEF S8050 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"S8050\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 200 R 50 50 1 1 I\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# S8550\n#\nDEF S8550 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"S8550\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-92_Inline\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?92*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 0 0 25 0 N\nP 2 0 1 0 100 -100 25 -25 N\nP 2 0 1 0 100 100 25 25 N\nP 3 0 1 20 25 75 25 -75 25 -75 F\nP 5 0 1 0 70 -90 90 -70 50 -50 70 -90 70 -90 F\nX E 1 100 -200 100 U 50 50 1 1 P\nX B 2 -200 0 200 R 50 50 1 1 I\nX C 3 100 200 100 D 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# SSM2210\n#\nDEF SSM2210 Q 0 0 Y Y 2 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"SSM2210\" 200 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOIC*8*3.9x4.9mm*P1.27mm*\n DIP*8*W7.62mm*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 0 -100 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX C1 1 100 200 100 D 50 50 1 1 P\nX B1 2 -200 0 100 R 50 50 1 1 I\nX E1 3 100 -200 100 U 50 50 1 1 P\nX E2 6 100 -200 100 U 50 50 2 1 P\nX B2 7 -200 0 100 R 50 50 2 1 I\nX C2 8 100 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# SSM2220\n#\nDEF SSM2220 Q 0 0 Y Y 2 F N\nF0 \"Q\" 200 50 50 H V L CNN\nF1 \"SSM2220\" 200 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\n$FPLIST\n SOIC*8*3.9x4.9mm*P1.27mm*\n DIP*8*W7.62mm*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 0 -100 0 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX C1 1 100 200 100 D 50 50 1 1 P\nX B1 2 -200 0 100 R 50 50 1 1 I\nX E1 3 100 -200 100 U 50 50 1 1 P\nX E2 6 100 -200 100 U 50 50 2 1 P\nX B2 7 -200 0 100 R 50 50 2 1 I\nX C2 8 100 200 100 D 50 50 2 1 P\nENDDRAW\nENDDEF\n#\n# TIP120\n#\nDEF TIP120 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"TIP120\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS TIP121 TIP122\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nC -30 0 5 0 1 0 N\nC 30 -80 5 0 1 0 N\nC 30 -10 5 0 1 0 N\nC 50 0 125 0 1 14 N\nC 100 -80 5 0 1 0 N\nC 100 -60 5 0 1 0 N\nC 100 40 5 0 1 0 N\nC 100 90 5 0 1 0 N\nP 2 0 1 0 -50 0 -35 0 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 -60 125 -60 N\nP 2 0 1 0 110 5 140 5 N\nP 2 0 1 0 125 -25 125 -60 N\nP 2 0 1 0 125 40 100 40 N\nP 2 0 1 0 125 40 125 5 N\nP 3 0 1 0 -10 30 30 -10 50 -10 N\nP 3 0 1 0 -10 40 -30 40 -30 -80 N\nP 3 0 1 0 -10 50 30 90 100 90 N\nP 3 0 1 12 -10 80 -10 0 -10 0 N\nP 3 0 1 15 50 30 50 -50 50 -50 N\nP 4 0 1 0 25 -5 15 15 5 5 25 -5 N\nP 4 0 1 0 50 -20 90 -60 100 -60 100 -80 N\nP 4 0 1 0 50 0 90 40 100 40 100 90 N\nP 4 0 1 0 85 -55 75 -35 65 -45 85 -55 N\nP 4 0 1 0 125 5 110 -25 140 -25 125 5 F\nP 10 0 1 0 30 -80 15 -80 10 -90 5 -70 0 -90 -5 -70 -10 -90 -15 -70 -20 -80 -30 -80 N\nP 11 0 1 0 30 -10 30 -80 45 -80 50 -70 55 -90 60 -70 65 -90 70 -70 75 -90 80 -80 100 -80 N\nX B 1 -200 0 150 R 50 50 1 1 I\nX C 2 100 200 105 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# TIP125\n#\nDEF TIP125 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"TIP125\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-220-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\nALIAS TIP126 TIP127\n$FPLIST\n TO?220*\n$ENDFPLIST\nDRAW\nC -30 0 5 0 1 0 N\nC 30 -80 5 0 1 0 N\nC 30 -10 5 0 1 0 N\nC 50 0 125 0 1 14 N\nC 100 -80 5 0 1 0 N\nC 100 -60 5 0 1 0 N\nC 100 40 5 0 1 0 N\nC 100 90 5 0 1 0 N\nP 2 0 1 0 -50 0 -35 0 N\nP 2 0 1 0 100 -80 100 -100 N\nP 2 0 1 0 100 -60 125 -60 N\nP 2 0 1 0 110 -25 140 -25 N\nP 2 0 1 0 125 -60 125 -25 N\nP 2 0 1 0 125 5 125 40 N\nP 2 0 1 0 125 40 100 40 N\nP 3 0 1 0 -10 30 30 -10 50 -10 N\nP 3 0 1 0 -10 40 -30 40 -30 -80 N\nP 3 0 1 0 -10 50 30 90 100 90 N\nP 3 0 1 12 -10 80 -10 0 -10 0 N\nP 3 0 1 15 50 30 50 -50 50 -50 N\nP 4 0 1 0 0 20 10 0 20 10 0 20 N\nP 4 0 1 0 50 -20 90 -60 100 -60 100 -80 N\nP 4 0 1 0 50 0 90 40 100 40 100 90 N\nP 4 0 1 0 60 -30 70 -50 80 -40 60 -30 N\nP 4 0 1 0 125 -25 110 5 140 5 125 -25 F\nP 10 0 1 0 30 -80 15 -80 10 -90 5 -70 0 -90 -5 -70 -10 -90 -15 -70 -20 -80 -30 -80 N\nP 11 0 1 0 30 -10 30 -80 45 -80 50 -70 55 -90 60 -70 65 -90 70 -70 75 -90 80 -80 100 -80 N\nX B 1 -200 0 150 R 50 50 1 1 I\nX C 2 100 200 105 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# TIP2955\n#\nDEF TIP2955 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"TIP2955\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-218-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?218*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# TIP2955G\n#\nDEF TIP2955G Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"TIP2955G\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-247-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?247*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 90 -70 70 -90 50 -50 90 -70 90 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# TIP3055\n#\nDEF TIP3055 Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"TIP3055\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-218-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?218*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# TIP3055G\n#\nDEF TIP3055G Q 0 0 Y N 1 F N\nF0 \"Q\" 200 75 50 H V L CNN\nF1 \"TIP3055G\" 200 0 50 H V L CNN\nF2 \"Package_TO_SOT_THT:TO-247-3_Vertical\" 200 -75 50 H I L CIN\nF3 \"\" 0 0 50 H I L CNN\n$FPLIST\n TO?247*\n$ENDFPLIST\nDRAW\nC 50 0 111 0 1 10 N\nP 2 0 1 0 25 25 100 100 N\nP 3 0 1 0 25 -25 100 -100 100 -100 N\nP 3 0 1 20 25 75 25 -75 25 -75 N\nP 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F\nX B 1 -200 0 225 R 50 50 1 1 I\nX C 2 100 200 100 D 50 50 1 1 P\nX E 3 100 -200 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/default/eSim_Sources.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n#End Doc Library"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/default/eSim_Sources.lib",
    "content": "EESchema-LIBRARY Version 2.3\n#encoding utf-8\n#\n# eSim_AC\n#\nDEF eSim_AC v 0 40 Y Y 1 F N\nF0 \"v\" -200 100 60 H V C CNN\nF1 \"eSim_AC\" -200 -50 60 H V C CNN\nF2 \"R1\" -300 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\n$FPLIST\n 1_pin\n$ENDFPLIST\nDRAW\nA -50 0 50 1 1799 0 1 0 N 0 0 -100 0\nA 50 0 50 -1799 -1 0 1 0 N 0 0 100 0\nC 0 0 150 0 1 0 N\nX + 1 0 450 300 D 50 0 1 1 I\nX - 2 0 -450 300 U 50 0 1 1 I\nENDDRAW\nENDDEF\n#\n# CCCS\n#\nDEF CCCS F 0 40 Y Y 1 F N\nF0 \"F\" 0 150 50 H V C CNN\nF1 \"CCCS\" -200 -50 50 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\n$FPLIST\n 1_pin\n$ENDFPLIST\nDRAW\nS -100 100 100 -100 0 1 0 N\nX + 1 -300 50 200 R 35 35 1 1 P\nX - 2 300 50 200 L 35 35 1 1 P\nX +c 3 -50 -200 100 U 35 35 1 1 P\nX -c 4 50 -200 100 U 35 35 1 1 P\nENDDRAW\nENDDEF\n#\n# CCVS\n#\nDEF CCVS H 0 40 Y Y 1 F N\nF0 \"H\" 0 150 50 H V C CNN\nF1 \"CCVS\" -200 -50 50 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\n$FPLIST\n 1_pin\n$ENDFPLIST\nDRAW\nS -100 100 100 -100 0 1 0 N\nX + 1 -300 50 200 R 35 35 1 1 P\nX - 2 300 50 200 L 35 35 1 1 P\nX +c 3 -50 -200 100 U 35 35 1 1 P\nX -c 4 50 -200 100 U 35 35 1 1 P\nENDDRAW\nENDDEF\n#\n# DC\n#\nDEF DC v 0 40 Y Y 1 F N\nF0 \"v\" -200 100 60 H V C CNN\nF1 \"DC\" -200 -50 60 H V C CNN\nF2 \"R1\" -300 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\n$FPLIST\n 1_pin\n$ENDFPLIST\nDRAW\nC 0 0 150 0 1 0 N\nX + 1 0 450 300 D 50 50 1 1 w\nX - 2 0 -450 300 U 50 50 1 1 w\nENDDRAW\nENDDEF\n#\n# VCCS\n#\nDEF VCCS G 0 40 Y Y 1 F N\nF0 \"G\" 0 150 50 H V C CNN\nF1 \"VCCS\" -200 -50 50 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\n$FPLIST\n 1_pin\n$ENDFPLIST\nDRAW\nS -100 100 100 -100 0 1 0 N\nX + 1 -300 50 200 R 35 35 1 1 P\nX - 2 300 50 200 L 35 35 1 1 P\nX +c 3 -50 -200 100 U 35 35 1 1 P\nX -c 4 50 -200 100 U 35 35 1 1 P\nENDDRAW\nENDDEF\n#\n# VCVS\n#\nDEF VCVS E 0 40 Y Y 1 F N\nF0 \"E\" 0 150 50 H V C CNN\nF1 \"VCVS\" -200 -50 50 H V C CNN\nF2 \"\" 0 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\n$FPLIST\n 1_pin\n$ENDFPLIST\nDRAW\nS -100 100 100 -100 0 1 0 N\nX + 1 -300 50 200 R 35 35 1 1 P\nX - 2 300 50 200 L 35 35 1 1 P\nX +c 3 -50 -200 100 U 35 35 1 1 P\nX -c 4 50 -200 100 U 35 35 1 1 P\nENDDRAW\nENDDEF\n#\n# dc\n#\nDEF dc I 0 40 Y Y 1 F N\nF0 \"I\" -200 100 60 H V C CNN\nF1 \"dc\" -200 -50 60 H V C CNN\nF2 \"R1\" -300 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\n$FPLIST\n 1_pin\n$ENDFPLIST\nDRAW\nC 0 0 150 0 1 0 N\nP 2 0 1 0 0 -100 0 -100 N\nP 2 0 1 0 0 100 -50 50 N\nP 2 0 1 0 0 100 0 -100 N\nP 2 0 1 0 0 100 50 50 N\nX ~ 1 0 450 300 D 50 50 1 1 P\nX ~ 2 0 -450 300 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# exp\n#\nDEF exp v 0 40 Y Y 1 F N\nF0 \"v\" -200 100 60 H V C CNN\nF1 \"exp\" -200 -50 60 H V C CNN\nF2 \"R1\" -300 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\n$FPLIST\n 1_pin\n$ENDFPLIST\nDRAW\nA 1 -50 100 905 1800 0 1 0 N 0 50 -100 -50\nA 100 51 100 -1794 -900 0 1 0 N 0 50 100 -50\nC 0 0 150 0 1 0 N\nX + 1 0 450 300 D 50 0 1 1 I\nX - 2 0 -450 300 U 50 0 1 1 I\nENDDRAW\nENDDEF\n#\n# pulse\n#\nDEF pulse v 0 40 Y Y 1 F N\nF0 \"v\" -200 100 60 H V C CNN\nF1 \"pulse\" -200 -50 60 H V C CNN\nF2 \"R1\" -300 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\n$FPLIST\n 1_pin\n$ENDFPLIST\nDRAW\nA -25 -450 501 928 871 0 1 0 N -50 50 0 50\nA 25 400 451 -931 -868 0 1 0 N 0 -50 50 -50\nA 75 600 551 -926 -873 0 1 0 N 50 50 100 50\nA 350 0 403 -1728 1728 0 1 0 N -50 -50 -50 50\nA 450 0 453 1736 -1736 0 1 0 N 0 50 0 -50\nA 600 0 552 -1748 1748 0 1 0 N 50 -50 50 50\nC 0 0 150 0 1 0 N\nX + 1 0 450 300 D 50 50 1 1 P\nX - 2 0 -450 300 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# pwl\n#\nDEF pwl v 0 40 Y Y 1 F N\nF0 \"v\" -200 100 60 H V C CNN\nF1 \"pwl\" -250 -50 60 H V C CNN\nF2 \"R1\" -300 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\n$FPLIST\n 1_pin\n$ENDFPLIST\nDRAW\nA -1144 -561 1253 291 240 0 1 0 N -50 50 0 -50\nA -765 421 941 -300 -232 0 1 0 N 50 -50 100 50\nA -75 -700 750 919 880 0 1 0 N -100 50 -50 50\nA 25 450 501 -928 -871 0 1 0 N 0 -50 50 -50\nA 1096 -609 1366 1511 1558 0 1 0 N -100 50 -150 -50\nC 0 0 150 0 1 0 N\nX + 1 0 450 300 D 50 0 1 1 I\nX - 2 0 -450 300 U 50 0 1 1 I\nENDDRAW\nENDDEF\n#\n# sine\n#\nDEF sine v 0 40 Y Y 1 F N\nF0 \"v\" -200 100 60 H V C CNN\nF1 \"sine\" -200 -50 60 H V C CNN\nF2 \"R1\" -300 0 60 H V C CNN\nF3 \"\" 0 0 60 H V C CNN\n$FPLIST\n 1_pin\n$ENDFPLIST\nDRAW\nA -50 0 50 1 1799 0 1 0 N 0 0 -100 0\nA 50 0 50 -1799 -1 0 1 0 N 0 0 100 0\nC 0 0 150 0 1 0 N\nX + 1 0 450 300 D 50 0 1 1 I\nX - 2 0 -450 300 U 50 0 1 1 I\nENDDRAW\nENDDEF\n#\n#End Library"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/default/power.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP +10V\nD Power symbol creates a global label with name \"+10V\"\nK power-flag\n$ENDCMP\n#\n$CMP +12C\nD Power symbol creates a global label with name \"+12C\"\nK power-flag\n$ENDCMP\n#\n$CMP +12L\nD Power symbol creates a global label with name \"+12L\"\nK power-flag\n$ENDCMP\n#\n$CMP +12LF\nD Power symbol creates a global label with name \"+12LF\"\nK power-flag\n$ENDCMP\n#\n$CMP +12P\nD Power symbol creates a global label with name \"+12P\"\nK power-flag\n$ENDCMP\n#\n$CMP +12V\nD Power symbol creates a global label with name \"+12V\"\nK power-flag\n$ENDCMP\n#\n$CMP +12VA\nD Power symbol creates a global label with name \"+12VA\"\nK power-flag\n$ENDCMP\n#\n$CMP +15V\nD Power symbol creates a global label with name \"+15V\"\nK power-flag\n$ENDCMP\n#\n$CMP +1V0\nD Power symbol creates a global label with name \"+1V0\"\nK power-flag\n$ENDCMP\n#\n$CMP +1V1\nD Power symbol creates a global label with name \"+1V1\"\nK power-flag\n$ENDCMP\n#\n$CMP +1V2\nD Power symbol creates a global label with name \"+1V2\"\nK power-flag\n$ENDCMP\n#\n$CMP +1V35\nD Power symbol creates a global label with name \"+1V35\"\nK power-flag\n$ENDCMP\n#\n$CMP +1V5\nD Power symbol creates a global label with name \"+1V5\"\nK power-flag\n$ENDCMP\n#\n$CMP +1V8\nD Power symbol creates a global label with name \"+1V8\"\nK power-flag\n$ENDCMP\n#\n$CMP +24V\nD Power symbol creates a global label with name \"+24V\"\nK power-flag\n$ENDCMP\n#\n$CMP +28V\nD Power symbol creates a global label with name \"+28V\"\nK power-flag\n$ENDCMP\n#\n$CMP +2V5\nD Power symbol creates a global label with name \"+2V5\"\nK power-flag\n$ENDCMP\n#\n$CMP +2V8\nD Power symbol creates a global label with name \"+2V8\"\nK power-flag\n$ENDCMP\n#\n$CMP +3.3V\nD Power symbol creates a global label with name \"+3.3V\"\nK power-flag\n$ENDCMP\n#\n$CMP +3.3VA\nD Power symbol creates a global label with name \"+3.3VA\"\nK power-flag\n$ENDCMP\n#\n$CMP +3.3VADC\nD Power symbol creates a global label with name \"+3.3VADC\"\nK power-flag\n$ENDCMP\n#\n$CMP +3.3VDAC\nD Power symbol creates a global label with name \"+3.3VDAC\"\nK power-flag\n$ENDCMP\n#\n$CMP +3.3VP\nD Power symbol creates a global label with name \"+3.3VP\"\nK power-flag\n$ENDCMP\n#\n$CMP +36V\nD Power symbol creates a global label with name \"+36V\"\nK power-flag\n$ENDCMP\n#\n$CMP +3V0\nD Power symbol creates a global label with name \"+3V0\"\nK power-flag\n$ENDCMP\n#\n$CMP +3V3\nD Power symbol creates a global label with name \"+3V3\"\nK power-flag\n$ENDCMP\n#\n$CMP +3V8\nD Power symbol creates a global label with name \"+3V8\"\nK power-flag\n$ENDCMP\n#\n$CMP +48V\nD Power symbol creates a global label with name \"+48V\"\nK power-flag\n$ENDCMP\n#\n$CMP +4V\nD Power symbol creates a global label with name \"+4V\"\nK power-flag\n$ENDCMP\n#\n$CMP +5C\nD Power symbol creates a global label with name \"+5C\"\nK power-flag\n$ENDCMP\n#\n$CMP +5F\nD Power symbol creates a global label with name \"+5F\"\nK power-flag\n$ENDCMP\n#\n$CMP +5P\nD Power symbol creates a global label with name \"+5P\"\nK power-flag\n$ENDCMP\n#\n$CMP +5V\nD Power symbol creates a global label with name \"+5V\"\nK power-flag\n$ENDCMP\n#\n$CMP +5VA\nD Power symbol creates a global label with name \"+5VA\"\nK power-flag\n$ENDCMP\n#\n$CMP +5VD\nD Power symbol creates a global label with name \"+5VD\"\nK power-flag\n$ENDCMP\n#\n$CMP +5VL\nD Power symbol creates a global label with name \"+5VL\"\nK power-flag\n$ENDCMP\n#\n$CMP +5VP\nD Power symbol creates a global label with name \"+5VP\"\nK power-flag\n$ENDCMP\n#\n$CMP +6V\nD Power symbol creates a global label with name \"+6V\"\nK power-flag\n$ENDCMP\n#\n$CMP +7.5V\nD Power symbol creates a global label with name \"+7.5V\"\nK power-flag\n$ENDCMP\n#\n$CMP +8V\nD Power symbol creates a global label with name \"+8V\"\nK power-flag\n$ENDCMP\n#\n$CMP +9V\nD Power symbol creates a global label with name \"+9V\"\nK power-flag\n$ENDCMP\n#\n$CMP +9VA\nD Power symbol creates a global label with name \"+9VA\"\nK power-flag\n$ENDCMP\n#\n$CMP +BATT\nD Power symbol creates a global label with name \"+BATT\"\nK power-flag battery\n$ENDCMP\n#\n$CMP +VDC\nD Power symbol creates a global label with name \"+VDC\"\nK power-flag\n$ENDCMP\n#\n$CMP +VSW\nD Power symbol creates a global label with name \"+VSW\"\nK power-flag\n$ENDCMP\n#\n$CMP -10V\nD Power symbol creates a global label with name \"-10V\"\nK power-flag\n$ENDCMP\n#\n$CMP -12V\nD Power symbol creates a global label with name \"-12V\"\nK power-flag\n$ENDCMP\n#\n$CMP -12VA\nD Power symbol creates a global label with name \"-12VA\"\nK power-flag\n$ENDCMP\n#\n$CMP -15V\nD Power symbol creates a global label with name \"-15V\"\nK power-flag\n$ENDCMP\n#\n$CMP -24V\nD Power symbol creates a global label with name \"-24V\"\nK power-flag\n$ENDCMP\n#\n$CMP -2V5\nD Power symbol creates a global label with name \"-2V5\"\nK power-flag\n$ENDCMP\n#\n$CMP -36V\nD Power symbol creates a global label with name \"-36V\"\nK power-flag\n$ENDCMP\n#\n$CMP -3V3\nD Power symbol creates a global label with name \"-3V3\"\nK power-flag\n$ENDCMP\n#\n$CMP -48V\nD Power symbol creates a global label with name \"-48V\"\nK power-flag\n$ENDCMP\n#\n$CMP -5V\nD Power symbol creates a global label with name \"-5V\"\nK power-flag\n$ENDCMP\n#\n$CMP -5VA\nD Power symbol creates a global label with name \"-5VA\"\nK power-flag\n$ENDCMP\n#\n$CMP -6V\nD Power symbol creates a global label with name \"-6V\"\nK power-flag\n$ENDCMP\n#\n$CMP -8V\nD Power symbol creates a global label with name \"-8V\"\nK power-flag\n$ENDCMP\n#\n$CMP -9V\nD Power symbol creates a global label with name \"-9V\"\nK power-flag\n$ENDCMP\n#\n$CMP -9VA\nD Power symbol creates a global label with name \"-9VA\"\nK power-flag\n$ENDCMP\n#\n$CMP -BATT\nD Power symbol creates a global label with name \"-BATT\"\nK power-flag battery\n$ENDCMP\n#\n$CMP -VDC\nD Power symbol creates a global label with name \"-VDC\"\nK power-flag\n$ENDCMP\n#\n$CMP -VSW\nD Power symbol creates a global label with name \"-VSW\"\nK power-flag\n$ENDCMP\n#\n$CMP AC\nD Power symbol creates a global label with name \"AC\"\nK power-flag\n$ENDCMP\n#\n$CMP Earth\nD Power symbol creates a global label with name \"Earth\"\nK power-flag ground gnd\nF ~\n$ENDCMP\n#\n$CMP Earth_Clean\nD Power symbol creates a global label with name \"Earth_Clean\"\nK power-flag ground gnd clean signal\nF ~\n$ENDCMP\n#\n$CMP Earth_Protective\nD Power symbol creates a global label with name \"Earth_Protective\"\nK power-flag ground gnd clean\nF ~\n$ENDCMP\n#\n$CMP GND\nD Power symbol creates a global label with name \"GND\" , ground\nK power-flag\n$ENDCMP\n#\n$CMP GND1\nD Power symbol creates a global label with name \"GND1\" , ground\nK power-flag\n$ENDCMP\n#\n$CMP GND2\nD Power symbol creates a global label with name \"GND2\" , ground\nK power-flag\n$ENDCMP\n#\n$CMP GND3\nD Power symbol creates a global label with name \"GND3\" , ground\nK power-flag\n$ENDCMP\n#\n$CMP GNDA\nD Power symbol creates a global label with name \"GNDA\" , analog ground\nK power-flag\n$ENDCMP\n#\n$CMP GNDD\nD Power symbol creates a global label with name \"GNDD\" , digital ground\nK power-flag\n$ENDCMP\n#\n$CMP GNDPWR\nD Power symbol creates a global label with name \"GNDPWR\" , power ground\nK power-flag\n$ENDCMP\n#\n$CMP GNDREF\nD Power symbol creates a global label with name \"GNDREF\" , reference supply ground\nK power-flag\n$ENDCMP\n#\n$CMP GNDS\nD Power symbol creates a global label with name \"GNDS\" , signal ground\nK power-flag\n$ENDCMP\n#\n$CMP HT\nD Power symbol creates a global label with name \"HT\"\nK power-flag\n$ENDCMP\n#\n$CMP LINE\nD Power symbol creates a global label with name \"LINE\"\nK power-flag\n$ENDCMP\n#\n$CMP NEUT\nD Power symbol creates a global label with name \"NEUT\"\nK power-flag\n$ENDCMP\n#\n$CMP PRI_HI\nD Power symbol creates a global label with name \"PRI_HI\"\nK power-flag\n$ENDCMP\n#\n$CMP PRI_LO\nD Power symbol creates a global label with name \"PRI_LO\"\nK power-flag\n$ENDCMP\n#\n$CMP PRI_MID\nD Power symbol creates a global label with name \"PRI_MID\"\nK power-flag\n$ENDCMP\n#\n$CMP PWR_FLAG\nD Special symbol for telling ERC where power comes from\nK power-flag\nF ~\n$ENDCMP\n#\n$CMP VAA\nD Power symbol creates a global label with name \"VAA\"\nK power-flag\n$ENDCMP\n#\n$CMP VAC\nD Power symbol creates a global label with name \"VAC\"\nK power-flag\n$ENDCMP\n#\n$CMP VBUS\nD Power symbol creates a global label with name \"VBUS\"\nK power-flag\n$ENDCMP\n#\n$CMP VCC\nD Power symbol creates a global label with name \"VCC\"\nK power-flag\n$ENDCMP\n#\n$CMP VCCQ\nD Power symbol creates a global label with name \"VCCQ\"\nK power-flag\n$ENDCMP\n#\n$CMP VCOM\nD Power symbol creates a global label with name \"VCOM\"\nK power-flag\n$ENDCMP\n#\n$CMP VD\nD Power symbol creates a global label with name \"VD\"\nK power-flag\n$ENDCMP\n#\n$CMP VDC\nD Power symbol creates a global label with name \"VDC\"\nK power-flag\n$ENDCMP\n#\n$CMP VDD\nD Power symbol creates a global label with name \"VDD\"\nK power-flag\n$ENDCMP\n#\n$CMP VDDA\nD Power symbol creates a global label with name \"VDDA\"\nK power-flag\n$ENDCMP\n#\n$CMP VDDF\nD Power symbol creates a global label with name \"VDDF\"\nK power-flag\n$ENDCMP\n#\n$CMP VEE\nD Power symbol creates a global label with name \"VEE\"\nK power-flag\n$ENDCMP\n#\n$CMP VMEM\nD Power symbol creates a global label with name \"VMEM\"\nK power-flag\n$ENDCMP\n#\n$CMP VPP\nD Power symbol creates a global label with name \"VPP\"\nK power-flag\n$ENDCMP\n#\n$CMP VS\nD Power symbol creates a global label with name \"VS\"\nK power-flag\n$ENDCMP\n#\n$CMP VSS\nD Power symbol creates a global label with name \"VSS\"\nK power-flag\n$ENDCMP\n#\n$CMP VSSA\nD Power symbol creates a global label with name \"VSSA\"\nK power-flag\n$ENDCMP\n#\n$CMP Vdrive\nD Power symbol creates a global label with name \"Vdrive\"\nK power-flag\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/default/power.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# +10V\n#\nDEF +10V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+10V\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +10V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +12C\n#\nDEF +12C #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+12C\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +12C 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +12L\n#\nDEF +12L #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+12L\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +12L 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +12LF\n#\nDEF +12LF #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+12LF\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +12LF 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +12P\n#\nDEF +12P #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+12P\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +12P 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +12V\n#\nDEF +12V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+12V\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +12V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +12VA\n#\nDEF +12VA #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+12VA\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +12VA 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +15V\n#\nDEF +15V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+15V\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +15V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +1V0\n#\nDEF +1V0 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+1V0\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +1V0 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +1V1\n#\nDEF +1V1 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+1V1\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +1V1 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +1V2\n#\nDEF +1V2 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+1V2\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +1V2 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +1V35\n#\nDEF +1V35 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+1V35\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +1V35 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +1V5\n#\nDEF +1V5 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+1V5\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +1V5 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +1V8\n#\nDEF +1V8 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+1V8\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +1V8 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +24V\n#\nDEF +24V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+24V\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +24V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +28V\n#\nDEF +28V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+28V\" 0 150 50 H V C CNN\nF2 \"\" 250 50 50 H I C CNN\nF3 \"\" 250 50 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +28V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +2V5\n#\nDEF +2V5 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+2V5\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +2V5 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +2V8\n#\nDEF +2V8 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+2V8\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +2V8 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +3.3VA\n#\nDEF +3.3VA #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+3.3VA\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +3.3VA 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +3.3VADC\n#\nDEF +3.3VADC #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 150 -50 50 H I C CNN\nF1 \"+3.3VADC\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +3.3VADC 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# +3.3VDAC\n#\nDEF +3.3VDAC #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 150 -50 50 H I C CNN\nF1 \"+3.3VDAC\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +3.3VDAC 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# +3.3VP\n#\nDEF +3.3VP #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 150 -50 50 H I C CNN\nF1 \"+3.3VP\" 0 100 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +3.3VP 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# +36V\n#\nDEF +36V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+36V\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +36V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +3V0\n#\nDEF +3V0 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+3V0\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +3V0 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +3V3\n#\nDEF +3V3 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+3V3\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS +3.3V\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +3V3 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +3V8\n#\nDEF +3V8 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+3V8\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +3V8 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +48V\n#\nDEF +48V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+48V\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +48V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +4V\n#\nDEF +4V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+4V\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +4V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +5C\n#\nDEF +5C #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+5C\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +5C 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +5F\n#\nDEF +5F #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+5F\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +5F 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +5P\n#\nDEF +5P #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+5P\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +5P 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +5V\n#\nDEF +5V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+5V\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +5V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +5VA\n#\nDEF +5VA #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+5VA\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +5VA 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +5VD\n#\nDEF +5VD #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+5VD\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +5VD 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +5VL\n#\nDEF +5VL #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+5VL\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +5VL 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +5VP\n#\nDEF +5VP #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+5VP\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +5VP 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +6V\n#\nDEF +6V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+6V\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +6V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +7.5V\n#\nDEF +7.5V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+7.5V\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +7.5V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +8V\n#\nDEF +8V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+8V\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +8V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +9V\n#\nDEF +9V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+9V\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +9V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +9VA\n#\nDEF +9VA #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -125 50 H I C CNN\nF1 \"+9VA\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +9VA 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +BATT\n#\nDEF +BATT #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+BATT\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +BATT 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +VDC\n#\nDEF +VDC #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -100 50 H I C CNN\nF1 \"+VDC\" 0 250 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 125 75 0 1 10 N\nP 2 0 1 20 -45 125 45 125 N\nP 2 0 1 0 0 0 0 50 N\nP 2 0 1 20 0 80 0 170 N\nX +VDC 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# +VSW\n#\nDEF +VSW #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"+VSW\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX +VSW 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# -10V\n#\nDEF -10V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-10V\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -10V 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -12V\n#\nDEF -12V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-12V\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -12V 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -12VA\n#\nDEF -12VA #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"-12VA\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -12VA 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -15V\n#\nDEF -15V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-15V\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -15V 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -24V\n#\nDEF -24V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-24V\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -24V 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -2V5\n#\nDEF -2V5 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-2V5\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -2V5 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -36V\n#\nDEF -36V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-36V\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -36V 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -3V3\n#\nDEF -3V3 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-3V3\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -3V3 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -48V\n#\nDEF -48V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-48V\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -48V 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -5V\n#\nDEF -5V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-5V\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -5V 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -5VA\n#\nDEF -5VA #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-5VA\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -5VA 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -6V\n#\nDEF -6V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-6V\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -6V 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -8V\n#\nDEF -8V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-8V\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -8V 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# -9V\n#\nDEF -9V #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -125 50 H I C CNN\nF1 \"-9V\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 0 0 0 100 N\nP 4 0 1 0 30 50 -30 50 0 100 30 50 F\nX -9V 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# -9VA\n#\nDEF -9VA #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -125 50 H I C CNN\nF1 \"-9VA\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 0 0 0 100 N\nP 4 0 1 0 30 50 -30 50 0 100 30 50 F\nX -9VA 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# -BATT\n#\nDEF -BATT #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"-BATT\" 0 140 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 0 0 0 100 N\nP 4 0 1 0 30 50 -30 50 0 100 30 50 F\nX -BATT 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# -VDC\n#\nDEF -VDC #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -100 50 H I C CNN\nF1 \"-VDC\" 0 250 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 125 75 0 1 10 N\nP 2 0 1 20 -45 125 45 125 N\nP 2 0 1 0 0 0 0 50 N\nX -VDC 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# -VSW\n#\nDEF -VSW #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 100 50 H I C CNN\nF1 \"-VSW\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F\nX -VSW 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# AC\n#\nDEF AC #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -100 50 H I C CNN\nF1 \"AC\" 0 250 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nA -25 125 25 1 1799 0 1 10 N 0 125 -50 125\nA 25 125 25 -1799 -1 0 1 10 N 0 125 50 125\nC 0 125 75 0 1 10 N\nP 2 0 1 0 0 0 0 50 N\nX AC 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# Earth\n#\nDEF Earth #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -250 50 H I C CNN\nF1 \"Earth\" 0 -150 50 H I C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -25 -75 25 -75 N\nP 2 0 1 0 -5 -100 5 -100 N\nP 2 0 1 0 0 -50 0 0 N\nP 2 0 1 0 50 -50 -50 -50 N\nX Earth 1 0 0 0 D 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# Earth_Clean\n#\nDEF Earth_Clean #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 250 0 50 H I C CNN\nF1 \"Earth_Clean\" 300 -150 50 H I C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\nDRAW\nA 0 -150 100 1 1799 0 1 0 N 100 -150 -100 -150\nP 2 0 1 0 -25 -125 25 -125 N\nP 2 0 1 0 -5 -150 5 -150 N\nP 2 0 1 0 0 -100 0 0 N\nP 2 0 1 0 50 -100 -50 -100 N\nX Earth_Clean 1 0 0 0 D 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# Earth_Protective\n#\nDEF Earth_Protective #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 250 -250 50 H I C CNN\nF1 \"Earth_Protective\" 450 -150 50 H I C CNN\nF2 \"\" 0 -100 50 H I C CNN\nF3 \"\" 0 -100 50 H I C CNN\nDRAW\nC 0 -150 100 0 1 0 N\nP 2 0 1 0 -25 -175 25 -175 N\nP 2 0 1 0 -5 -200 5 -200 N\nP 2 0 1 0 0 -150 0 0 N\nP 2 0 1 0 50 -150 -50 -150 N\nX Earth_Protective 1 0 0 0 D 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# GND\n#\nDEF GND #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -250 50 H I C CNN\nF1 \"GND\" 0 -150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N\nX GND 1 0 0 0 D 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# GND1\n#\nDEF GND1 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -250 50 H I C CNN\nF1 \"GND1\" 0 -150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N\nX GND1 1 0 0 0 D 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# GND2\n#\nDEF GND2 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -250 50 H I C CNN\nF1 \"GND2\" 0 -150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N\nX GND2 1 0 0 0 D 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# GND3\n#\nDEF GND3 #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -250 50 H I C CNN\nF1 \"GND3\" 0 -150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N\nX GND3 1 0 0 0 D 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# GNDA\n#\nDEF GNDA #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -250 50 H I C CNN\nF1 \"GNDA\" 0 -150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N\nX GNDA 1 0 0 0 D 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# GNDD\n#\nDEF GNDD #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -250 50 H I C CNN\nF1 \"GNDD\" 0 -125 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nS -50 -60 50 -80 0 1 10 F\nP 2 0 1 0 0 0 0 -60 N\nX GNDD 1 0 0 0 D 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# GNDPWR\n#\nDEF GNDPWR #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -200 50 H I C CNN\nF1 \"GNDPWR\" 0 -130 50 H V C CNN\nF2 \"\" 0 -50 50 H I C CNN\nF3 \"\" 0 -50 50 H I C CNN\nDRAW\nP 2 0 1 0 0 -50 0 0 N\nP 3 0 1 8 -40 -50 -50 -80 -50 -80 N\nP 3 0 1 8 -20 -50 -30 -80 -30 -80 N\nP 3 0 1 8 0 -50 -10 -80 -10 -80 N\nP 3 0 1 8 20 -50 10 -80 10 -80 N\nP 3 0 1 8 40 -50 -40 -50 -40 -50 N\nP 4 0 1 8 40 -50 30 -80 30 -80 30 -80 N\nX GNDPWR 1 0 0 0 D 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# GNDREF\n#\nDEF GNDREF #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -250 50 H I C CNN\nF1 \"GNDREF\" 0 -150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -25 -75 25 -75 N\nP 2 0 1 0 -5 -100 5 -100 N\nP 2 0 1 0 0 -50 0 0 N\nP 2 0 1 0 50 -50 -50 -50 N\nX GNDREF 1 0 0 0 D 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# GNDS\n#\nDEF GNDS #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -250 50 H I C CNN\nF1 \"GNDS\" 0 -150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N\nX GNDS 1 0 0 0 D 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# HT\n#\nDEF HT #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 120 50 H I C CNN\nF1 \"HT\" 0 90 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 3 0 1 0 0 0 0 40 0 40 N\nP 6 0 1 0 0 40 20 20 0 70 -20 20 0 40 0 40 N\nX HT 1 0 0 0 U 50 50 0 0 W N\nENDDRAW\nENDDEF\n#\n# LINE\n#\nDEF LINE #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"LINE\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX LINE 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# NEUT\n#\nDEF NEUT #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"NEUT\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX NEUT 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# PRI_HI\n#\nDEF PRI_HI #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"PRI_HI\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX PRI_HI 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# PRI_LO\n#\nDEF PRI_LO #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"PRI_LO\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 0 0 0 100 N\nP 4 0 1 0 30 50 -30 50 0 100 30 50 F\nX PRI_LO 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# PRI_MID\n#\nDEF PRI_MID #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"PRI_MID\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX PRI_MID 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# PWR_FLAG\n#\nDEF PWR_FLAG #FLG 0 0 N N 1 F P\nF0 \"#FLG\" 0 75 50 H I C CNN\nF1 \"PWR_FLAG\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 6 0 1 0 0 0 0 50 -40 75 0 100 40 75 0 50 N\nX pwr 1 0 0 0 U 50 50 0 0 w\nENDDRAW\nENDDEF\n#\n# VAA\n#\nDEF VAA #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VAA\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX VAA 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VAC\n#\nDEF VAC #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -100 50 H I C CNN\nF1 \"VAC\" 0 250 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nA -25 125 25 1 1799 0 1 10 N 0 125 -50 125\nA 25 125 25 -1799 -1 0 1 10 N 0 125 50 125\nC 0 125 75 0 1 10 N\nP 2 0 1 0 0 0 0 50 N\nX VAC 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VBUS\n#\nDEF VBUS #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VBUS\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX VBUS 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VCC\n#\nDEF VCC #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VCC\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX VCC 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VCCQ\n#\nDEF VCCQ #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VCCQ\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX VCCQ 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VCOM\n#\nDEF VCOM #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VCOM\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 0 0 0 100 N\nP 4 0 1 0 30 50 -30 50 0 100 30 50 F\nX VCOM 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VD\n#\nDEF VD #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VD\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX VD 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VDC\n#\nDEF VDC #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -100 50 H I C CNN\nF1 \"VDC\" 0 250 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX VDC 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VDD\n#\nDEF VDD #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VDD\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX VDD 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VDDA\n#\nDEF VDDA #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VDDA\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX VDDA 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VDDF\n#\nDEF VDDF #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VDDF\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX VDDF 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VEE\n#\nDEF VEE #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VEE\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 0 0 0 100 N\nP 4 0 1 0 30 50 -30 50 0 100 30 50 F\nX VEE 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VMEM\n#\nDEF VMEM #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VMEM\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX VMEM 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VPP\n#\nDEF VPP #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VPP\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX VPP 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VS\n#\nDEF VS #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" -200 -150 50 H I C CNN\nF1 \"VS\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 0 0 0 100 N\nP 4 0 1 0 30 50 -30 50 0 100 30 50 F\nX VS 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VSS\n#\nDEF VSS #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VSS\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 0 0 0 100 N\nP 4 0 1 0 30 50 -30 50 0 100 30 50 F\nX VSS 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# VSSA\n#\nDEF VSSA #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" 0 -150 50 H I C CNN\nF1 \"VSSA\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 0 0 0 100 N\nP 4 0 1 0 30 50 -30 50 0 100 30 50 F\nX VSSA 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n# Vdrive\n#\nDEF Vdrive #PWR 0 0 Y Y 1 F P\nF0 \"#PWR\" -200 -150 50 H I C CNN\nF1 \"Vdrive\" 0 150 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -30 50 0 100 N\nP 2 0 1 0 0 0 0 100 N\nP 2 0 1 0 0 100 30 50 N\nX Vdrive 1 0 0 0 U 50 50 1 1 W N\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/default/pspice.dcm",
    "content": "EESchema-DOCLIB  Version 2.0\n#\n$CMP 0\nD 0V reference potential for simulation\nK simulation\nF ~\n$ENDCMP\n#\n$CMP C\nD Capacitor symbol for simulation only\nK simulation\nF ~\n$ENDCMP\n#\n$CMP CAP\nD Capacitor symbol for simulation only\nK simulation\nF ~\n$ENDCMP\n#\n$CMP DIODE\nD Diode symbol for simulation only. Pin order incompatible with official kicad footprints\nK simulation\nF ~\n$ENDCMP\n#\n$CMP INDUCTOR\nD Inductor symbol for simulation only\nK simulation\nF ~\n$ENDCMP\n#\n$CMP ISOURCE\nD Current source symbol for simulation only\nK simulation\nF ~\n$ENDCMP\n#\n$CMP MNMOS\nD N-channel MOSFET symbol for simulation only\nK mosfet nmos simulation\nF ~\n$ENDCMP\n#\n$CMP MPMOS\nD P-channel MOSFET symbol for simulation only\nK mosfet pmos simulation\nF ~\n$ENDCMP\n#\n$CMP OPAMP\nD OPAmp symbol for simulation only\nK simulation\nF ~\n$ENDCMP\n#\n$CMP QNPN\nD Bipolar transistor symbol for simulation only\nK simulation\nF ~\n$ENDCMP\n#\n$CMP QPNP\nD Bipolar transistor symbol for simulation only\nK simulstaion\nF ~\n$ENDCMP\n#\n$CMP R\nD Resistor symbol for simulation only\nK resistor simulation\nF ~\n$ENDCMP\n#\n$CMP VSOURCE\nD Voltage source symbol for simulation only\nK simulation\nF ~\n$ENDCMP\n#\n#End Doc Library\n"
  },
  {
    "path": "esim-cloud-backend/kicad-symbols/default/pspice.lib",
    "content": "EESchema-LIBRARY Version 2.4\n#encoding utf-8\n#\n# 0\n#\nDEF 0 #GND 0 0 Y Y 1 F P\nF0 \"#GND\" 0 -100 50 H I C CNN\nF1 \"0\" 0 -70 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 4 0 1 0 -50 0 0 -50 50 0 -50 0 N\nX 0 1 0 0 0 R 40 40 1 1 W N\nENDDRAW\nENDDEF\n#\n# CAP\n#\nDEF CAP C 0 10 Y Y 1 F N\nF0 \"C\" 100 150 50 V V C CNN\nF1 \"CAP\" 100 -150 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nALIAS C\nDRAW\nP 2 0 1 0 -150 -50 150 -50 N\nP 2 0 1 0 -150 50 150 50 N\nX ~ 1 0 250 200 D 40 40 1 1 P\nX ~ 2 0 -250 200 U 40 40 1 1 P\nENDDRAW\nENDDEF\n#\n# DIODE\n#\nDEF DIODE D 0 40 Y N 1 F N\nF0 \"D\" 0 150 50 H V C CNN\nF1 \"DIODE\" 0 -175 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 75 100 75 -100 N\nP 3 0 1 0 -75 100 -75 -100 75 0 F\nX K 1 -200 0 150 R 50 50 1 1 I\nX A 2 200 0 150 L 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# INDUCTOR\n#\nDEF INDUCTOR L 0 0 N Y 1 F N\nF0 \"L\" 0 100 50 H V C CNN\nF1 \"INDUCTOR\" 0 -50 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nA -150 0 50 1 1799 0 1 0 N -100 0 -200 0\nA -50 0 50 1 1799 0 1 0 N 0 0 -100 0\nA 50 0 50 1 1799 0 1 0 N 100 0 0 0\nA 150 0 50 1 1799 0 1 0 N 200 0 100 0\nX 1 1 -250 0 50 R 30 30 1 1 I\nX 2 2 250 0 50 L 30 30 1 1 I\nENDDRAW\nENDDEF\n#\n# ISOURCE\n#\nDEF ISOURCE I 0 40 Y Y 1 F N\nF0 \"I\" -300 350 50 H V C CNN\nF1 \"ISOURCE\" 0 0 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 -100 200 0 1 0 N\nC 0 100 202 0 1 0 N\nT 0 -270 -10 50 0 0 1 I Normal 0 C C\nP 2 0 1 0 -300 -200 -300 200 F\nP 3 0 1 0 -350 200 -300 300 -250 200 F\nX E1 1 0 400 100 D 50 50 1 1 I\nX E2 2 0 -400 100 U 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# MNMOS\n#\nDEF MNMOS M 0 0 Y Y 1 F N\nF0 \"M\" 300 50 50 H V L CNN\nF1 \"MNMOS\" 300 -50 50 H V L CNN\nF2 \"\" -25 0 50 H I C CNN\nF3 \"\" -25 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -50 -100 -50 100 N\nP 2 0 1 0 -25 -100 100 -100 N\nP 2 0 1 0 100 100 -25 100 N\nP 2 0 1 0 200 0 -25 0 N\nP 4 0 1 0 -25 0 50 25 50 -25 -25 0 F\nP 2 1 1 0 -25 -100 -25 100 N\nX D 1 100 200 100 D 50 50 1 1 P\nX G 2 -200 0 150 R 50 50 1 1 I\nX S 3 100 -200 100 U 50 50 1 1 P\nX B 4 200 -200 200 U 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# MPMOS\n#\nDEF MPMOS M 0 0 Y Y 1 F N\nF0 \"M\" 300 50 50 H V L CNN\nF1 \"MPMOS\" 300 -50 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 -50 100 -50 -100 N\nP 2 0 1 0 -25 -100 100 -100 N\nP 2 0 1 0 100 100 -25 100 N\nP 2 0 1 0 200 0 -25 0 N\nP 4 0 1 0 200 0 125 25 125 -25 200 0 F\nP 2 1 1 0 -25 -100 -25 100 N\nX D 1 100 -200 100 U 50 50 1 1 P\nX G 2 -200 0 150 R 50 50 1 1 I\nX S 3 100 200 100 D 50 50 1 1 P\nX B 4 200 200 200 D 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n# OPAMP\n#\nDEF OPAMP U 0 10 Y Y 1 F N\nF0 \"U\" 150 125 50 H V L CNN\nF1 \"OPAMP\" 150 -125 50 H V L CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 4 0 1 10 200 0 -200 200 -200 -200 200 0 f\nX + 1 -300 100 100 R 50 50 1 1 I\nX - 2 -300 -100 100 R 50 50 1 1 I\nX ~ 3 300 0 100 L 50 50 1 1 O\nX V+ 4 -100 300 150 D 50 50 1 1 W\nX V- 5 -100 -300 150 U 50 50 1 1 W\nENDDRAW\nENDDEF\n#\n# QNPN\n#\nDEF QNPN Q 0 0 Y Y 1 F N\nF0 \"Q\" -100 300 50 H V C CNN\nF1 \"QNPN\" -100 200 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 0 0 0 0 150 -150 N\nP 4 0 0 0 150 -150 150 -50 50 -150 150 -150 F\nP 2 0 1 0 0 -150 0 150 N\nP 2 0 1 0 0 0 150 150 N\nP 4 0 1 0 -100 -150 0 -150 0 -150 0 -150 N\nX C 1 150 350 200 D 40 40 1 1 P\nX B 2 -300 0 300 R 40 40 1 1 I\nX E 3 150 -350 200 U 40 40 1 1 P\nX Substrat 4 -100 -350 200 U 50 20 1 1 I\nENDDRAW\nENDDEF\n#\n# QPNP\n#\nDEF QPNP Q 0 0 Y Y 1 F N\nF0 \"Q\" -100 300 50 H V C CNN\nF1 \"QPNP\" -100 200 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nP 2 0 1 0 0 -150 0 150 N\nP 2 0 1 0 0 0 150 -150 N\nP 2 0 1 0 0 0 150 150 N\nP 3 0 1 0 -100 -150 0 -150 0 -150 N\nP 4 0 1 0 120 -180 180 -120 85 -85 120 -180 F\nX C 1 150 350 200 D 40 40 1 1 C\nX B 2 -300 0 300 R 40 40 1 1 I\nX E 3 150 -350 200 U 40 40 1 1 E\nX Substrat 4 -100 -350 200 U 50 20 1 1 I\nENDDRAW\nENDDEF\n#\n# R\n#\nDEF R R 0 0 N Y 1 F N\nF0 \"R\" 80 0 50 V V C CNN\nF1 \"R\" 0 0 50 V V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nS -40 150 40 -150 0 1 0 N\nX ~ 1 0 250 100 D 50 50 1 1 P\nX ~ 2 0 -250 100 U 50 50 1 1 P\nENDDRAW\nENDDEF\n#\n# VSOURCE\n#\nDEF VSOURCE V 0 40 Y Y 1 F N\nF0 \"V\" -250 300 50 H V C CNN\nF1 \"VSOURCE\" 0 0 50 H V C CNN\nF2 \"\" 0 0 50 H I C CNN\nF3 \"\" 0 0 50 H I C CNN\nDRAW\nC 0 0 200 0 1 0 N\nT 0 -320 -10 50 0 0 1 V Normal 0 C C\nP 2 0 1 0 -250 -250 -250 150 F\nP 3 0 1 0 -300 150 -250 250 -200 150 F\nX E1 1 0 300 100 D 50 50 1 1 I\nX E2 2 0 -300 100 U 50 50 1 1 I\nENDDRAW\nENDDEF\n#\n#End Library\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/__init__.py",
    "content": ""
  },
  {
    "path": "esim-cloud-backend/libAPI/admin.py",
    "content": "from libAPI.lib_utils import handle_uploaded_libs\nfrom django.contrib import admin, messages\nfrom django.contrib.auth import get_user_model\nfrom libAPI.models import LibraryComponent, \\\n    Library, \\\n    LibrarySet, \\\n    FavouriteComponent\nfrom libAPI.forms import LibrarySetForm\nfrom inline_actions.admin import InlineActionsMixin\nfrom inline_actions.admin import InlineActionsModelAdminMixin\nfrom django.shortcuts import redirect\nfrom django.utils.safestring import mark_safe\nfrom esimCloud import settings\nimport os\n\n\n@admin.register(LibraryComponent)\nclass LibraryComponentAdmin(admin.ModelAdmin):\n    list_display = ('full_name', 'image_tag', 'svg_path', 'keyword',\n                    'description')\n    list_filter = ('symbol_prefix', 'component_library__library_name')\n    search_fields = ('keyword', 'name')\n\n\nclass ComponentInline(admin.TabularInline):\n    model = LibraryComponent\n    extra = 1\n\n\n@admin.register(Library)\nclass LibraryAdmin(admin.ModelAdmin):\n    inlines = (ComponentInline, )\n\n\nclass LibraryInline(InlineActionsMixin, admin.TabularInline):\n    model = Library\n    extra = 0\n    show_change_link = True\n    inline_actions = ['toggle_default']\n\n    def toggle_default(self, request, obj, parent_obj=None):\n        try:\n            library_set = LibrarySet.objects.filter(\n                user=parent_obj.user,\n                default=not parent_obj.default\n            )[0]\n        except IndexError:\n            library_set = LibrarySet(\n                name=parent_obj.user.username[0:24],\n                default=not parent_obj.default,\n                user=parent_obj.user\n            )\n            library_set.save()\n        messages.info(request, mark_safe(\n            f\"Library {obj.library_name} moved to \\\n            <a href='/api/admin/libAPI/libraryset/{library_set.id}'>\\\n            {library_set.name}</a>.\"))\n        obj.library_set = library_set\n        obj.save()\n\n    def get_toggle_default_label(self, obj):\n        if obj.library_set.default:\n            return 'Remove from Defaults'\n        return 'Add to Defaults'\n\n\nclass LibrarySetAdmin(InlineActionsModelAdminMixin, admin.ModelAdmin):\n    model = LibrarySet\n    list_display = ('name', 'user', 'default')\n    inlines = (LibraryInline, )\n\n    def get_form(self, request, obj=None, **kwargs):\n        return LibrarySetForm\n\n    def save_model(self, request, obj, form, change):\n        # For new library set instance\n        User = get_user_model()\n        user = User.objects.get(id=request.user.id)\n        if obj.pk is None:\n            obj = LibrarySet(\n                user=user,\n                default=True if request.POST.get('default') else False,\n                name=request.POST.get('name', '')[0:24]\n            )\n            obj.save()\n\n        # If the library set is being changed\n        else:\n            user = (LibrarySet.objects.get(id=obj.pk)).user\n            obj.user = user\n            obj.save()\n\n        files = request.FILES.getlist('files')\n        if len(files) != 0:\n            path = os.path.join(\n                settings.BASE_DIR[6:],\n                'kicad-symbols',\n                obj.user.username + '-' + obj.name)\n            handle_uploaded_libs(obj, path, files)  # defined in ./lib_utils.py\n        return redirect('/api/admin/libAPI/libraryset/' + str(obj.id))\n\n\nadmin.site.register(LibrarySet, LibrarySetAdmin)\n\n\n@admin.register(FavouriteComponent)\nclass FavouriteComponentAdmin(admin.ModelAdmin):\n    list_display = ('owner', 'last_change')\n    search_fields = ('owner', 'component')\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass LibapiConfig(AppConfig):\n    name = 'libAPI'\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/dbrouters.py",
    "content": "class mongoRouter:\n    \"\"\"\n    A router to control all database operations on models in the\n    auth and contenttypes applications.\n    \"\"\"\n    route_app_labels = {'libAPI'}\n\n    def db_for_read(self, model, **hints):\n        \"\"\"\n        Attempts to read auth and contenttypes models go to auth_db.\n        \"\"\"\n        if model._meta.app_label in self.route_app_labels:\n            return 'mongodb'\n        return None\n\n    def db_for_write(self, model, **hints):\n        \"\"\"\n        Attempts to write auth and contenttypes models go to auth_db.\n        \"\"\"\n        if model._meta.app_label in self.route_app_labels:\n            return 'mongodb'\n        return None\n\n    def allow_relation(self, obj1, obj2, **hints):\n        \"\"\"\n        Allow relations if a model in the auth or contenttypes apps is\n        involved.\n        \"\"\"\n        if (\n            obj1._meta.app_label in self.route_app_labels or\n            obj2._meta.app_label in self.route_app_labels\n        ):\n            return True\n        return None\n\n    def allow_migrate(self, db, app_label, model_name=None, **hints):\n        \"\"\"\n        Make sure the auth and contenttypes apps only appear in the\n        'auth_db' database.\n        \"\"\"\n        if app_label in self.route_app_labels:\n            return db == 'mongodb'\n        return None\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/forms.py",
    "content": "from libAPI.models import LibrarySet\nfrom django import forms\n\n\nclass LibrarySetForm(forms.ModelForm):\n    files = forms.FileField(\n        required=False,\n        widget=forms.ClearableFileInput(attrs={'multiple': True})\n    )\n\n    def __init__(self, *args, **kwargs):\n        super(LibrarySetForm, self).__init__(*args, **kwargs)\n        instance = getattr(self, 'instance', None)\n        if instance and instance.pk:\n            self.fields['user'].widget.attrs['disabled'] = True\n            self.fields['user'].required = False\n            self.fields['name'].widget.attrs['readonly'] = True\n\n    class Meta:\n        model = LibrarySet\n        fields = ('name', 'user', 'default', 'files')\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/helper/main.py",
    "content": "from .plotter import SvgPlotter\nfrom .parser import Parser\nimport os\nimport sys\n\n# import drawSvg as draw\nimport drawSvg as draw\n\n\nclass SvgGenerator:\n    def __init__(self):\n        self.CANVAS_HEIGHT = 2000\n        self.CANVAS_WIDTH = 1500\n        self.PART_NUMBER = \"1\"\n        self.DMG_NUMBER = \"1\"\n        self.DEFAULT_PEN_WIDTH = \"6\"\n        self.PIN_NAME_PADDING = 13\n        self.SHOW_TEXT = False\n        self.SHOW_PIN_NUMBER = False\n        self.SHOW_PIN_NAME = False\n        self.SHOW_PIN_NOT_CONNECTED = False\n        self.SVG_SCALE = 1\n\n        # set PIN_NAME_TEXT_SIZE = 0 to use default text_size\n        self.PIN_NAME_TEXT_SIZE = 35\n        self.NAME_OF_LIBS_TO_IGNORE_PIN_NAME = [\"power\"]\n\n        # some symbols dont have dmg 2.\n        # assuming dmg 2 is present.\n        # this will be changed to False later if we find\n        # that dmg 2 is not present.\n        self.IS_DMG_2_PRESENT = False\n\n        self.plotter = SvgPlotter()\n        self.parser = Parser()\n\n    def match_part_dmg(self, part, dmg):\n        \"\"\" Check if part  matches or not\n        \"\"\"\n        if (part == \"0\" or part == self.PART_NUMBER) and (\n            dmg == \"0\" or dmg == self.DMG_NUMBER\n        ):\n            return True\n\n        return False\n\n    def save_svg(self, d, name_of_symbol, save_path, pin_number_positions,\n                 symbol_prefix, dimension, run, part, dmg):\n        \"\"\" save svg\"\"\"\n        # print(pin_number_positions)\n        # check if symbols directory is present or not.\n\n        if run == 0:\n            return\n        else:\n            path_to_svg = f\"{save_path}/{name_of_symbol}.svg\"\n            d.saveSvg(path_to_svg)\n            # after saving svg open it again and embedd metadata.\n            # print(pin_number_positions)\n            elem = \"\"\n            for x in range(len(pin_number_positions)):\n                pin = pin_number_positions[x]\n                pin_number = pin[\"pinNumber\"]\n                x = pin['x']\n                y = pin['y']\n                pin_type = pin['type']\n                pinName = pin[\"pinName\"]\n                pinLength = pin[\"pinLength\"]\n                pinOrientation = pin[\"pinOrientation\"]\n                pinShape = pin[\"shape_of_pin\"]\n                elem += f\"\"\"<p-{pin_number}><x>{x}</x><y>{y}</y><type>{pin_type}\n                        </type><name>{pinName}</name><orientation>{pinOrientation}</orientation>\n                        <length>{pinLength}</length><pinShape>{pinShape}</pinShape>\n                        </p-{pin_number}>\"\"\"\n\n            # save the above elem in the same svg file.\n            fd = open(path_to_svg, 'r')\n            s = fd.readlines()\n            if(s[-1].strip('\\n') != '</svg>'):\n                while s[-1].strip(\"\\n\") != '</svg>':\n                    s.pop(-1)\n            s.pop(-1)\n\n            fd = open(path_to_svg, 'w')\n            for i in range(len(s)):\n                fd.write(s[i])\n            fd.write(\n                f'<metadata width=\"{dimension[0]}\" height=\"{dimension[1]}\" symbolPrefix=\"{symbol_prefix}\" cmpPartDmgLabel=\"{dmg}:{part}\" nameOfSymbol=\"{name_of_symbol}\">')  # noqa\n            fd.write(elem)\n            fd.write(\"</metadata></svg>\")\n            fd.close()\n\n    def generate_svg_from_lib(self, file_path, output_path):\n        \"\"\" Takes .lib file as input and generates\n            svg from the .lib file.\n        \"\"\"\n\n        data = self.parser.extract_data_from_lib(file_path)\n        dcm_path = file_path.rsplit(\".\", 1)\n        dcm_path = dcm_path[0] + \".dcm\"\n        folder_name = file_path.split('/')[-1].split(\".\")[0]\n        if(folder_name in self.NAME_OF_LIBS_TO_IGNORE_PIN_NAME):\n            self.SHOW_PIN_NAME = False\n        dcm_data = self.parser.extract_data_from_dcm(dcm_path)\n\n        if len(dcm_data) <= 0:\n            isDcmPresent = False\n        else:\n            isDcmPresent = True\n        # folder_name is also same as the file name without extension\n\n        component_data = {}\n        # loop through all the components in that library file.\n        for i in range(len(data)):\n\n            # initialize the drawing canvas.we need to initialize and save svg\n            # for each components.\n\n            DEF_LINE = data[i][\"def\"]\n\n            F0_LINE = data[i][\"fn\"][0]  # noqa\n\n            F1_LINE = data[i][\"fn\"][1]  # noqa\n\n            # footprint name if present\n            F2_LINE = data[i][\"fn\"][2]  # noqa\n\n            # relative path to datasheet if prsent\n            F3_LINE = data[i][\"fn\"][3]  # noqa\n\n            # DEF 14529 U 0 40 Y Y 1 L N\n            # ['DEF', '14529', 'U', '0', '40', 'Y', 'Y', '1', 'L', 'N']\n            name_of_symbol = DEF_LINE[1]\n\n            # symbol_prefix is 'U' for integrated circiut and 'R' for resister\n            symbol_prefix = DEF_LINE[2]  # noqa\n\n            # The third paramater is always 0\n            pin_name_offset = DEF_LINE[4]\n            show_pin_number = DEF_LINE[5]   # noqa\n            show_pin_name = DEF_LINE[6]     # noqa\n\n            # this tells the number of parts in the symbol.\n            number_of_parts_in_symbol = DEF_LINE[7]\n\n            is_dmg_2 = False\n\n            draw_instructions = data[i][\"draw\"]\n            for dm in range(1, 2 + 1):\n\n                self.DMG_NUMBER = str(dm)\n\n                if not is_dmg_2 and dm == 2:\n                    break\n                else:\n                    for z in range(1, int(number_of_parts_in_symbol) + 1):\n\n                        pin_number_positions = []\n                        my_height = 0\n                        my_width = 0\n\n                        for run in range(0, 2):\n\n                            # initialize canvas here.\n                            d = draw.Drawing(\n                                my_width,\n                                my_height,\n                                origin=\"center\",\n                                displayInline=False,\n                            )\n\n                            d.setPixelScale(s=self.SVG_SCALE)\n\n                            self.PART_NUMBER = str(z)\n\n                            fn_instructions = data[i][\"fn\"]\n                            for index in range(len(fn_instructions)):\n                                text = fn_instructions[index][1]\n                                x = fn_instructions[index][2]\n                                y = fn_instructions[index][3]\n                                text_size = fn_instructions[index][4]\n                                orientation = fn_instructions[index][5]  # noqa\n                                isVisible = fn_instructions[index][6] == \"V\"\n                                hjustify = fn_instructions[index][7]    # noqa\n                                vjustify = fn_instructions[index][8][0]  # noqa\n                                isItalic = fn_instructions[index][8][1] == \"I\"  # noqa\n                                isBold = fn_instructions[index][8][2] == \"B\"    # noqa\n\n                                if fn_instructions[index][0] == \"F0\":\n                                    text = text.strip('\"')\n                                    # convert to alphabet equivalent of number\n                                    # ascii 65 -> A\n                                    text = f\"{text}{dm}:{chr(64+z)}\"\n\n                                if isVisible and self.SHOW_TEXT:\n\n                                    d = self.plotter.draw_text(d, text, x,\n                                                               y, text_size)\n\n                            for x in range(len(draw_instructions)):\n\n                                # print(data[i][x])\n                                current_instruction = draw_instructions[x]\n                                shape = current_instruction[0]\n\n                                # (d,pinName,pinNumber,x1,y1,length=0,orientation='R',stroke=\"black\",stroke_width=5)\n                                if shape == \"X\":\n                                    # its a pin\n                                    # drawing using a line\n                                    pinName = current_instruction[1]\n                                    pinNumber = current_instruction[2]\n                                    x_pos = current_instruction[3]\n                                    y_pos = current_instruction[4]\n                                    pin_length = current_instruction[5]\n                                    pin_orientation = current_instruction[6]\n\n                                    part = current_instruction[9]\n                                    dmg = current_instruction[10]\n\n                                    type_of_pin = current_instruction[11]\n\n                                    if dmg == \"2\":\n                                        is_dmg_2 = True\n                                    # The 12th index may or maynot be present\n                                    #  in every\n                                    # instruction.\n                                    try:\n                                        shape_of_pin = current_instruction[12]\n                                    except IndexError:\n                                        shape_of_pin = \"\"\n\n                                    if not self.match_part_dmg(part, dmg):\n                                        continue\n\n                                    pin_name_ofset = str(\n                                        int(pin_name_offset)\n                                        + len(pinName) * self.PIN_NAME_PADDING\n                                    )\n\n                                    if run == 1:\n                                        pin_number_positions.append({\n                                            \"pinNumber\": pinNumber,\n                                            \"x\": x_pos,\n                                            \"y\": y_pos,\n                                            \"type\": type_of_pin,\n                                            \"pinName\": pinName,\n                                            \"pinOrientation\": pin_orientation,\n                                            \"pinLength\": pin_length,\n                                            \"shape_of_pin\": shape_of_pin,\n                                        })\n\n                                    if not self.SHOW_PIN_NUMBER:\n                                        pinNumber = \"\"\n                                    if (not self.SHOW_PIN_NAME and not self.SHOW_PIN_NOT_CONNECTED):  # noqa\n                                        pinName = \"\"\n\n                                    if pinName == \"NC\":\n                                        pinName = \"\"\n\n                                    if self.PIN_NAME_TEXT_SIZE != 0:\n                                        text_size = self.PIN_NAME_TEXT_SIZE\n\n                                    d = self.plotter.drawPin(\n                                        d,\n                                        pinName,\n                                        pinNumber,\n                                        x_pos,\n                                        y_pos,\n                                        pin_name_ofset,\n                                        length=pin_length,\n                                        orientation=pin_orientation,\n                                        text_size=text_size,\n                                        shape_of_pin=shape_of_pin,\n                                    )\n\n                                elif shape == \"S\":\n                                    # its a rectangle\n                                    x1 = current_instruction[1]\n                                    y1 = current_instruction[2]\n                                    x2 = current_instruction[3]\n                                    y2 = current_instruction[4]\n                                    fill_shape = current_instruction[8]\n                                    pen_width = current_instruction[7]\n\n                                    part = current_instruction[5]\n                                    dmg = current_instruction[6]\n\n                                    if dmg == \"2\":\n                                        is_dmg_2 = True\n\n                                    if pen_width == \"0\":\n                                        pen_width = self.DEFAULT_PEN_WIDTH\n\n                                    if not self.match_part_dmg(part, dmg):\n                                        continue\n\n                                    d = self.plotter.drawRec(\n                                        d, x1, y1, x2, y2, fill_shape,\n                                        pen_width\n                                    )\n\n                                elif shape == \"C\":\n                                    # its a circle\n                                    cx = current_instruction[1]\n                                    cy = current_instruction[2]\n                                    r = current_instruction[3]\n                                    pen_width = current_instruction[6]\n                                    fill_shape = current_instruction[7]\n\n                                    part = current_instruction[4]\n                                    dmg = current_instruction[5]\n\n                                    if dmg == \"2\":\n                                        is_dmg_2 = True\n\n                                    if pen_width == \"0\":\n                                        pen_width = self.DEFAULT_PEN_WIDTH\n\n                                    if not self.match_part_dmg(part, dmg):\n                                        continue\n\n                                    d = self.plotter.drawCircle(\n                                        d, cx, cy, r, fill=fill_shape,\n                                        pen=pen_width\n                                    )\n\n                                elif shape == \"A\":\n                                    # its an arc\n                                    cx = current_instruction[1]\n                                    cy = current_instruction[2]\n                                    r = current_instruction[3]\n                                    start_deg = current_instruction[4]\n                                    end_deg = current_instruction[5]\n\n                                    pen_width = current_instruction[8]\n                                    fill = current_instruction[9]\n\n                                    part = current_instruction[6]\n                                    dmg = current_instruction[7]\n                                    x_start = current_instruction[10]\n                                    y_start = current_instruction[11]\n                                    x_end = current_instruction[12]\n                                    y_end = current_instruction[13]\n                                    if dmg == \"2\":\n                                        is_dmg_2 = True\n\n                                    if pen_width == \"0\":\n                                        pen_width = self.DEFAULT_PEN_WIDTH\n\n                                    if not self.match_part_dmg(part, dmg):\n                                        continue\n                                    d = self.plotter.drawArc(\n                                        d, cx, cy, r, start_deg, end_deg,\n                                        x_start, y_start, x_end, y_end,\n                                        pen_width,\n                                        fill\n                                    )\n\n                                elif shape == \"P\":\n\n                                    # its a polygon\n                                    # P 2 2 1 10 -150 -175 -25 -175 f\n\n                                    vertices_count = current_instruction[1]\n                                    pen_width = current_instruction[4]\n\n                                    part = current_instruction[2]\n                                    dmg = current_instruction[3]\n\n                                    if dmg == \"2\":\n                                        is_dmg_2 = True\n\n                                    if pen_width == \"0\":\n                                        pen_width = self.DEFAULT_PEN_WIDTH\n\n                                    if not self.match_part_dmg(part, dmg):\n                                        continue\n\n                                    fill = current_instruction[\n                                        len(current_instruction) - 1\n                                    ]\n\n                                    vertices_list = []\n                                    for j in range(5,\n                                                   (len(current_instruction)\n                                                    - 1),\n                                                   2):\n                                        point = (\n                                            current_instruction[j],\n                                            current_instruction[j + 1],\n                                        )\n                                        vertices_list.append(point)\n\n                                    d = self.plotter.drawPolygon(\n                                        d, vertices_count, pen_width,\n                                        vertices_list, fill\n                                    )\n\n                                elif shape == \"T\":\n                                    # its a text\n                                    pass\n\n                                else:\n                                    pass\n\n                                # check if user inputed path exists or not\n                                if not os.path.exists(output_path):\n                                    try:\n                                        os.mkdir(output_path)\n                                    except OSError as error:\n                                        print(error)\n\n                                # create a folder with the name of the input\n                                # file if not already exist.\n                                save_path = f\"{output_path}/{folder_name}\"\n                                if not os.path.exists(save_path):\n                                    try:\n                                        os.mkdir(save_path)\n                                    except OSError as error:\n                                        print(error)\n\n                                svg_boundary = self.plotter.get_svg_boundary()\n                                top = svg_boundary[\"top\"]\n                                right = svg_boundary[\"right\"]\n                                bottom = svg_boundary[\"bottom\"]\n                                left = svg_boundary[\"left\"]\n\n                                if abs(top) != abs(bottom):\n                                    # the svg is not symmetric\n                                    # then taking the greater side\n                                    greater_side = abs(top) if abs(\n                                        top) > abs(bottom) else abs(bottom)\n\n                                    my_height = greater_side * 2\n                                else:\n\n                                    height = abs(top - bottom)\n\n                                    if height <= 0:\n                                        height = 200\n                                    my_height = height\n\n                                if abs(left) != abs(right):\n                                    # the svg is not symmetric\n                                    # then taking the greater side\n                                    greater_side = abs(left) if abs(\n                                        left) > abs(right) else abs(right)\n                                    my_width = greater_side * 2\n\n                                else:\n                                    width = abs(left - right)\n\n                                    if width <= 0:\n                                        width = 200\n                                    my_width = width\n\n                            name = (f\"{symbol_prefix}\" +\n                                    f\"-{name_of_symbol}-{dm}-\" +\n                                    f\"{chr(64+z)}\")\n\n                            if(not isDcmPresent):\n                                # populate dcm_data with fake info\n                                for ix in range(len(data)):\n                                    dummy_dcm = {'name': '', 'D': '',\n                                                 'K': '', 'F': ''}\n                                    dummy_dcm['name'] = data[ix]['def'][1]\n                                    dcm_data.append(dummy_dcm)\n\n                            if dm == 1 and z == 1:\n                                # run twice to save a thumbnail image\n                                for sav_svg in range(0, 2):\n\n                                    if sav_svg == 1:\n                                        # change name as thumbnail\n                                        name = (f\"{symbol_prefix}\" +\n                                                f\"-{name_of_symbol}-{dm}-\" +\n                                                f\"{chr(64+z)}_thumbnail\")\n\n                                    self.save_svg(d, name,\n                                                  save_path,\n                                                  pin_number_positions,\n                                                  symbol_prefix,\n                                                  (my_width, my_height), run,\n                                                  chr(64+z), dm,\n                                                  )\n                                    # reset svg_boundary set all\n                                    # paramerers to 0\n                                    self.plotter.reset_svg_boundary()\n                                    cmp_data = {}\n                                    if '#' in symbol_prefix:\n                                        symbol_prefix = symbol_prefix.replace(\n                                            '#', '')\n                                    for co in range(0, len(dcm_data)):\n                                        comp = dcm_data[co]\n                                        if(name_of_symbol == comp[\"name\"]):\n                                            cmp_data[\"name\"] = comp[\"name\"]\n                                            cmp_data[\"full_name\"] = name if (name != '') else comp['name'] # noqa\n                                            if 'K' in comp.keys():\n                                                cmp_data[\"keyword\"] = comp[\"K\"]\n                                            else:\n                                                cmp_data[\"keyword\"] = \"\"\n\n                                            if 'D' in comp.keys():\n                                                cmp_data[\"description\"] \\\n                                                    = comp[\"D\"]\n                                            else:\n                                                cmp_data[\"description\"] = \"\"\n\n                                            if 'F' in comp.keys():\n                                                cmp_data[\"data_link\"] \\\n                                                    = comp[\"F\"]\n                                            else:\n                                                cmp_data[\"data_link\"] = \"\"\n\n                                            if 'F' in comp.keys():\n                                                cmp_data[\"data_link\"] \\\n                                                    = comp[\"F\"]\n                                            else:\n                                                cmp_data[\"data_link\"] = \"\"\n\n                                            cmp_data[\"symbol_prefix\"] \\\n                                                = symbol_prefix\n                                            cmp_data[\"alias\"] \\\n                                                = data[i][\"alias\"]\n                                            cmp_data[\"dmg\"] = dm\n                                            cmp_data[\"part\"] = chr(64+z)\n                                            component_data[cmp_data[\"full_name\"]] = cmp_data  # noqa\n                            else:\n                                self.save_svg(d, name,\n                                              save_path, pin_number_positions,\n                                              symbol_prefix,\n                                              (my_width, my_height), run,\n                                              chr(64+z), dm,\n                                              )\n                                # reset svg_boundary set all paramerers to 0\n                                self.plotter.reset_svg_boundary()\n                                cmp_data = {}\n                                if '#' in symbol_prefix:\n                                    symbol_prefix = symbol_prefix.replace(\n                                        '#', '')\n                                for co in range(0, len(dcm_data)):\n                                    comp = dcm_data[co]\n                                    if(name_of_symbol == comp[\"name\"]):\n                                        cmp_data[\"name\"] = comp[\"name\"]\n                                        cmp_data[\"full_name\"] = name if (name != '') else comp['name'] # noqa\n                                        if 'K' in comp.keys():\n                                            cmp_data[\"keyword\"] = comp[\"K\"]\n                                        else:\n                                            cmp_data[\"keyword\"] = \"\"\n\n                                        if 'D' in comp.keys():\n                                            cmp_data[\"description\"] = comp[\"D\"]\n                                        else:\n                                            cmp_data[\"description\"] = \"\"\n\n                                        if 'F' in comp.keys():\n                                            cmp_data[\"data_link\"] = comp[\"F\"]\n                                        else:\n                                            cmp_data[\"data_link\"] = \"\"\n\n                                        if 'F' in comp.keys():\n                                            cmp_data[\"data_link\"] = comp[\"F\"]\n                                        else:\n                                            cmp_data[\"data_link\"] = \"\"\n\n                                        cmp_data[\"symbol_prefix\"] \\\n                                            = symbol_prefix\n                                        cmp_data[\"alias\"] = data[i][\"alias\"]\n                                        cmp_data[\"dmg\"] = dm\n                                        cmp_data[\"part\"] = chr(64+z)\n                                        component_data[cmp_data[\"full_name\"]] = cmp_data  # noqa\n\n        return component_data\n\n\ndef generate_svg_and_save_to_folder(input_file, output_folder):\n    svg_gen = SvgGenerator()\n    return svg_gen.generate_svg_from_lib(input_file, output_folder)\n\n\nif __name__ == \"__main__\":\n    # Takes Libraries as command line arguments,\n    # Only if script is run on command line\n    if(len(sys.argv)) != 3:\n        print(\"Usage: script.py <Path to library> <Output Directory>\")\n        sys.exit(1)\n    generate_svg_and_save_to_folder(sys.argv[1], sys.argv[2])\n    print('Processed', sys.argv[1])\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/helper/parser.py",
    "content": "import re\n\n\nclass Parser:\n    def extract_data_from_lib(self, filename):\n\n        def_flag = False\n        with open(filename) as file:\n            file_contents = file.readlines()\n            data = []\n            for line in file_contents:\n\n                # check for blank lines.\n                if line.strip() != \"\":\n\n                    if line.find(\"DEF\") == 0:\n                        instruction = {\"def\": [], \"fn\": [],\n                                       \"alias\": [], \"draw\": []}\n\n                        instruction[\"def\"] = line.strip().split(\" \")\n\n                        def_flag = True\n\n                    elif line.find(\"ALIAS\") == 0:\n                        instruction[\"alias\"] = line.strip().split(\" \")\n                        if len(instruction[\"alias\"]) > 0:\n                            # remove the first element which is text ALIAS\n                            instruction[\"alias\"].pop(0)\n\n                    elif line.find(\"ENDDEF\") == 0:\n                        data.append(instruction)\n                        def_flag = False  # noqa\n\n                    elif re.match(r\"F[0-9]+\", line):\n                        instruction[\"fn\"].append(line.strip().split(\" \"))\n\n                    elif line.startswith((\"A\", \"C\", \"P\", \"S\", \"T\", \"B\", \"X\")):\n                        instruction[\"draw\"].append(line.strip().split(\" \"))\n\n                    else:\n                        pass\n\n        return data\n\n    def extract_data_from_dcm(self, filename):\n\n        with open(filename) as file:\n            file_contents = file.readlines()\n            # data = []\n            # print(file_contents)\n\n            dcm_data = []\n\n            for line in file_contents:\n\n                if('$CMP' in line):\n                    # line = line.strip().split(' ')\n                    s2 = ' '.join(line.split()[1:])\n                    dcm_component = {\"name\": s2}\n                elif('$ENDCMP' in line):\n                    # line = line.strip().split(' ')\n                    s2 = ' '.join(line.split()[1:])\n                    dcm_data.append(dcm_component)\n                elif(line[0] == 'D'):\n                    # description\n\n                    s2 = ' '.join(line.split()[1:])\n                    dcm_component[\"D\"] = s2\n                elif(line[0] == 'K'):\n                    # keyword\n                    # line = line.strip().split(' ')\n                    s2 = ' '.join(line.split()[1:])\n                    dcm_component[\"K\"] = s2\n                elif(line[0] == 'F'):\n                    # datasheet_link\n                    # line = line.strip().split(' ')\n                    s2 = ' '.join(line.split()[1:])\n                    dcm_component[\"F\"] = s2\n\n        return dcm_data\n\n\nif __name__ == \"__main__\":\n    parser = Parser()\n    # data = parser.extract_data_from_lib(\"./sample_lib/4002.lib\")\n    data = parser.extract_data_from_lib(\"./sample_lib/4xxx.lib\")\n    # print(data)\n    print(data)\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/helper/plotter.py",
    "content": "import drawSvg as draw\n\n\nclass SvgPlotter:\n    svg_boundary = {\n        \"top\": 0,\n        \"right\": 0,\n        \"bottom\": 0,\n        \"left\": 0,\n    }\n\n    def __init__(self):\n        self.STROKE_COLOR = \"black\"\n        self.PIN_NAME_COLOR = \"black\"\n        self.PIN_NUMBER_COLOR = \"black\"\n        self.PIN_NUMBER_OFFSET = 17\n        self.RADIUS_OF_NOT_GATE = 25\n        self.FILL_NOT_GATE = \"F\"\n\n        # increase ratio to reduce pin Number size\n        self.TEXT_SIZE_REDUCE_RATION = 1.5\n\n    # def update_svg_boundary(self,value,axis):\n    #     # axis can be 'x' or 'y'\n    #     if axis == 'x':\n    #         # update along x axis\n    #         if(value > 0):\n    #             # right side\n    #             # check if passed value is greater than\n    #             # current value\n    #             if(value > self.svg_boundary[\"right\"]):\n    #                 self.svg_boundary[\"right\"] = value\n    #         else:\n    #             # left side\n    #             # check if passed values is smaller\n    #             # than the current value\n    #             if(value < self.svg_boundary[\"left\"]):\n    #                 self.svg_boundary[\"left\"] = value\n\n    #     if axis == 'y':\n    #         # update along y axis\n    #         if(value > 0):\n    #             # top side\n    #             # check if passed value is greater than\n    #             # current value\n    #             if(value > self.svg_boundary[\"top\"]):\n    #                 self.svg_boundary[\"top\"] = value\n    #         else:\n    #             # bottom side\n    #             if(value < self.svg_boundary[\"bottom\"]):\n    #                 self.svg_boundary[\"bottom\"] = value\n\n    def update_svg_boundary(self, vertex_list):\n        for point in range(len(vertex_list)):\n            x_value = int(vertex_list[point][0])\n            y_value = int(vertex_list[point][1])\n\n            if(x_value > 0):\n                # right side\n                # check if passed value is greater than\n                # current value\n                if(x_value > self.svg_boundary[\"right\"]):\n                    self.svg_boundary[\"right\"] = x_value\n            else:\n                # left side\n                # check if passed values is smaller\n                # than the current value\n                if(x_value < self.svg_boundary[\"left\"]):\n                    self.svg_boundary[\"left\"] = x_value\n\n            if(y_value > 0):\n                # top side\n                # check if passed value is greater than\n                # current value\n                if(y_value > self.svg_boundary[\"top\"]):\n                    self.svg_boundary[\"top\"] = y_value\n            else:\n                # bottom side\n                if(y_value < self.svg_boundary[\"bottom\"]):\n                    self.svg_boundary[\"bottom\"] = y_value\n\n    def get_svg_boundary(self,):\n\n        return self.svg_boundary\n\n    def reset_svg_boundary(self,):\n        self.svg_boundary = {\n            \"top\": 0,\n            \"right\": 0,\n            \"bottom\": 0,\n            \"left\": 0,\n        }\n\n    \"\"\"pen-parameter is the thickness of the pen,when\n    zero the default pen width is used.\n    The fill parameter is “f” for a filled shape in the\n    background colour, “F” for a filled shape in\n    the pen colour, or “N” for an unfilled shape.\n    \"\"\"\n\n    def draw_text(self, d, text, x, y, text_size, fill=\"black\"):\n        x = int(x)\n        y = int(y)\n        text_size = int(text_size)\n        text = text.strip('\"')\n        d.append(draw.Text(text, text_size, x, y, center=0.6))\n        return d\n\n    def normalize_angle(self, angle):\n        return 360 + angle\n\n    def drawCircle(self, d, x, y, r, fill=\"f\", pen=5):\n        pen = int(pen)\n        if fill == \"f\":\n            kwargs = {\"fill_opacity\": 0}\n        elif fill == \"F\":\n            kwargs = {\"fill\": self.STROKE_COLOR}\n        else:\n            kwargs = {\"fill_opacity\": 0}\n\n        x = int(x)\n        y = int(y)\n        r = int(r)\n\n        d.append(\n            draw.Circle(x, y, r, stroke_width=pen,\n                        stroke=self.STROKE_COLOR,\n                        **kwargs)\n        )\n\n        v_list = [(x, y+r),  (x, y-r), (x + r, y), (x - r, y)]\n\n        self.update_svg_boundary(v_list)\n\n        return d\n\n    def drawRec(self, d, x1, y1, x2, y2, fill=\"f\", pen=5,\n                ):\n\n        # 'f'->filled shape in background color\n        # 'F' -> filled shape in pen color\n        # 'N' -> unfilled shape\n        # pen->stroke_width\n        pen = int(pen)\n        x1 = int(x1)\n        y1 = int(y1)\n        x2 = int(x2)\n        y2 = int(y2)\n\n        # self.update_svg_boundary(x1,'x')\n        # self.update_svg_boundary(y1,'y')\n\n        # self.update_svg_boundary(x2,'x')\n        # self.update_svg_boundary(y2,'y')\n\n        if fill == \"f\":\n            kwargs = {\"fill_opacity\": 0}\n        elif fill == \"F\":\n            kwargs = {\"fill\": self.STROKE_COLOR}\n        else:\n            kwargs = {\"fill_opacity\": 0}\n        d.append(\n            draw.Lines(\n                x1,\n                y1,\n                x2,\n                y1,\n                x2,\n                y2,\n                x1,\n                y2,\n                x1,\n                y1,\n                stroke_width=pen,\n                stroke=self.STROKE_COLOR,\n                **kwargs\n            )\n        )\n        self.update_svg_boundary([(x1, y1), (x2, y2)])\n\n        return d\n\n    # A X Y radius start end part dmg pen fill Xstart Ystart Xend Yend\n    def drawArc(self, d, cx, cy, r, start_deg, end_deg, x_start, y_start,\n                x_end, y_end, pen=5, fill=\"f\",\n                ):\n\n        cx = int(cx)\n        cy = int(cy)\n        r = int(r)\n        pen = int(pen)\n        start_deg = int(start_deg) * 0.1\n        end_deg = int(end_deg) * 0.1\n        start_end_points = [(int(x_start), int(y_start)),\n                            (int(x_end), int(y_end))]\n\n        self.update_svg_boundary(start_end_points)\n\n        if start_deg < 0:\n            start_deg = self.normalize_angle(start_deg)\n\n        if end_deg < 0:\n            end_deg = self.normalize_angle(end_deg)\n\n        if start_deg > end_deg:\n            # swap\n            temp = start_deg\n            start_deg = end_deg\n            end_deg = temp\n\n        difference = end_deg - start_deg\n        cw = False\n\n        if abs(difference) > 180:\n\n            cw = True\n\n        if fill == \"f\":\n            kwargs = {\"fill_opacity\": 0}\n        elif fill == \"F\":\n            kwargs = {\"fill\": self.STROKE_COLOR}\n        else:\n            kwargs = {\"fill_opacity\": 0}\n\n        d.append(\n            draw.Arc(\n                cx,\n                cy,\n                r,\n                start_deg,\n                end_deg,\n                cw=cw,\n                stroke=self.STROKE_COLOR,\n                stroke_width=pen,\n                **kwargs\n            )\n        )\n        return d\n\n    # P count part dmg pen X Y ... fill\n    def drawPolygon(self, d, vertices_count, pen=5,\n                    vertices_list=[], fill=\"f\", ):\n\n        pen = int(pen)\n\n        # only fill the polygon if its implicitly closed\n\n        #\n        # unpack arguments in list using *operator\n        #\n        kwargs = {}\n        if fill == 'F':\n            # fill the shape\n            kwargs[\"fill\"] = self.STROKE_COLOR\n        if fill == 'f' or fill == 'N':\n            # dont fill the shape\n            kwargs[\"fill_opacity\"] = 0\n\n        arg = []\n        for i in range(0, len(vertices_list)):\n            for index in range(0, 2):\n                arg.append(int(vertices_list[i][index]))\n            self.update_svg_boundary(vertices_list)\n        d.append(draw.Lines(*arg,\n                            close=False,\n                            stroke_width=pen,\n                            stroke=self.STROKE_COLOR,\n                            **kwargs))\n        return d\n\n    def draw_pin_shape(self, d, x, y, ox, oy, pin_orientation, shape_of_pin,\n                       pen=5):\n\n        # inverted pin draw a circle of radius 10 at the end of the pin.\n\n        if shape_of_pin == \"I\":\n            # inverted (not gate)\n            d = self.drawCircle(\n                d, x, y, self.RADIUS_OF_NOT_GATE, fill=self.FILL_NOT_GATE\n            )\n        elif shape_of_pin == \"C\":\n            # clock\n            # ox oy are original values\n            x = ox\n            y = oy\n            clock_pin_padding = 30\n            if pin_orientation == \"R\":\n                # add in x direction\n\n                x1 = x + clock_pin_padding\n                y1 = y\n                x2 = x\n                y2 = y + clock_pin_padding\n                x3 = x\n                y3 = y - clock_pin_padding\n                arg = [x1, y1, x2, y2, x3, y3, x1, y1]\n                d.append(draw.Lines(*arg,\n                                    close=False,\n                                    stroke_width=pen,\n                                    stroke=self.STROKE_COLOR,\n                                    fill_opacity=0\n                                    ))\n\n            elif pin_orientation == \"L\":\n                # sub in x direction\n                x1 = x - clock_pin_padding\n                y1 = y\n                x2 = x\n                y2 = y + clock_pin_padding\n                x3 = x\n                y3 = y - clock_pin_padding\n                arg = [x1, y1, x2, y2, x3, y3, x1, y1]\n                d.append(draw.Lines(*arg,\n                                    close=False,\n                                    stroke_width=pen,\n                                    stroke=self.STROKE_COLOR,\n                                    ))\n\n            elif pin_orientation == \"U\":\n                # add in y direction\n                x1 = x\n                y1 = y + clock_pin_padding\n                x2 = x + clock_pin_padding\n                y2 = y\n                x3 = x - clock_pin_padding\n                y3 = y\n                arg = [x1, y1, x2, y2, x3, y3, x1, y1]\n                d.append(draw.Lines(*arg,\n                                    close=False,\n                                    stroke_width=pen,\n                                    stroke=self.STROKE_COLOR,\n                                    ))\n\n            elif pin_orientation == \"D\":\n                # sub in y direction\n                x1 = x\n                y1 = y - clock_pin_padding\n                x2 = x + clock_pin_padding\n                y2 = y\n                x3 = x - clock_pin_padding\n                y3 = y\n                arg = [x1, y1, x2, y2, x3, y3, x1, y1]\n                d.append(draw.Lines(*arg,\n                                    close=False,\n                                    stroke_width=pen,\n                                    stroke=self.STROKE_COLOR,\n                                    ))\n            else:\n                pass\n\n        elif shape_of_pin == \"CI\":\n            # clock inverted\n            x = ox\n            y = oy\n            clock_pin_padding = 30\n            inverted_clock_radius = 10\n            if pin_orientation == \"R\":\n                # add in x direction\n\n                x1 = x + clock_pin_padding\n                y1 = y\n                x2 = x\n                y2 = y + clock_pin_padding\n                x3 = x\n                y3 = y - clock_pin_padding\n                arg = [x1, y1, x2, y2, x3, y3, x1, y1]\n                d.append(draw.Lines(*arg,\n                                    close=False,\n                                    stroke_width=pen,\n                                    stroke=self.STROKE_COLOR,\n                                    fill_opacity=0\n                                    ))\n                d.append(draw.Circle(x+inverted_clock_radius, y,\n                                     inverted_clock_radius, stroke_width=pen,\n                                     stroke=self.STROKE_COLOR,\n                                     fill_opacity=0))\n\n            elif pin_orientation == \"L\":\n                # sub in x direction\n                x1 = x - clock_pin_padding\n                y1 = y\n                x2 = x\n                y2 = y + clock_pin_padding\n                x3 = x\n                y3 = y - clock_pin_padding\n                arg = [x1, y1, x2, y2, x3, y3, x1, y1]\n                d.append(draw.Lines(*arg,\n                                    close=False,\n                                    stroke_width=pen,\n                                    stroke=self.STROKE_COLOR,\n                                    ))\n                d.append(draw.Circle(x-inverted_clock_radius, y,\n                                     inverted_clock_radius, stroke_width=pen,\n                                     stroke=self.STROKE_COLOR,\n                                     fill_opacity=0))\n\n            elif pin_orientation == \"U\":\n                # add in y direction\n                x1 = x\n                y1 = y + clock_pin_padding\n                x2 = x + clock_pin_padding\n                y2 = y\n                x3 = x - clock_pin_padding\n                y3 = y\n                arg = [x1, y1, x2, y2, x3, y3, x1, y1]\n                d.append(draw.Lines(*arg,\n                                    close=False,\n                                    stroke_width=pen,\n                                    stroke=self.STROKE_COLOR,\n                                    ))\n                d.append(draw.Circle(x, y+inverted_clock_radius,\n                                     inverted_clock_radius, stroke_width=pen,\n                                     stroke=self.STROKE_COLOR,\n                                     fill_opacity=0))\n\n            elif pin_orientation == \"D\":\n                # sub in y direction\n                x1 = x\n                y1 = y - clock_pin_padding\n                x2 = x + clock_pin_padding\n                y2 = y\n                x3 = x - clock_pin_padding\n                y3 = y\n                arg = [x1, y1, x2, y2, x3, y3, x1, y1]\n                d.append(draw.Lines(*arg,\n                                    close=False,\n                                    stroke_width=pen,\n                                    stroke=self.STROKE_COLOR,\n                                    ))\n                d.append(draw.Circle(x, y-inverted_clock_radius,\n                                     inverted_clock_radius, stroke_width=pen,\n                                     stroke=self.STROKE_COLOR,\n                                     fill_opacity=0))\n            else:\n                pass\n        elif shape_of_pin == \"L\":\n            # input low\n            pass\n        elif shape_of_pin == \"CL\":\n            # clock low\n            pass\n        elif shape_of_pin == \"V\":\n            # output low\n            pass\n        elif shape_of_pin == \"F\":\n            # falling edge clock\n            pass\n        elif shape_of_pin == \"X\":\n            # non logic\n            pass\n\n        return d\n\n    def drawPin(\n        self,\n        d,\n        pinName,\n        pinNumber,\n        x1,\n        y1,\n        pin_name_offset,\n        length=0,\n        orientation=\"R\",\n        pen=5,\n        text_size=50,\n        shape_of_pin=\"\",\n    ):\n        # if shape_of_pin starts with 'N' then its invisible\n        if len(shape_of_pin) > 0 and shape_of_pin[0] == 'N':\n            pass\n        # C 55 0 10 1 0 6 N ->invertec pin circle shape example.\n        else:\n            x1 = int(x1)\n            y1 = int(y1)\n            text_size = int(text_size)\n            length = int(length)\n            pin_name_offset = int(pin_name_offset)\n            pen = int(pen)\n\n            v_list = [(x1, y1)]\n            self.update_svg_boundary(v_list)\n\n            if orientation == \"R\":\n\n                x2 = x1 + length\n                y2 = y1\n\n                # draw pin shape\n                # subtracted 12 just to make the pin look better\n                shape_x = x2 - self.RADIUS_OF_NOT_GATE\n                shape_y = y2\n\n                # to position pin number properly\n                x = x1 + (length / 2)\n                y = y1 + self.PIN_NUMBER_OFFSET\n                # x = x1\n                d.append(\n                    draw.Text(\n                        pinNumber, text_size/self.TEXT_SIZE_REDUCE_RATION, x,\n                        y, center=0.6,\n                        fill=self.PIN_NUMBER_COLOR\n                    )\n                )\n                d = self.draw_pin_shape(d, shape_x, shape_y, x2, y2,\n                                        orientation,\n                                        shape_of_pin)\n                if pinName != \"~\":\n                    d = self.draw_text(\n                        d,\n                        pinName,\n                        x1 + length + pin_name_offset,\n                        y1,\n                        text_size,\n                        fill=self.PIN_NAME_COLOR,\n                    )\n\n                    # d.append(draw.Text(pinName,text_size,x1+length+pin_name_offset,y1,center=0.6,fill=self.PIN_NAME_COLOR))\n\n            elif orientation == \"L\":\n                x2 = x1 - length\n                y2 = y1\n\n                # draw pin shape\n                # added 12 just to make the pin look better\n                shape_x = x2 + self.RADIUS_OF_NOT_GATE\n                shape_y = y2\n\n                # to position pin number properly\n                x = x1 - (length / 2)\n                # y = y1 + 30\n                y = y1 + self.PIN_NUMBER_OFFSET\n                # x = x1\n\n                d.append(\n                    draw.Text(\n                        pinNumber, text_size/self.TEXT_SIZE_REDUCE_RATION, x,\n                        y, center=0.6,\n                        fill=self.PIN_NUMBER_COLOR\n                    )\n                )\n                d = self.draw_pin_shape(d, shape_x, shape_y, x2, y2,\n                                        orientation,\n                                        shape_of_pin)\n\n                if pinName != \"~\":\n                    d = self.draw_text(\n                        d,\n                        pinName,\n                        x1 - length - pin_name_offset,\n                        y1,\n                        text_size,\n                        fill=self.PIN_NAME_COLOR,\n                    )\n\n                    # d.append(draw.Text(pinName,text_size,x1-length-pin_name_offset,y1,center=0.6,fill=self.PIN_NAME_COLOR))\n\n            elif orientation == \"U\":\n                x2 = x1\n                y2 = y1 + length\n\n                # draw pin shape\n\n                # draw pin shape\n\n                shape_x = x2\n                shape_y = y2 - self.RADIUS_OF_NOT_GATE\n                d = self.draw_pin_shape(d, shape_x, shape_y, x2, y2,\n                                        orientation,\n                                        shape_of_pin)\n\n                # to position pin number properly\n                # x = x1 - 50\n                x = x1 - self.PIN_NUMBER_OFFSET\n                y = y2 - (length / 3)\n                # y = y1\n                d.append(\n                    draw.Text(\n                        pinNumber, text_size/self.TEXT_SIZE_REDUCE_RATION, x,\n                        y, center=0.6,\n                        fill=self.PIN_NUMBER_COLOR\n                    )\n                )\n                d = self.draw_pin_shape(\n                    d, x2, y2, x2, y2, orientation, shape_of_pin)\n\n                if pinName != \"~\":\n                    d = self.draw_text(\n                        d,\n                        pinName,\n                        x1,\n                        y1 + length + pin_name_offset,\n                        text_size,\n                        fill=self.PIN_NAME_COLOR,\n                    )\n                    # d.append(draw.Text(pinName,text_size,x1,y1+length+pin_name_offset,center=0.6,fill=self.PIN_NAME_COLOR))\n\n            else:\n                x2 = x1\n                y2 = y1 - length\n\n                # draw pin shape\n                # d = self.draw_pin_shape(d, x2, y2, orientation, shape_of_pin)\n\n                # draw pin shape\n                # subtracted 12 just to make the pin look better\n                shape_x = x2\n                shape_y = y2 + self.RADIUS_OF_NOT_GATE\n\n                # y2 = y1\n                # to position pin number properly\n                # x = x1 - 40\n                x = x1 - self.PIN_NUMBER_OFFSET\n                # x = x1 - 20\n                y = y2 + (length / 3)\n                d.append(\n                    draw.Text(\n                        pinNumber, text_size/self.TEXT_SIZE_REDUCE_RATION, x,\n                        y, center=0.6,\n                        fill=self.PIN_NUMBER_COLOR\n                    )\n                )\n                d = self.draw_pin_shape(d, shape_x, shape_y, x2, y2,\n                                        orientation,\n                                        shape_of_pin)\n\n                if pinName != \"~\":\n                    d = self.draw_text(\n                        d,\n                        pinName,\n                        x1,\n                        y1 - length - pin_name_offset,\n                        text_size,\n                        fill=self.PIN_NAME_COLOR,\n                    )\n                    # d.append(draw.Text(pinName,text_size,x1,y1-length-pin_name_offset,center=0.6,fill=self.PIN_NAME_COLOR))\n\n            d.append(draw.Line(x1, y1, x2, y2, stroke=self.STROKE_COLOR,\n                               stroke_width=pen))\n\n        return d\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/lib_utils.py",
    "content": "from libAPI.helper.main import generate_svg_and_save_to_folder\nfrom libAPI.models import Library, LibraryComponent, ComponentAlternate\nimport os\nimport glob\n\n\ndef save_uploaded_files(files, path):\n    for f in files:\n        filepath = os.path.join(path, f._name)\n        with open(filepath, 'wb') as dest:\n            for chunk in f.chunks():\n                dest.write(chunk)\n\n\ndef handle_uploaded_libs(library_set, path, files):\n    if not os.path.isdir(path):\n        os.mkdir(path)\n    save_uploaded_files(files, path)\n    filenames = []\n    for f in files:\n        filenames.append(f._name)\n    save_libs(filenames, path, path, library_set)\n    for f in files:\n        os.remove(path + '/' + f._name)\n\n\ndef save_libs(files, path, out_path, library_set):\n    for f in files:\n        if '.dcm' in f:\n            flag = 0\n            for f1 in files:\n                if f1[:-4] == f[:-4] and '.lib' in f1:\n                    flag = 1\n            if flag == 0:\n                raise FileNotFoundError(\n                    f'.lib file for {f} does not exist')\n        if '.lib' in f:\n            lib_output_location = os.path.join(out_path, 'symbol-svgs')\n            lib_location = os.path.join(path, f)\n            component_details = generate_svg_and_save_to_folder(\n                lib_location,\n                lib_output_location\n            )\n            library = Library.objects.filter(\n                library_name=f, library_set=library_set).first()\n            if not library:\n                library = Library(\n                    library_name=f,\n                    library_set=library_set\n                )\n            library.save()\n\n            library_svg_folder = os.path.join(\n                lib_output_location, f[:-4])\n            thumbnails = glob.glob(library_svg_folder + '/*_thumbnail.svg')\n\n            for component_svg in glob.glob(library_svg_folder + '/*-1-A.svg'):\n                thumbnail_path = component_svg[:-4] + '_thumbnail.svg'\n                if thumbnail_path not in thumbnails:\n                    raise FileNotFoundError(\n                        f'Thumbnail does not exist for {component_svg}')\n\n                # Get Component name\n                component_svg = os.path.split(component_svg)[-1]\n\n                # Get Corresponding Details\n                svg_desc = component_details[component_svg[:-4]]\n\n                # Seed DB\n                component = LibraryComponent.objects.filter(\n                    name=svg_desc['name'],\n                    svg_path=os.path.join(\n                        library_svg_folder, component_svg),\n                    thumbnail_path=thumbnail_path,\n                    symbol_prefix=svg_desc['symbol_prefix'],\n                    full_name=svg_desc['full_name'],\n                    keyword=svg_desc['keyword'],\n                    description=svg_desc['description'],\n                    data_link=svg_desc['data_link'],\n                    component_library=library\n                ).first()\n                if not component:\n                    component = LibraryComponent(\n                        name=svg_desc['name'],\n                        svg_path=os.path.join(\n                            library_svg_folder, component_svg),\n                        thumbnail_path=thumbnail_path,\n                        symbol_prefix=svg_desc['symbol_prefix'],\n                        full_name=svg_desc['full_name'],\n                        keyword=svg_desc['keyword'],\n                        description=svg_desc['description'],\n                        data_link=svg_desc['data_link'],\n                        component_library=library\n                    )\n                component.save()\n\n            # Seed Alternate Components\n            for component_svg in glob.glob(library_svg_folder + '/*[B-Z].svg'):\n                component_svg = os.path.split(component_svg)[-1]\n                svg_desc = component_details[component_svg[:-4]]\n                alternate_component = ComponentAlternate.objects.filter(\n                    part=svg_desc['part'], dmg=svg_desc['dmg'],\n                    full_name=svg_desc['full_name'],\n                    svg_path=os.path.join(\n                        library_svg_folder, component_svg),\n                    parent_component=component\n                ).first()\n                if not alternate_component:\n                    alternate_component = ComponentAlternate(\n                        part=svg_desc['part'], dmg=svg_desc['dmg'],\n                        full_name=svg_desc['full_name'],\n                        svg_path=os.path.join(\n                            library_svg_folder, component_svg),\n                        parent_component=component\n                    )\n                alternate_component.save()\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/management/commands/createsuperuser_noinput.py",
    "content": "from django.contrib.auth import get_user_model\nfrom django.db.models import Q\nfrom django.core.management.base import BaseCommand\nimport logging\nlogger = logging.getLogger(__name__)\n\n\nclass Command(BaseCommand):\n    help = \"Create default admin user if not already present.\"\n\n    def add_arguments(self, parser):\n        parser.add_argument(\n            '--username', type=str,\n            help=\"username of admin account\"\n        )\n        parser.add_argument(\n            '--password', type=str,\n            help=\"password of the admin account\"\n        )\n\n    def handle(self, *args, **options):\n        if options['username'] and options['password']:\n            User = get_user_model()\n            user = User.objects.filter(username=options['username'])\n            if user.count() > 0:\n                raise Exception(f\"User with same username exists\")\n            user = User.objects.create_superuser(\n                username=options['username'],\n                email='', password=options['password']\n            )\n            logger.info(\n                f\"Creating user {options['user']}\"\n                \" with password {options['password']}\")\n            user.save()\n        else:\n            raise Exception(\"Username or Password not present\")\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/management/commands/load_default_libs.py",
    "content": "from django.contrib.auth import get_user_model\nfrom django.core.management.base import BaseCommand\nfrom libAPI.lib_utils import save_libs\nfrom libAPI.models import LibrarySet\nfrom esimCloud import settings\nimport os\nimport logging\nlogger = logging.getLogger(__name__)\n\n\nclass Command(BaseCommand):\n    help = \"Load default libraries if not already present.\"\n\n    def add_arguments(self, parser):\n        parser.add_argument(\n            '--username',\n            help='input a user\\'s username', type=str\n        )\n        parser.add_argument(\n            '--location', type=self.dir_path,\n            help=\"Directory containing kicad library files\"\n        )\n        parser.add_argument(\n            '--default', action='store_true',\n            help=\"set if the library is default or not\"\n        )\n\n    def dir_path(self, path):\n        if os.path.isdir(path):\n            return path\n        else:\n            raise Exception(f\"{path} is not a valid path\")\n\n    def handle(self, *args, **options):\n        User = get_user_model()\n\n        if options['username']:\n            user = User.objects.get(username=options['username'])\n        else:\n            raise Exception(\"Enter a superuser to associate libs\")\n        name = 'esim-default' if options['default'] else 'esim-additional'\n        library_set = LibrarySet.objects.filter(\n            user=user,\n            default=options['default'],\n            name=name\n        ).first()\n        if not library_set:\n            library_set = LibrarySet(\n                user=user,\n                default=True if options['default'] else False,\n                name=name\n            )\n            library_set.save()\n\n        out_location = os.path.join(\n            \"kicad-symbols/\",\n            library_set.user.username + \"-\" + name\n        )\n\n        logger.info(f\"Reading libraries from {options['location']}\")\n        logger.info(f\"Saving as \" + name[5:])\n        logger.info(f\"Saving Libraries to {out_location}\")\n\n        if not os.path.isdir(out_location):\n            os.mkdir(out_location)\n        try:\n            save_libs(\n                os.listdir(options['location']),\n                options['location'],\n                out_location,\n                library_set\n            )\n            logger.info(\"Finished without errors\")\n        except Exception:\n            logger.error(\"Couldn't save all the libs\")\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/models.py",
    "content": "import os\nimport shutil\nfrom djongo import models\nfrom django.utils.safestring import mark_safe\nfrom django.contrib.auth import get_user_model\nfrom django.dispatch import receiver\nfrom django.db.models.signals import post_delete\n\n\nclass LibrarySet(models.Model):\n    user = models.ForeignKey(to=get_user_model(), verbose_name=\"user\",\n                             on_delete=models.CASCADE)\n    default = models.BooleanField(default=False)\n    name = models.CharField(max_length=24, default=\"default\")\n\n    class Meta:\n        unique_together = ('user', 'name')\n\n\n@receiver(post_delete, sender=LibrarySet)\ndef library_set_post_delete_receiver(sender, instance: LibrarySet, **kwargs):\n    try:\n        shutil.rmtree(\n            os.path.join(\n                \"kicad-symbols/\",\n                instance.user.username + '-' + instance.name\n            ))\n    except Exception:\n        pass\n\n\nclass Library(models.Model):\n    library_set = models.ForeignKey(\n        LibrarySet, null=True,\n        verbose_name=\"library_set\",\n        on_delete=models.CASCADE\n    )\n    library_name = models.CharField(max_length=200)\n    saved_on = models.DateTimeField(auto_now=True)\n\n    def __str__(self):\n        return self.library_name\n\n    def delete(self, *args, **kwargs):\n        try:\n            shutil.rmtree(\n                os.path.join(\n                    \"./kicad-symbols/\",\n                    self.library_set.user.username + \"-\"\n                    + self.library_set.name,\n                    \"symbol-svgs\", self.library_name[:-4]\n                ))\n        except Exception:\n            pass\n        super(Library, self).delete(*args, **kwargs)\n\n\n@receiver(post_delete, sender=Library)\ndef library_post_delete_receiver(sender, instance: Library, **kwargs):\n    try:\n        shutil.rmtree(\n            os.path.join(\n                \"kicad-symbols/\",\n                instance.library_set.user.username + \"-\"\n                + instance.library_set.name,\n                \"symbol-svgs\", instance.library_name[:4], \"/\"\n            ))\n    except Exception:\n        pass\n\n\nclass LibraryComponent(models.Model):\n    name = models.CharField(max_length=200)\n    svg_path = models.CharField(max_length=400)\n    thumbnail_path = models.CharField(max_length=400)\n    description = models.CharField(max_length=400)\n    data_link = models.URLField(max_length=200)\n    full_name = models.CharField(max_length=200)\n    keyword = models.CharField(max_length=200)\n    symbol_prefix = models.CharField(max_length=10)\n    component_library = models.ForeignKey(\n        Library, on_delete=models.CASCADE, null=False, related_name='library')\n\n    # For Django Admin Panel\n    def image_tag(self):\n        if self.svg_path:\n            return mark_safe('<img src=\"/%s\" style=\"width: 45px; height:45px;\" />' % self.svg_path)  # noqa\n        else:\n            return 'No Image Found'\n    image_tag.short_description = 'Image'\n\n    def __str__(self):\n        return self.name\n\n    def delete(self, *args, **kwargs):\n        try:\n            os.remove(self.thumbnail_path)\n            os.remove(self.svg_path)\n        except Exception:\n            pass\n        super(LibraryComponent, self).delete(*args, **kwargs)\n\n\n@receiver(post_delete, sender=LibraryComponent)\ndef component_post_delete_receiver(\n        sender, instance: LibraryComponent, **kwargs):\n    try:\n        os.remove(instance.thumbnail_path)\n        os.remove(instance.svg_path)\n    except Exception:\n        pass\n\n\nclass ComponentAlternate(models.Model):\n    part = models.CharField(max_length=1)\n    dmg = models.PositiveSmallIntegerField()\n    full_name = models.CharField(max_length=200)\n    svg_path = models.CharField(max_length=400)\n    parent_component = models.ForeignKey(\n        LibraryComponent,\n        on_delete=models.CASCADE,\n        null=False,\n        related_name='alternate_component')\n\n    # For Django Admin Panel\n    def image_tag(self):\n        if self.svg_path:\n            return mark_safe('<img src=\"/%s\" style=\"width: 45px; height:45px;\" />' % self.svg_path)  # noqa\n        else:\n            return 'No Image Found'\n\n    image_tag.short_description = 'Image'\n\n    def __str__(self):\n        return self.full_name\n\n    def delete(self, *args, **kwargs):\n        try:\n            os.remove(self.svg_path)\n        except Exception:\n            pass\n        super(ComponentAlternate, self).delete(*args, **kwargs)\n\n\n@receiver(post_delete, sender=ComponentAlternate)\ndef alt_component_post_delete_receiver(\n        sender, instance: ComponentAlternate, **kwargs):\n    try:\n        os.remove(instance.svg_path)\n    except Exception:\n        pass\n\n\nclass FavouriteComponent(models.Model):\n    owner = models.OneToOneField(to=get_user_model(),\n                                 on_delete=models.CASCADE, null=False)\n    component = models.ManyToManyField(to=LibraryComponent)\n    last_change = models.DateTimeField(auto_now=True)\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/serializers.py",
    "content": "import logging\nfrom rest_framework import serializers\nfrom libAPI.models import Library, \\\n    LibraryComponent, \\\n    ComponentAlternate, \\\n    LibrarySet, \\\n    FavouriteComponent\n\nlogger = logging.getLogger(__name__)\n\n\nclass LibrarySerializer(serializers.ModelSerializer):\n    default = serializers.SerializerMethodField('is_default')\n    additional = serializers.SerializerMethodField('is_additional')\n\n    def is_default(self, obj):\n        if obj.library_set.default:\n            return True\n        return False\n\n    def is_additional(self, obj):\n        if not obj.library_set.default and obj.library_set.user.is_superuser:\n            return True\n        return False\n\n    class Meta:\n        model = Library\n        fields = ('library_name', 'saved_on', 'id', 'default', 'additional')\n\n\nclass ComponentAlternateSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = ComponentAlternate\n        fields = (\n            'dmg',\n            'part',\n            'full_name',\n            'svg_path',\n            'id'\n        )\n\n\nclass LibraryComponentSerializer(serializers.HyperlinkedModelSerializer):\n    alternate_component = ComponentAlternateSerializer(\n        read_only=True, many=True)\n\n    class Meta:\n        model = LibraryComponent\n        fields = (\n            'id',\n            'name',\n            'svg_path',\n            'thumbnail_path',\n            'symbol_prefix',\n            'component_library',\n            'description',\n            'data_link',\n            'full_name',\n            'keyword',\n            'alternate_component'\n        )\n\n\nclass LibrarySetSerializer(serializers.HyperlinkedModelSerializer):\n\n    class Meta:\n        model = LibrarySet\n        fields = [\n            'id',\n            'default',\n            'name',\n        ]\n\n\nclass FavouriteComponentSerializer(serializers.ModelSerializer):\n    component = LibraryComponentSerializer(many=True)\n\n    class Meta:\n        model = FavouriteComponent\n        fields = (\"component\",)\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/urls.py",
    "content": "from libAPI.views import LibraryViewSet, \\\n    LibraryComponentViewSet, \\\n    LibrarySetViewSet, \\\n    FavouriteComponentView, \\\n    DeleteFavouriteComponent\nfrom rest_framework.routers import DefaultRouter\nfrom django.urls import path\n\nrouter = DefaultRouter()\nrouter.register(r'libraries', LibraryViewSet, basename='library')\nrouter.register(r'library-sets', LibrarySetViewSet, basename='library')\nrouter.register(r'components', LibraryComponentViewSet, basename='components')\nurlpatterns = [\n    path(\"favouritecomponents\", FavouriteComponentView.as_view(),\n         name=\"favouritecomponents\"),\n    path(\"favouritecomponents/<int:id>\", DeleteFavouriteComponent.as_view(),\n         name=\"favouritecomponents\"),\n]\nurlpatterns += router.urls\n"
  },
  {
    "path": "esim-cloud-backend/libAPI/views.py",
    "content": "from libAPI.lib_utils import handle_uploaded_libs\nimport django_filters\nfrom django.db.models import Q\nfrom django.contrib.auth import get_user_model\nfrom libAPI.serializers import LibrarySerializer, \\\n    LibraryComponentSerializer, \\\n    LibrarySetSerializer, \\\n    FavouriteComponentSerializer\nfrom libAPI.models import Library, \\\n    LibraryComponent, \\\n    LibrarySet, \\\n    FavouriteComponent\nfrom rest_framework import viewsets, status\nfrom rest_framework.decorators import action\nfrom rest_framework.response import Response\nfrom rest_framework.permissions import BasePermission,\\\n    IsAuthenticated,\\\n    SAFE_METHODS\nfrom rest_framework.parsers import MultiPartParser\nimport logging\nfrom django_filters import rest_framework as filters\nfrom drf_yasg.utils import swagger_auto_schema\nimport os\nfrom esimCloud import settings\nfrom rest_framework.views import APIView\nlogger = logging.getLogger(__name__)\n\n\nclass IsLibraryOwner(BasePermission):\n\n    def has_object_permission(self, request, view, obj):\n        if request.method in SAFE_METHODS:\n            return True\n        if request.user.is_authenticated:\n            if obj.library_set.user == request.user:\n                return True\n            elif request.user.is_superuser:\n                return True\n        return False\n\n\nclass LibraryFilterSet(django_filters.FilterSet):\n    class Meta:\n        model = Library\n        fields = {\n            'library_name': ['exact'],\n        }\n\n\nclass LibraryViewSet(viewsets.ModelViewSet):\n    \"\"\"\n     Listing All Library Details\n    \"\"\"\n    serializer_class = LibrarySerializer\n    filter_backends = (filters.DjangoFilterBackend,)\n    filterset_class = LibraryFilterSet\n    permission_classes = (IsLibraryOwner,)\n\n    # All Libraries available for user (custom+default)\n    def get_queryset(self):\n        User = get_user_model()\n        superusers = User.objects.filter(is_superuser=True)\n        if self.request.user.is_authenticated:\n            return Library.objects.filter(\n                Q(library_set__user=self.request.user)\n                | Q(library_set__user__in=superusers)\n                | Q(library_set__default=True)\n            ).order_by('-library_set__default')\n        else:\n            return Library.objects.filter(\n                Q(library_set__default=True)\n                | Q(library_set__user__in=superusers)\n            )\n\n    # Custom libraries uploaded by the user\n    @action(\n        detail=False,\n        methods=['GET'],\n        name='All custom libraries for user'\n    )\n    def get_custom_libraries(self, request):\n        if request.user.is_authenticated:\n            lib_sets = LibrarySet.objects.filter(\n                Q(user=request.user) & Q(default=False))\n            queryset = Library.objects.filter(library_set__in=lib_sets)\n            return Response(LibrarySerializer(queryset, many=True).data)\n        return Response()\n\n    # Default Libraries\n    @action(detail=False, methods=['GET'], name=\"All Default Libraries\")\n    def default(self, request):\n        return Response(LibrarySerializer(\n            Library.objects.filter(\n                Q(library_set__default=True)), many=True).data\n        )\n\n\nclass LibraryComponentFilterSet(django_filters.FilterSet):\n    class Meta:\n        model = LibraryComponent\n        fields = {\n            'name': ['icontains'],\n            'keyword': ['icontains'],\n            'description': ['icontains'],\n            'component_library__library_name': ['icontains'],\n            'component_library': ['exact'],\n            'symbol_prefix': ['exact'],\n        }\n\n\nclass IsComponentOwner(BasePermission):\n\n    def has_object_permission(self, request, view, obj):\n        if request.method in SAFE_METHODS:\n            return True\n        elif request.user.is_authenticated:\n            if obj.component_library.library_set.user == request.user:\n                return True\n        return False\n\n\nclass LibraryComponentViewSet(viewsets.ReadOnlyModelViewSet):\n    \"\"\"\n     Listing All Library Details\n    \"\"\"\n    permission_classes = (IsComponentOwner,)\n    queryset = LibraryComponent.objects.all()\n    serializer_class = LibraryComponentSerializer\n    filter_backends = (filters.DjangoFilterBackend,)\n    filterset_class = LibraryComponentFilterSet\n\n    def get_queryset(self):\n        User = get_user_model()\n        superusers = User.objects.filter(is_superuser=True)\n        if self.request.user.is_authenticated:\n            library_set = LibrarySet.objects.filter(\n                Q(user=self.request.user) |\n                Q(default=True) | Q(user__in=superusers)\n            )\n            libraries = Library.objects.filter(library_set__in=library_set)\n            components = LibraryComponent.objects.filter(\n                component_library__in=libraries)\n            return components\n        else:\n            library_set = LibrarySet.objects.filter(\n                Q(default=True) | Q(user__in=superusers))\n            libraries = Library.objects.filter(library_set__in=library_set)\n            components = LibraryComponent.objects.filter(\n                component_library__in=libraries)\n            return components\n\n\nclass LibrarySetViewSet(viewsets.ModelViewSet):\n    \"\"\"\n    Listing Library Sets available to a user\n    \"\"\"\n    serializer_class = LibrarySetSerializer\n    parser_class = (MultiPartParser,)\n    permission_classes = (IsAuthenticated,)\n\n    def get_queryset(self):\n        if self.request.user.is_authenticated:\n            queryset = LibrarySet.objects.filter(\n                Q(user=self.request.user) | Q(default=True))\n        else:\n            queryset = LibrarySet.objects.filter(default=True)\n        return queryset\n\n    def create(self, request, *args, **kwargs):\n        try:\n            library_set = LibrarySet.objects.get(user=request.user)\n        except LibrarySet.DoesNotExist:\n            library_set = LibrarySet(\n                name=request.user.username[0:24],\n                default=False,\n                user=request.user\n            )\n            library_set.save()\n        except LibrarySet.MultipleObjectsReturned:\n            library_set = LibrarySet.objects.filter(user=request.user).first()\n\n        files = request.FILES.getlist('files')\n        if len(files) != 0:\n            path = os.path.join(\n                settings.BASE_DIR[6:],\n                'kicad-symbols',\n                library_set.user.username + '-' + library_set.name)\n            try:\n                # defined in ./lib_utils.py\n                handle_uploaded_libs(library_set, path, files)\n                return Response(status=status.HTTP_201_CREATED)\n            except Exception:\n                return Response(status=status.HTTP_400_BAD_REQUEST)\n        else:\n            return Response(status=status.HTTP_204_NO_CONTENT)\n\n\nclass FavouriteComponentView(APIView):\n    permission_classes = (IsAuthenticated,)\n    serializer_class = FavouriteComponentSerializer\n\n    @swagger_auto_schema(responses={200: FavouriteComponentSerializer})\n    def get(self, request):\n        try:\n            queryset = FavouriteComponent.objects.get(\n                owner=self.request.user)\n            response_serializer = self.serializer_class(\n                queryset, context={'request': request})\n            return Response(response_serializer.data,\n                            status=status.HTTP_200_OK)\n        except FavouriteComponent.DoesNotExist:\n            return Response(data={}, status=status.HTTP_200_OK)\n\n    @swagger_auto_schema(responses={200: FavouriteComponentSerializer},\n                         request_body=FavouriteComponentSerializer)\n    def post(self, request):\n        newComponent = request.data.get(\"component\")\n        try:\n            queryset = LibraryComponent.objects.get(id=newComponent[0])\n        except LibraryComponent.DoesNotExist:\n            return Response(data={\"error\": \"Given Component does not Exist\"},\n                            status=status.HTTP_400_BAD_REQUEST)\n        try:\n            existingFavourites = FavouriteComponent.objects.get(\n                owner=self.request.user)\n            for singleComponent in newComponent:\n                existingFavourites.component.add(singleComponent)\n            existingFavourites.save()\n            serializer = FavouriteComponentSerializer(\n                instance=existingFavourites, context={'request': request})\n            return Response(data=serializer.data, status=status.HTTP_200_OK)\n        except FavouriteComponent.DoesNotExist:\n            newFavList = FavouriteComponent.objects.create(\n                owner=self.request.user)\n            for singleComponent in newComponent:\n                newFavList.component.add(singleComponent)\n            newFavList.save()\n            serialized = FavouriteComponentSerializer(\n                instance=newFavList, context={'request': request})\n            return Response(data=serialized.data, status=status.HTTP_200_OK)\n\n\nclass DeleteFavouriteComponent(APIView):\n    permission_classes = (IsAuthenticated,)\n\n    @swagger_auto_schema(responses={200: FavouriteComponentSerializer})\n    def delete(self, request, id):\n        try:\n            queryset = FavouriteComponent.objects.get(\n                owner=self.request.user, component=id)\n            queryset.component.remove(id)\n            serialized = FavouriteComponentSerializer(\n                instance=queryset, context={'request': request})\n            return Response(data=serialized.data, status=status.HTTP_200_OK)\n        except FavouriteComponent.DoesNotExist:\n            return Response(\n                data={\n                    \"error\":\n                    \"Your favourites doesn't have this component\"\n                },\n                status=status.HTTP_400_BAD_REQUEST)\n"
  },
  {
    "path": "esim-cloud-backend/ltiAPI/__init__.py",
    "content": ""
  },
  {
    "path": "esim-cloud-backend/ltiAPI/admin.py",
    "content": "from django.contrib import admin\nfrom .models import lticonsumer, Submission, ltiSession\n\n\n# Register your models here.\nclass lticonsumeradmin(admin.ModelAdmin):\n    list_display = ['consumer_key', 'secret_key',\n                    'model_schematic', 'score', 'initial_schematic']\n    readonly_fields = ['id', ]\n\n    def id(self, obj):\n        return obj.id\n\n\nclass SubmissionAdmin(admin.ModelAdmin):\n    list_display = ['project', 'student', 'score',\n                    'schematic', 'lms_success']\n\n\nclass ltiSessionAdmin(admin.ModelAdmin):\n    list_display = ['user_id', 'lis_result_sourcedid',\n                    'lis_outcome_service_url', 'oauth_nonce',\n                    'oauth_timestamp', 'oauth_consumer_key', ]\n\n\nadmin.site.register(lticonsumer, lticonsumeradmin)\nadmin.site.register(Submission, SubmissionAdmin)\nadmin.site.register(ltiSession, ltiSessionAdmin)\n"
  },
  {
    "path": "esim-cloud-backend/ltiAPI/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass LtiapiConfig(AppConfig):\n    name = 'ltiAPI'\n"
  },
  {
    "path": "esim-cloud-backend/ltiAPI/models.py",
    "content": "from pyexpat import model\nfrom django.db import models\nfrom saveAPI.models import ArduinoModelSimulationData, StateSave\nfrom django.contrib.postgres.fields import ArrayField\nfrom django.contrib.auth import get_user_model\nfrom simulationAPI.models import simulation\nimport uuid\n\n\n# Create your models here.\nclass lticonsumer(models.Model):\n    id = models.UUIDField(default=uuid.uuid4, editable=False,\n                          unique=True, primary_key=True)\n    consumer_key = models.CharField(max_length=50, null=False)\n    secret_key = models.CharField(max_length=50, null=False)\n    model_schematic = models.ForeignKey(to=StateSave, on_delete=models.CASCADE,\n                                        related_name=\"model_schematic\")\n    score = models.FloatField(null=True, blank=True)\n    initial_schematic = models.ForeignKey(to=StateSave,\n                                          on_delete=models.SET_NULL,\n                                          null=True,\n                                          related_name=\"initial_schematic\")\n    test_case = models.ForeignKey(\n        to=simulation, on_delete=models.CASCADE, null=True, blank=True)\n    sim_params = ArrayField(\n        models.CharField(max_length=20), blank=True, null=True)\n    scored = models.BooleanField(null=False)\n\n    def __str__(self):\n        return self.consumer_key\n\n\nclass ArduinLTIConsumer(models.Model):\n    id = models.UUIDField(default=uuid.uuid4, editable=False,\n                          unique=True, primary_key=True)\n    consumer_key = models.CharField(max_length=50, null=False)\n    secret_key = models.CharField(max_length=50, null=False)\n    model_schematic = models.ForeignKey(to=StateSave, on_delete=models.CASCADE,\n                                        related_name=\"arduino_model_schematic\")\n    score = models.FloatField(null=True, blank=True)\n    con_weightage = models.FloatField(null=False, default=60)\n    initial_schematic = models.ForeignKey(\n        to=StateSave,\n        on_delete=models.SET_NULL,\n        null=True,\n        related_name=\"arduino_initial_schematic\")\n    test_case = models.ForeignKey(\n        to=ArduinoModelSimulationData, on_delete=models.CASCADE, null=True,\n        blank=True)\n    scored = models.BooleanField(null=False)\n    view_code = models.BooleanField(null=False)\n\n    def __str__(self):\n        return self.consumer_key\n\n\nclass ltiSession(models.Model):\n    user_id = models.CharField(max_length=200, null=True)\n    lti_consumer = models.ForeignKey(to=lticonsumer,\n                                     on_delete=models.CASCADE, null=True)\n    lis_result_sourcedid = models.CharField(max_length=300, null=True)\n    lis_outcome_service_url = models.CharField(max_length=300, null=True)\n    oauth_nonce = models.CharField(max_length=300)\n    oauth_timestamp = models.CharField(max_length=300)\n    oauth_consumer_key = models.CharField(max_length=300)\n    oauth_signature_method = models.CharField(max_length=300)\n    oauth_version = models.CharField(max_length=300)\n    oauth_signature = models.CharField(max_length=300)\n    simulations = models.ManyToManyField(to=simulation)\n\n\nclass ArduinoLTISession(models.Model):\n    user_id = models.CharField(max_length=200, null=True)\n    lti_consumer = models.ForeignKey(to=ArduinLTIConsumer,\n                                     on_delete=models.CASCADE, null=True)\n    lis_result_sourcedid = models.CharField(max_length=300, null=True)\n    lis_outcome_service_url = models.CharField(max_length=300, null=True)\n    oauth_nonce = models.CharField(max_length=300)\n    oauth_timestamp = models.CharField(max_length=300)\n    oauth_consumer_key = models.CharField(max_length=300)\n    oauth_signature_method = models.CharField(max_length=300)\n    oauth_version = models.CharField(max_length=300)\n    oauth_signature = models.CharField(max_length=300)\n    simulations = models.ManyToManyField(to=ArduinoModelSimulationData)\n\n\nclass Submission(models.Model):\n    project = models.ForeignKey(to=lticonsumer, on_delete=models.CASCADE)\n    student = models.ForeignKey(\n        to=get_user_model(), blank=True, null=True, on_delete=models.CASCADE)\n    score = models.FloatField()\n    ltisession = models.ForeignKey(\n        to=ltiSession, on_delete=models.CASCADE, null=True)\n    schematic = models.ForeignKey(to=StateSave, on_delete=models.CASCADE)\n    student_simulation = models.ForeignKey(to=simulation,\n                                           on_delete=models.CASCADE, null=True)\n    lms_success = models.BooleanField(null=True)\n\n    def __str__(self):\n        return \"Submitted\" if self.lms_success else \"Not submitted\"\n\n\nclass ArduinoLTISimData(models.Model):\n    session_id = models.ForeignKey(ArduinoLTISession, to_field='id',\n                                   on_delete=models.CASCADE)\n    circuit_id = models.ForeignKey(StateSave,  to_field='id',\n                                   on_delete=models.CASCADE)\n    result = models.TextField()\n\n    def save(self, *args, **kwargs):\n        super(ArduinoLTISimData, self).save(*args, **kwargs)\n\n    def __str__(self):\n        return self.result\n\n\nclass ArduinoSubmission(models.Model):\n    project = models.ForeignKey(to=ArduinLTIConsumer, on_delete=models.CASCADE)\n    student = models.ForeignKey(\n        to=get_user_model(), blank=True, null=True, on_delete=models.CASCADE)\n    score = models.FloatField()\n    ltisession = models.ForeignKey(\n        to=ArduinoLTISession, on_delete=models.CASCADE, null=True)\n    schematic = models.ForeignKey(to=StateSave, on_delete=models.CASCADE)\n    student_simulation = models.ForeignKey(to=ArduinoLTISimData,\n                                           on_delete=models.CASCADE, null=True)\n    lms_success = models.BooleanField(null=True)\n\n    def __str__(self):\n        return \"Submitted\" if self.lms_success else \"Not submitted\"\n"
  },
  {
    "path": "esim-cloud-backend/ltiAPI/process_submission.py",
    "content": "import json\nfrom wsgiref.util import request_uri\n\n\ndef parseJSON(json):\n    list = json['data']\n    results = {}\n    for ele in list:\n        results[ele[0]] = ele[2]\n    return results\n\n\ndef differentiateGraphResults(expected, given, sim_params):\n    expected = expected['data']\n    given = given['data']\n    compare_result_flag = True\n    if expected != given:\n        results = {'same': [], 'different': [], 'missing': [], 'added': []}\n        for index in range(0, len(expected)):\n            expected_labels = expected[index]['labels']\n            for param in sim_params:\n                if param not in expected_labels:\n                    continue\n                given_labels = given[index]['labels']\n                results['added'] = results['added'] + \\\n                    list(set(given_labels) - set(expected_labels))\n                for i in range(0, len(expected_labels)):\n                    if i != 0:\n                        if expected_labels[i] in given_labels:\n                            if set(expected[index]['y'][i-1]) == set(given[index]['y'][i-1]):  # noqa\n                                results['same'].append(expected_labels[i])\n                            else:\n                                results['different'].append(expected_labels[i])\n                        else:\n                            results['missing'].append(expected_labels[i])\n        return results\n    return \"Same Values\"\n\n\ndef differentiateTabularResults(expected, given, sim_params):\n    expected = parseJSON(expected)\n    given = parseJSON(given)\n    if expected != given:\n        results = {'same': [], 'different': [], 'missing': [], 'added': []}\n        for key, value in expected.items():\n            for param in sim_params:\n                if param != key:\n                    continue\n                if key in given.keys():\n                    if value == given[key]:\n                        results['same'].append(key)\n                    else:\n                        results['different'].append(key)\n                else:\n                    results['missing'].append(key)\n        for key, value in given.items():\n            if key not in expected.keys():\n                results['added'].append(key)\n        # marks = str(len(results['same']))+\"/\"+str(len(expected))\n        return results\n    else:\n        return \"Same Values\"\n\n\ndef process_submission(expected_simulation, given_simulation, sim_params):\n    score = 0\n    if expected_simulation['graph'] == \"true\":\n        comparison_result = differentiateGraphResults(\n            expected_simulation, given_simulation, sim_params)\n    else:\n        comparison_result = differentiateTabularResults(\n            expected_simulation, given_simulation, sim_params)\n    if comparison_result == \"Same Values\":\n        score = 1\n    else:\n        total = len(comparison_result['same']) + \\\n            len(comparison_result['different']) + \\\n            len(comparison_result['missing'])\n        score += len(comparison_result['same'])/total\n    return score, comparison_result\n\n\ndef arduino_eval(original_data, student_data, con_weight, max_score):\n    evaluated = True\n    original_data = original_data.replace(\"\\'\", \"\\\"\")\n    student_data = student_data.replace(\"\\'\", \"\\\"\")\n    original_data = json.loads(original_data)\n    student_data = json.loads(student_data)\n    key = list(original_data.keys())[0]\n    org_hexvals = list(original_data[key]['hexVals'])\n    st_hexvals = list(student_data[key]['hexVals'])\n    org_pins = list(original_data[key]['pinConnected'])\n    st_pins = list(student_data[key]['pinConnected'])\n    common_pins = list(set(org_pins).intersection(st_pins))\n    if int(len(org_hexvals)) > int(len(st_hexvals)):\n        evaluated = False\n        return 0, evaluated\n    con_weightage = (((len(common_pins)/len(org_pins)) * con_weight)/100) \\\n        * (max_score)\n    count = 0\n    for i in range(int(len(org_hexvals))):\n        if st_hexvals[i] == org_hexvals[i]:\n            count += 1\n    code_weightage = (((count/len(org_hexvals)) * (100-con_weight))/100) \\\n        * (max_score)\n    return round(con_weightage+code_weightage, 2), evaluated\n"
  },
  {
    "path": "esim-cloud-backend/ltiAPI/serializers.py",
    "content": "from django.utils import tree\nfrom rest_framework import serializers\nfrom .models import ArduinoLTISession, ArduinoLTISimData, \\\n    ArduinoSubmission, lticonsumer, ltiSession, Submission, \\\n    ArduinLTIConsumer\nfrom saveAPI.serializers import SaveListSerializer\nfrom django.contrib.auth import get_user_model\nfrom simulationAPI.serializers import simulationSerializer\nfrom saveAPI.serializers import ArduinoModelSimulationDataSerializer\n\n\nclass consumerSerializer(serializers.ModelSerializer):\n    sim_params = serializers.ListField(\n        child=serializers.CharField(max_length=50)\n    )\n\n    class Meta:\n        model = lticonsumer\n        fields = ['consumer_key', 'secret_key', 'model_schematic',\n                  'score', 'initial_schematic', 'test_case', 'scored',\n                  'id', 'sim_params']\n\n    def create(self, validated_data):\n        consumer = lticonsumer.objects.create(**validated_data)\n        return consumer\n\n\nclass ArduinoConsumerSerializer(serializers.ModelSerializer):\n\n    class Meta:\n        model = ArduinLTIConsumer\n        fields = ['consumer_key', 'secret_key', 'model_schematic',\n                  'score', 'initial_schematic', 'test_case', 'scored',\n                  'id', 'view_code', 'con_weightage']\n\n    def create(self, validated_data):\n        consumer = ArduinLTIConsumer.objects.create(**validated_data)\n        return consumer\n\n\nclass consumerSubmissionSerializer(serializers.ModelSerializer):\n    test_case = simulationSerializer(many=False)\n\n    class Meta:\n        model = lticonsumer\n        fields = ['consumer_key', 'secret_key', 'model_schematic',\n                  'score', 'initial_schematic', 'test_case', 'scored',\n                  'id', 'sim_params']\n\n    def create(self, validated_data):\n        pass\n\n\nclass consumerArduinoSubmissionSerializer(serializers.ModelSerializer):\n    test_case = ArduinoModelSimulationDataSerializer(many=False)\n\n    class Meta:\n        model = ArduinLTIConsumer\n        fields = ['consumer_key', 'secret_key', 'model_schematic',\n                  'score', 'initial_schematic', 'test_case', 'scored',\n                  'id', 'view_code', 'con_weightage']\n\n    def create(self, validated_data):\n        pass\n\n\nclass consumerExistsSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = lticonsumer\n        fields = ['consumer_key', 'model_schematic', 'initial_schematic']\n\n\nclass consumerResponseSerializer(serializers.Serializer):\n    id = serializers.UUIDField()\n    config_url = serializers.CharField(max_length=100)\n    consumer_key = serializers.CharField(max_length=50)\n    secret_key = serializers.CharField(max_length=50)\n    sim_params = serializers.ListField(\n        child=serializers.CharField(max_length=50))\n    score = serializers.FloatField(required=False, allow_null=True)\n    initial_schematic = serializers.IntegerField()\n    model_schematic = serializers.IntegerField()\n    test_case = serializers.IntegerField(required=False, allow_null=True)\n    scored = serializers.BooleanField()\n\n\nclass ArduinoConsumerResponseSerializer(serializers.Serializer):\n    id = serializers.UUIDField()\n    config_url = serializers.CharField(max_length=100)\n    consumer_key = serializers.CharField(max_length=50)\n    secret_key = serializers.CharField(max_length=50)\n    score = serializers.FloatField(required=False, allow_null=True)\n    initial_schematic = serializers.IntegerField()\n    model_schematic = serializers.IntegerField()\n    test_case = serializers.IntegerField(required=False, allow_null=True)\n    scored = serializers.BooleanField()\n    con_weightage = serializers.FloatField(required=True, allow_null=False)\n    view_code = serializers.BooleanField(allow_null=False)\n\n\nclass SessionSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = ltiSession\n        fields = [\"id\", \"user_id\", \"oauth_nonce\"]\n\n\nclass ArduinoSessionSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = ArduinoLTISession\n        fields = [\"id\", \"user_id\", \"oauth_nonce\"]\n\n\nclass GetSessionSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = ltiSession\n        fields = \"__all__\"\n\n\nclass GetArduinoSessionSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = ArduinoLTISession\n        fields = \"__all__\"\n\n\nclass GetSubmissionUserSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = get_user_model()\n        fields = [\"username\", \"email\"]\n\n\nclass SubmissionSerializer(serializers.ModelSerializer):\n    ltisession = SessionSerializer(many=False)\n\n    class Meta:\n        model = Submission\n        fields = [\"ltisession\", \"schematic\"]\n\n\nclass ArduinoSubmissionSerializer(serializers.ModelSerializer):\n    ltisession = ArduinoSessionSerializer(many=False)\n\n    class Meta:\n        model = ArduinoSubmission\n        fields = [\"ltisession\", \"schematic\"]\n\n\nclass GetSubmissionsSerializer(serializers.ModelSerializer):\n    ltisession = GetSessionSerializer(many=False)\n    schematic = SaveListSerializer(many=False)\n    student = GetSubmissionUserSerializer(many=False)\n    student_simulation = simulationSerializer()\n    project = consumerSubmissionSerializer(many=False)\n\n    class Meta:\n        model = Submission\n        fields = [\"schematic\", \"student\", \"project\",\n                  \"score\", \"lms_success\", \"ltisession\",\n                  \"student_simulation\"]\n\n\nclass ArduinoLTISimulationDataSerializer(serializers.ModelSerializer):\n    id = serializers.IntegerField()\n    result = serializers.CharField()\n\n    class Meta:\n        model = ArduinoLTISimData\n        fields = ('id', 'result')\n\n\nclass GetArduinoSubmissionsSerializer(serializers.ModelSerializer):\n    ltisession = GetArduinoSessionSerializer(many=False)\n    schematic = SaveListSerializer(many=False)\n    student = GetSubmissionUserSerializer(many=False)\n    student_simulation = ArduinoLTISimulationDataSerializer()\n    project = consumerArduinoSubmissionSerializer(many=False)\n\n    class Meta:\n        model = ArduinoSubmission\n        fields = [\"schematic\", \"student\", \"project\",\n                  \"score\", \"lms_success\", \"ltisession\",\n                  \"student_simulation\"]\n"
  },
  {
    "path": "esim-cloud-backend/ltiAPI/templates/ltiAPI/config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<cartridge_basiclti_link xmlns=\"http://www.imsglobal.org/xsd/imslticc_v1p0\"\n    xmlns:blti = \"http://www.imsglobal.org/xsd/imsbasiclti_v1p0\"\n    xmlns:lticm =\"http://www.imsglobal.org/xsd/imslticm_v1p0\"\n    xmlns:lticp =\"http://www.imsglobal.org/xsd/imslticp_v1p0\"\n    xmlns:xsi = \"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation = \"http://www.imsglobal.org/xsd/imslticc_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticc_v1p0.xsd\n    http://www.imsglobal.org/xsd/imsbasiclti_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imsbasiclti_v1p0.xsd\n    http://www.imsglobal.org/xsd/imslticm_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticm_v1p0.xsd\n    http://www.imsglobal.org/xsd/imslticp_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticp_v1p0.xsd\">\n    <blti:launch_url>{{launch_url}}</blti:launch_url>\n    <blti:title>{% if debug %}Dev {% endif %}{{title}}</blti:title>\n    <blti:description>{{description}}</blti:description>\n    <blti:extensions platform=\"\">\n      <lticm:property name=\"privacy_level\">public</lticm:property>\n      <lticm:property name=\"domain\">{{domain}}</lticm:property>\n      <lticm:property name=\"text\">{% if debug %}Dev{% endif %} {{title}}</lticm:property>\n\n      \n      {% if course_navigation %}\n          {% if course_navigation == True %}\n              <lticm:options name=\"course_navigation\">\n                <lticm:property name=\"default\">disabled</lticm:property>\n                <lticm:property name=\"enabled\">true</lticm:property>\n              </lticm:options>\n          {% elif course_navigation.items %}\n              <lticm:options name=\"course_navigation\">\n              {% for key, value in course_navigation.items %}\n                <lticm:property name=\"{{key}}\">{{value}}</lticm:property>\n              {% endfor %}\n              </lticm:options>\n          {% endif %}\n      {% endif %}\n    </blti:extensions>\n</cartridge_basiclti_link>"
  },
  {
    "path": "esim-cloud-backend/ltiAPI/templates/ltiAPI/denied.html",
    "content": "{% load i18n %}\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>{% trans \"Permission Denied\" %}</title>\n</head>\n<body>\n<h2>{% trans \"Sorry, you are not allowed to access this app\" %}</h2>\n<hr>\n<p>{% trans \"To report a problem with your access please contact your system administrator\" %}</p>\n</body>\n</html>"
  },
  {
    "path": "esim-cloud-backend/ltiAPI/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "esim-cloud-backend/ltiAPI/urls.py",
    "content": "from django.conf.urls import url\nfrom django.urls import path\n\nfrom . import views\napp_name = 'ltiAPI'\n\nurlpatterns = [\n    url(r'^build/$', views.LTIBuildApp.as_view(), name=\"create-lti\"),\n    path('build/arduino', views.ArduinoLTIBuildApp.as_view(),\n         name=\"create-arduino-lti\"),\n    url(r'^update/$', views.LTIUpdateAPP.as_view(), name=\"create-lti\"),\n    path('update_arduino/', views.ArduinoLTIUpdateAPP.as_view(),\n         name=\"create-lti\"),\n    path('<uuid:save_id>/config.xml/', views.LTIConfigView.as_view(),\n         name=\"config\"),\n    path('auth/<uuid:save_id>/', views.LTIAuthView.as_view(), name=\"auth\"),\n    path('arduino/auth/<uuid:save_id>/',\n         views.ArduinoLTIAuthView.as_view(), name=\"arduino-auth\"),\n    path('submit/', views.LTIPostGrade.as_view(), name=\"submit\"),\n    path('arduino/submit/', views.ArduinoLTIPostGrade.as_view(),\n         name=\"submit\"),\n    url(r'^denied/$', views.denied, name=\"denied\"),\n    path('exist/<uuid:save_id>/', views.LTIExist.as_view()),\n    path('exist/arduino/<uuid:save_id>/', views.ArduinoLTIExist.as_view()),\n    path('delete/<int:id>/', views.LTIDeleteApp.as_view()),\n    path('arduino/delete/<int:id>/', views.ArduinoLTIDeleteApp.as_view()),\n    path('submissions/<str:save_id>/<str:version>/<str:branch>',\n         views.GetLTISubmission.as_view()),\n    path('arduino/submissions/<str:save_id>/<str:version>/<str:branch>',\n         views.GetArduinoLTISubmission.as_view()),\n    path('arduino/viewcode/<int:ltiID>', views.ArduinoLTIViewCode.as_view()),\n    path('exists/', views.LTIAllConsumers.as_view()),\n    path('save/arduinodata/<int:save_id>/<int:lti_id>',\n         views.ArduinoLTISimulationDataView.as_view())\n]\n"
  },
  {
    "path": "esim-cloud-backend/ltiAPI/utils.py",
    "content": "from xml.etree import ElementTree\nfrom xml.etree.ElementTree import SubElement, Element\nfrom .models import ArduinLTIConsumer, lticonsumer\nfrom django.urls import reverse\nfrom datetime import time\n\n\ndef consumers():\n    \"\"\"\n    Gets consumer's map from config\n    :return: consumers map\n    \"\"\"\n    consumers = dict()\n    consumers_queryset = lticonsumer.objects.all()\n    for i in consumers_queryset:\n        consumers[i.consumer_key] = {}\n        consumers[i.consumer_key]['secret'] = i.secret_key\n    return consumers\n\n\ndef ArduinoConsumers():\n    \"\"\"\n    Gets Arduino consumer's map from config\n    :return: consumers map\n    \"\"\"\n    consumers = dict()\n    consumers_queryset = ArduinLTIConsumer.objects.all()\n    for i in consumers_queryset:\n        consumers[i.consumer_key] = {}\n        consumers[i.consumer_key]['secret'] = i.secret_key\n    return consumers\n\n\ndef message_identifier():\n    return '{:.0f}'.format(time())\n\n\ndef lis_result_sourcedid(request):\n    return request.data.get('lis_result_sourcedid', None)\n\n\ndef lis_outcome_service_url(request):\n    return request.data.get('lis_outcome_service_url', None)\n\n\ndef oauth_consumer_key(request):\n    return request.data.get('oauth_consumer_key', None)\n\n\ndef get_reverse(objs):\n    return reverse(objs)\n\n\n# def generate_request_xml(message_identifier_id, operation,\n#                          lis_result_sourcedid, score, launch_url):\n#     # pylint: disable=too-many-locals\n#     \"\"\"\n#     Generates LTI 1.1 XML for posting result to LTI consumer.\n#     :param message_identifier_id:\n#     :param operation:\n#     :param lis_result_sourcedid:\n#     :param score:\n#     :return: XML string\n#     \"\"\"\n#     root = Element(u'imsx_POXEnvelopeRequest',\n#                    xmlns=u'http://www.imsglobal.org/services/'\n#                          u'ltiv1p1/xsd/imsoms_v1p0')\n#\n#     header = SubElement(root, 'imsx_POXHeader')\n#     header_info = SubElement(header, 'imsx_POXRequestHeaderInfo')\n#     version = SubElement(header_info, 'imsx_version')\n#     version.text = 'V1.0'\n#     message_identifier = SubElement(header_info,\n#                                     'imsx_messageIdentifier')\n#     message_identifier.text = message_identifier_id\n#     body = SubElement(root, 'imsx_POXBody')\n#     xml_request = SubElement(\n#         body, '%s%s' % (operation, 'Request'))\n#     record = SubElement(xml_request, 'resultRecord')\n#\n#     guid = SubElement(record, 'sourcedGUID')\n#\n#     sourcedid = SubElement(guid, 'sourcedId')\n#     sourcedid.text = lis_result_sourcedid\n#     if score is not None:\n#         result = SubElement(record, 'result')\n#         result_score = SubElement(result, 'resultScore')\n#         language = SubElement(result_score, 'language')\n#         language.text = 'en'\n#         text_string = SubElement(result_score, 'textString')\n#         text_string.text = score.__str__()\n#         if launch_url:\n#             result_data = SubElement(result, 'resultData')\n#             lti_launch_url = SubElement(\n#                 result_data, 'ltiLaunchUrl')\n#             lti_launch_url.text = launch_url\n#     ret = \"<?xml version='1.0' encoding='utf-8'?>\\n{}\".format(\n#         ElementTree.tostring(root, encoding='utf-8').decode('utf-8'))\n#\n#     return ret\n"
  },
  {
    "path": "esim-cloud-backend/ltiAPI/views.py",
    "content": "from email import message\nfrom sre_constants import SUCCESS\nimport traceback\nimport datetime\n\nfrom requests import session\nfrom .serializers import consumerSerializer, consumerResponseSerializer, \\\n    SubmissionSerializer, GetSubmissionsSerializer, consumerExistsSerializer, \\\n    ArduinoConsumerSerializer, ArduinoConsumerResponseSerializer, \\\n    GetArduinoSubmissionsSerializer, ArduinoLTISimulationDataSerializer\nfrom .utils import consumers, get_reverse, message_identifier, ArduinoConsumers\nfrom .models import ltiSession, lticonsumer, Submission, ArduinLTIConsumer, \\\n    ArduinoLTISession, ArduinoSubmission, ArduinoLTISimData\nfrom saveAPI.models import StateSave, ArduinoModelSimulationData\nfrom simulationAPI.models import simulation\nfrom drf_yasg.utils import swagger_auto_schema\nfrom django.conf import settings\nfrom saveAPI.serializers import StateSaveSerializer\nfrom django.views import View\nfrom rest_framework import status\nfrom rest_framework.permissions import AllowAny, IsAuthenticated\nfrom rest_framework.response import Response\nfrom rest_framework.views import APIView\nfrom django.db.models import Q\nfrom django.http import HttpResponseRedirect\nfrom django.shortcuts import render\nfrom pylti.common import LTIException, verify_request_common, post_message, \\\n    generate_request_xml, LTIPostMessageException\nfrom .process_submission import arduino_eval, process_submission\n\n\ndef denied(r):\n    return render(r, 'ltiAPI/denied.html')\n\n\nclass LTIExist(APIView):\n\n    def get(self, request, save_id):\n        try:\n            consumer = lticonsumer.objects.get(\n                Q(model_schematic__save_id=save_id) |\n                Q(initial_schematic__save_id=save_id))\n        except lticonsumer.DoesNotExist:\n            return Response(data={\"error\": \"LTIConsumer Not found\"},\n                            status=status.HTTP_404_NOT_FOUND)\n        host = request.get_host()\n        save_id = str(save_id)\n        init_sch_serialized = StateSaveSerializer(\n            instance=consumer.initial_schematic)\n        model_sch_serialized = StateSaveSerializer(\n            instance=consumer.model_schematic)\n        protocol = 'https://' if request.is_secure() else 'http://'\n        config_url = protocol + host + \"/api/lti/auth/\" + save_id + \"/\"\n        response_data = {\n            \"consumer_key\": consumer.consumer_key,\n            \"secret_key\": consumer.secret_key,\n            \"config_url\": config_url,\n            \"score\": consumer.score,\n            \"initial_schematic\": init_sch_serialized.data,\n            \"model_schematic\": model_sch_serialized.data,\n            \"test_case\": consumer.test_case.id if consumer.test_case else None,\n            \"scored\": consumer.scored,\n            \"id\": consumer.id,\n            \"sim_params\": consumer.sim_params\n        }\n        return Response(response_data,\n                        status=status.HTTP_200_OK)\n\n\nclass ArduinoLTIExist(APIView):\n\n    def get(self, request, save_id):\n        try:\n            consumer = ArduinLTIConsumer.objects.get(\n                Q(model_schematic__save_id=save_id) |\n                Q(initial_schematic__save_id=save_id))\n        except ArduinLTIConsumer.DoesNotExist:\n            return Response(data={\"error\": \"LTIConsumer Not found\"},\n                            status=status.HTTP_404_NOT_FOUND)\n        host = request.get_host()\n        save_id = str(save_id)\n        init_sch_serialized = StateSaveSerializer(\n            instance=consumer.initial_schematic)\n        model_sch_serialized = StateSaveSerializer(\n            instance=consumer.model_schematic)\n        protocol = 'https://' if request.is_secure() else 'http://'\n        config_url = protocol + host + \"/api/lti/arduino/auth/\" + save_id + \"/\"\n        response_data = {\n            \"consumer_key\": consumer.consumer_key,\n            \"secret_key\": consumer.secret_key,\n            \"config_url\": config_url,\n            \"score\": consumer.score,\n            \"initial_schematic\": init_sch_serialized.data,\n            \"model_schematic\": model_sch_serialized.data,\n            \"test_case\": consumer.test_case.id if consumer.test_case else None,\n            \"scored\": consumer.scored,\n            \"id\": consumer.id,\n            \"view_code\": consumer.view_code,\n            \"con_weightage\": consumer.con_weightage\n            # \"sim_params\": consumer.sim_params\n        }\n        return Response(response_data,\n                        status=status.HTTP_200_OK)\n\n\nclass ArduinoLTIViewCode(APIView):\n    def get(self, request, ltiID):\n        try:\n            ltisess = ArduinoLTISession.objects.get(id=ltiID)\n        except ArduinoLTISession.DoesNotExist:\n            return Response(data={\"error\": \"LTISession Not found\"},\n                            status=status.HTTP_404_NOT_FOUND)\n        consumer = ArduinLTIConsumer.objects.get(id=ltisess.lti_consumer_id)\n        return Response(data={\"view\": consumer.view_code},\n                        status=status.HTTP_200_OK)\n\n\nclass LTIAllConsumers(APIView):\n    permission_classes = (IsAuthenticated,)\n\n    def get(self, request):\n        saves = StateSave.objects.filter(owner=self.request.user)\n        consumers = []\n        for save in saves:\n            if save.model_schematic.all().first():\n                consumers.append(consumerExistsSerializer(\n                    save.model_schematic.all().first()).data)\n        return Response(consumers,\n                        status=status.HTTP_200_OK)\n\n\nclass LTIBuildApp(APIView):\n\n    @swagger_auto_schema(request_body=consumerSerializer,\n                         responses={201: consumerResponseSerializer})\n    def post(self, request):\n        serialized = consumerSerializer(data=request.data)\n        temp = lticonsumer.objects.filter(\n            initial_schematic=request.data['model_schematic']\n        ).count()\n        if temp > 0:\n            return Response(data={\"error\": \"Model schematic cannot be initial \\\n                                  schematic for other LTI apps\"},\n                            status=status.HTTP_400_BAD_REQUEST)\n        if serialized.is_valid():\n            serialized.save()\n            id = serialized.data.get(\"initial_schematic\")\n            if id is not None:\n                saved_state = StateSave.objects.get(id=id)\n                saved_state.shared = True\n                saved_state.save()\n                host = request.get_host()\n                protocol = 'https://' if request.is_secure() else 'http://'\n                url = protocol + host + \"/api/lti/auth/\" + \\\n                    str(saved_state.save_id) + \"/\"\n                response_data = {\n                    \"consumer_key\": serialized.data.get('consumer_key'),\n                    \"secret_key\": serialized.data.get('secret_key'),\n                    \"config_url\": url,\n                    \"score\": serialized.data.get('score'),\n                    \"initial_schematic\": str(serialized.data[\n                        \"initial_schematic\"]),\n                    \"model_schematic\": str(serialized.data[\"model_schematic\"]),\n                    \"test_case\": serialized.data['test_case'],\n                    \"scored\": serialized.data['scored'],\n                    \"id\": serialized.data['id'],\n                    \"sim_params\": serialized.data['sim_params']\n                }\n                print(\"Recieved POST for LTI APP:\", response_data)\n                response_serializer = consumerResponseSerializer(\n                    data=response_data\n                )\n                if response_serializer.is_valid():\n                    return Response(response_serializer.data,\n                                    status=status.HTTP_201_CREATED)\n                else:\n                    return Response(response_serializer.errors,\n                                    status=status.HTTP_400_BAD_REQUEST)\n            else:\n                return Response({\"error\": \"Initial Schematic not provided\"},\n                                status=status.HTTP_400_BAD_REQUEST)\n        else:\n            return Response(serialized.errors,\n                            status=status.HTTP_400_BAD_REQUEST)\n\n\nclass ArduinoLTIBuildApp(APIView):\n\n    @swagger_auto_schema(request_body=ArduinoConsumerSerializer,\n                         responses={201: ArduinoConsumerResponseSerializer})\n    def post(self, request):\n        # print(request.headers)\n        serialized = ArduinoConsumerSerializer(data=request.data)\n        temp = ArduinLTIConsumer.objects.filter(\n            initial_schematic=request.data['model_schematic']\n        ).count()\n        if temp > 0:\n            return Response(data={\"error\": \"Model schematic cannot be initial \\\n                                  schematic for other LTI apps\"},\n                            status=status.HTTP_400_BAD_REQUEST)\n        if serialized.is_valid():\n            serialized.save()\n            id = serialized.data.get(\"initial_schematic\")\n            if id is not None:\n                saved_state = StateSave.objects.get(id=id)\n                saved_state.shared = True\n                saved_state.save()\n                host = request.get_host()\n                protocol = 'https://' if request.is_secure() else 'http://'\n                url = protocol + host + \"/api/lti/arduino/auth/\" + \\\n                    str(saved_state.save_id) + \"/\"\n                response_data = {\n                    \"consumer_key\": serialized.data.get('consumer_key'),\n                    \"secret_key\": serialized.data.get('secret_key'),\n                    \"config_url\": url,\n                    \"score\": serialized.data.get('score'),\n                    \"initial_schematic\": str(serialized.data[\n                        \"initial_schematic\"]),\n                    \"model_schematic\": str(serialized.data[\"model_schematic\"]),\n                    \"test_case\": serialized.data['test_case'],\n                    \"scored\": serialized.data['scored'],\n                    \"id\": serialized.data['id'],\n                    \"view_code\": serialized.data['view_code'],\n                    \"con_weightage\": serialized.data['con_weightage']\n                }\n                print(\"Recieved POST for LTI APP:\", response_data)\n                response_serializer = ArduinoConsumerResponseSerializer(\n                    data=response_data\n                )\n                if response_serializer.is_valid():\n                    return Response(response_serializer.data,\n                                    status=status.HTTP_201_CREATED)\n                else:\n                    return Response(response_serializer.errors,\n                                    status=status.HTTP_400_BAD_REQUEST)\n            else:\n                return Response({\"error\": \"Initial Schematic not provided\"},\n                                status=status.HTTP_400_BAD_REQUEST)\n        else:\n            return Response(serialized.errors,\n                            status=status.HTTP_400_BAD_REQUEST)\n\n\nclass LTIUpdateAPP(APIView):\n\n    @swagger_auto_schema(request_body=consumerSerializer)\n    def post(self, request):\n        serialized = consumerSerializer(data=request.data)\n        try:\n            consumer = lticonsumer.objects.get(id=request.data['id'])\n        except lticonsumer.DoesNotExist:\n            return Response(status=status.HTTP_400_BAD_REQUEST)\n        if serialized.is_valid():\n            try:\n                sim = simulation.objects.get(\n                    id=serialized.data.get('test_case'))\n            except simulation.DoesNotExist:\n                sim = None\n            host = request.get_host()\n            protocol = 'https://' if request.is_secure() else 'http://'\n            url = protocol + host + \"/api/lti/auth/\" + \\\n                str(consumer.model_schematic.save_id) + \"/\"\n            consumer.consumer_key = serialized.data.get('consumer_key')\n            consumer.secret_key = serialized.data.get('secret_key')\n            consumer.score = serialized.data.get('score')\n            consumer.model_schematic = StateSave.objects.get(\n                id=serialized.data.get('model_schematic'))\n            consumer.initial_schematic = StateSave.objects.get(\n                id=serialized.data.get('initial_schematic'))\n            consumer.test_case = sim\n            consumer.scored = serialized.data.get('scored')\n            consumer.sim_params = serialized.data.get('sim_params')\n            consumer.save()\n            response_data = {\n                \"consumer_key\": serialized.data.get('consumer_key'),\n                \"secret_key\": serialized.data.get('secret_key'),\n                \"config_url\": url,\n                \"score\": serialized.data.get('score'),\n                \"initial_schematic\": str(serialized.data[\n                    \"initial_schematic\"]),\n                \"model_schematic\": str(serialized.data[\"model_schematic\"]),\n                \"test_case\": serialized.data['test_case'],\n                \"scored\": serialized.data['scored'],\n                \"id\": consumer.id,\n                \"sim_params\": serialized.data['sim_params']\n            }\n            return Response(response_data, status=status.HTTP_200_OK)\n        else:\n            return Response(serialized.errors,\n                            status=status.HTTP_400_BAD_REQUEST)\n\n\nclass ArduinoLTIUpdateAPP(APIView):\n\n    @swagger_auto_schema(request_body=ArduinoConsumerSerializer)\n    def post(self, request):\n        serialized = ArduinoConsumerSerializer(data=request.data)\n        try:\n            consumer = ArduinLTIConsumer.objects.get(id=request.data['id'])\n        except ArduinLTIConsumer.DoesNotExist:\n            return Response(status=status.HTTP_400_BAD_REQUEST)\n        if serialized.is_valid():\n            try:\n                sim = ArduinoModelSimulationData.objects.get(\n                    id=serialized.data.get('test_case'))\n            except ArduinoModelSimulationData.DoesNotExist:\n                sim = None\n            host = request.get_host()\n            protocol = 'https://' if request.is_secure() else 'http://'\n            url = protocol + host + \"/api/lti/arduino/auth/\" + \\\n                str(consumer.model_schematic.save_id) + \"/\"\n            consumer.consumer_key = serialized.data.get('consumer_key')\n            consumer.secret_key = serialized.data.get('secret_key')\n            consumer.score = serialized.data.get('score')\n            consumer.model_schematic = StateSave.objects.get(\n                id=serialized.data.get('model_schematic'))\n            consumer.initial_schematic = StateSave.objects.get(\n                id=serialized.data.get('initial_schematic'))\n            consumer.test_case = sim\n            consumer.scored = serialized.data.get('scored')\n            consumer.sim_params = serialized.data.get('sim_params')\n            consumer.view_code = serialized.data.get('view_code')\n            consumer.save()\n            response_data = {\n                \"consumer_key\": serialized.data.get('consumer_key'),\n                \"secret_key\": serialized.data.get('secret_key'),\n                \"config_url\": url,\n                \"score\": serialized.data.get('score'),\n                \"initial_schematic\": str(serialized.data[\n                    \"initial_schematic\"]),\n                \"model_schematic\": str(serialized.data[\"model_schematic\"]),\n                \"test_case\": serialized.data['test_case'],\n                \"scored\": serialized.data['scored'],\n                \"id\": consumer.id,\n                \"view_code\": serialized.data['view_code'],\n                \"con_weightage\": serialized.data['con_weightage']\n            }\n            return Response(response_data, status=status.HTTP_200_OK)\n        else:\n            return Response(serialized.errors,\n                            status=status.HTTP_400_BAD_REQUEST)\n\n\nclass LTIDeleteApp(APIView):\n\n    def delete(self, request, id):\n        queryset = lticonsumer.objects.all()\n        try:\n            consumer = queryset.get(model_schematic=id)\n            consumer.delete()\n            return Response(data={\"Message\": \"Successfully deleted!\"},\n                            status=status.HTTP_204_NO_CONTENT)\n        except lticonsumer.DoesNotExist:\n            return Response(status=status.HTTP_404_NOT_FOUND)\n\n\nclass ArduinoLTIDeleteApp(APIView):\n\n    def delete(self, request, id):\n        queryset = ArduinLTIConsumer.objects.all()\n        try:\n            consumer = queryset.get(model_schematic=id)\n            consumer.delete()\n            return Response(data={\"Message\": \"Successfully deleted!\"},\n                            status=status.HTTP_204_NO_CONTENT)\n        except ArduinLTIConsumer.DoesNotExist:\n            return Response(status=status.HTTP_404_NOT_FOUND)\n\n\nclass LTIConfigView(View):\n    def get(self, request, save_id):\n        try:\n            saved_state = StateSave.objects.get(save_id=save_id)\n        except StateSave.DoesNotExist:\n            return render(request, 'ltiAPI/denied.html')\n        if saved_state.shared:\n            pass\n        else:\n            saved_state.shared = True\n            saved_state.save()\n        domain = self.request.get_host()\n        launch_url = '%s://%s/%s' % (\n            self.request.scheme, domain,\n            settings.LTI_TOOL_CONFIGURATION.get('launch_url'))\n        ctx = {\n            'domain': domain,\n            'launch_url': launch_url,\n            'title': saved_state.name + ' and ' + str(saved_state.save_id),\n            'description': str(saved_state.description),\n            'course_navigation': settings.LTI_TOOL_CONFIGURATION.get(\n                'course_navigation'\n            ),\n        }\n        return render(request, 'ltiAPI/config.xml', context=ctx,\n                      content_type='text/xml; charset=utf-8')\n\n\nclass LTIAuthView(APIView):\n    \"\"\"POST handler for the LTI login POST back call\"\"\"\n\n    def post(self, request, save_id):\n        params = {key: request.data[key] for key in request.data}\n        consumers_dict = consumers()\n        url = request.build_absolute_uri()\n        headers = request.META\n        # Define the redirect url\n        host = request.get_host()\n        _ = headers.pop('HTTP_COOKIE', None)\n        if 'HTTP_SEC_FETCH_DEST' not in headers:\n            headers['HTTP_SEC_FETCH_DEST'] = 'iframe'\n        if 'HTTP_SEC_FETCH_MODE' not in headers:\n            headers['HTTP_SEC_FETCH_MODE'] = 'navigate'\n        if 'HTTP_SEC_FETCH_SITE' not in headers:\n            headers['HTTP_SEC_FETCH_SITE'] = 'cross-site'\n        print(\"params:\", params)\n        print(\"headers:\", headers)\n        print(\"host:\", host)\n        print(\"url:\", url)\n        ltikeys = ['user_id', 'lis_result_sourcedid',\n                   'lis_outcome_service_url', 'oauth_nonce',\n                   'oauth_timestamp', 'oauth_consumer_key',\n                   'oauth_signature_method',\n                   'oauth_version', 'oauth_signature']\n        ltidata = {key: params.get(key) for key in ltikeys}\n        current_time = datetime.datetime.now().timestamp()\n        time_diff = abs(current_time - float(ltidata['oauth_timestamp']))\n        if time_diff > 19800 and time_diff < 20000:\n            ltidata['oauth_timestamp'] = current_time\n            params['oauth_timestamp'] = current_time\n        lti_session = ltiSession.objects.create(**ltidata)\n        print(\"Got POST for validating LTI consumer\")\n        try:\n            i = lticonsumer.objects.get(consumer_key=request.data.get(\n                'oauth_consumer_key'), initial_schematic__save_id=save_id\n            )\n            lti_session.lti_consumer = i\n            lti_session.save()\n        except lticonsumer.DoesNotExist:\n            print(\"Consumer does not exist on backend\")\n            return HttpResponseRedirect(get_reverse('ltiAPI:denied'))\n\n        protocol = 'https://' if request.is_secure() else 'http://'\n        if(not i.model_schematic.is_arduino):\n            next_url = protocol + host + \"/eda/#editor?id=\" + \\\n                    str(i.initial_schematic.save_id) + \"&branch=\" \\\n                    + str(i.initial_schematic.branch) + \"&version=\" \\\n                    + str(i.initial_schematic.version) \\\n                    + \"&lti_id=\" + str(lti_session.id) + \"&lti_user_id=\" + \\\n                    lti_session.user_id \\\n                    + \"&lti_nonce=\" + lti_session.oauth_nonce\n        try:\n            print(\"Got verification request\")\n            verify_request_common(consumers_dict, url,\n                                  request.method, headers, params)\n            print(\"Verified consumer\")\n            # grade = LTIPostGrade(params, request)\n            return HttpResponseRedirect(next_url)\n        except LTIException:\n            traceback.print_exc()\n            return HttpResponseRedirect(get_reverse('ltiAPI:denied'))\n\n\nclass ArduinoLTIAuthView(APIView):\n    \"\"\"POST handler for the LTI login POST back call\"\"\"\n\n    def post(self, request, save_id):\n        params = {key: request.data[key] for key in request.data}\n        consumers_dict = ArduinoConsumers()\n        url = request.build_absolute_uri()\n        headers = request.META\n        # Define the redirect url\n        host = request.get_host()\n        _ = headers.pop('HTTP_COOKIE', None)\n        if 'HTTP_SEC_FETCH_DEST' not in headers:\n            headers['HTTP_SEC_FETCH_DEST'] = 'iframe'\n        if 'HTTP_SEC_FETCH_MODE' not in headers:\n            headers['HTTP_SEC_FETCH_MODE'] = 'navigate'\n        if 'HTTP_SEC_FETCH_SITE' not in headers:\n            headers['HTTP_SEC_FETCH_SITE'] = 'cross-site'\n        print(\"params:\", params)\n        print(\"headers:\", headers)\n        print(\"host:\", host)\n        print(\"url:\", url)\n        ltikeys = ['user_id', 'lis_result_sourcedid',\n                   'lis_outcome_service_url', 'oauth_nonce',\n                   'oauth_timestamp', 'oauth_consumer_key',\n                   'oauth_signature_method',\n                   'oauth_version', 'oauth_signature']\n        ltidata = {key: params.get(key) for key in ltikeys}\n        current_time = datetime.datetime.now().timestamp()\n        time_diff = abs(current_time - float(ltidata['oauth_timestamp']))\n        if time_diff > 19800 and time_diff < 20000:\n            ltidata['oauth_timestamp'] = current_time\n            params['oauth_timestamp'] = current_time\n        lti_session = ArduinoLTISession.objects.create(**ltidata)\n        print(\"Got POST for validating LTI consumer\")\n        try:\n            i = ArduinLTIConsumer.objects.get(consumer_key=request.data.get(\n                'oauth_consumer_key'), initial_schematic__save_id=save_id\n            )\n            lti_session.lti_consumer = i\n            lti_session.save()\n        except ArduinLTIConsumer.DoesNotExist:\n            print(\"Consumer does not exist on backend\")\n            return HttpResponseRedirect(get_reverse('ltiAPI:denied'))\n\n        protocol = 'https://' if request.is_secure() else 'http://'\n        if(i.model_schematic.is_arduino):\n            if(settings.DEBUG):\n                next_url = protocol + host + \"/arduino/#/simulator?id=\" + \\\n                        str(i.initial_schematic.save_id) + \"&branch=\" \\\n                        + str(i.initial_schematic.branch) + \"&version=\" \\\n                        + str(i.initial_schematic.version) \\\n                        + \"&lti_id=\" + str(lti_session.id) + \"&lti_user_id=\" \\\n                        + lti_session.user_id \\\n                        + \"&lti_nonce=\" + lti_session.oauth_nonce\n            else:\n                next_url = protocol + host + \"/arduino/#simulator?id=\" + \\\n                        str(i.initial_schematic.save_id) + \"&branch=\" \\\n                        + str(i.initial_schematic.branch) + \"&version=\" \\\n                        + str(i.initial_schematic.version) \\\n                        + \"&lti_id=\" + str(lti_session.id) + \"&lti_user_id=\" \\\n                        + lti_session.user_id \\\n                        + \"&lti_nonce=\" + lti_session.oauth_nonc\n        try:\n            print(\"Got verification request\")\n            verify_request_common(consumers_dict, url,\n                                  request.method, headers, params)\n            print(\"Verified consumer\")\n            # grade = LTIPostGrade(params, request)\n            return HttpResponseRedirect(next_url)\n        except LTIException:\n            traceback.print_exc()\n            return HttpResponseRedirect(get_reverse('ltiAPI:denied'))\n\n\nclass LTIPostGrade(APIView):\n    permission_classes = [AllowAny, ]\n\n    @swagger_auto_schema(request_body=SubmissionSerializer)\n    def post(self, request):\n        \"\"\"\n        Post grade to LTI consumer using XML\n        :param: score: 0 <= score <= 1. (Score MUST be between 0 and 1)\n        :return: True if post successful and score valid\n        :exception: LTIPostMessageException if call failed\n        \"\"\"\n        try:\n            lti_session = ltiSession.objects.get(\n                id=request.data[\"ltisession\"][\"id\"])\n        except ltiSession.DoesNotExist:\n            return Response(data={\n                \"error\": \"No LTI session exists for this ID\"\n            }, status=status.HTTP_400_BAD_REQUEST)\n        consumer = lticonsumer.objects.get(id=lti_session.lti_consumer.id)\n        try:\n            sim = simulation.objects.get(id=request.data['student_simulation'])\n        except simulation.DoesNotExist:\n            sim = None\n        schematic = StateSave.objects.get(save_id=request.data[\"schematic\"])\n        schematic.shared = True\n        schematic.is_submission = True\n        schematic.save()\n        if(sim):\n            score, comparison_result = process_submission(\n                consumer.test_case.result, sim.result, consumer.sim_params)\n        else:\n            score = consumer.score\n            comparison_result = None\n        submission_data = {\n            \"project\": consumer,\n            \"student\": schematic.owner,\n            \"score\": score,\n            \"ltisession\": lti_session,\n            \"schematic\": schematic,\n            \"student_simulation\": sim\n        }\n        submission = Submission.objects.create(**submission_data)\n        print(\"after submission model created\")\n        xml = generate_request_xml(\n            message_identifier(), 'replaceResult',\n            lti_session.lis_result_sourcedid, submission.score)\n        msg = \"\"\n        try:\n            post = post_message(\n                consumers(), lti_session.oauth_consumer_key,\n                lti_session.lis_outcome_service_url, xml)\n            print(post)\n            if not post:\n                msg = 'An error occurred while saving your score.\\\n                     Please try again.'\n                raise LTIPostMessageException('Post grade failed')\n            else:\n                submission.lms_success = True\n                submission.save()\n                msg = 'Your score was submitted. Great job!'\n                if consumer.scored:\n                    response_data = {\n                        \"message\": msg,\n                        \"score\": score,\n                        \"given\": sim.result if sim else None,\n                        \"comparison_result\": comparison_result,\n                        \"sim_params\": consumer.sim_params,\n                    }\n                else:\n                    response_data = {\n                        \"message\": msg,\n                        \"score\": score,\n                        \"expected\": consumer.test_case.result,\n                        \"given\": sim.result if sim else None,\n                        \"comparison_result\": comparison_result,\n                        \"sim_params\": consumer.sim_params,\n                    }\n                return Response(data=response_data, status=status.HTTP_200_OK)\n\n        except LTIException:\n            submission.lms_success = False\n            submission.save()\n            return Response(data={\"message\": msg},\n                            status=status.HTTP_400_BAD_REQUEST)\n\n\nclass ArduinoLTIPostGrade(APIView):\n    permission_classes = [AllowAny, ]\n\n    @swagger_auto_schema(request_body=SubmissionSerializer)\n    def post(self, request):\n        \"\"\"\n        Post grade to LTI consumer using XML\n        :param: score: 0 <= score <= 1. (Score MUST be between 0 and 1)\n        :return: True if post successful and score valid\n        :exception: LTIPostMessageException if call failed\n        \"\"\"\n        try:\n            lti_session = ArduinoLTISession.objects.get(\n                id=request.data[\"ltisession\"][\"id\"])\n        except ArduinoLTISession.DoesNotExist:\n            return Response(data={\n                \"error\": \"No LTI session exists for this ID\"\n            }, status=status.HTTP_400_BAD_REQUEST)\n        consumer = ArduinLTIConsumer.objects.get(\n            id=lti_session.lti_consumer.id)\n        try:\n            sim = ArduinoLTISimData.objects.get(\n                id=request.data['student_simulation'])\n        except ArduinoLTISimData.DoesNotExist:\n            sim = None\n        schematic = StateSave.objects.get(save_id=request.data[\"schematic\"])\n        schematic.shared = True\n        schematic.is_submission = True\n        schematic.save()\n        if(sim):\n            score, evaluated = arduino_eval(consumer.test_case.result,\n                                            sim.result, consumer.con_weightage,\n                                            consumer.score)\n            if evaluated is False:\n                return Response(\n                    data={\"error\": \"Insufficient data points for evaluation\"},\n                    status=500)\n        else:\n            score = 0\n        submission_data = {\n            \"project\": consumer,\n            \"student\": schematic.owner,\n            \"score\": score,\n            \"ltisession\": lti_session,\n            \"schematic\": schematic,\n            \"student_simulation\": sim\n        }\n        submission = ArduinoSubmission.objects.create(**submission_data)\n        print(\"after submission model created\")\n        xml = generate_request_xml(\n            message_identifier(), 'replaceResult',\n            lti_session.lis_result_sourcedid, submission.score)\n        msg = \"\"\n        try:\n            post = post_message(\n                ArduinoConsumers(), lti_session.oauth_consumer_key,\n                lti_session.lis_outcome_service_url, xml)\n            print(post)\n            if not post:\n                msg = 'An error occurred while saving your score.\\\n                     Please try again.'\n                raise LTIPostMessageException('Post grade failed')\n            else:\n                submission.lms_success = True\n                submission.save()\n                msg = 'Your score : ' + str(score) + ' was submitted. \\\n                    Great job!'\n                if consumer.scored:\n                    response_data = {\n                        \"message\": msg,\n                        \"score\": score,\n                        \"given\": sim.result if sim else None\n                    }\n                else:\n                    response_data = {\n                        \"message\": msg,\n                        \"score\": score,\n                        \"expected\": consumer.test_case.result,\n                        \"given\": sim.result if sim else None\n                    }\n                return Response(data=response_data, status=status.HTTP_200_OK)\n\n        except LTIException:\n            submission.lms_success = False\n            submission.save()\n            return Response(data={\"message\": msg},\n                            status=status.HTTP_400_BAD_REQUEST)\n\n\nclass GetLTISubmission(APIView):\n    permission_classes = [IsAuthenticated, ]\n\n    def get(self, request, save_id, version, branch):\n        consumer = lticonsumer.objects.get(\n            model_schematic__save_id=save_id,\n            model_schematic__branch=branch,\n            model_schematic__version=version)\n        # print(consumer)\n        submissions = consumer.submission_set.all()\n        # print(submissions)\n        serialized = GetSubmissionsSerializer(submissions, many=True)\n        return Response(serialized.data, status=status.HTTP_200_OK)\n\n\nclass GetArduinoLTISubmission(APIView):\n    permission_classes = [IsAuthenticated, ]\n\n    def get(self, request, save_id, version, branch):\n        consumer = ArduinLTIConsumer.objects.get(\n            model_schematic__save_id=save_id,\n            model_schematic__branch=branch,\n            model_schematic__version=version)\n        # print(consumer)\n        submissions = consumer.arduinosubmission_set.all()\n        # print(submissions)\n        serialized = GetArduinoSubmissionsSerializer(submissions, many=True)\n        return Response(serialized.data, status=status.HTTP_200_OK)\n\n\nclass ArduinoLTISimulationDataView(APIView):\n    \"\"\"\n    Arduino LTI Simulation Data\n    \"\"\"\n\n    permission_classes = (AllowAny,)\n    methods = ['GET', 'POST']\n\n    @swagger_auto_schema(request_body=ArduinoLTISimulationDataSerializer)\n    def post(self, request, save_id, lti_id):\n        try:\n            circuit = StateSave.objects.get(id=save_id)\n        except StateSave.DoesNotExist:\n            return Response({\"error\": \"Circuit not found\"},\n                            status=status.HTTP_404_NOT_FOUND)\n\n        try:\n            session = ArduinoLTISession.objects.get(id=lti_id)\n        except ArduinoLTISession.DoesNotExist:\n            return Response({\"error\": \"No LTI session found\"})\n\n        if(not(len(request.data))):\n            return Response({\"error\": \"Simulation data not passed\"},\n                            status=status.HTTP_400_BAD_REQUEST)\n        try:\n            ArduinoLTISimData(session_id=session,\n                              circuit_id=circuit,\n                              result=str(request.data)).save()\n        except Exception as e:\n            return Response({\"error\": \"Record Not saved\"}, status=500)\n        else:\n            return Response({\"success\": \"Record Successfully Saved\"},\n                            status=200)\n\n    def get(self, request, save_id, lti_id):\n        try:\n            circuit = StateSave.objects.get(id=save_id)\n        except StateSave.DoesNotExist:\n            return Response({\"error\": \"Circuit not found\"},\n                            status=status.HTTP_404_NOT_FOUND)\n        try:\n            queryset = ArduinoLTISimData.objects.filter(\n                session_id=lti_id,\n                circuit_id=circuit)\n            serial = ArduinoLTISimulationDataSerializer(queryset, many=True)\n            return Response(serial.data, status=200)\n        except Exception as e:\n            print(e)\n            return Response({\"error\": \"No simulation data found\"},\n                            status=status.HTTP_404_NOT_FOUND)\n"
  },
  {
    "path": "esim-cloud-backend/manage.py",
    "content": "#!/usr/bin/env python\n\"\"\"Django's command-line utility for administrative tasks.\"\"\"\nimport os\nimport sys\n\n\ndef main():\n    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'esimCloud.settings')\n\n    try:\n        from django.core.management import execute_from_command_line\n    except ImportError as exc:\n        raise ImportError(\n            \"Couldn't import Django. Are you sure it's installed and \"\n            \"available on your PYTHONPATH environment variable? Did you \"\n            \"forget to activate a virtual environment?\"\n        ) from exc\n    execute_from_command_line(sys.argv)\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "esim-cloud-backend/migrations.sh",
    "content": "python manage.py makemigrations authAPI\npython manage.py migrate authAPI\npython manage.py makemigrations workflowAPI\npython manage.py migrate workflowAPI\npython manage.py makemigrations publishAPI\npython manage.py migrate publishAPI\npython manage.py makemigrations libAPI\npython manage.py migrate libAPI\npython manage.py makemigrations saveAPI\npython manage.py migrate saveAPI\npython manage.py makemigrations simulationAPI\npython manage.py migrate simulationAPI\npython manage.py makemigrations ltiAPI\npython manage.py migrate ltiAPI\npython manage.py makemigrations\npython manage.py migrate\npython manage.py collectstatic --noinput\npython manage.py loaddata initial_setup\npython manage.py createsuperuser_noinput --username=admin --password=admin\npython manage.py load_default_libs --username=admin --location=kicad-symbols/default/ --default\npython manage.py load_default_libs --username=admin --location=kicad-symbols/additional/\npython manage.py loaddata gallery_setup\n"
  },
  {
    "path": "esim-cloud-backend/publishAPI/__init__.py",
    "content": "# default_app_config = 'publishAPI.apps.PublishapiConfig'\n"
  },
  {
    "path": "esim-cloud-backend/publishAPI/admin.py",
    "content": "from django.contrib import admin\nfrom publishAPI.models import Project, CircuitTag, TransitionHistory, Report\n\n\n@admin.register(CircuitTag)\nclass CircuitTagAdmin(admin.ModelAdmin):\n    list_display = ('tag', 'description')\n    search_fields = ('tag', 'description')\n\n\n@admin.register(Report)\nclass ReportAdmin(admin.ModelAdmin):\n    list_display = ('id', 'project', 'report_time')\n    readonly_fields = ('project', 'report_time', 'reporter', 'resolver')\n\n\nclass HistoryInline(admin.TabularInline):\n    model = TransitionHistory\n    readonly_fields = (\n        'id', 'transition_author', 'transition_time',)\n\n\n@admin.register(Project)\nclass CircuitAdmin(admin.ModelAdmin):\n    inlines = [HistoryInline, ]\n    list_display = ('title',)\n    readonly_fields = ('fields',)\n\n# @admin.register(Publish)\n# class PublishAdmin(admin.ModelAdmin):\n#     list_display = ('circuit_title', 'image_tag', 'published', 'reviewed_by')\n"
  },
  {
    "path": "esim-cloud-backend/publishAPI/apps.py",
    "content": "# from django.apps import AppConfig\n# from django.db.models.signals import post_migrate, m2m_changed\n# from django.contrib.auth import get_user_model\n\n\n# class PublishapiConfig(AppConfig):\n#     name = 'publishAPI'\n\n#     def ready(self):\n#         from .signals import populate_models, add_staff_status\n#         post_migrate.connect(populate_models, sender=self)\n#         m2m_changed.connect(\n#             add_staff_status, sender=get_user_model().groups.through)\n"
  },
  {
    "path": "esim-cloud-backend/publishAPI/models.py",
    "content": "from django.db import models\nfrom django.contrib.auth import get_user_model\nfrom django.db.models.deletion import CASCADE, SET_NULL\nfrom django.contrib.postgres.fields import ArrayField\nfrom django.utils.safestring import mark_safe\nfrom django.core.files.storage import FileSystemStorage\nfrom django.conf import settings\nimport uuid\nfrom workflowAPI.models import State, Transition\n\n# For handling file uploads to a permenant direcrory\nfile_storage = FileSystemStorage(\n    location=settings.FILE_STORAGE_ROOT, base_url=settings.FILE_STORAGE_URL)\n\n\nclass CircuitTag(models.Model):\n    tag = models.CharField(null=False, max_length=100,\n                           blank=False, unique=True)\n    description = models.CharField(max_length=200, blank=False)\n\n    # For Django Admin\n    def __str__(self):\n        return self.tag\n\n\nclass Field(models.Model):\n    name = models.CharField(\n        max_length=40, blank=False)\n    text = models.CharField(max_length=400, null=True)\n\n\nclass Project(models.Model):\n    project_id = models.UUIDField(\n        primary_key=True, default=uuid.uuid4, editable=False)\n\n    # Circuit Details\n    title = models.CharField(\n        max_length=200, blank=False)  # Search\n    description = models.CharField(max_length=1000, null=True)\n    fields = models.ManyToManyField(to=Field)\n    state = models.ForeignKey(State, on_delete=CASCADE, default=1)\n    author = models.ForeignKey(\n        get_user_model(), null=True, on_delete=models.CASCADE)\n    is_arduino = models.BooleanField(default=False, null=False)\n    is_reported = models.BooleanField(default=False, null=True)\n    active_branch = models.CharField(max_length=20, null=True)\n    active_version = models.CharField(max_length=20, null=True)\n    dc_sweep = models.OneToOneField(\n        to='DCSweepParameters', on_delete=models.CASCADE, null=True)\n    transient_analysis = models.OneToOneField(\n        to='TransientAnalysisParameters', on_delete=models.CASCADE, null=True)\n    tf_analysis = models.OneToOneField(\n        to='TFAnalysisParameters', on_delete=models.CASCADE, null=True)\n    ac_analysis = models.OneToOneField(\n        to='ACAnalysisParameters', on_delete=models.CASCADE, null=True)\n\n    def __str__(self):\n        return self.title\n\n\nclass TransitionHistory(models.Model):\n    id = models.AutoField(primary_key=True)\n    project = models.ForeignKey(\n        Project, editable=False, on_delete=models.CASCADE, null=True)\n    transition_author = models.ForeignKey(\n        get_user_model(), on_delete=models.CASCADE)\n    transition = models.ForeignKey(to=Transition, on_delete=models.CASCADE,\n                                   null=True)\n    transition_time = models.DateTimeField(auto_now_add=True)\n    reviewer_notes = models.CharField(max_length=500, blank=True)\n    is_done_by_reviewer = models.BooleanField(default=False, null=True)\n\n    class Meta:\n        verbose_name_plural = 'Transition Histories'\n\n\nclass Report(models.Model):\n    id = models.AutoField(primary_key=True)\n    project = models.ForeignKey(\n        Project, editable=False, on_delete=models.CASCADE, null=True)\n    report_open = models.BooleanField(default=True, null=False)\n    resolver = models.ForeignKey(\n        get_user_model(), on_delete=models.CASCADE, null=True,\n        related_name='resolver')  # noqa\n    report_time = models.DateTimeField(auto_now_add=True)\n    description = models.CharField(max_length=500, null=False)\n    reporter = models.ForeignKey(\n        get_user_model(), on_delete=models.CASCADE, related_name='reporter',\n        null=True)  # noqa\n    approved = models.BooleanField(default=None, null=True)\n\n\nclass DCSweepParameters(models.Model):\n    parameter = models.CharField(max_length=200, null=True)\n    sweepType = models.CharField(max_length=200, null=False, default='Linear')\n    start = models.CharField(max_length=200, null=True)\n    stop = models.CharField(max_length=200, null=True)\n    step = models.CharField(max_length=200, null=True)\n    parameter2 = models.CharField(max_length=200, null=True)\n    start2 = models.CharField(max_length=200, null=True)\n    stop2 = models.CharField(max_length=200, null=True)\n    step2 = models.CharField(max_length=200, null=True)\n\n\nclass TransientAnalysisParameters(models.Model):\n    start = models.CharField(max_length=200, null=True)\n    stop = models.CharField(max_length=200, null=True)\n    step = models.CharField(max_length=200, null=True)\n    skipInitial = models.BooleanField(default=False)\n\n\nclass ACAnalysisParameters(models.Model):\n    input = models.CharField(max_length=200, default='dec')\n    stop = models.CharField(max_length=200, null=True)\n    start = models.CharField(max_length=200, null=True)\n    pointsBydecade = models.CharField(max_length=200, null=True)\n\n\nclass TFAnalysisParameters(models.Model):\n    outputNodes = models.BooleanField(default=False)\n    outputVoltageSource = models.CharField(max_length=200, null=True)\n    inputVoltageSource = models.CharField(max_length=200, null=True)\n"
  },
  {
    "path": "esim-cloud-backend/publishAPI/serializers.py",
    "content": "from django.db import models\nfrom django.db.models import fields\nfrom rest_framework import serializers\nfrom .models import *\nfrom django.core.files.base import ContentFile\nimport base64\nimport six\nimport uuid\nimport imghdr\nfrom saveAPI.serializers import StateSaveSerializer\nfrom workflowAPI.models import Transition\n\n\nclass DCSweepSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = DCSweepParameters\n        fields = '__all__'\n\n    def create(self, validated_data):\n        return DCSweepParameters.objects.create(**validated_data)\n\n    def update(self, instance, validated_data):\n        return super().update(instance, validated_data)\n\n\nclass TransientAnalysisSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = TransientAnalysisParameters\n        fields = '__all__'\n\n\nclass ACAnalysisSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = ACAnalysisParameters\n        fields = '__all__'\n\n\nclass TFAnalysisSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = TFAnalysisParameters\n        fields = '__all__'\n\n\nclass Base64ImageField(serializers.ImageField):\n\n    def to_internal_value(self, data):\n        if isinstance(data, six.string_types):\n            if 'data:' in data and ';base64,' in data:\n                header, data = data.split(';base64,')\n            try:\n                decoded_file = base64.b64decode(data)\n            except TypeError:\n                self.fail('invalid_image')\n            file_name = str(uuid.uuid4())\n            file_extension = imghdr.what(file_name, decoded_file)\n            complete_file_name = \"%s.%s\" % (file_name, file_extension,)\n            data = ContentFile(decoded_file, name=complete_file_name)\n\n        return super(Base64ImageField, self).to_internal_value(data)\n\n\nclass CircuitTagSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = CircuitTag\n        fields = ('tag', 'description', 'id')\n\n\nclass TransitionElementSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = Transition\n        fields = '__all__'\n\n\nclass TransitionHistorySerializer(serializers.ModelSerializer):\n    transition_author_name = serializers.CharField(\n        read_only=True, source='transition_author.username')\n    from_state_name = serializers.CharField(\n        read_only=True, source='transition.from_state.name')\n    to_state_name = serializers.CharField(\n        read_only=True, source='transition.to_state.name')\n    transition = TransitionElementSerializer()\n\n    class Meta:\n        model = TransitionHistory\n        fields = ('transition_author_name',\n                  'from_state_name',\n                  'to_state_name',\n                  'transition_time',\n                  'transition',\n                  'reviewer_notes',)\n\n\nclass FieldSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = Field\n        fields = ('name', 'text')\n\n\nclass ProjectSerializer(serializers.ModelSerializer):\n    status_name = serializers.CharField(read_only=True, source='state.name')\n    author_name = serializers.CharField(\n        read_only=True, source='author.username')\n    fields = FieldSerializer(many=True)\n    save_id = serializers.SerializerMethodField()\n    active_save = serializers.SerializerMethodField()\n    dc_sweep = DCSweepSerializer()\n    transient_analysis = TransientAnalysisSerializer()\n    tf_analysis = TFAnalysisSerializer()\n    ac_analysis = ACAnalysisSerializer()\n\n    class Meta:\n        model = Project\n        fields = ('project_id',\n                  'title',\n                  'description',\n                  'status_name',\n                  'author_name',\n                  'is_reported',\n                  'fields',\n                  'active_branch',\n                  'active_version',\n                  'save_id',\n                  'active_save',\n                  'dc_sweep',\n                  'transient_analysis',\n                  'tf_analysis',\n                  'ac_analysis',\n                  )\n\n    def get_save_id(self, obj):\n        return obj.statesave_set.first().save_id\n\n    def get_active_save(self, obj):\n        return StateSaveSerializer(\n            obj.statesave_set.get(save_id=obj.statesave_set.first().save_id,\n                                  branch=obj.active_branch,\n                                  version=obj.active_version)).data\n\n\nclass ReportSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = Report\n        fields = ('id', 'report_open', 'report_time',\n                  'description', 'approved')\n\n\nclass ReportDescriptionSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = Report\n        fields = ('description',)\n"
  },
  {
    "path": "esim-cloud-backend/publishAPI/signals.py",
    "content": "# import logging\n# logger = logging.getLogger(__name__)\n\n\n# def add_staff_status(sender, instance, action, **kwargs):\n#     logger.info('Group add/remove hook called')\n#     if action == 'post_add':\n#         instance.is_staff = True\n#         instance.save()\n#         logger.info('Added is_staff flag for ' + str(instance))\n#     if action == 'post_remove':\n#         instance.is_staff = False\n#         instance.save()\n#         logger.info('Removed is_staff flag for ' + str(instance))\n\n\n# def populate_models(sender, **kwargs):\n#     from django.contrib.auth.models import Group, Permission\n#     from publishAPI import models\n\n#     GROUPS_PERMISSIONS = {\n#         'Reviewers': {\n#             models.Publish: ['add', 'change', 'delete', 'view'],\n#             models.Circuit: ['view', 'add', 'delete'],\n#             models.CircuitTag: ['add', 'view', 'change', 'delete'],\n#         },\n#     }\n\n#     for group_name in GROUPS_PERMISSIONS:\n\n#         # Get or create group\n#         group, created = Group.objects.get_or_create(name=group_name)\n\n#         # Loop models in group\n#         for model_cls in GROUPS_PERMISSIONS[group_name]:\n\n#             # Loop permissions in group/model\n#             for perm_index, perm_name in \\\n#                     enumerate(GROUPS_PERMISSIONS[group_name][model_cls]):\n#                 # Generate permission name as Django would generate it\n#                 codename = perm_name + \"_\" + model_cls._meta.model_name\n\n#                 try:\n#                     # Find permission object and add to group\n#                     perm = Permission.objects.get(codename=codename)\n#                     group.permissions.add(perm)\n#                     logger.info(str(perm_index)\n#                                 + \" Adding \"\n#                                 + codename\n#                                 + \" to group \"\n#                                 + group.__str__())\n#                 except Permission.DoesNotExist:\n#                     logger.info(codename + \" not found\")\n"
  },
  {
    "path": "esim-cloud-backend/publishAPI/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "esim-cloud-backend/publishAPI/urls.py",
    "content": "\"\"\"\n\nesimCloud URL Configuration\n\n\"\"\"\nfrom django.urls import path\nfrom django.conf.urls import url, include\nfrom publishAPI import views as publishAPI_views\nfrom rest_framework import routers\n\nrouter = routers.SimpleRouter()\nrouter.register(r'tags', publishAPI_views.TagsViewSet,\n                basename='tag')\nrouter.register(r'publish/publishing', publishAPI_views.PublicProjectViewSet,\n                basename='publish')\nrouter.register(r'publish/myproject', publishAPI_views.MyProjectViewSet,\n                basename='project')\n# router.register(r'circuits', publishAPI_views.PublishViewSet,\n#                 basename='Project')\n\nurlpatterns = [\n    url(r'^', include(router.urls)),\n    path('publish/project/<uuid:circuit_id>',\n         publishAPI_views.ProjectViewSet.as_view(), name='create'),\n]\n"
  },
  {
    "path": "esim-cloud-backend/publishAPI/views.py",
    "content": "from rest_framework import permissions\nfrom publishAPI.serializers import CircuitTagSerializer, ProjectSerializer, \\\n    TransitionHistorySerializer, DCSweepSerializer, \\\n    TransientAnalysisSerializer, ACAnalysisSerializer, \\\n    TFAnalysisSerializer  # noqa\nfrom rest_framework.permissions import DjangoModelPermissionsOrAnonReadOnly, \\\n    AllowAny, DjangoModelPermissions  # noqa\nfrom rest_framework.parsers import JSONParser, MultiPartParser\nfrom workflowAPI.models import Permission\nfrom publishAPI.models import ACAnalysisParameters, CircuitTag, \\\n    DCSweepParameters, Project, Field, TFAnalysisParameters, \\\n    TransientAnalysisParameters, TransitionHistory\nfrom rest_framework.permissions import DjangoModelPermissionsOrAnonReadOnly, \\\n    IsAuthenticated, AllowAny, \\\n    DjangoModelPermissions  # noqa\nfrom rest_framework.parsers import JSONParser, MultiPartParser, FormParser\nfrom drf_yasg.utils import swagger_auto_schema\nfrom rest_framework import viewsets, status\nfrom rest_framework.views import APIView\nfrom rest_framework.response import Response\nfrom saveAPI.models import StateSave\nfrom workflowAPI.utils import ChangeStatus\nimport logging\n\nlogger = logging.getLogger(__name__)\n\n\nclass TagsViewSet(viewsets.ModelViewSet):\n    \"\"\"\n     CRUD for Tags\n    \"\"\"\n    permission_classes = (DjangoModelPermissionsOrAnonReadOnly,)\n    queryset = CircuitTag.objects.all()\n    serializer_class = CircuitTagSerializer\n\n\nclass ProjectViewSet(APIView):\n    parser_classes = (FormParser, JSONParser)\n    serializer_class = ProjectSerializer\n\n    def get(self, request, circuit_id):\n        try:\n            queryset = Project.objects.get(project_id=circuit_id)\n        except Project.DoesNotExist:\n            return Response({'error': 'No circuit there'},\n                            status=status.HTTP_404_NOT_FOUND)\n        user_roles = self.request.user.groups.all()\n        can_edit = False\n        can_delete = False\n        if queryset.state.public is False:\n            if queryset.author == self.request.user and Permission.objects.filter(  # noqa\n                    role__in=user_roles,\n                    view_own_states=queryset.state).exists():\n                pass\n            elif queryset.author != self.request.user and Permission.objects.filter(  # noqa\n                    role__in=user_roles,\n                    view_other_states=queryset.state).exists():\n                pass\n            else:\n                return Response(status=status.HTTP_401_UNAUTHORIZED)\n\n            if queryset.author == self.request.user and Permission.objects.filter(  # noqa\n                    role__in=user_roles,\n                    edit_own_states=queryset.state).exists():\n                can_edit = True\n            else:\n                can_edit = False\n            if queryset.author == self.request.user and Permission.objects.filter(  # noqa\n                    role__in=user_roles,\n                    del_own_states=queryset.state).exists():\n                can_delete = True\n            else:\n                can_delete = False\n        try:\n            histories = TransitionHistorySerializer(\n                TransitionHistory.objects.filter(\n                    project=queryset).order_by(\"transition_time\"), many=True)\n            serialized = ProjectSerializer(queryset)\n            data = serialized.data.copy()\n            data['history'] = histories.data\n            data['can_edit'] = can_edit\n            data['can_delete'] = can_delete\n            return Response(data)\n        except TransitionHistory.DoesNotExist:\n            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)\n\n    def post(self, request, circuit_id):\n        save_states = StateSave.objects.filter(save_id=circuit_id)\n        try:\n            active_state_save = save_states.get(\n                branch=request.data[0]['active_branch'],\n                version=request.data[0]['active_version'])\n        except StateSave.DoesNotExist:\n            return Response({'Save does not exist'},\n                            status=status.HTTP_404_NOT_FOUND)\n        user_roles = self.request.user.groups.all()\n        if active_state_save.project is None:\n            project = Project(title=request.data[0]['title'],\n                              description=request.data[0]\n                              ['description'], author=active_state_save.owner,\n                              is_arduino=active_state_save.is_arduino,\n                              active_branch=request.data[0]['active_branch'],\n                              active_version=request.data[0]['active_version'],\n                              )\n            dc_sweep = DCSweepParameters(\n                parameter=request.data[3]['parameter'],\n                sweepType=request.data[3]['sweepType'],\n                start=request.data[3]['start'],\n                stop=request.data[3]['stop'],\n                step=request.data[3]['step'],\n                parameter2=request.data[3]['parameter2'],\n                start2=request.data[3]['start2'],\n                step2=request.data[3]['step2'],\n                stop2=request.data[3]['stop2'],\n                )\n            transient_analysis = TransientAnalysisParameters(\n                start=request.data[4]['start'],\n                stop=request.data[4]['stop'],\n                step=request.data[4]['step'],\n                skipInitial=request.data[4]['skipInitial'],\n            )\n            ac_analysis = ACAnalysisParameters(\n                input=request.data[5]['input'],\n                stop=request.data[5]['stop'],\n                start=request.data[5]['start'],\n                pointsBydecade=request.data[5]['pointsBydecade'],\n            )\n            tf_analysis = TFAnalysisParameters(\n                outputNodes=request.data[6]['outputNodes'],\n                outputVoltageSource=request.data[6]['outputVoltageSource'],\n                inputVoltageSource=request.data[6]['inputVoltageSource'],\n            )\n            dc_sweep.save()\n            ac_analysis.save()\n            tf_analysis.save()\n            transient_analysis.save()\n            project.dc_sweep = dc_sweep\n            project.transient_analysis = transient_analysis\n            project.ac_analysis = ac_analysis\n            project.tf_analysis = tf_analysis\n            project.save()\n            for field in request.data[1]:\n                field = Field(name=field['name'], text=field['text'])\n                field.save()\n                project.fields.add(field)\n            project.save()\n            can_edit = False\n            can_delete = False\n            for save_state in save_states:\n                save_state.project = project\n                save_state.shared = True\n                save_state.save(update_fields=['project', 'shared', ])\n            # ChangeStatus(self, request.data[2], active_state_save.project)\n            if Permission.objects.filter(role__in=user_roles,\n                                         edit_own_states=project.state).exists():  # noqa\n                can_edit = True\n            else:\n                can_edit = False\n            if Permission.objects.filter(role__in=user_roles,\n                                         del_own_states=project.state).exists():  # noqa\n                can_delete = True\n            else:\n                can_delete = False\n            histories = TransitionHistorySerializer(\n                TransitionHistory.objects.filter(project=project), many=True)\n            serialized = ProjectSerializer(project)\n            data = serialized.data.copy()\n            data['save_id'] = active_state_save.save_id\n            data['history'] = histories.data\n            data['can_edit'] = can_edit\n            data['can_delete'] = can_delete\n            return Response(data)\n        else:\n            can_edit = False\n            can_delete = False\n            if Permission.objects.filter(role__in=user_roles,\n                                         edit_own_states=active_state_save.project.state).exists():  # noqa\n                pass\n            else:\n                return Response(status=status.HTTP_401_UNAUTHORIZED)\n            active_state_save.project.title = request.data[0]['title']\n            active_state_save.project.description = request.data[0][\n                'description']\n            active_state_save.project.active_branch = request.data[0][\n                'active_branch']\n            active_state_save.project.active_version = request.data[0][\n                'active_version']\n            dc_sweep = DCSweepParameters(\n                parameter=request.data[3]['parameter'],\n                sweepType=request.data[3]['sweepType'],\n                start=request.data[3]['start'],\n                stop=request.data[3]['stop'],\n                step=request.data[3]['step'],\n                parameter2=request.data[3]['parameter2'],\n                start2=request.data[3]['start2'],\n                step2=request.data[3]['step2'],\n                stop2=request.data[3]['stop2'],\n                )\n            transient_analysis = TransientAnalysisParameters(\n                start=request.data[4]['start'],\n                stop=request.data[4]['stop'],\n                step=request.data[4]['step'],\n                skipInitial=request.data[4]['skipInitial'],\n            )\n            ac_analysis = ACAnalysisParameters(\n                input=request.data[5]['input'],\n                stop=request.data[5]['stop'],\n                start=request.data[5]['start'],\n                pointsBydecade=request.data[5]['pointsBydecade'],\n            )\n            tf_analysis = TFAnalysisParameters(\n                outputNodes=request.data[6]['outputNodes'],\n                outputVoltageSource=request.data[6]['outputVoltageSource'],\n                inputVoltageSource=request.data[6]['inputVoltageSource'],\n            )\n            dc_sweep.save()\n            ac_analysis.save()\n            tf_analysis.save()\n            transient_analysis.save()\n            active_state_save.project.dc_sweep = dc_sweep\n            active_state_save.project.transient_analysis = transient_analysis\n            active_state_save.project.ac_analysis = ac_analysis\n            active_state_save.project.tf_analysis = tf_analysis\n            active_state_save.project.save()\n            if request.data[2] != '':\n                ChangeStatus(self, request.data[2], active_state_save.project)\n            if Permission.objects.filter(role__in=user_roles,\n                                         edit_own_states=active_state_save.project.state).exists():  # noqa\n                can_edit = True\n            else:\n                can_edit = False\n            if Permission.objects.filter(role__in=user_roles,\n                                         del_own_states=active_state_save.project.state).exists():  # noqa\n                can_delete = True\n            else:\n                can_delete = False\n            active_state_save.project.fields.clear()\n            for field in request.data[1]:\n                field = Field(name=field['name'], text=field['text'])\n                field.save()\n                active_state_save.project.fields.add(field)\n            active_state_save.project.save()\n            histories = TransitionHistorySerializer(\n                TransitionHistory.objects.filter(\n                    project=active_state_save.project), many=True)\n            serialized = ProjectSerializer(active_state_save.project)\n            data = serialized.data.copy()\n            data['save_id'] = active_state_save.save_id\n            data['history'] = histories.data\n            data['can_edit'] = can_edit\n            data['can_delete'] = can_delete\n            return Response(data)\n\n    def delete(self, request, circuit_id):\n        try:\n            project = Project.objects.get(project_id=circuit_id)\n        except Project.DoesNotExist:\n            return Response({'error': 'No circuit there'},\n                            status=status.HTTP_404_NOT_FOUND)\n        if project.author == self.request.user and Permission.objects.filter(\n                role__in=self.request.user.groups.all(),\n                del_own_states=project.state).exists():\n            project.delete()\n            return Response({'done': True})\n        else:\n            return Response(status=status.HTTP_400_BAD_REQUEST)\n\n\nclass MyProjectViewSet(viewsets.ModelViewSet):\n    \"\"\"\n     List users circuits ( Permission Groups )\n    \"\"\"\n    parser_classes = (FormParser, JSONParser)\n    permission_classes = (IsAuthenticated,)\n    serializer_class = ProjectSerializer\n    queryset = Project.objects.none()\n\n    @swagger_auto_schema(response={200: ProjectSerializer})\n    def list(self, request):\n        try:\n            queryset = Project.objects.filter(\n                author=self.request.user, is_arduino=False)\n        except Project.DoesNotExist:\n            return Response({'error': 'No circuit there'},\n                            status=status.HTTP_404_NOT_FOUND)\n        serialized = ProjectSerializer(queryset, many=True)\n        return Response(serialized.data)\n\n\nclass PublicProjectViewSet(viewsets.ModelViewSet):\n    \"\"\"\n     List published circuits\n    \"\"\"\n    parser_classes = (FormParser, JSONParser)\n    serializer_class = ProjectSerializer\n    queryset = Project.objects.none()\n\n    @swagger_auto_schema(response={200: ProjectSerializer})\n    def list(self, request):\n        try:\n            queryset = Project.objects.filter(\n                is_arduino=False, state__public=True)\n        except Project.DoesNotExist:\n            return Response(status=status.HTTP_404_NOT_FOUND)\n        serialized = ProjectSerializer(queryset, many=True)\n        return Response(serialized.data)\n"
  },
  {
    "path": "esim-cloud-backend/requirements.txt",
    "content": "amqp==2.5.2\nasgiref==3.2.7\nbilliard==3.6.3.0\ncairocffi==1.1.0\nCairoSVG==2.4.2\ncelery==4.4.2\ncertifi==2020.4.5.1\ncffi==1.14.0\nchardet==3.0.4\nconfigparse==0.1.5\nconfigparser==5.0.0\ncoreapi==2.3.3\ncoreschema==0.0.4\ncryptography==39.0.0\ndjango==2.2.12\ndjango-cors-headers==3.2.1\ndjango-templated-mail==1.1.1\ndjangorestframework==3.11.0\ndjongo==1.2.38\ndjoser==2.0.3\ncssselect2==0.3.0\ndefusedxml==0.6.0\ndjango-filter==2.2.0\ndjango-inline-actions==2.4.0\ndrawSvg==1.5.3\ndrf-yasg==1.17.1\ngunicorn==20.0.4\nidna==2.9\nimageio==2.8.0\nimportlib-metadata==1.6.0\ninflection==0.4.0\nitypes==1.2.0\nJinja2==2.11.2\nkombu==4.6.8\nMarkupSafe==1.1.1\nmysqlclient==1.4.6\noauthlib==3.1.0\npackaging==20.3\nPillow==7.1.2\npsycopg2==2.8.5\npycparser==2.20\nPyJWT==1.7.1\nnumpy==1.18.4\nPillow==7.1.2\npsycopg2==2.8.5\npymongo==3.10.1\npyparsing==2.4.7\npython-dateutil==2.8.1\npython3-openid==3.1.0\npytz==2019.3\nredis==3.4.1\nrequests==2.23.0\nrequests-oauthlib==1.3.0\nruamel.yaml==0.16.10\nruamel.yaml.clib==0.2.0\nsix==1.14.0\nsocial-auth-app-django==3.1.0\nsocial-auth-core==3.3.3\nsqlparse==0.2.4\ntinycss2==1.0.2\nuritemplate==3.0.1\nurllib3==1.25.9\nvine==1.3.0\nwebencodings==0.5.1\nwhitenoise==5.0.1\nzipp==3.1.0\npylti==0.7.0\nsphinxcontrib-openapi\nm2r2\n"
  },
  {
    "path": "esim-cloud-backend/saveAPI/__init__.py",
    "content": ""
  },
  {
    "path": "esim-cloud-backend/saveAPI/admin.py",
    "content": "from django.contrib import admin\nfrom saveAPI.models import Gallery, StateSave, ArduinoModelSimulationData\nfrom django.forms import TextInput, Textarea\nfrom django.db import models\n\n\n@admin.register(StateSave)\nclass UserCircuits(admin.ModelAdmin):\n    list_display = ('name', 'is_arduino', 'base64_image',\n                    'save_time', 'create_time', \"version\")\n    list_filter = ('version', 'save_id',)\n\n\n@admin.register(ArduinoModelSimulationData)\nclass ArduinoSimulation(admin.ModelAdmin):\n    list_display = ('save_id', \"result\")\n    list_filter = ('save_id', \"result\",)\n\n\n@admin.register(Gallery)\nclass GalleryCircuits(admin.ModelAdmin):\n    list_display = ('name', 'image_tag', 'description', 'shared', 'is_arduino')\n    list_filter = ('save_time', 'is_arduino')\n    search_fields = ('name', 'description')\n    formfield_overrides = {\n        models.CharField: {'widget': TextInput(attrs={'size': '50'})},\n        models.TextField: {'widget': Textarea(attrs={'rows': 20, 'cols': 50})},\n    }\n"
  },
  {
    "path": "esim-cloud-backend/saveAPI/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass SaveapiConfig(AppConfig):\n    name = 'saveAPI'\n"
  },
  {
    "path": "esim-cloud-backend/saveAPI/dbrouters.py",
    "content": "class mongoRouter:\n    \"\"\"\n    A router to control all database operations on models in the\n    auth and contenttypes applications.\n    \"\"\"\n    route_app_labels = {'saveAPI'}\n\n    def db_for_read(self, model, **hints):\n        \"\"\"\n        Attempts to read auth and contenttypes models go to auth_db.\n        \"\"\"\n        if model._meta.app_label in self.route_app_labels:\n            return 'mongodb'\n        return None\n\n    def db_for_write(self, model, **hints):\n        \"\"\"\n        Attempts to write auth and contenttypes models go to auth_db.\n        \"\"\"\n        if model._meta.app_label in self.route_app_labels:\n            return 'mongodb'\n        return None\n\n    def allow_relation(self, obj1, obj2, **hints):\n        \"\"\"\n        Allow relations if a model in the auth or contenttypes apps is\n        involved.\n        \"\"\"\n        if (\n            obj1._meta.app_label in self.route_app_labels or\n            obj2._meta.app_label in self.route_app_labels\n        ):\n            return True\n        return None\n\n    def allow_migrate(self, db, app_label, model_name=None, **hints):\n        \"\"\"\n        Make sure the auth and contenttypes apps only appear in the\n        'auth_db' database.\n        \"\"\"\n        if app_label in self.route_app_labels:\n            return db == 'mongodb'\n        return None\n"
  },
  {
    "path": "esim-cloud-backend/saveAPI/models.py",
    "content": "from enum import unique\nfrom django.db import models\nfrom django.contrib.auth import get_user_model\nfrom django.core.files.storage import FileSystemStorage\nfrom django.conf import settings\nimport uuid\nfrom libAPI.models import Library\nfrom publishAPI.models import Project\nfrom django.utils.safestring import mark_safe\n\n\n# For handling file uploads to a permenant direcrory\nfile_storage = FileSystemStorage(\n    location=settings.FILE_STORAGE_ROOT, base_url=settings.FILE_STORAGE_URL)\n\n\nclass StateSave(models.Model):\n    id = models.AutoField(primary_key=True)\n    name = models.CharField(max_length=200, null=True)\n    description = models.CharField(max_length=400, null=True)\n    save_time = models.DateTimeField(auto_now=True, db_index=True)\n    create_time = models.DateTimeField(auto_now_add=True)\n    save_id = models.UUIDField(default=uuid.uuid4)\n    data_dump = models.TextField(null=False)\n    shared = models.BooleanField(default=False)\n    owner = models.ForeignKey(\n        get_user_model(), null=True, on_delete=models.CASCADE)\n    base64_image = models.ImageField(\n        upload_to='circuit_images', storage=file_storage, null=True)\n    version = models.CharField(max_length=20, null=False)\n    branch = models.CharField(max_length=20, null=False)\n    is_arduino = models.BooleanField(default=False, null=False)\n    esim_libraries = models.ManyToManyField(Library)\n    project = models.ForeignKey(to=Project, on_delete=models.SET_NULL,\n                                null=True)\n    is_submission = models.BooleanField(null=True, blank=True)\n\n    def save(self, *args, **kwargs):\n        super(StateSave, self).save(*args, **kwargs)\n\n    def __str__(self):\n        return self.name\n\n\nclass ArduinoModelSimulationData(models.Model):\n    save_id = models.ForeignKey(StateSave, to_field='id',\n                                on_delete=models.CASCADE,\n                                null=False)\n    result = models.TextField(null=True, default=True)\n\n    def save(self, *args, **kwargs):\n        super(ArduinoModelSimulationData, self).save(*args, **kwargs)\n\n    def __str__(self):\n        return self.result\n\n\nclass Gallery(models.Model):\n    id = models.AutoField(primary_key=True)\n    save_id = models.CharField(unique=True, max_length=500, null=False)\n    data_dump = models.TextField(null=False)\n    name = models.CharField(max_length=100, default=\"Untitled\")\n    description = models.CharField(max_length=1000)\n    media = models.ImageField(\n        upload_to='circuit_images_esim', storage=file_storage, null=True)\n    shared = models.BooleanField(default=True)\n    save_time = models.DateTimeField(auto_now=True)\n    is_arduino = models.BooleanField(default=False, null=False)\n    esim_libraries = models.ManyToManyField(Library)\n\n    # For Django Admin Panel\n    def image_tag(self):\n        print(file_storage)\n        if self.media:\n            return mark_safe('<img src=\"%s\" style=\"width: 45px; height:45px;\" />' % self.media.url)  # noqa\n        else:\n            return 'No Image Found'\n    image_tag.short_description = 'Image'\n\n    def __str__(self):\n        return self.name\n"
  },
  {
    "path": "esim-cloud-backend/saveAPI/serializers.py",
    "content": "from ensurepip import version\nfrom os import makedirs, read\nfrom django.db.models import fields\nfrom rest_framework import serializers\nfrom rest_framework.fields import ListField\nfrom saveAPI.models import StateSave, Gallery, ArduinoModelSimulationData\nfrom libAPI.models import Library\nfrom libAPI.serializers import LibrarySerializer\nfrom django.core.files.base import ContentFile\nfrom ltiAPI.models import ArduinLTIConsumer, lticonsumer\nimport base64\nimport six\nimport uuid\nimport imghdr\n\n\nclass Base64ImageField(serializers.ImageField):\n\n    def to_internal_value(self, data):\n        _, data = self.update(data)\n        return super(Base64ImageField, self).to_internal_value(data)\n\n    def update(self, data):\n        if isinstance(data, six.string_types):\n            if 'data:' in data and ';base64,' in data:\n                header, data = data.split(';base64,')\n        try:\n            decoded_file = base64.b64decode(data)\n        except TypeError:\n            self.fail('invalid_image')\n        file_name = str(uuid.uuid4())\n        file_extension = imghdr.what(file_name, decoded_file)\n        complete_file_name = \"%s.%s\" % (file_name, file_extension,)\n        data = ContentFile(decoded_file, name=complete_file_name)\n        return complete_file_name, data\n\n\nclass StateSaveSerializer(serializers.ModelSerializer):\n    base64_image = Base64ImageField(max_length=None, use_url=True)\n    esim_libraries = LibrarySerializer(many=True, required=False)\n    project_version = serializers.CharField(read_only=True,\n                                            source='project.active_version')\n    project_branch = serializers.CharField(read_only=True,\n                                           source='project.active_branch')\n    is_reported = serializers.BooleanField(read_only=True,\n                                           source='project.is_reported')\n    lti_id = serializers.SerializerMethodField()\n\n    class Meta:\n        model = StateSave\n\n        fields = ('save_time', 'save_id', 'data_dump', 'name', 'description',\n                  'owner', 'shared', 'base64_image', 'create_time', 'version',\n                  'branch', 'is_arduino', 'esim_libraries', 'project_id',\n                  'project_version', 'project_branch', 'is_reported',\n                  'id', 'lti_id', 'is_submission')\n\n    def get_lti_id(self, obj):\n        save_id = obj.save_id\n        ltis = lticonsumer.objects.filter(model_schematic__save_id=save_id)\n        arduinoLTIs = ArduinLTIConsumer.objects.filter(\n            model_schematic__save_id=save_id)\n        if ltis.exists():\n            return ltis[0].id\n        elif arduinoLTIs.exists():\n            return arduinoLTIs[0].id\n        else:\n            return None\n\n\nclass SaveListSerializer(serializers.ModelSerializer):\n    base64_image = Base64ImageField(max_length=None, use_url=True)\n    esim_libraries = LibrarySerializer(many=True, required=False)\n    project_id = serializers.CharField(read_only=True,\n                                       source='project.project_id')\n    project_version = serializers.CharField(read_only=True,\n                                            source='project.active_version')\n    project_branch = serializers.CharField(read_only=True,\n                                           source='project.active_branch')\n    is_reported = serializers.BooleanField(read_only=True,\n                                           source='project.is_reported')\n    lti_id = serializers.SerializerMethodField()\n\n    class Meta:\n        model = StateSave\n        fields = ('save_time', 'save_id', 'name', 'description',\n                  'shared', 'base64_image', 'create_time', 'version',\n                  'branch', 'esim_libraries', 'project_id', 'project_version',\n                  'project_branch', 'is_reported', 'id', 'lti_id',\n                  'is_submission')\n\n    def get_lti_id(self, obj):\n        save_id = obj.save_id\n        ltis = lticonsumer.objects.filter(model_schematic__save_id=save_id)\n        arduinoLTIs = ArduinLTIConsumer.objects.filter(\n            model_schematic__save_id=save_id)\n        if ltis.exists():\n            return ltis[0].id\n        elif arduinoLTIs.exists():\n            return arduinoLTIs[0].id\n        else:\n            return None\n\n\nclass GallerySerializer(serializers.ModelSerializer):\n\n    media = Base64ImageField(max_length=None, use_url=True)\n    esim_libraries = LibrarySerializer(many=True, required=False)\n\n    class Meta:\n        model = Gallery\n        fields = (\n            'save_id', 'data_dump', 'name',\n            'description', 'media', 'shared', 'esim_libraries', 'is_arduino'\n            )\n\n\nclass ArduinoModelSimulationDataSerializer(serializers.ModelSerializer):\n    # save_id = serializers.IntegerField()\n    result = serializers.CharField()\n\n    class Meta:\n        model = ArduinoModelSimulationData\n        fields = ('id', 'save_id', 'result', )\n"
  },
  {
    "path": "esim-cloud-backend/saveAPI/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "esim-cloud-backend/saveAPI/urls.py",
    "content": "\"\"\"\n\nesimCloud URL Configuration\n\n\"\"\"\nfrom django.urls import path\nfrom saveAPI import views as saveAPI_views\nfrom rest_framework.routers import DefaultRouter\n\nrouter = DefaultRouter()\nrouter.register(r'save/search', saveAPI_views.SaveSearchViewSet,\n                basename='SaveSearch')\n\nurlpatterns = [\n    path('save', saveAPI_views.StateSaveView.as_view(),\n         name='saveState'),\n\n    path('save/list', saveAPI_views.UserSavesView.as_view(),\n         name='listSaves'),\n\n    path('save/arduino/list', saveAPI_views.ArduinoSaveList.as_view(),\n         name='ArduinoSaveList'),\n\n    path(\"save/gallery\", saveAPI_views.GalleryView.as_view(),\n         name=\"getGallery\"),\n\n    path('save/gallery/<str:save_id>',\n         saveAPI_views.GalleryFetchSaveDeleteView.as_view(),\n         name='fetchGallerySchematic'),\n\n    path('save/<uuid:save_id>/<str:version>/<str:branch>',\n         saveAPI_views.StateFetchUpdateView.as_view(), name='fetchState'),\n\n    path('save/copy/<str:version>/<uuid:save_id>/<str:branch>',\n         saveAPI_views.CopyStateView.as_view(), name='copyState'),\n\n    path(\n        'save/<uuid:save_id>/sharing/<str:sharing>/<str:version>/<str:branch>',\n        saveAPI_views.StateShareView.as_view(), name='shareState'),\n\n    path(\"save/versions/<uuid:save_id>\",\n         saveAPI_views.StateSaveAllVersions.as_view(), name=\"listAllVersions\"),\n\n    path(\"save/versions/<str:version>/<uuid:save_id>/<str:branch>\",\n         saveAPI_views.GetStateSpecificVersion.as_view(),\n         name=\"getSpecificVersion\"),\n\n    path(\"save/versions/<uuid:save_id>/<str:branch>\",\n         saveAPI_views.DeleteBranch.as_view(),\n         name=\"deleteBranch\"),\n\n    path(\"save/<uuid:save_id>\", saveAPI_views.DeleteCircuit.as_view(),\n         name=\"deleteCircuit\"),\n\n    path(\"save/arduinodata/<int:save_id>\",\n         saveAPI_views.ArduinoModelSimulationDataView.as_view(),\n         name=\"uploadSimulationData\"),\n\n    path(\"save/arduinodata/<uuid:save_id>/<str:version>/<str:branch>\",\n         saveAPI_views.ArduinoModelSimulationDataView.as_view(),\n         name=\"uploadSimulationData\")\n\n]\n\nurlpatterns += router.urls\n"
  },
  {
    "path": "esim-cloud-backend/saveAPI/views.py",
    "content": "# from django.core.files.base import File\nfrom glob import escape\nfrom http.client import responses\nfrom django.http import JsonResponse\nfrom numpy import save\nimport django_filters\nfrom django_filters import rest_framework as filters\nfrom .serializers import ArduinoModelSimulationDataSerializer,\\\n    StateSaveSerializer, SaveListSerializer, \\\n    GallerySerializer\nfrom .serializers import Base64ImageField\nfrom rest_framework.permissions import AllowAny, IsAuthenticated\nfrom rest_framework.parsers import FormParser, JSONParser\nfrom rest_framework.views import APIView\nfrom rest_framework.response import Response\n# from rest_framework.generics import ListAPIView\nfrom rest_framework import status\nfrom drf_yasg.utils import swagger_auto_schema\nfrom .models import ArduinoModelSimulationData, StateSave, Gallery\nfrom workflowAPI.models import Permission\nfrom publishAPI.models import Project\nfrom ltiAPI.models import Submission\nfrom rest_framework import viewsets\nimport uuid\nfrom django.contrib.auth import get_user_model\nimport logging\nimport traceback\nimport json\nimport ast\n\nlogger = logging.getLogger(__name__)\n\n\nclass StateSaveView(APIView):\n    '''\n    API to save the state of project to db which can be loaded or shared later\n    Note: this is different from SnapshotSave which stores images\n    THIS WILL ESCAPE DOUBLE QUOTES\n    '''\n\n    # Permissions should be validated here\n    permission_classes = (AllowAny,)\n    # parser_classes = (FormParser,)\n\n    @swagger_auto_schema(request_body=StateSaveSerializer)\n    def post(self, request, *args, **kwargs):\n        print(\"Getting Saved State\")\n\n        logger.info('Got POST for state save ')\n        esim_libraries = None\n        if request.data.get('esim_libraries'):\n            esim_libraries = json.loads(request.data.get('esim_libraries'))\n        try:\n            queryset = StateSave.objects.get(\n                save_id=request.data.get(\"save_id\", None),\n                branch=request.data.get(\"branch\"),\n                version=request.data.get(\"version\"))\n            serializer = StateSaveSerializer(data=request.data)\n            if serializer.is_valid():\n                img = Base64ImageField(max_length=None, use_url=True)\n                filename, content = img.update(request.data['base64_image'])\n                queryset.data_dump = request.data.get(\"data_dump\")\n                queryset.save()\n                queryset.base64_image.save(filename, content)\n                return Response(data=serializer.data,\n                                status=status.HTTP_200_OK)\n            else:\n                return Response(data=serializer.errors,\n                                status=status.HTTP_400_BAD_REQUEST)\n        except StateSave.DoesNotExist:\n            try:\n                queryset = StateSave.objects.get(\n                    save_id=request.data.get(\"save_id\", None),\n                    data_dump=request.data[\"data_dump\"],\n                    branch=request.data[\"branch\"])\n                serializer = StateSaveSerializer(data=request.data)\n                if serializer.is_valid():\n                    queryset.name = serializer.data[\"name\"]\n                    queryset.description = serializer.data[\"description\"]\n                    queryset.save()\n                    response = serializer.data\n                    response['duplicate'] = True\n                    response['owner'] = queryset.owner.username\n                    return Response(response)\n                return Response(serializer.errors,\n                                status=status.HTTP_400_BAD_REQUEST)\n            except StateSave.DoesNotExist:\n                img = Base64ImageField(max_length=None, use_url=True)\n                filename, content = img.update(request.data['base64_image'])\n                try:\n                    project = Project.objects.get(\n                        project_id=request.data.get('project_id', None))\n                    state_save = StateSave(\n                        data_dump=request.data.get('data_dump'),\n                        description=request.data.get('description'),\n                        name=request.data.get('name'),\n                        owner=request.user if request.user.is_authenticated else None,  # noqa\n                        branch=request.data.get('branch'),\n                        version=request.data.get('version'),\n                        project=project,\n                        shared=True,\n                        is_arduino=True if esim_libraries is None else False,\n                    )\n                except:  # noqa\n                    state_save = StateSave(\n                        data_dump=request.data.get('data_dump'),\n                        description=request.data.get('description'),\n                        name=request.data.get('name'),\n                        owner=request.user if request.user.is_authenticated else None,  # noqa\n                        branch=request.data.get('branch'),\n                        version=request.data.get('version'),\n                        is_arduino=True if esim_libraries is None else False,\n                    )\n                if request.data.get('save_id'):\n                    state_save.save_id = request.data.get('save_id')\n                state_save.base64_image.save(filename, content)\n                if esim_libraries:\n                    state_save.esim_libraries.set(esim_libraries)\n                try:\n                    state_save.save()\n                    return Response(StateSaveSerializer(state_save).data)\n                except Exception:\n                    return Response(status=status.HTTP_400_BAD_REQUEST)\n\n\nclass CopyStateView(APIView):\n    permission_classes = (IsAuthenticated,)\n    parser_classes = (FormParser, JSONParser)\n\n    def post(self, request, save_id, version, branch):\n        if isinstance(save_id, uuid.UUID):\n            # Check for permissions and sharing settings here\n            try:\n                saved_state = StateSave.objects.get(\n                    save_id=save_id, branch=branch, version=version)\n            except StateSave.DoesNotExist:\n                return Response({'error': 'Does not Exist'},\n                                status=status.HTTP_404_NOT_FOUND)\n            copy_state = StateSave(name=saved_state.name,\n                                   description=saved_state.description,\n                                   data_dump=saved_state.data_dump,\n                                   base64_image=saved_state.base64_image,\n                                   is_arduino=saved_state.is_arduino,\n                                   owner=self.request.user, branch='master',\n                                   version=version)\n            copy_state.save()\n            copy_state.esim_libraries.set(saved_state.esim_libraries.all())\n            copy_state.save()\n            return Response(\n                {\"save_id\": copy_state.save_id, \"version\": copy_state.version,\n                 \"branch\": copy_state.branch})\n\n\nclass StateFetchUpdateView(APIView):\n    \"\"\"\n    Returns Saved data for given save id ,\n    Only user who saved the state can access / update it\n    THIS WILL ESCAPE DOUBLE QUOTES\n\n    \"\"\"\n    permission_classes = (AllowAny,)\n    parser_classes = (FormParser, JSONParser)\n    methods = ['GET']\n\n    @swagger_auto_schema(responses={200: StateSaveSerializer})\n    def get(self, request, save_id, version, branch):\n\n        if isinstance(save_id, uuid.UUID):\n            # Check for permissions and sharing settings here\n            try:\n                saved_state = StateSave.objects.get(\n                    save_id=save_id, version=version, branch=branch)\n            except StateSave.DoesNotExist:\n                return Response({'error': 'Does not Exist'},\n                                status=status.HTTP_404_NOT_FOUND)\n            # Verifies owner\n            if self.request.user != saved_state.owner and not saved_state.shared:  # noqa\n                print(\"Here\")\n                return Response({'error': 'not the owner and not shared'},\n                                status=status.HTTP_401_UNAUTHORIZED)\n            try:\n                serialized = StateSaveSerializer(\n                    saved_state, context={'request': request})\n                User = get_user_model()\n                try:\n                    owner_name = User.objects.get(\n                        id=serialized.data.get('owner'))\n                    data = {}\n                    data.update(serialized.data)\n                    data['owner'] = owner_name.username\n                except User.DoesNotExist:\n                    data = {}\n                    data.update(serialized.data)\n                    data['owner'] = None\n                return Response(data)\n            except Exception:\n                traceback.print_exc()\n                return Response({'error': 'Not Able To Serialize'},\n                                status=status.HTTP_400_BAD_REQUEST)\n        else:\n            return Response({'error': 'Invalid sharing state'},\n                            status=status.HTTP_400_BAD_REQUEST)\n\n    @swagger_auto_schema(responses={200: StateSaveSerializer})\n    def post(self, request, save_id):\n        if isinstance(save_id, uuid.UUID):\n            # Check for permissions and sharing settings here\n            try:\n                saved_state = StateSave.objects.get(save_id=save_id)\n            except StateSave.DoesNotExist:\n                return Response({'error': 'Does not Exist'},\n                                status=status.HTTP_404_NOT_FOUND)\n\n            # Verifies owner\n            if self.request.user != saved_state.owner:  # noqa\n                return Response({'error': 'not the owner and not shared'},\n                                status=status.HTTP_401_UNAUTHORIZED)\n\n            if not request.data['data_dump'] and not request.data['shared']:\n                return Response({'error': 'not a valid PUT request'},\n                                status=status.HTTP_406_NOT_ACCEPTABLE)\n\n            try:\n                # if data dump, shared,name and description needs to be updated\n                if 'data_dump' in request.data:\n                    saved_state.data_dump = request.data['data_dump']\n                if 'shared' in request.data:\n                    saved_state.shared = bool(request.data['shared'])\n                if 'name' in request.data:\n                    saved_state.name = request.data['name']\n                if 'description' in request.data:\n                    saved_state.description = request.data['description']\n                # if thumbnail needs to be updated\n                if 'base64_image' in request.data:\n                    img = Base64ImageField(max_length=None, use_url=True)\n                    filename, content = img.update(\n                        request.data['base64_image'])\n                    saved_state.base64_image.save(filename, content)\n                if 'esim_libraries' in request.data:\n                    esim_libraries = json.loads(\n                        request.data.get('esim_libraries'))\n                    saved_state.esim_libraries.set(esim_libraries)\n                saved_state.save()\n                serialized = SaveListSerializer(saved_state)\n                return Response(serialized.data)\n            except Exception:\n                return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)\n        else:\n            return Response({'error': 'Invalid sharing state'},\n                            status=status.HTTP_400_BAD_REQUEST)\n\n    @swagger_auto_schema(responses={200: StateSaveSerializer})\n    def delete(self, request, save_id, version, branch):\n        if isinstance(save_id, uuid.UUID):\n            try:\n                saved_state = StateSave.objects.get(\n                    save_id=save_id, version=version, branch=branch,\n                    owner=self.request.user)\n            except StateSave.DoesNotExist:\n                return Response({'error': 'Does not Exist'},\n                                status=status.HTTP_404_NOT_FOUND)\n            # Verifies owner\n            if (saved_state.project is None) or \\\n                    (saved_state.project is not None and\n                     (saved_state.project.active_branch != branch or\n                      saved_state.project.active_version != version)) or \\\n                    (saved_state.project is not None and\n                     Permission.objects.filter(\n                         role__in=self.request.user.groups.all(),\n                         del_own_states=saved_state.project.state).exists()):\n                pass\n            else:\n                return Response(status=status.HTTP_400_BAD_REQUEST)\n            saved_state.delete()\n            return Response({'done': True})\n        else:\n            return Response({'error': 'Invalid sharing state'},\n                            status=status.HTTP_400_BAD_REQUEST)\n\n\nclass StateShareView(APIView):\n    \"\"\"\n    Enables sharing for the given saved state\n    Note: Only authorized user can do this\n\n    \"\"\"\n    permission_classes = (AllowAny,)\n    methods = ['GET']\n\n    @swagger_auto_schema(responses={200: StateSaveSerializer})\n    def post(self, request, save_id, sharing, version, branch):\n\n        if isinstance(save_id, uuid.UUID):\n            # Check for permissions and sharing settings here\n            try:\n                saved_state = StateSave.objects.get(\n                    save_id=save_id, version=version, branch=branch)\n            except StateSave.DoesNotExist:\n                return Response({'error': 'Does not Exist'},\n                                status=status.HTTP_404_NOT_FOUND)\n\n            # Verifies owner\n            if self.request.user != saved_state.owner:  # noqa\n                return Response({'error': 'Not the owner'},\n                                status=status.HTTP_401_UNAUTHORIZED)\n            try:\n                if sharing == 'on':\n                    saved_state.shared = True\n                elif sharing == 'off':\n                    saved_state.shared = False\n                else:\n                    return Response({'error': 'Invalid sharing state'},\n                                    status=status.HTTP_400_BAD_REQUEST)\n                saved_state.save()\n                serialized = StateSaveSerializer(saved_state)\n                return Response(serialized.data)\n            except Exception:\n                return Response(serialized.error)\n        else:\n            return Response({'error': 'Invalid sharing state'},\n                            status=status.HTTP_400_BAD_REQUEST)\n\n\nclass UserSavesView(APIView):\n    \"\"\"\n    Returns Saved data for given username,\n    Only user who saved the state can access it\n    THIS WILL ESCAPE DOUBLE QUOTES\n\n    \"\"\"\n    permission_classes = (IsAuthenticated,)\n    parser_classes = (FormParser, JSONParser)\n    methods = ['GET']\n\n    @swagger_auto_schema(responses={200: StateSaveSerializer})\n    def get(self, request):\n        saved_state = StateSave.objects.filter(\n            owner=self.request.user, is_arduino=False).order_by(\n            \"save_id\", \"-save_time\").distinct(\"save_id\")\n        # Uncomment this if submissions are not required at the dashboard\n        # submissions = Submission.objects.filter(student=self.request.user)\n        # for submission in submissions:\n        #     saved_state = saved_state.exclude(save_id=submission.schematic.save_id)  # noqa\n        try:\n            serialized = StateSaveSerializer(saved_state, many=True)\n            return Response(serialized.data)\n        except Exception:\n            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)\n\n\nclass ArduinoSaveList(APIView):\n    \"\"\"\n    List of Arduino Projects\n    \"\"\"\n    permission_classes = (IsAuthenticated,)\n    parser_classes = (FormParser, JSONParser)\n    methods = ['GET']\n\n    @swagger_auto_schema(responses={200: StateSaveSerializer})\n    def get(self, request):\n        saved_state = StateSave.objects.filter(\n            owner=self.request.user, is_arduino=True).order_by('-save_time')\n        try:\n            serialized = SaveListSerializer(\n                saved_state, many=True, context={'request': request})\n            return Response(serialized.data)\n        except Exception:\n            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)\n\n\nclass SaveSearchFilterSet(django_filters.FilterSet):\n    class Meta:\n        model = StateSave\n        fields = {\n            'name': ['icontains'],\n            'description': ['icontains'],\n            'save_time': ['icontains'],\n            'create_time': ['icontains'],\n            'is_arduino': ['exact']\n        }\n\n\nclass SaveSearchViewSet(viewsets.ReadOnlyModelViewSet):\n    \"\"\"\n    Search Project\n    \"\"\"\n\n    def get_queryset(self):\n        queryset = StateSave.objects.filter(\n            owner=self.request.user).order_by('-save_time')\n        return queryset\n\n    serializer_class = SaveListSerializer\n    filter_backends = (filters.DjangoFilterBackend,)\n    filterset_class = SaveSearchFilterSet\n\n\nclass StateSaveAllVersions(APIView):\n    serializer_class = SaveListSerializer\n    permission_classes = (IsAuthenticated,)\n\n    @swagger_auto_schema(responses={200: SaveListSerializer})\n    def get(self, request, save_id):\n        queryset = StateSave.objects.filter(\n            owner=self.request.user, save_id=save_id)\n        try:\n            serialized = SaveListSerializer(\n                queryset, many=True, context={'request': request})\n            return Response(serialized.data)\n        except Exception:\n            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)\n\n\nclass GetStateSpecificVersion(APIView):\n    serializer_class = StateSaveSerializer\n    permission_classes = (IsAuthenticated,)\n\n    @swagger_auto_schema(responses={200: StateSaveSerializer})\n    def get(self, request, save_id, version, branch):\n        queryset = StateSave.objects.get(\n            save_id=save_id, version=version, owner=self.request.user,\n            branch=branch)\n        try:\n            serialized = StateSaveSerializer(\n                queryset)\n            return Response(serialized.data)\n        except Exception:\n            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)\n\n    def delete(self, request, save_id, version, branch):\n        try:\n            queryset = StateSave.objects.get(\n                save_id=save_id, version=version, owner=self.request.user,\n                branch=branch)\n            queryset.delete()\n            return Response(data=None, status=status.HTTP_204_NO_CONTENT)\n        except StateSave.DoesNotExist:\n            return Response({\"error\": \"Circuit not found\"},\n                            status=status.HTTP_404_NOT_FOUND)\n\n\nclass DeleteBranch(APIView):\n    permission_classes = (IsAuthenticated,)\n\n    def delete(self, request, save_id, branch):\n        try:\n            queryset = StateSave.objects.filter(\n                save_id=save_id,\n                branch=branch,\n                owner=self.request.user\n            )\n            if queryset[0].project is None or \\\n                    queryset[0].project.active_branch != branch:\n                queryset.delete()\n                return Response(data=None, status=status.HTTP_204_NO_CONTENT)\n            else:\n                return Response(data=None, status=status.HTTP_400_BAD_REQUEST)\n        except StateSave.DoesNotExist:\n            return Response({\"error\": \"circuit not found\"},\n                            status=status.HTTP_404_NOT_FOUND)\n\n\nclass DeleteCircuit(APIView):\n\n    permission_classes = (IsAuthenticated,)\n\n    def delete(self, request, save_id):\n        try:\n            queryset = StateSave.objects.filter(\n                save_id=save_id,\n                owner=self.request.user\n            )\n            if queryset[0].project is None:\n                queryset.delete()\n                return Response(data=None, status=status.HTTP_204_NO_CONTENT)\n            else:\n                return Response(data=None, status=status.HTTP_400_BAD_REQUEST)\n        except StateSave.DoesNotExist:\n            return Response({\"error\": \"circuit not found\"},\n                            status=status.HTTP_404_NOT_FOUND)\n\n\nclass GalleryView(APIView):\n    \"\"\"\n    Esim Gallery\n\n    \"\"\"\n    permission_classes = (AllowAny,)\n    parser_classes = (FormParser, JSONParser)\n    methods = ['GET']\n\n    @swagger_auto_schema(responses={200: GallerySerializer})\n    def get(self, request):\n        if (request.GET.get(\"is_arduino\") == \"true\"):\n            galleryset = Gallery.objects.filter(is_arduino=True)\n        else:\n            galleryset = Gallery.objects.filter(is_arduino=False)\n        try:\n            serialized = GallerySerializer(galleryset, many=True)\n            return Response(serialized.data)\n        except Exception:\n            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)\n\n\nclass GalleryFetchSaveDeleteView(APIView):\n\n    \"\"\"\n    Returns Saved data for given save id,\n    Only staff can add / delete it\n    THIS WILL ESCAPE DOUBLE QUOTES\n\n    \"\"\"\n    # permission_classes = (AllowAny,)\n    parser_classes = (FormParser, JSONParser)\n    methods = ['GET']\n\n    @swagger_auto_schema(responses={200: GallerySerializer})\n    def get(self, request, save_id):\n\n        try:\n            saved_state = Gallery.objects.get(\n                save_id=save_id)\n        except Gallery.DoesNotExist:\n            return Response({'error': 'Does not Exist'},\n                            status=status.HTTP_404_NOT_FOUND)\n        try:\n            serialized = GallerySerializer(\n                saved_state, context={'request': request})\n            data = {}\n            data.update(serialized.data)\n            return Response(data)\n        except Exception:\n            traceback.print_exc()\n            return Response({'error': 'Not Able To Serialize'},\n                            status=status.HTTP_400_BAD_REQUEST)\n\n    @swagger_auto_schema(responses={200: GallerySerializer})\n    def post(self, request, save_id):\n\n        # Checking user roles\n        userRoles = self.request.user.groups.all()\n        staff = False\n        for userRole in userRoles:\n            if (self.request.user and self.request.user.is_authenticated and\n                    userRole.customgroup and\n                    userRole.customgroup.is_type_staff):\n                staff = True\n        if not staff:\n            return Response({'error': 'Not the owner'},\n                            status=status.HTTP_401_UNAUTHORIZED)\n        saved_state = Gallery()\n        if not (request.data['data_dump'] and request.data['media'] and\n                request.data['save_id']):\n            return Response({'error': 'not a valid POST request'},\n                            status=status.HTTP_406_NOT_ACCEPTABLE)\n\n        # saves to gallery\n        try:\n            if 'save_id' in request.data:\n                saved_state.save_id = request.data['save_id']\n            if 'is_arduino' in request.data:\n                saved_state.is_arduino = request.data['is_arduino']\n            if 'data_dump' in request.data:\n                saved_state.data_dump = request.data['data_dump']\n            if 'shared' in request.data:\n                saved_state.shared = bool(request.data['shared'])\n            if 'name' in request.data:\n                saved_state.name = request.data['name']\n            if 'description' in request.data:\n                saved_state.description = request.data['description']\n            if 'media' in request.data:\n                img = Base64ImageField(max_length=None, use_url=True)\n                filename, content = img.update(\n                    request.data['media'])\n                saved_state.media.save(filename, content)\n            if 'esim_libraries' in request.data:\n                esim_libraries = json.loads(\n                    request.data.get('esim_libraries'))\n                saved_state.esim_libraries.set(esim_libraries)\n            saved_state.save()\n            serialized = GallerySerializer(saved_state)\n            return Response(serialized.data)\n        except Exception:\n            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)\n\n    @swagger_auto_schema(responses={200: GallerySerializer})\n    def delete(self, request, save_id):\n        try:\n            # Checking user roles\n            userRoles = self.request.user.groups.all()\n            staff = False\n            for userRole in userRoles:\n                if (self.request.user and self.request.user.is_authenticated\n                    and userRole.customgroup and\n                        userRole.customgroup.is_type_staff):\n                    staff = True\n            if not staff:\n                return Response({'error': 'Not the owner'},\n                                status=status.HTTP_401_UNAUTHORIZED)\n            # Deltes from gallery\n            try:\n                saved_state = Gallery.objects.get(\n                    save_id=save_id)\n            except Gallery.DoesNotExist:\n                return Response({'error': 'Does not Exist'},\n                                status=status.HTTP_404_NOT_FOUND)\n            saved_state.delete()\n            return Response({'done': True})\n        except Exception:\n            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)\n\n\nclass ArduinoModelSimulationDataView(APIView):\n    \"\"\"\n    Simulation Data from Arduino\n    \"\"\"\n\n    permission_classes = (AllowAny,)\n    methods = ['GET', 'POST']\n\n    @swagger_auto_schema(request_body=ArduinoModelSimulationDataSerializer)\n    def post(self, request, save_id):\n        try:\n            circuit = StateSave.objects.get(id=save_id)\n        except StateSave.DoesNotExist:\n            return Response({\"error\": \"Circuit not found\"},\n                            status=status.HTTP_404_NOT_FOUND)\n        if(not(len(request.data))):\n            return Response({\"error\": \"Simulation data not passed\"},\n                            status=status.HTTP_400_BAD_REQUEST)\n        print(request.data)\n        try:\n            ArduinoModelSimulationData(save_id=circuit,\n                                       result=str(request.data)).save()\n        except Exception as e:\n            return Response(status=500)\n        else:\n            return Response(status=200)\n\n    def get(self, request, save_id, version, branch):\n        try:\n            circuit = StateSave.objects.get(\n                save_id=save_id,\n                version=version,\n                branch=branch\n                )\n        except StateSave.DoesNotExist:\n            return Response({\"error\": \"Circuit not found\"},\n                            status=status.HTTP_404_NOT_FOUND)\n        try:\n            queryset = ArduinoModelSimulationData.objects.filter(\n                save_id=circuit.id)\n            serial = ArduinoModelSimulationDataSerializer(queryset, many=True)\n            return Response(serial.data, status=200)\n        except Exception as e:\n            print(e)\n            return Response({\"error\": \"No simulation data found\"},\n                            status=status.HTTP_404_NOT_FOUND)\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/__init__.py",
    "content": ""
  },
  {
    "path": "esim-cloud-backend/simulationAPI/admin.py",
    "content": "from django.contrib import admin\nfrom .models import runtimeStat, Limit, simulation\nimport json\nfrom django.core.serializers.json import DjangoJSONEncoder\nfrom django.db.models import Max\nfrom django.http import HttpResponseRedirect\n\n\nclass outputAdmin(admin.ModelAdmin):\n    list_display = ['simulation_type', 'task_id', 'owner']\n\n\nclass runtimStatAdmin(admin.ModelAdmin):\n\n    list_display = ('exec_time', 'qty')\n    readonly_fields = ('exec_time', 'qty')\n\n    change_list_template = 'admin/runtimeStats.html'\n    qty_hierarchy = 'qty'\n\n    def has_add_permission(self, request, obj=None):\n        return False\n\n    def changelist_view(self, request, extra_context=None):\n        response = super().changelist_view(\n            request,\n            extra_context=extra_context,\n        )\n\n        try:\n            qs = response.context_data['cl'].queryset\n        except (AttributeError, KeyError):\n            return response\n\n        total = 0\n        for i in qs:\n            total += i.qty\n\n        response.context_data['summary'] = list(\n            qs\n            .values('exec_time', 'qty')\n            .order_by('-qty')\n        )\n        response.context_data['summary_total'] = total\n\n        chart_data = (\n            runtimeStat.objects\n            .values(\"exec_time\")\n            .annotate(y=Max(\"qty\"))\n            .order_by(\"exec_time\")\n        )\n        \"\"\"\n        Since 3s is the default time limit, it will be shown in the\n        TIME_LIMIT page in admin in case there are no changes.\n        \"\"\"\n        TIME_LIMIT = 0\n        limits = Limit.objects.all()\n        if limits.exists():\n            TIME_LIMIT = Limit.objects.all()[0].timeLimit\n        response.context_data['TIME_LIMIT'] = TIME_LIMIT\n        as_json = json.dumps(list(chart_data), cls=DjangoJSONEncoder)\n        extra_context = extra_context or {\"chart_data\": as_json}\n        response.context_data.update(extra_context)\n\n        if request.method == \"POST\":\n            limit = request.POST.get('limit')\n            limits = Limit.objects.all()\n            if limits.exists():\n                lim = Limit.objects.all().first()\n                lim.timeLimit = limit\n                lim.save()\n            else:\n                lim = Limit(timeLimit=limit)\n                lim.save()\n            response.context_data['TIME_LIMIT'] = limit\n            return HttpResponseRedirect(\n                \"/api/admin/simulationAPI/runtimestat/\"\n            )\n        return response\n\n\nadmin.site.register(runtimeStat, runtimStatAdmin)\nadmin.site.register(simulation, outputAdmin)\n# admin.site.register(Limit)\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass SimulationapiConfig(AppConfig):\n    name = 'simulationAPI'\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/dbrouters.py",
    "content": "class mongoRouter:\n    \"\"\"\n    A router to control all database operations on models in the\n    auth and contenttypes applications.\n    \"\"\"\n    route_app_labels = {'simulationAPI'}\n\n    def db_for_read(self, model, **hints):\n        \"\"\"\n        Attempts to read auth and contenttypes models go to auth_db.\n        \"\"\"\n        if model._meta.app_label in self.route_app_labels:\n            return 'mongodb'\n        return None\n\n    def db_for_write(self, model, **hints):\n        \"\"\"\n        Attempts to write auth and contenttypes models go to auth_db.\n        \"\"\"\n        if model._meta.app_label in self.route_app_labels:\n            return 'mongodb'\n        return None\n\n    def allow_relation(self, obj1, obj2, **hints):\n        \"\"\"\n        Allow relations if a model in the auth or contenttypes apps is\n        involved.\n        \"\"\"\n        if (\n            obj1._meta.app_label in self.route_app_labels or\n            obj2._meta.app_label in self.route_app_labels\n        ):\n            return True\n        return None\n\n    def allow_migrate(self, db, app_label, model_name=None, **hints):\n        \"\"\"\n        Make sure the auth and contenttypes apps only appear in the\n        'auth_db' database.\n        \"\"\"\n        if app_label in self.route_app_labels:\n            return db == 'mongodb'\n        return None\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/helpers/ngspice_helper.py",
    "content": "from celery.exceptions import SoftTimeLimitExceeded\nimport os\nimport logging\nimport subprocess\nfrom pathlib import Path\nfrom django.conf import settings\nfrom .parse import extract_data_from_ngspice_output\nlogger = logging.getLogger(__name__)\n\n\nclass CannotRunSpice(Exception):\n    \"\"\"Base class for exceptions in this module.\"\"\"\n    pass\n\n\n\"\"\"\nNote: If there is no valid data, the error text is propagated\nthrough output. However, the celery task is passed.\n\"\"\"\n\n\ndef ExecNetlist(filepath, file_id):\n    if not os.path.isfile(filepath):\n        raise IOError\n    try:\n\n        current_dir = settings.MEDIA_ROOT+'/'+str(file_id)\n        # Make Unique Directory for simulation to run\n        Path(current_dir).mkdir(parents=True, exist_ok=True)\n        os.chdir(current_dir)\n        logger.info('will run ngSpice command')\n        proc = subprocess.Popen(['ngspice', '-ab', filepath],\n                                stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n                                cwd=current_dir)\n        stdout, stderr = proc.communicate()\n        logger.info('Ran ngSpice command')\n        if proc.returncode not in [0, 1]:\n            logger.error('ngspice error encountered')\n            logger.error(stderr)\n            logger.error(proc.returncode)\n            logger.error(stdout)\n            target = os.listdir(current_dir)\n            for item in target:\n                if (item.endswith(\".txt\")):\n                    os.remove(os.path.join('.', item))\n            raise CannotRunSpice(\"ngspice exited with error\")\n        else:\n            logger.info('Ran ngSpice')\n\n        logger.info(\"Reading Output\")\n        if os.path.isfile(current_dir+'/data.txt'):\n            output = extract_data_from_ngspice_output(current_dir+'/data.txt')\n            if output[\"data\"]:\n                \"\"\"\n                This means output data file exists and has\n                data parsed by parse.py\n                \"\"\"\n                pass\n            else:\n                \"\"\"\n                if the output is blank, the err is logged in stderr\n                \"\"\"\n                tmp = stderr.decode(\"utf-8\")\n                foo = '{}'.format(tmp)\n                output = {'fail': foo}\n        else:\n            out = stdout.decode(\"utf-8\")\n            err = stderr.decode(\"utf-8\")\n            foo = '{}'.format(out+err)\n            output = {'fail': foo}\n        logger.info('output from ngspice_helper.py')\n        logger.info(stderr)\n        # logger.info(output)\n        logger.info(stdout)\n        return output\n    except SoftTimeLimitExceeded:\n        output = {'fail': \"time limit exceeded\"}\n        print('tle')\n        return output\n    except Exception as e:\n        logger.exception('Encountered Exception:')\n        logger.exception(e)\n    finally:\n        target = os.listdir(current_dir)\n        os.remove(filepath)\n        for item in target:\n            os.remove(os.path.join(current_dir, item))\n        os.rmdir(current_dir)\n        logger.info('Deleted Files')\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/helpers/parse.py",
    "content": "import re\nimport sys\n\n\ndef extract_data_from_ngspice_output(pathToFile):\n    \"\"\" Parses the output file generated by ngspice and\n    returns a json containing points to plot graph.\n    \"\"\"\n\n    try:\n        with open(pathToFile, 'r') as f:\n            f_contents = f.readlines()\n            graph = False\n\n            curernt_headers = []\n            total_number_of_tables = 0\n            if(len(f_contents) > 3):\n                if('---' in f_contents[2]):\n                    graph = True\n\n            if(not graph):\n                json_data = {\"data\": [], \"graph\": \"false\"}\n                for line in f_contents:\n                    contents_of_line = line.split()\n                    json_data[\"data\"].append(contents_of_line)\n\n            else:\n                json_data = {\"data\": [], \"graph\": \"true\"}\n                for line in f_contents:\n                    contents_of_line = line.split()\n\n                    if('Index' in contents_of_line):\n                        # line_set = remove_duplicate_items_from_list(\n                        #     contents_of_line)\n                        line_set = contents_of_line\n\n                        if(line_set != curernt_headers):\n                            curernt_headers = line_set\n                            json_data[\"data\"].append(\n                                {\"labels\": [], \"x\": [], \"y\": []})\n                            index = len(json_data[\"data\"]) - 1\n                            for x in range(2, len(curernt_headers)):\n                                json_data[\"data\"][index][\"y\"].append([])\n\n                            for x in range(1, len(curernt_headers)):\n                                json_data[\"data\"][index][\"labels\"].append(\n                                    curernt_headers[x])\n                                total_number_of_tables += 1\n\n                    else:\n                        m = re.match('[0-9]+', line)\n                        if(m):\n                            index = len(json_data[\"data\"]) - 1\n                            data = json_data[\"data\"][index]\n                            data[\"x\"].append(contents_of_line[1])\n\n                            for x in range(len(data[\"y\"])):\n                                data[\"y\"][x].append(contents_of_line[x+2])\n                json_data[\"total_number_of_tables\"] = total_number_of_tables -\\\n                    len(json_data[\"data\"])\n        return json_data\n\n    except IOError as e:\n        print('Cannot Open File')\n        raise e\n\n\n# def remove_duplicate_items_from_list(line_list):\n#     res = []\n#     for i in line_list:\n#         if i not in res:\n#             res.append(i)\n#     return res\n\n\n# for testing provide the filepath as command line argument\nif __name__ == \"__main__\":\n\n    filePath = sys.argv[1]\n    print(extract_data_from_ngspice_output(filePath))\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/helpers/sample_files/RC.cir",
    "content": "\n* Author: FOSSEE\n* Date:\n\nr1  in out 1k\nc1  out gnd 10u\nv1  in gnd pwl(0m 0 0.5m 5 50m 5 50.5m 0 100m 0)\n* u1  in plot_v1\n* u2  out plot_v1\n.tran 10e-03 100e-03 0e-03\n\n* Control Statements\n.control\nrun\nprint all > data.txt\n.endc\n.end\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/helpers/sample_files/data.txt",
    "content": "                                        \n                                       Transient Analysis  Sun Apr 26 18:25:24  2020\n--------------------------------------------------------------------------------\nIndex   time            in              out             time            \n--------------------------------------------------------------------------------\n0\t0.000000e+00\t0.000000e+00\t-1.21023e-22\t0.000000e+00\t\n1\t1.000000e-05\t1.570794e-02\t1.570075e-02\t1.000000e-05\t\n2\t2.000000e-05\t3.141572e-02\t3.140645e-02\t2.000000e-05\t\n3\t4.000000e-05\t6.283020e-02\t6.281484e-02\t4.000000e-05\t\n4\t8.000000e-05\t1.256505e-01\t1.256003e-01\t8.000000e-05\t\n5\t1.600000e-04\t2.512216e-01\t2.504194e-01\t1.600000e-04\t\n6\t3.200000e-04\t5.018086e-01\t4.396405e-01\t3.200000e-04\t\n7\t5.343163e-04\t8.353661e-01\t5.117272e-01\t5.343163e-04\t\n8\t7.511639e-04\t1.169004e+00\t5.404550e-01\t7.511639e-04\t\n9\t1.014269e-03\t1.566385e+00\t5.610074e-01\t1.014269e-03\t\n10\t1.540478e-03\t2.326420e+00\t5.852507e-01\t1.540478e-03\t\n11\t2.592896e-03\t3.637196e+00\t6.101154e-01\t2.592896e-03\t\n12\t4.592896e-03\t4.959163e+00\t6.259915e-01\t4.592896e-03\t\n13\t6.592896e-03\t4.386898e+00\t6.198553e-01\t6.592896e-03\t\n14\t8.592896e-03\t2.138988e+00\t5.802750e-01\t8.592896e-03\t\n15\t1.059290e-02\t-9.25943e-01\t-5.21192e-01\t1.059290e-02\t\n16\t1.168731e-02\t-2.52802e+00\t-5.90034e-01\t1.168731e-02\t\n17\t1.260627e-02\t-3.65157e+00\t-6.10029e-01\t1.260627e-02\t\n18\t1.351234e-02\t-4.46380e+00\t-6.20549e-01\t1.351234e-02\t\n19\t1.532450e-02\t-4.97404e+00\t-6.26197e-01\t1.532450e-02\t\n20\t1.732450e-02\t-3.72500e+00\t-6.11244e-01\t1.732450e-02\t\n21\t1.932450e-02\t-1.05313e+00\t-5.32182e-01\t1.932450e-02\t\n22\t2.109176e-02\t1.681502e+00\t5.658107e-01\t2.109176e-02\t\n23\t2.284255e-02\t3.894825e+00\t6.136953e-01\t2.284255e-02\t\n24\t2.446551e-02\t4.929676e+00\t6.256863e-01\t2.446551e-02\t\n25\t2.603276e-02\t4.739130e+00\t6.236773e-01\t2.603276e-02\t\n26\t2.803276e-02\t2.897143e+00\t5.977803e-01\t2.803276e-02\t\n27\t3.003276e-02\t-5.14551e-02\t-5.14419e-02\t3.003276e-02\t\n28\t3.181211e-02\t-2.69517e+00\t-5.93524e-01\t3.181211e-02\t\n29\t3.353100e-02\t-4.47693e+00\t-6.20747e-01\t3.353100e-02\t\n30\t3.548425e-02\t-4.94225e+00\t-6.26203e-01\t3.548425e-02\t\n31\t3.748425e-02\t-3.55298e+00\t-6.08802e-01\t3.748425e-02\t\n32\t3.948425e-02\t-8.06597e-01\t-5.07973e-01\t3.948425e-02\t\n33\t4.084025e-02\t1.304594e+00\t5.485420e-01\t4.084025e-02\t\n34\t4.232563e-02\t3.336652e+00\t6.053367e-01\t4.232563e-02\t\n35\t4.432563e-02\t4.888208e+00\t6.256007e-01\t4.432563e-02\t\n36\t4.614809e-02\t4.678280e+00\t6.231567e-01\t4.614809e-02\t\n37\t4.814809e-02\t2.747621e+00\t5.949600e-01\t4.814809e-02\t\n38\t5.014809e-02\t-2.32536e-01\t-2.32009e-01\t5.014809e-02\t\n39\t5.106495e-02\t-1.64179e+00\t-5.64133e-01\t5.106495e-02\t\n40\t5.192012e-02\t-2.83650e+00\t-5.96466e-01\t5.192012e-02\t\n41\t5.288026e-02\t-3.93170e+00\t-6.14042e-01\t5.288026e-02\t\n42\t5.433190e-02\t-4.89027e+00\t-6.25323e-01\t5.433190e-02\t\n43\t5.633190e-02\t-4.56865e+00\t-6.21871e-01\t5.633190e-02\t\n44\t5.833190e-02\t-2.50196e+00\t-5.89905e-01\t5.833190e-02\t\n45\t6.033190e-02\t5.203956e-01\t4.469106e-01\t6.033190e-02\t\n46\t6.201058e-02\t2.952352e+00\t5.985459e-01\t6.201058e-02\t\n47\t6.359054e-02\t4.517790e+00\t6.212035e-01\t6.359054e-02\t\n48\t6.524527e-02\t4.985165e+00\t6.263736e-01\t6.524527e-02\t\n49\t6.724527e-02\t3.806855e+00\t6.123643e-01\t6.724527e-02\t\n50\t6.924527e-02\t1.174457e+00\t5.410754e-01\t6.924527e-02\t\n51\t7.069407e-02\t-1.08163e+00\t-5.34385e-01\t7.069407e-02\t\n52\t7.237416e-02\t-3.39303e+00\t-6.06125e-01\t7.237416e-02\t\n53\t7.412120e-02\t-4.81065e+00\t-6.24769e-01\t7.412120e-02\t\n54\t7.582571e-02\t-4.83272e+00\t-6.24761e-01\t7.582571e-02\t\n\f\nIndex   time            in              out             time            \n--------------------------------------------------------------------------------\n55\t7.782571e-02\t-3.15590e+00\t-6.02409e-01\t7.782571e-02\t\n56\t7.982571e-02\t-2.73641e-01\t-2.72327e-01\t7.982571e-02\t\n57\t8.082874e-02\t1.287122e+00\t5.479313e-01\t8.082874e-02\t\n58\t8.192022e-02\t2.836635e+00\t5.964361e-01\t8.192022e-02\t\n59\t8.332868e-02\t4.326466e+00\t6.189574e-01\t8.332868e-02\t\n60\t8.468753e-02\t4.975928e+00\t6.262056e-01\t8.468753e-02\t\n61\t8.668753e-02\t4.313647e+00\t6.188623e-01\t8.668753e-02\t\n62\t8.868753e-02\t2.003700e+00\t5.763923e-01\t8.868753e-02\t\n63\t9.068753e-02\t-1.07159e+00\t-5.33642e-01\t9.068753e-02\t\n64\t9.256918e-02\t-3.61153e+00\t-6.09422e-01\t9.256918e-02\t\n65\t9.445688e-02\t-4.92739e+00\t-6.26152e-01\t9.445688e-02\t\n66\t9.621191e-02\t-4.64196e+00\t-6.22698e-01\t9.621191e-02\t\n67\t9.821191e-02\t-2.66332e+00\t-5.93225e-01\t9.821191e-02\t\n68\t1.000000e-01\t-6.12323e-15\t-5.42079e-06\t1.000000e-01\t\n\f\n                                        \n                                       Transient Analysis  Sun Apr 26 18:25:24  2020\n--------------------------------------------------------------------------------\nIndex   time            v1#branch       \n--------------------------------------------------------------------------------\n0\t0.000000e+00\t-1.21023e-25\t\n1\t1.000000e-05\t-7.18261e-09\t\n2\t2.000000e-05\t-9.27278e-09\t\n3\t4.000000e-05\t-1.53546e-08\t\n4\t8.000000e-05\t-5.02056e-08\t\n5\t1.600000e-04\t-8.02233e-07\t\n6\t3.200000e-04\t-6.21680e-05\t\n7\t5.343163e-04\t-3.23639e-04\t\n8\t7.511639e-04\t-6.28549e-04\t\n9\t1.014269e-03\t-1.00538e-03\t\n10\t1.540478e-03\t-1.74117e-03\t\n11\t2.592896e-03\t-3.02708e-03\t\n12\t4.592896e-03\t-4.33317e-03\t\n13\t6.592896e-03\t-3.76704e-03\t\n14\t8.592896e-03\t-1.55871e-03\t\n15\t1.059290e-02\t4.047519e-04\t\n16\t1.168731e-02\t1.937990e-03\t\n17\t1.260627e-02\t3.041544e-03\t\n18\t1.351234e-02\t3.843251e-03\t\n19\t1.532450e-02\t4.347845e-03\t\n20\t1.732450e-02\t3.113754e-03\t\n21\t1.932450e-02\t5.209497e-04\t\n22\t2.109176e-02\t-1.11569e-03\t\n23\t2.284255e-02\t-3.28113e-03\t\n24\t2.446551e-02\t-4.30399e-03\t\n25\t2.603276e-02\t-4.11545e-03\t\n26\t2.803276e-02\t-2.29936e-03\t\n27\t3.003276e-02\t1.323245e-08\t\n28\t3.181211e-02\t2.101648e-03\t\n29\t3.353100e-02\t3.856183e-03\t\n30\t3.548425e-02\t4.316048e-03\t\n31\t3.748425e-02\t2.944182e-03\t\n32\t3.948425e-02\t2.986236e-04\t\n33\t4.084025e-02\t-7.56052e-04\t\n34\t4.232563e-02\t-2.73131e-03\t\n35\t4.432563e-02\t-4.26261e-03\t\n36\t4.614809e-02\t-4.05512e-03\t\n37\t4.814809e-02\t-2.15266e-03\t\n38\t5.014809e-02\t5.269492e-07\t\n39\t5.106495e-02\t1.077659e-03\t\n40\t5.192012e-02\t2.240032e-03\t\n41\t5.288026e-02\t3.317656e-03\t\n42\t5.433190e-02\t4.264945e-03\t\n43\t5.633190e-02\t3.946775e-03\t\n44\t5.833190e-02\t1.912051e-03\t\n45\t6.033190e-02\t-7.34851e-05\t\n46\t6.201058e-02\t-2.35381e-03\t\n47\t6.359054e-02\t-3.89659e-03\t\n48\t6.524527e-02\t-4.35879e-03\t\n49\t6.724527e-02\t-3.19449e-03\t\n50\t6.924527e-02\t-6.33382e-04\t\n51\t7.069407e-02\t5.472455e-04\t\n52\t7.237416e-02\t2.786905e-03\t\n53\t7.412120e-02\t4.185885e-03\t\n54\t7.582571e-02\t4.207954e-03\t\n\f\nIndex   time            v1#branch       \n--------------------------------------------------------------------------------\n55\t7.782571e-02\t2.553494e-03\t\n56\t7.982571e-02\t1.314865e-06\t\n57\t8.082874e-02\t-7.39190e-04\t\n58\t8.192022e-02\t-2.24020e-03\t\n59\t8.332868e-02\t-3.70751e-03\t\n60\t8.468753e-02\t-4.34972e-03\t\n61\t8.668753e-02\t-3.69479e-03\t\n62\t8.868753e-02\t-1.42731e-03\t\n63\t9.068753e-02\t5.379516e-04\t\n64\t9.256918e-02\t3.002108e-03\t\n65\t9.445688e-02\t4.301241e-03\t\n66\t9.621191e-02\t4.019265e-03\t\n67\t9.821191e-02\t2.070094e-03\t\n68\t1.000000e-01\t-5.42079e-09\t\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/helpers/sample_files/plot_data_i.txt",
    "content": "                                        \n                                       Transient Analysis  Fri Apr 24 23:37:52  2020\n--------------------------------------------------------------------------------\nIndex   time            v1#branch       v2#branch       \n--------------------------------------------------------------------------------\n0\t0.000000e+00\t0.000000e+00\t-1.44364e-11\t\n1\t5.000000e-06\t-1.08398e-06\t4.220864e-07\t\n2\t1.000000e-05\t-1.07855e-06\t4.224245e-07\t\n3\t2.000000e-05\t-1.06529e-06\t4.230573e-07\t\n4\t3.122027e-05\t-1.09702e-06\t4.237329e-07\t\n5\t4.261616e-05\t-1.40088e-06\t4.242644e-07\t\n6\t5.453771e-05\t-1.55219e-06\t4.227076e-07\t\n7\t7.296709e-05\t-1.47175e-06\t4.041312e-07\t\n8\t9.144949e-05\t-1.55369e-06\t3.516220e-07\t\n9\t1.284143e-04\t-1.47267e-06\t8.098758e-08\t\n10\t2.023439e-04\t-1.56072e-06\t-1.30887e-06\t\n11\t3.502031e-04\t-1.49613e-06\t-4.87527e-06\t\n12\t5.000000e-04\t-1.14389e-06\t2.970244e-07\t\n13\t5.010313e-04\t-4.25119e-10\t-3.23614e-12\t\n14\t5.030940e-04\t-1.18963e-10\t-3.37536e-12\t\n15\t5.072194e-04\t-4.25205e-10\t-3.24360e-12\t\n16\t5.154701e-04\t-1.19414e-10\t-3.39089e-12\t\n17\t5.319715e-04\t-4.25984e-10\t-3.27483e-12\t\n18\t5.649744e-04\t-1.21104e-10\t-3.45147e-12\t\n19\t6.309801e-04\t-4.29615e-10\t-3.39337e-12\t\n20\t7.629914e-04\t-1.29787e-10\t-3.68303e-12\t\n21\t1.027014e-03\t-4.55655e-10\t-3.84134e-12\t\n22\t1.555060e-03\t-2.74051e-10\t-4.52651e-12\t\n23\t2.611151e-03\t-4.60756e-09\t-5.32636e-12\t\n24\t4.611151e-03\t-2.18631e-08\t-6.71107e-12\t\n25\t6.611151e-03\t-2.46290e-09\t-7.28349e-12\t\n26\t8.611151e-03\t-1.19971e-08\t-7.79571e-12\t\n27\t1.061115e-02\t4.330151e-09\t-7.84913e-12\t\n28\t1.261115e-02\t-8.21108e-09\t-8.08054e-12\t\n29\t1.461115e-02\t6.287619e-09\t-7.99010e-12\t\n30\t1.656886e-02\t-7.23655e-09\t-8.14967e-12\t\n31\t1.850200e-02\t6.763943e-09\t-8.02346e-12\t\n32\t2.042896e-02\t-7.00042e-09\t-8.16602e-12\t\n33\t2.236466e-02\t6.884703e-09\t-8.03164e-12\t\n34\t2.430032e-02\t-6.93989e-09\t-8.17011e-12\t\n35\t2.623482e-02\t6.912354e-09\t-8.03390e-12\t\n36\t2.816446e-02\t-6.92609e-09\t-8.17090e-12\t\n37\t3.009657e-02\t6.919218e-09\t-8.03452e-12\t\n38\t3.202839e-02\t-6.92264e-09\t-8.17116e-12\t\n39\t3.396181e-02\t6.920921e-09\t-8.03442e-12\t\n40\t3.589384e-02\t-6.92177e-09\t-8.17133e-12\t\n41\t3.782674e-02\t6.921336e-09\t-8.03423e-12\t\n42\t3.975935e-02\t-6.92154e-09\t-8.17124e-12\t\n43\t4.175935e-02\t6.921431e-09\t-8.03435e-12\t\n44\t4.375935e-02\t-6.92148e-09\t-8.17124e-12\t\n45\t4.575935e-02\t6.921445e-09\t-8.03435e-12\t\n46\t4.775935e-02\t-6.92145e-09\t-8.17124e-12\t\n47\t4.975935e-02\t6.921438e-09\t-8.03435e-12\t\n48\t5.000000e-02\t-6.92139e-09\t-8.17124e-12\t\n49\t5.000344e-02\t1.073445e-06\t-2.29261e-07\t\n50\t5.001031e-02\t1.062517e-06\t-2.18132e-07\t\n51\t5.002405e-02\t1.057252e-06\t-2.12216e-07\t\n52\t5.003890e-02\t1.179433e-06\t-3.00119e-07\t\n53\t5.005236e-02\t1.647596e-06\t-9.67225e-07\t\n54\t5.006621e-02\t1.362141e-06\t-2.32705e-06\t\n\f\nIndex   time            v1#branch       v2#branch       \n--------------------------------------------------------------------------------\n55\t5.007947e-02\t1.653940e-06\t-4.70595e-06\t\n56\t5.009790e-02\t1.361331e-06\t-8.93152e-06\t\n57\t5.012743e-02\t1.653052e-06\t-1.88474e-05\t\n58\t5.017360e-02\t1.361145e-06\t-4.08411e-05\t\n59\t5.024499e-02\t1.654734e-06\t-9.18089e-05\t\n60\t5.035306e-02\t1.367456e-06\t-2.14666e-04\t\n61\t5.050000e-02\t1.308831e-06\t-4.81732e-04\t\n62\t5.050138e-02\t2.449697e-10\t-4.81265e-04\t\n63\t5.050415e-02\t-7.33525e-11\t-4.81204e-04\t\n64\t5.050886e-02\t2.448991e-10\t-4.81102e-04\t\n65\t5.051827e-02\t-7.32262e-11\t-4.80897e-04\t\n66\t5.053710e-02\t2.450062e-10\t-4.80485e-04\t\n67\t5.057476e-02\t-7.29317e-11\t-4.79658e-04\t\n68\t5.065008e-02\t2.455833e-10\t-4.77988e-04\t\n69\t5.080073e-02\t-7.16665e-11\t-4.74582e-04\t\n70\t5.110201e-02\t2.485198e-10\t-4.67524e-04\t\n71\t5.170459e-02\t-6.33768e-11\t-4.52499e-04\t\n72\t5.290973e-02\t2.876237e-10\t-4.19529e-04\t\n73\t5.490973e-02\t5.463069e-10\t-3.59768e-04\t\n74\t5.690973e-02\t5.709571e-09\t-2.99143e-04\t\n75\t5.890973e-02\t6.043230e-09\t-2.42387e-04\t\n76\t6.090973e-02\t6.573391e-09\t-1.92306e-04\t\n77\t6.290973e-02\t4.836922e-09\t-1.50032e-04\t\n78\t6.490973e-02\t4.729522e-09\t-1.15521e-04\t\n79\t6.690973e-02\t2.963431e-09\t-8.80490e-05\t\n80\t6.890973e-02\t3.065391e-09\t-6.65913e-05\t\n81\t7.090973e-02\t1.579419e-09\t-5.00669e-05\t\n82\t7.290973e-02\t1.955450e-09\t-3.74849e-05\t\n83\t7.490973e-02\t7.124459e-10\t-2.79620e-05\t\n84\t7.690973e-02\t1.290972e-09\t-2.08077e-05\t\n85\t7.890973e-02\t2.069733e-10\t-1.54552e-05\t\n86\t8.090973e-02\t9.095159e-10\t-1.14644e-05\t\n87\t8.290973e-02\t-7.92520e-11\t-8.49513e-06\t\n88\t8.490973e-02\t6.956285e-10\t-6.29066e-06\t\n89\t8.690973e-02\t-2.38603e-10\t-4.65524e-06\t\n90\t8.890973e-02\t5.771652e-10\t-3.44402e-06\t\n91\t9.090973e-02\t-3.26527e-10\t-2.54674e-06\t\n92\t9.290973e-02\t5.119823e-10\t-1.88325e-06\t\n93\t9.490973e-02\t-3.74807e-10\t-1.39194e-06\t\n94\t9.690973e-02\t4.762428e-10\t-1.02913e-06\t\n95\t9.890973e-02\t-4.01248e-10\t-7.60373e-07\t\n96\t1.000000e-01\t4.601805e-10\t-6.45655e-07\t\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/helpers/sample_files/plot_data_v.txt",
    "content": "                                        \n                                       Transient Analysis  Fri Apr 24 23:37:52  2020\n--------------------------------------------------------------------------------\nIndex   time            in              out             vcc             \n--------------------------------------------------------------------------------\n0\t0.000000e+00\t0.000000e+00\t5.000000e+00\t5.000000e+00\t\n1\t5.000000e-06\t5.000000e-02\t5.000002e+00\t5.000000e+00\t\n2\t1.000000e-05\t1.000000e-01\t5.000004e+00\t5.000000e+00\t\n3\t2.000000e-05\t2.000000e-01\t5.000008e+00\t5.000000e+00\t\n4\t3.122027e-05\t3.122027e-01\t5.000013e+00\t5.000000e+00\t\n5\t4.261616e-05\t4.261616e-01\t5.000017e+00\t5.000000e+00\t\n6\t5.453771e-05\t5.453771e-01\t5.000005e+00\t5.000000e+00\t\n7\t7.296709e-05\t7.296709e-01\t4.999871e+00\t5.000000e+00\t\n8\t9.144949e-05\t9.144949e-01\t4.999479e+00\t5.000000e+00\t\n9\t1.284143e-04\t1.284143e+00\t4.997339e+00\t5.000000e+00\t\n10\t2.023439e-04\t2.023439e+00\t4.984459e+00\t5.000000e+00\t\n11\t3.502031e-04\t3.502031e+00\t4.910883e+00\t5.000000e+00\t\n12\t5.000000e-04\t5.000000e+00\t4.767735e+00\t5.000000e+00\t\n13\t5.010313e-04\t5.000000e+00\t4.766519e+00\t5.000000e+00\t\n14\t5.030940e-04\t5.000000e+00\t4.764088e+00\t5.000000e+00\t\n15\t5.072194e-04\t5.000000e+00\t4.759227e+00\t5.000000e+00\t\n16\t5.154701e-04\t5.000000e+00\t4.749516e+00\t5.000000e+00\t\n17\t5.319715e-04\t5.000000e+00\t4.730128e+00\t5.000000e+00\t\n18\t5.649744e-04\t5.000000e+00\t4.691496e+00\t5.000000e+00\t\n19\t6.309801e-04\t5.000000e+00\t4.614812e+00\t5.000000e+00\t\n20\t7.629914e-04\t5.000000e+00\t4.463791e+00\t5.000000e+00\t\n21\t1.027014e-03\t5.000000e+00\t4.171338e+00\t5.000000e+00\t\n22\t1.555060e-03\t5.000000e+00\t3.625886e+00\t5.000000e+00\t\n23\t2.611151e-03\t5.000000e+00\t2.693993e+00\t5.000000e+00\t\n24\t4.611151e-03\t5.000000e+00\t1.452843e+00\t5.000000e+00\t\n25\t6.611151e-03\t5.000000e+00\t7.469712e-01\t5.000000e+00\t\n26\t8.611151e-03\t5.000000e+00\t3.737508e-01\t5.000000e+00\t\n27\t1.061115e-02\t5.000000e+00\t1.843359e-01\t5.000000e+00\t\n28\t1.261115e-02\t5.000000e+00\t9.025318e-02\t5.000000e+00\t\n29\t1.461115e-02\t5.000000e+00\t4.402884e-02\t5.000000e+00\t\n30\t1.656886e-02\t5.000000e+00\t2.179764e-02\t5.000000e+00\t\n31\t1.850200e-02\t5.000000e+00\t1.088616e-02\t5.000000e+00\t\n32\t2.042896e-02\t5.000000e+00\t5.447191e-03\t5.000000e+00\t\n33\t2.236466e-02\t5.000000e+00\t2.715556e-03\t5.000000e+00\t\n34\t2.430032e-02\t5.000000e+00\t1.353813e-03\t5.000000e+00\t\n35\t2.623482e-02\t5.000000e+00\t6.752433e-04\t5.000000e+00\t\n36\t2.816446e-02\t5.000000e+00\t3.374345e-04\t5.000000e+00\t\n37\t3.009657e-02\t5.000000e+00\t1.684679e-04\t5.000000e+00\t\n38\t3.202839e-02\t5.000000e+00\t8.412501e-05\t5.000000e+00\t\n39\t3.396181e-02\t5.000000e+00\t4.198760e-05\t5.000000e+00\t\n40\t3.589384e-02\t5.000000e+00\t2.097374e-05\t5.000000e+00\t\n41\t3.782674e-02\t5.000000e+00\t1.047916e-05\t5.000000e+00\t\n42\t3.975935e-02\t5.000000e+00\t5.242170e-06\t5.000000e+00\t\n43\t4.175935e-02\t5.000000e+00\t2.560529e-06\t5.000000e+00\t\n44\t4.375935e-02\t5.000000e+00\t1.256841e-06\t5.000000e+00\t\n45\t4.575935e-02\t5.000000e+00\t6.230583e-07\t5.000000e+00\t\n46\t4.775935e-02\t5.000000e+00\t3.149387e-07\t5.000000e+00\t\n47\t4.975935e-02\t5.000000e+00\t1.651510e-07\t5.000000e+00\t\n48\t5.000000e-02\t5.000000e+00\t1.538261e-07\t5.000000e+00\t\n49\t5.000344e-02\t4.965649e+00\t-1.29499e-06\t5.000000e+00\t\n50\t5.001031e-02\t4.896947e+00\t-4.18960e-06\t5.000000e+00\t\n51\t5.002405e-02\t4.759543e+00\t-9.96317e-06\t5.000000e+00\t\n52\t5.003890e-02\t4.610955e+00\t-1.64325e-05\t5.000000e+00\t\n53\t5.005236e-02\t4.476410e+00\t-2.11536e-05\t5.000000e+00\t\n54\t5.006621e-02\t4.337862e+00\t-1.32460e-05\t5.000000e+00\t\n\f\n\n--------------------------------------------------------------------------------\n55\t5.007947e-02\t4.205277e+00\t1.896545e-05\t5.000000e+00\t\n56\t5.009790e-02\t4.021012e+00\t1.240988e-04\t5.000000e+00\t\n57\t5.012743e-02\t3.725657e+00\t4.986274e-04\t5.000000e+00\t\n58\t5.017360e-02\t3.264038e+00\t1.804424e-03\t5.000000e+00\t\n59\t5.024499e-02\t2.550110e+00\t6.343132e-03\t5.000000e+00\t\n60\t5.035306e-02\t1.469424e+00\t2.230900e-02\t5.000000e+00\t\n61\t5.050000e-02\t0.000000e+00\t7.287392e-02\t5.000000e+00\t\n62\t5.050138e-02\t0.000000e+00\t7.353952e-02\t5.000000e+00\t\n63\t5.050415e-02\t0.000000e+00\t7.487065e-02\t5.000000e+00\t\n64\t5.050886e-02\t0.000000e+00\t7.713572e-02\t5.000000e+00\t\n65\t5.051827e-02\t0.000000e+00\t8.166442e-02\t5.000000e+00\t\n66\t5.053710e-02\t0.000000e+00\t9.071601e-02\t5.000000e+00\t\n67\t5.057476e-02\t0.000000e+00\t1.087959e-01\t5.000000e+00\t\n68\t5.065008e-02\t0.000000e+00\t1.448616e-01\t5.000000e+00\t\n69\t5.080073e-02\t0.000000e+00\t2.166106e-01\t5.000000e+00\t\n70\t5.110201e-02\t0.000000e+00\t3.585322e-01\t5.000000e+00\t\n71\t5.170459e-02\t0.000000e+00\t6.357220e-01\t5.000000e+00\t\n72\t5.290973e-02\t0.000000e+00\t1.161181e+00\t5.000000e+00\t\n73\t5.490973e-02\t0.000000e+00\t1.940478e+00\t5.000000e+00\t\n74\t5.690973e-02\t0.000000e+00\t2.599383e+00\t5.000000e+00\t\n75\t5.890973e-02\t0.000000e+00\t3.140901e+00\t5.000000e+00\t\n76\t6.090973e-02\t0.000000e+00\t3.575581e+00\t5.000000e+00\t\n77\t6.290973e-02\t0.000000e+00\t3.917907e+00\t5.000000e+00\t\n78\t6.490973e-02\t0.000000e+00\t4.183450e+00\t5.000000e+00\t\n79\t6.690973e-02\t0.000000e+00\t4.387012e+00\t5.000000e+00\t\n80\t6.890973e-02\t0.000000e+00\t4.541646e+00\t5.000000e+00\t\n81\t7.090973e-02\t0.000000e+00\t4.658300e+00\t5.000000e+00\t\n82\t7.290973e-02\t0.000000e+00\t4.745848e+00\t5.000000e+00\t\n83\t7.490973e-02\t0.000000e+00\t4.811292e+00\t5.000000e+00\t\n84\t7.690973e-02\t0.000000e+00\t4.860060e+00\t5.000000e+00\t\n85\t7.890973e-02\t0.000000e+00\t4.896321e+00\t5.000000e+00\t\n86\t8.090973e-02\t0.000000e+00\t4.923240e+00\t5.000000e+00\t\n87\t8.290973e-02\t0.000000e+00\t4.943198e+00\t5.000000e+00\t\n88\t8.490973e-02\t0.000000e+00\t4.957983e+00\t5.000000e+00\t\n89\t8.690973e-02\t0.000000e+00\t4.968929e+00\t5.000000e+00\t\n90\t8.890973e-02\t0.000000e+00\t4.977028e+00\t5.000000e+00\t\n91\t9.090973e-02\t0.000000e+00\t4.983018e+00\t5.000000e+00\t\n92\t9.290973e-02\t0.000000e+00\t4.987448e+00\t5.000000e+00\t\n93\t9.490973e-02\t0.000000e+00\t4.990723e+00\t5.000000e+00\t\n94\t9.690973e-02\t0.000000e+00\t4.993144e+00\t5.000000e+00\t\n95\t9.890973e-02\t0.000000e+00\t4.994933e+00\t5.000000e+00\t\n96\t1.000000e-01\t0.000000e+00\t4.995700e+00\t5.000000e+00\t\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/models.py",
    "content": "from django.db import models\nfrom django.contrib.postgres.fields import JSONField\nfrom django.core.files.storage import FileSystemStorage\nfrom django.contrib.auth import get_user_model\nfrom django.conf import settings\nfrom django.contrib.auth import get_user_model\nimport uuid\nfrom saveAPI.models import StateSave\n\n\nclass Task(models.Model):\n    # User details for auth to be stored along with task.\n    # user = models.ForeignKey(User, on_delete=models.CASCADE)\n\n    task_time = models.DateTimeField(auto_now=True, db_index=True)\n    task_id = models.UUIDField(\n        primary_key=True, default=uuid.uuid4, editable=False)\n\n    def save(self, *args, **kwargs):\n        super(Task, self).save(*args, **kwargs)\n\n\nclass spiceFile(models.Model):\n\n    file_id = models.UUIDField(\n        primary_key=True, default=uuid.uuid4, editable=False)\n    file = models.FileField(\n        storage=FileSystemStorage(location=settings.MEDIA_ROOT))\n    upload_time = models.DateTimeField(auto_now=True, db_index=True)\n\n    # User details for auth to be stored along with task.\n    # owner = models.ForeignKey('auth.User')\n    task = models.ForeignKey(\n        Task, on_delete=models.CASCADE, related_name='file')\n\n    def save(self, *args, **kwargs):\n        super(spiceFile, self).save(*args, **kwargs)\n\n\nclass runtimeStat(models.Model):\n    \"\"\"\n    Stored number of simulations which fall under and between\n    each second and the last. For e.g. if a simulation take 0.5s\n    to execute then qty field of the row with with exec_time=1\n    will increase by 1 (simulations)\n    \"\"\"\n    exec_time = models.IntegerField(primary_key=True)\n    qty = models.IntegerField(default=0)\n\n    def __str__(self):\n        return str(self.exec_time)\n\n    def save(self, *args, **kwargs):\n        super(runtimeStat, self).save(*args, **kwargs)\n\n\nclass Limit(models.Model):\n    timeLimit = models.IntegerField()\n\n    def __str__(self):\n        return str(self.timeLimit)\n\n\nclass simulation(models.Model):\n    simulation_type = models.CharField(\n        max_length=30, null=True, blank=True)\n    task = models.ForeignKey(to=Task, on_delete=models.CASCADE)\n    simulation_time = models.DateTimeField(auto_now_add=True)\n    schematic = models.ForeignKey(\n        to=StateSave, on_delete=models.CASCADE, null=True, blank=True)\n    owner = models.ForeignKey(\n        to=get_user_model(), null=True, on_delete=models.CASCADE)\n    netlist = models.TextField()\n    result = JSONField(null=True, blank=True)\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/serializers.py",
    "content": "import logging\nfrom rest_framework import serializers\nfrom simulationAPI.models import spiceFile, Task, simulation\nfrom saveAPI.serializers import SaveListSerializer\n\nlogger = logging.getLogger(__name__)\n\n\nclass FileSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = spiceFile\n        fields = ('file', 'upload_time', 'file_id', 'task')\n\n\nclass TaskSerializer(serializers.HyperlinkedModelSerializer):\n    # user = serializers.ReadOnlyField(source='user.username')\n    file = FileSerializer(many=True, read_only=True)\n\n    class Meta:\n        model = Task\n        fields = ('task_id', 'task_time', 'file')\n\n    def create(self, validated_data):\n        # Takes file from request and stores it along with a taskid\n        files_data = list(self.context.get(\n            'view').request.FILES.getlist(\"file\"))[0]\n        logger.info('File Upload')\n        task = Task.objects.create()\n        logger.info('task: '+str(task))\n        spiceFile.objects.create(task=task, file=files_data)\n        logger.info('Created Object for:' + files_data.name)\n        return task\n\n\nclass simulationSerializer(serializers.ModelSerializer):\n    schematic = SaveListSerializer(many=False)\n\n    class Meta:\n        model = simulation\n        fields = '__all__'\n\n\nclass simulationSaveSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = simulation\n        fields = '__all__'\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/tasks.py",
    "content": "from celery import shared_task, current_task\nfrom celery import states\nfrom simulationAPI.helpers import ngspice_helper\nfrom celery.exceptions import Ignore\nimport traceback\nfrom simulationAPI.models import spiceFile\nfrom celery.exceptions import SoftTimeLimitExceeded\n\n\"\"\"\nTasks cleanup after 3 secs and the process is stopped after 5 seconds.\n\"\"\"\n\n\n# @shared_task(soft_time_limit=3, time_limit=5)\n@shared_task\ndef process_task(task_id):\n    try:\n        try:\n\n            file_obj = list(spiceFile.objects.filter(task_id=task_id))[0]\n            file_path = file_obj.file.path\n            file_id = file_obj.file_id\n\n            print(\"Processing \", file_path, file_id)\n\n            current_task.update_state(\n                state='PROGRESS',\n                meta={'current_process': 'Started Processing File'})\n\n            output = ngspice_helper.ExecNetlist(file_path, file_id)\n            current_task.update_state(\n                state='PROGRESS',\n                meta={'current_process': 'Processed Netlist, Loading Output'})\n            return output\n\n        except Exception as e:\n            current_task.update_state(state=states.FAILURE, meta={\n                'exc_type': type(e).__name__,\n                'exc_message': traceback.format_exc().split('\\n')})\n            print('Exception Occured: ', type(e).__name__)\n            raise Ignore()\n    except SoftTimeLimitExceeded:\n        output = {'fail': \"time limit exceeded\"}\n        return output\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/templates/admin/runtimeStats.html",
    "content": "{% extends \"admin/change_list.html\" %}\n{% block extrahead %}\n{{ block.super }}\n\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.css\" />\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js\"></script>\n<script>\n  document.addEventListener('DOMContentLoaded', () => {\n    const ctx = document.getElementById('myChart').getContext('2d');\n  \n    const chartData = {{ chart_data | safe }};\n    const chart = new Chart(ctx, {\n      type: 'bar',\n      data: {\n        labels: chartData.map(e => {\n          return (String(e.exec_time) + 's')\n        }),\n        datasets: [\n          {\n            label: 'No of Simulations',\n            data: chartData,\n            backgroundColor: chartData.map(e => {\n                var col = 'rgb(121,174,200)'\n                \n                \n                if(e.exec_time >= {{ TIME_LIMIT | safe}} && {{ TIME_LIMIT | safe}} != 0) {\n                    col = 'rgb(190,70,50)'\n                }\n                return col;\n                \n            }),\n            \n          },\n        ],\n      },\n      options: {\n        animation: {\n            duration: 3000,\n        },\n        responsive: true,\n        scales: {\n          yAxes: [\n            {\n              ticks: {\n                beginAtZero: true,\n              },\n            },\n          ],\n        },\n      },\n    });\n  });\n  </script>\n{% endblock %}\n\n{% block content %}\n<!-- Render our chart -->\n\n<div style=\"width: 80%;\">\n  <canvas style=\"margin-bottom: 30px; width: 60%; height: 50%;\" id=\"myChart\"></canvas>\n</div>\n<!-- Render the rest of the ChangeList view -->\n{{ block.super }}\n{% endblock %}\n{% block content_title %}\n    <h1> Runtime Statistics </h1>\n{% endblock %}\n\n{% block result_list %}\n    <!-- Our content goes here... -->\n\n    <div class=\"results\">\n        <table>\n\n        <thead>\n        <tr>\n            <th>\n            <div class=\"text\">\n                <a href=\"#\">Execution Time (in s)</a>\n            </div>\n            </th>\n            <th>\n            <div class=\"text\">\n                <a href=\"#\">Total</a>\n            </div>\n            </th>\n            <th>\n            <div class=\"text\">\n                <a href=\"#\">\n                <strong>%  Of Total Simulations</strong>\n                </a>\n            </div>\n            </th>\n        </tr>\n        </thead>\n\n        <tbody>\n        {% for row in summary %}\n        <tr class=\"{% cycle 'row1' 'row2' %}\">\n            <td> {{ row.exec_time }}s </td>\n            <td> {{ row.qty  }} </td>\n            <td>\n            <strong>\n                <!-- Calculation of the percentage -->\n            {% widthratio row.qty summary_total 100%}%\n            </strong>\n            </td>\n        </tr>\n        \n        {% endfor %}\n        <tr style=\"font-weight:bold; border-top:2px solid #DDDDDD;\">\n            <td> Total </td>\n            <td> {{ summary_total }} </td>\n            <td> 100% </td>\n        </tr>\n        </tbody>\n\n    </table>\n    </div>\n    <br>\n    <br> \n    {% block RuntimeLimit %}\n    <!-- <li> -->\n        <h1>Simulation Time Limit</h1>\n        <div>\n          <form method=\"post\"> \n            <label for=\"limit\">Time Limit(s): </label>\n            <input id=\"limit\" type=\"text\" name=\"limit\"value={{ TIME_LIMIT }}> \n            <input type=\"submit\" value=\"Update\"> \n          </form>\n        </div>\n    <!-- </li> -->\n    <!-- {{ block.super }} -->\n  {% endblock %}\n    \n{% endblock %}\n\n\n\n\n\n{% block pagination %}{% endblock %}"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/tests.py",
    "content": "# Create your tests here.\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/urls.py",
    "content": "\"\"\"\n\nesimCloud URL Configuration\n\n\"\"\"\nfrom django.urls import path\nfrom simulationAPI import views as simulationAPI_views\n\n\nurlpatterns = [\n    path('upload', simulationAPI_views.NetlistUploader.as_view(),\n         name='netlistUploader'),\n\n    path('status/<uuid:task_id>',\n         simulationAPI_views.CeleryResultView.as_view(), name='celery_status'),\n\n    path('history/<uuid:save_id>/<str:version>/<str:branch>/<str:sim>',\n         simulationAPI_views.SimulationResults.as_view(),\n         name='schematic sim history'),\n\n    path('history/lti/<uuid:save_id>/<str:version>/<str:branch>/<str:sim>',\n         simulationAPI_views.SimulationResultsForLTI.as_view(),\n         name='schematic sim  history for lti'),\n\n    path('history/lti/<uuid:save_id>/<str:version>/<str:branch>/<str:sim>',\n         simulationAPI_views.SimulationResultsForLTI.as_view(),\n         name='schematic sim  history for lti'),\n\n    path('history/simulator/<str:sim>',\n         simulationAPI_views.SimulationResultsFromSimulator.as_view(),\n         name='simulator sim history'),\n\n    path('history/lti/<int:lti_id>',\n         simulationAPI_views.GetLTISimResults.as_view(),\n         name='lti sim history'),\n]\n"
  },
  {
    "path": "esim-cloud-backend/simulationAPI/views.py",
    "content": "from simulationAPI.serializers import TaskSerializer, \\\n    simulationSerializer, simulationSaveSerializer\nfrom simulationAPI.tasks import process_task\nfrom rest_framework.permissions import AllowAny, IsAuthenticated\nfrom rest_framework.parsers import MultiPartParser, FormParser\nfrom rest_framework.views import APIView\nfrom rest_framework.response import Response\nfrom rest_framework import status\nfrom django.conf import settings\nfrom rest_framework.exceptions import ValidationError\nfrom celery.result import AsyncResult\nfrom saveAPI.models import StateSave\nimport uuid\nfrom .models import runtimeStat, Limit, simulation\nfrom ltiAPI.models import ltiSession\nimport celery.signals\nfrom celery import current_task\nimport time\nimport math\nimport os\nimport logging\n\n\nlogger = logging.getLogger(__name__)\n\n\ndef saveNetlistDB(task_id, filepath, request):\n    current_dir = settings.FILE_STORAGE_ROOT\n    filepath = filepath.split('/')[-1]\n    os.chdir(current_dir)\n    f = open(filepath, \"r\")\n    temp = f.read()\n    if request.user.is_authenticated:\n        owner = request.user.id\n    else:\n        owner = None\n    if request.data.get('simulationType', None):\n        simulation_type = request.data['simulationType']\n    else:\n        simulation_type = \"NgSpiceSimulator\"\n    if request.data.get('save_id', None):\n        if 'gallery' in request.data.get('save_id'):\n            save_id = None\n        else:\n            save_id = StateSave.objects.get(\n                save_id=request.data['save_id'],\n                version=request.data['version'],\n                branch=request.data['branch']).id\n    else:\n        save_id = None\n    lti_session = None\n    if request.data.get('lti_id', None):\n        lti_session = ltiSession.objects.get(id=request.data['lti_id'])\n    serialized = simulationSaveSerializer(\n        data={\"task\": task_id, \"netlist\": temp, \"owner\": owner,\n              \"simulation_type\": simulation_type, \"schematic\": save_id})\n    if serialized.is_valid(raise_exception=True):\n        serialized.save()\n        if lti_session:\n            lti_session.simulations.add(\n                simulation.objects.get(id=serialized.data['id']))\n        return\n    else:\n        return Response(serialized.errors)\n\n\nclass NetlistUploader(APIView):\n    '''\n    API for NetlistUpload\n\n    Requires a multipart/form-data  POST Request with netlist file in the\n    'file' parameter\n    '''\n    permission_classes = (AllowAny,)\n    parser_classes = (MultiPartParser, FormParser,)\n\n    def post(self, request, *args, **kwargs):\n        logger.info('Got POST for netlist upload: ')\n        logger.info(request.data)\n        serializer = TaskSerializer(data=request.data, context={'view': self})\n\n        limits = Limit.objects.all()\n        TIME_LIMIT = 0\n        if limits.exists():\n            TIME_LIMIT = Limit.objects.all()[0].timeLimit\n        # if timeLimit.objects.count() != 0:\n        #     TIME_LIMIT = timeLimit.objects.all()[0]\n        #     print('NOT NONE')\n        # else:\n        #     print('NONE')\n        if serializer.is_valid():\n            serializer.save()\n            saveNetlistDB(\n                serializer.data['task_id'], serializer.data['file'][0]['file'],\n                request)\n            task_id = serializer.data['task_id']\n            if(TIME_LIMIT == 0):\n                celery_task = process_task.apply_async(\n                    kwargs={'task_id': str(task_id)}, task_id=str(task_id)\n                )\n            else:\n                celery_task = process_task.apply_async(\n                    kwargs={'task_id': str(task_id)}, task_id=str(task_id),\n                    soft_time_limit=TIME_LIMIT)\n\n            response_data = {\n                'state': celery_task.state,\n                'details': serializer.data,\n            }\n            return Response(response_data)\n\n        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)\n\n\nclass CeleryResultView(APIView):\n    \"\"\"\n\n    Returns Simulation results for 'task_id' provided after\n    uploading the netlist\n    /api/task/<uuid>\n\n    \"\"\"\n    permission_classes = (AllowAny,)\n    methods = ['GET']\n\n    def get(self, request, task_id):\n\n        if isinstance(task_id, uuid.UUID):\n            celery_result = AsyncResult(str(task_id))\n            response_data = {\n                'state': celery_result.state,\n                'details': celery_result.info\n            }\n            try:\n                Output = simulation.objects.get(task__task_id=task_id)\n                Output.result = celery_result.info\n                Output.save()\n            except simulation.DoesNotExist:\n                pass\n            return Response(response_data)\n        else:\n            raise ValidationError('Invalid uuid format')\n\n\nclass SimulationResults(APIView):\n    permission_classes = (IsAuthenticated, )\n\n    def get(self, request, save_id, sim, version, branch):\n        if sim is None:\n            sims = simulation.objects.filter(\n                owner=self.request.user, schematic__save_id=save_id,\n                schematic__version=version, schematic__branch=branch\n            )\n        else:\n            sims = simulation.objects.filter(\n                owner=self.request.user, schematic__save_id=save_id,\n                schematic__version=version, schematic__branch=branch\n            )\n        serialized = simulationSerializer(sims, many=True)\n        return Response(serialized.data, status=status.HTTP_200_OK)\n\n\nclass SimulationResultsForLTI(APIView):\n    permission_classes = (IsAuthenticated, )\n\n    def get(self, request, save_id, sim, version, branch):\n        if sim is None:\n            sims = simulation.objects.filter(\n                owner=self.request.user, schematic__save_id=save_id\n            )\n        else:\n            sims = simulation.objects.filter(\n                owner=self.request.user, schematic__save_id=save_id\n            )\n        serialized = simulationSerializer(sims, many=True)\n        return Response(serialized.data, status=status.HTTP_200_OK)\n\n\nclass SimulationResultsFromSimulator(APIView):\n    permission_classes = (IsAuthenticated, )\n\n    def get(self, request, sim):\n        sims = simulation.objects.filter(\n            owner=self.request.user, simulation_type=sim)\n        serialized = simulationSerializer(sims, many=True)\n        return Response(serialized.data, status=status.HTTP_200_OK)\n\n\nclass GetLTISimResults(APIView):\n    permission_classes = (AllowAny, )\n\n    def get(self, request, lti_id):\n        try:\n            session = ltiSession.objects.get(id=lti_id)\n            serialized = simulationSerializer(\n                session.simulations.all(), many=True)\n            return Response(serialized.data, status=status.HTTP_200_OK)\n        except ltiSession.DoesNotExist:\n            return Response(status=status.HTTP_404_NOT_FOUND)\n\n\n@ celery.signals.task_prerun.connect\ndef statsd_task_prerun(task_id, **kwargs):\n    current_task.start_time = time.time()\n\n\n@ celery.signals.task_postrun.connect\ndef statsd_task_postrun(task_id, **kwargs):\n    runtime = time.time() - current_task.start_time\n    runtime = math.ceil(runtime)\n    statObj, created = runtimeStat.objects.get_or_create(exec_time=runtime)\n    statObj.qty += 1\n    statObj.save()\n"
  },
  {
    "path": "esim-cloud-backend/workflowAPI/__init__.py",
    "content": "default_app_config = 'workflowAPI.apps.WorkflowapiConfig'\n"
  },
  {
    "path": "esim-cloud-backend/workflowAPI/admin.py",
    "content": "from django.contrib import admin\nfrom django.contrib.auth.models import Group\nfrom django.contrib.auth import get_user_model\nfrom django.contrib.auth.admin import GroupAdmin as BaseGroupAdmin\nfrom workflowAPI.models import State, Transition, CustomGroup, Permission\nfrom publishAPI.models import TransitionHistory\n\n\n# Register your models here.\n@admin.register(State)\nclass CircuitStates(admin.ModelAdmin):\n    list_display = ['name']\n\n\n@admin.register(Transition)\nclass Transitions(admin.ModelAdmin):\n    list_display = ['name', 'from_state', 'to_state']\n    fieldsets = (\n        ('Details of Transition', {\n            'fields': (\n                'name', 'from_state', 'to_state', 'role',\n                'restricted_for_creator',\n                'only_for_creator')\n        }),\n        ('Messages for Creator of Project', {\n            'classes': ('collapse',),\n            'fields': ('event_creator', 'history_creator',),\n        }),\n        ('Messages for Reviewer', {\n            'classes': ('collapse',),\n            'fields': ('event_reviewer', 'history_reviewer',),\n        }),\n        ('Messages for Other Users', {\n            'classes': ('collapse',),\n            'fields': ('event_other', 'history_other',),\n        }),\n    )\n\n\n@admin.register(TransitionHistory)\nclass TransitionHistories(admin.ModelAdmin):\n    readonly_fields = (\n        'id', 'transition', 'transition_author', 'transition_time',\n        'reviewer_notes', 'is_done_by_reviewer')\n    list_display = ['id', 'transition', 'transition_author',\n                    'transition_time', ]\n\n\n@admin.register(Permission)\nclass PermissionsAdmin(admin.ModelAdmin):\n    fieldsets = (\n        (None, {\n            'fields': ('role',)\n        }),\n        ('View Permissions', {\n            'classes': ('collapse',),\n            'fields': ('view_own_states', 'view_other_states',),\n        }),\n        ('Edit Permissions', {\n            'classes': ('collapse',),\n            'fields': ('edit_own_states',),\n        }),\n        ('Delete Permissions', {\n            'classes': ('collapse',),\n            'fields': ('del_own_states',),\n        }),\n    )\n\n\nclass GroupInline(admin.TabularInline):\n    model = CustomGroup\n    can_delete = False\n    # verbose_name_plural = 'custom groups'\n\n\nclass GroupAdmin(BaseGroupAdmin):\n    inlines = (GroupInline,)\n\n\n# Re-register GroupAdmin\nadmin.site.unregister(Group)\nadmin.site.register(Group, GroupAdmin)\n"
  },
  {
    "path": "esim-cloud-backend/workflowAPI/apps.py",
    "content": "from django.apps import AppConfig\nimport workflowAPI\n\n\nclass WorkflowapiConfig(AppConfig):\n    name = 'workflowAPI'\n    verbose_name = 'Workflow API'\n\n    def ready(self):\n        import workflowAPI.signals.handlers\n"
  },
  {
    "path": "esim-cloud-backend/workflowAPI/fixtures/gallery_setup.json",
    "content": "[\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 1,\n        \"fields\": {\n            \"save_id\": \"gallery21fbdfa6-f8f0-4cd4-bed2-307dda84d43c\",\n            \"data_dump\": \"<mxGraphModel><root><mxCell id=\\\"0\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"V1&#10;1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"250\\\" y=\\\"270\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"3\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1&#10;1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"250\\\" y=\\\"270\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"4\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"119\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1&#10;1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"250\\\" y=\\\"270\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R1&#10;1k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"700\\\" y=\\\"290\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"6\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1&#10;1k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"700\\\" y=\\\"290\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"7\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R2.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1&#10;1k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"700\\\" y=\\\"290\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R2&#10;2k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"700\\\" y=\\\"430\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"2k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"9\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R2.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2&#10;2k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"700\\\" y=\\\"430\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"2k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"10\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2&#10;2k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"700\\\" y=\\\"430\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"2k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"11\\\" edge=\\\"1\\\" node=\\\"V1.1\\\" sourceVertex=\\\"3\\\" targetVertex=\\\"6\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"12\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"480\\\" y=\\\"590\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"13\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"12\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"480\\\" y=\\\"590\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"14\\\" edge=\\\"1\\\" sourceVertex=\\\"4\\\" targetVertex=\\\"13\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"16\\\" edge=\\\"1\\\" sourceVertex=\\\"10\\\" targetVertex=\\\"13\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"17\\\" edge=\\\"1\\\" node=\\\"R2.1\\\" sourceVertex=\\\"9\\\" targetVertex=\\\"7\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell></root></mxGraphModel>\",\n            \"name\": \"Voltage Divider\",\n            \"description\": \"A voltage divider is a simple circuit which turns a large voltage into a smaller one. Using just two series resistors and an input voltage.\",\n            \"media\": \"circuit_images_esim/dd07da32-60d2-4f4a-b121-2b177ac06ad5.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-07-21T14:54:10.407Z\",\n            \"is_arduino\": false,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 2,\n        \"fields\": {\n            \"save_id\": \"gallery151bbd3f-f010-4b90-9125-c48800bfd583\",\n            \"data_dump\": \"<mxGraphModel><root><mxCell id=\\\"0\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"V1&#10;pwl(0m 0 0.5m 5 50m 5 50.5m 0 100m 0)\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"260\\\" y=\\\"260\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"pwl(0m 0 0.5m 5 50m 5 50.5m 0 100m 0)\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"3\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1&#10;pwl(0m 0 0.5m 5 50m 5 50.5m 0 100m 0)\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"260\\\" y=\\\"260\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"pwl(0m 0 0.5m 5 50m 5 50.5m 0 100m 0)\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"4\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"119\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1&#10;pwl(0m 0 0.5m 5 50m 5 50.5m 0 100m 0)\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"260\\\" y=\\\"260\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"pwl(0m 0 0.5m 5 50m 5 50.5m 0 100m 0)\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R1&#10;1k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"710\\\" y=\\\"270\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"6\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1&#10;1k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"710\\\" y=\\\"270\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"7\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1&#10;1k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"710\\\" y=\\\"270\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"C1&#10;10u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"688\\\" y=\\\"420\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"9\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C1&#10;10u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"688\\\" y=\\\"420\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"10\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C1&#10;10u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"688\\\" y=\\\"420\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"11\\\" edge=\\\"1\\\" node=\\\"V1.1\\\" sourceVertex=\\\"3\\\" targetVertex=\\\"6\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"12\\\" edge=\\\"1\\\" node=\\\"R1.2\\\" sourceVertex=\\\"7\\\" targetVertex=\\\"9\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"13\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"300\\\" y=\\\"580\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"14\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"13\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"300\\\" y=\\\"580\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"15\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"698\\\" y=\\\"610\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"16\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"15\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"698\\\" y=\\\"610\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"17\\\" edge=\\\"1\\\" sourceVertex=\\\"10\\\" targetVertex=\\\"16\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"18\\\" edge=\\\"1\\\" sourceVertex=\\\"4\\\" targetVertex=\\\"14\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell></root></mxGraphModel>\",\n            \"name\": \"RC Circuit\",\n            \"description\": \"An RC circuit is a circuit with both a resistor (R) and a capacitor (C). RC circuits are freqent element in electronic devices.\",\n            \"media\": \"circuit_images_esim/66bc19c5-9780-430e-85b3-c68435edc829.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-07-21T14:54:37.432Z\",\n            \"is_arduino\": false,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 3,\n        \"fields\": {\n            \"save_id\": \"gallery421feedc-bc85-4c92-88bf-b38ede1cf715\",\n            \"data_dump\": \"<mxGraphModel><root><mxCell id=\\\"0\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"V1&#10;1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"230\\\" y=\\\"220\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"3\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1&#10;1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"230\\\" y=\\\"220\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"4\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"119\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1&#10;1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"230\\\" y=\\\"220\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R1&#10;1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"510\\\" y=\\\"220\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"6\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1&#10;1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"510\\\" y=\\\"220\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"7\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1&#10;1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"510\\\" y=\\\"220\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"D1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/D-DIODE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"D\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"580\\\" y=\\\"370\\\" width=\\\"80.5\\\" height=\\\"40\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"D1\\\" NAME=\\\"DIODE\\\" N1=\\\"\\\" N2=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".model mydiode D\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=left;verticalAlign=bottom;rotation=0\\\" id=\\\"9\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry y=\\\"19\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"D1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/D-DIODE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"D\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"580\\\" y=\\\"370\\\" width=\\\"80.5\\\" height=\\\"40\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"D1\\\" NAME=\\\"DIODE\\\" N1=\\\"\\\" N2=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".model mydiode D\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"10\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"80\\\" y=\\\"19\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"D1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/D-DIODE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"D\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"580\\\" y=\\\"370\\\" width=\\\"80.5\\\" height=\\\"40\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"D1\\\" NAME=\\\"DIODE\\\" N1=\\\"\\\" N2=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".model mydiode D\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"11\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"270\\\" y=\\\"470\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"12\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"11\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"270\\\" y=\\\"470\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"13\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"730\\\" y=\\\"470\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"14\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"13\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"730\\\" y=\\\"470\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"15\\\" edge=\\\"1\\\" node=\\\"V1.1\\\" sourceVertex=\\\"3\\\" targetVertex=\\\"6\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"16\\\" edge=\\\"1\\\" sourceVertex=\\\"4\\\" targetVertex=\\\"12\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"17\\\" edge=\\\"1\\\" node=\\\"R1.2\\\" sourceVertex=\\\"7\\\" targetVertex=\\\"9\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"18\\\" edge=\\\"1\\\" sourceVertex=\\\"10\\\" targetVertex=\\\"14\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell></root></mxGraphModel>\",\n            \"name\": \"Shunt Clipper\",\n            \"description\": \"A Clipper circuit in which the diode is connected in shunt to the input signal and that attenuates the positive portions of the waveform, is termed as Positive Shunt Clipper.\",\n            \"media\": \"circuit_images_esim/8479bce0-da97-4bdd-852b-15b5f471802a.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-07-21T14:55:24.111Z\",\n            \"is_arduino\": false,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 4,\n        \"fields\": {\n            \"save_id\": \"gallerydb74d573-abf0-4c89-9238-3035bcaeaa94\",\n            \"data_dump\": \"<mxGraphModel><root><mxCell id=\\\"0\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"V1&#10;DC 0 SIN 0 1 200\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"190\\\" y=\\\"270\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"DC 0 SIN 0 1 200\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"3\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1&#10;DC 0 SIN 0 1 200\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"190\\\" y=\\\"270\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"DC 0 SIN 0 1 200\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"4\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"119\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1&#10;DC 0 SIN 0 1 200\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"190\\\" y=\\\"270\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"DC 0 SIN 0 1 200\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"C1&#10;2u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"520\\\" y=\\\"290\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"2u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"6\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C1&#10;2u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"520\\\" y=\\\"290\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"2u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"7\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C1&#10;2u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"520\\\" y=\\\"290\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"2u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R1&#10;1k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"450\\\" y=\\\"290\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"9\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1&#10;1k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"450\\\" y=\\\"290\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"10\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1&#10;1k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"450\\\" y=\\\"290\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"C2&#10;1u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"11\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"640\\\" y=\\\"440\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C2\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"12\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C2&#10;1u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"11\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"640\\\" y=\\\"440\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C2\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"13\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C2&#10;1u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"11\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"640\\\" y=\\\"440\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C2\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"14\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"230\\\" y=\\\"550\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"15\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"14\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"230\\\" y=\\\"550\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"16\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"650\\\" y=\\\"550\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"17\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"16\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"650\\\" y=\\\"550\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"18\\\" edge=\\\"1\\\" sourceVertex=\\\"4\\\" targetVertex=\\\"15\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"19\\\" edge=\\\"1\\\" node=\\\"R1.2\\\" sourceVertex=\\\"10\\\" targetVertex=\\\"7\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"20\\\" edge=\\\"1\\\" node=\\\"R1.1\\\" sourceVertex=\\\"9\\\" targetVertex=\\\"6\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"21\\\" edge=\\\"1\\\" sourceVertex=\\\"3\\\" targetVertex=\\\"20\\\" tarx=\\\"500\\\" tary=\\\"270\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"500\\\" y=\\\"270\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"22\\\" edge=\\\"1\\\" sourceVertex=\\\"12\\\" targetVertex=\\\"19\\\" tarx=\\\"510\\\" tary=\\\"410\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"510\\\" y=\\\"410\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"23\\\" edge=\\\"1\\\" sourceVertex=\\\"13\\\" targetVertex=\\\"17\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell></root></mxGraphModel>\",\n            \"name\": \"RC Circuit ( Parallel )\",\n            \"description\": \"An RC circuit is a circuit with both a resistor (R) and a capacitor (C). RC circuits are freqent element in electronic devices.\",\n            \"media\": \"circuit_images_esim/72d77d05-d683-4d00-ae36-ba924de7eb9b.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-07-21T14:55:30.354Z\",\n            \"is_arduino\": false,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 5,\n        \"fields\": {\n            \"save_id\": \"galleryc6e0e9a9-66a4-486b-b49c-8db2ed4dd09e\",\n            \"data_dump\": \"<mxGraphModel><root><mxCell id=\\\"0\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"V1&#10;dc 0 ac 1 sin(0 1m 500)\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"70\\\" y=\\\"440\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"dc 0 ac 1 sin(0 1m 500)\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"3\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1&#10;dc 0 ac 1 sin(0 1m 500)\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"70\\\" y=\\\"440\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"dc 0 ac 1 sin(0 1m 500)\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"4\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"119\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1&#10;dc 0 ac 1 sin(0 1m 500)\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"70\\\" y=\\\"440\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"dc 0 ac 1 sin(0 1m 500)\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"C1&#10;10u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"250\\\" y=\\\"340\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"6\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"C1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C1&#10;10u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"250\\\" y=\\\"340\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"7\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C1&#10;10u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"250\\\" y=\\\"340\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"8\\\" edge=\\\"1\\\" node=\\\"V1.1\\\" sourceVertex=\\\"3\\\" targetVertex=\\\"7\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"Q2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/Transistor_BJT/Q-BC307-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"9\\\" vertex=\\\"1\\\" symbol=\\\"Q\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"620\\\" y=\\\"300\\\" width=\\\"80\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"Q2\\\" NAME=\\\"BC307\\\" N1=\\\"\\\" N2=\\\"\\\" N3=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".model BC546B npn ( IS=7.59E-15 VAF=73.4 BF=480 IKF=0.0962 NE=1.2665&#10;+ ISE=3.278E-15 IKR=0.03 ISC=2.00E-13 NC=1.2 NR=1 BR=5 RC=0.25 CJC=6.33E-12&#10;+ FC=0.5 MJC=0.33 VJC=0.65 CJE=1.25E-11 MJE=0.55 VJE=0.65 TF=4.26E-10&#10;+ ITF=0.6 VTF=3 XTF=20 RB=100 IRB=0.0001 RBM=10 RE=0.5 TR=1.50E-07)\\\" MULTIPLICITY_PARAMETER=\\\"1\\\" DTEMP=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"10\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R2.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"Q2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/Transistor_BJT/Q-BC307-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"9\\\" vertex=\\\"1\\\" symbol=\\\"Q\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"620\\\" y=\\\"300\\\" width=\\\"80\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"Q2\\\" NAME=\\\"BC307\\\" N1=\\\"\\\" N2=\\\"\\\" N3=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".model BC546B npn ( IS=7.59E-15 VAF=73.4 BF=480 IKF=0.0962 NE=1.2665&#10;+ ISE=3.278E-15 IKR=0.03 ISC=2.00E-13 NC=1.2 NR=1 BR=5 RC=0.25 CJC=6.33E-12&#10;+ FC=0.5 MJC=0.33 VJC=0.65 CJE=1.25E-11 MJE=0.55 VJE=0.65 TF=4.26E-10&#10;+ ITF=0.6 VTF=3 XTF=20 RB=100 IRB=0.0001 RBM=10 RE=0.5 TR=1.50E-07)\\\" MULTIPLICITY_PARAMETER=\\\"1\\\" DTEMP=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=left;verticalAlign=bottom;rotation=0\\\" id=\\\"11\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"C1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"Q2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/Transistor_BJT/Q-BC307-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"9\\\" vertex=\\\"1\\\" symbol=\\\"Q\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"620\\\" y=\\\"300\\\" width=\\\"80\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"Q2\\\" NAME=\\\"BC307\\\" N1=\\\"\\\" N2=\\\"\\\" N3=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".model BC546B npn ( IS=7.59E-15 VAF=73.4 BF=480 IKF=0.0962 NE=1.2665&#10;+ ISE=3.278E-15 IKR=0.03 ISC=2.00E-13 NC=1.2 NR=1 BR=5 RC=0.25 CJC=6.33E-12&#10;+ FC=0.5 MJC=0.33 VJC=0.65 CJE=1.25E-11 MJE=0.55 VJE=0.65 TF=4.26E-10&#10;+ ITF=0.6 VTF=3 XTF=20 RB=100 IRB=0.0001 RBM=10 RE=0.5 TR=1.50E-07)\\\" MULTIPLICITY_PARAMETER=\\\"1\\\" DTEMP=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"3\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"12\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"79\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"Q2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/Transistor_BJT/Q-BC307-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"9\\\" vertex=\\\"1\\\" symbol=\\\"Q\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"620\\\" y=\\\"300\\\" width=\\\"80\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"Q2\\\" NAME=\\\"BC307\\\" N1=\\\"\\\" N2=\\\"\\\" N3=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".model BC546B npn ( IS=7.59E-15 VAF=73.4 BF=480 IKF=0.0962 NE=1.2665&#10;+ ISE=3.278E-15 IKR=0.03 ISC=2.00E-13 NC=1.2 NR=1 BR=5 RC=0.25 CJC=6.33E-12&#10;+ FC=0.5 MJC=0.33 VJC=0.65 CJE=1.25E-11 MJE=0.55 VJE=0.65 TF=4.26E-10&#10;+ ITF=0.6 VTF=3 XTF=20 RB=100 IRB=0.0001 RBM=10 RE=0.5 TR=1.50E-07)\\\" MULTIPLICITY_PARAMETER=\\\"1\\\" DTEMP=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"13\\\" edge=\\\"1\\\" node=\\\"C1.1\\\" sourceVertex=\\\"6\\\" targetVertex=\\\"11\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDS\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDS-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"14\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"110\\\" y=\\\"610\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDS\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"15\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDS\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDS-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"14\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"110\\\" y=\\\"610\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDS\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"16\\\" edge=\\\"1\\\" sourceVertex=\\\"4\\\" targetVertex=\\\"15\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDS\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDS-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"17\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"660\\\" y=\\\"610\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDS\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"18\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDS\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDS-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"17\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"660\\\" y=\\\"610\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDS\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"19\\\" edge=\\\"1\\\" sourceVertex=\\\"12\\\" targetVertex=\\\"18\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R1&#10;10k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"20\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"380\\\" y=\\\"460\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"21\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1&#10;10k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"20\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"380\\\" y=\\\"460\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"22\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1&#10;10k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"20\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"380\\\" y=\\\"460\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"24\\\" edge=\\\"1\\\" sourceVertex=\\\"22\\\" targetVertex=\\\"19\\\" tarx=\\\"680\\\" tary=\\\"620\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"680\\\" y=\\\"620\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R2&#10;10k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"25\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"672\\\" y=\\\"110\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"26\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2&#10;10k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"25\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"672\\\" y=\\\"110\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"27\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R2.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2&#10;10k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"25\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"672\\\" y=\\\"110\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"28\\\" edge=\\\"1\\\" node=\\\"R2.2\\\" sourceVertex=\\\"27\\\" targetVertex=\\\"10\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R3&#10;68k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"29\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"430\\\" y=\\\"110\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R3\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"68k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"30\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V2.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R3&#10;68k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"29\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"430\\\" y=\\\"110\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R3\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"68k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"31\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R3&#10;68k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"29\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"430\\\" y=\\\"110\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R3\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"68k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"V2&#10;5\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"33\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"70\\\" y=\\\"90\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V2\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"5\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"34\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V2.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V2&#10;5\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"33\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"70\\\" y=\\\"90\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V2\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"5\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"35\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"119\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V2&#10;5\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"33\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"70\\\" y=\\\"90\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V2\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"5\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"36\\\" edge=\\\"1\\\" node=\\\"V2.1\\\" sourceVertex=\\\"34\\\" targetVertex=\\\"30\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"37\\\" edge=\\\"1\\\" sourceVertex=\\\"26\\\" targetVertex=\\\"36\\\" tarx=\\\"440\\\" tary=\\\"90\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"440\\\" y=\\\"90\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDS\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDS-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"38\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"110\\\" y=\\\"230\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDS\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"39\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDS\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDS-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"38\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"110\\\" y=\\\"230\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDS\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"40\\\" edge=\\\"1\\\" sourceVertex=\\\"35\\\" targetVertex=\\\"39\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"41\\\" edge=\\\"1\\\" sourceVertex=\\\"21\\\" targetVertex=\\\"13\\\" tarx=\\\"560\\\" tary=\\\"350\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"560\\\" y=\\\"350\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"42\\\" edge=\\\"1\\\" sourceVertex=\\\"31\\\" targetVertex=\\\"13\\\" tarx=\\\"570\\\" tary=\\\"340\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"570\\\" y=\\\"340\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"C3&#10;10u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"43\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"850\\\" y=\\\"270\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C3\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"44\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C3&#10;10u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"43\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"850\\\" y=\\\"270\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C3\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"45\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"C3.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C3&#10;10u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"43\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"850\\\" y=\\\"270\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C3\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"46\\\" edge=\\\"1\\\" sourceVertex=\\\"44\\\" targetVertex=\\\"28\\\" tarx=\\\"680\\\" tary=\\\"270\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"680\\\" y=\\\"270\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R4&#10;100k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"47\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"872\\\" y=\\\"460\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R4\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"100k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"48\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"C3.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R4&#10;100k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"47\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"872\\\" y=\\\"460\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R4\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"100k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"49\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R4&#10;100k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"47\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"872\\\" y=\\\"460\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R4\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"100k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"50\\\" edge=\\\"1\\\" node=\\\"C3.2\\\" sourceVertex=\\\"45\\\" targetVertex=\\\"48\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"51\\\" edge=\\\"1\\\" sourceVertex=\\\"49\\\" targetVertex=\\\"19\\\" tarx=\\\"680\\\" tary=\\\"640\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"680\\\" y=\\\"640\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell></root></mxGraphModel>\",\n            \"name\": \"Bipolar Amplifier\",\n            \"description\": \"A basic BJT amplifier has a very high gain that may vary widely from one transistor to the next. A NPN bipolar transistor is the used as amplifying device.\",\n            \"media\": \"circuit_images_esim/63c65de8-dd49-42c2-9cb7-9cec86fbd544.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-07-21T14:55:37.104Z\",\n            \"is_arduino\": false,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 6,\n        \"fields\": {\n            \"save_id\": \"gallery5aa827c0-5a3c-4226-86f7-88efbb4e0ec2\",\n            \"data_dump\": \"<mxGraphModel><root><mxCell id=\\\"0\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"V1&#10;dc 0 PULSE (0 5 1u 1u 1u 1 1)\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"250\\\" y=\\\"240.00000000000003\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"dc 0 PULSE (0 5 1u 1u 1u 1 1)\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"3\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1&#10;dc 0 PULSE (0 5 1u 1u 1u 1 1)\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"250\\\" y=\\\"240.00000000000003\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"dc 0 PULSE (0 5 1u 1u 1u 1 1)\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"4\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"119\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1&#10;dc 0 PULSE (0 5 1u 1u 1u 1 1)\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"250\\\" y=\\\"240.00000000000003\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"dc 0 PULSE (0 5 1u 1u 1u 1 1)\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R1&#10;10k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"514\\\" y=\\\"200.50000000000003\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"6\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1&#10;10k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"514\\\" y=\\\"200.50000000000003\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"7\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1&#10;10k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"514\\\" y=\\\"200.50000000000003\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"10k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"C1&#10;1u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"492.00000000000006\\\" y=\\\"360\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"9\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C1&#10;1u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"492.00000000000006\\\" y=\\\"360\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"10\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C1&#10;1u\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"8\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"492.00000000000006\\\" y=\\\"360\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"C2&#10;100n\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"11\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"638\\\" y=\\\"370\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C2\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"100n\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"12\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R2.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C2&#10;100n\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"11\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"638\\\" y=\\\"370\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C2\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"100n\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"13\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C2&#10;100n\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"11\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"638\\\" y=\\\"370\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C2\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"100n\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R2&#10;1k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"14\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"660\\\" y=\\\"200.50000000000003\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"15\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2&#10;1k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"14\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"660\\\" y=\\\"200.50000000000003\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"16\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R2.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2&#10;1k\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"14\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"660\\\" y=\\\"200.50000000000003\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"17\\\" edge=\\\"1\\\" node=\\\"V1.1\\\" sourceVertex=\\\"3\\\" targetVertex=\\\"6\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"18\\\" edge=\\\"1\\\" node=\\\"R1.2\\\" sourceVertex=\\\"7\\\" targetVertex=\\\"9\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"20\\\" edge=\\\"1\\\" sourceVertex=\\\"15\\\" targetVertex=\\\"18\\\" tarx=\\\"520\\\" tary=\\\"330\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"520\\\" y=\\\"330\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"21\\\" edge=\\\"1\\\" node=\\\"R2.2\\\" sourceVertex=\\\"16\\\" targetVertex=\\\"12\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"22\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"290\\\" y=\\\"419\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"23\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"22\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"290\\\" y=\\\"419\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"24\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"502\\\" y=\\\"480\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"25\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"24\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"502\\\" y=\\\"480\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"26\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"648\\\" y=\\\"510\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"27\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"26\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"648\\\" y=\\\"510\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"28\\\" edge=\\\"1\\\" sourceVertex=\\\"4\\\" targetVertex=\\\"23\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"29\\\" edge=\\\"1\\\" sourceVertex=\\\"10\\\" targetVertex=\\\"25\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"30\\\" edge=\\\"1\\\" sourceVertex=\\\"13\\\" targetVertex=\\\"27\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell></root></mxGraphModel>\",\n            \"name\": \"Dual RC Ladder\",\n            \"description\": \"This is an dual RC ladder circuit with Passive components. The input is a voltage waveform (a pulse) versus time, and the output is a waveform as well. \",\n            \"media\": \"circuit_images_esim/a2cd6a0f-ae51-4542-9ac7-461cea9be73e.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-07-21T14:55:57.688Z\",\n            \"is_arduino\": false,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 7,\n        \"fields\": {\n            \"save_id\": \"galleryed8541ba-fd41-4837-b37b-b9f19d16b1c7\",\n            \"data_dump\": \"<mxGraphModel><root><mxCell id=\\\"0\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"Q1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/Transistor_BJT/Q-BC547-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"345\\\" vertex=\\\"1\\\" symbol=\\\"Q\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"230\\\" y=\\\"440\\\" width=\\\"80\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"Q1\\\" NAME=\\\"BC547\\\" N1=\\\"\\\" N2=\\\"\\\" N3=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".MODEL 2N4401 NPN (&#10;+ IS=1.75E-12 ISE=5.92E-14 ISC=9.42E-14&#10;+ XTI=3.00 BF=3.03E2 BR=1.00E-2 IKF=2.11E-1 IKR=1.00 XTB=1.5&#10;+ VAF=3.60E2 VAR=1.64E1 VJE=3.00E-1 VJC=3.00E-1 RE=1.00E-2 &#10;+ RC=1.07 RB=8.63E1 RBM=1.00E-2 IRB=9.62E-3 CJE=2.64E-11&#10;+ CJC=1.37E-11 XCJC=1.00 FC=5.00E-1 NF=1.10 NR=1.71 NE=1.26&#10;+ NC=1.00 MJE=4.09E-1 MJC=4.89E-1 TF=5.16E-10 TR=233.7E-9&#10;+ PTF=0 ITF=5.09E-1 VTF=1.09E5 XTF=1.64 EG=1.11 KF=1E-9 AF=1&#10;+ )\\\" MULTIPLICITY_PARAMETER=\\\"1\\\" DTEMP=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"346\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R2.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"Q1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/Transistor_BJT/Q-BC547-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"345\\\" vertex=\\\"1\\\" symbol=\\\"Q\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"230\\\" y=\\\"440\\\" width=\\\"80\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"Q1\\\" NAME=\\\"BC547\\\" N1=\\\"\\\" N2=\\\"\\\" N3=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".MODEL 2N4401 NPN (&#10;+ IS=1.75E-12 ISE=5.92E-14 ISC=9.42E-14&#10;+ XTI=3.00 BF=3.03E2 BR=1.00E-2 IKF=2.11E-1 IKR=1.00 XTB=1.5&#10;+ VAF=3.60E2 VAR=1.64E1 VJE=3.00E-1 VJC=3.00E-1 RE=1.00E-2 &#10;+ RC=1.07 RB=8.63E1 RBM=1.00E-2 IRB=9.62E-3 CJE=2.64E-11&#10;+ CJC=1.37E-11 XCJC=1.00 FC=5.00E-1 NF=1.10 NR=1.71 NE=1.26&#10;+ NC=1.00 MJE=4.09E-1 MJC=4.89E-1 TF=5.16E-10 TR=233.7E-9&#10;+ PTF=0 ITF=5.09E-1 VTF=1.09E5 XTF=1.64 EG=1.11 KF=1E-9 AF=1&#10;+ )\\\" MULTIPLICITY_PARAMETER=\\\"1\\\" DTEMP=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=left;verticalAlign=bottom;rotation=0\\\" id=\\\"347\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R4.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"Q1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/Transistor_BJT/Q-BC547-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"345\\\" vertex=\\\"1\\\" symbol=\\\"Q\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"230\\\" y=\\\"440\\\" width=\\\"80\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"Q1\\\" NAME=\\\"BC547\\\" N1=\\\"\\\" N2=\\\"\\\" N3=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".MODEL 2N4401 NPN (&#10;+ IS=1.75E-12 ISE=5.92E-14 ISC=9.42E-14&#10;+ XTI=3.00 BF=3.03E2 BR=1.00E-2 IKF=2.11E-1 IKR=1.00 XTB=1.5&#10;+ VAF=3.60E2 VAR=1.64E1 VJE=3.00E-1 VJC=3.00E-1 RE=1.00E-2 &#10;+ RC=1.07 RB=8.63E1 RBM=1.00E-2 IRB=9.62E-3 CJE=2.64E-11&#10;+ CJC=1.37E-11 XCJC=1.00 FC=5.00E-1 NF=1.10 NR=1.71 NE=1.26&#10;+ NC=1.00 MJE=4.09E-1 MJC=4.89E-1 TF=5.16E-10 TR=233.7E-9&#10;+ PTF=0 ITF=5.09E-1 VTF=1.09E5 XTF=1.64 EG=1.11 KF=1E-9 AF=1&#10;+ )\\\" MULTIPLICITY_PARAMETER=\\\"1\\\" DTEMP=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"3\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"348\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"79\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"Q1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/Transistor_BJT/Q-BC547-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"345\\\" vertex=\\\"1\\\" symbol=\\\"Q\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"230\\\" y=\\\"440\\\" width=\\\"80\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"Q1\\\" NAME=\\\"BC547\\\" N1=\\\"\\\" N2=\\\"\\\" N3=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".MODEL 2N4401 NPN (&#10;+ IS=1.75E-12 ISE=5.92E-14 ISC=9.42E-14&#10;+ XTI=3.00 BF=3.03E2 BR=1.00E-2 IKF=2.11E-1 IKR=1.00 XTB=1.5&#10;+ VAF=3.60E2 VAR=1.64E1 VJE=3.00E-1 VJC=3.00E-1 RE=1.00E-2 &#10;+ RC=1.07 RB=8.63E1 RBM=1.00E-2 IRB=9.62E-3 CJE=2.64E-11&#10;+ CJC=1.37E-11 XCJC=1.00 FC=5.00E-1 NF=1.10 NR=1.71 NE=1.26&#10;+ NC=1.00 MJE=4.09E-1 MJC=4.89E-1 TF=5.16E-10 TR=233.7E-9&#10;+ PTF=0 ITF=5.09E-1 VTF=1.09E5 XTF=1.64 EG=1.11 KF=1E-9 AF=1&#10;+ )\\\" MULTIPLICITY_PARAMETER=\\\"1\\\" DTEMP=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"Q1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/Transistor_BJT/Q-BC547-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"349\\\" vertex=\\\"1\\\" symbol=\\\"Q\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"676\\\" y=\\\"450\\\" width=\\\"80\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"Q1\\\" NAME=\\\"BC547\\\" N1=\\\"\\\" N2=\\\"\\\" N3=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".MODEL 2N4401 NPN (&#10;+ IS=1.75E-12 ISE=5.92E-14 ISC=9.42E-14&#10;+ XTI=3.00 BF=3.03E2 BR=1.00E-2 IKF=2.11E-1 IKR=1.00 XTB=1.5&#10;+ VAF=3.60E2 VAR=1.64E1 VJE=3.00E-1 VJC=3.00E-1 RE=1.00E-2 &#10;+ RC=1.07 RB=8.63E1 RBM=1.00E-2 IRB=9.62E-3 CJE=2.64E-11&#10;+ CJC=1.37E-11 XCJC=1.00 FC=5.00E-1 NF=1.10 NR=1.71 NE=1.26&#10;+ NC=1.00 MJE=4.09E-1 MJC=4.89E-1 TF=5.16E-10 TR=233.7E-9&#10;+ PTF=0 ITF=5.09E-1 VTF=1.09E5 XTF=1.64 EG=1.11 KF=1E-9 AF=1&#10;+ )\\\" MULTIPLICITY_PARAMETER=\\\"1\\\" DTEMP=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"350\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R3.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"Q1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/Transistor_BJT/Q-BC547-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"349\\\" vertex=\\\"1\\\" symbol=\\\"Q\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"676\\\" y=\\\"450\\\" width=\\\"80\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"Q1\\\" NAME=\\\"BC547\\\" N1=\\\"\\\" N2=\\\"\\\" N3=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".MODEL 2N4401 NPN (&#10;+ IS=1.75E-12 ISE=5.92E-14 ISC=9.42E-14&#10;+ XTI=3.00 BF=3.03E2 BR=1.00E-2 IKF=2.11E-1 IKR=1.00 XTB=1.5&#10;+ VAF=3.60E2 VAR=1.64E1 VJE=3.00E-1 VJC=3.00E-1 RE=1.00E-2 &#10;+ RC=1.07 RB=8.63E1 RBM=1.00E-2 IRB=9.62E-3 CJE=2.64E-11&#10;+ CJC=1.37E-11 XCJC=1.00 FC=5.00E-1 NF=1.10 NR=1.71 NE=1.26&#10;+ NC=1.00 MJE=4.09E-1 MJC=4.89E-1 TF=5.16E-10 TR=233.7E-9&#10;+ PTF=0 ITF=5.09E-1 VTF=1.09E5 XTF=1.64 EG=1.11 KF=1E-9 AF=1&#10;+ )\\\" MULTIPLICITY_PARAMETER=\\\"1\\\" DTEMP=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=left;verticalAlign=bottom;rotation=0\\\" id=\\\"351\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"Q1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/Transistor_BJT/Q-BC547-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"349\\\" vertex=\\\"1\\\" symbol=\\\"Q\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"676\\\" y=\\\"450\\\" width=\\\"80\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"Q1\\\" NAME=\\\"BC547\\\" N1=\\\"\\\" N2=\\\"\\\" N3=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".MODEL 2N4401 NPN (&#10;+ IS=1.75E-12 ISE=5.92E-14 ISC=9.42E-14&#10;+ XTI=3.00 BF=3.03E2 BR=1.00E-2 IKF=2.11E-1 IKR=1.00 XTB=1.5&#10;+ VAF=3.60E2 VAR=1.64E1 VJE=3.00E-1 VJC=3.00E-1 RE=1.00E-2 &#10;+ RC=1.07 RB=8.63E1 RBM=1.00E-2 IRB=9.62E-3 CJE=2.64E-11&#10;+ CJC=1.37E-11 XCJC=1.00 FC=5.00E-1 NF=1.10 NR=1.71 NE=1.26&#10;+ NC=1.00 MJE=4.09E-1 MJC=4.89E-1 TF=5.16E-10 TR=233.7E-9&#10;+ PTF=0 ITF=5.09E-1 VTF=1.09E5 XTF=1.64 EG=1.11 KF=1E-9 AF=1&#10;+ )\\\" MULTIPLICITY_PARAMETER=\\\"1\\\" DTEMP=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"3\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"352\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"79\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"Q1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/Transistor_BJT/Q-BC547-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"349\\\" vertex=\\\"1\\\" symbol=\\\"Q\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"676\\\" y=\\\"450\\\" width=\\\"80\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"Q1\\\" NAME=\\\"BC547\\\" N1=\\\"\\\" N2=\\\"\\\" N3=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".MODEL 2N4401 NPN (&#10;+ IS=1.75E-12 ISE=5.92E-14 ISC=9.42E-14&#10;+ XTI=3.00 BF=3.03E2 BR=1.00E-2 IKF=2.11E-1 IKR=1.00 XTB=1.5&#10;+ VAF=3.60E2 VAR=1.64E1 VJE=3.00E-1 VJC=3.00E-1 RE=1.00E-2 &#10;+ RC=1.07 RB=8.63E1 RBM=1.00E-2 IRB=9.62E-3 CJE=2.64E-11&#10;+ CJC=1.37E-11 XCJC=1.00 FC=5.00E-1 NF=1.10 NR=1.71 NE=1.26&#10;+ NC=1.00 MJE=4.09E-1 MJC=4.89E-1 TF=5.16E-10 TR=233.7E-9&#10;+ PTF=0 ITF=5.09E-1 VTF=1.09E5 XTF=1.64 EG=1.11 KF=1E-9 AF=1&#10;+ )\\\" MULTIPLICITY_PARAMETER=\\\"1\\\" DTEMP=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"353\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"398\\\" y=\\\"180\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"354\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"353\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"398\\\" y=\\\"180\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"355\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"353\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"398\\\" y=\\\"180\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"356\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"250\\\" y=\\\"180\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"330\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"357\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"356\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"250\\\" y=\\\"180\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"330\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"358\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R2.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"356\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"250\\\" y=\\\"180\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"330\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R3\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"359\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"660\\\" y=\\\"180\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R3\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"330\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"360\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R3\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"359\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"660\\\" y=\\\"180\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R3\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"330\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"361\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R3.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R3\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"359\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"660\\\" y=\\\"180\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R3\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"330\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R4\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"362\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"540\\\" y=\\\"180\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R4\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"363\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R4\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"362\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"540\\\" y=\\\"180\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R4\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"364\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R4.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R4\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"362\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"540\\\" y=\\\"180\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R4\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"C1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"365\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"338\\\" y=\\\"320\\\" width=\\\"80.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"18u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"1\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=90;\\\" id=\\\"366\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"80\\\" y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"365\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"338\\\" y=\\\"320\\\" width=\\\"80.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"18u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"1\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=90;\\\" id=\\\"367\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R2.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"365\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"338\\\" y=\\\"320\\\" width=\\\"80.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"18u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"1\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"C1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"371\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"610\\\" y=\\\"320\\\" width=\\\"80.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"18u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=90;\\\" id=\\\"372\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R3.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"80\\\" y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"371\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"610\\\" y=\\\"320\\\" width=\\\"80.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"18u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=90;\\\" id=\\\"373\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R4.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"371\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"610\\\" y=\\\"320\\\" width=\\\"80.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C1\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"18u\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GND3\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GND3-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"374\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"470\\\" y=\\\"590\\\" width=\\\"20\\\" height=\\\"40\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GND3\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"375\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"10\\\" y=\\\"19\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GND3\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GND3-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"374\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"470\\\" y=\\\"590\\\" width=\\\"20\\\" height=\\\"40\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GND3\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GND3\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GND3-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"376\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"930\\\" y=\\\"470\\\" width=\\\"20\\\" height=\\\"40\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GND3\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"377\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"10\\\" y=\\\"19\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GND3\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GND3-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"376\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"930\\\" y=\\\"470\\\" width=\\\"20\\\" height=\\\"40\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GND3\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"V1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-DC-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"378\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"910\\\" y=\\\"250\\\" width=\\\"60\\\" height=\\\"180\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"DC\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"5\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"379\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-DC-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"378\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"910\\\" y=\\\"250\\\" width=\\\"60\\\" height=\\\"180\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"DC\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"5\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"380\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" y=\\\"179\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-DC-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"378\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"910\\\" y=\\\"250\\\" width=\\\"60\\\" height=\\\"180\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"DC\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"5\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"381\\\" edge=\\\"1\\\" sourceVertex=\\\"380\\\" targetVertex=\\\"377\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"382\\\" edge=\\\"1\\\" node=\\\"V1.1\\\" sourceVertex=\\\"379\\\" targetVertex=\\\"354\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"><mxPoint x=\\\"940\\\" y=\\\"110\\\"/><mxPoint x=\\\"440\\\" y=\\\"140\\\"/><mxPoint x=\\\"470\\\" y=\\\"230\\\"/></Array></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"940\\\" y=\\\"110\\\"/><mxPoint x=\\\"440\\\" y=\\\"140\\\"/><mxPoint x=\\\"470\\\" y=\\\"230\\\"/></Array><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"383\\\" edge=\\\"1\\\" sourceVertex=\\\"363\\\" targetVertex=\\\"382\\\" tarx=\\\"470\\\" tary=\\\"200\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"470\\\" y=\\\"200\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"384\\\" edge=\\\"1\\\" sourceVertex=\\\"360\\\" targetVertex=\\\"382\\\" tarx=\\\"470\\\" tary=\\\"190\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"470\\\" y=\\\"190\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"385\\\" edge=\\\"1\\\" sourceVertex=\\\"357\\\" targetVertex=\\\"382\\\" tarx=\\\"470\\\" tary=\\\"190\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"470\\\" y=\\\"190\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"386\\\" edge=\\\"1\\\" node=\\\"R2.2\\\" sourceVertex=\\\"358\\\" targetVertex=\\\"346\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"387\\\" edge=\\\"1\\\" node=\\\"R2.2\\\" sourceVertex=\\\"358\\\" targetVertex=\\\"367\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"388\\\" edge=\\\"1\\\" node=\\\"R1.2\\\" sourceVertex=\\\"355\\\" targetVertex=\\\"366\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"389\\\" edge=\\\"1\\\" node=\\\"R1.2\\\" sourceVertex=\\\"355\\\" targetVertex=\\\"351\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"><mxPoint x=\\\"470\\\" y=\\\"500\\\"/></Array></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"470\\\" y=\\\"500\\\"/></Array><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"390\\\" edge=\\\"1\\\" node=\\\"R4.2\\\" sourceVertex=\\\"364\\\" targetVertex=\\\"347\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"><mxPoint x=\\\"540\\\" y=\\\"460\\\"/><mxPoint x=\\\"210\\\" y=\\\"430\\\"/><mxPoint x=\\\"200\\\" y=\\\"490\\\"/></Array></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"540\\\" y=\\\"460\\\"/><mxPoint x=\\\"210\\\" y=\\\"430\\\"/><mxPoint x=\\\"200\\\" y=\\\"490\\\"/></Array><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"391\\\" edge=\\\"1\\\" node=\\\"R3.2\\\" sourceVertex=\\\"361\\\" targetVertex=\\\"372\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"392\\\" edge=\\\"1\\\" node=\\\"R4.2\\\" sourceVertex=\\\"364\\\" targetVertex=\\\"373\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"393\\\" edge=\\\"1\\\" node=\\\"R3.2\\\" sourceVertex=\\\"361\\\" targetVertex=\\\"350\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"394\\\" edge=\\\"1\\\" sourceVertex=\\\"348\\\" targetVertex=\\\"375\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"><mxPoint x=\\\"290\\\" y=\\\"610\\\"/></Array></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"290\\\" y=\\\"610\\\"/></Array><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"395\\\" edge=\\\"1\\\" sourceVertex=\\\"352\\\" targetVertex=\\\"375\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"><mxPoint x=\\\"730\\\" y=\\\"600\\\"/></Array></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"730\\\" y=\\\"600\\\"/></Array><Object as=\\\"properties\\\"/></mxCell></root></mxGraphModel>\",\n            \"name\": \"AstableMultivibrator\",\n            \"description\": \"A multivibrator is an electronic circuit used to implement a variety of simple two-state devices such as relaxation oscillators, timers and flip-flops. It consists of two amplifying devices cross-coupled by resistors or capacitors.\",\n            \"media\": \"circuit_images_esim/b506a969-d68a-48c2-9675-4d93dd1cbc59.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-07-21T14:56:26.988Z\",\n            \"is_arduino\": false,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 8,\n        \"fields\": {\n            \"save_id\": \"gallery9461d954-1fd0-4d12-96f3-d30c3341ed68\",\n            \"data_dump\": \"<mxGraphModel><root><mxCell id=\\\"0\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"V1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-DC-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=-180;\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"156\\\" y=\\\"220\\\" width=\\\"60\\\" height=\\\"180.5\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"DC\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"DC 0 AC 1 SINE(0 1.5 1k 0 0 0 0)\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0;\\\" id=\\\"3\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" y=\\\"180\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-DC-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=-180;\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"156\\\" y=\\\"220\\\" width=\\\"60\\\" height=\\\"180.5\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"DC\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"DC 0 AC 1 SINE(0 1.5 1k 0 0 0 0)\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0;\\\" id=\\\"4\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" y=\\\"1\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-DC-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=-180;\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"156\\\" y=\\\"220\\\" width=\\\"60\\\" height=\\\"180.5\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"DC\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"DC 0 AC 1 SINE(0 1.5 1k 0 0 0 0)\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"PRI_LO\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-PRI_LO-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=-180;\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"180\\\" y=\\\"490\\\" width=\\\"12\\\" height=\\\"40\\\" as=\\\"geometry\\\"/><Object NAME=\\\"PRI_LO\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0;\\\" id=\\\"6\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"6\\\" y=\\\"21\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"PRI_LO\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-PRI_LO-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=-180;\\\" id=\\\"5\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"180\\\" y=\\\"490\\\" width=\\\"12\\\" height=\\\"40\\\" as=\\\"geometry\\\"/><Object NAME=\\\"PRI_LO\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"C2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"7\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"600\\\" y=\\\"260\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C2\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"100n\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"8\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"7\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"600\\\" y=\\\"260\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C2\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"100n\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"9\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"C2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/C-CAP-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"7\\\" vertex=\\\"1\\\" symbol=\\\"C\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"600\\\" y=\\\"260\\\" width=\\\"60\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"C2\\\" NAME=\\\"CAP\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"100n\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"F\\\" IC=\\\"0\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"10\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"700\\\" y=\\\"260\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"100k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"11\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"D2.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"10\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"700\\\" y=\\\"260\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"100k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"12\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"10\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"700\\\" y=\\\"260\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"100k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=-90;\\\" id=\\\"13\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"310\\\" y=\\\"120\\\" width=\\\"57.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0;\\\" id=\\\"14\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=-90;\\\" id=\\\"13\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"310\\\" y=\\\"120\\\" width=\\\"57.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0;\\\" id=\\\"15\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R2.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"57\\\" y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=-90;\\\" id=\\\"13\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"310\\\" y=\\\"120\\\" width=\\\"57.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"D2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-additional/symbol-svgs/Diode/D-1N4148-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=180;\\\" id=\\\"16\\\" vertex=\\\"1\\\" symbol=\\\"D\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"480\\\" y=\\\"160\\\" width=\\\"60.5\\\" height=\\\"20\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"D2\\\" NAME=\\\"1N4148\\\" N1=\\\"\\\" N2=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".model D1N4148  D(Is=5.84n N=1.94 Rs=.7017 Ikf=44.17m Xti=3 Eg=1.11 Cjo=.95p&#10;+               M=.55 Vj=.75 Fc=.5 Isr=11.07n Nr=2.088 Bv=100 Ibv=100u Tt=11.07n)\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=left;verticalAlign=bottom;rotation=0;\\\" id=\\\"17\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"D2.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"11\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"D2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-additional/symbol-svgs/Diode/D-1N4148-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=180;\\\" id=\\\"16\\\" vertex=\\\"1\\\" symbol=\\\"D\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"480\\\" y=\\\"160\\\" width=\\\"60.5\\\" height=\\\"20\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"D2\\\" NAME=\\\"1N4148\\\" N1=\\\"\\\" N2=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".model D1N4148  D(Is=5.84n N=1.94 Rs=.7017 Ikf=44.17m Xti=3 Eg=1.11 Cjo=.95p&#10;+               M=.55 Vj=.75 Fc=.5 Isr=11.07n Nr=2.088 Bv=100 Ibv=100u Tt=11.07n)\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0;\\\" id=\\\"18\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R2.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry y=\\\"11\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"D2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-additional/symbol-svgs/Diode/D-1N4148-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=180;\\\" id=\\\"16\\\" vertex=\\\"1\\\" symbol=\\\"D\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"480\\\" y=\\\"160\\\" width=\\\"60.5\\\" height=\\\"20\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"D2\\\" NAME=\\\"1N4148\\\" N1=\\\"\\\" N2=\\\"\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\".model D1N4148  D(Is=5.84n N=1.94 Rs=.7017 Ikf=44.17m Xti=3 Eg=1.11 Cjo=.95p&#10;+               M=.55 Vj=.75 Fc=.5 Isr=11.07n Nr=2.088 Bv=100 Ibv=100u Tt=11.07n)\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"19\\\" edge=\\\"1\\\" node=\\\"D2.1\\\" sourceVertex=\\\"17\\\" targetVertex=\\\"11\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"20\\\" edge=\\\"1\\\" sourceVertex=\\\"12\\\" targetVertex=\\\"6\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"><mxPoint x=\\\"710\\\" y=\\\"440\\\"/></Array></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"710\\\" y=\\\"440\\\"/></Array><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"21\\\" edge=\\\"1\\\" sourceVertex=\\\"3\\\" targetVertex=\\\"6\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"22\\\" edge=\\\"1\\\" node=\\\"V1.2\\\" sourceVertex=\\\"4\\\" targetVertex=\\\"14\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"><mxPoint x=\\\"180\\\" y=\\\"160\\\"/></Array></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"180\\\" y=\\\"160\\\"/></Array><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"23\\\" edge=\\\"1\\\" node=\\\"R2.2\\\" sourceVertex=\\\"15\\\" targetVertex=\\\"18\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"24\\\" edge=\\\"1\\\" sourceVertex=\\\"8\\\" targetVertex=\\\"19\\\" tarx=\\\"630\\\" tary=\\\"170\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"630\\\" y=\\\"170\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"25\\\" edge=\\\"1\\\" sourceVertex=\\\"9\\\" targetVertex=\\\"20\\\" tarx=\\\"630\\\" tary=\\\"510\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"><mxPoint x=\\\"630\\\" y=\\\"510\\\"/></Array><mxPoint x=\\\"630\\\" y=\\\"510\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"630\\\" y=\\\"510\\\"/></Array><Object as=\\\"properties\\\"/></mxCell></root></mxGraphModel>\",\n            \"name\": \"Half Wave Rectifier \",\n            \"description\": \"The main function of half wave rectifier is to change the AC (Alternating Current) into DC (Direct Current). However, the acquired output DC is not pure and it is an exciting DC. This DC is not constant and varies with time. \",\n            \"media\": \"circuit_images_esim/659043d5-5283-4376-8b21-800499dc718d.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-16T10:50:30.403Z\",\n            \"is_arduino\": false\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 9,\n        \"fields\": {\n            \"save_id\": \"galleryaf6c23bf-4382-4364-b1f0-d51a7ab232ea\",\n            \"data_dump\": \"<mxGraphModel><root><mxCell id=\\\"0\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"V1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"220\\\" y=\\\"530\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"5\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"3\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"220\\\" y=\\\"530\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"5\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"4\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"119\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"2\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"220\\\" y=\\\"530\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V1\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"5\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"12\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"540\\\" y=\\\"650\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"13\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"20\\\" y=\\\"39\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GNDA\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GNDA-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"12\\\" vertex=\\\"1\\\" symbol=\\\"PWR\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"540\\\" y=\\\"650\\\" width=\\\"40\\\" height=\\\"80\\\" as=\\\"geometry\\\"/><Object NAME=\\\"GNDA\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"14\\\" edge=\\\"1\\\" sourceVertex=\\\"4\\\" targetVertex=\\\"13\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"19\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"440\\\" y=\\\"180\\\" width=\\\"58.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=90;\\\" id=\\\"20\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"58\\\" y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"19\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"440\\\" y=\\\"180\\\" width=\\\"58.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=90;\\\" id=\\\"21\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"19\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"440\\\" y=\\\"180\\\" width=\\\"58.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"22\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"400\\\" y=\\\"490\\\" width=\\\"58.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=90;\\\" id=\\\"23\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"58\\\" y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"22\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"400\\\" y=\\\"490\\\" width=\\\"58.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=90;\\\" id=\\\"24\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"22\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"400\\\" y=\\\"490\\\" width=\\\"58.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R3\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"25\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"580\\\" y=\\\"180\\\" width=\\\"58.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R3\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=90;\\\" id=\\\"26\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"58\\\" y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R3\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"25\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"580\\\" y=\\\"180\\\" width=\\\"58.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R3\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=90;\\\" id=\\\"27\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R3\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"25\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"580\\\" y=\\\"180\\\" width=\\\"58.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R3\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R4\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"28\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"590\\\" y=\\\"490\\\" width=\\\"58.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R4\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=90;\\\" id=\\\"29\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"58\\\" y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R4\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"28\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"590\\\" y=\\\"490\\\" width=\\\"58.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R4\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=90;\\\" id=\\\"30\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R4.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R4\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"28\\\" vertex=\\\"1\\\" symbol=\\\"R\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"590\\\" y=\\\"490\\\" width=\\\"58.5\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"R4\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"38\\\" edge=\\\"1\\\" node=\\\"V1.1\\\" sourceVertex=\\\"3\\\" targetVertex=\\\"21\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"><mxPoint x=\\\"310\\\" y=\\\"230\\\"/></Array></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"310\\\" y=\\\"230\\\"/></Array><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"39\\\" edge=\\\"1\\\" node=\\\"V1.1\\\" sourceVertex=\\\"3\\\" targetVertex=\\\"24\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"40\\\" edge=\\\"1\\\" sourceVertex=\\\"13\\\" targetVertex=\\\"29\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"><mxPoint x=\\\"700\\\" y=\\\"260\\\"/><mxPoint x=\\\"660\\\" y=\\\"260\\\"/></Array></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"700\\\" y=\\\"260\\\"/><mxPoint x=\\\"660\\\" y=\\\"260\\\"/></Array><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"41\\\" edge=\\\"1\\\" sourceVertex=\\\"26\\\" targetVertex=\\\"40\\\" tarx=\\\"660\\\" tary=\\\"260\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"660\\\" y=\\\"260\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"V2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"45\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"460\\\" y=\\\"340\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V2\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"0\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"46\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"45\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"460\\\" y=\\\"340\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V2\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"0\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"47\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" ConnectedNode=\\\"R4.2\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"60\\\" y=\\\"119\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/V-VSOURCE-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25\\\" id=\\\"45\\\" vertex=\\\"1\\\" symbol=\\\"V\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"460\\\" y=\\\"340\\\" width=\\\"120\\\" height=\\\"120\\\" as=\\\"geometry\\\"/><Object PREFIX=\\\"V2\\\" NAME=\\\"VSOURCE\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"0\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"55\\\" edge=\\\"1\\\" node=\\\"R1.1\\\" sourceVertex=\\\"20\\\" targetVertex=\\\"46\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"56\\\" edge=\\\"1\\\" sourceVertex=\\\"27\\\" targetVertex=\\\"55\\\" tarx=\\\"520\\\" tary=\\\"230\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"/><mxPoint x=\\\"520\\\" y=\\\"230\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"57\\\" edge=\\\"1\\\" node=\\\"R4.2\\\" sourceVertex=\\\"30\\\" targetVertex=\\\"47\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"><mxPoint x=\\\"580\\\" y=\\\"530\\\"/><mxPoint x=\\\"520\\\" y=\\\"540\\\"/></Array></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"580\\\" y=\\\"530\\\"/><mxPoint x=\\\"520\\\" y=\\\"540\\\"/></Array><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"58\\\" edge=\\\"1\\\" sourceVertex=\\\"23\\\" targetVertex=\\\"57\\\" tarx=\\\"520\\\" tary=\\\"540\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><Array as=\\\"points\\\"><mxPoint x=\\\"450\\\" y=\\\"540\\\"/></Array><mxPoint x=\\\"520\\\" y=\\\"540\\\" as=\\\"targetPoint\\\"/></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"450\\\" y=\\\"540\\\"/></Array><Object as=\\\"properties\\\"/></mxCell></root></mxGraphModel>\",\n            \"name\": \"Wheatstone Bridge\",\n            \"description\": \"A Wheatstone bridge is an electrical circuit used to measure an unknown electrical resistance by balancing two legs of a bridge circuit, one leg of which includes the unknown component. The primary benefit of the circuit is its ability to provide extremely accurate measurements\",\n            \"media\": \"circuit_images_esim/282352ba-6cd6-4e60-894f-4d38c925a967.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-16T10:58:03.504Z\",\n            \"is_arduino\": false\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 10,\n        \"fields\": {\n            \"save_id\": \"gallery9cf1bd31-4498-4769-8239-2cb79d7f2b56\",\n            \"data_dump\": \"<mxGraphModel><root><mxCell id=\\\"0\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell id=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"16\\\" vertex=\\\"1\\\" connectable=\\\"0\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" symbol=\\\"R\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"410\\\" y=\\\"230\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object id=\\\"180\\\" name=\\\"R\\\" svg_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg\\\" thumbnail_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A_thumbnail.svg\\\" symbol_prefix=\\\"R\\\" component_library=\\\"http://localhost/api/library-sets/3/\\\" description=\\\"Resistor symbol for simulation only\\\" data_link=\\\"~\\\" full_name=\\\"R-R-1-A\\\" keyword=\\\"resistor simulation\\\" as=\\\"CompObject\\\"><Array as=\\\"alternate_component\\\"/></Object><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"2k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"17\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" pinType=\\\"Output\\\" PinNumber=\\\"1\\\" ConnectedNode=\\\"R2.1\\\" CellType=\\\"This is where you say what the vertex is\\\" Component=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"16\\\" vertex=\\\"1\\\" connectable=\\\"0\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" symbol=\\\"R\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"410\\\" y=\\\"230\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object id=\\\"180\\\" name=\\\"R\\\" svg_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg\\\" thumbnail_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A_thumbnail.svg\\\" symbol_prefix=\\\"R\\\" component_library=\\\"http://localhost/api/library-sets/3/\\\" description=\\\"Resistor symbol for simulation only\\\" data_link=\\\"~\\\" full_name=\\\"R-R-1-A\\\" keyword=\\\"resistor simulation\\\" as=\\\"CompObject\\\"><Array as=\\\"alternate_component\\\"/></Object><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"2k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"18\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" pinType=\\\"Output\\\" PinNumber=\\\"2\\\" ConnectedNode=\\\"0\\\" CellType=\\\"This is where you say what the vertex is\\\" Component=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"8\\\" y=\\\"99\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"16\\\" vertex=\\\"1\\\" connectable=\\\"0\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" symbol=\\\"R\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"410\\\" y=\\\"230\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object id=\\\"180\\\" name=\\\"R\\\" svg_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg\\\" thumbnail_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A_thumbnail.svg\\\" symbol_prefix=\\\"R\\\" component_library=\\\"http://localhost/api/library-sets/3/\\\" description=\\\"Resistor symbol for simulation only\\\" data_link=\\\"~\\\" full_name=\\\"R-R-1-A\\\" keyword=\\\"resistor simulation\\\" as=\\\"CompObject\\\"><Array as=\\\"alternate_component\\\"/></Object><Object PREFIX=\\\"R1\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"2k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"R2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"19\\\" vertex=\\\"1\\\" connectable=\\\"0\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" symbol=\\\"R\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"260\\\" y=\\\"140\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object id=\\\"180\\\" name=\\\"R\\\" svg_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg\\\" thumbnail_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A_thumbnail.svg\\\" symbol_prefix=\\\"R\\\" component_library=\\\"http://localhost/api/library-sets/3/\\\" description=\\\"Resistor symbol for simulation only\\\" data_link=\\\"~\\\" full_name=\\\"R-R-1-A\\\" keyword=\\\"resistor simulation\\\" as=\\\"CompObject\\\"><Array as=\\\"alternate_component\\\"/></Object><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0;\\\" id=\\\"20\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" pinType=\\\"Output\\\" PinNumber=\\\"1\\\" ConnectedNode=\\\"R2.1\\\" CellType=\\\"This is where you say what the vertex is\\\" Component=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"58\\\" y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"19\\\" vertex=\\\"1\\\" connectable=\\\"0\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" symbol=\\\"R\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"260\\\" y=\\\"140\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object id=\\\"180\\\" name=\\\"R\\\" svg_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg\\\" thumbnail_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A_thumbnail.svg\\\" symbol_prefix=\\\"R\\\" component_library=\\\"http://localhost/api/library-sets/3/\\\" description=\\\"Resistor symbol for simulation only\\\" data_link=\\\"~\\\" full_name=\\\"R-R-1-A\\\" keyword=\\\"resistor simulation\\\" as=\\\"CompObject\\\"><Array as=\\\"alternate_component\\\"/></Object><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0;\\\" id=\\\"21\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" pinType=\\\"Output\\\" PinNumber=\\\"2\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" Component=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"-41\\\" y=\\\"50\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"R2\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;rotation=90;\\\" id=\\\"19\\\" vertex=\\\"1\\\" connectable=\\\"0\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" symbol=\\\"R\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"260\\\" y=\\\"140\\\" width=\\\"16\\\" height=\\\"100\\\" as=\\\"geometry\\\"/><Object id=\\\"180\\\" name=\\\"R\\\" svg_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A.svg\\\" thumbnail_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/pspice/R-R-1-A_thumbnail.svg\\\" symbol_prefix=\\\"R\\\" component_library=\\\"http://localhost/api/library-sets/3/\\\" description=\\\"Resistor symbol for simulation only\\\" data_link=\\\"~\\\" full_name=\\\"R-R-1-A\\\" keyword=\\\"resistor simulation\\\" as=\\\"CompObject\\\"><Array as=\\\"alternate_component\\\"/></Object><Object PREFIX=\\\"R2\\\" NAME=\\\"R\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"1k\\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"Ohm\\\" SHEET_RESISTANCE=\\\"0\\\" FIRST_ORDER_TEMPERATURE_COEFF=\\\"0\\\" SECOND_ORDER_TEMPERATURE_COEFF=\\\"0\\\" PARAMETER_MEASUREMENT_TEMPERATURE=\\\"27\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"V1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-eSim_AC-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"22\\\" vertex=\\\"1\\\" connectable=\\\"0\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" symbol=\\\"V\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"120\\\" y=\\\"210\\\" width=\\\"60\\\" height=\\\"180\\\" as=\\\"geometry\\\"/><Object id=\\\"169\\\" name=\\\"ESIM_AC\\\" svg_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-eSim_AC-1-A.svg\\\" thumbnail_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-eSim_AC-1-A_thumbnail.svg\\\" symbol_prefix=\\\"v\\\" component_library=\\\"http://localhost/api/library-sets/2/\\\" description=\\\"\\\" data_link=\\\"\\\" full_name=\\\"v-eSim_AC-1-A\\\" keyword=\\\"\\\" as=\\\"CompObject\\\"><Array as=\\\"alternate_component\\\"/></Object><Object PREFIX=\\\"V1\\\" NAME=\\\"ESIM_AC\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"SIN(0 1.0 1MEG    ) \\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"23\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" pinType=\\\"Input\\\" PinNumber=\\\"1\\\" ConnectedNode=\\\"V1.1\\\" CellType=\\\"This is where you say what the vertex is\\\" Component=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-eSim_AC-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"22\\\" vertex=\\\"1\\\" connectable=\\\"0\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" symbol=\\\"V\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"120\\\" y=\\\"210\\\" width=\\\"60\\\" height=\\\"180\\\" as=\\\"geometry\\\"/><Object id=\\\"169\\\" name=\\\"ESIM_AC\\\" svg_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-eSim_AC-1-A.svg\\\" thumbnail_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-eSim_AC-1-A_thumbnail.svg\\\" symbol_prefix=\\\"v\\\" component_library=\\\"http://localhost/api/library-sets/2/\\\" description=\\\"\\\" data_link=\\\"\\\" full_name=\\\"v-eSim_AC-1-A\\\" keyword=\\\"\\\" as=\\\"CompObject\\\"><Array as=\\\"alternate_component\\\"/></Object><Object PREFIX=\\\"V1\\\" NAME=\\\"ESIM_AC\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"SIN(0 1.0 1MEG    ) \\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"2\\\" style=\\\"align=right;verticalAlign=bottom;rotation=0\\\" id=\\\"24\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" pinType=\\\"Input\\\" PinNumber=\\\"2\\\" ConnectedNode=\\\"0\\\" CellType=\\\"This is where you say what the vertex is\\\" Component=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"30\\\" y=\\\"179\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"V1\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-eSim_AC-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"22\\\" vertex=\\\"1\\\" connectable=\\\"0\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" symbol=\\\"V\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"120\\\" y=\\\"210\\\" width=\\\"60\\\" height=\\\"180\\\" as=\\\"geometry\\\"/><Object id=\\\"169\\\" name=\\\"ESIM_AC\\\" svg_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-eSim_AC-1-A.svg\\\" thumbnail_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/eSim_Sources/v-eSim_AC-1-A_thumbnail.svg\\\" symbol_prefix=\\\"v\\\" component_library=\\\"http://localhost/api/library-sets/2/\\\" description=\\\"\\\" data_link=\\\"\\\" full_name=\\\"v-eSim_AC-1-A\\\" keyword=\\\"\\\" as=\\\"CompObject\\\"><Array as=\\\"alternate_component\\\"/></Object><Object PREFIX=\\\"V1\\\" NAME=\\\"ESIM_AC\\\" N1=\\\"\\\" N2=\\\"\\\" VALUE=\\\"SIN(0 1.0 1MEG    ) \\\" EXTRA_EXPRESSION=\\\"\\\" MODEL=\\\"\\\" VALUE_UNIT=\\\"V\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"GND3\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GND3-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"25\\\" vertex=\\\"1\\\" connectable=\\\"0\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" symbol=\\\"PWR\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"258.25\\\" y=\\\"430\\\" width=\\\"20\\\" height=\\\"40\\\" as=\\\"geometry\\\"/><Object id=\\\"191\\\" name=\\\"GND3\\\" svg_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GND3-1-A.svg\\\" thumbnail_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GND3-1-A_thumbnail.svg\\\" symbol_prefix=\\\"PWR\\\" component_library=\\\"http://localhost/api/library-sets/4/\\\" description=\\\"Power symbol creates a global label with name &quot;GND3&quot; , ground\\\" data_link=\\\"\\\" full_name=\\\"PWR-GND3-1-A\\\" keyword=\\\"power-flag\\\" as=\\\"CompObject\\\"><Array as=\\\"alternate_component\\\"/></Object><Object NAME=\\\"GND3\\\" as=\\\"properties\\\"/></mxCell><mxCell value=\\\"1\\\" style=\\\"align=right;verticalAlign=up;rotation=0\\\" id=\\\"26\\\" vertex=\\\"1\\\" Pin=\\\"1\\\" pinType=\\\"Output\\\" PinNumber=\\\"1\\\" CellType=\\\"This is where you say what the vertex is\\\" Component=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry x=\\\"10\\\" y=\\\"19\\\" width=\\\"0.5\\\" height=\\\"0.5\\\" as=\\\"geometry\\\"/><mxCell value=\\\"GND3\\\" style=\\\"shape=image;fontColor=blue;image=../kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GND3-1-A.svg;imageVerticalAlign=bottom;verticalAlign=bottom;imageAlign=bottom;align=bottom;spacingLeft=25;\\\" id=\\\"25\\\" vertex=\\\"1\\\" connectable=\\\"0\\\" Component=\\\"1\\\" CellType=\\\"Component\\\" symbol=\\\"PWR\\\" pinType=\\\" \\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" sourceVertex=\\\"0\\\" targetVertex=\\\"0\\\" tarx=\\\"0\\\" tary=\\\"0\\\" as=\\\"ParentComponent\\\"><mxGeometry x=\\\"258.25\\\" y=\\\"430\\\" width=\\\"20\\\" height=\\\"40\\\" as=\\\"geometry\\\"/><Object id=\\\"191\\\" name=\\\"GND3\\\" svg_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GND3-1-A.svg\\\" thumbnail_path=\\\"kicad-symbols/admin-esim-default/symbol-svgs/power/PWR-GND3-1-A_thumbnail.svg\\\" symbol_prefix=\\\"PWR\\\" component_library=\\\"http://localhost/api/library-sets/4/\\\" description=\\\"Power symbol creates a global label with name &quot;GND3&quot; , ground\\\" data_link=\\\"\\\" full_name=\\\"PWR-GND3-1-A\\\" keyword=\\\"power-flag\\\" as=\\\"CompObject\\\"><Array as=\\\"alternate_component\\\"/></Object><Object NAME=\\\"GND3\\\" as=\\\"properties\\\"/></mxCell><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"COM.2\\\" style=\\\"exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;\\\" id=\\\"27\\\" edge=\\\"1\\\" node=\\\"V1.1\\\" sourceVertex=\\\"23\\\" targetVertex=\\\"21\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"COM.1\\\" style=\\\"exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;\\\" id=\\\"28\\\" edge=\\\"1\\\" node=\\\"R2.1\\\" sourceVertex=\\\"20\\\" targetVertex=\\\"17\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"0\\\" style=\\\"exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;\\\" id=\\\"29\\\" edge=\\\"1\\\" node=\\\"0\\\" sourceVertex=\\\"24\\\" targetVertex=\\\"26\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\" tarx=\\\"0\\\" tary=\\\"0\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"/><Object as=\\\"properties\\\"/></mxCell><mxCell value=\\\"0\\\" style=\\\"exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;\\\" id=\\\"30\\\" edge=\\\"1\\\" node=\\\"0\\\" sourceVertex=\\\"18\\\" targetVertex=\\\"29\\\" tarx=\\\"270\\\" tary=\\\"390\\\" CellType=\\\"This is where you say what the vertex is\\\" pinType=\\\" \\\" Component=\\\"0\\\" Pin=\\\"0\\\" PinNumber=\\\"0\\\" PinName=\\\"\\\"><mxGeometry relative=\\\"1\\\" as=\\\"geometry\\\"><mxPoint x=\\\"270\\\" y=\\\"390\\\" as=\\\"targetPoint\\\"/><Array as=\\\"points\\\"><mxPoint x=\\\"420\\\" y=\\\"450\\\"/></Array></mxGeometry><Array as=\\\"PointsArray\\\"><mxPoint x=\\\"420\\\" y=\\\"450\\\"/></Array><Object as=\\\"properties\\\"/></mxCell></root></mxGraphModel>\",\n            \"name\": \"Resistive Divider, AC input \",\n            \"description\": \"Voltage divider with sin wave input. E.g: Transient analysis with start: 0 stop: 3us 1ns UIC(true)\",\n            \"media\": \"circuit_images_esim/af6a4bee-d70f-4d57-91ca-23da6ab5e864.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-16T11:04:23.269Z\",\n            \"is_arduino\": false\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 65,\n        \"fields\": {\n            \"save_id\": \"gallery77894.21093023136\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":0,\\\"y\\\":-0.25,\\\"scale\\\":1},\\\"wires\\\":[{\\\"id\\\":1629376840107,\\\"points\\\":[[319.625,115],[320.31944274902344,168]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592280640444,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592280616845,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376840113,\\\"points\\\":[[335.625,115],[582.625,114],[585.625,479],[399.625,483],[400.31944274902344,442]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592280640444,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592280616845,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}}],\\\"LED\\\":[{\\\"x\\\":313.625,\\\"y\\\":67,\\\"tx\\\":17,\\\"ty\\\":-20,\\\"id\\\":1592280640444,\\\"data\\\":{\\\"color\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":193.31944274902344,\\\"y\\\":183,\\\"tx\\\":-89,\\\"ty\\\":-45,\\\"id\\\":1592280616845,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(LED_BUILTIN, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(LED_BUILTIN, HIGH);\\\\n    delay(1000);\\\\n\\\\tdigitalWrite(LED_BUILTIN, LOW);\\\\n    delay(1000);\\\\n}\\\"}}]}\",\n            \"name\": \"Blink Example\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/393fc620-8743-425a-83b9-9f6fd8fe76b9.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:40:45.265Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 66,\n        \"fields\": {\n            \"save_id\": \"gallery49157.1582640465\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-15,\\\"y\\\":2.5,\\\"scale\\\":1},\\\"wires\\\":[{\\\"id\\\":1629376852259,\\\"points\\\":[[410.3194580078125,138],[411.31944274902344,201]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592280227638,\\\"keyName\\\":\\\"Buzzer\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592280217174,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376852261,\\\"points\\\":[[440.3194580078125,138],[690.3194580078125,134],[690.3194580078125,512],[491.3194580078125,515],[491.31944274902344,475]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592280227638,\\\"keyName\\\":\\\"Buzzer\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592280217174,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}}],\\\"ArduinoUno\\\":[{\\\"x\\\":251.31944274902344,\\\"y\\\":204,\\\"tx\\\":-56,\\\"ty\\\":-33,\\\"id\\\":1592280217174,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(LED_BUILTIN, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(LED_BUILTIN, HIGH);\\\\n    delay(1000);\\\\n\\\\tdigitalWrite(LED_BUILTIN, LOW);\\\\n    delay(1000);\\\\n}\\\"}}],\\\"Buzzer\\\":[{\\\"x\\\":417.3194580078125,\\\"y\\\":97,\\\"tx\\\":-23,\\\"ty\\\":-40,\\\"id\\\":1592280227638}]}\",\n            \"name\": \"Buzzer\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/2fa36264-95e4-407c-928c-fabbbb1af919.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:40:54.815Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 67,\n        \"fields\": {\n            \"save_id\": \"gallery87942.66869509322\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-74.75,\\\"y\\\":109.75,\\\"scale\\\":1.1},\\\"wires\\\":[{\\\"id\\\":1629376862259,\\\"points\\\":[[750.3194580078125,248],[749.3194580078125,116],[545.3194580078125,112],[543.3194427490234,157]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":13,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376862261,\\\"points\\\":[[766.3194580078125,248],[769.3194580078125,93],[530.3194580078125,92],[529.3194427490234,157]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376862264,\\\"points\\\":[[750.3194580078125,339],[749.3194580078125,379],[788.3194580078125,377],[788.3194580078125,65],[514.3194580078125,62],[515.3194427490234,157]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":11,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376862267,\\\"points\\\":[[720.3194580078125,339],[719.3194580078125,392],[815.3194580078125,394],[817.3194580078125,42],[504.3194580078125,43],[501.31944274902344,157]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":6,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":10,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376862270,\\\"points\\\":[[705.3194580078125,339],[704.3194580078125,412],[849.3194580078125,411],[841.3194580078125,12],[489.3194580078125,18],[487.31944274902344,157]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":5,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376862274,\\\"points\\\":[[720.3194580078125,248],[720.3194580078125,203],[678.3194580078125,204],[679.3194580078125,428],[867.3194580078125,434],[863.3194580078125,-8],[475.3194580078125,-3],[473.31944274902344,157]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376862279,\\\"points\\\":[[705.3194580078125,248],[652.8194580078125,248],[658.8194580078125,452],[890.8194580078125,454],[885.8194580078125,-28],[448.8194580078125,-25],[449.31944274902344,157]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":7,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376862283,\\\"points\\\":[[735.3194580078125,248],[735.8194580078125,156],[635.8194580078125,153],[636.8194580078125,490],[456.8194580078125,489],[457.31944274902344,431]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1591347187858,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1591347180843,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}}],\\\"SevenSegment\\\":[{\\\"x\\\":753.3194580078125,\\\"y\\\":332,\\\"tx\\\":-55,\\\"ty\\\":-95,\\\"id\\\":1591347187858}],\\\"ArduinoUno\\\":[{\\\"x\\\":236.31944274902344,\\\"y\\\":186,\\\"tx\\\":-75,\\\"ty\\\":-59,\\\"id\\\":1591347180843,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"int outs[10][7] = {\\\\n\\\\t{ 1,1,1,1,1,1,0 },    // 0\\\\n    { 0,1,1,0,0,0,0 },    // 1\\\\n    { 1,1,0,1,1,0,1 },    // 2\\\\n    { 1,1,1,1,0,0,1 },    // 3\\\\n    { 0,1,1,0,0,1,1 },    // 4\\\\n    { 1,0,1,1,0,1,1 },    // 5\\\\n    { 1,0,1,1,1,1,1 },    // 6\\\\n    { 1,1,1,0,0,0,0 },    // 7\\\\n    { 1,1,1,1,1,1,1 },    // 8\\\\n    { 1,1,1,0,0,1,1 }   // 9\\\\n};\\\\n\\\\nvoid setup(){\\\\n\\\\tpinMode(2,OUTPUT);\\\\n\\\\tpinMode(3,OUTPUT);\\\\n\\\\tpinMode(4,OUTPUT);\\\\n\\\\tpinMode(5,OUTPUT);\\\\n\\\\tpinMode(6,OUTPUT);\\\\n\\\\tpinMode(7,OUTPUT);\\\\n\\\\tpinMode(8,OUTPUT);\\\\t\\\\n}\\\\nint dig = 0;\\\\nvoid loop(){\\\\n\\\\tint pin = 2;\\\\n\\\\tfor(int i=0;i<7;++i){\\\\n\\\\t\\\\tdigitalWrite(pin,outs[dig][i]);\\\\n\\\\t\\\\t++pin;\\\\n\\\\t}\\\\t\\\\n    delay(1000);\\\\n    ++dig;\\\\n    if(dig >= 10)\\\\n        dig -= 10;\\\\n}\\\"}}]}\",\n            \"name\": \"Seven Segment\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/7f942833-be02-41f5-a633-1452c89a3515.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:41:04.225Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 68,\n        \"fields\": {\n            \"save_id\": \"gallery28901.67161176469\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":0.25,\\\"y\\\":0,\\\"scale\\\":1},\\\"wires\\\":[{\\\"id\\\":1629376875889,\\\"points\\\":[[670.3194580078125,149],[672.3194580078125,236]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592621634830,\\\"keyName\\\":\\\"RGBLED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592621629068,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377139116,\\\"points\\\":[[702.3194580078125,149],[702.3194580078125,236]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592621634830,\\\"keyName\\\":\\\"RGBLED\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592621629068,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":6,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377236228,\\\"points\\\":[[719.3194580078125,149],[739.3194580078125,150],[740.3194580078125,236]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592621634830,\\\"keyName\\\":\\\"RGBLED\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592621629068,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"id\\\":1677957938581,\\\"points\\\":[[710.3194580078125,510],[710.3194580078125,559],[409.28125,559],[409.28125,195],[684.28125,195],[685.3194580078125,149]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592621629068,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592621634830,\\\"keyName\\\":\\\"RGBLED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}}],\\\"RGBLED\\\":[{\\\"x\\\":670.3194580078125,\\\"y\\\":73,\\\"tx\\\":-3,\\\"ty\\\":-25,\\\"id\\\":1592621634830}],\\\"ArduinoUno\\\":[{\\\"x\\\":428.3194580078125,\\\"y\\\":206,\\\"tx\\\":0,\\\"ty\\\":0,\\\"id\\\":1592621629068,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(11, OUTPUT);\\\\n\\\\tpinMode(9, OUTPUT);\\\\n\\\\tpinMode(7, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tfor(int i=1;i<=7;++i){\\\\n        digitalWrite(11, i&1);\\\\n        digitalWrite(9, (i>>1)&1);\\\\n        digitalWrite(7, (i>>2)&1);\\\\n        delay(1000);\\\\n    }\\\\n}\\\"}}]}\",\n            \"name\": \"RGB LED\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/0afdb75b-dffc-4e26-b067-768ac3f2ac3a.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:41:17.798Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 69,\n        \"fields\": {\n            \"save_id\": \"gallery8452.96896319243\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-15.75,\\\"y\\\":-75,\\\"scale\\\":1},\\\"wires\\\":[{\\\"id\\\":1629376897682,\\\"points\\\":[[415,213],[416,313]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592279848489,\\\"keyName\\\":\\\"Buzzer\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":7,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376897683,\\\"points\\\":[[697,387],[694,261],[440,263],[440,313]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592279863383,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376897684,\\\"points\\\":[[445,213],[734,212],[737,663],[421,666],[424,587]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592279848489,\\\"keyName\\\":\\\"Buzzer\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376897687,\\\"points\\\":[[662,487],[662,607],[394,608],[396,587]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592279863383,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376897688,\\\"points\\\":[[697,487],[696,624],[408,631],[410,587]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592279863383,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376897689,\\\"points\\\":[[340.75,252.75],[344,313]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592279950865,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376897690,\\\"points\\\":[[356.75,252.75],[383.75,251.75],[382.75,144.75],[303.75,146.75],[304.75,252.75],[328.75,251.75],[330,313]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592279950865,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592279815399,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}}],\\\"LED\\\":[{\\\"x\\\":348.75,\\\"y\\\":176.75,\\\"tx\\\":3,\\\"ty\\\":8,\\\"id\\\":1592279950865,\\\"data\\\":{\\\"color\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":177,\\\"y\\\":290,\\\"tx\\\":-49,\\\"ty\\\":-7,\\\"id\\\":1592279815399,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(LED_BUILTIN, OUTPUT);\\\\n\\\\tpinMode(8, OUTPUT);\\\\n\\\\tpinMode(7, INPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n    if(digitalRead(7) == HIGH){\\\\n    \\\\tdigitalWrite(LED_BUILTIN, HIGH);\\\\n    \\\\tdigitalWrite(8, HIGH);\\\\n    }else{\\\\n        digitalWrite(LED_BUILTIN, LOW);\\\\n        digitalWrite(8, LOW);\\\\n    }\\\\n}\\\"}}],\\\"PushButton\\\":[{\\\"x\\\":640,\\\"y\\\":392,\\\"tx\\\":8,\\\"ty\\\":15,\\\"id\\\":1592279863383}],\\\"Buzzer\\\":[{\\\"x\\\":418,\\\"y\\\":73,\\\"tx\\\":-19,\\\"ty\\\":59,\\\"id\\\":1592279848489}]}\",\n            \"name\": \"Push Button Example\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/f6f78ec2-9d49-4381-99d0-bfe84b90d96d.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:41:39.520Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 70,\n        \"fields\": {\n            \"save_id\": \"gallery59981.56828154135\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":0,\\\"y\\\":0.5,\\\"scale\\\":1},\\\"wires\\\":[{\\\"id\\\":1629376913493,\\\"points\\\":[[238.31944274902344,274],[238.31944274902344,86],[532.3194580078125,82],[530.3194580078125,218]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592277596751,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376913494,\\\"points\\\":[[273.31944274902344,374],[269.3194580078125,545],[568.3194580078125,543],[568.3194580078125,492]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592277596751,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376913495,\\\"points\\\":[[238.31944274902344,374],[236.31944274902344,569],[583.3194580078125,567],[582.3194580078125,492]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592277596751,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376913497,\\\"points\\\":[[880.3194580078125,290],[878.3194580078125,160],[683.3194580078125,161],[682.3194580078125,218]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":13,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376913498,\\\"points\\\":[[896.3194580078125,290],[895.3194580078125,142],[668.3194580078125,144],[668.3194580078125,218]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376913500,\\\"points\\\":[[880.3194580078125,381],[881.3194580078125,410],[918.3194580078125,410],[915.3194580078125,122],[654.3194580078125,124],[654.3194580078125,218]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":11,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376913501,\\\"points\\\":[[850.3194580078125,381],[851.3194580078125,428],[939.3194580078125,428],[933.3194580078125,101],[638.3194580078125,104],[640.3194580078125,218]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":6,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":10,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376913502,\\\"points\\\":[[835.3194580078125,381],[836.3194580078125,446],[961.3194580078125,447],[953.3194580078125,85],[624.3194580078125,88],[626.3194580078125,218]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":5,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376913504,\\\"points\\\":[[850.3194580078125,290],[851.3194580078125,258],[818.3194580078125,258],[818.3194580078125,465],[971.3194580078125,466],[966.3194580078125,62],[611.3194580078125,70],[612.3194580078125,218]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376913506,\\\"points\\\":[[835.3194580078125,290],[795.3194580078125,290],[800.3194580078125,480],[991.3194580078125,479],[987.3194580078125,47],[587.3194580078125,52],[588.3194580078125,218]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":7,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376913507,\\\"points\\\":[[865.3194580078125,290],[861.3194580078125,213],[769.3194580078125,214],[774.3194580078125,562],[598.3194580078125,563],[596.3194580078125,492]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592277590862,\\\"keyName\\\":\\\"SevenSegment\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592277587638,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}}],\\\"SevenSegment\\\":[{\\\"x\\\":816.3194580078125,\\\"y\\\":346,\\\"tx\\\":12,\\\"ty\\\":-67,\\\"id\\\":1592277590862}],\\\"ArduinoUno\\\":[{\\\"x\\\":376.3194580078125,\\\"y\\\":252,\\\"tx\\\":-76,\\\"ty\\\":-64,\\\"id\\\":1592277587638,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"int outs[10][7] = {\\\\n\\\\t{ 1,1,1,1,1,1,0 },    // 0\\\\n    { 0,1,1,0,0,0,0 },    // 1\\\\n    { 1,1,0,1,1,0,1 },    // 2\\\\n    { 1,1,1,1,0,0,1 },    // 3\\\\n    { 0,1,1,0,0,1,1 },    // 4\\\\n    { 1,0,1,1,0,1,1 },    // 5\\\\n    { 1,0,1,1,1,1,1 },    // 6\\\\n    { 1,1,1,0,0,0,0 },    // 7\\\\n    { 1,1,1,1,1,1,1 },    // 8\\\\n    { 1,1,1,0,0,1,1 }   // 9\\\\n};\\\\n\\\\nvoid setup(){\\\\n\\\\tpinMode(2,OUTPUT);\\\\n\\\\tpinMode(3,OUTPUT);\\\\n\\\\tpinMode(4,OUTPUT);\\\\n\\\\tpinMode(5,OUTPUT);\\\\n\\\\tpinMode(6,OUTPUT);\\\\n\\\\tpinMode(7,OUTPUT);\\\\n\\\\tpinMode(8,OUTPUT);\\\\n\\\\tpinMode(12,INPUT);\\\\n}\\\\nint dig = 0;\\\\nvoid loop(){\\\\n\\\\tif(digitalRead(12) == HIGH){\\\\n\\\\t\\\\tint pin = 2;\\\\n\\\\t\\\\tfor(int i=0;i<7;++i){\\\\n\\\\t\\\\t\\\\tdigitalWrite(pin,outs[dig][i]);\\\\n\\\\t\\\\t\\\\t++pin;\\\\n\\\\t\\\\t}\\\\t\\\\t\\\\t\\\\n\\\\t\\\\t++dig;\\\\n        delay(100);\\\\n\\\\t}\\\\n    if(dig >= 10)\\\\n        dig -= 10;\\\\n}\\\"}}],\\\"PushButton\\\":[{\\\"x\\\":252.31944274902344,\\\"y\\\":310,\\\"tx\\\":-28,\\\"ty\\\":-16,\\\"id\\\":1592277596751}]}\",\n            \"name\": \"Counter\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/ceaad52b-88ce-4388-80a7-3b33599c8c6c.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:41:57.705Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 71,\n        \"fields\": {\n            \"save_id\": \"gallery97398.10851589308\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-31,\\\"y\\\":-28.25,\\\"scale\\\":1.1},\\\"wires\\\":[{\\\"id\\\":1629376949244,\\\"points\\\":[[664.3194580078125,292],[623.3194580078125,290],[621.3194580078125,201]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592274238321,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592274215230,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376949252,\\\"points\\\":[[605.3194580078125,201],[606.3194580078125,334],[664.3194580078125,334]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592274215230,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592274238321,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376949254,\\\"points\\\":[[393.3194580078125,209],[394.3194580078125,330],[409.3194580078125,329]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592274211174,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592274258222,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376949255,\\\"points\\\":[[377.3194580078125,209],[376.3194580078125,288],[409.3194580078125,287]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592274211174,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592274258222,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376949257,\\\"points\\\":[[262.31944274902344,203],[259.31944274902344,286]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592274209424,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592274294529,\\\"keyName\\\":\\\"CoinCell\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376949258,\\\"points\\\":[[246.31944274902344,203],[246.5858612060547,269.25],[215.6767578125,271.06817626953125],[212.94949340820312,378.3409118652344],[259.7676696777344,380.06817626953125],[259.31944274902344,358]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592274209424,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592274294529,\\\"keyName\\\":\\\"CoinCell\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}}],\\\"CoinCell\\\":[{\\\"x\\\":227.31944274902344,\\\"y\\\":314,\\\"tx\\\":2,\\\"ty\\\":-31,\\\"id\\\":1592274294529}],\\\"Motor\\\":[{\\\"x\\\":218.31944274902344,\\\"y\\\":148,\\\"tx\\\":0,\\\"ty\\\":0,\\\"id\\\":1592274209424},{\\\"x\\\":390.3194580078125,\\\"y\\\":172,\\\"tx\\\":-41,\\\"ty\\\":-18,\\\"id\\\":1592274211174},{\\\"x\\\":583.3194580078125,\\\"y\\\":184,\\\"tx\\\":-6,\\\"ty\\\":-38,\\\"id\\\":1592274215230}],\\\"Battery9v\\\":[{\\\"x\\\":640.3194580078125,\\\"y\\\":280,\\\"tx\\\":24,\\\"ty\\\":-19,\\\"id\\\":1592274238321},{\\\"x\\\":478.3194580078125,\\\"y\\\":293,\\\"tx\\\":-69,\\\"ty\\\":-37,\\\"id\\\":1592274258222}]}\",\n            \"name\": \"Motors\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/bf658e5b-7e4f-4350-9f2c-712e719e0a81.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:42:32.311Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 72,\n        \"fields\": {\n            \"save_id\": \"gallery480.4349793404272\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":78.75,\\\"y\\\":22,\\\"scale\\\":1},\\\"wires\\\":[{\\\"id\\\":1629376957107,\\\"points\\\":[[362.3194580078125,126],[577.3194580078125,124],[580.3194580078125,493],[404.3194580078125,494],[406.3194580078125,449]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1591458433019,\\\"keyName\\\":\\\"TMP36\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1591458428806,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376957109,\\\"points\\\":[[339.3194580078125,126],[91.31944274902344,128],[89.31944274902344,491],[378.3194580078125,495],[378.3194580078125,449]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1591458433019,\\\"keyName\\\":\\\"TMP36\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1591458428806,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376957110,\\\"points\\\":[[350.3194580078125,126],[353.3194580078125,318],[449.3194580078125,317],[450.3194580078125,449]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1591458433019,\\\"keyName\\\":\\\"TMP36\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1591458428806,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":22,\\\"isSoldered\\\":false}}],\\\"TMP36\\\":[{\\\"x\\\":273.3194580078125,\\\"y\\\":81,\\\"tx\\\":63,\\\"ty\\\":-23,\\\"id\\\":1591458433019}],\\\"ArduinoUno\\\":[{\\\"x\\\":340.3194580078125,\\\"y\\\":188,\\\"tx\\\":-230,\\\"ty\\\":-43,\\\"id\\\":1591458428806,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup()\\\\n{\\\\n  Serial.begin(9600);\\\\n}\\\\n \\\\nvoid loop() {\\\\n int reading = analogRead(A0);   \\\\n float voltage = reading * 5.0;\\\\n voltage /= 1023.0; \\\\n  \\\\n float temperatureC = (voltage - 0.5) * 100;\\\\n Serial.print(temperatureC); \\\\n Serial.println(\\\\\\\" degrees C\\\\\\\");  \\\\n delay(1000);\\\\n}\\\"}}]}\",\n            \"name\": \"Temperature Sensor\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/b5b59845-1a1e-44c8-88f7-75fd3d6d0f2c.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:42:38.799Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 74,\n        \"fields\": {\n            \"save_id\": \"gallery86920.00865688192\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":19,\\\"y\\\":687.75,\\\"scale\\\":0.49999999999999956},\\\"wires\\\":[{\\\"id\\\":1629376974785,\\\"points\\\":[[529.3194580078125,199.22222900390625],[529.3194580078125,251.22222900390625]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592278156916,\\\"keyName\\\":\\\"PIRSensor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592278149628,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376974786,\\\"points\\\":[[544.3194580078125,199.22222900390625],[545.3194580078125,222.22222900390625],[685.3194580078125,221.22222900390625],[688.3194580078125,565.2222290039062],[483.3194580078125,565.2222290039062],[485.3194580078125,525.2222290039062]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592278156916,\\\"keyName\\\":\\\"PIRSensor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592278149628,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376974788,\\\"points\\\":[[558.3194580078125,199.22222900390625],[707.3194580078125,198.22222900390625],[709.3194580078125,581.2222290039062],[499.3194580078125,583.2222290039062],[499.3194580078125,525.2222290039062]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592278156916,\\\"keyName\\\":\\\"PIRSensor\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592278149628,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376974789,\\\"points\\\":[[340.31944274902344,166.22222137451172],[387.3194580078125,166.22222900390625],[385.3194580078125,46.22222137451172],[188.31944274902344,47.22222137451172],[182.31944274902344,608.2222290039062],[519.3194580078125,606.2222290039062],[513.3194580078125,525.2222290039062]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592278168268,\\\"keyName\\\":\\\"Buzzer\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592278149628,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376974791,\\\"points\\\":[[310.31944274902344,166.22222137451172],[310.3194580078125,197.22222900390625],[432.3194580078125,199.22222900390625],[433.3194580078125,251.22222900390625]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592278168268,\\\"keyName\\\":\\\"Buzzer\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592278149628,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}}],\\\"PIRSensor\\\":[{\\\"x\\\":555.3194580078125,\\\"y\\\":131.22222900390625,\\\"tx\\\":-111,\\\"ty\\\":-97,\\\"id\\\":1592278156916}],\\\"ArduinoUno\\\":[{\\\"x\\\":359.3194580078125,\\\"y\\\":243.22222900390625,\\\"tx\\\":-142,\\\"ty\\\":-22,\\\"id\\\":1592278149628,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n    pinMode(12, OUTPUT);\\\\n    pinMode(13, OUTPUT);\\\\n    pinMode(7, INPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tif(digitalRead(7) == HIGH){\\\\n        digitalWrite(13, HIGH);\\\\n        digitalWrite(12, HIGH);\\\\n    }else{\\\\n        digitalWrite(13, LOW);\\\\n        digitalWrite(12, LOW);\\\\n    }\\\\n}\\\"}}],\\\"Buzzer\\\":[{\\\"x\\\":226.31944274902344,\\\"y\\\":74.22222137451172,\\\"tx\\\":68,\\\"ty\\\":11,\\\"id\\\":1592278168268}]}\",\n            \"name\": \"PIR Sensor\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/b3ebd817-9189-4a1a-a036-134644c4bd27.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:42:57.241Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 75,\n        \"fields\": {\n            \"save_id\": \"gallery58788.89198925628\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":46.5,\\\"y\\\":496,\\\"scale\\\":0.5799999999999996},\\\"wires\\\":[{\\\"id\\\":1629376980950,\\\"points\\\":[[369.71881103515625,267.02040100097656],[128.51473999023438,265.2040710449219],[122.39228820800781,631.7142944335938],[402.984130859375,631.9183349609375],[403.31944274902344,602]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592276283186,\\\"keyName\\\":\\\"UltrasonicSensor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592276266793,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376980954,\\\"points\\\":[[401.71881103515625,267.02040100097656],[595.5147094726562,263.6071472167969],[595.4534912109375,630.5458984375],[416.1065673828125,634.5867309570312],[417.31944274902344,602]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592276283186,\\\"keyName\\\":\\\"UltrasonicSensor\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592276266793,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376980955,\\\"points\\\":[[379.71881103515625,267.02040100097656],[379.2902526855469,287.8163146972656],[446.5759582519531,289.83673095703125],[447.31944274902344,328]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592276283186,\\\"keyName\\\":\\\"UltrasonicSensor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592276266793,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376980956,\\\"points\\\":[[391.71881103515625,267.02040100097656],[390.5147399902344,276.5918273925781],[460.8004455566406,276.5918273925781],[461.31944274902344,328]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592276283186,\\\"keyName\\\":\\\"UltrasonicSensor\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592276266793,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false}}],\\\"UltrasonicSensor\\\":[{\\\"x\\\":286.71881103515625,\\\"y\\\":185.02040100097656,\\\"tx\\\":1,\\\"ty\\\":-22,\\\"id\\\":1592276283186}],\\\"ArduinoUno\\\":[{\\\"x\\\":239.31944274902344,\\\"y\\\":356,\\\"tx\\\":-104,\\\"ty\\\":-58,\\\"id\\\":1592276266793,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"const int pingPin = 7; // Trigger Pin of Ultrasonic Sensor\\\\nconst int echoPin = 6; // Echo Pin of Ultrasonic Sensor\\\\n\\\\nvoid setup() {\\\\n   pinMode(pingPin, OUTPUT);\\\\n   pinMode(echoPin, INPUT);\\\\n   Serial.begin(9600); // Starting Serial Terminal\\\\n}\\\\n\\\\nvoid loop() {\\\\n   long duration, inches, cm;\\\\n   digitalWrite(pingPin, LOW);\\\\n   delayMicroseconds(2);\\\\n   digitalWrite(pingPin, HIGH);\\\\n   delayMicroseconds(10);\\\\n   digitalWrite(pingPin, LOW);\\\\n   duration = pulseIn(echoPin, HIGH);\\\\n  //Serial.println(duration);\\\\n//    inches = microsecondsToInches(duration);\\\\n   cm = duration / 29 / 2;\\\\n   //Serial.print(inches);\\\\n   //Serial.print(\\\\\\\"in, \\\\\\\");\\\\n   Serial.print(cm);\\\\n   Serial.print(\\\\\\\"cm\\\\\\\");\\\\n   Serial.println();\\\\n   delay(1000);\\\\n}\\\\n\\\\n// long microsecondsToInches(long microseconds) {\\\\n//    return microseconds / 74 / 2;\\\\n// }\\\\n\\\\n// long microsecondsToCentimeters(long microseconds) {\\\\n//    return microseconds / 29 / 2;\\\\n// }\\\"}}]}\",\n            \"name\": \"Ultrasonic Sensor\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/2adef9fb-46e6-4475-b81b-e7103e4dfaaf.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:43:03.075Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 76,\n        \"fields\": {\n            \"save_id\": \"gallery15899.487483348885\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":0.25,\\\"y\\\":0.25,\\\"scale\\\":1},\\\"wires\\\":[{\\\"id\\\":1629376986979,\\\"points\\\":[[780.75,155.75],[571.75,148.75],[577.75,412.75],[578.75,476.75],[414.75,479.75],[410.31944274902344,447]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592405259001,\\\"keyName\\\":\\\"ServoMotor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592368525114,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376986980,\\\"points\\\":[[796.75,155.75],[793.75,115.75],[987.75,115.75],[987.75,490.75],[384.75,499.75],[382.31944274902344,447]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592405259001,\\\"keyName\\\":\\\"ServoMotor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592368525114,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376986981,\\\"points\\\":[[810.75,155.75],[810.75,71.75],[486.75,78.75],[482.31944274902344,173]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592405259001,\\\"keyName\\\":\\\"ServoMotor\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592368525114,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false}}],\\\"ServoMotor\\\":[{\\\"x\\\":657.75,\\\"y\\\":287.75,\\\"tx\\\":102,\\\"ty\\\":-142,\\\"id\\\":1592405259001}],\\\"ArduinoUno\\\":[{\\\"x\\\":172.31944274902344,\\\"y\\\":146,\\\"tx\\\":-58,\\\"ty\\\":-3,\\\"id\\\":1592368525114,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"#include <Servo.h>\\\\nServo myservo;\\\\nint pos = 0;\\\\n\\\\nvoid setup() {\\\\n   myservo.attach(3);\\\\n}\\\\n\\\\nvoid loop() {\\\\n    for (pos = 0; pos <= 180; pos += 1) {\\\\n      myservo.write(pos);\\\\n      delay(15);\\\\n    }\\\\n    for (pos = 180; pos >= 0; pos -= 1) {\\\\n        myservo.write(pos);\\\\n        delay(15);\\\\n    }\\\\n}\\\\n\\\\n\\\"}}]}\",\n            \"name\": \"Servo\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/e5f372fd-e8a5-4bec-83a3-c173c610c0c7.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:43:09.432Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 77,\n        \"fields\": {\n            \"save_id\": \"gallery84675.84436901534\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":20.75,\\\"y\\\":116,\\\"scale\\\":0.9199999999999999},\\\"wires\\\":[{\\\"id\\\":1629376993982,\\\"points\\\":[[784.3194580078125,213],[789.3327026367188,499.9166564941406],[494.04107666015625,498.9999694824219],[497.3194580078125,424]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592204238583,\\\"keyName\\\":\\\"SlideSwitch\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376993983,\\\"points\\\":[[801.3194580078125,213],[845.1243896484375,209.37498474121094],[839.9160766601562,76.04166412353516],[541.4577026367188,73.375],[541.3194580078125,150]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592204238583,\\\"keyName\\\":\\\"SlideSwitch\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376993984,\\\"points\\\":[[766.3194580078125,213],[715.9577026367188,211.4583282470703],[715.9577026367188,104.16666412353516],[556.7910766601562,102.16666412353516],[555.3194580078125,150]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592204238583,\\\"keyName\\\":\\\"SlideSwitch\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376993985,\\\"points\\\":[[530.7910766601562,40.41666126251221],[511.3194580078125,424]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592204398406,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377899882,\\\"points\\\":[[514.7910766601562,40.41666126251221],[503.3194580078125,150]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592204398406,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":6,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377209094,\\\"points\\\":[[446.6243896484375,100.95832824707031],[445.3194580078125,150]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592204396689,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1629376993986,\\\"points\\\":[[462.6243896484375,100.95832824707031],[490.8194580078125,100],[494.8194580078125,-10],[430.8194580078125,-9],[431.3194580078125,150]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592204396689,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592204233256,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}}],\\\"SlideSwitch\\\":[{\\\"x\\\":798.3194580078125,\\\"y\\\":294,\\\"tx\\\":-39,\\\"ty\\\":-108,\\\"id\\\":1592204238583}],\\\"LED\\\":[{\\\"x\\\":429.6243896484375,\\\"y\\\":-19.041671752929688,\\\"tx\\\":28,\\\"ty\\\":52,\\\"id\\\":1592204396689,\\\"data\\\":{\\\"color\\\":0}},{\\\"x\\\":483.79107666015625,\\\"y\\\":-7.583338737487793,\\\"tx\\\":42,\\\"ty\\\":-20,\\\"id\\\":1592204398406,\\\"data\\\":{\\\"color\\\":1}}],\\\"ArduinoUno\\\":[{\\\"x\\\":328.3194580078125,\\\"y\\\":225,\\\"tx\\\":-99,\\\"ty\\\":-105,\\\"id\\\":1592204233256,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(7, INPUT);\\\\n    pinMode(6, INPUT);\\\\n    pinMode(9, OUTPUT);\\\\n    pinMode(13, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tif(digitalRead(7) == HIGH){\\\\n        digitalWrite(13, HIGH);\\\\n        digitalWrite(9, LOW);\\\\n    }\\\\n    if(digitalRead(6) == HIGH){\\\\n        digitalWrite(13, LOW);\\\\n        digitalWrite(9, HIGH);\\\\n    }\\\\n}\\\"}}]}\",\n            \"name\": \"Slide Switch\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/f74da15e-68f9-444a-9752-45586f06e52f.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:43:15.798Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 78,\n        \"fields\": {\n            \"save_id\": \"gallery90680.1790733519\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":7,\\\"y\\\":162.25,\\\"scale\\\":0.9199999999999999},\\\"wires\\\":[{\\\"id\\\":1629377000326,\\\"points\\\":[[390.3194580078125,340],[386.66607666015625,576.2916259765625],[739.3743896484375,569.375],[737.3194580078125,526]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592274709494,\\\"keyName\\\":\\\"RelayModule\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592274680021,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377000330,\\\"points\\\":[[406.3194580078125,340],[467.79107666015625,338.6666564941406],[469.8743896484375,209.5],[669.8743896484375,208.4583282470703],[671.3194580078125,252]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592274709494,\\\"keyName\\\":\\\"RelayModule\\\",\\\"pid\\\":5,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592274680021,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377000336,\\\"points\\\":[[376.3194580078125,340],[372.65155029296875,436.9456481933594],[452.2167663574219,436.0325927734375],[455.65155029296875,188.68478393554688],[685.1732788085938,185.68478393554688],[685.3194580078125,252]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592274709494,\\\"keyName\\\":\\\"RelayModule\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592274680021,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377000347,\\\"points\\\":[[403.3194580078125,161],[563.7493896484375,156.22825622558594],[565.9232788085938,93.18477630615234],[581.7928466796875,91.88043022155762]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592274709494,\\\"keyName\\\":\\\"RelayModule\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592274925181,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377000351,\\\"points\\\":[[380.0537414550781,75.09782218933105],[378.3194580078125,161]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592274941280,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592274709494,\\\"keyName\\\":\\\"RelayModule\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377000352,\\\"points\\\":[[364.0537414550781,75.09782218933105],[317.26025390625,74.70651245117188],[317.26025390625,-37.250003814697266],[554.216796875,-39.42391586303711],[555.3037109375,52.967384338378906],[581.7928466796875,49.88043022155762]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592274941280,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592274925181,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}}],\\\"RelayModule\\\":[{\\\"x\\\":267.3194580078125,\\\"y\\\":208,\\\"tx\\\":50,\\\"ty\\\":-70,\\\"id\\\":1592274709494}],\\\"LED\\\":[{\\\"x\\\":380.0537414550781,\\\"y\\\":-7.902177810668945,\\\"tx\\\":-5,\\\"ty\\\":15,\\\"id\\\":1592274941280,\\\"data\\\":{\\\"color\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":449.3194580078125,\\\"y\\\":217,\\\"tx\\\":20,\\\"ty\\\":5,\\\"id\\\":1592274680021,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(LED_BUILTIN, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(LED_BUILTIN, HIGH);\\\\n    delay(1000);\\\\n\\\\tdigitalWrite(LED_BUILTIN, LOW);\\\\n    delay(1000);\\\\n}\\\"}}],\\\"Battery9v\\\":[{\\\"x\\\":601.7928466796875,\\\"y\\\":-23.119569778442383,\\\"tx\\\":-20,\\\"ty\\\":42,\\\"id\\\":1592274925181}]}\",\n            \"name\": \"Relay\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/bea043fe-f562-4bfa-9fb0-d3e6157de51b.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:43:22.235Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 79,\n        \"fields\": {\n            \"save_id\": \"gallery76671.1469377743\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-113.25,\\\"y\\\":54,\\\"scale\\\":1.1800000000000002},\\\"wires\\\":[{\\\"id\\\":1629377005771,\\\"points\\\":[[336.375,213],[336.375,271]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593176474698,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593176471875,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377005772,\\\"points\\\":[[352.375,213],[369.375,214],[621.375,216],[614.375,608],[416.375,611],[416.375,545]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593176474698,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593176471875,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377005773,\\\"points\\\":[[973,229],[973.375,268]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593176480662,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593176476626,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377005774,\\\"points\\\":[[989,229],[1216.375,233],[1222.375,573],[1041.375,573],[1039.375,542]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593176480662,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593176476626,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}}],\\\"LED\\\":[{\\\"x\\\":363.375,\\\"y\\\":146,\\\"tx\\\":-16,\\\"ty\\\":-1,\\\"id\\\":1593176474698,\\\"data\\\":{\\\"color\\\":4}},{\\\"x\\\":100,\\\"y\\\":100,\\\"tx\\\":884,\\\"ty\\\":61,\\\"id\\\":1593176480662,\\\"data\\\":{\\\"color\\\":1}}],\\\"ArduinoUno\\\":[{\\\"x\\\":135.375,\\\"y\\\":237,\\\"tx\\\":-15,\\\"ty\\\":4,\\\"id\\\":1593176471875,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(LED_BUILTIN, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(LED_BUILTIN, HIGH);\\\\n    delay(1000);\\\\n\\\\tdigitalWrite(LED_BUILTIN, LOW);\\\\n    delay(1000);\\\\n}\\\"}},{\\\"x\\\":939.375,\\\"y\\\":338,\\\"tx\\\":-196,\\\"ty\\\":-100,\\\"id\\\":1593176476626,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 2\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(12, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(12, HIGH);\\\\n    delay(300);\\\\n\\\\tdigitalWrite(12, LOW);\\\\n    delay(300);\\\\n}\\\"}}]}\",\n            \"name\": \"Two Arduinos\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/bf698ecf-23c6-4a50-8316-fc7f0c0ca2e0.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:43:27.335Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 80,\n        \"fields\": {\n            \"save_id\": \"gallery25181.655192793605\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-355.25,\\\"y\\\":-3,\\\"scale\\\":1},\\\"wires\\\":[{\\\"id\\\":1629377011381,\\\"points\\\":[[659.375,179],[656.375,273]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593183905780,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593183899067,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377011382,\\\"points\\\":[[675.375,179],[947.375,179],[956.375,611],[719.375,610],[722.375,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593183905780,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593183899067,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}}],\\\"Label\\\":[{\\\"x\\\":1084.375,\\\"y\\\":183,\\\"tx\\\":-59,\\\"ty\\\":2,\\\"id\\\":1593184554578,\\\"data\\\":{\\\"text\\\":\\\"Note\\\",\\\"size\\\":58,\\\"color\\\":\\\"#ff0000\\\",\\\"weight\\\":\\\"Bold\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":1059.625,\\\"y\\\":254,\\\"tx\\\":197,\\\"ty\\\":-18,\\\"id\\\":1593184582898,\\\"data\\\":{\\\"text\\\":\\\"Send G to Glow LED and any other alphabet to stop the glow.\\\",\\\"size\\\":23,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}}],\\\"LED\\\":[{\\\"x\\\":665.375,\\\"y\\\":186,\\\"tx\\\":5,\\\"ty\\\":-75,\\\"id\\\":1593183905780,\\\"data\\\":{\\\"color\\\":4}}],\\\"ArduinoUno\\\":[{\\\"x\\\":443.375,\\\"y\\\":277,\\\"tx\\\":-17,\\\"ty\\\":-34,\\\"id\\\":1593183899067,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n    Serial.begin(9600);\\\\n\\\\tpinMode(12, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n    if(Serial.available() > 0){\\\\n        char c = Serial.read();\\\\n        if(c == 'G')\\\\n        \\\\tdigitalWrite(12, HIGH);\\\\n        else\\\\n        \\\\tdigitalWrite(12, LOW);\\\\n    }\\\\n}\\\"}}]}\",\n            \"name\": \"Play With Serial Input\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/eb60f293-b44f-4498-8337-9246ca6da3a0.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:43:33.252Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 81,\n        \"fields\": {\n            \"save_id\": \"gallery83044.73404901609\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":34.75,\\\"y\\\":60.25,\\\"scale\\\":1.04},\\\"wires\\\":[{\\\"id\\\":1629377022651,\\\"points\\\":[[158.2432403564453,180.05404663085938],[158.6666717529297,200.44444274902344]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592897349163,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":6,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377022652,\\\"points\\\":[[174.2432403564453,180.05404663085938],[171.6666717529297,200.44444274902344]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592897349163,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":7,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377360040,\\\"points\\\":[[56.59459686279297,288.70269775390625],[175,292.1071472167969],[173.6666717529297,314.44444274902344]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592897371331,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377418728,\\\"points\\\":[[40.59459686279297,288.70269775390625],[41.11111068725586,318.297607421875],[161.6666717529297,314.44444274902344]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592897371331,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377022653,\\\"points\\\":[[202.375,527.5],[204.6666717529297,294.44444274902344]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593055552928,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":11,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377943845,\\\"points\\\":[[596.3783874511719,431.0810852050781],[597.477294921875,462.1590881347656],[822.375,460.5]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593055525879,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377022654,\\\"points\\\":[[204.6666717529297,284.44444274902344],[263.0227355957031,285.1590881347656],[265.0227355957031,488.3863525390625],[839.3409423828125,493.8409118652344],[837.375,460.5]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593055525879,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":7,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377070794,\\\"points\\\":[[202.375,569.5],[166.15908813476562,571.25],[166.15908813476562,639.4318237304688],[883.2045288085938,645.1136474609375],[867.375,460.5]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593055552928,\\\"keyName\\\":\\\"Battery9v\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593055525879,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":15,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377022655,\\\"points\\\":[[207.6666717529297,206.44444274902344],[211.61363220214844,52.477272033691406],[669.79541015625,49.749996185302734],[668.3783874511719,157.08108520507812]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377022656,\\\"points\\\":[[207.6666717529297,256.44444274902344],[308.646240234375,256.73114013671875],[308.646240234375,135.0330352783203],[575.6273803710938,135.0330352783203],[574.3783874511719,157.08108520507812]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":5,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":6,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377195522,\\\"points\\\":[[207.6666717529297,246.44444274902344],[300.1556701660156,248.24058532714844],[300.1556701660156,126.54246520996094],[586.6651000976562,127.76887512207031],[588.3783874511719,157.08108520507812]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":7,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377022657,\\\"points\\\":[[207.6666717529297,236.44444274902344],[291.66510009765625,240.6934051513672],[291.66510009765625,116.16510009765625],[612.4764404296875,117.27831268310547],[612.3783874511719,157.08108520507812]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377022658,\\\"points\\\":[[207.6666717529297,226.44444274902344],[284.1179504394531,231.2594451904297],[284.1179504394531,104.84434509277344],[626.57080078125,105.7877426147461],[626.3783874511719,157.08108520507812]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377206808,\\\"points\\\":[[207.6666717529297,216.44444274902344],[272.0235900878906,215.05189514160156],[273.7405700683594,86.9198226928711],[639.6085205078125,89.69340515136719],[640.3783874511719,157.08108520507812]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1592897236003,\\\"keyName\\\":\\\"L298N\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592897315035,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":10,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":807.375,\\\"y\\\":127.5,\\\"tx\\\":-4,\\\"ty\\\":26,\\\"id\\\":1593055525879}],\\\"L298N\\\":[{\\\"x\\\":156.6666717529297,\\\"y\\\":214.44444274902344,\\\"tx\\\":-71,\\\"ty\\\":-21,\\\"id\\\":1592897236003}],\\\"Motor\\\":[{\\\"x\\\":143.2432403564453,\\\"y\\\":129.05404663085938,\\\"tx\\\":-13,\\\"ty\\\":-4,\\\"id\\\":1592897349163},{\\\"x\\\":119.59459686279297,\\\"y\\\":352.70269775390625,\\\"tx\\\":-107,\\\"ty\\\":-119,\\\"id\\\":1592897371331}],\\\"ArduinoUno\\\":[{\\\"x\\\":378.3783874511719,\\\"y\\\":206.08108520507812,\\\"tx\\\":-78,\\\"ty\\\":-79,\\\"id\\\":1592897315035,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n    Serial.begin(9600);\\\\n    pinMode(3, OUTPUT);\\\\n\\\\tpinMode(5, OUTPUT);\\\\n\\\\tpinMode(6, OUTPUT);\\\\n\\\\tpinMode(7, OUTPUT);\\\\n\\\\tpinMode(8, OUTPUT);\\\\n\\\\tpinMode(9, OUTPUT);\\\\n    analogWrite(3, 127);\\\\n    analogWrite(9, 127);\\\\n}\\\\nvoid loop(){\\\\n\\\\tif(Serial.available() > 0){\\\\n        char ch = Serial.read();\\\\n        Serial.println(ch);\\\\n        if(ch == 'w'){\\\\n            // Move Forward\\\\n            digitalWrite(5, LOW);\\\\n            digitalWrite(6, HIGH);\\\\n            digitalWrite(7, LOW);\\\\n            digitalWrite(8, HIGH);\\\\n        }else if(ch == 's'){\\\\n            // Move Backward\\\\n            digitalWrite(5, HIGH);\\\\n            digitalWrite(6, LOW);\\\\n            digitalWrite(7, HIGH);\\\\n            digitalWrite(8, LOW);\\\\n        }else if(ch == 'a'){\\\\n            // Move Left\\\\n            digitalWrite(5, LOW);\\\\n            digitalWrite(6, HIGH);\\\\n            digitalWrite(7, LOW);\\\\n            digitalWrite(8, LOW);\\\\n        }else if(ch == 'd'){\\\\n            // Move Right\\\\n            digitalWrite(5, LOW);\\\\n            digitalWrite(6, LOW);\\\\n            digitalWrite(7, LOW);\\\\n            digitalWrite(8, HIGH);\\\\n        }\\\\n    }\\\\n}\\\"}}],\\\"Battery9v\\\":[{\\\"x\\\":865.375,\\\"y\\\":610.5,\\\"tx\\\":-663,\\\"ty\\\":-114,\\\"id\\\":1593055552928}]}\",\n            \"name\": \"Motor Driver\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/4a6be5e5-53fc-45e0-be75-db2caac61bef.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:43:44.617Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 82,\n        \"fields\": {\n            \"save_id\": \"gallery773.1863667196582\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":1,\\\"y\\\":12.5,\\\"scale\\\":1},\\\"wires\\\":[{\\\"id\\\":1629377028619,\\\"points\\\":[[427.375,521],[429.375,583],[656.375,584],[658.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530174651,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377028621,\\\"points\\\":[[688.375,244],[688.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530226379,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":11,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377880995,\\\"points\\\":[[672.375,244],[673.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530226379,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":5,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377665376,\\\"points\\\":[[703.375,245],[703.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530229859,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":13,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377028622,\\\"points\\\":[[719.375,245],[718.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530229859,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377394754,\\\"points\\\":[[749.375,246],[751.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530234619,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":21,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377719373,\\\"points\\\":[[765.375,246],[766.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530234619,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":27,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377028623,\\\"points\\\":[[779.625,242.5],[781.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530303771,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":29,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377921877,\\\"points\\\":[[795.625,242.5],[796.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530303771,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":35,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377122274,\\\"points\\\":[[485.375,247],[493.625,171.5],[601.625,170.5],[602.625,250.5],[658.375,246]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593530174651,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":11,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377028624,\\\"points\\\":[[843.625,244.5],[844.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530333499,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":41,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377998054,\\\"points\\\":[[859.625,244.5],[859.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530333499,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":47,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377028625,\\\"points\\\":[[875.625,244.5],[874.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530382683,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":49,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377120478,\\\"points\\\":[[891.625,244.5],[889.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530382683,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":55,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377028626,\\\"points\\\":[[951.625,243.5],[952.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530403714,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":65,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377286079,\\\"points\\\":[[967.625,243.5],[967.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530403714,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":71,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377681646,\\\"points\\\":[[982.625,243.5],[982.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530416251,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":73,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377578171,\\\"points\\\":[[998.625,243.5],[997.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530416251,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":79,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377028627,\\\"points\\\":[[1045.625,242.5],[1045.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530441994,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":85,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377787949,\\\"points\\\":[[1061.625,242.5],[1060.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530441994,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":91,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377863422,\\\"points\\\":[[1073.625,242.5],[1075.375,246]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530458634,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":93,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377028628,\\\"points\\\":[[1089.625,242.5],[1090.375,516]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593530458634,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593530197683,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":99,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":794.375,\\\"y\\\":282,\\\"tx\\\":-155,\\\"ty\\\":-73,\\\"id\\\":1593530197683}],\\\"LED\\\":[{\\\"x\\\":711.375,\\\"y\\\":147,\\\"tx\\\":-28,\\\"ty\\\":29,\\\"id\\\":1593530226379,\\\"data\\\":{\\\"color\\\":0}},{\\\"x\\\":761.375,\\\"y\\\":133,\\\"tx\\\":-47,\\\"ty\\\":44,\\\"id\\\":1593530229859,\\\"data\\\":{\\\"color\\\":4}},{\\\"x\\\":799.375,\\\"y\\\":145,\\\"tx\\\":-39,\\\"ty\\\":33,\\\"id\\\":1593530234619,\\\"data\\\":{\\\"color\\\":1}},{\\\"x\\\":844.625,\\\"y\\\":160.5,\\\"tx\\\":-54,\\\"ty\\\":14,\\\"id\\\":1593530303771,\\\"data\\\":{\\\"color\\\":2}},{\\\"x\\\":854.625,\\\"y\\\":135.5,\\\"tx\\\":0,\\\"ty\\\":41,\\\"id\\\":1593530333499,\\\"data\\\":{\\\"color\\\":3}},{\\\"x\\\":900.625,\\\"y\\\":159.5,\\\"tx\\\":-14,\\\"ty\\\":17,\\\"id\\\":1593530382683,\\\"data\\\":{\\\"color\\\":4}},{\\\"x\\\":923.625,\\\"y\\\":153.5,\\\"tx\\\":39,\\\"ty\\\":22,\\\"id\\\":1593530403714,\\\"data\\\":{\\\"color\\\":5}},{\\\"x\\\":1007.625,\\\"y\\\":160.5,\\\"tx\\\":-14,\\\"ty\\\":15,\\\"id\\\":1593530416251,\\\"data\\\":{\\\"color\\\":0}},{\\\"x\\\":1078.625,\\\"y\\\":167.5,\\\"tx\\\":-22,\\\"ty\\\":7,\\\"id\\\":1593530441994,\\\"data\\\":{\\\"color\\\":1}},{\\\"x\\\":1098.625,\\\"y\\\":194.5,\\\"tx\\\":-14,\\\"ty\\\":-20,\\\"id\\\":1593530458634,\\\"data\\\":{\\\"color\\\":3}}],\\\"ArduinoUno\\\":[{\\\"x\\\":369.375,\\\"y\\\":340,\\\"tx\\\":-238,\\\"ty\\\":-123,\\\"id\\\":1593530174651,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(4, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(4, HIGH);\\\\n    delay(1000);\\\\n\\\\tdigitalWrite(4, LOW);\\\\n    delay(1000);\\\\n}\\\"}}]}\",\n            \"name\": \"Blink With BreadBoard.\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/e096ee40-16e8-4eeb-9521-1f9b5dbf5529.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:43:50.295Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 83,\n        \"fields\": {\n            \"save_id\": \"gallery10147.571337596828\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":0,\\\"y\\\":0,\\\"scale\\\":1},\\\"wires\\\":[{\\\"id\\\":1629377036255,\\\"points\\\":[[441.53125,417],[442.53125,507],[723.53125,508],[722.53125,160],[753.53125,159]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593795977808,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593795986033,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377036257,\\\"points\\\":[[469.53125,417],[471.53125,492],[691.53125,492],[663.93125,94.025]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593795977808,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593796000275,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377036258,\\\"points\\\":[[649.73125,94.025],[669.53125,472],[512.53125,474],[513.53125,417]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1593796000275,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593795977808,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":22,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377949140,\\\"points\\\":[[635.03125,94.025],[645.53125,179],[768.53125,180],[768.53125,159]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593796000275,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593795986033,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":5,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377036259,\\\"points\\\":[[108.53125,219],[107.53125,10],[784.53125,9],[783.53125,159]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1593796008196,\\\"keyName\\\":\\\"ServoMotor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593795986033,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377036260,\\\"points\\\":[[122.53125,219],[121.53125,66],[448.53125,68],[447.53125,143]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1593796008196,\\\"keyName\\\":\\\"ServoMotor\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593795977808,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":6,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377036261,\\\"points\\\":[[92.53125,219],[91.53125,193],[29.53125,193],[35.53125,534],[457.53125,542],[455.53125,417]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1593796008196,\\\"keyName\\\":\\\"ServoMotor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1593795977808,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":419.53125,\\\"y\\\":195,\\\"tx\\\":315,\\\"ty\\\":-73,\\\"id\\\":1593795986033}],\\\"ServoMotor\\\":[{\\\"x\\\":76.53125,\\\"y\\\":346,\\\"tx\\\":-5,\\\"ty\\\":-137,\\\"id\\\":1593796008196}],\\\"PotentioMeter\\\":[{\\\"x\\\":641.53125,\\\"y\\\":55,\\\"tx\\\":-27,\\\"ty\\\":-40,\\\"id\\\":1593796000275,\\\"data\\\":{\\\"value\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":369.53125,\\\"y\\\":288,\\\"tx\\\":-196,\\\"ty\\\":-175,\\\"id\\\":1593795977808,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"#include <Servo.h>\\\\n\\\\nServo myServo;  // create servo object to control a servo\\\\n\\\\nvoid setup() {\\\\n  // initialize serial communication at 9600 bits per second:\\\\n  Serial.begin(9600);\\\\n  \\\\n  myServo.attach(9);  // attaches the servo on pin 9 to the servo object\\\\n}\\\\n\\\\nvoid loop() {\\\\n  // reads the value of the potentiometer (value between 0 and 1023)\\\\n  int analogValue = analogRead(A0);\\\\n\\\\n  // scales it to use it with the servo (value between 0 and 180)\\\\n  int angle = map(analogValue, 0, 1023, 0, 180);\\\\n\\\\n  // sets the servo position according to the scaled value\\\\n  myServo.write(angle); \\\\n\\\\n  // print out the value\\\\n  Serial.print(\\\\\\\"Analog: \\\\\\\");\\\\n  Serial.print(analogValue);\\\\n  Serial.print(\\\\\\\", Angle: \\\\\\\");\\\\n  Serial.println(angle);\\\\n  delay(100);\\\\n}\\\\n\\\"}}]}\",\n            \"name\": \"Arduino-Servo Motor controlled by Potentiometer\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/f092a5e8-ef9a-4496-bb29-b75915a69b7b.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:43:58.572Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 84,\n        \"fields\": {\n            \"save_id\": \"gallery40687.246117992836\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":53,\\\"y\\\":210.75,\\\"scale\\\":0.7400000000000005},\\\"wires\\\":[{\\\"id\\\":1629377042941,\\\"points\\\":[[344.2916717529297,424],[344.2916717529297,462.75],[510.5416564941406,462.75],[510.5416564941406,184.75],[642.5416870117188,184.75],[642.2916870117188,197.5]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":106,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042944,\\\"points\\\":[[316.2916717529297,424],[316.2916717529297,486.75],[535.5416870117188,486.75],[535.5416870117188,111.75],[655.5416870117188,111.75],[657.2916870117188,197.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":108,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042945,\\\"points\\\":[[250.2916717529297,150],[250.2916717529297,-78.5625],[868.2904052734375,-76.5625],[867.2916870117188,197.5]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":136,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042946,\\\"points\\\":[[264.2916717529297,150],[264.2916717529297,-60.593753814697266],[703.2904052734375,-60.593753814697266],[702.2916870117188,197.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":114,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377251407,\\\"points\\\":[[278.2916717529297,150],[278.2916717529297,-44.96875],[686.1029052734375,-44.96875],[687.2916870117188,197.5]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":112,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042947,\\\"points\\\":[[292.2916717529297,150],[292.2916717529297,-25.968751907348633],[719.6966552734375,-25.968751907348633],[717.2916870117188,197.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":116,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042948,\\\"points\\\":[[374.2916717529297,150],[374.2916717529297,89.65625],[669.6966552734375,89.65625],[672.2916870117188,197.5]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":110,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042949,\\\"points\\\":[[388.2916717529297,150],[388.2916717529297,74.03125],[791.2279052734375,76.03125],[792.2916870117188,197.5]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":10,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":126,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042950,\\\"points\\\":[[402.2916717529297,150],[402.2916717529297,57.625],[803.5404052734375,57.625],[807.2916870117188,197.5]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":11,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":128,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377637322,\\\"points\\\":[[416.2916717529297,150],[416.2916717529297,37.3125],[817.6029052734375,37.3125],[822.2916870117188,197.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":130,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042951,\\\"points\\\":[[430.2916717529297,150],[430.2916717529297,13.875],[832.4466552734375,13.875],[837.2916870117188,197.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1599924382841,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":13,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":132,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042952,\\\"points\\\":[[642.2916870117188,242.5],[642.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":286,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042953,\\\"points\\\":[[657.2916870117188,242.5],[657.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":288,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377169660,\\\"points\\\":[[672.2916870117188,242.5],[672.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":290,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042954,\\\"points\\\":[[687.2916870117188,242.5],[687.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":292,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377625629,\\\"points\\\":[[702.2916870117188,242.5],[702.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":294,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042955,\\\"points\\\":[[717.2916870117188,242.5],[717.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":296,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":5,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377203480,\\\"points\\\":[[732.2916870117188,242.5],[732.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":298,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":6,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042956,\\\"points\\\":[[747.2916870117188,242.5],[747.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":300,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":7,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377904259,\\\"points\\\":[[762.2916870117188,242.5],[762.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":302,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377849122,\\\"points\\\":[[777.2916870117188,242.5],[777.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":304,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042957,\\\"points\\\":[[792.2916870117188,242.5],[792.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":306,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":10,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377606624,\\\"points\\\":[[807.2916870117188,242.5],[807.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":308,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":11,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377042958,\\\"points\\\":[[822.2916870117188,242.5],[822.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":310,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false}},{\\\"id\\\":1629377709824,\\\"points\\\":[[837.2916870117188,242.5],[837.2916564941406,242]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1599924379959,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":312,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1599924401381,\\\"keyName\\\":\\\"LCD16X2\\\",\\\"pid\\\":13,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":963.2916870117188,\\\"y\\\":126,\\\"tx\\\":-385,\\\"ty\\\":0,\\\"id\\\":1599924379959}],\\\"LCD16X2\\\":[{\\\"x\\\":468.2916564941406,\\\"y\\\":528,\\\"tx\\\":132,\\\"ty\\\":-294,\\\"id\\\":1599924401381}],\\\"ArduinoUno\\\":[{\\\"x\\\":162.2916717529297,\\\"y\\\":209,\\\"tx\\\":-114,\\\"ty\\\":-89,\\\"id\\\":1599924382841,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"#include<LiquidCrystal.h>\\\\nLiquidCrystal lcd(12, 13, 11, 5, 4, 3, 2);\\\\n\\\\nbyte human[8] = {0b01110,0b01110,0b00100,0b01110,0b10101,0b00100,0b01010,0b01010};\\\\nbyte rocket[8] = {0b00100,0b01110,0b11111,0b11111,0b01110,0b01110,0b01010,0b01010};\\\\n\\\\nvoid setup() {\\\\n    lcd.begin(16, 2);\\\\n    lcd.createChar(1, human);\\\\n    lcd.createChar(2, rocket);\\\\n} \\\\nvoid loop() { \\\\n\\\\n    lcd.setCursor(1,0);\\\\n    lcd.write(byte(1));\\\\n\\\\n    lcd.setCursor(3, 0);\\\\n    lcd.print(\\\\\\\"Simulations\\\\\\\");    \\\\n\\\\n    lcd.setCursor(4, 1);\\\\n    lcd.print(\\\\\\\"on Cloud\\\\\\\");\\\\n\\\\n    lcd.setCursor(13,1);\\\\n    lcd.write(byte(2));\\\\n\\\\n    delay(1000);\\\\n    lcd.clear();\\\\n    delay(1000);\\\\n}\\\"}}]}\",\n            \"name\": \"LCD with BreadBoard\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/1fafb27c-29ce-4210-b1d5-b03ba26ecf5a.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:44:31.721Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 85,\n        \"fields\": {\n            \"save_id\": \"gallery54775.05536536516\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":198.75,\\\"y\\\":-90.25,\\\"scale\\\":0.9199999999999999},\\\"wires\\\":[{\\\"id\\\":1626289935711,\\\"points\\\":[[529,400.5],[529.5,399.275]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":116,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626289433076,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1626289935712,\\\"points\\\":[[544,400.5],[544.2,399.275]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":118,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626289433076,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1626289935713,\\\"points\\\":[[559,400.5],[558.4,399.275]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":120,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626289433076,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1626290844787,\\\"points\\\":[[634,400.5],[633,398.25]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":130,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626289441941,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1626289935714,\\\"points\\\":[[649,400.5],[649,398.25]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":132,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626289441941,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1626290352346,\\\"points\\\":[[301,356],[301,311],[379,311],[379,430.5],[409,430.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626289295708,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":13,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":220,\\\"isSoldered\\\":false}},{\\\"id\\\":1626289935716,\\\"points\\\":[[201,630],[201,675],[379,675],[379,460.5],[454,460.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626289295708,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":346,\\\"isSoldered\\\":false}},{\\\"id\\\":1626289935717,\\\"points\\\":[[409,415.5],[529,415.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":160,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":176,\\\"isSoldered\\\":false}},{\\\"id\\\":1626289935718,\\\"points\\\":[[544,415.5],[634,415.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":178,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":190,\\\"isSoldered\\\":false}},{\\\"id\\\":1626290239976,\\\"points\\\":[[454,445.5],[649,445.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":286,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626289288122,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":312,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":119,\\\"y\\\":154,\\\"tx\\\":271,\\\"ty\\\":175,\\\"id\\\":1626289288122}],\\\"PotentioMeter\\\":[{\\\"x\\\":419,\\\"y\\\":188.25,\\\"tx\\\":90,\\\"ty\\\":132,\\\"id\\\":1626289433076,\\\"data\\\":{\\\"value\\\":0}}],\\\"Label\\\":[{\\\"x\\\":559.9444580078125,\\\"y\\\":214.7777862548828,\\\"tx\\\":-22,\\\"ty\\\":58,\\\"id\\\":1626289675883,\\\"data\\\":{\\\"text\\\":\\\"Rotatepotentiometer'sknob\\\",\\\"size\\\":15,\\\"color\\\":\\\"#6a0dad\\\",\\\"weight\\\":\\\"Lighter\\\",\\\"style\\\":\\\"Normal\\\"}},{\\\"x\\\":389.9444580078125,\\\"y\\\":223.6666717529297,\\\"tx\\\":147,\\\"ty\\\":70,\\\"id\\\":1626289761249,\\\"data\\\":{\\\"text\\\":\\\"tochangeintensityofLED\\\",\\\"size\\\":15,\\\"color\\\":\\\"#6a0dad\\\",\\\"weight\\\":\\\"Lighter\\\",\\\"style\\\":\\\"normal\\\"}}],\\\"LED\\\":[{\\\"x\\\":281,\\\"y\\\":154.25,\\\"tx\\\":363,\\\"ty\\\":176,\\\"id\\\":1626289441941,\\\"data\\\":{\\\"color\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":43,\\\"y\\\":352,\\\"tx\\\":-124,\\\"ty\\\":-26,\\\"id\\\":1626289295708,\\\"data\\\":{\\\"name\\\":\\\"ArduinoUNOR31\\\",\\\"code\\\":\\\"int PIN = 2;\\\\n\\\\nvoid setup(){\\\\n    // set PIN mode to output\\\\n\\\\tpinMode(PIN, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n    // set output to High\\\\n\\\\tdigitalWrite(PIN, HIGH);\\\\n}\\\"}}]}\",\n            \"name\": \"LED with Potentiometer\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/3d8e1995-43b8-4984-9186-637027d7ad86.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:44:38.128Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 86,\n        \"fields\": {\n            \"save_id\": \"gallery53106.37811657486\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-501.25,\\\"y\\\":-69.75,\\\"scale\\\":1.08},\\\"wires\\\":[{\\\"id\\\":1626834621571,\\\"points\\\":[[1168.5,486.5],[1167.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":360,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834632190,\\\"points\\\":[[1183.5,486.5],[1183.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":362,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835359414,\\\"points\\\":[[1198.5,486.5],[1197.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":364,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621572,\\\"points\\\":[[1213.5,486.5],[1211.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":366,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834997733,\\\"points\\\":[[1228.5,486.5],[1226.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":368,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835211366,\\\"points\\\":[[1243.5,486.5],[1241.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":370,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":5,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835599596,\\\"points\\\":[[1258.5,486.5],[1258.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":372,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":6,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621573,\\\"points\\\":[[1273.5,486.5],[1274.46875,489]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":374,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":7,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834728555,\\\"points\\\":[[1168.5,546.5],[1167.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":121,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":8,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835461947,\\\"points\\\":[[1183.5,546.5],[1183.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":123,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":9,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835137530,\\\"points\\\":[[1198.5,546.5],[1199.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":125,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":10,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835122828,\\\"points\\\":[[1213.5,546.5],[1214.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":127,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":11,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621574,\\\"points\\\":[[1228.5,546.5],[1229.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":129,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835329676,\\\"points\\\":[[1243.5,546.5],[1243.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":131,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":13,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834638354,\\\"points\\\":[[1258.5,546.5],[1258.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":133,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":14,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834717794,\\\"points\\\":[[1273.5,546.5],[1274.46875,547]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":135,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626326054444,\\\"keyName\\\":\\\"L293D\\\",\\\"pid\\\":15,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621575,\\\"points\\\":[[1438.5,426.5],[1440,425.75]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":156,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626370960254,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834659767,\\\"points\\\":[[1453.5,426.5],[1456,425.75]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":158,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626370960254,\\\"keyName\\\":\\\"Motor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835069551,\\\"points\\\":[[1198.5,471.5],[1438.5,471.5]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":304,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":336,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835239707,\\\"points\\\":[[1243.5,456.5],[1453.5,456.5]],\\\"color\\\":\\\"#e6a800\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":250,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":278,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621576,\\\"points\\\":[[1273.5,426.5],[1297.5,392]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":134,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":61,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835037989,\\\"points\\\":[[1168.5,426.5],[1171.5,392]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":120,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":37,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834683162,\\\"points\\\":[[1273.5,606.5],[1311,608.75],[1312.5,392]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":375,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":65,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621577,\\\"points\\\":[[1213.5,426.5],[1219.5,377]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":126,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":44,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834759996,\\\"points\\\":[[1228.5,426.5],[1234.5,377]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":128,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":48,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834963362,\\\"points\\\":[[1063.5,561.5],[1063.5,561.775]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":167,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626370943992,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835605609,\\\"points\\\":[[1078.5,561.5],[1078.2,561.775]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":169,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626370943992,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621578,\\\"points\\\":[[1093.5,561.5],[1092.4,561.775]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":171,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626370943992,\\\"keyName\\\":\\\"PotentioMeter\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834766427,\\\"points\\\":[[881.9166870117188,652.1944427490234],[883.0556030273438,697.138916015625],[1077.9444580078125,697.4722290039062],[1078.5,606.5]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":22,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":349,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835234361,\\\"points\\\":[[1063.5,606.5],[1063.5,647]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":347,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":14,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621579,\\\"points\\\":[[1093.5,606.5],[1111.5,662]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":351,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":23,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835481281,\\\"points\\\":[[1342.5,392],[1342.5,647]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":73,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":74,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835533224,\\\"points\\\":[[1357.5,377],[1357.5,662]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":76,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":79,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835314887,\\\"points\\\":[[1258.5,426.5],[1260.8333740234375,317.1388854980469],[783.0556030273438,316.02777099609375],[785.9166870117188,378.19444274902344]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":132,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":4,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621580,\\\"points\\\":[[799.9166870117188,378.19444274902344],[798.6111450195312,329.3611145019531],[1185.27783203125,330.47222900390625],[1183.5,426.5]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":5,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":122,\\\"isSoldered\\\":false}},{\\\"id\\\":1626835593564,\\\"points\\\":[[757.9166870117188,378.19444274902344],[759.7222290039062,271.5833435058594],[1035.8333740234375,271.1388854980469]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626371450798,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834825529,\\\"points\\\":[[1070.8333740234375,271.1388854980469],[1078.5,377]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626371450798,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":16,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834893206,\\\"points\\\":[[771.9166870117188,378.19444274902344],[774.1666870117188,290.47222900390625],[1144.166748046875,287.1388854980469],[1147.166748046875,267.80555725097656]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626371452788,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834621581,\\\"points\\\":[[1182.166748046875,267.80555725097656],[1204.5,392]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626371452788,\\\"keyName\\\":\\\"PushButton\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":41,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834810430,\\\"points\\\":[[823.9166870117188,652.1944427490234],[826.7777709960938,720.75],[1403.4444580078125,721.8611450195312],[1405.5,662]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":87,\\\"isSoldered\\\":false}},{\\\"id\\\":1626834958934,\\\"points\\\":[[809.9166870117188,652.1944427490234],[817.888916015625,741.8611450195312],[1424.5555419921875,737.4166870117188],[1420.5,647]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626371174393,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626370927984,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":90,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":1089.5,\\\"y\\\":470,\\\"tx\\\":-90,\\\"ty\\\":-115,\\\"id\\\":1626370927984}],\\\"PotentioMeter\\\":[{\\\"x\\\":1132,\\\"y\\\":263.75,\\\"tx\\\":-89,\\\"ty\\\":219,\\\"id\\\":1626370943992,\\\"data\\\":{\\\"value\\\":0}}],\\\"Label\\\":[{\\\"x\\\":1289.0555419921875,\\\"y\\\":115,\\\"tx\\\":-125,\\\"ty\\\":18,\\\"id\\\":1626834625520,\\\"data\\\":{\\\"text\\\":\\\"Push to rotate\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":1325.7222900390625,\\\"y\\\":117.22222137451172,\\\"tx\\\":-160,\\\"ty\\\":36,\\\"id\\\":1626834655604,\\\"data\\\":{\\\"text\\\":\\\"Anti-Clockwise\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":783.5,\\\"y\\\":116.11111450195312,\\\"tx\\\":259,\\\"ty\\\":19,\\\"id\\\":1626834670688,\\\"data\\\":{\\\"text\\\":\\\"Push to rotate\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":881.2777709960938,\\\"y\\\":142.7777862548828,\\\"tx\\\":163,\\\"ty\\\":13,\\\"id\\\":1626834672616,\\\"data\\\":{\\\"text\\\":\\\"Clockwise\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":1023.5,\\\"y\\\":856.1111450195312,\\\"tx\\\":77,\\\"ty\\\":-86,\\\"id\\\":1626834704194,\\\"data\\\":{\\\"text\\\":\\\"Rotate potentiometer to change motor's RPM\\\",\\\"size\\\":24,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}}],\\\"Motor\\\":[{\\\"x\\\":1051,\\\"y\\\":175.75,\\\"tx\\\":361,\\\"ty\\\":195,\\\"id\\\":1626370960254}],\\\"ArduinoUno\\\":[{\\\"x\\\":952.9166870117188,\\\"y\\\":153.19444274902344,\\\"tx\\\":-411,\\\"ty\\\":195,\\\"id\\\":1626371174393,\\\"data\\\":{\\\"name\\\":\\\"ArduinoUNOR32\\\",\\\"code\\\":\\\"const int potPin = A0;\\\\nconst int fwdbuttonPin = 13;\\\\nconst int bckbuttonPin = 12;\\\\nconst int ICpin2 = 11;\\\\nconst int ICpin7 = 10;\\\\n\\\\nint potValue = 0;\\\\nint motorValue = 0;\\\\nint fwdbuttonState = 0;\\\\nint bckbuttonState = 0;\\\\n\\\\nvoid setup()\\\\n{\\\\npinMode(fwdbuttonPin, INPUT_PULLUP);\\\\npinMode(bckbuttonPin,INPUT_PULLUP);\\\\n\\\\npinMode(ICpin2, OUTPUT);\\\\npinMode(ICpin7, OUTPUT);\\\\n}\\\\n\\\\nvoid loop()\\\\n{\\\\npotValue = analogRead(potPin);\\\\nmotorValue = map(potValue, 0, 1023, 0, 255);\\\\nfwdbuttonState = digitalRead(fwdbuttonPin);\\\\nbckbuttonState = digitalRead(bckbuttonPin);\\\\n\\\\ndelay (500);\\\\nif(fwdbuttonState == LOW || bckbuttonState == LOW)\\\\n{\\\\n    analogWrite(fwdbuttonState == LOW ? ICpin2 : ICpin7, motorValue);         \\\\n    digitalWrite(fwdbuttonState == LOW ? ICpin7 : ICpin2, LOW);\\\\n} else\\\\n{\\\\n    analogWrite(ICpin2, 1);\\\\n    analogWrite(ICpin7, 1);\\\\n}\\\\n}\\\\n\\\"}}],\\\"PushButton\\\":[{\\\"x\\\":970.8333740234375,\\\"y\\\":187.13888549804688,\\\"tx\\\":51,\\\"ty\\\":4,\\\"id\\\":1626371450798},{\\\"x\\\":1194.166748046875,\\\"y\\\":223.80555725097656,\\\"tx\\\":-61,\\\"ty\\\":-36,\\\"id\\\":1626371452788}],\\\"L293D\\\":[{\\\"x\\\":375.46875,\\\"y\\\":664,\\\"tx\\\":788,\\\"ty\\\":-175,\\\"id\\\":1626326054444}]}\",\n            \"name\": \"L293D Motor Driver\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/319ced80-722f-48e3-8d72-3411ca2c1110.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:44:45.929Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 87,\n        \"fields\": {\n            \"save_id\": \"gallery74600.70001842984\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":39.5,\\\"y\\\":-20,\\\"scale\\\":1.2200000000000002},\\\"wires\\\":[{\\\"id\\\":1627283225471,\\\"points\\\":[[259,560],[259,583.0701904296875],[488.881591796875,583.0701904296875],[488.881591796875,561.140380859375],[517,561]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626864742739,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":19,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false}},{\\\"id\\\":1627283225473,\\\"points\\\":[[652,355.5],[650,357]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":238,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626864757742,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1627283225474,\\\"points\\\":[[667,355.5],[666,357]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":240,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1626864757742,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1627283225476,\\\"points\\\":[[667,385.5],[670,561]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":360,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":39,\\\"isSoldered\\\":false}},{\\\"id\\\":1627284170811,\\\"points\\\":[[562,370.5],[482.03509521484375,370.5],[482.03509521484375,233.9385986328125],[195.19297790527344,233.9385986328125],[193,286]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":286,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626864742739,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":2,\\\"isSoldered\\\":false}},{\\\"id\\\":1627283225478,\\\"points\\\":[[577,370.5],[652,370.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":288,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":298,\\\"isSoldered\\\":false}},{\\\"id\\\":1627283262244,\\\"points\\\":[[562,325.5],[561.0833129882812,324.5833282470703]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":106,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627283259152,\\\"keyName\\\":\\\"PhotoResistor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1627283262246,\\\"points\\\":[[577,325.5],[576.0833129882812,324.5833282470703]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1626864744564,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":108,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627283259152,\\\"keyName\\\":\\\"PhotoResistor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":254,\\\"y\\\":101,\\\"tx\\\":244,\\\"ty\\\":153,\\\"id\\\":1626864744564}],\\\"PhotoResistor\\\":[{\\\"x\\\":538.0833129882812,\\\"y\\\":175.5833282470703,\\\"tx\\\":6,\\\"ty\\\":89,\\\"id\\\":1627283259152}],\\\"Label\\\":[{\\\"x\\\":528.9893188476562,\\\"y\\\":119.62232971191406,\\\"tx\\\":22,\\\"ty\\\":44,\\\"id\\\":1627283306260,\\\"data\\\":{\\\"text\\\":\\\"Move slider to change LED's brightness\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}}],\\\"LED\\\":[{\\\"x\\\":198,\\\"y\\\":64,\\\"tx\\\":463,\\\"ty\\\":225,\\\"id\\\":1626864757742,\\\"data\\\":{\\\"color\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":54,\\\"y\\\":259,\\\"tx\\\":-77,\\\"ty\\\":-3,\\\"id\\\":1626864742739,\\\"data\\\":{\\\"name\\\":\\\"ArduinoUNOR31\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tpinMode(13, OUTPUT);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tdigitalWrite(13, HIGH);\\\\n}\\\"}}]}\",\n            \"name\": \"LED with LDR\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/d5998ada-a956-4ec0-b88c-e2b2168fc05f.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:44:59.313Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 88,\n        \"fields\": {\n            \"save_id\": \"gallery70213.35633167367\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-410.25,\\\"y\\\":-131.25,\\\"scale\\\":1.1400000000000001},\\\"wires\\\":[{\\\"id\\\":1627499789361,\\\"points\\\":[[746.9415130615234,655.1282043457031],[746.9415130615234,708.2069091796875],[1043.7586669921875,708.2069091796875],[1044.300537109375,481.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1627148899389,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":350,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499789363,\\\"points\\\":[[680.9415130615234,381.1282043457031],[679.9415130615234,352.5172424316406],[939.5172729492188,351.5172424316406],[938.5172729492188,601.5517578125],[984.300537109375,601.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1627148899389,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":343,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499789364,\\\"points\\\":[[984.300537109375,436.5],[1029.300537109375,436.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":162,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":168,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500424552,\\\"points\\\":[[1029.300537109375,481.5],[1029.300537109375,688.2672729492188],[877.0344848632812,688.2672729492188],[874.9415130615234,655.1282043457031]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":348,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627148899389,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":26,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500012671,\\\"points\\\":[[1029.300537109375,421.5],[1028.27587890625,421.34483337402344]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":108,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627442453873,\\\"keyName\\\":\\\"Thermistor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499789365,\\\"points\\\":[[1044.300537109375,421.5],[1046.27587890625,421.34483337402344]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":110,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627442453873,\\\"keyName\\\":\\\"Thermistor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500261793,\\\"points\\\":[[984.300537109375,466.5],[982.1466674804688,468.20513916015625]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":282,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627148918352,\\\"keyName\\\":\\\"Resistor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499789366,\\\"points\\\":[[984.300537109375,556.5],[982.1466674804688,559.2051391601562]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627148894928,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":163,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627148918352,\\\"keyName\\\":\\\"Resistor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":950.300537109375,\\\"y\\\":350,\\\"tx\\\":0,\\\"ty\\\":0,\\\"id\\\":1627148894928}],\\\"Resistor\\\":[{\\\"x\\\":954.1466674804688,\\\"y\\\":178.20513916015625,\\\"tx\\\":17,\\\"ty\\\":286,\\\"id\\\":1627148918352,\\\"data\\\":{\\\"value\\\":1000,\\\"tolerance\\\":10}}],\\\"Label\\\":[{\\\"x\\\":1070.403564453125,\\\"y\\\":191,\\\"tx\\\":-38,\\\"ty\\\":41,\\\"id\\\":1627499818860,\\\"data\\\":{\\\"text\\\":\\\"Move slider to change ADC\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":740.5789794921875,\\\"y\\\":245.38597106933594,\\\"tx\\\":295,\\\"ty\\\":8,\\\"id\\\":1627499857054,\\\"data\\\":{\\\"text\\\":\\\"value in serial output\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}}],\\\"ArduinoUno\\\":[{\\\"x\\\":125.94151306152344,\\\"y\\\":305.1282043457031,\\\"tx\\\":353,\\\"ty\\\":46,\\\"id\\\":1627148899389,\\\"data\\\":{\\\"name\\\":\\\"ArduinoUNOR31\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tSerial.begin(9600);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tint val = analogRead(A4);\\\\n    Serial.println(val);\\\\n    delay (500);\\\\n}\\\"}}],\\\"Thermistor\\\":[{\\\"x\\\":716.27587890625,\\\"y\\\":146.34483337402344,\\\"tx\\\":302,\\\"ty\\\":185,\\\"id\\\":1627442453873}]}\",\n            \"name\": \"Serial output with thermistor\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/de391668-434c-4f14-bf86-c791e107d1e6.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:45:06.226Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 89,\n        \"fields\": {\n            \"save_id\": \"gallery40489.4866727042\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":-65,\\\"y\\\":-59,\\\"scale\\\":1.1400000000000001},\\\"wires\\\":[{\\\"id\\\":1627499922111,\\\"points\\\":[[814.5,349.5],[813.5,350]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":124,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627149645405,\\\"keyName\\\":\\\"Thermistor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499922112,\\\"points\\\":[[829.5,349.5],[831.5,350]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":126,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627149645405,\\\"keyName\\\":\\\"Thermistor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500886994,\\\"points\\\":[[814.5,409.5],[814.5,617],[506.5,617],[504.5,577]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":364,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149636154,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":26,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499922113,\\\"points\\\":[[709.5,409.5],[599.5,409.5],[599.5,596],[404.5,596],[404.5,577]],\\\"color\\\":\\\"#2593fa\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":350,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149636154,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":20,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499922114,\\\"points\\\":[[709.5,394.5],[708.5,396]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":290,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627149744110,\\\"keyName\\\":\\\"Resistor\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500280552,\\\"points\\\":[[709.5,484.5],[708.5,487]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":171,\\\"isSoldered\\\":true},\\\"end\\\":{\\\"id\\\":1627149744110,\\\"keyName\\\":\\\"Resistor\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500273198,\\\"points\\\":[[709.5,499.5],[762.5,499.5],[762.5,394],[814.5,394.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":231,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":304,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499922115,\\\"points\\\":[[829.5,409.5],[829.5,648],[374.5,648],[376.5,577]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":366,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149636154,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false}},{\\\"id\\\":1627500494445,\\\"points\\\":[[476.5,303],[476.5,277.3918762207031],[564.8441772460938,277.3918762207031],[564.8441772460938,364.5540466308594],[739.5,364.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1627149636154,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":12,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":174,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499922116,\\\"points\\\":[[725.25,269],[725.25,331.4459533691406],[709.7026977539062,331.4459533691406],[709.5,349.5]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1627281921222,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":110,\\\"isSoldered\\\":false}},{\\\"id\\\":1627499994233,\\\"points\\\":[[709.25,269],[709.25,307.79730224609375],[736.0540771484375,307.79730224609375],[739.5,349.5]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1627281921222,\\\"keyName\\\":\\\"LED\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1627149633636,\\\"keyName\\\":\\\"BreadBoard\\\",\\\"pid\\\":114,\\\"isSoldered\\\":false}}],\\\"BreadBoard\\\":[{\\\"x\\\":615.5,\\\"y\\\":278,\\\"tx\\\":0,\\\"ty\\\":0,\\\"id\\\":1627149633636}],\\\"Resistor\\\":[{\\\"x\\\":197.5,\\\"y\\\":126,\\\"tx\\\":500,\\\"ty\\\":266,\\\"id\\\":1627149744110,\\\"data\\\":{\\\"value\\\":1000,\\\"tolerance\\\":10}}],\\\"Label\\\":[{\\\"x\\\":450.96490478515625,\\\"y\\\":135.3157958984375,\\\"tx\\\":260,\\\"ty\\\":42,\\\"id\\\":1627499939355,\\\"data\\\":{\\\"text\\\":\\\"LED's brightness\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}},{\\\"x\\\":472.8947448730469,\\\"y\\\":163.38597106933594,\\\"tx\\\":233,\\\"ty\\\":-9,\\\"id\\\":1627499941934,\\\"data\\\":{\\\"text\\\":\\\"Move slider to change\\\",\\\"size\\\":15,\\\"color\\\":\\\"#000000\\\",\\\"weight\\\":\\\"normal\\\",\\\"style\\\":\\\"normal\\\"}}],\\\"LED\\\":[{\\\"x\\\":720.25,\\\"y\\\":201,\\\"tx\\\":0,\\\"ty\\\":0,\\\"id\\\":1627281921222,\\\"data\\\":{\\\"color\\\":0}}],\\\"ArduinoUno\\\":[{\\\"x\\\":-29.5,\\\"y\\\":311,\\\"tx\\\":138,\\\"ty\\\":-38,\\\"id\\\":1627149636154,\\\"data\\\":{\\\"name\\\":\\\"ArduinoUNOR31\\\",\\\"code\\\":\\\"int i;\\\\nint val;\\\\n\\\\nvoid setup(){\\\\n\\\\tpinMode(3, OUTPUT); \\\\n    Serial . begin (115200);\\\\n    \\\\n\\\\tfor(i = 1; i <= 20; i++) {\\\\n        val = analogRead(A4) ; // read value from \\\\n        Serial.println(val); //display\\\\n        if(val > 550) {\\\\n            digitalWrite(3,HIGH);\\\\n        }else{\\\\n            digitalWrite (3 , LOW);\\\\n        }\\\\n        delay (500) ;\\\\n    }\\\\n    digitalWrite (3 , LOW) ;\\\\n}\\\\n\\\\nvoid loop(){\\\\n}\\\"}}],\\\"Thermistor\\\":[{\\\"x\\\":307.5,\\\"y\\\":156,\\\"tx\\\":496,\\\"ty\\\":104,\\\"id\\\":1627149645405}]}\",\n            \"name\": \"LED's brightness using Thermistor\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/42b33ddd-cae8-4af6-8133-2470a60edc47.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-19T12:45:15.023Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    },\n    {\n        \"model\": \"saveAPI.gallery\",\n        \"pk\": 118,\n        \"fields\": {\n            \"save_id\": \"gallery17038.096178174445\",\n            \"data_dump\": \"{\\\"canvas\\\":{\\\"x\\\":13.25,\\\"y\\\":284.25,\\\"scale\\\":0.6799999999999997},\\\"wires\\\":[{\\\"id\\\":1629705951880,\\\"points\\\":[[423.3194580078125,304],[424.3194580078125,343]],\\\"color\\\":\\\"#000\\\",\\\"start\\\":{\\\"id\\\":1592275089685,\\\"keyName\\\":\\\"MQ2\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592275094732,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":1,\\\"isSoldered\\\":false}},{\\\"id\\\":1629705951883,\\\"points\\\":[[448.3194580078125,304],[667.3194580078125,304],[668.3194580078125,655],[562.3194580078125,656],[562.3194580078125,617]],\\\"color\\\":\\\"#31c404\\\",\\\"start\\\":{\\\"id\\\":1592275089685,\\\"keyName\\\":\\\"MQ2\\\",\\\"pid\\\":3,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592275094732,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":22,\\\"isSoldered\\\":false}},{\\\"id\\\":1629705951885,\\\"points\\\":[[411.3194580078125,304],[209.31944274902344,303],[204.31944274902344,662],[491.3194580078125,659],[490.3194580078125,617]],\\\"color\\\":\\\"#ff0000\\\",\\\"start\\\":{\\\"id\\\":1592275089685,\\\"keyName\\\":\\\"MQ2\\\",\\\"pid\\\":0,\\\"isSoldered\\\":false},\\\"end\\\":{\\\"id\\\":1592275094732,\\\"keyName\\\":\\\"ArduinoUno\\\",\\\"pid\\\":18,\\\"isSoldered\\\":false}}],\\\"MQ2\\\":[{\\\"x\\\":265.3194580078125,\\\"y\\\":217,\\\"tx\\\":118,\\\"ty\\\":-77,\\\"id\\\":1592275089685}],\\\"ArduinoUno\\\":[{\\\"x\\\":372.3194580078125,\\\"y\\\":475,\\\"tx\\\":-150,\\\"ty\\\":-162,\\\"id\\\":1592275094732,\\\"data\\\":{\\\"name\\\":\\\"Arduino UNO R3 1\\\",\\\"code\\\":\\\"void setup(){\\\\n\\\\tSerial.begin(9600);\\\\n}\\\\n\\\\nvoid loop(){\\\\n\\\\tSerial.println(analogRead(A0));\\\\n    delay(1000);\\\\n}\\\"}}]}\",\n            \"name\": \"Gas Sensor\",\n            \"description\": \"\",\n            \"media\": \"circuit_images_esim/37c98c01-b375-40c6-b877-28ffdce161da.png\",\n            \"shared\": true,\n            \"save_time\": \"2021-08-23T08:05:59.356Z\",\n            \"is_arduino\": true,\n            \"esim_libraries\": []\n        }\n    }\n]\n"
  },
  {
    "path": "esim-cloud-backend/workflowAPI/fixtures/initial_setup.json",
    "content": "[\n  {\n    \"model\": \"auth.group\",\n    \"pk\": 1,\n    \"fields\": { \"name\": \"Contributor [E-Sim]\", \"permissions\": [] }\n  },\n  {\n    \"model\": \"auth.group\",\n    \"pk\": 2,\n    \"fields\": { \"name\": \"Contributor [Arduino]\", \"permissions\": [] }\n  },\n  {\n    \"model\": \"auth.group\",\n    \"pk\": 3,\n    \"fields\": { \"name\": \"Reviewer [Arduino]\", \"permissions\": [] }\n  },\n  {\n    \"model\": \"auth.group\",\n    \"pk\": 4,\n    \"fields\": { \"name\": \"Reviewer [E-Sim]\", \"permissions\": [] }\n  },\n  {\n    \"model\": \"auth.group\",\n    \"pk\": 5,\n    \"fields\": { \"name\": \"Staff [eSim]\", \"permissions\": [] }\n  },\n  {\n    \"model\": \"auth.group\",\n    \"pk\": 6,\n    \"fields\": { \"name\": \"Staff [Arduino]\", \"permissions\": [] }\n  },\n  {\n    \"model\": \"workflowAPI.state\",\n    \"pk\": 1,\n    \"fields\": {\n      \"name\": \"Draft\",\n      \"description\": \"State used for the drafting stage of a project\",\n      \"public\": false,\n      \"report\": false\n    }\n  },\n  {\n    \"model\": \"workflowAPI.state\",\n    \"pk\": 2,\n    \"fields\": {\n      \"name\": \"Review\",\n      \"description\": \"State used for the reviewing stage\",\n      \"public\": false,\n      \"report\": false\n    }\n  },\n  {\n    \"model\": \"workflowAPI.state\",\n    \"pk\": 3,\n    \"fields\": {\n      \"name\": \"Reported\",\n      \"description\": \"State used when a project gets reported\",\n      \"public\": true,\n      \"report\": true\n    }\n  },\n  {\n    \"model\": \"workflowAPI.state\",\n    \"pk\": 4,\n    \"fields\": {\n      \"name\": \"Published\",\n      \"description\": \"State used for the  published stage\",\n      \"public\": true,\n      \"report\": false\n    }\n  },\n  {\n    \"model\": \"workflowAPI.customgroup\",\n    \"pk\": 1,\n    \"fields\": {\n      \"group\": 3,\n      \"is_arduino\": true,\n      \"is_type_reviewer\": true,\n      \"is_type_staff\": false,\n      \"is_default_role\": false\n    }\n  },\n  {\n    \"model\": \"workflowAPI.customgroup\",\n    \"pk\": 2,\n    \"fields\": {\n      \"group\": 4,\n      \"is_arduino\": false,\n      \"is_type_reviewer\": true,\n      \"is_type_staff\": false,\n      \"is_default_role\": false\n    }\n  },\n  {\n    \"model\": \"workflowAPI.customgroup\",\n    \"pk\": 3,\n    \"fields\": {\n      \"group\": 2,\n      \"is_arduino\": true,\n      \"is_type_reviewer\": false,\n      \"is_type_staff\": false,\n      \"is_default_role\": true\n    }\n  },\n  {\n    \"model\": \"workflowAPI.customgroup\",\n    \"pk\": 4,\n    \"fields\": {\n      \"group\": 1,\n      \"is_arduino\": false,\n      \"is_type_reviewer\": false,\n      \"is_type_staff\": false,\n      \"is_default_role\": true\n    }\n  },\n  {\n    \"model\": \"workflowAPI.customgroup\",\n    \"pk\": 5,\n    \"fields\": {\n      \"group\": 5,\n      \"is_arduino\": false,\n      \"is_type_reviewer\": false,\n      \"is_type_staff\": true,\n      \"is_default_role\": false\n    }\n  },\n  {\n    \"model\": \"workflowAPI.customgroup\",\n    \"pk\": 6,\n    \"fields\": {\n      \"group\": 6,\n      \"is_arduino\": true,\n      \"is_type_reviewer\": false,\n      \"is_type_staff\": true,\n      \"is_default_role\": false\n    }\n  },\n  {\n    \"model\": \"workflowAPI.permission\",\n    \"pk\": 1,\n    \"fields\": {\n      \"role\": 2,\n      \"view_own_states\": [1, 2, 3, 4],\n      \"view_other_states\": [3, 4],\n      \"edit_own_states\": [1],\n      \"del_own_states\": [1]\n    }\n  },\n  {\n    \"model\": \"workflowAPI.permission\",\n    \"pk\": 2,\n    \"fields\": {\n      \"role\": 1,\n      \"view_own_states\": [1, 2, 3, 4],\n      \"view_other_states\": [3, 4],\n      \"edit_own_states\": [1],\n      \"del_own_states\": [1]\n    }\n  },\n  {\n    \"model\": \"workflowAPI.permission\",\n    \"pk\": 3,\n    \"fields\": {\n      \"role\": 3,\n      \"view_own_states\": [1, 2, 3, 4],\n      \"view_other_states\": [2, 3, 4],\n      \"edit_own_states\": [1],\n      \"del_own_states\": [1]\n    }\n  },\n  {\n    \"model\": \"workflowAPI.permission\",\n    \"pk\": 4,\n    \"fields\": {\n      \"role\": 4,\n      \"view_own_states\": [1, 2, 3, 4],\n      \"view_other_states\": [2, 3, 4],\n      \"edit_own_states\": [1],\n      \"del_own_states\": [1]\n    }\n  },\n  {\n    \"model\": \"workflowAPI.transition\",\n    \"pk\": 1,\n    \"fields\": {\n      \"name\": \"Draft To Review\",\n      \"from_state\": 1,\n      \"to_state\": 2,\n      \"restricted_for_creator\": false,\n      \"only_for_creator\": true,\n      \"event_creator\": \"Review in Progress\",\n      \"history_creator\": \"Drafted and Sent for Review\",\n      \"event_reviewer\": \"Review in progress\",\n      \"history_reviewer\": \"Received for Review\",\n      \"event_other\": \"Review in progress\",\n      \"history_other\": \"Received for Review\",\n      \"role\": [1, 2]\n    }\n  },\n  {\n    \"model\": \"workflowAPI.transition\",\n    \"pk\": 2,\n    \"fields\": {\n      \"name\": \"Review To Published\",\n      \"from_state\": 2,\n      \"to_state\": 4,\n      \"restricted_for_creator\": true,\n      \"only_for_creator\": false,\n      \"event_creator\": null,\n      \"history_creator\": \"Reviewed & Published\",\n      \"event_reviewer\": null,\n      \"history_reviewer\": \"Reviewed & Published\",\n      \"event_other\": null,\n      \"history_other\": \"Reviewed & Published\",\n      \"role\": [3, 4]\n    }\n  },\n  {\n    \"model\": \"workflowAPI.transition\",\n    \"pk\": 3,\n    \"fields\": {\n      \"name\": \"Published to Reported\",\n      \"from_state\": 4,\n      \"to_state\": 3,\n      \"restricted_for_creator\": false,\n      \"only_for_creator\": false,\n      \"event_creator\": \"Waiting for Report evaluation\",\n      \"history_creator\": \"Reported\",\n      \"event_reviewer\": \"Waiting for Report evaluation\",\n      \"history_reviewer\": \"Reported\",\n      \"event_other\": \"Waiting for Report evaluation\",\n      \"history_other\": \"Reported\",\n      \"role\": [1, 2, 3, 4]\n    }\n  },\n  {\n    \"model\": \"workflowAPI.transition\",\n    \"pk\": 4,\n    \"fields\": {\n      \"name\": \"Review to Draft\",\n      \"from_state\": 2,\n      \"to_state\": 1,\n      \"restricted_for_creator\": false,\n      \"only_for_creator\": false,\n      \"event_creator\": \"Revision in progress\",\n      \"history_creator\": \"Reverted for Revision\",\n      \"event_reviewer\": \"Revision in progress\",\n      \"history_reviewer\": \"Reverted for Revision\",\n      \"event_other\": \"Revision in progress\",\n      \"history_other\": \"Reverted for Revision\",\n      \"role\": [1, 2, 3, 4]\n    }\n  },\n  {\n    \"model\": \"workflowAPI.transition\",\n    \"pk\": 5,\n    \"fields\": {\n      \"name\": \"Reported to Draft\",\n      \"from_state\": 3,\n      \"to_state\": 1,\n      \"restricted_for_creator\": true,\n      \"only_for_creator\": false,\n      \"event_creator\": \"Revision in progress\",\n      \"history_creator\": \"Received for revision\",\n      \"event_reviewer\": \"Revision in progress\",\n      \"history_reviewer\": \"Sent for revision\",\n      \"event_other\": \"Revision in progress\",\n      \"history_other\": \"Sent for revision\",\n      \"role\": [3, 4]\n    }\n  },\n  {\n    \"model\": \"workflowAPI.transition\",\n    \"pk\": 6,\n    \"fields\": {\n      \"name\": \"Reported to Published\",\n      \"from_state\": 3,\n      \"to_state\": 4,\n      \"restricted_for_creator\": true,\n      \"only_for_creator\": false,\n      \"event_creator\": null,\n      \"history_creator\": \"Reviewed & Published\",\n      \"event_reviewer\": null,\n      \"history_reviewer\": \"Reviewed & Published\",\n      \"event_other\": null,\n      \"history_other\": \"Reviewed & Published\",\n      \"role\": [3, 4]\n    }\n  }\n]\n"
  },
  {
    "path": "esim-cloud-backend/workflowAPI/models.py",
    "content": "from django.db import models\nfrom django.contrib.auth.models import Group\nfrom django.db.models.deletion import CASCADE, SET_NULL\nfrom django.contrib.auth import get_user_model\nfrom django.db.models.fields import related\n\n\n# State model which has been linked to circuits in publishAPI\nclass State(models.Model):\n    id = models.AutoField(primary_key=True)\n    name = models.CharField(max_length=200, null=False, unique=True)\n    description = models.CharField(null=True, max_length=200)\n    public = models.BooleanField(default=False)\n    report = models.BooleanField(default=False)\n\n    def __str__(self):\n        return self.name\n\n\n# Extending the Django users to implement arduino and e-sim specific roles\nclass CustomGroup(models.Model):\n    def __str__(self):\n        return \"{}\".format(self.group.name)\n\n    group = models.OneToOneField(Group, unique=True, on_delete=CASCADE)\n    is_arduino = models.BooleanField(default=False)\n    is_type_reviewer = models.BooleanField(default=False)\n    is_type_staff = models.BooleanField(default=False)\n    is_default_role = models.BooleanField(default=False)\n\n\nclass Permission(models.Model):\n    role = models.OneToOneField(Group, related_name='permission_role',\n                                on_delete=CASCADE, unique=True, )\n    view_own_states = models.ManyToManyField(State,\n                                             related_name=\"view_own_states\",\n                                             verbose_name='Can View own Project',  # noqa\n                                             blank=True)\n    view_other_states = models.ManyToManyField(State,\n                                               related_name=\"view_other_states\",  # noqa\n                                               verbose_name='Can View other Project',  # noqa\n                                               blank=True)\n    edit_own_states = models.ManyToManyField(State,\n                                             related_name=\"edit_own_states\",\n                                             verbose_name='Can Edit Details and Status own Project',  # noqa\n                                             blank=True)\n    del_own_states = models.ManyToManyField(State,\n                                            related_name=\"del_own_states\",\n                                            verbose_name='Can Delete own Project',  # noqa\n                                            blank=True)\n\n    def __str__(self):\n        return self.role.name + \" Permissions\"\n\n\n# Transition models to handle switching of states.\nclass Transition(models.Model):\n    name = models.CharField(null=True, max_length=100)\n    role = models.ManyToManyField(Group, related_name='role')\n    from_state = models.ForeignKey(State, null=True,\n                                   related_name='fromtransitions',\n                                   on_delete=SET_NULL)\n    to_state = models.ForeignKey(State, null=True,\n                                 related_name='totransitions',\n                                 on_delete=SET_NULL)\n    restricted_for_creator = models.BooleanField(default=True, null=False,\n                                                 verbose_name=\"Transition allowed for all users of specified roles except creator\")  # noqa\n    only_for_creator = models.BooleanField(default=False, null=False,\n                                           verbose_name=\"Transition that ONLY the creator should be able to do it.\")  # noqa\n    event_creator = models.CharField(blank=True, null=True, max_length=200,\n                                     verbose_name='Event Text for the Creator')  # noqa\n    history_creator = models.CharField(blank=True, null=True, max_length=200,\n                                       verbose_name='History Text for the Creator')  # noqa\n    event_reviewer = models.CharField(blank=True, null=True, max_length=200,\n                                      verbose_name='Event Text for the Reviewer')  # noqa\n    history_reviewer = models.CharField(blank=True, null=True, max_length=200,\n                                        verbose_name='History Text for the Reviewer')  # noqa\n    event_other = models.CharField(blank=True, null=True, max_length=200,\n                                   verbose_name='Event Text for the Other User')  # noqa\n    history_other = models.CharField(blank=True, null=True, max_length=200,\n                                     verbose_name='History Text for the Other User')  # noqa\n\n    def __str__(self):\n        return self.name\n"
  },
  {
    "path": "esim-cloud-backend/workflowAPI/serializers.py",
    "content": "from rest_framework import fields, serializers\nfrom .models import CustomGroup, Transition, State\nfrom publishAPI.models import Report\n\n\nclass UserRoleRetreieveSerializer(serializers.ModelSerializer):\n    e_sim_reviewer = serializers.BooleanField()\n    arduino_reviewer = serializers.BooleanField()\n    is_arduino_staff = serializers.BooleanField()\n    is_esim_staff = serializers.BooleanField()\n\n    class Meta:\n        model = CustomGroup\n        fields = [\n            'group',\n            'is_type_reviewer',\n            'arduino_reviewer',\n            'e_sim_reviewer', 'is_type_staff',\n            'is_arduino_staff',\n            'is_esim_staff',\n        ]\n\n\nclass StatusWithNotesSerializer(serializers.ModelSerializer):\n    note = serializers.CharField(max_length=500)\n    name = serializers.CharField(max_length=200)\n\n    class Meta:\n        model = State\n        fields = ('name', 'note',)\n\n\nclass StatusSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = State\n        fields = ('name',)\n\n\nclass TransitionSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = Transition\n        fields = ('to_state',)\n\n\nclass ReportStatusSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = Report\n        fields = ('id', 'approved')\n\n\nclass ReportApprovalSerializer(serializers.ModelSerializer):\n    state = StatusSerializer()\n    reports = ReportStatusSerializer(many=True)\n\n    class Meta:\n        model = Report\n        fields = ('reports', 'state')\n"
  },
  {
    "path": "esim-cloud-backend/workflowAPI/signals/__init__.py",
    "content": ""
  },
  {
    "path": "esim-cloud-backend/workflowAPI/signals/handlers.py",
    "content": "from django.db.models.signals import post_save\nfrom django.dispatch import receiver\nfrom django.conf import settings\nfrom django.contrib.auth.models import Group\n\n\n@receiver(post_save, sender=settings.AUTH_USER_MODEL)\ndef save_profile(sender, instance, created, **kwargs):\n    if created:\n        groups = Group.objects.filter(customgroup__is_default_role=True)\n        for group in groups:\n            instance.groups.add(group)\n"
  },
  {
    "path": "esim-cloud-backend/workflowAPI/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "esim-cloud-backend/workflowAPI/urls.py",
    "content": "from django.urls import path\nfrom .views import RetriveUserRoleView, ProjectStateView, \\\n    RetriveProjectsViewSet, ReportedProjectsView\n\nurlpatterns = [\n    path('role/', RetriveUserRoleView.as_view(), name='getRole'),\n    path('report/', ReportedProjectsView.as_view({'get': 'list_projects'}),\n         name='listReportedProjects'),\n    path('report/approve/<uuid:project_id>',\n         ReportedProjectsView.as_view({'post': 'approve_reports'}),\n         name='approveProjects'),\n    path('report/create/<uuid:project_id>',\n         ReportedProjectsView.as_view({'post': 'report_project'}),\n         name='reportProject'),\n    path('report/<uuid:project_id>',\n         ReportedProjectsView.as_view({'get': 'get_reports'}),\n         name='getReports'),\n    path('report/resolve/<uuid:project_id>',\n         ReportedProjectsView.as_view({'post': 'resolve'}),\n         name='resolveProject'),\n    path('state/<uuid:project_id>', ProjectStateView.as_view(), name='state'),\n    path('otherprojects/', RetriveProjectsViewSet.as_view(),\n         name='otherCircuits')\n]\n"
  },
  {
    "path": "esim-cloud-backend/workflowAPI/utils.py",
    "content": "from rest_framework.response import Response\nfrom rest_framework import status as http_status\nimport uuid\nfrom .serializers import StatusSerializer\nfrom .models import Permission, State, Transition, Permission\nfrom publishAPI.models import TransitionHistory\n\n\ndef ChangeStatus(self, status, project):\n    if isinstance(project.project_id, uuid.UUID):\n        try:\n            user_roles = self.request.user.groups.all()\n        except:  # noqa\n            return Exception({'message': 'No User Role'})\n        if project.author == self.request.user and Permission.objects.filter(\n                role__in=user_roles,\n                view_own_states=project.state).exists():\n            pass\n        elif project.author != self.request.user and Permission.objects.filter(\n                role__in=user_roles,\n                view_other_states=project.state).exists():\n            pass\n        else:\n            return Exception(\n                {'error': 'You are not authorized to edit the status.'})\n        circuit_transition = Transition.objects.get(from_state=project.state,\n                                                    to_state=State.objects.get(\n                                                        name=status))\n        roles = circuit_transition.role.all()\n        if circuit_transition.from_state != project.state:\n            return Exception(\n                {'error': 'You are not authorized to edit the status.'})\n        else:\n            if circuit_transition.only_for_creator is True and self.request.user == project.author:  # noqa\n                transition_history = TransitionHistory(\n                    project_id=project.project_id,\n                    transition_author=self.request.user,\n                    transition=circuit_transition,\n                    reviewer_notes='',)\n                transition_history.save()\n                project.state = circuit_transition.to_state\n                project.save()\n                state = project.state\n                serialized = StatusSerializer(state)\n                return serialized.data\n            elif circuit_transition.only_for_creator is False:\n                roles_set = set(roles)\n                user_roles_set = set(user_roles)\n                if user_roles_set.intersection(roles_set):\n                    intersection = user_roles_set.intersection(roles_set)\n                    for user_role in intersection:\n                        if user_role.customgroup.is_arduino is project.is_arduino:  # noqa\n                            if circuit_transition.restricted_for_creator is True and project.author == self.request.user:  # noqa\n                                return Response({\n                                    'error': 'You are not authorized to edit the status as it is not allowed for creator.'},  # noqa\n                                    status=http_status.HTTP_401_UNAUTHORIZED)\n                            else:\n                                transition_history = TransitionHistory(\n                                    project_id=project.project_id,\n                                    transition_author=self.request.user,\n                                    transition=circuit_transition,\n                                    reviewer_notes='',)\n                                transition_history.save()\n                                project.state = circuit_transition.to_state\n                                project.save()\n                                state = project.state\n                                serialized = StatusSerializer(state)\n                                return serialized.data\n                    return Exception({\n                        'error': 'You are not authorized to edit the status as you dont have the role'})  # noqa\n                else:\n                    return Exception({\n                        'error': 'You are not authorized to edit the status as you dont have the role'})  # noqa\n            else:\n                return Exception(\n                    {\n                        'error': 'You are not authorized to edit the status as it is only allowed for creator.'})  # noqa\n"
  },
  {
    "path": "esim-cloud-backend/workflowAPI/views.py",
    "content": "from os import confstr\nimport uuid\nfrom rest_framework.views import APIView\nfrom .serializers import StatusSerializer, ReportApprovalSerializer, \\\n    StatusWithNotesSerializer, \\\n    UserRoleRetreieveSerializer\nfrom .models import Permission, State, Transition, Permission\nfrom publishAPI.models import Project, Report, TransitionHistory\nfrom publishAPI.serializers import ProjectSerializer, ReportSerializer, \\\n    ReportDescriptionSerializer\nfrom rest_framework.response import Response\nfrom drf_yasg.utils import swagger_auto_schema\nfrom rest_framework.permissions import IsAuthenticated\nfrom rest_framework import viewsets, status as http_status\nfrom rest_framework.parsers import FormParser, JSONParser\n\n\nclass RetriveUserRoleView(APIView):\n    \"\"\"\n    Request to retrive roles\n    \"\"\"\n    parser_classes = (FormParser, JSONParser)\n    permission_classes = [IsAuthenticated]\n\n    @swagger_auto_schema(responses={200: UserRoleRetreieveSerializer})\n    def get(self, request):\n        userRoles = self.request.user.groups.all()\n        data = []\n        reviewer = False\n        e_sim_reviewer = False\n        arduino_reviewer = False\n        staff = False\n        e_sim_staff = False\n        arduino_staff = False\n        for userRole in userRoles:\n            data.append(userRole.name)\n            if userRole.customgroup is not None and userRole.customgroup.is_type_reviewer:  # noqa\n                reviewer = True\n                if userRole.customgroup.is_arduino is True:\n                    arduino_reviewer = True\n                else:\n                    e_sim_reviewer = True\n            if userRole.customgroup is not None and userRole.customgroup.is_type_staff:  # noqa\n                staff = True\n                if userRole.customgroup.is_arduino is True:\n                    arduino_staff = True\n                else:\n                    e_sim_staff = True\n\n        serializer = UserRoleRetreieveSerializer(\n            data={\"group\": data, \"is_type_reviewer\": reviewer,\n                  \"e_sim_reviewer\": e_sim_reviewer,\n                  \"arduino_reviewer\": arduino_reviewer,\n                  \"is_type_staff\": staff,\n                  \"is_arduino_staff\": arduino_staff,\n                  \"is_esim_staff\": e_sim_staff})\n        try:\n            serializer.is_valid()\n            return Response(serializer.data)\n        except:  # noqa\n            serializer.is_valid()\n            return Response(serializer.errors)\n\n\nclass RetriveProjectsViewSet(APIView):\n    \"\"\"\n    Retrive circuits for futher evaluation\n    \"\"\"\n    parser_classes = (FormParser, JSONParser)\n    serializer_class = ProjectSerializer\n    permission_classes = [IsAuthenticated]\n\n    @swagger_auto_schema(responses={200: ProjectSerializer})\n    def get(self, request):\n        try:\n            groups = self.request.user.groups.filter(customgroup__is_type_reviewer=True)  # noqa\n        except:  # noqa\n            return Response({'error': 'You are not authorized!'},\n                            status=http_status.HTTP_401_UNAUTHORIZED)\n        transitions = Transition.objects.filter(\n            role__in=groups, only_for_creator=False).distinct().exclude(from_state__public=True,  # noqa\n                                                                        from_state__report=False)  # noqa\n        projects = Project.objects.none()\n        for transition in transitions:\n            if transition.from_state.public is False or transition.from_state.report is True:  # noqa\n                roles_set = set(transition.role.all())\n                user_roles_set = set(groups)\n                if user_roles_set.intersection(roles_set):\n                    intersection = user_roles_set.intersection(roles_set)\n                    for user_role in intersection:\n                        if user_role.customgroup.is_arduino is False:\n                            project = Project.objects.filter(\n                                state=transition.from_state, is_arduino=False).exclude(  # noqa\n                                author=self.request.user)\n                            projects = projects | project\n                        else:\n                            project = Project.objects.filter(\n                                state=transition.from_state, is_arduino=True).exclude(  # noqa\n                                author=self.request.user)\n                            projects = projects | project\n        if projects == Project.objects.none():\n            return Response(status=http_status.HTTP_404_NOT_FOUND)\n        else:\n            serialized = ProjectSerializer(projects, many=True)\n            return Response(serialized.data)\n\n\nclass ProjectStateView(APIView):\n    \"\"\"\n    Requests to set and get possible to_states states\n    \"\"\"\n    parser_classes = (FormParser, JSONParser)\n    serializer_class = StatusSerializer\n    permission_classes = [IsAuthenticated]\n\n    def get(self, request, project_id):\n        if isinstance(project_id, uuid.UUID):\n            try:\n                project = Project.objects.get(\n                    project_id=project_id)\n            except Project.DoesNotExist:\n                return Response({'error': 'Project does not Exist'},\n                                status=http_status.HTTP_404_NOT_FOUND)\n            circuit_transition = Transition.objects.filter(\n                from_state=project.state,\n                role__in=self.request.user.groups.all()).distinct()\n            states = []\n            for transition in circuit_transition:\n                if transition.from_state.public is False or transition.from_state.report is True:  # noqa\n                    if transition.only_for_creator is True and self.request.user is project.author:  # noqa\n                        states.append(transition.to_state.name)\n                    else:\n                        if transition.restricted_for_creator is True and project.author == request.user:  # noqa\n                            pass\n                        else:\n                            states.append(transition.to_state.name)\n            states = list(set(states))\n            if states == []:\n                return Response(status=http_status.HTTP_200_OK)\n            else:\n                return Response(states, status=http_status.HTTP_200_OK)\n\n    @swagger_auto_schema(responses={200: StatusSerializer},\n                         request_body=StatusWithNotesSerializer)\n    def post(self, request, project_id):\n        if isinstance(project_id, uuid.UUID):\n            try:\n                project = Project.objects.get(\n                    project_id=project_id)\n            except Project.DoesNotExist:\n                return Response({'error': 'Does not Exist'},\n                                status=http_status.HTTP_404_NOT_FOUND)\n            try:\n                user_roles = self.request.user.groups.all()\n            except:  # noqa\n                return Response(data={'message': 'No User Role'},\n                                status=http_status.HTTP_404_NOT_FOUND)\n            if project.author == self.request.user and Permission.objects.filter(  # noqa\n                    role__in=user_roles,\n                    view_own_states=project.state).exists():\n                pass\n            elif project.author != self.request.user and Permission.objects.filter(  # noqa\n                    role__in=user_roles,\n                    view_other_states=project.state).exists():\n                pass\n            else:\n                return Response(status=http_status.HTTP_401_UNAUTHORIZED)\n            circuit_transition = Transition.objects.get(\n                from_state=project.state,\n                to_state=State.objects.get(name=request.data['name']))\n            roles = circuit_transition.role.all()\n            if circuit_transition.from_state != project.state:\n                return Response(\n                    {'error': 'You are not authorized to edit the status.'},\n                    status=http_status.HTTP_401_UNAUTHORIZED)\n            else:\n                if circuit_transition.only_for_creator is True and self.request.user == project.author:  # noqa\n                    transition_history = TransitionHistory(\n                        project_id=project_id,\n                        transition_author=request.user,\n                        transition=circuit_transition,\n                        reviewer_notes=request.data['note'])\n                    transition_history.save()\n                    project.state = circuit_transition.to_state\n                    project.save()\n                    state = project.state\n                    serialized = StatusSerializer(state)\n                    return Response(serialized.data)\n                elif circuit_transition.only_for_creator is False:\n                    roles_set = set(roles)\n                    user_roles_set = set(user_roles)\n                    if user_roles_set.intersection(roles_set):\n                        intersection = user_roles_set.intersection(roles_set)\n                        for user_role in intersection:\n                            if user_role.customgroup.is_arduino is project.is_arduino:  # noqa\n                                if circuit_transition.restricted_for_creator is True and project.author == request.user:  # noqa\n                                    return Response({\n                                        'error': 'You are not authorized to edit the status as it is not '  # noqa\n                                                 'allowed for creator.'},\n                                        status=http_status.HTTP_401_UNAUTHORIZED)  # noqa\n                                else:\n                                    transition_history = TransitionHistory(\n                                        project_id=project_id,\n                                        transition_author=request.user,\n                                        transition=circuit_transition,\n                                        reviewer_notes=request.data['note'])\n                                    transition_history.save()\n                                    project.state = circuit_transition.to_state\n                                    project.save()\n                                    state = project.state\n                                    serialized = StatusSerializer(state)\n                                    return Response(serialized.data)\n                        return Response(\n                            {\n                                'error': 'You are not authorized to edit the status as you dont have the role'},  # noqa\n                            status=http_status.HTTP_401_UNAUTHORIZED)\n                    else:\n                        return Response(\n                            {\n                                'error': 'You are not authorized to edit the status as you dont have the role.'},  # noqa\n                            status=http_status.HTTP_401_UNAUTHORIZED)\n                else:\n                    return Response(\n                        {\n                            'error': 'You are not authorized to edit the status as it is only allowed for creator.'},  # noqa\n                        status=http_status.HTTP_401_UNAUTHORIZED)\n\n\nclass ReportedProjectsView(viewsets.ViewSet):\n    parser_classes = (FormParser, JSONParser)\n    permission_classes = [IsAuthenticated]\n\n    @swagger_auto_schema(request_body=ReportDescriptionSerializer)\n    def report_project(self, request, project_id):\n        '''\n        Request to report a project.\n        '''\n        try:\n            state = State.objects.get(report=True)\n        except State.DoesNotExist:\n            return Response({'Message': 'No reported State implemented'},\n                            status=http_status.HTTP_404_NOT_FOUND)\n        try:\n            project = Project.objects.get(\n                project_id=project_id)\n        except Project.DoesNotExist:\n            return Response({'Message': 'No projects found'},\n                            status=http_status.HTTP_404_NOT_FOUND)\n        if project.is_reported is False and project.state != State.objects.get(\n                report=True):\n            transition_history = TransitionHistory(project_id=project_id,\n                                                   transition_author=request.user,  # noqa\n                                                   transition=Transition.objects.get(  # noqa\n                                                       from_state=project.state,    # noqa\n                                                       to_state=state)\n                                                   )\n            transition_history.save()\n            project.state = state\n            project.is_reported = True\n        report = Report(description=request.data['description'],\n                        project=project, reporter=self.request.user)\n        project.save()\n        report.save()\n        return Response(status=http_status.HTTP_200_OK)\n\n    @swagger_auto_schema(responses={200: ProjectSerializer})\n    def list_projects(self, request):\n        '''\n        Request to retrieve reported projects.\n        '''\n        try:\n            projects = Project.objects.filter(is_reported=True)\n        except Project.DoesNotExist:\n            return Response({'Message': 'No projects found'},\n                            status=http_status.HTTP_404_NOT_FOUND)\n        serialized = ProjectSerializer(projects, many=True)\n        return Response(serialized.data,\n                        status=http_status.http_status.HTTP_200_OK)\n\n    @swagger_auto_schema(request_body=ReportApprovalSerializer)\n    def approve_reports(self, request, project_id):\n        try:\n            groups = self.request.user.groups.all()\n        except:  # noqa\n            return Response({'error': 'You are not authorized!'},\n                            status=http_status.HTTP_401_UNAUTHORIZED)\n        for group in groups:\n            if group.customgroup.is_type_reviewer is True:\n                for report in request.data['reports']:\n                    temp = Report.objects.get(id=report['id'])\n                    temp.approved = report['approved']\n                    if report['approved'] is False:\n                        temp.report_open = False\n                    temp.save()\n                project = Project.objects.get(\n                    project_id=project_id)\n                state = State.objects.get(\n                    name=request.data['state']['name'])\n                transition = Transition.objects.get(\n                    from_state=project.state,\n                    to_state=state)\n                transition_history = TransitionHistory(\n                    project_id=project_id,\n                    transition_author=self.request.user,\n                    transition=transition)\n                transition_history.save()\n                project.state = state\n                if state.public:\n                    project.is_reported = False\n                project.save()\n                return Response({\"Approval sent\"})\n        else:\n            return Response({'error': 'You are not authorized!'},\n                            status=http_status.HTTP_401_UNAUTHORIZED)\n\n    @swagger_auto_schema(responses={200: ReportSerializer})\n    def get_reports(self, request, project_id):\n        '''\n        Request to get reports of a specific project.\n        '''\n        try:\n            project = Project.objects.get(\n                project_id=project_id, is_reported=True)\n        except Project.DoesNotExist:\n            return Response({\"Error\": \"No project found\"},\n                            status=http_status.HTTP_404_NOT_FOUND)\n        try:\n            if self.request.user == project.author:\n                open_reports = Report.objects.filter(\n                    project=project, report_open=True, approved=None)\n                resolved_reports = []\n                approved_reports = Report.objects.filter(\n                    project=project, report_open=True, approved=True)\n            else:\n                open_reports = Report.objects.filter(\n                    project=project, report_open=True, approved=None)\n                resolved_reports = Report.objects.filter(\n                    project=project, report_open=False)\n                approved_reports = Report.objects.filter(\n                    project=project, report_open=True, approved=True)\n        except Report.DoesNotExist:\n            return Response({\"Message\": \"No reports found\"},\n                            status=http_status.HTTP_404_NOT_FOUND)\n        open_serialized = ReportSerializer(open_reports, many=True)\n        resolved_serialized = ReportSerializer(resolved_reports, many=True)\n        approved_serializer = ReportSerializer(approved_reports, many=True)\n        return Response(\n            {\"open\": open_serialized.data, \"closed\": resolved_serialized.data,\n             \"approved\": approved_serializer.data},\n            status=http_status.HTTP_200_OK)\n\n    @swagger_auto_schema()\n    def resolve(self, request, project_id):\n        '''\n        Request to resolve the projects.\n        '''\n        try:\n            groups = self.request.user.groups.all()\n        except:  # noqa\n            return Response({'error': 'You are not authorized!'},\n                            status=http_status.HTTP_401_UNAUTHORIZED)\n        for group in groups:\n            if group.customgroup.is_type_reviewer is True:\n                try:\n                    project = Project.objects.get(\n                        project_id=project_id)\n                except Project.DoesNotExist:\n                    return Response({\"Error\": \"No project found\"},\n                                    status=http_status.HTTP_404_NOT_FOUND)\n                try:\n                    reports = Report.objects.filter(project=project)\n                except Report.DoesNotExist:\n                    return Response({\"Message\": \"No reports found\"},\n                                    status=http_status.HTTP_404_NOT_FOUND)\n                if self.request.user != project.author:\n                    for report in reports:\n                        report.report_open = False\n                        report.resolver = self.request.user\n                        report.save()\n                    try:\n                        transition_history = TransitionHistory(\n                            project_id=project_id,\n                            transition_author=request.user,\n                            transition=Transition.objects.get(\n                                from_state=project.state,\n                                to_state=State.objects.get(\n                                    name=request.data['name']))\n                        )\n\n                        project.state = State.objects.get(\n                            name=request.data['name'])\n                        transition_history.save()\n                    except:  # noqa\n                        pass\n                    project.is_reported = False\n                    project.save()\n                    return Response(\n                        {\"Message\": \"Changed Reported Project State\"},\n                        status=http_status.HTTP_200_OK)\n                else:\n                    return Response({'error': 'You are not authorized!'},\n                                    status=http_status.HTTP_401_UNAUTHORIZED)\n        else:\n            return Response({'error': 'You are not authorized!'},\n                            status=http_status.HTTP_401_UNAUTHORIZED)\n"
  },
  {
    "path": "first_run.dev.sh",
    "content": "#!/bin/bash\n\n#Clear old db files\necho 'Removing old files'\nrm -rf mysql_data\nrm -rf postgres_data\nrm -rf mongo_data\n\necho 'Deleting Existing Migrations'\nfind ./esim-cloud-backend -name \"migrations\" -type d -prune -exec rm -rf '{}' +\n\n#For Slow Systems / Systems with less memory\nexport DOCKER_CLIENT_TIMEOUT=120\nexport COMPOSE_HTTP_TIMEOUT=120\n\n#Build Containers\necho 'Building Containers, might take a while'\ndocker-compose -f docker-compose.dev.yml --env-file .env build\n\n# MYSQL does not play well with other containers if not allowed to finish config beforehand\necho 'Waiting for DB to finish its thing....'\ndocker-compose -f docker-compose.dev.yml --no-recreate --env-file .env -d up db\necho 'Waiting for 1 Minute'\nsleep 1m\n\necho 'Applying Database Migrations'\ndocker-compose -f docker-compose.dev.yml --env-file .env run --rm django /bin/sh migrations.sh\n\necho 'Copying Pre-Defined eSim-Gallery'\nif [ ! -d esim-cloud-backend/file_storage ]; then\n    mkdir esim-cloud-backend/file_storage\nfi\ncp esim-cloud-backend/workflowAPI/fixtures/circuit_images_esim esim-cloud-backend/file_storage -r\n"
  },
  {
    "path": "guidelines-checklist/contributing-guidelines.md",
    "content": "# Contributing Guidelines\n\n* Follow the django coding style: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/\n* If you are modifying or adding a feature then write unit test cases.\n* Avoid unnecessary modification of existing code. Ofcourse, you are free to optimize and resolve bugs.\n* Avoid duplication of code\n* Break your code/logic into different functions and add comments for better understanding.\n* If your contributions have some dependencies or they modify existing structure, then update the README.md file accordingly. Also feel free to add more documentation files.\n* Commit your code on a regular basis with meaningful commit messages.\n\n"
  },
  {
    "path": "guidelines-checklist/new-issue-guidelines.md",
    "content": "# Creating a new issue\n\n## Title\nEnter a crisp and meaningful title. \n\n## Description\n* Describe your issue in details. \n* If its a bug or error provide animated image (gif) or screenshots supporting your issue and showing the problem.\n* If its a new feature which has changes in UI, provide wireframes that will help us visualize your suggested feature.\n* Mention an approximate time that will required for you to complete and make a pull request (Only for developers). You can ignore this if you are just reporting or suggesting.\n* Tag the issue appropriately, whether it belongs to 'eSim' or 'Arduino'. Choose the type of issue 'enhancement', 'bug' etc. \n* Finally, mention 'Assignee: @YourGitHubUsername'. This will let the community know that you are addressing this issue. You can ignore this if you are just reporting or suggesting.\n"
  },
  {
    "path": "guidelines-checklist/pullrequest-guidelines.md",
    "content": "# Pull request\nA pull request is one of the most essential parts of sharing your contributions with us. Please make sure that you read and follow the guidelines. This will help us in accepting the pull request easily.\n\n## Guidelines\n* Each pull request should be for a single feature or addressing a single problem only.\n* Avoid handling multiple features or bug fixes into one pull request.\n* Ensure that you create it for the appropriate branch only.\n* Write a brief description about your contribution and what problem does it solve. A pull request with good description is always appreciated and will be accepted easily.\n* Once the pull request is made, GitHub actions will show linting errors if any and the different test results. If all goes well then ‘All checks have passed’ will be displayed on your pull request. If any one fails, you can check the details and act accordingly.\n"
  }
]