main 0a97236ce7ee cached
213 files
807.4 KB
291.0k tokens
779 symbols
1 requests
Download .txt
Showing preview only (870K chars total). Download the full file or copy to clipboard to get everything.
Repository: sqlhabit/sql_schema_visualizer
Branch: main
Commit: 0a97236ce7ee
Files: 213
Total size: 807.4 KB

Directory structure:
gitextract_3ikh_njc/

├── .github/
│   └── workflows/
│       └── deploy.yml
├── .gitignore
├── .npmrc
├── .nvmrc
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── bin/
│   ├── create_db_pages
│   ├── import
│   └── reset
├── build/
│   ├── asset-manifest.json
│   ├── databases/
│   │   ├── bindle.html
│   │   ├── ecommerce.html
│   │   ├── finance.html
│   │   ├── live.html
│   │   ├── movies.html
│   │   ├── nba.html
│   │   └── the-bank-job.html
│   ├── index.html
│   └── static/
│       ├── css/
│       │   └── main.9f228f45.css
│       └── js/
│           ├── 226.0d90ab44.chunk.js
│           ├── 226.0d90ab44.chunk.js.LICENSE.txt
│           ├── 394.14a9b9da.chunk.js
│           ├── bindle-edges-json.94501736.chunk.js
│           ├── bindle-schemaColors-json.b87e5760.chunk.js
│           ├── bindle-tablePositions-json.847db583.chunk.js
│           ├── bindle-tables.0d2bfe46.chunk.js
│           ├── ecommerce-edges-json.fe131063.chunk.js
│           ├── ecommerce-schemaColors-json.fdb98809.chunk.js
│           ├── ecommerce-tablePositions-json.03a16298.chunk.js
│           ├── ecommerce-tables.f5264437.chunk.js
│           ├── finance-edges-json.cc1c201e.chunk.js
│           ├── finance-schemaColors-json.e0d3a5af.chunk.js
│           ├── finance-tablePositions-json.9ab03387.chunk.js
│           ├── finance-tables.eac6da84.chunk.js
│           ├── live-edges-json.849f23e8.chunk.js
│           ├── live-schemaColors-json.3efe2122.chunk.js
│           ├── live-tablePositions-json.88001c8e.chunk.js
│           ├── live-tables.5a699030.chunk.js
│           ├── main.33dfc6b0.js
│           ├── main.33dfc6b0.js.LICENSE.txt
│           ├── movies-edges-json.5b3266f6.chunk.js
│           ├── movies-schemaColors-json.a48d91cc.chunk.js
│           ├── movies-tablePositions-json.1435348f.chunk.js
│           ├── movies-tables.37f21107.chunk.js
│           ├── nba-edges-json.b14b1c04.chunk.js
│           ├── nba-schemaColors-json.e0912a1a.chunk.js
│           ├── nba-tablePositions-json.eda5bb0d.chunk.js
│           ├── nba-tables.7858f3c9.chunk.js
│           ├── the-bank-job-edges-json.f4126c62.chunk.js
│           ├── the-bank-job-schemaColors-json.00b0e9ee.chunk.js
│           ├── the-bank-job-tablePositions-json.1ddd80ab.chunk.js
│           └── the-bank-job-tables.b72c42c8.chunk.js
├── design_notes/
│   └── 0001_using_regular_links.md
├── package.json
├── public/
│   └── index.html
├── schema.csv.template
├── src/
│   ├── App/
│   │   ├── App.css
│   │   ├── App.test.tsx
│   │   ├── SQLHabitLogo.tsx
│   │   └── index.tsx
│   ├── Visualizer/
│   │   ├── Style.ts
│   │   ├── Visualizer.test.tsx
│   │   ├── components/
│   │   │   ├── CloseIcon.tsx
│   │   │   ├── DatabaseIcon.tsx
│   │   │   ├── DatabaseMenuSidebar.tsx
│   │   │   ├── InfoIcon.tsx
│   │   │   ├── InfoPopup.tsx
│   │   │   ├── KeyIcon.tsx
│   │   │   ├── Markers.tsx
│   │   │   ├── MaximizeIcon.tsx
│   │   │   ├── MinimizeIcon.tsx
│   │   │   ├── TableNode.tsx
│   │   │   └── index.ts
│   │   ├── helpers/
│   │   │   ├── calculateEdges.ts
│   │   │   ├── calculateSourcePosition.ts
│   │   │   ├── calculateTargetPosition.ts
│   │   │   ├── edgeClassName.ts
│   │   │   ├── edgeMarkerName.ts
│   │   │   ├── fullTableName.ts
│   │   │   ├── index.ts
│   │   │   ├── initializeNodes.ts
│   │   │   ├── loadDatabaseConfig.ts
│   │   │   ├── loadDatabases.ts
│   │   │   ├── logTablePositions.ts
│   │   │   ├── markdown.ts
│   │   │   ├── moveSVGInFront.ts
│   │   │   ├── setEdgeClassName.ts
│   │   │   ├── setHighlightEdgeClassName.ts
│   │   │   └── tableHighlights.ts
│   │   ├── index.tsx
│   │   ├── style/
│   │   │   ├── column-name.scss
│   │   │   ├── database-menu-sidebar.scss
│   │   │   ├── flow.css
│   │   │   ├── handle.css
│   │   │   ├── has-many-edge.scss
│   │   │   ├── has-one-edge.scss
│   │   │   ├── info-popup.scss
│   │   │   ├── key-icon.css
│   │   │   ├── react-flow.scss
│   │   │   └── table.scss
│   │   └── types/
│   │       ├── CloseIconProps.ts
│   │       ├── DatabaseConfig.ts
│   │       ├── EdgeConfig.ts
│   │       ├── PopupProps.ts
│   │       ├── Position.ts
│   │       ├── SchemaColors.ts
│   │       ├── TableColumnConfig.ts
│   │       ├── TableConfig.ts
│   │       ├── TablePositions.ts
│   │       └── index.ts
│   ├── config/
│   │   ├── databases/
│   │   │   ├── bindle/
│   │   │   │   ├── edges.json
│   │   │   │   ├── schemaColors.json
│   │   │   │   ├── tablePositions.json
│   │   │   │   ├── tables/
│   │   │   │   │   ├── accounts.json
│   │   │   │   │   ├── adjust_callbacks.json
│   │   │   │   │   ├── books.json
│   │   │   │   │   ├── books_users.json
│   │   │   │   │   ├── devices.json
│   │   │   │   │   ├── helpers_dates.json
│   │   │   │   │   ├── marketing_spends.json
│   │   │   │   │   ├── mobile_analytics_events.json
│   │   │   │   │   ├── products.json
│   │   │   │   │   ├── profiles.json
│   │   │   │   │   ├── purchases.json
│   │   │   │   │   ├── users.json
│   │   │   │   │   ├── web_analytics_events.json
│   │   │   │   │   └── web_analytics_pageviews.json
│   │   │   │   └── tables.ts
│   │   │   ├── ecommerce/
│   │   │   │   ├── edges.json
│   │   │   │   ├── schemaColors.json
│   │   │   │   ├── tablePositions.json
│   │   │   │   ├── tables/
│   │   │   │   │   ├── carts.json
│   │   │   │   │   ├── carts_items.json
│   │   │   │   │   ├── categories.json
│   │   │   │   │   ├── discount_codes.json
│   │   │   │   │   ├── items.json
│   │   │   │   │   ├── purchases.json
│   │   │   │   │   ├── returns.json
│   │   │   │   │   ├── reviews.json
│   │   │   │   │   ├── users.json
│   │   │   │   │   └── vendors.json
│   │   │   │   └── tables.ts
│   │   │   ├── finance/
│   │   │   │   ├── edges.json
│   │   │   │   ├── schemaColors.json
│   │   │   │   ├── tablePositions.json
│   │   │   │   ├── tables/
│   │   │   │   │   ├── transactions.json
│   │   │   │   │   └── vendors.json
│   │   │   │   └── tables.ts
│   │   │   ├── live/
│   │   │   │   ├── edges.json
│   │   │   │   ├── schemaColors.json
│   │   │   │   ├── tablePositions.json
│   │   │   │   ├── tables/
│   │   │   │   │   ├── mobile_analytics_events.json
│   │   │   │   │   ├── products.json
│   │   │   │   │   ├── purchases.json
│   │   │   │   │   ├── trials.json
│   │   │   │   │   └── users.json
│   │   │   │   └── tables.ts
│   │   │   ├── movies/
│   │   │   │   ├── edges.json
│   │   │   │   ├── schemaColors.json
│   │   │   │   ├── tablePositions.json
│   │   │   │   ├── tables/
│   │   │   │   │   ├── actors.json
│   │   │   │   │   ├── actors_movies.json
│   │   │   │   │   ├── directors.json
│   │   │   │   │   ├── genres.json
│   │   │   │   │   ├── genres_movies.json
│   │   │   │   │   ├── movies.json
│   │   │   │   │   └── ratings.json
│   │   │   │   └── tables.ts
│   │   │   ├── nba/
│   │   │   │   ├── edges.json
│   │   │   │   ├── schemaColors.json
│   │   │   │   ├── tablePositions.json
│   │   │   │   ├── tables/
│   │   │   │   │   ├── games.json
│   │   │   │   │   ├── player_game_stats.json
│   │   │   │   │   ├── players.json
│   │   │   │   │   ├── team_game_stats.json
│   │   │   │   │   └── teams.json
│   │   │   │   └── tables.ts
│   │   │   └── the-bank-job/
│   │   │       ├── edges.json
│   │   │       ├── schemaColors.json
│   │   │       ├── tablePositions.json
│   │   │       ├── tables/
│   │   │       │   ├── accounts.json
│   │   │       │   ├── art_works.json
│   │   │       │   ├── authorized_vehicles.json
│   │   │       │   ├── cases.json
│   │   │       │   ├── cases_crime_types.json
│   │   │       │   ├── cases_criminals.json
│   │   │       │   ├── crime_types.json
│   │   │       │   ├── criminal_aliases.json
│   │   │       │   ├── criminals.json
│   │   │       │   ├── employees.json
│   │   │       │   ├── event_log.json
│   │   │       │   ├── road_camera_events.json
│   │   │       │   ├── safe_deposit_boxes.json
│   │   │       │   ├── storage_units.json
│   │   │       │   ├── storage_units_log.json
│   │   │       │   ├── transactions.json
│   │   │       │   ├── vaults.json
│   │   │       │   └── vehicles.json
│   │   │       └── tables.ts
│   │   ├── databases.json
│   │   ├── databases.json.template
│   │   ├── databases.ts
│   │   ├── edges.json.template
│   │   ├── nodeTypes.ts
│   │   ├── schemaColors.json.template
│   │   ├── tablePositions.json.template
│   │   └── tables.ts.template
│   ├── index.css
│   ├── index.tsx
│   ├── react-app-env.d.ts
│   └── setupTests.ts
└── tsconfig.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/deploy.yml
================================================
# https://dev.to/github/how-to-deploy-a-static-site-in-any-framework-of-your-choice-github-pages-neh
name: Deploy to GitHub Pages

on:
  # Trigger the workflow every time you push to the `main` branch
  push:
    branches: [ main ]
  # Allows you to run this workflow manually from the Actions tab on GitHub.
  workflow_dispatch:

  # Allow this job to clone the repo and create a page deployment
permissions:
  contents: read
  pages: write
  id-token: write

jobs:
  specs:
    runs-on: ubuntu-latest
    steps:
    - name: Check out your repository using git
      uses: actions/checkout@v4

    - name: Use Node.js 16
      uses: actions/setup-node@v4
      with:
        node-version: '16'
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Run specs
      run: npm run test

  build:
    runs-on: ubuntu-latest
    needs: specs
    env:
      NODE_ENV: production

    steps:
    - name: Check out your repository using git
      uses: actions/checkout@v4

    - name: Use Node.js 16
      uses: actions/setup-node@v4
      with:
        node-version: '16'
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Build React
      run: npm run build

    - name: Upload artifact
      uses: actions/upload-pages-artifact@v3
      with:
        path: ./build

  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4


================================================
FILE: .gitignore
================================================
.DS_Store
.cache
node_modules
dist
.env
.eslintcache
.idea
.log
.rollup.cache
*.csv


================================================
FILE: .npmrc
================================================
8.19.3


================================================
FILE: .nvmrc
================================================
16.19.0


================================================
FILE: CONTRIBUTING.md
================================================
# SQL Schema Visualizer Contribution Guidelines

First of all, thank you for your interest in contributing to the Schema Visualizer :raised_hands: Every form of contribution is appreciated. From issues to pull requests and documentation.

Please, check out [existing issues](https://github.com/sqlhabit/sql_schema_visualizer/issues) before you open a new one.

## Bugs and Features

If you have a **question**, **feature request** or a **bug report** simply create a [new issue](https://github.com/sqlhabit/sql_schema_visualizer/issues/new/choose).

## Pull Requests

Before submitting a substantial PR, please, open a [new issue](https://github.com/sqlhabit/sql_schema_visualizer/issues/new/choose). Let's discuss and plan it first. :pray:

### :mag: Anatomy of a great PR

1. Use a meaningful commit name.
2. Add a detailed PR description.
3. Write comments for key code changes. They'll help reviewing and serve as future documentation.
4. Write specs to make your changes bullet proof.
5. PROFIT. :beers:


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2023 Anatoli Makarevich @ SQL Habit

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
![SQL Schema Visualizer snapshot](https://raw.githubusercontent.com/sqlhabit/sql_schema_visualizer/main/docs/snapshot.png)

<div align="center">

# SQL Schema Visualizer

![GitHub License MIT](https://img.shields.io/github/license/sqlhabit/sql_schema_visualizer?color=%2347A3F3)
![GitHub release (latest by date)](https://img.shields.io/github/v/release/sqlhabit/sql_schema_visualizer?color=%2347A3F3)

A relational database schema visualizer built with React and [ReactFlow](https://github.com/wbkd/react-flow).

Originally built for [the SQL Habit course](https://www.sqlhabit.com/), it's available for everyone. Enjoy :heart:

[:mag: How to visualize your schema](https://github.com/sqlhabit/sql_schema_visualizer#how-to-visualize-your-schema) | [:microscope: How it works](https://github.com/sqlhabit/sql_schema_visualizer#under-the-hood) | [:handshake: Contributing](https://github.com/sqlhabit/sql_schema_visualizer#contributing)

</div>

## Features

:dash: **Easy to start**: you can import your schema(s) in 1.5 minutes.
<br>
:checkered_flag: **Easy to finish**: you only need to configure edges and table positions.
<br>
:wrench: **Customizable**: add table/column descriptions and schema colors.
<br>
:rocket: **Make it yours**: you get the whole React app, so you can change everything.

### Highlight specific tables and columns via a URL param

You can highlight tables and columns via the `highlights` URL param. Here's an example URL:

https://sqlhabit.github.io/sql_schema_visualizer/databases/bindle?highlights=users:id,email,signup_date;purchases:user_id,created_at

:mag: Note that tables are followed by semicolons `:` and column names are separated with commas `,`. Here's how it looks like:

<img src="https://raw.githubusercontent.com/sqlhabit/sql_schema_visualizer/main/docs/table_highlights.png" width="400px">

## How to visualize your schema(s)

Schema Visualizer can visualize multiple schemas – each schema will have its own URL.

A schema configuration lives in [its own folder](https://github.com/sqlhabit/sql_schema_visualizer/tree/main/src/config/databases) and contains a bunch of [simple JSON files](https://github.com/sqlhabit/sql_schema_visualizer/tree/main/src/config/databases/bindle).

Here's how you can import your schema:

### Step 1. Clone and set up the repo

Clone the repo:

```bash
git clone https://github.com/sqlhabit/sql_schema_visualizer.git

cd sql_schema_visualizer
```

Install dependencies:

```bash
npm install
```

:bulb: You might need to install [nvm](https://github.com/nvm-sh/nvm#installing-and-updating) as well to make sure you're not using an old Node version.

### Step 2. Reset schema configuration

By default, Schema Visualizer contains [SQL Habit's](https://www.sqlhabit.com) dataset schemas. Let's delete all before we import new schemas:

```bash
npm run reset
```

### Step 3. Export your schema into a CSV file

A schema config consists of [tables](https://github.com/sqlhabit/sql_schema_visualizer/tree/main/src/config/databases/bindle/tables), [edges](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/config/databases/bindle/edges.json), [table positions](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/config/databases/bindle/tablePositions.json) and [schema colors](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/config/databases/bindle/schemaColors.json).

Good news is that we can import tables using an SQL query. :rocket:

Pick a query for your database type and save the output to a CSV file like `my_schema.csv`. Put it to the root folder (next to [the `schema.csv.template` file](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/schema.csv.template)).

#### Postgres / Redshift

```sql
SELECT
  t.table_schema,
  t.table_name,
  c.column_name,
  c.data_type,
  c.ordinal_position
FROM information_schema.tables t
LEFT JOIN information_schema.columns c
  ON t.table_schema = c.table_schema
    AND t.table_name = c.table_name
WHERE
  t.table_schema NOT IN ('information_schema', 'pg_catalog')
  AND t.table_name NOT IN ('schema_migrations', 'ar_internal_metadata')
ORDER BY 1, 2, 5
```

#### BigQuery

```sql
SELECT
  c.table_schema,
  c.table_name,
  c.column_name,
  c.data_type,
  c.ordinal_position
FROM %PROJECT_NAME%.%DATASET_NAME%.INFORMATION_SCHEMA.COLUMNS c
JOIN %PROJECT_NAME%.%DATASET_NAME%.INFORMATION_SCHEMA.TABLES t
  ON c.table_schema = t.table_schema
  AND c.table_name = t.table_name
WHERE
  c.table_schema NOT IN ('INFORMATION_SCHEMA')
ORDER BY 1, 2, 5
```

:mag: Make sure to replace `%PROJECT_NAME%.%DATASET_NAME%` with proper values.

#### Snowflake

```sql
SELECT
  c.table_schema,
  c.table_name,
  c.column_name,
  c.data_type,
  c.ordinal_position
FROM information_schema.columns c
JOIN information_schema.tables t
  ON c.table_schema = t.table_schema
  AND c.table_name = t.table_name
WHERE
  c.table_schema NOT IN ('INFORMATION_SCHEMA')
  AND t.table_type = 'BASE TABLE'
ORDER BY 1, 2, 5
```

#### MySQL

```sql
SELECT
  c.table_schema,
  c.table_name,
  c.column_name,
  c.data_type,
  c.ordinal_position
FROM information_schema.columns c
LEFT JOIN information_schema.views v
  ON v.table_schema = c.table_schema
    AND v.table_name = c.table_name
WHERE
  c.table_schema NOT IN ('sys','information_schema', 'mysql', 'performance_schema')
  AND c.table_name NOT IN ('schema_migrations', 'ar_internal_metadata')
ORDER BY 1, 2, 5
```

#### [SAP ASE](https://github.com/sqlhabit/sql_schema_visualizer/issues/8)

```sql
SELECT
  'public' as table_schema,
  so.name as table_name,
  sc.name as column_name,
  sc.type as data_type,
  sc.colid as ordinal_position
FROM syscolumns sc
INNER JOIN sysobjects so
  ON sc.id = so.id
WHERE so.type = 'U'
```

### Step 4. Import schema

Now we can import tables. The argument of the `npm run import` command is your CSV file name:


```bash
npm run import my_schema
```

You should see table JSON files added to the `src/config/databases/my_schema/tables` folder.

Let's spin up a dev server and see our tables [in the browser](http://localhost:3000/):

```bash
npm run start
```

### Step 5. Configure your schema

#### A. Set primary keys

To show a :key: icon next to the column name, add the `key` param to a column definition. Here's an example from [the `users` table](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/config/databases/bindle/tables/users.json):

```json
{
  "name": "id",
  "key": true,
  "description": "Unique identifier of a user.",
  "type": "number"
}
```

#### B. Add edges

Define edges in [the `src/config/edges.json` file](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/config/databases/bindle/edges.json):

Here's an example for **has one** relation:

```json
{
  "source": "users",
  "sourceKey": "id",
  "target": "profiles",
  "targetKey": "user_id",
  "relation": "hasOne"
}
```

and **has many** relation:

```json
{
  "source": "users",
  "sourceKey": "id",
  "target": "purchases",
  "targetKey": "user_id",
  "relation": "hasMany"
}
```

#### C. Add schema colors

You can set custom header colors for tables that belongs to the same schema in [the `schemaColors.json` file](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/config/databases/bindle/schemaColors.json). Here's an example:

```json
{
  "DEFAULT": "#91C4F2",
  "public": "#BEB8EB",
  "adjust": "#AFA2FF",
  "helpers": "#75C9C8",
  "web_analytics": "#F6BDD1",
  "mobile_analytics": "#FFD791"
}
```

#### D. Add table positions

Table positions are defined in the [`tablePositions.json` file](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/config/databases/bindle/tablePositions.json):

```json
{
"adjust.callbacks": {
  "x": 864,
  "y": -192
},
"helpers.dates": {
  "x": 512,
  "y": 528
},
"mobile_analytics.events": {
  "x": 656,
  "y": -336
}
```

After you import a schema, every table will have a default position set in the [`tablePositions.json`](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/config/databases/bindle/tablePositions.json) file.

There's no need to update them manually. Instead:

1. Open Schema Visualizer [http://localhost:3000](http://localhost:3000).
2. Drag table nodes around to find a perfect arrangement.
3. **CTRL** + **P**. It copies node positions JSON to your clipboard.
4. Paste (**CMD** + **V**) JSON with positions to the [`tablePositions.json`](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/config/databases/bindle/tablePositions.json) file of your schema.
5. PROFIT :beers:

#### E. Add table and column descriptions

Table and column descriptions are visible if you press `CMD` key and hover over a table or column name.

Add custom copy to the `"description"` keys [in table config files](https://github.com/sqlhabit/sql_schema_visualizer/tree/main/src/config/databases/bindle/tables/users.json). Here's an example:

```json
{
  "name": "users",
  "description": "This table contains all user records of Bindle.",
  "columns": [
    {
      "name": "id",
      "key": true,
      "description": "Unique identifier of a user.",
      "type": "number"
    }
  ]
}
```

### Publish your schema online

#### Building your Schema Visualizer

Once you're finished with config file, build the project and upload the files from the [`/build`](https://github.com/sqlhabit/sql_schema_visualizer/tree/main/build) folder to your hosting of choice:


```sh
npm build
```

I highly recommend https://surge.sh/. It'll take you ~2 minutes to deploy your schema online:

1. `npm install --global surge`.
2. `cd build`
3. `surge`
4. PROFIT :beers:

## Contributing

You're more than welcome to contribute. In fact, I'm really looking forward to it! :rocket:

Just make sure to check out the [contribution guidelines](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/CONTRIBUTING.md). :pray:

## Under the hood

Schema Visualizer is built with [ReactFlow](https://reactflow.dev/).

Every table is a ReactFlow [Custom Node](https://reactflow.dev/docs/guides/custom-nodes/) with custom [Markers](https://reactflow.dev/docs/examples/edges/markers/) (those SVG icons with dot and fork).

Here's [a ReactFlow sandbox example](https://github.com/wbkd/react-flow-example-apps/tree/main/reactflow-create-react-app) of Custom Nodes.

### Config files

It all starts with plain [JSON config files](https://github.com/sqlhabit/sql_schema_visualizer/tree/main/src/config). There're 4 of them:

* [tables](https://github.com/sqlhabit/sql_schema_visualizer/tree/main/src/config/databases/bindle/tables)
* [edges](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/config/databases/bindle/edges.json)
* [tablePositions](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/config/databases/bindle/tablePositions.json)
* [schemaColors](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/config/databases/bindle/schemaColors.json)

Later they're translated into Nodes and Edges digestible by ReactFlow.

### Nodes and Handles

ReactFlow draws SVG edges between custom [Table Nodes](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/Visualizer/components/TableNode.tsx#L64).

Those edges start and end in ReactFlow Handle's. Every table column row has 2 handles – left and right. :bulb: A handle could be either **source** (for an outgoing edge) or a **target** (for an incoming edge). Handles are configured [based on the edges config](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/Visualizer/helpers/initializeNodes.ts#L4).

### Edges

As you can see, edges are dynamically change handles and orientation depending on relative node positions. That way it's less config to maintain, here're [helper](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/Visualizer/helpers/calculateTargetPosition.ts) [functions](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/Visualizer/helpers/calculateSourcePosition.ts) that take care of that.

### More details

[Here's the entry file](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/src/Visualizer/index.tsx) to the ReactFlow app.

Have fun exploring the app, it was a pleasure to build! If you have a question – open a [new issue](https://github.com/sqlhabit/sql_schema_visualizer/issues/new/choose). :beers:

## Development

You'll need to install dependencies and start a dev server:

```sh
npm install

npm start
```

You'll find the running visualizer at [http://localhost:3000](http://localhost:3000).

## Testing

Tests are written with the [React Testing Library](https://testing-library.com/docs/react-testing-library/example-intro). Run all of them via


```sh
npm test
```

## Maintainers

Schema Visualizer is a project of Anatoli of [SQL Habit](https://www.sqlhabit.com/). Hi from Berlin! :wave: :beers:

Anatoli Makarevich • [Twitter](https://twitter.com/makaroni4) • [Github](https://github.com/makaroni4)


## License

SQL Schema Visualizer is [MIT licensed](https://github.com/sqlhabit/sql_schema_visualizer/blob/main/LICENSE).


================================================
FILE: bin/create_db_pages
================================================
#!/usr/bin/env node

const databases = require("../src/config/databases.json");

const fs = require("fs").promises;

// design_notes/0001_using_regular_links.md
(async () => {
  await fs.mkdir("build/databases");

  for (const databaseSlug of Object.keys(databases)) {
    await fs.copyFile("build/index.html", `build/databases/${databaseSlug}.html`);
  };
})();


================================================
FILE: bin/import
================================================
#!/usr/bin/env node

const fs = require("fs").promises;

const SCHEMA_COLORS_TEMPLATE_FILE = "src/config/schemaColors.json.template";
const TABLES_INDEX_FILE_TEMPLATE = "src/config/tables.ts.template";
const DATABASES_FILE = "src/config/databases.json";

const DATA_TYPES = {
  "character varying": "text",
  "timestamp without time zone": "timestamp"
}

const adjustDataTypeName = (rawName) => {
  if(DATA_TYPES[rawName]) {
    return DATA_TYPES[rawName];
  } else {
    return rawName;
  }
};

const readTableData = async (databaseName) => {
  const schema = await fs.readFile(`${databaseName}.csv`, "utf8");

  const schemaData = schema.replaceAll('"', '').trim().split("\n").map(row => row.split(","));
  const [headers] = schemaData.splice(0, 1);

  const data = schemaData.map(row => {
    return Object.fromEntries(headers.map((key, index) => [key, row[index]]));
  });

  data.map(o => o.data_type = adjustDataTypeName(o.data_type));

  return data;
};

const importSchemaColors = async (databaseName, schemas) => {
  const schemasTemplateFile = await fs.readFile(SCHEMA_COLORS_TEMPLATE_FILE, "utf8");
  const defaultSchemaColors = JSON.parse(schemasTemplateFile);
  let schemaColors = Object.keys(schemas).reduce((acc, schemaName) => {
    acc[schemaName] = defaultSchemaColors.DEFAULT;
    return acc;
  }, {});

  schemaColors = {
    ...defaultSchemaColors,
    ...schemaColors
  };

  await fs.writeFile(`src/config/databases/${databaseName}/schemaColors.json`, JSON.stringify(schemaColors, null, 2), "utf8");
};

const importTablePositions = async (databaseName, tables) => {
  const tableCount = Object.keys(tables).length;
  const tablesPerRow = Math.round(Math.sqrt(tableCount));

  const tablePositions = Object.keys(tables).reduce((acc, tableName, index) => {
    const fullTableName = tableName.includes(".") ? tableName : `public.${tableName}`;

    const yPosition = Math.floor(index / tablesPerRow);
    const xPosition = index % tablesPerRow;

    acc[fullTableName] = {
      x: xPosition * 300,
      y: yPosition * 450
    };
    return acc;
  }, {});

  await fs.writeFile(`src/config/databases/${databaseName}/tablePositions.json`, JSON.stringify(tablePositions, null, 2), "utf8");
};

const importTableConfigs = async (databaseName, tables) => {
  await fs.mkdir(`src/config/databases/${databaseName}/tables`);

  Object.keys(tables).forEach(async tableName => {
    const tableFile = `src/config/databases/${databaseName}/tables/${tableName}.json`;
    const tableConfig = {
      name: tableName,
      description: "",
      schemaColor: "#91C4F2",
      columns: []
    };

    tables[tableName].forEach(row => {
      const columnName = row[0];
      const columnType = row[1];

      tableConfig.columns.push({
        name: columnName,
        description: "",
        type: columnType
      });
    });

    await fs.writeFile(tableFile, JSON.stringify(tableConfig, null, 2), "utf8");
  });
};

// https://ourcodeworld.com/articles/read/608/how-to-camelize-and-decamelize-strings-in-javascript
const camelize = (text) => {
  return text.replace(/\W/, "-").replace(/^([A-Z])|[\s-_]+(\w)/g, function(match, p1, p2, offset) {
      if (p2) return p2.toUpperCase();
      return p1.toLowerCase();
  });
};

const importEdgeConfigs = async (databaseName, tables) => {
  await fs.writeFile(`src/config/databases/${databaseName}/edges.json`, JSON.stringify([], null, 2), "utf8");
};

const importTablesIndexFile = async (databaseName, tables) => {
  const importStatements = [];
  const names = [];

  Object.keys(tables).forEach(tableName => {
    const tableConfigFileName = `${camelize(tableName)}Table`;

    importStatements.push(`import ${tableConfigFileName} from "./tables/${tableName}.json";`);
    names.push(`  ${tableConfigFileName}`);
  });

  const loadTablesTemplate = await fs.readFile(TABLES_INDEX_FILE_TEMPLATE, "utf8");
  const loadTablesHelper = loadTablesTemplate
    .replace("%TABLE_FILES%", importStatements.join("\n"))
    .replace("%TABLE_NAMES%", names.join(",\n"))

  await fs.writeFile(`src/config/databases/${databaseName}/tables.ts`, loadTablesHelper, "utf8");
};

const addDatabaseEntry = async (databaseName) => {
  const rawDatabases = await fs.readFile(DATABASES_FILE, "utf8");
  const databases = JSON.parse(rawDatabases);

  databases[databaseName] = {
    name: databaseName,
    description: ""
  }

  await fs.writeFile(DATABASES_FILE, JSON.stringify(databases, null, 2), "utf8");
};

const importConfigFiles = async ({ databaseName }) => {
  const databaseConfigFolder = `src/config/databases/${databaseName}`;
  await fs.mkdir(databaseConfigFolder);

  const tableData = await readTableData(databaseName);
  const tables = {};
  const schemas = {};

  tableData.forEach(row => {
    schemas[row.table_schema] = true;

    const name = row.table_schema === "public" ? row.table_name : `${row.table_schema}.${row.table_name}`;

    if(tables[name]) {
      tables[name].push([row.column_name, row.data_type]);
    } else {
      tables[name] = [[row.column_name, row.data_type]];
    }
  });

  await importSchemaColors(databaseName, schemas);
  await importTablePositions(databaseName, tables);
  await importTableConfigs(databaseName, tables);
  await importEdgeConfigs(databaseName, tables);
  await importTablesIndexFile(databaseName, tables);
  await addDatabaseEntry(databaseName);
};

(async () => {
  const databaseName = process.argv[2];
  if(!databaseName) {
    console.log("--> Provide a database name like 'npm run import foobar'");
    return;
  }

  const databaseConfigFolder = `src/config/databases/${databaseName}`;
  try {
    if(await fs.stat(databaseConfigFolder)) {
      console.log(`⚠️  Folder ${databaseConfigFolder} already exists.`);
      return;
    }
  } catch {}

  const readline = require("readline").createInterface({
    input: process.stdin,
    output: process.stdout
  });

  readline.question("Do you want to import schema from a CSV file? y/n\n", async (answer) => {
    if(answer.toLowerCase().includes("y")) {
      await importConfigFiles({ databaseName });

      console.log("Roger, everything is imported.");
    } else {
      console.log("Roger, skipping importing.");
    }

    readline.close();
  });
})();


================================================
FILE: bin/reset
================================================
#!/usr/bin/env node

const fs = require("fs").promises;

const resetConfigFile = async (filePath, templatePath = `${filePath}.template`) => {
  const templateData = await fs.readFile(templatePath, "utf8");

  await fs.writeFile(filePath, templateData, "utf8");
};

const cleanUpDatabasesFolder = async () => {
  await fs.rm("src/config/databases", { recursive: true });
  await fs.mkdir("src/config/databases");
};

const readline = require("readline").createInterface({
  input: process.stdin,
  output: process.stdout
});

readline.question("Do you want to reset existing tables, edges and schema colors? y/n\n", async (answer) => {
  if(answer.toLowerCase().includes("y")) {
    await resetConfigFile("src/config/databases.json");
    await cleanUpDatabasesFolder();

    console.log("Roger, everything is reset.");
  } else {
    console.log("Roger, skipping resetting.");
  }

  readline.close();
});


================================================
FILE: build/asset-manifest.json
================================================
{
  "files": {
    "main.css": "/sql_schema_visualizer/static/css/main.9f228f45.css",
    "main.js": "/sql_schema_visualizer/static/js/main.33dfc6b0.js",
    "static/js/394.14a9b9da.chunk.js": "/sql_schema_visualizer/static/js/394.14a9b9da.chunk.js",
    "static/js/226.0d90ab44.chunk.js": "/sql_schema_visualizer/static/js/226.0d90ab44.chunk.js",
    "bindle-edges-json.js": "/sql_schema_visualizer/static/js/bindle-edges-json.94501736.chunk.js",
    "ecommerce-edges-json.js": "/sql_schema_visualizer/static/js/ecommerce-edges-json.fe131063.chunk.js",
    "finance-edges-json.js": "/sql_schema_visualizer/static/js/finance-edges-json.cc1c201e.chunk.js",
    "live-edges-json.js": "/sql_schema_visualizer/static/js/live-edges-json.849f23e8.chunk.js",
    "movies-edges-json.js": "/sql_schema_visualizer/static/js/movies-edges-json.5b3266f6.chunk.js",
    "nba-edges-json.js": "/sql_schema_visualizer/static/js/nba-edges-json.b14b1c04.chunk.js",
    "the-bank-job-edges-json.js": "/sql_schema_visualizer/static/js/the-bank-job-edges-json.f4126c62.chunk.js",
    "bindle-tablePositions-json.js": "/sql_schema_visualizer/static/js/bindle-tablePositions-json.847db583.chunk.js",
    "ecommerce-tablePositions-json.js": "/sql_schema_visualizer/static/js/ecommerce-tablePositions-json.03a16298.chunk.js",
    "finance-tablePositions-json.js": "/sql_schema_visualizer/static/js/finance-tablePositions-json.9ab03387.chunk.js",
    "live-tablePositions-json.js": "/sql_schema_visualizer/static/js/live-tablePositions-json.88001c8e.chunk.js",
    "movies-tablePositions-json.js": "/sql_schema_visualizer/static/js/movies-tablePositions-json.1435348f.chunk.js",
    "nba-tablePositions-json.js": "/sql_schema_visualizer/static/js/nba-tablePositions-json.eda5bb0d.chunk.js",
    "the-bank-job-tablePositions-json.js": "/sql_schema_visualizer/static/js/the-bank-job-tablePositions-json.1ddd80ab.chunk.js",
    "bindle-schemaColors-json.js": "/sql_schema_visualizer/static/js/bindle-schemaColors-json.b87e5760.chunk.js",
    "ecommerce-schemaColors-json.js": "/sql_schema_visualizer/static/js/ecommerce-schemaColors-json.fdb98809.chunk.js",
    "finance-schemaColors-json.js": "/sql_schema_visualizer/static/js/finance-schemaColors-json.e0d3a5af.chunk.js",
    "live-schemaColors-json.js": "/sql_schema_visualizer/static/js/live-schemaColors-json.3efe2122.chunk.js",
    "movies-schemaColors-json.js": "/sql_schema_visualizer/static/js/movies-schemaColors-json.a48d91cc.chunk.js",
    "nba-schemaColors-json.js": "/sql_schema_visualizer/static/js/nba-schemaColors-json.e0912a1a.chunk.js",
    "the-bank-job-schemaColors-json.js": "/sql_schema_visualizer/static/js/the-bank-job-schemaColors-json.00b0e9ee.chunk.js",
    "bindle-tables.js": "/sql_schema_visualizer/static/js/bindle-tables.0d2bfe46.chunk.js",
    "ecommerce-tables.js": "/sql_schema_visualizer/static/js/ecommerce-tables.f5264437.chunk.js",
    "finance-tables.js": "/sql_schema_visualizer/static/js/finance-tables.eac6da84.chunk.js",
    "live-tables.js": "/sql_schema_visualizer/static/js/live-tables.5a699030.chunk.js",
    "movies-tables.js": "/sql_schema_visualizer/static/js/movies-tables.37f21107.chunk.js",
    "nba-tables.js": "/sql_schema_visualizer/static/js/nba-tables.7858f3c9.chunk.js",
    "the-bank-job-tables.js": "/sql_schema_visualizer/static/js/the-bank-job-tables.b72c42c8.chunk.js",
    "index.html": "/sql_schema_visualizer/index.html",
    "main.9f228f45.css.map": "/sql_schema_visualizer/static/css/main.9f228f45.css.map",
    "main.33dfc6b0.js.map": "/sql_schema_visualizer/static/js/main.33dfc6b0.js.map",
    "394.14a9b9da.chunk.js.map": "/sql_schema_visualizer/static/js/394.14a9b9da.chunk.js.map",
    "226.0d90ab44.chunk.js.map": "/sql_schema_visualizer/static/js/226.0d90ab44.chunk.js.map",
    "bindle-tables.0d2bfe46.chunk.js.map": "/sql_schema_visualizer/static/js/bindle-tables.0d2bfe46.chunk.js.map",
    "ecommerce-tables.f5264437.chunk.js.map": "/sql_schema_visualizer/static/js/ecommerce-tables.f5264437.chunk.js.map",
    "finance-tables.eac6da84.chunk.js.map": "/sql_schema_visualizer/static/js/finance-tables.eac6da84.chunk.js.map",
    "live-tables.5a699030.chunk.js.map": "/sql_schema_visualizer/static/js/live-tables.5a699030.chunk.js.map",
    "movies-tables.37f21107.chunk.js.map": "/sql_schema_visualizer/static/js/movies-tables.37f21107.chunk.js.map",
    "nba-tables.7858f3c9.chunk.js.map": "/sql_schema_visualizer/static/js/nba-tables.7858f3c9.chunk.js.map",
    "the-bank-job-tables.b72c42c8.chunk.js.map": "/sql_schema_visualizer/static/js/the-bank-job-tables.b72c42c8.chunk.js.map"
  },
  "entrypoints": [
    "static/css/main.9f228f45.css",
    "static/js/main.33dfc6b0.js"
  ]
}

================================================
FILE: build/databases/bindle.html
================================================
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/sql_schema_visualizer/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="description" content="Schema Visualizer"/><title>Schema Visualizer</title><script defer="defer" src="/sql_schema_visualizer/static/js/main.33dfc6b0.js"></script><link href="/sql_schema_visualizer/static/css/main.9f228f45.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><a href="https://github.com/sqlhabit/sql_schema_visualizer" target="_blank"><img decoding="async" loading="lazy" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_darkblue_121621.png?resize=149%2C149" style="position:fixed;top:0;right:0;z-index:99999" alt="Fork me on GitHub" data-recalc-dims="1"/></a><div id="root"></div></body></html>

================================================
FILE: build/databases/ecommerce.html
================================================
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/sql_schema_visualizer/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="description" content="Schema Visualizer"/><title>Schema Visualizer</title><script defer="defer" src="/sql_schema_visualizer/static/js/main.33dfc6b0.js"></script><link href="/sql_schema_visualizer/static/css/main.9f228f45.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><a href="https://github.com/sqlhabit/sql_schema_visualizer" target="_blank"><img decoding="async" loading="lazy" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_darkblue_121621.png?resize=149%2C149" style="position:fixed;top:0;right:0;z-index:99999" alt="Fork me on GitHub" data-recalc-dims="1"/></a><div id="root"></div></body></html>

================================================
FILE: build/databases/finance.html
================================================
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/sql_schema_visualizer/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="description" content="Schema Visualizer"/><title>Schema Visualizer</title><script defer="defer" src="/sql_schema_visualizer/static/js/main.33dfc6b0.js"></script><link href="/sql_schema_visualizer/static/css/main.9f228f45.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><a href="https://github.com/sqlhabit/sql_schema_visualizer" target="_blank"><img decoding="async" loading="lazy" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_darkblue_121621.png?resize=149%2C149" style="position:fixed;top:0;right:0;z-index:99999" alt="Fork me on GitHub" data-recalc-dims="1"/></a><div id="root"></div></body></html>

================================================
FILE: build/databases/live.html
================================================
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/sql_schema_visualizer/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="description" content="Schema Visualizer"/><title>Schema Visualizer</title><script defer="defer" src="/sql_schema_visualizer/static/js/main.33dfc6b0.js"></script><link href="/sql_schema_visualizer/static/css/main.9f228f45.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><a href="https://github.com/sqlhabit/sql_schema_visualizer" target="_blank"><img decoding="async" loading="lazy" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_darkblue_121621.png?resize=149%2C149" style="position:fixed;top:0;right:0;z-index:99999" alt="Fork me on GitHub" data-recalc-dims="1"/></a><div id="root"></div></body></html>

================================================
FILE: build/databases/movies.html
================================================
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/sql_schema_visualizer/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="description" content="Schema Visualizer"/><title>Schema Visualizer</title><script defer="defer" src="/sql_schema_visualizer/static/js/main.33dfc6b0.js"></script><link href="/sql_schema_visualizer/static/css/main.9f228f45.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><a href="https://github.com/sqlhabit/sql_schema_visualizer" target="_blank"><img decoding="async" loading="lazy" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_darkblue_121621.png?resize=149%2C149" style="position:fixed;top:0;right:0;z-index:99999" alt="Fork me on GitHub" data-recalc-dims="1"/></a><div id="root"></div></body></html>

================================================
FILE: build/databases/nba.html
================================================
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/sql_schema_visualizer/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="description" content="Schema Visualizer"/><title>Schema Visualizer</title><script defer="defer" src="/sql_schema_visualizer/static/js/main.33dfc6b0.js"></script><link href="/sql_schema_visualizer/static/css/main.9f228f45.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><a href="https://github.com/sqlhabit/sql_schema_visualizer" target="_blank"><img decoding="async" loading="lazy" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_darkblue_121621.png?resize=149%2C149" style="position:fixed;top:0;right:0;z-index:99999" alt="Fork me on GitHub" data-recalc-dims="1"/></a><div id="root"></div></body></html>

================================================
FILE: build/databases/the-bank-job.html
================================================
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/sql_schema_visualizer/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="description" content="Schema Visualizer"/><title>Schema Visualizer</title><script defer="defer" src="/sql_schema_visualizer/static/js/main.33dfc6b0.js"></script><link href="/sql_schema_visualizer/static/css/main.9f228f45.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><a href="https://github.com/sqlhabit/sql_schema_visualizer" target="_blank"><img decoding="async" loading="lazy" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_darkblue_121621.png?resize=149%2C149" style="position:fixed;top:0;right:0;z-index:99999" alt="Fork me on GitHub" data-recalc-dims="1"/></a><div id="root"></div></body></html>

================================================
FILE: build/index.html
================================================
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/sql_schema_visualizer/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="description" content="Schema Visualizer"/><title>Schema Visualizer</title><script defer="defer" src="/sql_schema_visualizer/static/js/main.33dfc6b0.js"></script><link href="/sql_schema_visualizer/static/css/main.9f228f45.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><a href="https://github.com/sqlhabit/sql_schema_visualizer" target="_blank"><img decoding="async" loading="lazy" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_darkblue_121621.png?resize=149%2C149" style="position:fixed;top:0;right:0;z-index:99999" alt="Fork me on GitHub" data-recalc-dims="1"/></a><div id="root"></div></body></html>

================================================
FILE: build/static/css/main.9f228f45.css
================================================
@import url(https://fonts.googleapis.com/css?family=Muli:400,400i,500,600,700,800&display=swap);.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.bottom,.react-flow__resize-control.top{cursor:ns-resize}.react-flow__resize-control.bottom.right,.react-flow__resize-control.top.left{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{background-color:#3367d9;border:1px solid #fff;border-radius:1px;height:4px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:4px}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.bottom.left,.react-flow__resize-control.handle.top.left{left:0}.react-flow__resize-control.handle.bottom.right,.react-flow__resize-control.handle.top.right{left:100%}.react-flow__resize-control.line{border:0 solid #3367d9}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{height:100%;top:0;-webkit-transform:translate(-50%);transform:translate(-50%);width:1px}.react-flow__resize-control.line.left{border-left-width:1px;left:0}.react-flow__resize-control.line.right{border-right-width:1px;left:100%}.react-flow__resize-control.line.bottom,.react-flow__resize-control.line.top{height:1px;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);width:100%}.react-flow__resize-control.line.top{border-top-width:1px;top:0}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__container{height:100%;left:0;position:absolute;top:0;width:100%}.react-flow__pane{cursor:grab;z-index:1}.react-flow__pane.selection{cursor:pointer}.react-flow__pane.dragging{cursor:grabbing}.react-flow__viewport{pointer-events:none;-webkit-transform-origin:0 0;transform-origin:0 0;z-index:2}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow .react-flow__edges{overflow:visible;pointer-events:none}.react-flow__connection-path,.react-flow__edge-path{stroke:#b1b1b7;stroke-width:1;fill:none}.react-flow__edge{cursor:pointer;pointer-events:visibleStroke}.react-flow__edge.animated path{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;-webkit-animation:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge:focus .react-flow__edge-path,.react-flow__edge:focus-visible .react-flow__edge-path{stroke:#555}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge-textbg{fill:#fff}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection.animated{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__connectionline{z-index:1001}.react-flow__nodes{pointer-events:none}.react-flow__node,.react-flow__nodes{-webkit-transform-origin:0 0;transform-origin:0 0}.react-flow__node{box-sizing:border-box;cursor:grab;pointer-events:all;position:absolute;-webkit-user-select:none;user-select:none}.react-flow__node.dragging{cursor:grabbing}.react-flow__nodesselection{pointer-events:none;-webkit-transform-origin:left top;transform-origin:left top;z-index:3}.react-flow__nodesselection-rect{cursor:grab;pointer-events:all;position:absolute}.react-flow__handle{background:#1a192b;border:1px solid #fff;border-radius:100%;height:6px;min-height:5px;min-width:5px;pointer-events:none;position:absolute;width:6px}.react-flow__handle.connectable{cursor:crosshair;pointer-events:all}.react-flow__handle-bottom{bottom:-4px;top:auto}.react-flow__handle-bottom,.react-flow__handle-top{left:50%;-webkit-transform:translate(-50%);transform:translate(-50%)}.react-flow__handle-top{top:-4px}.react-flow__handle-left{left:-4px}.react-flow__handle-left,.react-flow__handle-right{top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.react-flow__handle-right{right:-4px}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{margin:15px;position:absolute;z-index:5}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.react-flow__attribution{background:hsla(0,0%,100%,.5);font-size:10px;margin:0;padding:2px 3px}.react-flow__attribution a{color:#999;text-decoration:none}@-webkit-keyframes dashdraw{0%{stroke-dashoffset:10}}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{height:100%;pointer-events:none;position:absolute;width:100%}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-default,.react-flow__node-group,.react-flow__node-input,.react-flow__node-output{background-color:#fff;border:1px solid #1a192b;border-radius:3px;color:#222;font-size:12px;padding:10px;text-align:center;width:150px}.react-flow__node-default.selectable:hover,.react-flow__node-group.selectable:hover,.react-flow__node-input.selectable:hover,.react-flow__node-output.selectable:hover{box-shadow:0 1px 4px 1px rgba(0,0,0,.08)}.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible,.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible{box-shadow:0 0 0 .5px #1a192b}.react-flow__node-group{background-color:hsla(0,0%,94%,.25)}.react-flow__nodesselection-rect,.react-flow__selection{background:rgba(0,89,220,.08);border:1px dotted rgba(0,89,220,.8)}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls{box-shadow:0 0 2px 1px rgba(0,0,0,.08)}.react-flow__controls-button{align-items:center;background:#fefefe;border:none;border-bottom:1px solid #eee;box-sizing:initial;cursor:pointer;display:flex;height:16px;justify-content:center;padding:5px;-webkit-user-select:none;user-select:none;width:16px}.react-flow__controls-button:hover{background:#f4f4f4}.react-flow__controls-button svg{max-height:12px;max-width:12px;width:100%}.react-flow__minimap{background-color:#fff}.Flow{flex-grow:1;font-size:12px;height:100%;width:100%}:not(:root):-webkit-full-screen::backdrop{background-color:#fff}:not(:root):fullscreen::-webkit-backdrop{background-color:#fff}:not(:root):fullscreen::backdrop{background-color:#fff}.react-flow__node-custom{border:1px solid #555;border-radius:5px;padding:10px;width:300px}.react-flow__edge.selected .react-flow__edge-path{stroke:#2186eb!important}.react-flow__node{background-color:#f5f7fa;max-width:288px}.react-flow__attribution a{background:none}.react-flow__handle-left,.react-flow__handle-right{background:transparent!important;border:0!important}.table{background-color:#fff}.table__name{border:0;border-radius:4px 4px 0 0;font-weight:700;padding:8px;position:relative;text-align:center}.table__columns{border:1px solid #cbd2d9;border-radius:0 0 4px 4px;border-top:0}.table__description{background-color:#fff;border:1px solid #cbd2d9;border-radius:4px;display:none;font-weight:400;padding:8px;position:absolute;right:-6px;text-align:left;top:50%;-webkit-transform:translateX(100%) translateY(-50%);transform:translateX(100%) translateY(-50%);width:150px;z-index:1000}.table__description:after{border:3px solid transparent;border-right-color:#fff;content:"";position:absolute;right:100%;top:50%;-webkit-transform:translateX(0) translateY(-50%);transform:translateX(0) translateY(-50%)}.table__description:before{border:4px solid transparent;border-right-color:#cbd2d9;content:"";position:absolute;right:100%;top:50%;-webkit-transform:translateX(-.5px) translateY(-50%);transform:translateX(-.5px) translateY(-50%)}.table__description--active{display:block}.table--highlighted .table__name{background-color:#fadb5f}.table--highlighted .table__columns{border:2px dashed #fadb5f;border-top:0}.table:hover .table__name{opacity:1}.table--dimmed .table__name{opacity:.4}.column-name{border-bottom:0;cursor:pointer;font-size:12px;line-height:1;position:relative;z-index:50}.column-name__name{margin-right:16px}.column-name__type{color:#bbb}.column-name__description{background-color:#fff;border:1px solid #cbd2d9;border-radius:4px;display:none;line-height:1.2;padding:8px;position:absolute;right:-6px;top:50%;-webkit-transform:translateX(100%) translateY(-50%);transform:translateX(100%) translateY(-50%);width:150px;z-index:1000}.column-name__description:before{border:4px solid transparent;border-right-color:#cbd2d9;content:"";position:absolute;right:100%;top:50%;-webkit-transform:translateX(-.5px) translateY(-50%);transform:translateX(-.5px) translateY(-50%)}.column-name__description:after{border:3px solid transparent;border-right-color:#fff;content:"";position:absolute;right:100%;top:50%;-webkit-transform:translateX(0) translateY(-50%);transform:translateX(0) translateY(-50%)}.column-name__inner{display:flex;justify-content:space-between;padding:8px;position:relative}.column-name:last-child{border-bottom:0!important;border-radius:0 0 4px 4px}.column-name:hover{background-color:#efefef;opacity:1}.column-name--highlighted{background-color:#fff3c4;border-color:#fff3c4}.column-name--dimmed{opacity:.4}.column-name--selected .column-name__description{display:block;opacity:1}.info-popup{align-items:center;background-color:rgba(0,0,0,.7);display:flex;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:100000}.info-popup__inner{background-color:#fff;border-radius:8px;font-size:16px;left:50%;line-height:1.4;max-height:100%;overflow-y:auto;padding:16px 16px 8px;position:fixed;top:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);width:100%;z-index:200000}@media(min-width:512px){.info-popup__inner{max-width:576px}}.info-popup__headline{margin-top:0}.info-popup__database-name{margin-bottom:8px}.info-popup__database-name+p{margin-top:0}.info-popup__close-icon{cursor:pointer;position:absolute;right:12px;top:12px}.info-popup__close-icon:hover{opacity:.7}.has-one-edge.selected path.react-flow__edge-path{marker-end:url(#hasOneSelected);stroke-width:1.5px}.has-one-edge--highlighted path.react-flow__connection-path,.has-one-edge--highlighted path.react-flow__edge-interaction,.has-one-edge--highlighted path.react-flow__edge-path{stroke:#2186eb!important;stroke-width:1.5px}.has-one-edge-reversed.selected path.react-flow__edge-path{marker-end:url(#hasOneReversedSelected);stroke-width:1.5px}.has-one-edge-reversed--highlighted path.react-flow__connection-path,.has-one-edge-reversed--highlighted path.react-flow__edge-interaction,.has-one-edge-reversed--highlighted path.react-flow__edge-path{stroke:#2186eb!important;stroke-width:1.5px}.has-many-edge.selected path.react-flow__edge-path{marker-end:url(#hasManySelected);stroke-width:1.5}.has-many-edge--highlighted path.react-flow__connection-path,.has-many-edge--highlighted path.react-flow__edge-interaction,.has-many-edge--highlighted path.react-flow__edge-path{stroke:#2186eb!important;stroke-width:1.5px}.has-many-edge-reversed.selected path.react-flow__edge-path{marker-end:url(#hasManyReversedSelected);stroke-width:1.5}.has-many-edge-reversed--highlighted path.react-flow__connection-path,.has-many-edge-reversed--highlighted path.react-flow__edge-interaction,.has-many-edge-reversed--highlighted path.react-flow__edge-path{stroke:#2186eb!important;stroke-width:1.5px}.key-icon{height:12px;margin-right:4px;width:12px}.left-handle{left:0;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.left-handle,.right-handle{height:2px;min-width:2px;top:50%;width:2px}.right-handle{right:0;-webkit-transform:translateX(50%) translateY(-50%);transform:translateX(50%) translateY(-50%)}.App{display:flex;flex-direction:column;height:100%}.App-header{align-items:center;border-bottom:1px solid #eee;display:flex;height:40px;padding:0 1rem}.App__logo{background:none;cursor:pointer;left:16px;position:fixed;text-decoration:none;top:16px;z-index:50000}.layout{position:fixed}.layout,.layout__outlet{height:100%;width:100%}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}body{color:#1f2933;font-display:swap;font-family:Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}#root,body,html{height:100%}h1,h2,h3,h4{margin-bottom:0;margin-top:1em}a{background:linear-gradient(90deg,#1f2933,#1f2933),linear-gradient(90deg,red,#ff00b4,#2186eb);background-position:100% 100%,0 100%;background-repeat:no-repeat;background-size:100% 1px,0 1px;color:inherit;text-decoration:none;transition:background-size .4s}a:hover{background-size:0 1px,100% 1px}.emoji{height:1.1em;margin:0 .05em 0 .1em;vertical-align:-.1em;width:1.1em}.mb-32{margin-bottom:32px}
/*# sourceMappingURL=main.9f228f45.css.map*/

================================================
FILE: build/static/js/226.0d90ab44.chunk.js
================================================
/*! For license information please see 226.0d90ab44.chunk.js.LICENSE.txt */
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[226],{3226:function(d,u,f){f.r(u);var c=function(){var d={base:"https://twemoji.maxcdn.com/v/14.0.2/",ext:".png",size:"72x72",className:"emoji",convert:{fromCodePoint:function(d){var u="string"===typeof d?parseInt(d,16):d;if(u<65536)return t(u);return t(55296+((u-=65536)>>10),56320+(1023&u))},toCodePoint:g},onerror:function(){this.parentNode&&this.parentNode.replaceChild(r(this.alt,!1),this)},parse:function(u,f){f&&"function"!==typeof f||(f={callback:f});return("string"===typeof u?l:i)(u,{callback:f.callback||n,attributes:"function"===typeof f.attributes?f.attributes:h,base:"string"===typeof f.base?f.base:d.base,ext:f.ext||d.ext,size:f.folder||(c=f.size||d.size,"number"===typeof c?c+"x"+c:c),className:f.className||d.className,onerror:f.onerror||d.onerror});var c},replace:m,test:function(d){f.lastIndex=0;var u=f.test(d);return f.lastIndex=0,u}},u={"&":"&amp;","<":"&lt;",">":"&gt;","'":"&#39;",'"':"&quot;"},f=/(?:\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83e\udef1\ud83c\udffb\u200d\ud83e\udef2\ud83c[\udffc-\udfff]|\ud83e\udef1\ud83c\udffc\u200d\ud83e\udef2\ud83c[\udffb\udffd-\udfff]|\ud83e\udef1\ud83c\udffd\u200d\ud83e\udef2\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\udef1\ud83c\udffe\u200d\ud83e\udef2\ud83c[\udffb-\udffd\udfff]|\ud83e\udef1\ud83c\udfff\u200d\ud83e\udef2\ud83c[\udffb-\udffe]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d\udc8f\ud83c[\udffb-\udfff]|\ud83d\udc91\ud83c[\udffb-\udfff]|\ud83e\udd1d\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|\ud83e\udd1d)|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83d\ude36\u200d\ud83c\udf2b\ufe0f|\u2764\ufe0f\u200d\ud83d\udd25|\u2764\ufe0f\u200d\ud83e\ude79|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83d\ude2e\u200d\ud83d\udca8|\ud83d\ude35\u200d\ud83d\udcab|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[\xa9\xae\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd\udec3-\udec5\udef0-\udef6]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g,c=/\uFE0F/g,e=String.fromCharCode(8205),b=/[&<>'"]/g,a=/^(?:iframe|noframes|noscript|script|select|style|textarea)$/,t=String.fromCharCode;return d;function r(d,u){return document.createTextNode(u?d.replace(c,""):d)}function n(d,u){return"".concat(u.base,u.size,"/",d,u.ext)}function o(d,u){for(var f,c,e=d.childNodes,b=e.length;b--;)3===(c=(f=e[b]).nodeType)?u.push(f):1!==c||"ownerSVGElement"in f||a.test(f.nodeName.toLowerCase())||o(f,u);return u}function s(d){return g(d.indexOf(e)<0?d.replace(c,""):d)}function i(d,u){for(var c,e,b,a,t,n,i,l,p,h,m,g,x,C=o(d,[]),v=C.length;v--;){for(b=!1,a=document.createDocumentFragment(),n=(t=C[v]).nodeValue,l=0;i=f.exec(n);){if((p=i.index)!==l&&a.appendChild(r(n.slice(l,p),!0)),g=s(m=i[0]),l=p+m.length,x=u.callback(g,u),g&&x){for(e in(h=new Image).onerror=u.onerror,h.setAttribute("draggable","false"),c=u.attributes(m,g))c.hasOwnProperty(e)&&0!==e.indexOf("on")&&!h.hasAttribute(e)&&h.setAttribute(e,c[e]);h.className=u.className,h.alt=m,h.src=x,b=!0,a.appendChild(h)}h||a.appendChild(r(m,!1)),h=null}b&&(l<n.length&&a.appendChild(r(n.slice(l),!0)),t.parentNode.replaceChild(a,t))}return d}function l(d,u){return m(d,(function(d){var f,c,e=d,a=s(d),t=u.callback(a,u);if(a&&t){for(c in e="<img ".concat('class="',u.className,'" ','draggable="false" ','alt="',d,'"',' src="',t,'"'),f=u.attributes(d,a))f.hasOwnProperty(c)&&0!==c.indexOf("on")&&-1===e.indexOf(" "+c+"=")&&(e=e.concat(" ",c,'="',f[c].replace(b,p),'"'));e=e.concat("/>")}return e}))}function p(d){return u[d]}function h(){return null}function m(d,u){return String(d).replace(f,u)}function g(d,u){for(var f=[],c=0,e=0,b=0;b<d.length;)c=d.charCodeAt(b++),e?(f.push((65536+(e-55296<<10)+(c-56320)).toString(16)),e=0):55296<=c&&c<=56319?e=c:f.push(c.toString(16));return f.join(u||"-")}}();u.default=c}}]);
//# sourceMappingURL=226.0d90ab44.chunk.js.map

================================================
FILE: build/static/js/226.0d90ab44.chunk.js.LICENSE.txt
================================================
/*! Copyright Twitter Inc. and other contributors. Licensed under MIT */


================================================
FILE: build/static/js/394.14a9b9da.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[394],{1506:function(a,e,n){var o=n(2644),i=n(5020),_=n(6906);a.exports=function(a,e){var n=_(a.utils.assign({},{defs:{},shortcuts:{},enabled:[]},e||{}));a.renderer.rules.emoji=o,a.core.ruler.after("linkify","emoji",i(a,n.defs,n.shortcuts,n.scanRE,n.replaceRE))}},7394:function(a,e,n){var o=n(5297),i=n(9612),_=n(1506);a.exports=function(a,e){var n={defs:o,shortcuts:i,enabled:[]},r=a.utils.assign({},n,e||{});_(a,r)}},9612:function(a){a.exports={angry:[">:(",">:-("],blush:[':")',':-")'],broken_heart:["</3","<\\3"],confused:[":/",":-/"],cry:[":'(",":'-(",":,(",":,-("],frowning:[":(",":-("],heart:["<3"],imp:["]:(","]:-("],innocent:["o:)","O:)","o:-)","O:-)","0:)","0:-)"],joy:[":')",":'-)",":,)",":,-)",":'D",":'-D",":,D",":,-D"],kissing:[":*",":-*"],laughing:["x-)","X-)"],neutral_face:[":|",":-|"],open_mouth:[":o",":-o",":O",":-O"],rage:[":@",":-@"],smile:[":D",":-D"],smiley:[":)",":-)"],smiling_imp:["]:)","]:-)"],sob:[":,'(",":,'-(",";(",";-("],stuck_out_tongue:[":P",":-P"],sunglasses:["8-)","B-)"],sweat:[",:(",",:-("],sweat_smile:[",:)",",:-)"],unamused:[":s",":-S",":z",":-Z",":$",":-$"],wink:[";)",";-)"]}},6906:function(a){a.exports=function(a){var e,n=a.defs;a.enabled.length&&(n=Object.keys(n).reduce((function(e,o){return a.enabled.indexOf(o)>=0&&(e[o]=n[o]),e}),{})),e=Object.keys(a.shortcuts).reduce((function(e,o){return n[o]?Array.isArray(a.shortcuts[o])?(a.shortcuts[o].forEach((function(a){e[a]=o})),e):(e[a.shortcuts[o]]=o,e):e}),{});var o,i=Object.keys(n);o=0===i.length?"^$":i.map((function(a){return":"+a+":"})).concat(Object.keys(e)).sort().reverse().map((function(a){return a.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")})).join("|");var _=RegExp(o),r=RegExp(o,"g");return{defs:n,shortcuts:e,scanRE:_,replaceRE:r}}},2644:function(a){a.exports=function(a,e){return a[e].content}},5020:function(a){a.exports=function(a,e,n,o,i){var _=a.utils.arrayReplaceAt,r=a.utils.lib.ucmicro,t=new RegExp([r.Z.source,r.P.source,r.Cc.source].join("|"));function s(a,o,_){var r,s=0,l=[];return a.replace(i,(function(o,i,c){var m;if(n.hasOwnProperty(o)){if(m=n[o],i>0&&!t.test(c[i-1]))return;if(i+o.length<c.length&&!t.test(c[i+o.length]))return}else m=o.slice(1,-1);i>s&&((r=new _("text","",0)).content=a.slice(s,i),l.push(r)),(r=new _("emoji","",0)).markup=m,r.content=e[m],l.push(r),s=i+o.length})),s<a.length&&((r=new _("text","",0)).content=a.slice(s),l.push(r)),l}return function(a){var e,n,i,r,t,l=a.tokens,c=0;for(n=0,i=l.length;n<i;n++)if("inline"===l[n].type)for(e=(r=l[n].children).length-1;e>=0;e--)"link_open"!==(t=r[e]).type&&"link_close"!==t.type||"auto"===t.info&&(c-=t.nesting),"text"===t.type&&0===c&&o.test(t.content)&&(l[n].children=r=_(r,e,s(t.content,t.level,a.Token)))}}},5297:function(a){a.exports=JSON.parse('{"100":"\ud83d\udcaf","1234":"\ud83d\udd22","grinning":"\ud83d\ude00","smiley":"\ud83d\ude03","smile":"\ud83d\ude04","grin":"\ud83d\ude01","laughing":"\ud83d\ude06","satisfied":"\ud83d\ude06","sweat_smile":"\ud83d\ude05","rofl":"\ud83e\udd23","joy":"\ud83d\ude02","slightly_smiling_face":"\ud83d\ude42","upside_down_face":"\ud83d\ude43","wink":"\ud83d\ude09","blush":"\ud83d\ude0a","innocent":"\ud83d\ude07","smiling_face_with_three_hearts":"\ud83e\udd70","heart_eyes":"\ud83d\ude0d","star_struck":"\ud83e\udd29","kissing_heart":"\ud83d\ude18","kissing":"\ud83d\ude17","relaxed":"\u263a\ufe0f","kissing_closed_eyes":"\ud83d\ude1a","kissing_smiling_eyes":"\ud83d\ude19","smiling_face_with_tear":"\ud83e\udd72","yum":"\ud83d\ude0b","stuck_out_tongue":"\ud83d\ude1b","stuck_out_tongue_winking_eye":"\ud83d\ude1c","zany_face":"\ud83e\udd2a","stuck_out_tongue_closed_eyes":"\ud83d\ude1d","money_mouth_face":"\ud83e\udd11","hugs":"\ud83e\udd17","hand_over_mouth":"\ud83e\udd2d","shushing_face":"\ud83e\udd2b","thinking":"\ud83e\udd14","zipper_mouth_face":"\ud83e\udd10","raised_eyebrow":"\ud83e\udd28","neutral_face":"\ud83d\ude10","expressionless":"\ud83d\ude11","no_mouth":"\ud83d\ude36","smirk":"\ud83d\ude0f","unamused":"\ud83d\ude12","roll_eyes":"\ud83d\ude44","grimacing":"\ud83d\ude2c","lying_face":"\ud83e\udd25","relieved":"\ud83d\ude0c","pensive":"\ud83d\ude14","sleepy":"\ud83d\ude2a","drooling_face":"\ud83e\udd24","sleeping":"\ud83d\ude34","mask":"\ud83d\ude37","face_with_thermometer":"\ud83e\udd12","face_with_head_bandage":"\ud83e\udd15","nauseated_face":"\ud83e\udd22","vomiting_face":"\ud83e\udd2e","sneezing_face":"\ud83e\udd27","hot_face":"\ud83e\udd75","cold_face":"\ud83e\udd76","woozy_face":"\ud83e\udd74","dizzy_face":"\ud83d\ude35","exploding_head":"\ud83e\udd2f","cowboy_hat_face":"\ud83e\udd20","partying_face":"\ud83e\udd73","disguised_face":"\ud83e\udd78","sunglasses":"\ud83d\ude0e","nerd_face":"\ud83e\udd13","monocle_face":"\ud83e\uddd0","confused":"\ud83d\ude15","worried":"\ud83d\ude1f","slightly_frowning_face":"\ud83d\ude41","frowning_face":"\u2639\ufe0f","open_mouth":"\ud83d\ude2e","hushed":"\ud83d\ude2f","astonished":"\ud83d\ude32","flushed":"\ud83d\ude33","pleading_face":"\ud83e\udd7a","frowning":"\ud83d\ude26","anguished":"\ud83d\ude27","fearful":"\ud83d\ude28","cold_sweat":"\ud83d\ude30","disappointed_relieved":"\ud83d\ude25","cry":"\ud83d\ude22","sob":"\ud83d\ude2d","scream":"\ud83d\ude31","confounded":"\ud83d\ude16","persevere":"\ud83d\ude23","disappointed":"\ud83d\ude1e","sweat":"\ud83d\ude13","weary":"\ud83d\ude29","tired_face":"\ud83d\ude2b","yawning_face":"\ud83e\udd71","triumph":"\ud83d\ude24","rage":"\ud83d\ude21","pout":"\ud83d\ude21","angry":"\ud83d\ude20","cursing_face":"\ud83e\udd2c","smiling_imp":"\ud83d\ude08","imp":"\ud83d\udc7f","skull":"\ud83d\udc80","skull_and_crossbones":"\u2620\ufe0f","hankey":"\ud83d\udca9","poop":"\ud83d\udca9","shit":"\ud83d\udca9","clown_face":"\ud83e\udd21","japanese_ogre":"\ud83d\udc79","japanese_goblin":"\ud83d\udc7a","ghost":"\ud83d\udc7b","alien":"\ud83d\udc7d","space_invader":"\ud83d\udc7e","robot":"\ud83e\udd16","smiley_cat":"\ud83d\ude3a","smile_cat":"\ud83d\ude38","joy_cat":"\ud83d\ude39","heart_eyes_cat":"\ud83d\ude3b","smirk_cat":"\ud83d\ude3c","kissing_cat":"\ud83d\ude3d","scream_cat":"\ud83d\ude40","crying_cat_face":"\ud83d\ude3f","pouting_cat":"\ud83d\ude3e","see_no_evil":"\ud83d\ude48","hear_no_evil":"\ud83d\ude49","speak_no_evil":"\ud83d\ude4a","kiss":"\ud83d\udc8b","love_letter":"\ud83d\udc8c","cupid":"\ud83d\udc98","gift_heart":"\ud83d\udc9d","sparkling_heart":"\ud83d\udc96","heartpulse":"\ud83d\udc97","heartbeat":"\ud83d\udc93","revolving_hearts":"\ud83d\udc9e","two_hearts":"\ud83d\udc95","heart_decoration":"\ud83d\udc9f","heavy_heart_exclamation":"\u2763\ufe0f","broken_heart":"\ud83d\udc94","heart":"\u2764\ufe0f","orange_heart":"\ud83e\udde1","yellow_heart":"\ud83d\udc9b","green_heart":"\ud83d\udc9a","blue_heart":"\ud83d\udc99","purple_heart":"\ud83d\udc9c","brown_heart":"\ud83e\udd0e","black_heart":"\ud83d\udda4","white_heart":"\ud83e\udd0d","anger":"\ud83d\udca2","boom":"\ud83d\udca5","collision":"\ud83d\udca5","dizzy":"\ud83d\udcab","sweat_drops":"\ud83d\udca6","dash":"\ud83d\udca8","hole":"\ud83d\udd73\ufe0f","bomb":"\ud83d\udca3","speech_balloon":"\ud83d\udcac","eye_speech_bubble":"\ud83d\udc41\ufe0f\u200d\ud83d\udde8\ufe0f","left_speech_bubble":"\ud83d\udde8\ufe0f","right_anger_bubble":"\ud83d\uddef\ufe0f","thought_balloon":"\ud83d\udcad","zzz":"\ud83d\udca4","wave":"\ud83d\udc4b","raised_back_of_hand":"\ud83e\udd1a","raised_hand_with_fingers_splayed":"\ud83d\udd90\ufe0f","hand":"\u270b","raised_hand":"\u270b","vulcan_salute":"\ud83d\udd96","ok_hand":"\ud83d\udc4c","pinched_fingers":"\ud83e\udd0c","pinching_hand":"\ud83e\udd0f","v":"\u270c\ufe0f","crossed_fingers":"\ud83e\udd1e","love_you_gesture":"\ud83e\udd1f","metal":"\ud83e\udd18","call_me_hand":"\ud83e\udd19","point_left":"\ud83d\udc48","point_right":"\ud83d\udc49","point_up_2":"\ud83d\udc46","middle_finger":"\ud83d\udd95","fu":"\ud83d\udd95","point_down":"\ud83d\udc47","point_up":"\u261d\ufe0f","+1":"\ud83d\udc4d","thumbsup":"\ud83d\udc4d","-1":"\ud83d\udc4e","thumbsdown":"\ud83d\udc4e","fist_raised":"\u270a","fist":"\u270a","fist_oncoming":"\ud83d\udc4a","facepunch":"\ud83d\udc4a","punch":"\ud83d\udc4a","fist_left":"\ud83e\udd1b","fist_right":"\ud83e\udd1c","clap":"\ud83d\udc4f","raised_hands":"\ud83d\ude4c","open_hands":"\ud83d\udc50","palms_up_together":"\ud83e\udd32","handshake":"\ud83e\udd1d","pray":"\ud83d\ude4f","writing_hand":"\u270d\ufe0f","nail_care":"\ud83d\udc85","selfie":"\ud83e\udd33","muscle":"\ud83d\udcaa","mechanical_arm":"\ud83e\uddbe","mechanical_leg":"\ud83e\uddbf","leg":"\ud83e\uddb5","foot":"\ud83e\uddb6","ear":"\ud83d\udc42","ear_with_hearing_aid":"\ud83e\uddbb","nose":"\ud83d\udc43","brain":"\ud83e\udde0","anatomical_heart":"\ud83e\udec0","lungs":"\ud83e\udec1","tooth":"\ud83e\uddb7","bone":"\ud83e\uddb4","eyes":"\ud83d\udc40","eye":"\ud83d\udc41\ufe0f","tongue":"\ud83d\udc45","lips":"\ud83d\udc44","baby":"\ud83d\udc76","child":"\ud83e\uddd2","boy":"\ud83d\udc66","girl":"\ud83d\udc67","adult":"\ud83e\uddd1","blond_haired_person":"\ud83d\udc71","man":"\ud83d\udc68","bearded_person":"\ud83e\uddd4","red_haired_man":"\ud83d\udc68\u200d\ud83e\uddb0","curly_haired_man":"\ud83d\udc68\u200d\ud83e\uddb1","white_haired_man":"\ud83d\udc68\u200d\ud83e\uddb3","bald_man":"\ud83d\udc68\u200d\ud83e\uddb2","woman":"\ud83d\udc69","red_haired_woman":"\ud83d\udc69\u200d\ud83e\uddb0","person_red_hair":"\ud83e\uddd1\u200d\ud83e\uddb0","curly_haired_woman":"\ud83d\udc69\u200d\ud83e\uddb1","person_curly_hair":"\ud83e\uddd1\u200d\ud83e\uddb1","white_haired_woman":"\ud83d\udc69\u200d\ud83e\uddb3","person_white_hair":"\ud83e\uddd1\u200d\ud83e\uddb3","bald_woman":"\ud83d\udc69\u200d\ud83e\uddb2","person_bald":"\ud83e\uddd1\u200d\ud83e\uddb2","blond_haired_woman":"\ud83d\udc71\u200d\u2640\ufe0f","blonde_woman":"\ud83d\udc71\u200d\u2640\ufe0f","blond_haired_man":"\ud83d\udc71\u200d\u2642\ufe0f","older_adult":"\ud83e\uddd3","older_man":"\ud83d\udc74","older_woman":"\ud83d\udc75","frowning_person":"\ud83d\ude4d","frowning_man":"\ud83d\ude4d\u200d\u2642\ufe0f","frowning_woman":"\ud83d\ude4d\u200d\u2640\ufe0f","pouting_face":"\ud83d\ude4e","pouting_man":"\ud83d\ude4e\u200d\u2642\ufe0f","pouting_woman":"\ud83d\ude4e\u200d\u2640\ufe0f","no_good":"\ud83d\ude45","no_good_man":"\ud83d\ude45\u200d\u2642\ufe0f","ng_man":"\ud83d\ude45\u200d\u2642\ufe0f","no_good_woman":"\ud83d\ude45\u200d\u2640\ufe0f","ng_woman":"\ud83d\ude45\u200d\u2640\ufe0f","ok_person":"\ud83d\ude46","ok_man":"\ud83d\ude46\u200d\u2642\ufe0f","ok_woman":"\ud83d\ude46\u200d\u2640\ufe0f","tipping_hand_person":"\ud83d\udc81","information_desk_person":"\ud83d\udc81","tipping_hand_man":"\ud83d\udc81\u200d\u2642\ufe0f","sassy_man":"\ud83d\udc81\u200d\u2642\ufe0f","tipping_hand_woman":"\ud83d\udc81\u200d\u2640\ufe0f","sassy_woman":"\ud83d\udc81\u200d\u2640\ufe0f","raising_hand":"\ud83d\ude4b","raising_hand_man":"\ud83d\ude4b\u200d\u2642\ufe0f","raising_hand_woman":"\ud83d\ude4b\u200d\u2640\ufe0f","deaf_person":"\ud83e\uddcf","deaf_man":"\ud83e\uddcf\u200d\u2642\ufe0f","deaf_woman":"\ud83e\uddcf\u200d\u2640\ufe0f","bow":"\ud83d\ude47","bowing_man":"\ud83d\ude47\u200d\u2642\ufe0f","bowing_woman":"\ud83d\ude47\u200d\u2640\ufe0f","facepalm":"\ud83e\udd26","man_facepalming":"\ud83e\udd26\u200d\u2642\ufe0f","woman_facepalming":"\ud83e\udd26\u200d\u2640\ufe0f","shrug":"\ud83e\udd37","man_shrugging":"\ud83e\udd37\u200d\u2642\ufe0f","woman_shrugging":"\ud83e\udd37\u200d\u2640\ufe0f","health_worker":"\ud83e\uddd1\u200d\u2695\ufe0f","man_health_worker":"\ud83d\udc68\u200d\u2695\ufe0f","woman_health_worker":"\ud83d\udc69\u200d\u2695\ufe0f","student":"\ud83e\uddd1\u200d\ud83c\udf93","man_student":"\ud83d\udc68\u200d\ud83c\udf93","woman_student":"\ud83d\udc69\u200d\ud83c\udf93","teacher":"\ud83e\uddd1\u200d\ud83c\udfeb","man_teacher":"\ud83d\udc68\u200d\ud83c\udfeb","woman_teacher":"\ud83d\udc69\u200d\ud83c\udfeb","judge":"\ud83e\uddd1\u200d\u2696\ufe0f","man_judge":"\ud83d\udc68\u200d\u2696\ufe0f","woman_judge":"\ud83d\udc69\u200d\u2696\ufe0f","farmer":"\ud83e\uddd1\u200d\ud83c\udf3e","man_farmer":"\ud83d\udc68\u200d\ud83c\udf3e","woman_farmer":"\ud83d\udc69\u200d\ud83c\udf3e","cook":"\ud83e\uddd1\u200d\ud83c\udf73","man_cook":"\ud83d\udc68\u200d\ud83c\udf73","woman_cook":"\ud83d\udc69\u200d\ud83c\udf73","mechanic":"\ud83e\uddd1\u200d\ud83d\udd27","man_mechanic":"\ud83d\udc68\u200d\ud83d\udd27","woman_mechanic":"\ud83d\udc69\u200d\ud83d\udd27","factory_worker":"\ud83e\uddd1\u200d\ud83c\udfed","man_factory_worker":"\ud83d\udc68\u200d\ud83c\udfed","woman_factory_worker":"\ud83d\udc69\u200d\ud83c\udfed","office_worker":"\ud83e\uddd1\u200d\ud83d\udcbc","man_office_worker":"\ud83d\udc68\u200d\ud83d\udcbc","woman_office_worker":"\ud83d\udc69\u200d\ud83d\udcbc","scientist":"\ud83e\uddd1\u200d\ud83d\udd2c","man_scientist":"\ud83d\udc68\u200d\ud83d\udd2c","woman_scientist":"\ud83d\udc69\u200d\ud83d\udd2c","technologist":"\ud83e\uddd1\u200d\ud83d\udcbb","man_technologist":"\ud83d\udc68\u200d\ud83d\udcbb","woman_technologist":"\ud83d\udc69\u200d\ud83d\udcbb","singer":"\ud83e\uddd1\u200d\ud83c\udfa4","man_singer":"\ud83d\udc68\u200d\ud83c\udfa4","woman_singer":"\ud83d\udc69\u200d\ud83c\udfa4","artist":"\ud83e\uddd1\u200d\ud83c\udfa8","man_artist":"\ud83d\udc68\u200d\ud83c\udfa8","woman_artist":"\ud83d\udc69\u200d\ud83c\udfa8","pilot":"\ud83e\uddd1\u200d\u2708\ufe0f","man_pilot":"\ud83d\udc68\u200d\u2708\ufe0f","woman_pilot":"\ud83d\udc69\u200d\u2708\ufe0f","astronaut":"\ud83e\uddd1\u200d\ud83d\ude80","man_astronaut":"\ud83d\udc68\u200d\ud83d\ude80","woman_astronaut":"\ud83d\udc69\u200d\ud83d\ude80","firefighter":"\ud83e\uddd1\u200d\ud83d\ude92","man_firefighter":"\ud83d\udc68\u200d\ud83d\ude92","woman_firefighter":"\ud83d\udc69\u200d\ud83d\ude92","police_officer":"\ud83d\udc6e","cop":"\ud83d\udc6e","policeman":"\ud83d\udc6e\u200d\u2642\ufe0f","policewoman":"\ud83d\udc6e\u200d\u2640\ufe0f","detective":"\ud83d\udd75\ufe0f","male_detective":"\ud83d\udd75\ufe0f\u200d\u2642\ufe0f","female_detective":"\ud83d\udd75\ufe0f\u200d\u2640\ufe0f","guard":"\ud83d\udc82","guardsman":"\ud83d\udc82\u200d\u2642\ufe0f","guardswoman":"\ud83d\udc82\u200d\u2640\ufe0f","ninja":"\ud83e\udd77","construction_worker":"\ud83d\udc77","construction_worker_man":"\ud83d\udc77\u200d\u2642\ufe0f","construction_worker_woman":"\ud83d\udc77\u200d\u2640\ufe0f","prince":"\ud83e\udd34","princess":"\ud83d\udc78","person_with_turban":"\ud83d\udc73","man_with_turban":"\ud83d\udc73\u200d\u2642\ufe0f","woman_with_turban":"\ud83d\udc73\u200d\u2640\ufe0f","man_with_gua_pi_mao":"\ud83d\udc72","woman_with_headscarf":"\ud83e\uddd5","person_in_tuxedo":"\ud83e\udd35","man_in_tuxedo":"\ud83e\udd35\u200d\u2642\ufe0f","woman_in_tuxedo":"\ud83e\udd35\u200d\u2640\ufe0f","person_with_veil":"\ud83d\udc70","man_with_veil":"\ud83d\udc70\u200d\u2642\ufe0f","woman_with_veil":"\ud83d\udc70\u200d\u2640\ufe0f","bride_with_veil":"\ud83d\udc70\u200d\u2640\ufe0f","pregnant_woman":"\ud83e\udd30","breast_feeding":"\ud83e\udd31","woman_feeding_baby":"\ud83d\udc69\u200d\ud83c\udf7c","man_feeding_baby":"\ud83d\udc68\u200d\ud83c\udf7c","person_feeding_baby":"\ud83e\uddd1\u200d\ud83c\udf7c","angel":"\ud83d\udc7c","santa":"\ud83c\udf85","mrs_claus":"\ud83e\udd36","mx_claus":"\ud83e\uddd1\u200d\ud83c\udf84","superhero":"\ud83e\uddb8","superhero_man":"\ud83e\uddb8\u200d\u2642\ufe0f","superhero_woman":"\ud83e\uddb8\u200d\u2640\ufe0f","supervillain":"\ud83e\uddb9","supervillain_man":"\ud83e\uddb9\u200d\u2642\ufe0f","supervillain_woman":"\ud83e\uddb9\u200d\u2640\ufe0f","mage":"\ud83e\uddd9","mage_man":"\ud83e\uddd9\u200d\u2642\ufe0f","mage_woman":"\ud83e\uddd9\u200d\u2640\ufe0f","fairy":"\ud83e\uddda","fairy_man":"\ud83e\uddda\u200d\u2642\ufe0f","fairy_woman":"\ud83e\uddda\u200d\u2640\ufe0f","vampire":"\ud83e\udddb","vampire_man":"\ud83e\udddb\u200d\u2642\ufe0f","vampire_woman":"\ud83e\udddb\u200d\u2640\ufe0f","merperson":"\ud83e\udddc","merman":"\ud83e\udddc\u200d\u2642\ufe0f","mermaid":"\ud83e\udddc\u200d\u2640\ufe0f","elf":"\ud83e\udddd","elf_man":"\ud83e\udddd\u200d\u2642\ufe0f","elf_woman":"\ud83e\udddd\u200d\u2640\ufe0f","genie":"\ud83e\uddde","genie_man":"\ud83e\uddde\u200d\u2642\ufe0f","genie_woman":"\ud83e\uddde\u200d\u2640\ufe0f","zombie":"\ud83e\udddf","zombie_man":"\ud83e\udddf\u200d\u2642\ufe0f","zombie_woman":"\ud83e\udddf\u200d\u2640\ufe0f","massage":"\ud83d\udc86","massage_man":"\ud83d\udc86\u200d\u2642\ufe0f","massage_woman":"\ud83d\udc86\u200d\u2640\ufe0f","haircut":"\ud83d\udc87","haircut_man":"\ud83d\udc87\u200d\u2642\ufe0f","haircut_woman":"\ud83d\udc87\u200d\u2640\ufe0f","walking":"\ud83d\udeb6","walking_man":"\ud83d\udeb6\u200d\u2642\ufe0f","walking_woman":"\ud83d\udeb6\u200d\u2640\ufe0f","standing_person":"\ud83e\uddcd","standing_man":"\ud83e\uddcd\u200d\u2642\ufe0f","standing_woman":"\ud83e\uddcd\u200d\u2640\ufe0f","kneeling_person":"\ud83e\uddce","kneeling_man":"\ud83e\uddce\u200d\u2642\ufe0f","kneeling_woman":"\ud83e\uddce\u200d\u2640\ufe0f","person_with_probing_cane":"\ud83e\uddd1\u200d\ud83e\uddaf","man_with_probing_cane":"\ud83d\udc68\u200d\ud83e\uddaf","woman_with_probing_cane":"\ud83d\udc69\u200d\ud83e\uddaf","person_in_motorized_wheelchair":"\ud83e\uddd1\u200d\ud83e\uddbc","man_in_motorized_wheelchair":"\ud83d\udc68\u200d\ud83e\uddbc","woman_in_motorized_wheelchair":"\ud83d\udc69\u200d\ud83e\uddbc","person_in_manual_wheelchair":"\ud83e\uddd1\u200d\ud83e\uddbd","man_in_manual_wheelchair":"\ud83d\udc68\u200d\ud83e\uddbd","woman_in_manual_wheelchair":"\ud83d\udc69\u200d\ud83e\uddbd","runner":"\ud83c\udfc3","running":"\ud83c\udfc3","running_man":"\ud83c\udfc3\u200d\u2642\ufe0f","running_woman":"\ud83c\udfc3\u200d\u2640\ufe0f","woman_dancing":"\ud83d\udc83","dancer":"\ud83d\udc83","man_dancing":"\ud83d\udd7a","business_suit_levitating":"\ud83d\udd74\ufe0f","dancers":"\ud83d\udc6f","dancing_men":"\ud83d\udc6f\u200d\u2642\ufe0f","dancing_women":"\ud83d\udc6f\u200d\u2640\ufe0f","sauna_person":"\ud83e\uddd6","sauna_man":"\ud83e\uddd6\u200d\u2642\ufe0f","sauna_woman":"\ud83e\uddd6\u200d\u2640\ufe0f","climbing":"\ud83e\uddd7","climbing_man":"\ud83e\uddd7\u200d\u2642\ufe0f","climbing_woman":"\ud83e\uddd7\u200d\u2640\ufe0f","person_fencing":"\ud83e\udd3a","horse_racing":"\ud83c\udfc7","skier":"\u26f7\ufe0f","snowboarder":"\ud83c\udfc2","golfing":"\ud83c\udfcc\ufe0f","golfing_man":"\ud83c\udfcc\ufe0f\u200d\u2642\ufe0f","golfing_woman":"\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f","surfer":"\ud83c\udfc4","surfing_man":"\ud83c\udfc4\u200d\u2642\ufe0f","surfing_woman":"\ud83c\udfc4\u200d\u2640\ufe0f","rowboat":"\ud83d\udea3","rowing_man":"\ud83d\udea3\u200d\u2642\ufe0f","rowing_woman":"\ud83d\udea3\u200d\u2640\ufe0f","swimmer":"\ud83c\udfca","swimming_man":"\ud83c\udfca\u200d\u2642\ufe0f","swimming_woman":"\ud83c\udfca\u200d\u2640\ufe0f","bouncing_ball_person":"\u26f9\ufe0f","bouncing_ball_man":"\u26f9\ufe0f\u200d\u2642\ufe0f","basketball_man":"\u26f9\ufe0f\u200d\u2642\ufe0f","bouncing_ball_woman":"\u26f9\ufe0f\u200d\u2640\ufe0f","basketball_woman":"\u26f9\ufe0f\u200d\u2640\ufe0f","weight_lifting":"\ud83c\udfcb\ufe0f","weight_lifting_man":"\ud83c\udfcb\ufe0f\u200d\u2642\ufe0f","weight_lifting_woman":"\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f","bicyclist":"\ud83d\udeb4","biking_man":"\ud83d\udeb4\u200d\u2642\ufe0f","biking_woman":"\ud83d\udeb4\u200d\u2640\ufe0f","mountain_bicyclist":"\ud83d\udeb5","mountain_biking_man":"\ud83d\udeb5\u200d\u2642\ufe0f","mountain_biking_woman":"\ud83d\udeb5\u200d\u2640\ufe0f","cartwheeling":"\ud83e\udd38","man_cartwheeling":"\ud83e\udd38\u200d\u2642\ufe0f","woman_cartwheeling":"\ud83e\udd38\u200d\u2640\ufe0f","wrestling":"\ud83e\udd3c","men_wrestling":"\ud83e\udd3c\u200d\u2642\ufe0f","women_wrestling":"\ud83e\udd3c\u200d\u2640\ufe0f","water_polo":"\ud83e\udd3d","man_playing_water_polo":"\ud83e\udd3d\u200d\u2642\ufe0f","woman_playing_water_polo":"\ud83e\udd3d\u200d\u2640\ufe0f","handball_person":"\ud83e\udd3e","man_playing_handball":"\ud83e\udd3e\u200d\u2642\ufe0f","woman_playing_handball":"\ud83e\udd3e\u200d\u2640\ufe0f","juggling_person":"\ud83e\udd39","man_juggling":"\ud83e\udd39\u200d\u2642\ufe0f","woman_juggling":"\ud83e\udd39\u200d\u2640\ufe0f","lotus_position":"\ud83e\uddd8","lotus_position_man":"\ud83e\uddd8\u200d\u2642\ufe0f","lotus_position_woman":"\ud83e\uddd8\u200d\u2640\ufe0f","bath":"\ud83d\udec0","sleeping_bed":"\ud83d\udecc","people_holding_hands":"\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1","two_women_holding_hands":"\ud83d\udc6d","couple":"\ud83d\udc6b","two_men_holding_hands":"\ud83d\udc6c","couplekiss":"\ud83d\udc8f","couplekiss_man_woman":"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68","couplekiss_man_man":"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68","couplekiss_woman_woman":"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69","couple_with_heart":"\ud83d\udc91","couple_with_heart_woman_man":"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc68","couple_with_heart_man_man":"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68","couple_with_heart_woman_woman":"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69","family":"\ud83d\udc6a","family_man_woman_boy":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66","family_man_woman_girl":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67","family_man_woman_girl_boy":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66","family_man_woman_boy_boy":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66","family_man_woman_girl_girl":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67","family_man_man_boy":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66","family_man_man_girl":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67","family_man_man_girl_boy":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66","family_man_man_boy_boy":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66","family_man_man_girl_girl":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67","family_woman_woman_boy":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66","family_woman_woman_girl":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67","family_woman_woman_girl_boy":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66","family_woman_woman_boy_boy":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66","family_woman_woman_girl_girl":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67","family_man_boy":"\ud83d\udc68\u200d\ud83d\udc66","family_man_boy_boy":"\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66","family_man_girl":"\ud83d\udc68\u200d\ud83d\udc67","family_man_girl_boy":"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66","family_man_girl_girl":"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67","family_woman_boy":"\ud83d\udc69\u200d\ud83d\udc66","family_woman_boy_boy":"\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66","family_woman_girl":"\ud83d\udc69\u200d\ud83d\udc67","family_woman_girl_boy":"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66","family_woman_girl_girl":"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67","speaking_head":"\ud83d\udde3\ufe0f","bust_in_silhouette":"\ud83d\udc64","busts_in_silhouette":"\ud83d\udc65","people_hugging":"\ud83e\udec2","footprints":"\ud83d\udc63","monkey_face":"\ud83d\udc35","monkey":"\ud83d\udc12","gorilla":"\ud83e\udd8d","orangutan":"\ud83e\udda7","dog":"\ud83d\udc36","dog2":"\ud83d\udc15","guide_dog":"\ud83e\uddae","service_dog":"\ud83d\udc15\u200d\ud83e\uddba","poodle":"\ud83d\udc29","wolf":"\ud83d\udc3a","fox_face":"\ud83e\udd8a","raccoon":"\ud83e\udd9d","cat":"\ud83d\udc31","cat2":"\ud83d\udc08","black_cat":"\ud83d\udc08\u200d\u2b1b","lion":"\ud83e\udd81","tiger":"\ud83d\udc2f","tiger2":"\ud83d\udc05","leopard":"\ud83d\udc06","horse":"\ud83d\udc34","racehorse":"\ud83d\udc0e","unicorn":"\ud83e\udd84","zebra":"\ud83e\udd93","deer":"\ud83e\udd8c","bison":"\ud83e\uddac","cow":"\ud83d\udc2e","ox":"\ud83d\udc02","water_buffalo":"\ud83d\udc03","cow2":"\ud83d\udc04","pig":"\ud83d\udc37","pig2":"\ud83d\udc16","boar":"\ud83d\udc17","pig_nose":"\ud83d\udc3d","ram":"\ud83d\udc0f","sheep":"\ud83d\udc11","goat":"\ud83d\udc10","dromedary_camel":"\ud83d\udc2a","camel":"\ud83d\udc2b","llama":"\ud83e\udd99","giraffe":"\ud83e\udd92","elephant":"\ud83d\udc18","mammoth":"\ud83e\udda3","rhinoceros":"\ud83e\udd8f","hippopotamus":"\ud83e\udd9b","mouse":"\ud83d\udc2d","mouse2":"\ud83d\udc01","rat":"\ud83d\udc00","hamster":"\ud83d\udc39","rabbit":"\ud83d\udc30","rabbit2":"\ud83d\udc07","chipmunk":"\ud83d\udc3f\ufe0f","beaver":"\ud83e\uddab","hedgehog":"\ud83e\udd94","bat":"\ud83e\udd87","bear":"\ud83d\udc3b","polar_bear":"\ud83d\udc3b\u200d\u2744\ufe0f","koala":"\ud83d\udc28","panda_face":"\ud83d\udc3c","sloth":"\ud83e\udda5","otter":"\ud83e\udda6","skunk":"\ud83e\udda8","kangaroo":"\ud83e\udd98","badger":"\ud83e\udda1","feet":"\ud83d\udc3e","paw_prints":"\ud83d\udc3e","turkey":"\ud83e\udd83","chicken":"\ud83d\udc14","rooster":"\ud83d\udc13","hatching_chick":"\ud83d\udc23","baby_chick":"\ud83d\udc24","hatched_chick":"\ud83d\udc25","bird":"\ud83d\udc26","penguin":"\ud83d\udc27","dove":"\ud83d\udd4a\ufe0f","eagle":"\ud83e\udd85","duck":"\ud83e\udd86","swan":"\ud83e\udda2","owl":"\ud83e\udd89","dodo":"\ud83e\udda4","feather":"\ud83e\udeb6","flamingo":"\ud83e\udda9","peacock":"\ud83e\udd9a","parrot":"\ud83e\udd9c","frog":"\ud83d\udc38","crocodile":"\ud83d\udc0a","turtle":"\ud83d\udc22","lizard":"\ud83e\udd8e","snake":"\ud83d\udc0d","dragon_face":"\ud83d\udc32","dragon":"\ud83d\udc09","sauropod":"\ud83e\udd95","t-rex":"\ud83e\udd96","whale":"\ud83d\udc33","whale2":"\ud83d\udc0b","dolphin":"\ud83d\udc2c","flipper":"\ud83d\udc2c","seal":"\ud83e\uddad","fish":"\ud83d\udc1f","tropical_fish":"\ud83d\udc20","blowfish":"\ud83d\udc21","shark":"\ud83e\udd88","octopus":"\ud83d\udc19","shell":"\ud83d\udc1a","snail":"\ud83d\udc0c","butterfly":"\ud83e\udd8b","bug":"\ud83d\udc1b","ant":"\ud83d\udc1c","bee":"\ud83d\udc1d","honeybee":"\ud83d\udc1d","beetle":"\ud83e\udeb2","lady_beetle":"\ud83d\udc1e","cricket":"\ud83e\udd97","cockroach":"\ud83e\udeb3","spider":"\ud83d\udd77\ufe0f","spider_web":"\ud83d\udd78\ufe0f","scorpion":"\ud83e\udd82","mosquito":"\ud83e\udd9f","fly":"\ud83e\udeb0","worm":"\ud83e\udeb1","microbe":"\ud83e\udda0","bouquet":"\ud83d\udc90","cherry_blossom":"\ud83c\udf38","white_flower":"\ud83d\udcae","rosette":"\ud83c\udff5\ufe0f","rose":"\ud83c\udf39","wilted_flower":"\ud83e\udd40","hibiscus":"\ud83c\udf3a","sunflower":"\ud83c\udf3b","blossom":"\ud83c\udf3c","tulip":"\ud83c\udf37","seedling":"\ud83c\udf31","potted_plant":"\ud83e\udeb4","evergreen_tree":"\ud83c\udf32","deciduous_tree":"\ud83c\udf33","palm_tree":"\ud83c\udf34","cactus":"\ud83c\udf35","ear_of_rice":"\ud83c\udf3e","herb":"\ud83c\udf3f","shamrock":"\u2618\ufe0f","four_leaf_clover":"\ud83c\udf40","maple_leaf":"\ud83c\udf41","fallen_leaf":"\ud83c\udf42","leaves":"\ud83c\udf43","grapes":"\ud83c\udf47","melon":"\ud83c\udf48","watermelon":"\ud83c\udf49","tangerine":"\ud83c\udf4a","orange":"\ud83c\udf4a","mandarin":"\ud83c\udf4a","lemon":"\ud83c\udf4b","banana":"\ud83c\udf4c","pineapple":"\ud83c\udf4d","mango":"\ud83e\udd6d","apple":"\ud83c\udf4e","green_apple":"\ud83c\udf4f","pear":"\ud83c\udf50","peach":"\ud83c\udf51","cherries":"\ud83c\udf52","strawberry":"\ud83c\udf53","blueberries":"\ud83e\uded0","kiwi_fruit":"\ud83e\udd5d","tomato":"\ud83c\udf45","olive":"\ud83e\uded2","coconut":"\ud83e\udd65","avocado":"\ud83e\udd51","eggplant":"\ud83c\udf46","potato":"\ud83e\udd54","carrot":"\ud83e\udd55","corn":"\ud83c\udf3d","hot_pepper":"\ud83c\udf36\ufe0f","bell_pepper":"\ud83e\uded1","cucumber":"\ud83e\udd52","leafy_green":"\ud83e\udd6c","broccoli":"\ud83e\udd66","garlic":"\ud83e\uddc4","onion":"\ud83e\uddc5","mushroom":"\ud83c\udf44","peanuts":"\ud83e\udd5c","chestnut":"\ud83c\udf30","bread":"\ud83c\udf5e","croissant":"\ud83e\udd50","baguette_bread":"\ud83e\udd56","flatbread":"\ud83e\uded3","pretzel":"\ud83e\udd68","bagel":"\ud83e\udd6f","pancakes":"\ud83e\udd5e","waffle":"\ud83e\uddc7","cheese":"\ud83e\uddc0","meat_on_bone":"\ud83c\udf56","poultry_leg":"\ud83c\udf57","cut_of_meat":"\ud83e\udd69","bacon":"\ud83e\udd53","hamburger":"\ud83c\udf54","fries":"\ud83c\udf5f","pizza":"\ud83c\udf55","hotdog":"\ud83c\udf2d","sandwich":"\ud83e\udd6a","taco":"\ud83c\udf2e","burrito":"\ud83c\udf2f","tamale":"\ud83e\uded4","stuffed_flatbread":"\ud83e\udd59","falafel":"\ud83e\uddc6","egg":"\ud83e\udd5a","fried_egg":"\ud83c\udf73","shallow_pan_of_food":"\ud83e\udd58","stew":"\ud83c\udf72","fondue":"\ud83e\uded5","bowl_with_spoon":"\ud83e\udd63","green_salad":"\ud83e\udd57","popcorn":"\ud83c\udf7f","butter":"\ud83e\uddc8","salt":"\ud83e\uddc2","canned_food":"\ud83e\udd6b","bento":"\ud83c\udf71","rice_cracker":"\ud83c\udf58","rice_ball":"\ud83c\udf59","rice":"\ud83c\udf5a","curry":"\ud83c\udf5b","ramen":"\ud83c\udf5c","spaghetti":"\ud83c\udf5d","sweet_potato":"\ud83c\udf60","oden":"\ud83c\udf62","sushi":"\ud83c\udf63","fried_shrimp":"\ud83c\udf64","fish_cake":"\ud83c\udf65","moon_cake":"\ud83e\udd6e","dango":"\ud83c\udf61","dumpling":"\ud83e\udd5f","fortune_cookie":"\ud83e\udd60","takeout_box":"\ud83e\udd61","crab":"\ud83e\udd80","lobster":"\ud83e\udd9e","shrimp":"\ud83e\udd90","squid":"\ud83e\udd91","oyster":"\ud83e\uddaa","icecream":"\ud83c\udf66","shaved_ice":"\ud83c\udf67","ice_cream":"\ud83c\udf68","doughnut":"\ud83c\udf69","cookie":"\ud83c\udf6a","birthday":"\ud83c\udf82","cake":"\ud83c\udf70","cupcake":"\ud83e\uddc1","pie":"\ud83e\udd67","chocolate_bar":"\ud83c\udf6b","candy":"\ud83c\udf6c","lollipop":"\ud83c\udf6d","custard":"\ud83c\udf6e","honey_pot":"\ud83c\udf6f","baby_bottle":"\ud83c\udf7c","milk_glass":"\ud83e\udd5b","coffee":"\u2615","teapot":"\ud83e\uded6","tea":"\ud83c\udf75","sake":"\ud83c\udf76","champagne":"\ud83c\udf7e","wine_glass":"\ud83c\udf77","cocktail":"\ud83c\udf78","tropical_drink":"\ud83c\udf79","beer":"\ud83c\udf7a","beers":"\ud83c\udf7b","clinking_glasses":"\ud83e\udd42","tumbler_glass":"\ud83e\udd43","cup_with_straw":"\ud83e\udd64","bubble_tea":"\ud83e\uddcb","beverage_box":"\ud83e\uddc3","mate":"\ud83e\uddc9","ice_cube":"\ud83e\uddca","chopsticks":"\ud83e\udd62","plate_with_cutlery":"\ud83c\udf7d\ufe0f","fork_and_knife":"\ud83c\udf74","spoon":"\ud83e\udd44","hocho":"\ud83d\udd2a","knife":"\ud83d\udd2a","amphora":"\ud83c\udffa","earth_africa":"\ud83c\udf0d","earth_americas":"\ud83c\udf0e","earth_asia":"\ud83c\udf0f","globe_with_meridians":"\ud83c\udf10","world_map":"\ud83d\uddfa\ufe0f","japan":"\ud83d\uddfe","compass":"\ud83e\udded","mountain_snow":"\ud83c\udfd4\ufe0f","mountain":"\u26f0\ufe0f","volcano":"\ud83c\udf0b","mount_fuji":"\ud83d\uddfb","camping":"\ud83c\udfd5\ufe0f","beach_umbrella":"\ud83c\udfd6\ufe0f","desert":"\ud83c\udfdc\ufe0f","desert_island":"\ud83c\udfdd\ufe0f","national_park":"\ud83c\udfde\ufe0f","stadium":"\ud83c\udfdf\ufe0f","classical_building":"\ud83c\udfdb\ufe0f","building_construction":"\ud83c\udfd7\ufe0f","bricks":"\ud83e\uddf1","rock":"\ud83e\udea8","wood":"\ud83e\udeb5","hut":"\ud83d\uded6","houses":"\ud83c\udfd8\ufe0f","derelict_house":"\ud83c\udfda\ufe0f","house":"\ud83c\udfe0","house_with_garden":"\ud83c\udfe1","office":"\ud83c\udfe2","post_office":"\ud83c\udfe3","european_post_office":"\ud83c\udfe4","hospital":"\ud83c\udfe5","bank":"\ud83c\udfe6","hotel":"\ud83c\udfe8","love_hotel":"\ud83c\udfe9","convenience_store":"\ud83c\udfea","school":"\ud83c\udfeb","department_store":"\ud83c\udfec","factory":"\ud83c\udfed","japanese_castle":"\ud83c\udfef","european_castle":"\ud83c\udff0","wedding":"\ud83d\udc92","tokyo_tower":"\ud83d\uddfc","statue_of_liberty":"\ud83d\uddfd","church":"\u26ea","mosque":"\ud83d\udd4c","hindu_temple":"\ud83d\uded5","synagogue":"\ud83d\udd4d","shinto_shrine":"\u26e9\ufe0f","kaaba":"\ud83d\udd4b","fountain":"\u26f2","tent":"\u26fa","foggy":"\ud83c\udf01","night_with_stars":"\ud83c\udf03","cityscape":"\ud83c\udfd9\ufe0f","sunrise_over_mountains":"\ud83c\udf04","sunrise":"\ud83c\udf05","city_sunset":"\ud83c\udf06","city_sunrise":"\ud83c\udf07","bridge_at_night":"\ud83c\udf09","hotsprings":"\u2668\ufe0f","carousel_horse":"\ud83c\udfa0","ferris_wheel":"\ud83c\udfa1","roller_coaster":"\ud83c\udfa2","barber":"\ud83d\udc88","circus_tent":"\ud83c\udfaa","steam_locomotive":"\ud83d\ude82","railway_car":"\ud83d\ude83","bullettrain_side":"\ud83d\ude84","bullettrain_front":"\ud83d\ude85","train2":"\ud83d\ude86","metro":"\ud83d\ude87","light_rail":"\ud83d\ude88","station":"\ud83d\ude89","tram":"\ud83d\ude8a","monorail":"\ud83d\ude9d","mountain_railway":"\ud83d\ude9e","train":"\ud83d\ude8b","bus":"\ud83d\ude8c","oncoming_bus":"\ud83d\ude8d","trolleybus":"\ud83d\ude8e","minibus":"\ud83d\ude90","ambulance":"\ud83d\ude91","fire_engine":"\ud83d\ude92","police_car":"\ud83d\ude93","oncoming_police_car":"\ud83d\ude94","taxi":"\ud83d\ude95","oncoming_taxi":"\ud83d\ude96","car":"\ud83d\ude97","red_car":"\ud83d\ude97","oncoming_automobile":"\ud83d\ude98","blue_car":"\ud83d\ude99","pickup_truck":"\ud83d\udefb","truck":"\ud83d\ude9a","articulated_lorry":"\ud83d\ude9b","tractor":"\ud83d\ude9c","racing_car":"\ud83c\udfce\ufe0f","motorcycle":"\ud83c\udfcd\ufe0f","motor_scooter":"\ud83d\udef5","manual_wheelchair":"\ud83e\uddbd","motorized_wheelchair":"\ud83e\uddbc","auto_rickshaw":"\ud83d\udefa","bike":"\ud83d\udeb2","kick_scooter":"\ud83d\udef4","skateboard":"\ud83d\udef9","roller_skate":"\ud83d\udefc","busstop":"\ud83d\ude8f","motorway":"\ud83d\udee3\ufe0f","railway_track":"\ud83d\udee4\ufe0f","oil_drum":"\ud83d\udee2\ufe0f","fuelpump":"\u26fd","rotating_light":"\ud83d\udea8","traffic_light":"\ud83d\udea5","vertical_traffic_light":"\ud83d\udea6","stop_sign":"\ud83d\uded1","construction":"\ud83d\udea7","anchor":"\u2693","boat":"\u26f5","sailboat":"\u26f5","canoe":"\ud83d\udef6","speedboat":"\ud83d\udea4","passenger_ship":"\ud83d\udef3\ufe0f","ferry":"\u26f4\ufe0f","motor_boat":"\ud83d\udee5\ufe0f","ship":"\ud83d\udea2","airplane":"\u2708\ufe0f","small_airplane":"\ud83d\udee9\ufe0f","flight_departure":"\ud83d\udeeb","flight_arrival":"\ud83d\udeec","parachute":"\ud83e\ude82","seat":"\ud83d\udcba","helicopter":"\ud83d\ude81","suspension_railway":"\ud83d\ude9f","mountain_cableway":"\ud83d\udea0","aerial_tramway":"\ud83d\udea1","artificial_satellite":"\ud83d\udef0\ufe0f","rocket":"\ud83d\ude80","flying_saucer":"\ud83d\udef8","bellhop_bell":"\ud83d\udece\ufe0f","luggage":"\ud83e\uddf3","hourglass":"\u231b","hourglass_flowing_sand":"\u23f3","watch":"\u231a","alarm_clock":"\u23f0","stopwatch":"\u23f1\ufe0f","timer_clock":"\u23f2\ufe0f","mantelpiece_clock":"\ud83d\udd70\ufe0f","clock12":"\ud83d\udd5b","clock1230":"\ud83d\udd67","clock1":"\ud83d\udd50","clock130":"\ud83d\udd5c","clock2":"\ud83d\udd51","clock230":"\ud83d\udd5d","clock3":"\ud83d\udd52","clock330":"\ud83d\udd5e","clock4":"\ud83d\udd53","clock430":"\ud83d\udd5f","clock5":"\ud83d\udd54","clock530":"\ud83d\udd60","clock6":"\ud83d\udd55","clock630":"\ud83d\udd61","clock7":"\ud83d\udd56","clock730":"\ud83d\udd62","clock8":"\ud83d\udd57","clock830":"\ud83d\udd63","clock9":"\ud83d\udd58","clock930":"\ud83d\udd64","clock10":"\ud83d\udd59","clock1030":"\ud83d\udd65","clock11":"\ud83d\udd5a","clock1130":"\ud83d\udd66","new_moon":"\ud83c\udf11","waxing_crescent_moon":"\ud83c\udf12","first_quarter_moon":"\ud83c\udf13","moon":"\ud83c\udf14","waxing_gibbous_moon":"\ud83c\udf14","full_moon":"\ud83c\udf15","waning_gibbous_moon":"\ud83c\udf16","last_quarter_moon":"\ud83c\udf17","waning_crescent_moon":"\ud83c\udf18","crescent_moon":"\ud83c\udf19","new_moon_with_face":"\ud83c\udf1a","first_quarter_moon_with_face":"\ud83c\udf1b","last_quarter_moon_with_face":"\ud83c\udf1c","thermometer":"\ud83c\udf21\ufe0f","sunny":"\u2600\ufe0f","full_moon_with_face":"\ud83c\udf1d","sun_with_face":"\ud83c\udf1e","ringed_planet":"\ud83e\ude90","star":"\u2b50","star2":"\ud83c\udf1f","stars":"\ud83c\udf20","milky_way":"\ud83c\udf0c","cloud":"\u2601\ufe0f","partly_sunny":"\u26c5","cloud_with_lightning_and_rain":"\u26c8\ufe0f","sun_behind_small_cloud":"\ud83c\udf24\ufe0f","sun_behind_large_cloud":"\ud83c\udf25\ufe0f","sun_behind_rain_cloud":"\ud83c\udf26\ufe0f","cloud_with_rain":"\ud83c\udf27\ufe0f","cloud_with_snow":"\ud83c\udf28\ufe0f","cloud_with_lightning":"\ud83c\udf29\ufe0f","tornado":"\ud83c\udf2a\ufe0f","fog":"\ud83c\udf2b\ufe0f","wind_face":"\ud83c\udf2c\ufe0f","cyclone":"\ud83c\udf00","rainbow":"\ud83c\udf08","closed_umbrella":"\ud83c\udf02","open_umbrella":"\u2602\ufe0f","umbrella":"\u2614","parasol_on_ground":"\u26f1\ufe0f","zap":"\u26a1","snowflake":"\u2744\ufe0f","snowman_with_snow":"\u2603\ufe0f","snowman":"\u26c4","comet":"\u2604\ufe0f","fire":"\ud83d\udd25","droplet":"\ud83d\udca7","ocean":"\ud83c\udf0a","jack_o_lantern":"\ud83c\udf83","christmas_tree":"\ud83c\udf84","fireworks":"\ud83c\udf86","sparkler":"\ud83c\udf87","firecracker":"\ud83e\udde8","sparkles":"\u2728","balloon":"\ud83c\udf88","tada":"\ud83c\udf89","confetti_ball":"\ud83c\udf8a","tanabata_tree":"\ud83c\udf8b","bamboo":"\ud83c\udf8d","dolls":"\ud83c\udf8e","flags":"\ud83c\udf8f","wind_chime":"\ud83c\udf90","rice_scene":"\ud83c\udf91","red_envelope":"\ud83e\udde7","ribbon":"\ud83c\udf80","gift":"\ud83c\udf81","reminder_ribbon":"\ud83c\udf97\ufe0f","tickets":"\ud83c\udf9f\ufe0f","ticket":"\ud83c\udfab","medal_military":"\ud83c\udf96\ufe0f","trophy":"\ud83c\udfc6","medal_sports":"\ud83c\udfc5","1st_place_medal":"\ud83e\udd47","2nd_place_medal":"\ud83e\udd48","3rd_place_medal":"\ud83e\udd49","soccer":"\u26bd","baseball":"\u26be","softball":"\ud83e\udd4e","basketball":"\ud83c\udfc0","volleyball":"\ud83c\udfd0","football":"\ud83c\udfc8","rugby_football":"\ud83c\udfc9","tennis":"\ud83c\udfbe","flying_disc":"\ud83e\udd4f","bowling":"\ud83c\udfb3","cricket_game":"\ud83c\udfcf","field_hockey":"\ud83c\udfd1","ice_hockey":"\ud83c\udfd2","lacrosse":"\ud83e\udd4d","ping_pong":"\ud83c\udfd3","badminton":"\ud83c\udff8","boxing_glove":"\ud83e\udd4a","martial_arts_uniform":"\ud83e\udd4b","goal_net":"\ud83e\udd45","golf":"\u26f3","ice_skate":"\u26f8\ufe0f","fishing_pole_and_fish":"\ud83c\udfa3","diving_mask":"\ud83e\udd3f","running_shirt_with_sash":"\ud83c\udfbd","ski":"\ud83c\udfbf","sled":"\ud83d\udef7","curling_stone":"\ud83e\udd4c","dart":"\ud83c\udfaf","yo_yo":"\ud83e\ude80","kite":"\ud83e\ude81","8ball":"\ud83c\udfb1","crystal_ball":"\ud83d\udd2e","magic_wand":"\ud83e\ude84","nazar_amulet":"\ud83e\uddff","video_game":"\ud83c\udfae","joystick":"\ud83d\udd79\ufe0f","slot_machine":"\ud83c\udfb0","game_die":"\ud83c\udfb2","jigsaw":"\ud83e\udde9","teddy_bear":"\ud83e\uddf8","pinata":"\ud83e\ude85","nesting_dolls":"\ud83e\ude86","spades":"\u2660\ufe0f","hearts":"\u2665\ufe0f","diamonds":"\u2666\ufe0f","clubs":"\u2663\ufe0f","chess_pawn":"\u265f\ufe0f","black_joker":"\ud83c\udccf","mahjong":"\ud83c\udc04","flower_playing_cards":"\ud83c\udfb4","performing_arts":"\ud83c\udfad","framed_picture":"\ud83d\uddbc\ufe0f","art":"\ud83c\udfa8","thread":"\ud83e\uddf5","sewing_needle":"\ud83e\udea1","yarn":"\ud83e\uddf6","knot":"\ud83e\udea2","eyeglasses":"\ud83d\udc53","dark_sunglasses":"\ud83d\udd76\ufe0f","goggles":"\ud83e\udd7d","lab_coat":"\ud83e\udd7c","safety_vest":"\ud83e\uddba","necktie":"\ud83d\udc54","shirt":"\ud83d\udc55","tshirt":"\ud83d\udc55","jeans":"\ud83d\udc56","scarf":"\ud83e\udde3","gloves":"\ud83e\udde4","coat":"\ud83e\udde5","socks":"\ud83e\udde6","dress":"\ud83d\udc57","kimono":"\ud83d\udc58","sari":"\ud83e\udd7b","one_piece_swimsuit":"\ud83e\ude71","swim_brief":"\ud83e\ude72","shorts":"\ud83e\ude73","bikini":"\ud83d\udc59","womans_clothes":"\ud83d\udc5a","purse":"\ud83d\udc5b","handbag":"\ud83d\udc5c","pouch":"\ud83d\udc5d","shopping":"\ud83d\udecd\ufe0f","school_satchel":"\ud83c\udf92","thong_sandal":"\ud83e\ude74","mans_shoe":"\ud83d\udc5e","shoe":"\ud83d\udc5e","athletic_shoe":"\ud83d\udc5f","hiking_boot":"\ud83e\udd7e","flat_shoe":"\ud83e\udd7f","high_heel":"\ud83d\udc60","sandal":"\ud83d\udc61","ballet_shoes":"\ud83e\ude70","boot":"\ud83d\udc62","crown":"\ud83d\udc51","womans_hat":"\ud83d\udc52","tophat":"\ud83c\udfa9","mortar_board":"\ud83c\udf93","billed_cap":"\ud83e\udde2","military_helmet":"\ud83e\ude96","rescue_worker_helmet":"\u26d1\ufe0f","prayer_beads":"\ud83d\udcff","lipstick":"\ud83d\udc84","ring":"\ud83d\udc8d","gem":"\ud83d\udc8e","mute":"\ud83d\udd07","speaker":"\ud83d\udd08","sound":"\ud83d\udd09","loud_sound":"\ud83d\udd0a","loudspeaker":"\ud83d\udce2","mega":"\ud83d\udce3","postal_horn":"\ud83d\udcef","bell":"\ud83d\udd14","no_bell":"\ud83d\udd15","musical_score":"\ud83c\udfbc","musical_note":"\ud83c\udfb5","notes":"\ud83c\udfb6","studio_microphone":"\ud83c\udf99\ufe0f","level_slider":"\ud83c\udf9a\ufe0f","control_knobs":"\ud83c\udf9b\ufe0f","microphone":"\ud83c\udfa4","headphones":"\ud83c\udfa7","radio":"\ud83d\udcfb","saxophone":"\ud83c\udfb7","accordion":"\ud83e\ude97","guitar":"\ud83c\udfb8","musical_keyboard":"\ud83c\udfb9","trumpet":"\ud83c\udfba","violin":"\ud83c\udfbb","banjo":"\ud83e\ude95","drum":"\ud83e\udd41","long_drum":"\ud83e\ude98","iphone":"\ud83d\udcf1","calling":"\ud83d\udcf2","phone":"\u260e\ufe0f","telephone":"\u260e\ufe0f","telephone_receiver":"\ud83d\udcde","pager":"\ud83d\udcdf","fax":"\ud83d\udce0","battery":"\ud83d\udd0b","electric_plug":"\ud83d\udd0c","computer":"\ud83d\udcbb","desktop_computer":"\ud83d\udda5\ufe0f","printer":"\ud83d\udda8\ufe0f","keyboard":"\u2328\ufe0f","computer_mouse":"\ud83d\uddb1\ufe0f","trackball":"\ud83d\uddb2\ufe0f","minidisc":"\ud83d\udcbd","floppy_disk":"\ud83d\udcbe","cd":"\ud83d\udcbf","dvd":"\ud83d\udcc0","abacus":"\ud83e\uddee","movie_camera":"\ud83c\udfa5","film_strip":"\ud83c\udf9e\ufe0f","film_projector":"\ud83d\udcfd\ufe0f","clapper":"\ud83c\udfac","tv":"\ud83d\udcfa","camera":"\ud83d\udcf7","camera_flash":"\ud83d\udcf8","video_camera":"\ud83d\udcf9","vhs":"\ud83d\udcfc","mag":"\ud83d\udd0d","mag_right":"\ud83d\udd0e","candle":"\ud83d\udd6f\ufe0f","bulb":"\ud83d\udca1","flashlight":"\ud83d\udd26","izakaya_lantern":"\ud83c\udfee","lantern":"\ud83c\udfee","diya_lamp":"\ud83e\ude94","notebook_with_decorative_cover":"\ud83d\udcd4","closed_book":"\ud83d\udcd5","book":"\ud83d\udcd6","open_book":"\ud83d\udcd6","green_book":"\ud83d\udcd7","blue_book":"\ud83d\udcd8","orange_book":"\ud83d\udcd9","books":"\ud83d\udcda","notebook":"\ud83d\udcd3","ledger":"\ud83d\udcd2","page_with_curl":"\ud83d\udcc3","scroll":"\ud83d\udcdc","page_facing_up":"\ud83d\udcc4","newspaper":"\ud83d\udcf0","newspaper_roll":"\ud83d\uddde\ufe0f","bookmark_tabs":"\ud83d\udcd1","bookmark":"\ud83d\udd16","label":"\ud83c\udff7\ufe0f","moneybag":"\ud83d\udcb0","coin":"\ud83e\ude99","yen":"\ud83d\udcb4","dollar":"\ud83d\udcb5","euro":"\ud83d\udcb6","pound":"\ud83d\udcb7","money_with_wings":"\ud83d\udcb8","credit_card":"\ud83d\udcb3","receipt":"\ud83e\uddfe","chart":"\ud83d\udcb9","envelope":"\u2709\ufe0f","email":"\ud83d\udce7","e-mail":"\ud83d\udce7","incoming_envelope":"\ud83d\udce8","envelope_with_arrow":"\ud83d\udce9","outbox_tray":"\ud83d\udce4","inbox_tray":"\ud83d\udce5","package":"\ud83d\udce6","mailbox":"\ud83d\udceb","mailbox_closed":"\ud83d\udcea","mailbox_with_mail":"\ud83d\udcec","mailbox_with_no_mail":"\ud83d\udced","postbox":"\ud83d\udcee","ballot_box":"\ud83d\uddf3\ufe0f","pencil2":"\u270f\ufe0f","black_nib":"\u2712\ufe0f","fountain_pen":"\ud83d\udd8b\ufe0f","pen":"\ud83d\udd8a\ufe0f","paintbrush":"\ud83d\udd8c\ufe0f","crayon":"\ud83d\udd8d\ufe0f","memo":"\ud83d\udcdd","pencil":"\ud83d\udcdd","briefcase":"\ud83d\udcbc","file_folder":"\ud83d\udcc1","open_file_folder":"\ud83d\udcc2","card_index_dividers":"\ud83d\uddc2\ufe0f","date":"\ud83d\udcc5","calendar":"\ud83d\udcc6","spiral_notepad":"\ud83d\uddd2\ufe0f","spiral_calendar":"\ud83d\uddd3\ufe0f","card_index":"\ud83d\udcc7","chart_with_upwards_trend":"\ud83d\udcc8","chart_with_downwards_trend":"\ud83d\udcc9","bar_chart":"\ud83d\udcca","clipboard":"\ud83d\udccb","pushpin":"\ud83d\udccc","round_pushpin":"\ud83d\udccd","paperclip":"\ud83d\udcce","paperclips":"\ud83d\udd87\ufe0f","straight_ruler":"\ud83d\udccf","triangular_ruler":"\ud83d\udcd0","scissors":"\u2702\ufe0f","card_file_box":"\ud83d\uddc3\ufe0f","file_cabinet":"\ud83d\uddc4\ufe0f","wastebasket":"\ud83d\uddd1\ufe0f","lock":"\ud83d\udd12","unlock":"\ud83d\udd13","lock_with_ink_pen":"\ud83d\udd0f","closed_lock_with_key":"\ud83d\udd10","key":"\ud83d\udd11","old_key":"\ud83d\udddd\ufe0f","hammer":"\ud83d\udd28","axe":"\ud83e\ude93","pick":"\u26cf\ufe0f","hammer_and_pick":"\u2692\ufe0f","hammer_and_wrench":"\ud83d\udee0\ufe0f","dagger":"\ud83d\udde1\ufe0f","crossed_swords":"\u2694\ufe0f","gun":"\ud83d\udd2b","boomerang":"\ud83e\ude83","bow_and_arrow":"\ud83c\udff9","shield":"\ud83d\udee1\ufe0f","carpentry_saw":"\ud83e\ude9a","wrench":"\ud83d\udd27","screwdriver":"\ud83e\ude9b","nut_and_bolt":"\ud83d\udd29","gear":"\u2699\ufe0f","clamp":"\ud83d\udddc\ufe0f","balance_scale":"\u2696\ufe0f","probing_cane":"\ud83e\uddaf","link":"\ud83d\udd17","chains":"\u26d3\ufe0f","hook":"\ud83e\ude9d","toolbox":"\ud83e\uddf0","magnet":"\ud83e\uddf2","ladder":"\ud83e\ude9c","alembic":"\u2697\ufe0f","test_tube":"\ud83e\uddea","petri_dish":"\ud83e\uddeb","dna":"\ud83e\uddec","microscope":"\ud83d\udd2c","telescope":"\ud83d\udd2d","satellite":"\ud83d\udce1","syringe":"\ud83d\udc89","drop_of_blood":"\ud83e\ude78","pill":"\ud83d\udc8a","adhesive_bandage":"\ud83e\ude79","stethoscope":"\ud83e\ude7a","door":"\ud83d\udeaa","elevator":"\ud83d\uded7","mirror":"\ud83e\ude9e","window":"\ud83e\ude9f","bed":"\ud83d\udecf\ufe0f","couch_and_lamp":"\ud83d\udecb\ufe0f","chair":"\ud83e\ude91","toilet":"\ud83d\udebd","plunger":"\ud83e\udea0","shower":"\ud83d\udebf","bathtub":"\ud83d\udec1","mouse_trap":"\ud83e\udea4","razor":"\ud83e\ude92","lotion_bottle":"\ud83e\uddf4","safety_pin":"\ud83e\uddf7","broom":"\ud83e\uddf9","basket":"\ud83e\uddfa","roll_of_paper":"\ud83e\uddfb","bucket":"\ud83e\udea3","soap":"\ud83e\uddfc","toothbrush":"\ud83e\udea5","sponge":"\ud83e\uddfd","fire_extinguisher":"\ud83e\uddef","shopping_cart":"\ud83d\uded2","smoking":"\ud83d\udeac","coffin":"\u26b0\ufe0f","headstone":"\ud83e\udea6","funeral_urn":"\u26b1\ufe0f","moyai":"\ud83d\uddff","placard":"\ud83e\udea7","atm":"\ud83c\udfe7","put_litter_in_its_place":"\ud83d\udeae","potable_water":"\ud83d\udeb0","wheelchair":"\u267f","mens":"\ud83d\udeb9","womens":"\ud83d\udeba","restroom":"\ud83d\udebb","baby_symbol":"\ud83d\udebc","wc":"\ud83d\udebe","passport_control":"\ud83d\udec2","customs":"\ud83d\udec3","baggage_claim":"\ud83d\udec4","left_luggage":"\ud83d\udec5","warning":"\u26a0\ufe0f","children_crossing":"\ud83d\udeb8","no_entry":"\u26d4","no_entry_sign":"\ud83d\udeab","no_bicycles":"\ud83d\udeb3","no_smoking":"\ud83d\udead","do_not_litter":"\ud83d\udeaf","non-potable_water":"\ud83d\udeb1","no_pedestrians":"\ud83d\udeb7","no_mobile_phones":"\ud83d\udcf5","underage":"\ud83d\udd1e","radioactive":"\u2622\ufe0f","biohazard":"\u2623\ufe0f","arrow_up":"\u2b06\ufe0f","arrow_upper_right":"\u2197\ufe0f","arrow_right":"\u27a1\ufe0f","arrow_lower_right":"\u2198\ufe0f","arrow_down":"\u2b07\ufe0f","arrow_lower_left":"\u2199\ufe0f","arrow_left":"\u2b05\ufe0f","arrow_upper_left":"\u2196\ufe0f","arrow_up_down":"\u2195\ufe0f","left_right_arrow":"\u2194\ufe0f","leftwards_arrow_with_hook":"\u21a9\ufe0f","arrow_right_hook":"\u21aa\ufe0f","arrow_heading_up":"\u2934\ufe0f","arrow_heading_down":"\u2935\ufe0f","arrows_clockwise":"\ud83d\udd03","arrows_counterclockwise":"\ud83d\udd04","back":"\ud83d\udd19","end":"\ud83d\udd1a","on":"\ud83d\udd1b","soon":"\ud83d\udd1c","top":"\ud83d\udd1d","place_of_worship":"\ud83d\uded0","atom_symbol":"\u269b\ufe0f","om":"\ud83d\udd49\ufe0f","star_of_david":"\u2721\ufe0f","wheel_of_dharma":"\u2638\ufe0f","yin_yang":"\u262f\ufe0f","latin_cross":"\u271d\ufe0f","orthodox_cross":"\u2626\ufe0f","star_and_crescent":"\u262a\ufe0f","peace_symbol":"\u262e\ufe0f","menorah":"\ud83d\udd4e","six_pointed_star":"\ud83d\udd2f","aries":"\u2648","taurus":"\u2649","gemini":"\u264a","cancer":"\u264b","leo":"\u264c","virgo":"\u264d","libra":"\u264e","scorpius":"\u264f","sagittarius":"\u2650","capricorn":"\u2651","aquarius":"\u2652","pisces":"\u2653","ophiuchus":"\u26ce","twisted_rightwards_arrows":"\ud83d\udd00","repeat":"\ud83d\udd01","repeat_one":"\ud83d\udd02","arrow_forward":"\u25b6\ufe0f","fast_forward":"\u23e9","next_track_button":"\u23ed\ufe0f","play_or_pause_button":"\u23ef\ufe0f","arrow_backward":"\u25c0\ufe0f","rewind":"\u23ea","previous_track_button":"\u23ee\ufe0f","arrow_up_small":"\ud83d\udd3c","arrow_double_up":"\u23eb","arrow_down_small":"\ud83d\udd3d","arrow_double_down":"\u23ec","pause_button":"\u23f8\ufe0f","stop_button":"\u23f9\ufe0f","record_button":"\u23fa\ufe0f","eject_button":"\u23cf\ufe0f","cinema":"\ud83c\udfa6","low_brightness":"\ud83d\udd05","high_brightness":"\ud83d\udd06","signal_strength":"\ud83d\udcf6","vibration_mode":"\ud83d\udcf3","mobile_phone_off":"\ud83d\udcf4","female_sign":"\u2640\ufe0f","male_sign":"\u2642\ufe0f","transgender_symbol":"\u26a7\ufe0f","heavy_multiplication_x":"\u2716\ufe0f","heavy_plus_sign":"\u2795","heavy_minus_sign":"\u2796","heavy_division_sign":"\u2797","infinity":"\u267e\ufe0f","bangbang":"\u203c\ufe0f","interrobang":"\u2049\ufe0f","question":"\u2753","grey_question":"\u2754","grey_exclamation":"\u2755","exclamation":"\u2757","heavy_exclamation_mark":"\u2757","wavy_dash":"\u3030\ufe0f","currency_exchange":"\ud83d\udcb1","heavy_dollar_sign":"\ud83d\udcb2","medical_symbol":"\u2695\ufe0f","recycle":"\u267b\ufe0f","fleur_de_lis":"\u269c\ufe0f","trident":"\ud83d\udd31","name_badge":"\ud83d\udcdb","beginner":"\ud83d\udd30","o":"\u2b55","white_check_mark":"\u2705","ballot_box_with_check":"\u2611\ufe0f","heavy_check_mark":"\u2714\ufe0f","x":"\u274c","negative_squared_cross_mark":"\u274e","curly_loop":"\u27b0","loop":"\u27bf","part_alternation_mark":"\u303d\ufe0f","eight_spoked_asterisk":"\u2733\ufe0f","eight_pointed_black_star":"\u2734\ufe0f","sparkle":"\u2747\ufe0f","copyright":"\xa9\ufe0f","registered":"\xae\ufe0f","tm":"\u2122\ufe0f","hash":"#\ufe0f\u20e3","asterisk":"*\ufe0f\u20e3","zero":"0\ufe0f\u20e3","one":"1\ufe0f\u20e3","two":"2\ufe0f\u20e3","three":"3\ufe0f\u20e3","four":"4\ufe0f\u20e3","five":"5\ufe0f\u20e3","six":"6\ufe0f\u20e3","seven":"7\ufe0f\u20e3","eight":"8\ufe0f\u20e3","nine":"9\ufe0f\u20e3","keycap_ten":"\ud83d\udd1f","capital_abcd":"\ud83d\udd20","abcd":"\ud83d\udd21","symbols":"\ud83d\udd23","abc":"\ud83d\udd24","a":"\ud83c\udd70\ufe0f","ab":"\ud83c\udd8e","b":"\ud83c\udd71\ufe0f","cl":"\ud83c\udd91","cool":"\ud83c\udd92","free":"\ud83c\udd93","information_source":"\u2139\ufe0f","id":"\ud83c\udd94","m":"\u24c2\ufe0f","new":"\ud83c\udd95","ng":"\ud83c\udd96","o2":"\ud83c\udd7e\ufe0f","ok":"\ud83c\udd97","parking":"\ud83c\udd7f\ufe0f","sos":"\ud83c\udd98","up":"\ud83c\udd99","vs":"\ud83c\udd9a","koko":"\ud83c\ude01","sa":"\ud83c\ude02\ufe0f","ideograph_advantage":"\ud83c\ude50","accept":"\ud83c\ude51","congratulations":"\u3297\ufe0f","secret":"\u3299\ufe0f","u6e80":"\ud83c\ude35","red_circle":"\ud83d\udd34","orange_circle":"\ud83d\udfe0","yellow_circle":"\ud83d\udfe1","green_circle":"\ud83d\udfe2","large_blue_circle":"\ud83d\udd35","purple_circle":"\ud83d\udfe3","brown_circle":"\ud83d\udfe4","black_circle":"\u26ab","white_circle":"\u26aa","red_square":"\ud83d\udfe5","orange_square":"\ud83d\udfe7","yellow_square":"\ud83d\udfe8","green_square":"\ud83d\udfe9","blue_square":"\ud83d\udfe6","purple_square":"\ud83d\udfea","brown_square":"\ud83d\udfeb","black_large_square":"\u2b1b","white_large_square":"\u2b1c","black_medium_square":"\u25fc\ufe0f","white_medium_square":"\u25fb\ufe0f","black_medium_small_square":"\u25fe","white_medium_small_square":"\u25fd","black_small_square":"\u25aa\ufe0f","white_small_square":"\u25ab\ufe0f","large_orange_diamond":"\ud83d\udd36","large_blue_diamond":"\ud83d\udd37","small_orange_diamond":"\ud83d\udd38","small_blue_diamond":"\ud83d\udd39","small_red_triangle":"\ud83d\udd3a","small_red_triangle_down":"\ud83d\udd3b","diamond_shape_with_a_dot_inside":"\ud83d\udca0","radio_button":"\ud83d\udd18","white_square_button":"\ud83d\udd33","black_square_button":"\ud83d\udd32","checkered_flag":"\ud83c\udfc1","triangular_flag_on_post":"\ud83d\udea9","crossed_flags":"\ud83c\udf8c","black_flag":"\ud83c\udff4","white_flag":"\ud83c\udff3\ufe0f","rainbow_flag":"\ud83c\udff3\ufe0f\u200d\ud83c\udf08","transgender_flag":"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","pirate_flag":"\ud83c\udff4\u200d\u2620\ufe0f","ascension_island":"\ud83c\udde6\ud83c\udde8","andorra":"\ud83c\udde6\ud83c\udde9","united_arab_emirates":"\ud83c\udde6\ud83c\uddea","afghanistan":"\ud83c\udde6\ud83c\uddeb","antigua_barbuda":"\ud83c\udde6\ud83c\uddec","anguilla":"\ud83c\udde6\ud83c\uddee","albania":"\ud83c\udde6\ud83c\uddf1","armenia":"\ud83c\udde6\ud83c\uddf2","angola":"\ud83c\udde6\ud83c\uddf4","antarctica":"\ud83c\udde6\ud83c\uddf6","argentina":"\ud83c\udde6\ud83c\uddf7","american_samoa":"\ud83c\udde6\ud83c\uddf8","austria":"\ud83c\udde6\ud83c\uddf9","australia":"\ud83c\udde6\ud83c\uddfa","aruba":"\ud83c\udde6\ud83c\uddfc","aland_islands":"\ud83c\udde6\ud83c\uddfd","azerbaijan":"\ud83c\udde6\ud83c\uddff","bosnia_herzegovina":"\ud83c\udde7\ud83c\udde6","barbados":"\ud83c\udde7\ud83c\udde7","bangladesh":"\ud83c\udde7\ud83c\udde9","belgium":"\ud83c\udde7\ud83c\uddea","burkina_faso":"\ud83c\udde7\ud83c\uddeb","bulgaria":"\ud83c\udde7\ud83c\uddec","bahrain":"\ud83c\udde7\ud83c\udded","burundi":"\ud83c\udde7\ud83c\uddee","benin":"\ud83c\udde7\ud83c\uddef","st_barthelemy":"\ud83c\udde7\ud83c\uddf1","bermuda":"\ud83c\udde7\ud83c\uddf2","brunei":"\ud83c\udde7\ud83c\uddf3","bolivia":"\ud83c\udde7\ud83c\uddf4","caribbean_netherlands":"\ud83c\udde7\ud83c\uddf6","brazil":"\ud83c\udde7\ud83c\uddf7","bahamas":"\ud83c\udde7\ud83c\uddf8","bhutan":"\ud83c\udde7\ud83c\uddf9","bouvet_island":"\ud83c\udde7\ud83c\uddfb","botswana":"\ud83c\udde7\ud83c\uddfc","belarus":"\ud83c\udde7\ud83c\uddfe","belize":"\ud83c\udde7\ud83c\uddff","canada":"\ud83c\udde8\ud83c\udde6","cocos_islands":"\ud83c\udde8\ud83c\udde8","congo_kinshasa":"\ud83c\udde8\ud83c\udde9","central_african_republic":"\ud83c\udde8\ud83c\uddeb","congo_brazzaville":"\ud83c\udde8\ud83c\uddec","switzerland":"\ud83c\udde8\ud83c\udded","cote_divoire":"\ud83c\udde8\ud83c\uddee","cook_islands":"\ud83c\udde8\ud83c\uddf0","chile":"\ud83c\udde8\ud83c\uddf1","cameroon":"\ud83c\udde8\ud83c\uddf2","cn":"\ud83c\udde8\ud83c\uddf3","colombia":"\ud83c\udde8\ud83c\uddf4","clipperton_island":"\ud83c\udde8\ud83c\uddf5","costa_rica":"\ud83c\udde8\ud83c\uddf7","cuba":"\ud83c\udde8\ud83c\uddfa","cape_verde":"\ud83c\udde8\ud83c\uddfb","curacao":"\ud83c\udde8\ud83c\uddfc","christmas_island":"\ud83c\udde8\ud83c\uddfd","cyprus":"\ud83c\udde8\ud83c\uddfe","czech_republic":"\ud83c\udde8\ud83c\uddff","de":"\ud83c\udde9\ud83c\uddea","diego_garcia":"\ud83c\udde9\ud83c\uddec","djibouti":"\ud83c\udde9\ud83c\uddef","denmark":"\ud83c\udde9\ud83c\uddf0","dominica":"\ud83c\udde9\ud83c\uddf2","dominican_republic":"\ud83c\udde9\ud83c\uddf4","algeria":"\ud83c\udde9\ud83c\uddff","ceuta_melilla":"\ud83c\uddea\ud83c\udde6","ecuador":"\ud83c\uddea\ud83c\udde8","estonia":"\ud83c\uddea\ud83c\uddea","egypt":"\ud83c\uddea\ud83c\uddec","western_sahara":"\ud83c\uddea\ud83c\udded","eritrea":"\ud83c\uddea\ud83c\uddf7","es":"\ud83c\uddea\ud83c\uddf8","ethiopia":"\ud83c\uddea\ud83c\uddf9","eu":"\ud83c\uddea\ud83c\uddfa","european_union":"\ud83c\uddea\ud83c\uddfa","finland":"\ud83c\uddeb\ud83c\uddee","fiji":"\ud83c\uddeb\ud83c\uddef","falkland_islands":"\ud83c\uddeb\ud83c\uddf0","micronesia":"\ud83c\uddeb\ud83c\uddf2","faroe_islands":"\ud83c\uddeb\ud83c\uddf4","fr":"\ud83c\uddeb\ud83c\uddf7","gabon":"\ud83c\uddec\ud83c\udde6","gb":"\ud83c\uddec\ud83c\udde7","uk":"\ud83c\uddec\ud83c\udde7","grenada":"\ud83c\uddec\ud83c\udde9","georgia":"\ud83c\uddec\ud83c\uddea","french_guiana":"\ud83c\uddec\ud83c\uddeb","guernsey":"\ud83c\uddec\ud83c\uddec","ghana":"\ud83c\uddec\ud83c\udded","gibraltar":"\ud83c\uddec\ud83c\uddee","greenland":"\ud83c\uddec\ud83c\uddf1","gambia":"\ud83c\uddec\ud83c\uddf2","guinea":"\ud83c\uddec\ud83c\uddf3","guadeloupe":"\ud83c\uddec\ud83c\uddf5","equatorial_guinea":"\ud83c\uddec\ud83c\uddf6","greece":"\ud83c\uddec\ud83c\uddf7","south_georgia_south_sandwich_islands":"\ud83c\uddec\ud83c\uddf8","guatemala":"\ud83c\uddec\ud83c\uddf9","guam":"\ud83c\uddec\ud83c\uddfa","guinea_bissau":"\ud83c\uddec\ud83c\uddfc","guyana":"\ud83c\uddec\ud83c\uddfe","hong_kong":"\ud83c\udded\ud83c\uddf0","heard_mcdonald_islands":"\ud83c\udded\ud83c\uddf2","honduras":"\ud83c\udded\ud83c\uddf3","croatia":"\ud83c\udded\ud83c\uddf7","haiti":"\ud83c\udded\ud83c\uddf9","hungary":"\ud83c\udded\ud83c\uddfa","canary_islands":"\ud83c\uddee\ud83c\udde8","indonesia":"\ud83c\uddee\ud83c\udde9","ireland":"\ud83c\uddee\ud83c\uddea","israel":"\ud83c\uddee\ud83c\uddf1","isle_of_man":"\ud83c\uddee\ud83c\uddf2","india":"\ud83c\uddee\ud83c\uddf3","british_indian_ocean_territory":"\ud83c\uddee\ud83c\uddf4","iraq":"\ud83c\uddee\ud83c\uddf6","iran":"\ud83c\uddee\ud83c\uddf7","iceland":"\ud83c\uddee\ud83c\uddf8","it":"\ud83c\uddee\ud83c\uddf9","jersey":"\ud83c\uddef\ud83c\uddea","jamaica":"\ud83c\uddef\ud83c\uddf2","jordan":"\ud83c\uddef\ud83c\uddf4","jp":"\ud83c\uddef\ud83c\uddf5","kenya":"\ud83c\uddf0\ud83c\uddea","kyrgyzstan":"\ud83c\uddf0\ud83c\uddec","cambodia":"\ud83c\uddf0\ud83c\udded","kiribati":"\ud83c\uddf0\ud83c\uddee","comoros":"\ud83c\uddf0\ud83c\uddf2","st_kitts_nevis":"\ud83c\uddf0\ud83c\uddf3","north_korea":"\ud83c\uddf0\ud83c\uddf5","kr":"\ud83c\uddf0\ud83c\uddf7","kuwait":"\ud83c\uddf0\ud83c\uddfc","cayman_islands":"\ud83c\uddf0\ud83c\uddfe","kazakhstan":"\ud83c\uddf0\ud83c\uddff","laos":"\ud83c\uddf1\ud83c\udde6","lebanon":"\ud83c\uddf1\ud83c\udde7","st_lucia":"\ud83c\uddf1\ud83c\udde8","liechtenstein":"\ud83c\uddf1\ud83c\uddee","sri_lanka":"\ud83c\uddf1\ud83c\uddf0","liberia":"\ud83c\uddf1\ud83c\uddf7","lesotho":"\ud83c\uddf1\ud83c\uddf8","lithuania":"\ud83c\uddf1\ud83c\uddf9","luxembourg":"\ud83c\uddf1\ud83c\uddfa","latvia":"\ud83c\uddf1\ud83c\uddfb","libya":"\ud83c\uddf1\ud83c\uddfe","morocco":"\ud83c\uddf2\ud83c\udde6","monaco":"\ud83c\uddf2\ud83c\udde8","moldova":"\ud83c\uddf2\ud83c\udde9","montenegro":"\ud83c\uddf2\ud83c\uddea","st_martin":"\ud83c\uddf2\ud83c\uddeb","madagascar":"\ud83c\uddf2\ud83c\uddec","marshall_islands":"\ud83c\uddf2\ud83c\udded","macedonia":"\ud83c\uddf2\ud83c\uddf0","mali":"\ud83c\uddf2\ud83c\uddf1","myanmar":"\ud83c\uddf2\ud83c\uddf2","mongolia":"\ud83c\uddf2\ud83c\uddf3","macau":"\ud83c\uddf2\ud83c\uddf4","northern_mariana_islands":"\ud83c\uddf2\ud83c\uddf5","martinique":"\ud83c\uddf2\ud83c\uddf6","mauritania":"\ud83c\uddf2\ud83c\uddf7","montserrat":"\ud83c\uddf2\ud83c\uddf8","malta":"\ud83c\uddf2\ud83c\uddf9","mauritius":"\ud83c\uddf2\ud83c\uddfa","maldives":"\ud83c\uddf2\ud83c\uddfb","malawi":"\ud83c\uddf2\ud83c\uddfc","mexico":"\ud83c\uddf2\ud83c\uddfd","malaysia":"\ud83c\uddf2\ud83c\uddfe","mozambique":"\ud83c\uddf2\ud83c\uddff","namibia":"\ud83c\uddf3\ud83c\udde6","new_caledonia":"\ud83c\uddf3\ud83c\udde8","niger":"\ud83c\uddf3\ud83c\uddea","norfolk_island":"\ud83c\uddf3\ud83c\uddeb","nigeria":"\ud83c\uddf3\ud83c\uddec","nicaragua":"\ud83c\uddf3\ud83c\uddee","netherlands":"\ud83c\uddf3\ud83c\uddf1","norway":"\ud83c\uddf3\ud83c\uddf4","nepal":"\ud83c\uddf3\ud83c\uddf5","nauru":"\ud83c\uddf3\ud83c\uddf7","niue":"\ud83c\uddf3\ud83c\uddfa","new_zealand":"\ud83c\uddf3\ud83c\uddff","oman":"\ud83c\uddf4\ud83c\uddf2","panama":"\ud83c\uddf5\ud83c\udde6","peru":"\ud83c\uddf5\ud83c\uddea","french_polynesia":"\ud83c\uddf5\ud83c\uddeb","papua_new_guinea":"\ud83c\uddf5\ud83c\uddec","philippines":"\ud83c\uddf5\ud83c\udded","pakistan":"\ud83c\uddf5\ud83c\uddf0","poland":"\ud83c\uddf5\ud83c\uddf1","st_pierre_miquelon":"\ud83c\uddf5\ud83c\uddf2","pitcairn_islands":"\ud83c\uddf5\ud83c\uddf3","puerto_rico":"\ud83c\uddf5\ud83c\uddf7","palestinian_territories":"\ud83c\uddf5\ud83c\uddf8","portugal":"\ud83c\uddf5\ud83c\uddf9","palau":"\ud83c\uddf5\ud83c\uddfc","paraguay":"\ud83c\uddf5\ud83c\uddfe","qatar":"\ud83c\uddf6\ud83c\udde6","reunion":"\ud83c\uddf7\ud83c\uddea","romania":"\ud83c\uddf7\ud83c\uddf4","serbia":"\ud83c\uddf7\ud83c\uddf8","ru":"\ud83c\uddf7\ud83c\uddfa","rwanda":"\ud83c\uddf7\ud83c\uddfc","saudi_arabia":"\ud83c\uddf8\ud83c\udde6","solomon_islands":"\ud83c\uddf8\ud83c\udde7","seychelles":"\ud83c\uddf8\ud83c\udde8","sudan":"\ud83c\uddf8\ud83c\udde9","sweden":"\ud83c\uddf8\ud83c\uddea","singapore":"\ud83c\uddf8\ud83c\uddec","st_helena":"\ud83c\uddf8\ud83c\udded","slovenia":"\ud83c\uddf8\ud83c\uddee","svalbard_jan_mayen":"\ud83c\uddf8\ud83c\uddef","slovakia":"\ud83c\uddf8\ud83c\uddf0","sierra_leone":"\ud83c\uddf8\ud83c\uddf1","san_marino":"\ud83c\uddf8\ud83c\uddf2","senegal":"\ud83c\uddf8\ud83c\uddf3","somalia":"\ud83c\uddf8\ud83c\uddf4","suriname":"\ud83c\uddf8\ud83c\uddf7","south_sudan":"\ud83c\uddf8\ud83c\uddf8","sao_tome_principe":"\ud83c\uddf8\ud83c\uddf9","el_salvador":"\ud83c\uddf8\ud83c\uddfb","sint_maarten":"\ud83c\uddf8\ud83c\uddfd","syria":"\ud83c\uddf8\ud83c\uddfe","swaziland":"\ud83c\uddf8\ud83c\uddff","tristan_da_cunha":"\ud83c\uddf9\ud83c\udde6","turks_caicos_islands":"\ud83c\uddf9\ud83c\udde8","chad":"\ud83c\uddf9\ud83c\udde9","french_southern_territories":"\ud83c\uddf9\ud83c\uddeb","togo":"\ud83c\uddf9\ud83c\uddec","thailand":"\ud83c\uddf9\ud83c\udded","tajikistan":"\ud83c\uddf9\ud83c\uddef","tokelau":"\ud83c\uddf9\ud83c\uddf0","timor_leste":"\ud83c\uddf9\ud83c\uddf1","turkmenistan":"\ud83c\uddf9\ud83c\uddf2","tunisia":"\ud83c\uddf9\ud83c\uddf3","tonga":"\ud83c\uddf9\ud83c\uddf4","tr":"\ud83c\uddf9\ud83c\uddf7","trinidad_tobago":"\ud83c\uddf9\ud83c\uddf9","tuvalu":"\ud83c\uddf9\ud83c\uddfb","taiwan":"\ud83c\uddf9\ud83c\uddfc","tanzania":"\ud83c\uddf9\ud83c\uddff","ukraine":"\ud83c\uddfa\ud83c\udde6","uganda":"\ud83c\uddfa\ud83c\uddec","us_outlying_islands":"\ud83c\uddfa\ud83c\uddf2","united_nations":"\ud83c\uddfa\ud83c\uddf3","us":"\ud83c\uddfa\ud83c\uddf8","uruguay":"\ud83c\uddfa\ud83c\uddfe","uzbekistan":"\ud83c\uddfa\ud83c\uddff","vatican_city":"\ud83c\uddfb\ud83c\udde6","st_vincent_grenadines":"\ud83c\uddfb\ud83c\udde8","venezuela":"\ud83c\uddfb\ud83c\uddea","british_virgin_islands":"\ud83c\uddfb\ud83c\uddec","us_virgin_islands":"\ud83c\uddfb\ud83c\uddee","vietnam":"\ud83c\uddfb\ud83c\uddf3","vanuatu":"\ud83c\uddfb\ud83c\uddfa","wallis_futuna":"\ud83c\uddfc\ud83c\uddeb","samoa":"\ud83c\uddfc\ud83c\uddf8","kosovo":"\ud83c\uddfd\ud83c\uddf0","yemen":"\ud83c\uddfe\ud83c\uddea","mayotte":"\ud83c\uddfe\ud83c\uddf9","south_africa":"\ud83c\uddff\ud83c\udde6","zambia":"\ud83c\uddff\ud83c\uddf2","zimbabwe":"\ud83c\uddff\ud83c\uddfc","england":"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","scotland":"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f","wales":"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f"}')}}]);
//# sourceMappingURL=394.14a9b9da.chunk.js.map

================================================
FILE: build/static/js/bindle-edges-json.94501736.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[691],{8866:function(e){e.exports=JSON.parse('[{"source":"users","sourceKey":"id","target":"purchases","targetKey":"user_id","relation":"hasMany"},{"source":"users","sourceKey":"id","target":"books_users","targetKey":"user_id","relation":"hasMany"},{"source":"products","sourceKey":"id","target":"purchases","targetKey":"product_id","relation":"hasMany"},{"source":"books","sourceKey":"id","target":"books_users","targetKey":"book_id","relation":"hasMany"},{"source":"users","sourceKey":"id","target":"profiles","targetKey":"user_id","relation":"hasOne"},{"source":"users","sourceKey":"id","target":"accounts","targetKey":"user_id","relation":"hasOne"},{"source":"users","sourceKey":"id","target":"devices","targetKey":"user_id","relation":"hasMany"},{"source":"users","sourceKey":"id","target":"adjust.callbacks","targetKey":"user_id","relation":"hasMany"},{"source":"users","sourceKey":"visitor_id","target":"web_analytics.pageviews","targetKey":"visitor_id","relation":"hasMany"},{"source":"web_analytics.pageviews","sourceKey":"pageview_id","target":"web_analytics.events","targetKey":"pageview_id","relation":"hasMany"},{"source":"users","sourceKey":"id","target":"mobile_analytics.events","targetKey":"user_id","relation":"hasMany"},{"source":"users","sourceKey":"id","target":"users","targetKey":"referrer_id","relation":"hasMany","sourcePosition":"left","targetPosition":"left"}]')}}]);

================================================
FILE: build/static/js/bindle-schemaColors-json.b87e5760.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[480],{1737:function(s){s.exports=JSON.parse('{"DEFAULT":"#91C4F2","public":"#BEB8EB","adjust":"#AFA2FF","helpers":"#75C9C8","web_analytics":"#F6BDD1","mobile_analytics":"#FFD791"}')}}]);

================================================
FILE: build/static/js/bindle-tablePositions-json.847db583.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[356],{3366:function(s){s.exports=JSON.parse('{"adjust.callbacks":{"x":864,"y":-192},"helpers.dates":{"x":512,"y":528},"mobile_analytics.events":{"x":656,"y":-336},"public.accounts":{"x":-240,"y":-192},"public.books":{"x":-432,"y":320},"public.books_users":{"x":-208,"y":224},"public.devices":{"x":-48,"y":-336},"public.marketing_spends":{"x":672,"y":528},"public.products":{"x":704,"y":304},"public.profiles":{"x":-384,"y":-16},"public.purchases":{"x":432,"y":192},"public.users":{"x":192,"y":-96},"web_analytics.events":{"x":-368,"y":624},"web_analytics.pageviews":{"x":-96,"y":544}}')}}]);

================================================
FILE: build/static/js/bindle-tables.0d2bfe46.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[112],{2905:function(e,t,i){i.r(t),i.d(t,{default:function(){return a}});var a=[JSON.parse('{"name":"accounts","description":"Accounts of platforms users can sign up with. Bindle users might have Facebook or Email accounts.","columns":[{"name":"id","description":"Unique identifier of an account.","key":true,"type":"integer"},{"name":"user_id","description":"User\u2019s id.","type":"integer"},{"name":"platform","description":"Account\u2019s platform. Bindle allows email and facebook signups.","type":"text"},{"name":"email","description":"Email attached to the account. Note that different platforms could have different emails.","type":"text"},{"name":"created_at","description":"Timestamp when this account was created. created_at of the first account is user\u2019s signup timestamp.","type":"datetime"}]}'),JSON.parse('{"schema":"adjust","name":"callbacks","description":"Adjust is a mobile attribution service, sort of Google Analytics for the mobile world. Adjust sends back callbacks with information (attribution) about every mobile install, like where this install comes from, which link a person clicked before installing the app.","columns":[{"name":"id","description":"Unique ID of an Adjust callback.","type":"integer","key":true},{"name":"tracker","description":"Adjust\u2019s tracker parameter. For example https://app.adjust.com/gxel3d1.","type":"text"},{"name":"created_at","description":"Timestamp of a callback.","type":"datetime"},{"name":"campaign_name","description":"The value of campaign paramenter in Adjust URL.","type":"text"},{"name":"adgroup_name","description":"The value of adgroup paramenter in Adjust URL.","type":"text"},{"name":"creative_name","description":"The value of creative paramenter in Adjust URL.","type":"text"},{"name":"label","description":"The value of label paramenter in Adjust URL.","type":"text"},{"name":"device_name","description":"Model and OS version of a user\u2019s device.","type":"text"},{"name":"app_version","description":"Bindle\u2019s app version at the moment.","type":"text"},{"name":"activity_kind","description":"Predefined Adjust event, could be click, install, event (means custom event and event_name will be present) or else.","type":"text"},{"name":"event_name","description":"Custom Adjust event; Bindle has custom signup event.","type":"text"},{"name":"adid","description":"Adjust\u2019s device ID.","type":"text"},{"name":"user_id","description":"ID of a user (from users table). Present for signup event.","type":"integer"},{"name":"country","description":"Country derived from user\u2019s IP address.","type":"text"}]}'),JSON.parse('{"name":"books_users","description":"A join table for many-to-many relationship between users and books.","columns":[{"name":"book_id","description":"Book\u2019s id.","type":"integer"},{"name":"user_id","description":"User\u2019s id.","type":"integer"},{"name":"last_page","description":"A number of the last page a user read in the book.","type":"integer"},{"name":"created_at","description":"When the user started reading the book.","type":"datetime"}]}'),JSON.parse('{"name":"books","description":"All books available in the Bindle\'s library.","columns":[{"name":"id","description":"Unique identifier of the book.","key":true,"type":"integer"},{"name":"name","description":"Name of the book.","type":"text"},{"name":"slug","description":"Identifer of a book used in URLs. For example https://www.bindle.com/books/final-future. Usually generated from book\u2019s name.","type":"text"},{"name":"genre","description":"Book\u2019s genre.","type":"text"},{"name":"pages_count","description":"Number of pages in the book.","type":"integer"}]}'),JSON.parse('{"name":"devices","description":"This table keeps track of all devices users log in to Bindle with \u2013 browsers or mobile apps.","columns":[{"name":"id","description":"Unique identifier of a user\u2019s device.","key":true,"type":"integer"},{"name":"user_id","description":"id of a user who uses this device.","type":"integer"},{"name":"device_type","description":"Type of the device, could be **browser** (for users who are using Bindle website) or **iphone** (users who are reading via Bindle app).","type":"text"},{"name":"connected_at","description":"Timestamp when a user started using this device. Device with the earliest **connected_at** field is the device which user used for signing up.","type":"datetime"},{"name":"version","description":"For browser devices it\u2019s a User Agent. For iPhone devices it\u2019s a version of user\u2019s iPhone and a version of iOS separated by comma.","type":"text"}]}'),JSON.parse('{"schema":"helpers","name":"dates","description":"A helper table with consecutive dates. Might be useful to join sparse timelines to for reporting metrics per day.","columns":[{"name":"id","description":"Unique identifier of a date. Just a primary key, an index of the table.","key":true,"type":"integer"},{"name":"date","description":"A date. By joining the very sparse timeline data to the consecutive range of dates we won\u2019t have gaps.","type":"date"}]}'),JSON.parse('{"name":"marketing_spends","description":"A table that keeps track of Bindle\'s marketing investments per campaign, per day.","columns":[{"name":"id","description":"Unique identifier of spend, just a primary key in a table.","key":true,"type":"integer"},{"name":"spent_at","description":"The date of a spend. Spend data is usually reported by date.","type":"date"},{"name":"amount","description":"Amount of money in USD.","type":"integer"},{"name":"clicks","description":"Number of clicks on the ad on this date.","type":"integer"},{"name":"utm_source","description":"utm_source of marketing campaign.","type":"text"},{"name":"utm_campaign","description":"utm_campaign of marketing campaign.","type":"text"},{"name":"utm_term","description":"utm_term of marketing campaign.","type":"text"},{"name":"utm_content","description":"utm_content of marketing campaign.","type":"text"},{"name":"utm_medium","description":"utm_medium of marketing campaign.","type":"text"}]}'),JSON.parse('{"schema":"mobile_analytics","name":"events","description":"This analytics table contains all events fired by Bindle\'s mobile app.","columns":[{"name":"event_id","description":"Unique identifier of an event.","type":"text","key":true},{"name":"category","description":"Category parameter of an event, for example onboarding.","type":"text"},{"name":"action","description":"Action parameter of an event, for example screenview.","type":"text"},{"name":"name","description":"Name parameter of an event, for example bindle-content.","type":"text"},{"name":"screen_resolution","description":"Resolution of a user\u2019s smartphone, for example 375x812.","type":"text"},{"name":"device_type","description":"Model of a user\u2019s smartphone and the version of the OS, for example iPhone 7,12.1.0.","type":"text"},{"name":"user_id","description":"If user is logged in \u2013 ID of a user in the users table.","type":"integer"},{"name":"adid","description":"Unique identifier of a user\u2019s smartphone, same as in Adjust callbacks table.","type":"text"},{"name":"country","description":"Country derived from user\u2019s IP address.","type":"text"},{"name":"custom_parameters","description":"All custom parameters of an even in a key-value format.","type":"JSON"},{"name":"created_at","description":"Timestamp of an event.","type":"datetime"},{"name":"app_version","description":"Version of the Bindle app a user is using, for example 1.1.1.","type":"text"}]}'),JSON.parse('{"name":"products","description":"The list of all purchasable Bindle products (subscriptions).","columns":[{"name":"id","description":"Unique identifier of a product.","key":true,"type":"integer"},{"name":"name","description":"Name of a product.","type":"text"},{"name":"price","description":"Price of a product","type":"float"}]}'),JSON.parse('{"name":"profiles","description":"To avoid growing the users table further, users\' profile information was extracted to this table.","columns":[{"name":"id","key":true,"type":"number","description":"Unique identifier of a profile."},{"name":"user_id","type":"number","description":"User\u2019s id."},{"name":"about","type":"text","description":"Information about a user."},{"name":"interests","type":"text","description":"User\u2019s interests. Comma separated list of tags."},{"name":"avatar_url","type":"text","description":"URL of an avatar user uploaded. Check some of them out ;)"},{"name":"postal_code","type":"text","description":"A postal code of a user for books delivery."}]}'),JSON.parse('{"name":"purchases","description":"This table contains all purchase transactions.","columns":[{"name":"id","description":"Unique identifier of purchase.","type":"integer","key":true},{"name":"user_id","description":"id of a user who made the purchase.","type":"integer"},{"name":"product_id","description":"id of a product inside products table.","type":"integer"},{"name":"amount","description":"How much money user paid. The number might vary since users could apply discounts. Amount is always in US dollars.","type":"float"},{"name":"refunded","description":"Status of a purchase, we receive money on the bank account only if purchase wasn\u2019t refunded.","type":"boolean"},{"name":"created_at","description":"When purchase was made.","type":"datetime"}]}'),JSON.parse('{"name":"users","description":"This table contains all user records of Bindle.","columns":[{"name":"id","key":true,"description":"Unique identifier of a user.","type":"number"},{"name":"email","type":"text","description":"User\u2019s email, unique."},{"name":"first_name","type":"text","description":"User\u2019s first name."},{"name":"last_name","type":"text","description":"User\u2019s last name."},{"name":"country","type":"text","description":"User\u2019s signup country."},{"name":"signup_date","type":"date","description":"Date when user signed up."},{"name":"created_at","type":"datetime","description":"Timestamp when user record was created, we can treat it as signup date and time."},{"name":"status","type":"text","description":"What status user has in Bindle, could be free (can read only free books) or customer (user who purchased a subscription, can read all books)."},{"name":"age","type":"integer","description":"User\u2019s age."},{"name":"referrer_id","type":"integer","description":"id of another user who referred this user (this is usually set when users sign up via referral link)."},{"name":"visitor_id","type":"text","description":"Identifier of a user in the web_analytics.pageviews table. Generated by a web analytics system and stored in a cookie."},{"name":"utm_source","type":"text","description":"utm_source in URL when user signed up, used for marketing attribution"},{"name":"utm_campaign","type":"text","description":"utm_campaign in URL when user signed up, used for marketing attribution"},{"name":"utm_term","type":"text","description":"utm_term in URL when user signed up, used for marketing attribution"},{"name":"utm_content","type":"text","description":"utm_content in URL when user signed up, used for marketing attribution"},{"name":"utm_medium","type":"text","description":"utm_medium in URL when user signed up, used for marketing attribution"},{"name":"adjust_tracker","type":"text","description":"Adjust tracker in case user signed up via an Adjust link https://app.adjust.com/gxel3d1."},{"name":"adjust_campaign","type":"text","description":"The value of campaign paramenter in Adjust URL."},{"name":"adjust_adgroup","type":"text","description":"The value of adgroup paramenter in Adjust URL."},{"name":"adjust_creative","type":"text","description":"The value of creative paramenter in Adjust URL."}]}'),JSON.parse('{"schema":"web_analytics","name":"events","description":"This table contains all events that happen on Bindle\'s website pages. Events are tracked during a pageview, that\'s why there\'s a has-many relation between pageviews and events.","columns":[{"name":"pageview_id","description":"Category parameter of an event, for example Signup.","type":"text"},{"name":"category","description":"Action parameter of an event, for example Click.","type":"text"},{"name":"action","description":"Name parameter of an event, for example Signup for free.","type":"text"},{"name":"name","description":"Unique identifier of a record inside pageviews table. All events happen within one pageview. \u26a0\ufe0f","type":"text"},{"name":"created_at","description":"Timestamp of an event.","type":"datetime"}]}'),JSON.parse('{"schema":"web_analytics","name":"pageviews","description":"This table contains all pageviews of Bindle\'s website.","columns":[{"name":"pageview_id","description":"Unique identifier of a pageview.","type":"text","key":true},{"name":"visitor_id","description":"Unique identifier of a visitor. A fingerprint used to keep track of guest visitors who haven\u2019t had signed up.","type":"text"},{"name":"user_id","description":"If user is logged in \u2013 ID of a user in users table.","type":"integer"},{"name":"url","description":"URL of the visited page.","type":"text"},{"name":"referer_url","description":"URL of the previous page where user clicked on a link with URL.","type":"text"},{"name":"screen_resolution","description":"Screen resolution of a user\u2019s device. Example: 1024x1366.","type":"text"},{"name":"device_type","description":"Type of a user\u2019s device. Could be mobile, tablet or desktop.","type":"text"},{"name":"custom_parameters","description":"All custom parameters of a pageview in a key-value format. Could be added per page, for example we might add ab_test_variation key to keep track of what AB-test variation user had seen.","type":"JSON"},{"name":"created_at","description":"Timestamp of a pageview.","type":"datetime"},{"name":"country","description":"Country derived from user\u2019s IP address.","type":"text"}]}')]}}]);
//# sourceMappingURL=bindle-tables.0d2bfe46.chunk.js.map

================================================
FILE: build/static/js/ecommerce-edges-json.fe131063.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[547],{5336:function(e){e.exports=JSON.parse('[{"source":"vendors","sourceKey":"id","target":"items","targetKey":"vendor_id","relation":"hasMany"},{"source":"categories","sourceKey":"id","target":"items","targetKey":"category_id","relation":"hasMany"},{"source":"items","sourceKey":"id","target":"reviews","targetKey":"item_id","relation":"hasMany"},{"source":"users","sourceKey":"id","target":"reviews","targetKey":"user_id","relation":"hasMany"},{"source":"items","sourceKey":"id","target":"carts_items","targetKey":"item_id","relation":"hasMany"},{"source":"carts","sourceKey":"id","target":"carts_items","targetKey":"cart_id","relation":"hasMany"},{"source":"users","sourceKey":"id","target":"carts","targetKey":"user_id","relation":"hasMany"},{"source":"carts","sourceKey":"id","target":"returns","targetKey":"cart_id","relation":"hasMany"},{"source":"items","sourceKey":"id","target":"returns","targetKey":"item_id","relation":"hasMany"},{"source":"carts","sourceKey":"id","target":"purchases","targetKey":"cart_id","relation":"hasOne"},{"source":"discount_codes","sourceKey":"code","target":"purchases","targetKey":"discount_code","relation":"hasMany"}]')}}]);

================================================
FILE: build/static/js/ecommerce-schemaColors-json.fdb98809.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[415],{1090:function(s){s.exports=JSON.parse('{"DEFAULT":"#91C4F2","public":"#91C4F2"}')}}]);

================================================
FILE: build/static/js/ecommerce-tablePositions-json.03a16298.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[743],{9543:function(s){s.exports=JSON.parse('{"public.carts":{"x":672,"y":368},"public.carts_items":{"x":464,"y":560},"public.categories":{"x":-160,"y":496},"public.discount_codes":{"x":1136,"y":336},"public.items":{"x":112,"y":608},"public.purchases":{"x":896,"y":160},"public.returns":{"x":400,"y":288},"public.reviews":{"x":400,"y":800},"public.users":{"x":688,"y":720},"public.vendors":{"x":-160,"y":848}}')}}]);

================================================
FILE: build/static/js/ecommerce-tables.f5264437.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[679],{4213:function(e,t,a){a.r(t),a.d(t,{default:function(){return i}});var i=[JSON.parse('{"name":"carts","description":"This table contains all carts (purchased or not) that were ever assembled by users.","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of a cart.","type":"bigint"},{"name":"user_id","description":"ID of a user who assemled a cart.","type":"bigint"},{"name":"created_at","description":"When a cart was created (when a user added the first item to a cart).","type":"timestamp"}]}'),JSON.parse('{"name":"carts_items","description":"This is a join table that enables many-to-many relation between carts and items.","schemaColor":"#91C4F2","columns":[{"name":"item_id","description":"ID of an item that was added to a cart.","type":"bigint"},{"name":"cart_id","description":"Cart\'s ID.","type":"bigint"},{"name":"created_at","description":"When an item was added to a cart.","type":"timestamp"},{"name":"quantity","description":"How many identical items are in a cart.","type":"integer"}]}'),JSON.parse('{"name":"categories","description":"This table contains item categories. Note that cateories are nested and a category could have multiple children categories.","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of an item category.","type":"bigint"},{"name":"name","description":"Category name, like \\"Sport shoes\\".","type":"text"},{"name":"parent_id","description":"ID of a parent category. Yep, categories have nested structure. For example, \\"books\\" category have \\"fiction\\" and \\"non-fiction\\" categories. \\"Fiction\\" category has categories like \\"History\\", \\"Detective\\", etc.","type":"bigint"},{"name":"created_at","description":"When a category was added.","type":"timestamp"}]}'),JSON.parse('{"name":"discount_codes","description":"Thsi table contains all discount codes that could be redeemed by a user when making a purchase. Note that discount codes could save a fixed amount or a percentage of the final price.","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of a discount code.","type":"bigint"},{"name":"amount_off","description":"Amount in USD that will be subtracted from a total cart\'s price if a user redeems this discount code.","type":"bigint"},{"name":"percent_off","description":"Percentage of a total cart\'s price that will be removed if a user redeems this discount code.","type":"bigint"},{"name":"code","description":"Unique code of a discount code. Codes are shared with customers, not ID-s :warning:.","type":"text"},{"name":"created_at","description":"When discount code was created.","type":"timestamp"},{"name":"valid_until","description":"The latest timestamp when customers are able to redeem a discount code.","type":"timestamp"}]}'),JSON.parse('{"name":"items","description":"This table contains all items that could be purchased by users. Note that only published items are available to website visitors (have value in the `published_at` column).","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of an item.","type":"bigint"},{"name":"name","description":"Item\'s name.","type":"text"},{"name":"category_id","description":"ID of item\'s category.","type":"bigint"},{"name":"vendor_id","description":"ID of a vendor who produces or sells this item in our E-commerce store.","type":"bigint"},{"name":"price_usd","description":"Item\'s price in USD.","type":"numeric"},{"name":"created_at","description":"Timestamp when an item was first added to our E-commerce store.","type":"timestamp"},{"name":"published_at","description":"Timestamp when an item was first available for purchasing.","type":"timestamp"}]}'),JSON.parse('{"name":"purchases","description":"This table contains all cart purchases.","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of a return.","type":"bigint"},{"name":"discount_code","description":"Discount code that was used by a user. It\'s a foreign key for the `discount_codes` table.","type":"text"},{"name":"country","description":"Country of a user who made a purchase (IP based).","type":"text"},{"name":"city","description":"City of a user who made a purchase (IP based).","type":"text"},{"name":"payment_method","description":"Payment method that was used for a purchase. Could be **cc** (credit card) or **paypal**.","type":"text"},{"name":"created_at","description":"Timestamp of a purchase.","type":"timestamp"},{"name":"cart_id","description":"ID of a cart that was purchased.","type":"bigint"}]}'),JSON.parse('{"name":"returns","description":"This table contains all returns (full carts or partial item returns).","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of a return.","type":"bigint"},{"name":"cart_id","description":"ID of a cart that a retuned item belongs to. In our E-commerce store users add items to a cart, then purchase the whole cart. Users are allowed to return as many items from a purchased cart as they want.","type":"bigint"},{"name":"item_id","description":"ID of an item that was returned.","type":"bigint"},{"name":"quantity","description":"How many items were returned.","type":"integer"},{"name":"created_at","description":"Timestamp when a return was processed.","type":"timestamp"}]}'),JSON.parse('{"name":"reviews","description":"This table contains all user reviews for individual items.","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of a review.","type":"bigint"},{"name":"item_id","description":"ID of an item that was reviewed.","type":"bigint"},{"name":"user_id","description":"ID of a user who left a review.","type":"bigint"},{"name":"rating","description":"Star rating that a user selected in a review form.","type":"integer"},{"name":"created_at","description":"Timestamp when a user left a review.","type":"timestamp"},{"name":"feedback","description":"Text feedback that a user types in a review form.","type":"text"}]}'),JSON.parse('{"name":"users","description":"This table contains all user records (accounts).","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of a user.","type":"bigint"},{"name":"email","description":"User\'s email.","type":"text"},{"name":"first_name","description":"User\'s first name.","type":"text"},{"name":"last_name","description":"User\'s last name.","type":"text"},{"name":"country","description":"User\'s country (IP based).","type":"text"},{"name":"city","description":"User\'s city (IP based).","type":"text"},{"name":"created_at","description":"Timestamp when a user created an account.","type":"timestamp"}]}'),JSON.parse('{"name":"vendors","description":"This table contains all vendors (people or companies that sell items on our E-commerce platform).","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of a vendor.","type":"bigint"},{"name":"name","description":"Vendor\'s name (person or company name).","type":"text"},{"name":"created_at","description":"Timestamp when a vendor started working with our E-commerce store.","type":"timestamp"}]}')]}}]);
//# sourceMappingURL=ecommerce-tables.f5264437.chunk.js.map

================================================
FILE: build/static/js/finance-edges-json.cc1c201e.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[575],{5490:function(e){e.exports=JSON.parse('[{"source":"vendors","sourceKey":"id","target":"transactions","targetKey":"vendor_id","relation":"hasMany"}]')}}]);

================================================
FILE: build/static/js/finance-schemaColors-json.e0d3a5af.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[988],{5881:function(s){s.exports=JSON.parse('{"DEFAULT":"#91C4F2","public":"#91C4F2"}')}}]);

================================================
FILE: build/static/js/finance-tablePositions-json.9ab03387.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[342],{514:function(s){s.exports=JSON.parse('{"public.transactions":{"x":192,"y":176},"public.vendors":{"x":-64,"y":240}}')}}]);

================================================
FILE: build/static/js/finance-tables.eac6da84.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[990],{8986:function(e,n,a){a.r(n),a.d(n,{default:function(){return i}});var i=[JSON.parse('{"name":"transactions","description":"This table contains transactions of all vendors.","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of a transaction.","type":"bigint"},{"name":"vendor_id","description":"ID of a vendor from the `vendors` table.","type":"bigint"},{"name":"amount_usd","description":"Transaction\'s amount in USD. Positive value indicates a **credit** transaction, negative indicates **debit** transaction.","type":"numeric"},{"name":"created_at","description":"Timestamp of a transaction.","type":"timestamp"}]}'),JSON.parse('{"name":"vendors","description":"This table contains all vendors.","schemaColor":"#91C4F2","columns":[{"name":"id","description":"Unique identifier of a vendor. A vendor can have **credit** transactions with us (pay us money) and **debit** transactions (we pay money to a vendor).","type":"bigint"},{"name":"name","description":"Vendor\'s name (could be a person or a company).","type":"text"}]}')]}}]);
//# sourceMappingURL=finance-tables.eac6da84.chunk.js.map

================================================
FILE: build/static/js/live-edges-json.849f23e8.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[961],{8140:function(e){e.exports=JSON.parse('[{"source":"products","sourceKey":"id","target":"purchases","targetKey":"product_id","relation":"hasMany"},{"source":"users","sourceKey":"id","target":"purchases","targetKey":"user_id","relation":"hasMany"},{"source":"users","sourceKey":"id","target":"trials","targetKey":"user_id","relation":"hasOne"},{"source":"products","sourceKey":"id","target":"trials","targetKey":"product_id","relation":"hasMany"},{"source":"users","sourceKey":"id","target":"users","targetKey":"referrer_id","relation":"hasMany","sourcePosition":"right","targetPosition":"right"},{"source":"users","sourceKey":"id","target":"mobile_analytics.events","targetKey":"user_id","relation":"hasMany"}]')}}]);

================================================
FILE: build/static/js/live-schemaColors-json.3efe2122.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[418],{8669:function(s){s.exports=JSON.parse('{"DEFAULT":"#91C4F2","public":"#91C4F2","mobile_analytics":"#FFD791"}')}}]);

================================================
FILE: build/static/js/live-tablePositions-json.88001c8e.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[583],{6431:function(s){s.exports=JSON.parse('{"mobile_analytics.events":{"x":784,"y":-128},"public.products":{"x":0,"y":96},"public.purchases":{"x":256,"y":-128},"public.trials":{"x":256,"y":224},"public.users":{"x":560,"y":80}}')}}]);

================================================
FILE: build/static/js/live-tables.5a699030.chunk.js
================================================
"use strict";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[752],{3456:function(e,t,i){i.r(t),i.d(t,{default:function(){return a}});var a=[JSON.parse('{"name":"products","description":"All available products (available via subscriptions or one-time payments) users can buy.","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of a product.","type":"bigint"},{"name":"name","description":"Product\'s name.","type":"text"},{"name":"price","description":"Product\'s price in USD.","type":"numeric"},{"name":"trial_days","description":"T[he number of free trial days.","type":"integer"},{"name":"renewal_period","description":"Renewal period of a subscription product: 1 for monthly, 12 for yearly.","type":"integer"}]}'),JSON.parse('{"name":"purchases","description":"This table contains all purchase records.","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of a purchase.","type":"bigint"},{"name":"user_id","description":"ID of a user who made this purchase.","type":"bigint"},{"name":"product_id","description":"ID of a purchased product.","type":"bigint"},{"name":"trial_id","description":"ID of an associated trial for a subscription product.","type":"bigint"},{"name":"amount","description":"Amount paid in USD.","type":"numeric"},{"name":"created_at","description":"Timestamp of a purchase.","type":"timestamp"},{"name":"refunded_at","description":"Timestamp of a full refund in case a user asked for it.","type":"timestamp"}]}'),JSON.parse('{"name":"trials","description":"This table contains all started trials (trials are available only for subscription products).","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of a trial.","type":"bigint"},{"name":"user_id","description":"ID of a user who started a trial.","type":"bigint"},{"name":"product_id","description":"ID of a subscription product.","type":"bigint"},{"name":"started_at","description":"Timestamp when a user started a trial.","type":"timestamp"},{"name":"cancelled_at","description":"Timestamp when a user cancelled a trial.","type":"timestamp"},{"name":"finished_at","description":"Timestamp when a trial was finished and a purchase was made (user was automatically charged the product\'s price).","type":"timestamp"}]}'),JSON.parse('{"name":"users","description":"This table contains all user records (accounts).","schemaColor":"#91C4F2","columns":[{"name":"id","key":true,"description":"Unique identifier of a user.","type":"bigint"},{"name":"referrer_id","description":"id of another user who invited this user.","type":"bigint"},{"name":"first_name","description":"User\'s first name.","type":"text"},{"name":"last_name","description":"User\'s last name.","type":"text"},{"name":"email","description":"User\'s email.","type":"text"},{"name":"country","description":"User\'s country (IP based).","type":"text"},{"name":"city","description":"User\'s city (IP based).","type":"text"},{"name":"age","description":"User\'s age.","type":"integer"},{"name":"timezone","description":"User\'s timezone. Don\'t forget that all timestamps are in UTC.","type":"text"},{"name":"utc_offset","description":"User\'s timezone offset from UTC.","type":"integer"},{"name":"created_at","description":"Timestamp when a user created an account.","type":"timestamp"}]}'),JSON.parse('{"schema":"mobile_analytics","name":"events","description":"This analytics table contains all events tracked in the Meditation iOS app.","columns":[{"name":"id","description":"Unique identifier of an event.","type":"bigint","key":true},{"name":"category","description":"Category parameter of an event, for example onboarding.","type":"text"},{"name":"action","description":"Action parameter of an event, for example screenview.","type":"text"},{"name":"name","description":"Name parameter of an event, for example bindle-content.","type":"text"},{"name":"screen_resolution","description":"Resolution of a user\u2019s smartphone, for example 375x812.","type":"text"},{"name":"device_type","description":"Model of a user\u2019s smartphone and the version of the OS, for example iPhone 15 Pro,17.0","type":"text"},{"name":"user_id","description":"ID of a user in the users table.","type":"integer"},{"name":"country","description":"Country derived from user\u2019s IP address.","type":"text"},{"name":"custom_parameters","description":"All custom parameters of an even in a key-value format.","type":"JSON"},{"name":"created_at","description":"Timestamp of an event.","type":"datetime"}]}')]}}]);
//# sourceMappingURL=live-tables.5a699030.chunk.js.map

================================================
FILE: build/static/js/main.33dfc6b0.js
================================================
/*! For license information please see main.33dfc6b0.js.LICENSE.txt */
!function(){var e={6927:function(e,t,n){"use strict";function r(e){var t=Array.prototype.slice.call(arguments,1);return t.forEach((function(t){t&&Object.keys(t).forEach((function(n){e[n]=t[n]}))})),e}function o(e){return Object.prototype.toString.call(e)}function i(e){return"[object Function]"===o(e)}function a(e){return e.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}var l={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1};var s={"http:":{validate:function(e,t,n){var r=e.slice(t);return n.re.http||(n.re.http=new RegExp("^\\/\\/"+n.re.src_auth+n.re.src_host_port_strict+n.re.src_path,"i")),n.re.http.test(r)?r.match(n.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(e,t,n){var r=e.slice(t);return n.re.no_http||(n.re.no_http=new RegExp("^"+n.re.src_auth+"(?:localhost|(?:(?:"+n.re.src_domain+")\\.)+"+n.re.src_domain_root+")"+n.re.src_port+n.re.src_host_terminator+n.re.src_path,"i")),n.re.no_http.test(r)?t>=3&&":"===e[t-3]||t>=3&&"/"===e[t-3]?0:r.match(n.re.no_http)[0].length:0}},"mailto:":{validate:function(e,t,n){var r=e.slice(t);return n.re.mailto||(n.re.mailto=new RegExp("^"+n.re.src_email_name+"@"+n.re.src_host_strict,"i")),n.re.mailto.test(r)?r.match(n.re.mailto)[0].length:0}}},u="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444".split("|");function c(e){var t=e.re=n(1875)(e.__opts__),r=e.__tlds__.slice();function l(e){return e.replace("%TLDS%",t.src_tlds)}e.onCompile(),e.__tlds_replaced__||r.push("a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]"),r.push(t.src_xn),t.src_tlds=r.join("|"),t.email_fuzzy=RegExp(l(t.tpl_email_fuzzy),"i"),t.link_fuzzy=RegExp(l(t.tpl_link_fuzzy),"i"),t.link_no_ip_fuzzy=RegExp(l(t.tpl_link_no_ip_fuzzy),"i"),t.host_fuzzy_test=RegExp(l(t.tpl_host_fuzzy_test),"i");var s=[];function u(e,t){throw new Error('(LinkifyIt) Invalid schema "'+e+'": '+t)}e.__compiled__={},Object.keys(e.__schemas__).forEach((function(t){var n=e.__schemas__[t];if(null!==n){var r={validate:null,link:null};if(e.__compiled__[t]=r,"[object Object]"===o(n))return!function(e){return"[object RegExp]"===o(e)}(n.validate)?i(n.validate)?r.validate=n.validate:u(t,n):r.validate=function(e){return function(t,n){var r=t.slice(n);return e.test(r)?r.match(e)[0].length:0}}(n.validate),void(i(n.normalize)?r.normalize=n.normalize:n.normalize?u(t,n):r.normalize=function(e,t){t.normalize(e)});!function(e){return"[object String]"===o(e)}(n)?u(t,n):s.push(t)}})),s.forEach((function(t){e.__compiled__[e.__schemas__[t]]&&(e.__compiled__[t].validate=e.__compiled__[e.__schemas__[t]].validate,e.__compiled__[t].normalize=e.__compiled__[e.__schemas__[t]].normalize)})),e.__compiled__[""]={validate:null,normalize:function(e,t){t.normalize(e)}};var c=Object.keys(e.__compiled__).filter((function(t){return t.length>0&&e.__compiled__[t]})).map(a).join("|");e.re.schema_test=RegExp("(^|(?!_)(?:[><\uff5c]|"+t.src_ZPCc+"))("+c+")","i"),e.re.schema_search=RegExp("(^|(?!_)(?:[><\uff5c]|"+t.src_ZPCc+"))("+c+")","ig"),e.re.schema_at_start=RegExp("^"+e.re.schema_search.source,"i"),e.re.pretest=RegExp("("+e.re.schema_test.source+")|("+e.re.host_fuzzy_test.source+")|@","i"),function(e){e.__index__=-1,e.__text_cache__=""}(e)}function d(e,t){var n=e.__index__,r=e.__last_index__,o=e.__text_cache__.slice(n,r);this.schema=e.__schema__.toLowerCase(),this.index=n+t,this.lastIndex=r+t,this.raw=o,this.text=o,this.url=o}function f(e,t){var n=new d(e,t);return e.__compiled__[n.schema].normalize(n,e),n}function h(e,t){if(!(this instanceof h))return new h(e,t);var n;t||(n=e,Object.keys(n||{}).reduce((function(e,t){return e||l.hasOwnProperty(t)}),!1)&&(t=e,e={})),this.__opts__=r({},l,t),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=r({},s,e),this.__compiled__={},this.__tlds__=u,this.__tlds_replaced__=!1,this.re={},c(this)}h.prototype.add=function(e,t){return this.__schemas__[e]=t,c(this),this},h.prototype.set=function(e){return this.__opts__=r(this.__opts__,e),this},h.prototype.test=function(e){if(this.__text_cache__=e,this.__index__=-1,!e.length)return!1;var t,n,r,o,i,a,l,s;if(this.re.schema_test.test(e))for((l=this.re.schema_search).lastIndex=0;null!==(t=l.exec(e));)if(o=this.testSchemaAt(e,t[2],l.lastIndex)){this.__schema__=t[2],this.__index__=t.index+t[1].length,this.__last_index__=t.index+t[0].length+o;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(s=e.search(this.re.host_fuzzy_test))>=0&&(this.__index__<0||s<this.__index__)&&null!==(n=e.match(this.__opts__.fuzzyIP?this.re.link_fuzzy:this.re.link_no_ip_fuzzy))&&(i=n.index+n[1].length,(this.__index__<0||i<this.__index__)&&(this.__schema__="",this.__index__=i,this.__last_index__=n.index+n[0].length)),this.__opts__.fuzzyEmail&&this.__compiled__["mailto:"]&&e.indexOf("@")>=0&&null!==(r=e.match(this.re.email_fuzzy))&&(i=r.index+r[1].length,a=r.index+r[0].length,(this.__index__<0||i<this.__index__||i===this.__index__&&a>this.__last_index__)&&(this.__schema__="mailto:",this.__index__=i,this.__last_index__=a)),this.__index__>=0},h.prototype.pretest=function(e){return this.re.pretest.test(e)},h.prototype.testSchemaAt=function(e,t,n){return this.__compiled__[t.toLowerCase()]?this.__compiled__[t.toLowerCase()].validate(e,n,this):0},h.prototype.match=function(e){var t=0,n=[];this.__index__>=0&&this.__text_cache__===e&&(n.push(f(this,t)),t=this.__last_index__);for(var r=t?e.slice(t):e;this.test(r);)n.push(f(this,t)),r=r.slice(this.__last_index__),t+=this.__last_index__;return n.length?n:null},h.prototype.matchAtStart=function(e){if(this.__text_cache__=e,this.__index__=-1,!e.length)return null;var t=this.re.schema_at_start.exec(e);if(!t)return null;var n=this.testSchemaAt(e,t[2],t[0].length);return n?(this.__schema__=t[2],this.__index__=t.index+t[1].length,this.__last_index__=t.index+t[0].length+n,f(this,0)):null},h.prototype.tlds=function(e,t){return e=Array.isArray(e)?e:[e],t?(this.__tlds__=this.__tlds__.concat(e).sort().filter((function(e,t,n){return e!==n[t-1]})).reverse(),c(this),this):(this.__tlds__=e.slice(),this.__tlds_replaced__=!0,c(this),this)},h.prototype.normalize=function(e){e.schema||(e.url="http://"+e.url),"mailto:"!==e.schema||/^mailto:/i.test(e.url)||(e.url="mailto:"+e.url)},h.prototype.onCompile=function(){},e.exports=h},1875:function(e,t,n){"use strict";e.exports=function(e){var t={};e=e||{},t.src_Any=n(5510).source,t.src_Cc=n(538).source,t.src_Z=n(2426).source,t.src_P=n(3741).source,t.src_ZPCc=[t.src_Z,t.src_P,t.src_Cc].join("|"),t.src_ZCc=[t.src_Z,t.src_Cc].join("|");var r="[><\uff5c]";return t.src_pseudo_letter="(?:(?![><\uff5c]|"+t.src_ZPCc+")"+t.src_Any+")",t.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",t.src_auth="(?:(?:(?!"+t.src_ZCc+"|[@/\\[\\]()]).)+@)?",t.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",t.src_host_terminator="(?=$|[><\uff5c]|"+t.src_ZPCc+")(?!"+(e["---"]?"-(?!--)|":"-|")+"_|:\\d|\\.-|\\.(?!$|"+t.src_ZPCc+"))",t.src_path="(?:[/?#](?:(?!"+t.src_ZCc+"|"+r+"|[()[\\]{}.,\"'?!\\-;]).|\\[(?:(?!"+t.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+t.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+t.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+t.src_ZCc+'|["]).)+\\"|\\\'(?:(?!'+t.src_ZCc+"|[']).)+\\'|\\'(?="+t.src_pseudo_letter+"|[-])|\\.{2,}[a-zA-Z0-9%/&]|\\.(?!"+t.src_ZCc+"|[.]|$)|"+(e["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+",(?!"+t.src_ZCc+"|$)|;(?!"+t.src_ZCc+"|$)|\\!+(?!"+t.src_ZCc+"|[!]|$)|\\?(?!"+t.src_ZCc+"|[?]|$))+|\\/)?",t.src_email_name='[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*',t.src_xn="xn--[a-z0-9\\-]{1,59}",t.src_domain_root="(?:"+t.src_xn+"|"+t.src_pseudo_letter+"{1,63})",t.src_domain="(?:"+t.src_xn+"|(?:"+t.src_pseudo_letter+")|(?:"+t.src_pseudo_letter+"(?:-|"+t.src_pseudo_letter+"){0,61}"+t.src_pseudo_letter+"))",t.src_host="(?:(?:(?:(?:"+t.src_domain+")\\.)*"+t.src_domain+"))",t.tpl_host_fuzzy="(?:"+t.src_ip4+"|(?:(?:(?:"+t.src_domain+")\\.)+(?:%TLDS%)))",t.tpl_host_no_ip_fuzzy="(?:(?:(?:"+t.src_domain+")\\.)+(?:%TLDS%))",t.src_host_strict=t.src_host+t.src_host_terminator,t.tpl_host_fuzzy_strict=t.tpl_host_fuzzy+t.src_host_terminator,t.src_host_port_strict=t.src_host+t.src_port+t.src_host_terminator,t.tpl_host_port_fuzzy_strict=t.tpl_host_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_port_no_ip_fuzzy_strict=t.tpl_host_no_ip_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+t.src_ZPCc+"|>|$))",t.tpl_email_fuzzy='(^|[><\uff5c]|"|\\(|'+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|"+t.src_ZPCc+"))((?![$+<=>^`|\uff5c])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|"+t.src_ZPCc+"))((?![$+<=>^`|\uff5c])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t}},3534:function(e,t,n){"use strict";e.exports=n(9890)},1285:function(e,t,n){"use strict";e.exports=n(9323)},1437:function(e){"use strict";e.exports=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","section","source","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"]},5850:function(e){"use strict";var t="<[A-Za-z][A-Za-z0-9\\-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^\"'=<>`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>",n="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",r=new RegExp("^(?:"+t+"|"+n+"|\x3c!----\x3e|\x3c!--(?:-?[^>-])(?:-?[^-])*--\x3e|<[?][\\s\\S]*?[?]>|<![A-Z]+\\s+[^>]*>|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>)"),o=new RegExp("^(?:"+t+"|"+n+")");e.exports.n=r,e.exports.q=o},786:function(e,t,n){"use strict";var r=Object.prototype.hasOwnProperty;function o(e,t){return r.call(e,t)}function i(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!==(65535&e)&&65534!==(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function a(e){if(e>65535){var t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}var l=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,s=new RegExp(l.source+"|"+/&([a-z#][a-z0-9]{1,31});/gi.source,"gi"),u=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,c=n(1285);var d=/[&<>"]/,f=/[&<>"]/g,h={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"};function p(e){return h[e]}var m=/[.?*+^$[\]\\(){}|-]/g;var g=n(3741);t.lib={},t.lib.mdurl=n(3461),t.lib.ucmicro=n(6937),t.assign=function(e){var t=Array.prototype.slice.call(arguments,1);return t.forEach((function(t){if(t){if("object"!==typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach((function(n){e[n]=t[n]}))}})),e},t.isString=function(e){return"[object String]"===function(e){return Object.prototype.toString.call(e)}(e)},t.has=o,t.unescapeMd=function(e){return e.indexOf("\\")<0?e:e.replace(l,"$1")},t.unescapeAll=function(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(s,(function(e,t,n){return t||function(e,t){var n=0;return o(c,t)?c[t]:35===t.charCodeAt(0)&&u.test(t)&&i(n="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?a(n):e}(e,n)}))},t.isValidEntityCode=i,t.fromCodePoint=a,t.escapeHtml=function(e){return d.test(e)?e.replace(f,p):e},t.arrayReplaceAt=function(e,t,n){return[].concat(e.slice(0,t),n,e.slice(t+1))},t.isSpace=function(e){switch(e){case 9:case 32:return!0}return!1},t.isWhiteSpace=function(e){if(e>=8192&&e<=8202)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1},t.isMdAsciiPunct=function(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}},t.isPunctChar=function(e){return g.test(e)},t.escapeRE=function(e){return e.replace(m,"\\$&")},t.normalizeReference=function(e){return e=e.trim().replace(/\s+/g," "),"\u1e7e"==="\u1e9e".toLowerCase()&&(e=e.replace(/\u1e9e/g,"\xdf")),e.toLowerCase().toUpperCase()}},4937:function(e,t,n){"use strict";t.parseLinkLabel=n(9162),t.parseLinkDestination=n(9738),t.parseLinkTitle=n(4890)},9738:function(e,t,n){"use strict";var r=n(786).unescapeAll;e.exports=function(e,t,n){var o,i,a=t,l={ok:!1,pos:0,lines:0,str:""};if(60===e.charCodeAt(t)){for(t++;t<n;){if(10===(o=e.charCodeAt(t)))return l;if(60===o)return l;if(62===o)return l.pos=t+1,l.str=r(e.slice(a+1,t)),l.ok=!0,l;92===o&&t+1<n?t+=2:t++}return l}for(i=0;t<n&&32!==(o=e.charCodeAt(t))&&!(o<32||127===o);)if(92===o&&t+1<n){if(32===e.charCodeAt(t+1))break;t+=2}else{if(40===o&&++i>32)return l;if(41===o){if(0===i)break;i--}t++}return a===t||0!==i||(l.str=r(e.slice(a,t)),l.lines=0,l.pos=t,l.ok=!0),l}},9162:function(e){"use strict";e.exports=function(e,t,n){var r,o,i,a,l=-1,s=e.posMax,u=e.pos;for(e.pos=t+1,r=1;e.pos<s;){if(93===(i=e.src.charCodeAt(e.pos))&&0===--r){o=!0;break}if(a=e.pos,e.md.inline.skipToken(e),91===i)if(a===e.pos-1)r++;else if(n)return e.pos=u,-1}return o&&(l=e.pos),e.pos=u,l}},4890:function(e,t,n){"use strict";var r=n(786).unescapeAll;e.exports=function(e,t,n){var o,i,a=0,l=t,s={ok:!1,pos:0,lines:0,str:""};if(t>=n)return s;if(34!==(i=e.charCodeAt(t))&&39!==i&&40!==i)return s;for(t++,40===i&&(i=41);t<n;){if((o=e.charCodeAt(t))===i)return s.pos=t+1,s.lines=a,s.str=r(e.slice(l+1,t)),s.ok=!0,s;if(40===o&&41===i)return s;10===o?a++:92===o&&t+1<n&&(t++,10===e.charCodeAt(t)&&a++),t++}return s}},9890:function(e,t,n){"use strict";var r=n(786),o=n(4937),i=n(6843),a=n(2205),l=n(7782),s=n(4871),u=n(6927),c=n(3461),d=n(6293),f={default:n(1349),zero:n(7578),commonmark:n(6389)},h=/^(vbscript|javascript|file|data):/,p=/^data:image\/(gif|png|jpeg|webp);/;function m(e){var t=e.trim().toLowerCase();return!h.test(t)||!!p.test(t)}var g=["http:","https:","mailto:"];function v(e){var t=c.parse(e,!0);if(t.hostname&&(!t.protocol||g.indexOf(t.protocol)>=0))try{t.hostname=d.toASCII(t.hostname)}catch(n){}return c.encode(c.format(t))}function y(e){var t=c.parse(e,!0);if(t.hostname&&(!t.protocol||g.indexOf(t.protocol)>=0))try{t.hostname=d.toUnicode(t.hostname)}catch(n){}return c.decode(c.format(t),c.decode.defaultChars+"%")}function b(e,t){if(!(this instanceof b))return new b(e,t);t||r.isString(e)||(t=e||{},e="default"),this.inline=new s,this.block=new l,this.core=new a,this.renderer=new i,this.linkify=new u,this.validateLink=m,this.normalizeLink=v,this.normalizeLinkText=y,this.utils=r,this.helpers=r.assign({},o),this.options={},this.configure(e),t&&this.set(t)}b.prototype.set=function(e){return r.assign(this.options,e),this},b.prototype.configure=function(e){var t,n=this;if(r.isString(e)&&!(e=f[t=e]))throw new Error('Wrong `markdown-it` preset "'+t+'", check name');if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&n.set(e.options),e.components&&Object.keys(e.components).forEach((function(t){e.components[t].rules&&n[t].ruler.enableOnly(e.components[t].rules),e.components[t].rules2&&n[t].ruler2.enableOnly(e.components[t].rules2)})),this},b.prototype.enable=function(e,t){var n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach((function(t){n=n.concat(this[t].ruler.enable(e,!0))}),this),n=n.concat(this.inline.ruler2.enable(e,!0));var r=e.filter((function(e){return n.indexOf(e)<0}));if(r.length&&!t)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+r);return this},b.prototype.disable=function(e,t){var n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach((function(t){n=n.concat(this[t].ruler.disable(e,!0))}),this),n=n.concat(this.inline.ruler2.disable(e,!0));var r=e.filter((function(e){return n.indexOf(e)<0}));if(r.length&&!t)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+r);return this},b.prototype.use=function(e){var t=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,t),this},b.prototype.parse=function(e,t){if("string"!==typeof e)throw new Error("Input data should be a String");var n=new this.core.State(e,this,t);return this.core.process(n),n.tokens},b.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)},b.prototype.parseInline=function(e,t){var n=new this.core.State(e,this,t);return n.inlineMode=!0,this.core.process(n),n.tokens},b.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)},e.exports=b},7782:function(e,t,n){"use strict";var r=n(8674),o=[["table",n(9399),["paragraph","reference"]],["code",n(5078)],["fence",n(1077),["paragraph","reference","blockquote","list"]],["blockquote",n(9224),["paragraph","reference","blockquote","list"]],["hr",n(7542),["paragraph","reference","blockquote","list"]],["list",n(7168),["paragraph","reference","blockquote"]],["reference",n(9277)],["html_block",n(5672),["paragraph","reference","blockquote"]],["heading",n(969),["paragraph","reference","blockquote"]],["lheading",n(7671)],["paragraph",n(6572)]];function i(){this.ruler=new r;for(var e=0;e<o.length;e++)this.ruler.push(o[e][0],o[e][1],{alt:(o[e][2]||[]).slice()})}i.prototype.tokenize=function(e,t,n){for(var r,o=this.ruler.getRules(""),i=o.length,a=t,l=!1,s=e.md.options.maxNesting;a<n&&(e.line=a=e.skipEmptyLines(a),!(a>=n))&&!(e.sCount[a]<e.blkIndent);){if(e.level>=s){e.line=n;break}for(r=0;r<i&&!o[r](e,a,n,!1);r++);e.tight=!l,e.isEmpty(e.line-1)&&(l=!0),(a=e.line)<n&&e.isEmpty(a)&&(l=!0,a++,e.line=a)}},i.prototype.parse=function(e,t,n,r){var o;e&&(o=new this.State(e,t,n,r),this.tokenize(o,o.line,o.lineMax))},i.prototype.State=n(2007),e.exports=i},2205:function(e,t,n){"use strict";var r=n(8674),o=[["normalize",n(710)],["block",n(2486)],["inline",n(7557)],["linkify",n(6716)],["replacements",n(904)],["smartquotes",n(6991)],["text_join",n(9528)]];function i(){this.ruler=new r;for(var e=0;e<o.length;e++)this.ruler.push(o[e][0],o[e][1])}i.prototype.process=function(e){var t,n,r;for(t=0,n=(r=this.ruler.getRules("")).length;t<n;t++)r[t](e)},i.prototype.State=n(3311),e.exports=i},4871:function(e,t,n){"use strict";var r=n(8674),o=[["text",n(6537)],["linkify",n(7697)],["newline",n(6179)],["escape",n(4072)],["backticks",n(7860)],["strikethrough",n(333).w],["emphasis",n(3650).w],["link",n(9384)],["image",n(1677)],["autolink",n(3657)],["html_inline",n(8286)],["entity",n(4514)]],i=[["balance_pairs",n(5381)],["strikethrough",n(333).g],["emphasis",n(3650).g],["fragments_join",n(1783)]];function a(){var e;for(this.ruler=new r,e=0;e<o.length;e++)this.ruler.push(o[e][0],o[e][1]);for(this.ruler2=new r,e=0;e<i.length;e++)this.ruler2.push(i[e][0],i[e][1])}a.prototype.skipToken=function(e){var t,n,r=e.pos,o=this.ruler.getRules(""),i=o.length,a=e.md.options.maxNesting,l=e.cache;if("undefined"===typeof l[r]){if(e.level<a)for(n=0;n<i&&(e.level++,t=o[n](e,!0),e.level--,!t);n++);else e.pos=e.posMax;t||e.pos++,l[r]=e.pos}else e.pos=l[r]},a.prototype.tokenize=function(e){for(var t,n,r=this.ruler.getRules(""),o=r.length,i=e.posMax,a=e.md.options.maxNesting;e.pos<i;){if(e.level<a)for(n=0;n<o&&!(t=r[n](e,!1));n++);if(t){if(e.pos>=i)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},a.prototype.parse=function(e,t,n,r){var o,i,a,l=new this.State(e,t,n,r);for(this.tokenize(l),a=(i=this.ruler2.getRules("")).length,o=0;o<a;o++)i[o](l)},a.prototype.State=n(9402),e.exports=a},6389:function(e){"use strict";e.exports={options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"\u201c\u201d\u2018\u2019",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline","text_join"]},block:{rules:["blockquote","code","fence","heading","hr","html_block","lheading","list","reference","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","html_inline","image","link","newline","text"],rules2:["balance_pairs","emphasis","fragments_join"]}}}},1349:function(e){"use strict";e.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"\u201c\u201d\u2018\u2019",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}}},7578:function(e){"use strict";e.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"\u201c\u201d\u2018\u2019",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline","text_join"]},block:{rules:["paragraph"]},inline:{rules:["text"],rules2:["balance_pairs","fragments_join"]}}}},6843:function(e,t,n){"use strict";var r=n(786).assign,o=n(786).unescapeAll,i=n(786).escapeHtml,a={};function l(){this.rules=r({},a)}a.code_inline=function(e,t,n,r,o){var a=e[t];return"<code"+o.renderAttrs(a)+">"+i(e[t].content)+"</code>"},a.code_block=function(e,t,n,r,o){var a=e[t];return"<pre"+o.renderAttrs(a)+"><code>"+i(e[t].content)+"</code></pre>\n"},a.fence=function(e,t,n,r,a){var l,s,u,c,d,f=e[t],h=f.info?o(f.info).trim():"",p="",m="";return h&&(p=(u=h.split(/(\s+)/g))[0],m=u.slice(2).join("")),0===(l=n.highlight&&n.highlight(f.content,p,m)||i(f.content)).indexOf("<pre")?l+"\n":h?(s=f.attrIndex("class"),c=f.attrs?f.attrs.slice():[],s<0?c.push(["class",n.langPrefix+p]):(c[s]=c[s].slice(),c[s][1]+=" "+n.langPrefix+p),d={attrs:c},"<pre><code"+a.renderAttrs(d)+">"+l+"</code></pre>\n"):"<pre><code"+a.renderAttrs(f)+">"+l+"</code></pre>\n"},a.image=function(e,t,n,r,o){var i=e[t];return i.attrs[i.attrIndex("alt")][1]=o.renderInlineAsText(i.children,n,r),o.renderToken(e,t,n)},a.hardbreak=function(e,t,n){return n.xhtmlOut?"<br />\n":"<br>\n"},a.softbreak=function(e,t,n){return n.breaks?n.xhtmlOut?"<br />\n":"<br>\n":"\n"},a.text=function(e,t){return i(e[t].content)},a.html_block=function(e,t){return e[t].content},a.html_inline=function(e,t){return e[t].content},l.prototype.renderAttrs=function(e){var t,n,r;if(!e.attrs)return"";for(r="",t=0,n=e.attrs.length;t<n;t++)r+=" "+i(e.attrs[t][0])+'="'+i(e.attrs[t][1])+'"';return r},l.prototype.renderToken=function(e,t,n){var r,o="",i=!1,a=e[t];return a.hidden?"":(a.block&&-1!==a.nesting&&t&&e[t-1].hidden&&(o+="\n"),o+=(-1===a.nesting?"</":"<")+a.tag,o+=this.renderAttrs(a),0===a.nesting&&n.xhtmlOut&&(o+=" /"),a.block&&(i=!0,1===a.nesting&&t+1<e.length&&("inline"===(r=e[t+1]).type||r.hidden||-1===r.nesting&&r.tag===a.tag)&&(i=!1)),o+=i?">\n":">")},l.prototype.renderInline=function(e,t,n){for(var r,o="",i=this.rules,a=0,l=e.length;a<l;a++)"undefined"!==typeof i[r=e[a].type]?o+=i[r](e,a,t,n,this):o+=this.renderToken(e,a,t);return o},l.prototype.renderInlineAsText=function(e,t,n){for(var r="",o=0,i=e.length;o<i;o++)"text"===e[o].type?r+=e[o].content:"image"===e[o].type?r+=this.renderInlineAsText(e[o].children,t,n):"softbreak"===e[o].type&&(r+="\n");return r},l.prototype.render=function(e,t,n){var r,o,i,a="",l=this.rules;for(r=0,o=e.length;r<o;r++)"inline"===(i=e[r].type)?a+=this.renderInline(e[r].children,t,n):"undefined"!==typeof l[i]?a+=l[e[r].type](e,r,t,n,this):a+=this.renderToken(e,r,t,n);return a},e.exports=l},8674:function(e){"use strict";function t(){this.__rules__=[],this.__cache__=null}t.prototype.__find__=function(e){for(var t=0;t<this.__rules__.length;t++)if(this.__rules__[t].name===e)return t;return-1},t.prototype.__compile__=function(){var e=this,t=[""];e.__rules__.forEach((function(e){e.enabled&&e.alt.forEach((function(e){t.indexOf(e)<0&&t.push(e)}))})),e.__cache__={},t.forEach((function(t){e.__cache__[t]=[],e.__rules__.forEach((function(n){n.enabled&&(t&&n.alt.indexOf(t)<0||e.__cache__[t].push(n.fn))}))}))},t.prototype.at=function(e,t,n){var r=this.__find__(e),o=n||{};if(-1===r)throw new Error("Parser rule not found: "+e);this.__rules__[r].fn=t,this.__rules__[r].alt=o.alt||[],this.__cache__=null},t.prototype.before=function(e,t,n,r){var o=this.__find__(e),i=r||{};if(-1===o)throw new Error("Parser rule not found: "+e);this.__rules__.splice(o,0,{name:t,enabled:!0,fn:n,alt:i.alt||[]}),this.__cache__=null},t.prototype.after=function(e,t,n,r){var o=this.__find__(e),i=r||{};if(-1===o)throw new Error("Parser rule not found: "+e);this.__rules__.splice(o+1,0,{name:t,enabled:!0,fn:n,alt:i.alt||[]}),this.__cache__=null},t.prototype.push=function(e,t,n){var r=n||{};this.__rules__.push({name:e,enabled:!0,fn:t,alt:r.alt||[]}),this.__cache__=null},t.prototype.enable=function(e,t){Array.isArray(e)||(e=[e]);var n=[];return e.forEach((function(e){var r=this.__find__(e);if(r<0){if(t)return;throw new Error("Rules manager: invalid rule name "+e)}this.__rules__[r].enabled=!0,n.push(e)}),this),this.__cache__=null,n},t.prototype.enableOnly=function(e,t){Array.isArray(e)||(e=[e]),this.__rules__.forEach((function(e){e.enabled=!1})),this.enable(e,t)},t.prototype.disable=function(e,t){Array.isArray(e)||(e=[e]);var n=[];return e.forEach((function(e){var r=this.__find__(e);if(r<0){if(t)return;throw new Error("Rules manager: invalid rule name "+e)}this.__rules__[r].enabled=!1,n.push(e)}),this),this.__cache__=null,n},t.prototype.getRules=function(e){return null===this.__cache__&&this.__compile__(),this.__cache__[e]||[]},e.exports=t},9224:function(e,t,n){"use strict";var r=n(786).isSpace;e.exports=function(e,t,n,o){var i,a,l,s,u,c,d,f,h,p,m,g,v,y,b,w,x,k,_,S,C=e.lineMax,E=e.bMarks[t]+e.tShift[t],N=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;if(62!==e.src.charCodeAt(E++))return!1;if(o)return!0;for(s=h=e.sCount[t]+1,32===e.src.charCodeAt(E)?(E++,s++,h++,i=!1,w=!0):9===e.src.charCodeAt(E)?(w=!0,(e.bsCount[t]+h)%4===3?(E++,s++,h++,i=!1):i=!0):w=!1,p=[e.bMarks[t]],e.bMarks[t]=E;E<N&&(a=e.src.charCodeAt(E),r(a));)9===a?h+=4-(h+e.bsCount[t]+(i?1:0))%4:h++,E++;for(m=[e.bsCount[t]],e.bsCount[t]=e.sCount[t]+1+(w?1:0),c=E>=N,y=[e.sCount[t]],e.sCount[t]=h-s,b=[e.tShift[t]],e.tShift[t]=E-e.bMarks[t],k=e.md.block.ruler.getRules("blockquote"),v=e.parentType,e.parentType="blockquote",f=t+1;f<n&&(S=e.sCount[f]<e.blkIndent,!((E=e.bMarks[f]+e.tShift[f])>=(N=e.eMarks[f])));f++)if(62!==e.src.charCodeAt(E++)||S){if(c)break;for(x=!1,l=0,u=k.length;l<u;l++)if(k[l](e,f,n,!0)){x=!0;break}if(x){e.lineMax=f,0!==e.blkIndent&&(p.push(e.bMarks[f]),m.push(e.bsCount[f]),b.push(e.tShift[f]),y.push(e.sCount[f]),e.sCount[f]-=e.blkIndent);break}p.push(e.bMarks[f]),m.push(e.bsCount[f]),b.push(e.tShift[f]),y.push(e.sCount[f]),e.sCount[f]=-1}else{for(s=h=e.sCount[f]+1,32===e.src.charCodeAt(E)?(E++,s++,h++,i=!1,w=!0):9===e.src.charCodeAt(E)?(w=!0,(e.bsCount[f]+h)%4===3?(E++,s++,h++,i=!1):i=!0):w=!1,p.push(e.bMarks[f]),e.bMarks[f]=E;E<N&&(a=e.src.charCodeAt(E),r(a));)9===a?h+=4-(h+e.bsCount[f]+(i?1:0))%4:h++,E++;c=E>=N,m.push(e.bsCount[f]),e.bsCount[f]=e.sCount[f]+1+(w?1:0),y.push(e.sCount[f]),e.sCount[f]=h-s,b.push(e.tShift[f]),e.tShift[f]=E-e.bMarks[f]}for(g=e.blkIndent,e.blkIndent=0,(_=e.push("blockquote_open","blockquote",1)).markup=">",_.map=d=[t,0],e.md.block.tokenize(e,t,f),(_=e.push("blockquote_close","blockquote",-1)).markup=">",e.lineMax=C,e.parentType=v,d[1]=e.line,l=0;l<b.length;l++)e.bMarks[l+t]=p[l],e.tShift[l+t]=b[l],e.sCount[l+t]=y[l],e.bsCount[l+t]=m[l];return e.blkIndent=g,!0}},5078:function(e){"use strict";e.exports=function(e,t,n){var r,o,i;if(e.sCount[t]-e.blkIndent<4)return!1;for(o=r=t+1;r<n;)if(e.isEmpty(r))r++;else{if(!(e.sCount[r]-e.blkIndent>=4))break;o=++r}return e.line=o,(i=e.push("code_block","code",0)).content=e.getLines(t,o,4+e.blkIndent,!1)+"\n",i.map=[t,e.line],!0}},1077:function(e){"use strict";e.exports=function(e,t,n,r){var o,i,a,l,s,u,c,d=!1,f=e.bMarks[t]+e.tShift[t],h=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;if(f+3>h)return!1;if(126!==(o=e.src.charCodeAt(f))&&96!==o)return!1;if(s=f,(i=(f=e.skipChars(f,o))-s)<3)return!1;if(c=e.src.slice(s,f),a=e.src.slice(f,h),96===o&&a.indexOf(String.fromCharCode(o))>=0)return!1;if(r)return!0;for(l=t;!(++l>=n)&&!((f=s=e.bMarks[l]+e.tShift[l])<(h=e.eMarks[l])&&e.sCount[l]<e.blkIndent);)if(e.src.charCodeAt(f)===o&&!(e.sCount[l]-e.blkIndent>=4)&&!((f=e.skipChars(f,o))-s<i)&&!((f=e.skipSpaces(f))<h)){d=!0;break}return i=e.sCount[t],e.line=l+(d?1:0),(u=e.push("fence","code",0)).info=a,u.content=e.getLines(t+1,l,i,!0),u.markup=c,u.map=[t,e.line],!0}},969:function(e,t,n){"use strict";var r=n(786).isSpace;e.exports=function(e,t,n,o){var i,a,l,s,u=e.bMarks[t]+e.tShift[t],c=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;if(35!==(i=e.src.charCodeAt(u))||u>=c)return!1;for(a=1,i=e.src.charCodeAt(++u);35===i&&u<c&&a<=6;)a++,i=e.src.charCodeAt(++u);return!(a>6||u<c&&!r(i))&&(o||(c=e.skipSpacesBack(c,u),(l=e.skipCharsBack(c,35,u))>u&&r(e.src.charCodeAt(l-1))&&(c=l),e.line=t+1,(s=e.push("heading_open","h"+String(a),1)).markup="########".slice(0,a),s.map=[t,e.line],(s=e.push("inline","",0)).content=e.src.slice(u,c).trim(),s.map=[t,e.line],s.children=[],(s=e.push("heading_close","h"+String(a),-1)).markup="########".slice(0,a)),!0)}},7542:function(e,t,n){"use strict";var r=n(786).isSpace;e.exports=function(e,t,n,o){var i,a,l,s,u=e.bMarks[t]+e.tShift[t],c=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;if(42!==(i=e.src.charCodeAt(u++))&&45!==i&&95!==i)return!1;for(a=1;u<c;){if((l=e.src.charCodeAt(u++))!==i&&!r(l))return!1;l===i&&a++}return!(a<3)&&(o||(e.line=t+1,(s=e.push("hr","hr",0)).map=[t,e.line],s.markup=Array(a+1).join(String.fromCharCode(i))),!0)}},5672:function(e,t,n){"use strict";var r=n(1437),o=n(5850).q,i=[[/^<(script|pre|style|textarea)(?=(\s|>|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^<!--/,/-->/,!0],[/^<\?/,/\?>/,!0],[/^<![A-Z]/,/>/,!0],[/^<!\[CDATA\[/,/\]\]>/,!0],[new RegExp("^</?("+r.join("|")+")(?=(\\s|/?>|$))","i"),/^$/,!0],[new RegExp(o.source+"\\s*$"),/^$/,!1]];e.exports=function(e,t,n,r){var o,a,l,s,u=e.bMarks[t]+e.tShift[t],c=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;if(!e.md.options.html)return!1;if(60!==e.src.charCodeAt(u))return!1;for(s=e.src.slice(u,c),o=0;o<i.length&&!i[o][0].test(s);o++);if(o===i.length)return!1;if(r)return i[o][2];if(a=t+1,!i[o][1].test(s))for(;a<n&&!(e.sCount[a]<e.blkIndent);a++)if(u=e.bMarks[a]+e.tShift[a],c=e.eMarks[a],s=e.src.slice(u,c),i[o][1].test(s)){0!==s.length&&a++;break}return e.line=a,(l=e.push("html_block","",0)).map=[t,a],l.content=e.getLines(t,a,e.blkIndent,!0),!0}},7671:function(e){"use strict";e.exports=function(e,t,n){var r,o,i,a,l,s,u,c,d,f,h=t+1,p=e.md.block.ruler.getRules("paragraph");if(e.sCount[t]-e.blkIndent>=4)return!1;for(f=e.parentType,e.parentType="paragraph";h<n&&!e.isEmpty(h);h++)if(!(e.sCount[h]-e.blkIndent>3)){if(e.sCount[h]>=e.blkIndent&&(s=e.bMarks[h]+e.tShift[h])<(u=e.eMarks[h])&&(45===(d=e.src.charCodeAt(s))||61===d)&&(s=e.skipChars(s,d),(s=e.skipSpaces(s))>=u)){c=61===d?1:2;break}if(!(e.sCount[h]<0)){for(o=!1,i=0,a=p.length;i<a;i++)if(p[i](e,h,n,!0)){o=!0;break}if(o)break}}return!!c&&
Download .txt
gitextract_3ikh_njc/

├── .github/
│   └── workflows/
│       └── deploy.yml
├── .gitignore
├── .npmrc
├── .nvmrc
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── bin/
│   ├── create_db_pages
│   ├── import
│   └── reset
├── build/
│   ├── asset-manifest.json
│   ├── databases/
│   │   ├── bindle.html
│   │   ├── ecommerce.html
│   │   ├── finance.html
│   │   ├── live.html
│   │   ├── movies.html
│   │   ├── nba.html
│   │   └── the-bank-job.html
│   ├── index.html
│   └── static/
│       ├── css/
│       │   └── main.9f228f45.css
│       └── js/
│           ├── 226.0d90ab44.chunk.js
│           ├── 226.0d90ab44.chunk.js.LICENSE.txt
│           ├── 394.14a9b9da.chunk.js
│           ├── bindle-edges-json.94501736.chunk.js
│           ├── bindle-schemaColors-json.b87e5760.chunk.js
│           ├── bindle-tablePositions-json.847db583.chunk.js
│           ├── bindle-tables.0d2bfe46.chunk.js
│           ├── ecommerce-edges-json.fe131063.chunk.js
│           ├── ecommerce-schemaColors-json.fdb98809.chunk.js
│           ├── ecommerce-tablePositions-json.03a16298.chunk.js
│           ├── ecommerce-tables.f5264437.chunk.js
│           ├── finance-edges-json.cc1c201e.chunk.js
│           ├── finance-schemaColors-json.e0d3a5af.chunk.js
│           ├── finance-tablePositions-json.9ab03387.chunk.js
│           ├── finance-tables.eac6da84.chunk.js
│           ├── live-edges-json.849f23e8.chunk.js
│           ├── live-schemaColors-json.3efe2122.chunk.js
│           ├── live-tablePositions-json.88001c8e.chunk.js
│           ├── live-tables.5a699030.chunk.js
│           ├── main.33dfc6b0.js
│           ├── main.33dfc6b0.js.LICENSE.txt
│           ├── movies-edges-json.5b3266f6.chunk.js
│           ├── movies-schemaColors-json.a48d91cc.chunk.js
│           ├── movies-tablePositions-json.1435348f.chunk.js
│           ├── movies-tables.37f21107.chunk.js
│           ├── nba-edges-json.b14b1c04.chunk.js
│           ├── nba-schemaColors-json.e0912a1a.chunk.js
│           ├── nba-tablePositions-json.eda5bb0d.chunk.js
│           ├── nba-tables.7858f3c9.chunk.js
│           ├── the-bank-job-edges-json.f4126c62.chunk.js
│           ├── the-bank-job-schemaColors-json.00b0e9ee.chunk.js
│           ├── the-bank-job-tablePositions-json.1ddd80ab.chunk.js
│           └── the-bank-job-tables.b72c42c8.chunk.js
├── design_notes/
│   └── 0001_using_regular_links.md
├── package.json
├── public/
│   └── index.html
├── schema.csv.template
├── src/
│   ├── App/
│   │   ├── App.css
│   │   ├── App.test.tsx
│   │   ├── SQLHabitLogo.tsx
│   │   └── index.tsx
│   ├── Visualizer/
│   │   ├── Style.ts
│   │   ├── Visualizer.test.tsx
│   │   ├── components/
│   │   │   ├── CloseIcon.tsx
│   │   │   ├── DatabaseIcon.tsx
│   │   │   ├── DatabaseMenuSidebar.tsx
│   │   │   ├── InfoIcon.tsx
│   │   │   ├── InfoPopup.tsx
│   │   │   ├── KeyIcon.tsx
│   │   │   ├── Markers.tsx
│   │   │   ├── MaximizeIcon.tsx
│   │   │   ├── MinimizeIcon.tsx
│   │   │   ├── TableNode.tsx
│   │   │   └── index.ts
│   │   ├── helpers/
│   │   │   ├── calculateEdges.ts
│   │   │   ├── calculateSourcePosition.ts
│   │   │   ├── calculateTargetPosition.ts
│   │   │   ├── edgeClassName.ts
│   │   │   ├── edgeMarkerName.ts
│   │   │   ├── fullTableName.ts
│   │   │   ├── index.ts
│   │   │   ├── initializeNodes.ts
│   │   │   ├── loadDatabaseConfig.ts
│   │   │   ├── loadDatabases.ts
│   │   │   ├── logTablePositions.ts
│   │   │   ├── markdown.ts
│   │   │   ├── moveSVGInFront.ts
│   │   │   ├── setEdgeClassName.ts
│   │   │   ├── setHighlightEdgeClassName.ts
│   │   │   └── tableHighlights.ts
│   │   ├── index.tsx
│   │   ├── style/
│   │   │   ├── column-name.scss
│   │   │   ├── database-menu-sidebar.scss
│   │   │   ├── flow.css
│   │   │   ├── handle.css
│   │   │   ├── has-many-edge.scss
│   │   │   ├── has-one-edge.scss
│   │   │   ├── info-popup.scss
│   │   │   ├── key-icon.css
│   │   │   ├── react-flow.scss
│   │   │   └── table.scss
│   │   └── types/
│   │       ├── CloseIconProps.ts
│   │       ├── DatabaseConfig.ts
│   │       ├── EdgeConfig.ts
│   │       ├── PopupProps.ts
│   │       ├── Position.ts
│   │       ├── SchemaColors.ts
│   │       ├── TableColumnConfig.ts
│   │       ├── TableConfig.ts
│   │       ├── TablePositions.ts
│   │       └── index.ts
│   ├── config/
│   │   ├── databases/
│   │   │   ├── bindle/
│   │   │   │   ├── edges.json
│   │   │   │   ├── schemaColors.json
│   │   │   │   ├── tablePositions.json
│   │   │   │   ├── tables/
│   │   │   │   │   ├── accounts.json
│   │   │   │   │   ├── adjust_callbacks.json
│   │   │   │   │   ├── books.json
│   │   │   │   │   ├── books_users.json
│   │   │   │   │   ├── devices.json
│   │   │   │   │   ├── helpers_dates.json
│   │   │   │   │   ├── marketing_spends.json
│   │   │   │   │   ├── mobile_analytics_events.json
│   │   │   │   │   ├── products.json
│   │   │   │   │   ├── profiles.json
│   │   │   │   │   ├── purchases.json
│   │   │   │   │   ├── users.json
│   │   │   │   │   ├── web_analytics_events.json
│   │   │   │   │   └── web_analytics_pageviews.json
│   │   │   │   └── tables.ts
│   │   │   ├── ecommerce/
│   │   │   │   ├── edges.json
│   │   │   │   ├── schemaColors.json
│   │   │   │   ├── tablePositions.json
│   │   │   │   ├── tables/
│   │   │   │   │   ├── carts.json
│   │   │   │   │   ├── carts_items.json
│   │   │   │   │   ├── categories.json
│   │   │   │   │   ├── discount_codes.json
│   │   │   │   │   ├── items.json
│   │   │   │   │   ├── purchases.json
│   │   │   │   │   ├── returns.json
│   │   │   │   │   ├── reviews.json
│   │   │   │   │   ├── users.json
│   │   │   │   │   └── vendors.json
│   │   │   │   └── tables.ts
│   │   │   ├── finance/
│   │   │   │   ├── edges.json
│   │   │   │   ├── schemaColors.json
│   │   │   │   ├── tablePositions.json
│   │   │   │   ├── tables/
│   │   │   │   │   ├── transactions.json
│   │   │   │   │   └── vendors.json
│   │   │   │   └── tables.ts
│   │   │   ├── live/
│   │   │   │   ├── edges.json
│   │   │   │   ├── schemaColors.json
│   │   │   │   ├── tablePositions.json
│   │   │   │   ├── tables/
│   │   │   │   │   ├── mobile_analytics_events.json
│   │   │   │   │   ├── products.json
│   │   │   │   │   ├── purchases.json
│   │   │   │   │   ├── trials.json
│   │   │   │   │   └── users.json
│   │   │   │   └── tables.ts
│   │   │   ├── movies/
│   │   │   │   ├── edges.json
│   │   │   │   ├── schemaColors.json
│   │   │   │   ├── tablePositions.json
│   │   │   │   ├── tables/
│   │   │   │   │   ├── actors.json
│   │   │   │   │   ├── actors_movies.json
│   │   │   │   │   ├── directors.json
│   │   │   │   │   ├── genres.json
│   │   │   │   │   ├── genres_movies.json
│   │   │   │   │   ├── movies.json
│   │   │   │   │   └── ratings.json
│   │   │   │   └── tables.ts
│   │   │   ├── nba/
│   │   │   │   ├── edges.json
│   │   │   │   ├── schemaColors.json
│   │   │   │   ├── tablePositions.json
│   │   │   │   ├── tables/
│   │   │   │   │   ├── games.json
│   │   │   │   │   ├── player_game_stats.json
│   │   │   │   │   ├── players.json
│   │   │   │   │   ├── team_game_stats.json
│   │   │   │   │   └── teams.json
│   │   │   │   └── tables.ts
│   │   │   └── the-bank-job/
│   │   │       ├── edges.json
│   │   │       ├── schemaColors.json
│   │   │       ├── tablePositions.json
│   │   │       ├── tables/
│   │   │       │   ├── accounts.json
│   │   │       │   ├── art_works.json
│   │   │       │   ├── authorized_vehicles.json
│   │   │       │   ├── cases.json
│   │   │       │   ├── cases_crime_types.json
│   │   │       │   ├── cases_criminals.json
│   │   │       │   ├── crime_types.json
│   │   │       │   ├── criminal_aliases.json
│   │   │       │   ├── criminals.json
│   │   │       │   ├── employees.json
│   │   │       │   ├── event_log.json
│   │   │       │   ├── road_camera_events.json
│   │   │       │   ├── safe_deposit_boxes.json
│   │   │       │   ├── storage_units.json
│   │   │       │   ├── storage_units_log.json
│   │   │       │   ├── transactions.json
│   │   │       │   ├── vaults.json
│   │   │       │   └── vehicles.json
│   │   │       └── tables.ts
│   │   ├── databases.json
│   │   ├── databases.json.template
│   │   ├── databases.ts
│   │   ├── edges.json.template
│   │   ├── nodeTypes.ts
│   │   ├── schemaColors.json.template
│   │   ├── tablePositions.json.template
│   │   └── tables.ts.template
│   ├── index.css
│   ├── index.tsx
│   ├── react-app-env.d.ts
│   └── setupTests.ts
└── tsconfig.json
Download .txt
SYMBOL INDEX (779 symbols across 26 files)

FILE: build/static/js/226.0d90ab44.chunk.js
  function r (line 2) | function r(d,u){return document.createTextNode(u?d.replace(c,""):d)}
  function n (line 2) | function n(d,u){return"".concat(u.base,u.size,"/",d,u.ext)}
  function o (line 2) | function o(d,u){for(var f,c,e=d.childNodes,b=e.length;b--;)3===(c=(f=e[b...
  function s (line 2) | function s(d){return g(d.indexOf(e)<0?d.replace(c,""):d)}
  function i (line 2) | function i(d,u){for(var c,e,b,a,t,n,i,l,p,h,m,g,x,C=o(d,[]),v=C.length;v...
  function l (line 2) | function l(d,u){return m(d,(function(d){var f,c,e=d,a=s(d),t=u.callback(...
  function p (line 2) | function p(d){return u[d]}
  function h (line 2) | function h(){return null}
  function m (line 2) | function m(d,u){return String(d).replace(f,u)}
  function g (line 2) | function g(d,u){for(var f=[],c=0,e=0,b=0;b<d.length;)c=d.charCodeAt(b++)...

FILE: build/static/js/394.14a9b9da.chunk.js
  function s (line 1) | function s(a,o,_){var r,s=0,l=[];return a.replace(i,(function(o,i,c){var...

FILE: build/static/js/main.33dfc6b0.js
  function r (line 2) | function r(e){var t=Array.prototype.slice.call(arguments,1);return t.for...
  function o (line 2) | function o(e){return Object.prototype.toString.call(e)}
  function i (line 2) | function i(e){return"[object Function]"===o(e)}
  function a (line 2) | function a(e){return e.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}
  function c (line 2) | function c(e){var t=e.re=n(1875)(e.__opts__),r=e.__tlds__.slice();functi...
  function d (line 2) | function d(e,t){var n=e.__index__,r=e.__last_index__,o=e.__text_cache__....
  function f (line 2) | function f(e,t){var n=new d(e,t);return e.__compiled__[n.schema].normali...
  function h (line 2) | function h(e,t){if(!(this instanceof h))return new h(e,t);var n;t||(n=e,...
  function o (line 2) | function o(e,t){return r.call(e,t)}
  function i (line 2) | function i(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(6553...
  function a (line 2) | function a(e){if(e>65535){var t=55296+((e-=65536)>>10),n=56320+(1023&e);...
  function p (line 2) | function p(e){return h[e]}
  function m (line 2) | function m(e){var t=e.trim().toLowerCase();return!h.test(t)||!!p.test(t)}
  function v (line 2) | function v(e){var t=c.parse(e,!0);if(t.hostname&&(!t.protocol||g.indexOf...
  function y (line 2) | function y(e){var t=c.parse(e,!0);if(t.hostname&&(!t.protocol||g.indexOf...
  function b (line 2) | function b(e,t){if(!(this instanceof b))return new b(e,t);t||r.isString(...
  function i (line 2) | function i(){this.ruler=new r;for(var e=0;e<o.length;e++)this.ruler.push...
  function i (line 2) | function i(){this.ruler=new r;for(var e=0;e<o.length;e++)this.ruler.push...
  function a (line 2) | function a(){var e;for(this.ruler=new r,e=0;e<o.length;e++)this.ruler.pu...
  function l (line 2) | function l(){this.rules=r({},a)}
  function t (line 2) | function t(){this.__rules__=[],this.__cache__=null}
  function o (line 2) | function o(e,t){var n,o,i,a;return o=e.bMarks[t]+e.tShift[t],i=e.eMarks[...
  function i (line 2) | function i(e,t){var n,o=e.bMarks[t]+e.tShift[t],i=o,a=e.eMarks[t];if(i+1...
  function i (line 2) | function i(e,t,n,r){var i,a,l,s,u,c,d,f;for(this.src=e,this.md=t,this.en...
  function o (line 2) | function o(e,t){var n=e.bMarks[t]+e.tShift[t],r=e.eMarks[t];return e.src...
  function i (line 2) | function i(e){var t,n=[],r=0,o=e.length,i=!1,a=0,l="";for(t=e.charCodeAt...
  function o (line 2) | function o(e){return/^<\/a\s*>/i.test(e)}
  function i (line 2) | function i(e,t){return o[t.toLowerCase()]}
  function a (line 2) | function a(e){var t,n,o=0;for(t=e.length-1;t>=0;t--)"text"!==(n=e[t]).ty...
  function l (line 2) | function l(e){var n,r,o=0;for(n=e.length-1;n>=0;n--)"text"!==(r=e[n]).ty...
  function s (line 2) | function s(e,t,n){return e.slice(0,t)+n+e.slice(t+1)}
  function u (line 2) | function u(e,t){var n,a,u,c,d,f,h,p,m,g,v,y,b,w,x,k,_,S,C,E,N;for(C=[],n...
  function o (line 2) | function o(e,t,n){this.src=e,this.env=n,this.tokens=[],this.inlineMode=!...
  function t (line 2) | function t(e,t){var n,r,o,i,a,l,s,u,c={},d=t.length;if(d){var f=0,h=-2,p...
  function t (line 2) | function t(e,t){var n,r,o,i,a,l;for(n=t.length-1;n>=0;n--)95!==(r=t[n])....
  function l (line 2) | function l(e,t,n,r){this.src=e,this.env=n,this.md=t,this.tokens=r,this.t...
  function t (line 2) | function t(e,t){var n,r,o,i,a,l=[],s=t.length;for(n=0;n<s;n++)126===(o=t...
  function t (line 2) | function t(e){switch(e){case 10:case 33:case 35:case 36:case 37:case 38:...
  function t (line 2) | function t(e,t,n){this.type=e,this.tag=t,this.attrs=null,this.map=null,t...
  function n (line 2) | function n(e,r){var o;return"string"!==typeof r&&(r=n.defaultChars),o=fu...
  function n (line 2) | function n(e,r,o){var i,a,l,s,u,c="";for("string"!==typeof r&&(o=r,r=n.d...
  function t (line 2) | function t(){this.protocol=null,this.slashes=null,this.auth=null,this.po...
  function h (line 2) | function h(e){throw new RangeError(c[e])}
  function p (line 2) | function p(e,t){var n=e.split("@"),r="";n.length>1&&(r=n[0]+"@",e=n[1]);...
  function m (line 2) | function m(e){for(var t=[],n=0,r=e.length;n<r;){var o=e.charCodeAt(n++);...
  function i (line 2) | function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?inv...
  function s (line 2) | function s(e,t){u(e,t),u(e+"Capture",t)}
  function u (line 2) | function u(e,t){for(l[e]=t,e=0;e<t.length;e++)a.add(t[e])}
  function m (line 2) | function m(e,t,n,r,o,i,a){this.acceptsBooleans=2===t||3===t||4===t,this....
  function y (line 2) | function y(e){return e[1].toUpperCase()}
  function b (line 2) | function b(e,t,n,r){var o=g.hasOwnProperty(t)?g[t]:null;(null!==o?0!==o....
  function O (line 2) | function O(e){return null===e||"object"!==typeof e?null:"function"===typ...
  function R (line 2) | function R(e){if(void 0===T)try{throw Error()}catch(n){var t=n.stack.tri...
  function B (line 2) | function B(e,t){if(!e||F)return"";F=!0;var n=Error.prepareStackTrace;Err...
  function q (line 2) | function q(e){switch(e.tag){case 5:return R(e.type);case 16:return R("La...
  function U (line 2) | function U(e){if(null==e)return null;if("function"===typeof e)return e.d...
  function H (line 2) | function H(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:re...
  function V (line 2) | function V(e){switch(typeof e){case"boolean":case"number":case"string":c...
  function W (line 2) | function W(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase...
  function Z (line 2) | function Z(e){e._valueTracker||(e._valueTracker=function(e){var t=W(e)?"...
  function $ (line 2) | function $(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=...
  function Y (line 2) | function Y(e){if("undefined"===typeof(e=e||("undefined"!==typeof documen...
  function X (line 2) | function X(e,t){var n=t.checked;return I({},t,{defaultChecked:void 0,def...
  function K (line 2) | function K(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.c...
  function G (line 2) | function G(e,t){null!=(t=t.checked)&&b(e,"checked",t,!1)}
  function Q (line 2) | function Q(e,t){G(e,t);var n=V(t.value),r=t.type;if(null!=n)"number"===r...
  function J (line 2) | function J(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaul...
  function ee (line 2) | function ee(e,t,n){"number"===t&&Y(e.ownerDocument)===e||(null==n?e.defa...
  function ne (line 2) | function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t...
  function re (line 2) | function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));r...
  function oe (line 2) | function oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultVa...
  function ie (line 2) | function ie(e,t){var n=V(t.value),r=V(t.defaultValue);null!=n&&((n=""+n)...
  function ae (line 2) | function ae(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!...
  function le (line 2) | function le(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";ca...
  function se (line 2) | function se(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?le(t...
  function fe (line 2) | function fe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.n...
  function me (line 2) | function me(e,t,n){return null==t||"boolean"===typeof t||""===t?"":n||"n...
  function ge (line 2) | function ge(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=...
  function ye (line 2) | function ye(e,t){if(t){if(ve[e]&&(null!=t.children||null!=t.dangerouslyS...
  function be (line 2) | function be(e,t){if(-1===e.indexOf("-"))return"string"===typeof t.is;swi...
  function xe (line 2) | function xe(e){return(e=e.target||e.srcElement||window).correspondingUse...
  function Ce (line 2) | function Ce(e){if(e=wo(e)){if("function"!==typeof ke)throw Error(i(280))...
  function Ee (line 2) | function Ee(e){_e?Se?Se.push(e):Se=[e]:_e=e}
  function Ne (line 2) | function Ne(){if(_e){var e=_e,t=Se;if(Se=_e=null,Ce(e),t)for(e=0;e<t.len...
  function Me (line 2) | function Me(e,t){return e(t)}
  function Ae (line 2) | function Ae(){}
  function Pe (line 2) | function Pe(e,t,n){if(De)return e(t,n);De=!0;try{return Me(e,t,n)}finall...
  function Le (line 2) | function Le(e,t){var n=e.stateNode;if(null===n)return null;var r=ko(n);i...
  function Oe (line 2) | function Oe(e,t,n,r,o,i,a,l,s){var u=Array.prototype.slice.call(argument...
  function qe (line 2) | function qe(e,t,n,r,o,i,a,l,s){Te=!1,Ie=null,Oe.apply(Be,arguments)}
  function Ue (line 2) | function Ue(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else...
  function He (line 2) | function He(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!=...
  function Ve (line 2) | function Ve(e){if(Ue(e)!==e)throw Error(i(188))}
  function We (line 2) | function We(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(...
  function Ze (line 2) | function Ze(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;)...
  function dt (line 2) | function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:retur...
  function ft (line 2) | function ft(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.susp...
  function ht (line 2) | function ht(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case...
  function pt (line 2) | function pt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?...
  function mt (line 2) | function mt(){var e=ut;return 0===(4194240&(ut<<=1))&&(ut=64),e}
  function gt (line 2) | function gt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}
  function vt (line 2) | function vt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,...
  function yt (line 2) | function yt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var...
  function wt (line 2) | function wt(e){return 1<(e&=-e)?4<e?0!==(268435455&e)?16:536870912:4:1}
  function Ot (line 2) | function Ot(e,t){switch(e){case"focusin":case"focusout":Mt=null;break;ca...
  function Tt (line 2) | function Tt(e,t,n,r,o,i){return null===e||e.nativeEvent!==i?(e={blockedO...
  function It (line 2) | function It(e){var t=bo(e.target);if(null!==t){var n=Ue(t);if(null!==n)i...
  function Rt (line 2) | function Rt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContaine...
  function Ft (line 2) | function Ft(e,t,n){Rt(e)&&n.delete(t)}
  function Bt (line 2) | function Bt(){Et=!1,null!==Mt&&Rt(Mt)&&(Mt=null),null!==At&&Rt(At)&&(At=...
  function qt (line 2) | function qt(e,t){e.blockedOn===t&&(e.blockedOn=null,Et||(Et=!0,o.unstabl...
  function Ut (line 2) | function Ut(e){function t(t){return qt(t,e)}if(0<Nt.length){qt(Nt[0],e);...
  function Wt (line 2) | function Wt(e,t,n,r){var o=bt,i=Ht.transition;Ht.transition=null;try{bt=...
  function Zt (line 2) | function Zt(e,t,n,r){var o=bt,i=Ht.transition;Ht.transition=null;try{bt=...
  function $t (line 2) | function $t(e,t,n,r){if(Vt){var o=Xt(e,t,n,r);if(null===o)Vr(e,t,r,Yt,n)...
  function Xt (line 2) | function Xt(e,t,n,r){if(Yt=null,null!==(e=bo(e=xe(r))))if(null===(t=Ue(e...
  function Kt (line 2) | function Kt(e){switch(e){case"cancel":case"click":case"close":case"conte...
  function en (line 2) | function en(){if(Jt)return Jt;var e,t,n=Qt,r=n.length,o="value"in Gt?Gt....
  function tn (line 2) | function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&...
  function nn (line 2) | function nn(){return!0}
  function rn (line 2) | function rn(){return!1}
  function on (line 2) | function on(e){function t(t,n,r,o,i){for(var a in this._reactName=t,this...
  function Sn (line 2) | function Sn(e){var t=this.nativeEvent;return t.getModifierState?t.getMod...
  function Cn (line 2) | function Cn(){return Sn}
  function Bn (line 2) | function Bn(e,t){switch(e){case"keyup":return-1!==zn.indexOf(t.keyCode);...
  function qn (line 2) | function qn(e){return"object"===typeof(e=e.detail)&&"data"in e?e.data:null}
  function Vn (line 2) | function Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"inpu...
  function Wn (line 2) | function Wn(e,t,n,r){Ee(r),0<(t=Zr(t,"onChange")).length&&(n=new cn("onC...
  function Yn (line 2) | function Yn(e){Rr(e,0)}
  function Xn (line 2) | function Xn(e){if($(xo(e)))return e}
  function Kn (line 2) | function Kn(e,t){if("change"===e)return t}
  function tr (line 2) | function tr(){Zn&&(Zn.detachEvent("onpropertychange",nr),$n=Zn=null)}
  function nr (line 2) | function nr(e){if("value"===e.propertyName&&Xn($n)){var t=[];Wn(t,$n,e,x...
  function rr (line 2) | function rr(e,t,n){"focusin"===e?(tr(),$n=n,(Zn=t).attachEvent("onproper...
  function or (line 2) | function or(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)retu...
  function ir (line 2) | function ir(e,t){if("click"===e)return Xn(t)}
  function ar (line 2) | function ar(e,t){if("input"===e||"change"===e)return Xn(t)}
  function sr (line 2) | function sr(e,t){if(lr(e,t))return!0;if("object"!==typeof e||null===e||"...
  function ur (line 2) | function ur(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
  function cr (line 2) | function cr(e,t){var n,r=ur(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.t...
  function dr (line 2) | function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===...
  function fr (line 2) | function fr(){for(var e=window,t=Y();t instanceof e.HTMLIFrameElement;){...
  function hr (line 2) | function hr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(...
  function pr (line 2) | function pr(e){var t=fr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n...
  function wr (line 2) | function wr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.owne...
  function xr (line 2) | function xr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["W...
  function Cr (line 2) | function Cr(e){if(_r[e])return _r[e];if(!kr[e])return e;var t,n=kr[e];fo...
  function Lr (line 2) | function Lr(e,t){Dr.set(e,t),s(t,[e])}
  function Ir (line 2) | function Ir(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,funct...
  function Rr (line 2) | function Rr(e,t){t=0!==(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r....
  function Fr (line 2) | function Fr(e,t){var n=t[go];void 0===n&&(n=t[go]=new Set);var r=e+"__bu...
  function Br (line 2) | function Br(e,t,n){var r=0;t&&(r|=4),Hr(n,e,r,t)}
  function Ur (line 2) | function Ur(e){if(!e[qr]){e[qr]=!0,a.forEach((function(t){"selectionchan...
  function Hr (line 2) | function Hr(e,t,n,r){switch(Kt(t)){case 1:var o=Wt;break;case 4:o=Zt;bre...
  function Vr (line 2) | function Vr(e,t,n,r,o){var i=r;if(0===(1&t)&&0===(2&t)&&null!==r)e:for(;...
  function Wr (line 2) | function Wr(e,t,n){return{instance:e,listener:t,currentTarget:n}}
  function Zr (line 2) | function Zr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,i=o.state...
  function $r (line 2) | function $r(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag)...
  function Yr (line 2) | function Yr(e,t,n,r,o){for(var i=t._reactName,a=[];null!==n&&n!==r;){var...
  function Gr (line 2) | function Gr(e){return("string"===typeof e?e:""+e).replace(Xr,"\n").repla...
  function Qr (line 2) | function Qr(e,t,n){if(t=Gr(t),Gr(e)!==t&&n)throw Error(i(425))}
  function Jr (line 2) | function Jr(){}
  function no (line 2) | function no(e,t){return"textarea"===e||"noscript"===e||"string"===typeof...
  function lo (line 2) | function lo(e){setTimeout((function(){throw e}))}
  function so (line 2) | function so(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),...
  function uo (line 2) | function uo(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||...
  function co (line 2) | function co(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){va...
  function bo (line 2) | function bo(e){var t=e[ho];if(t)return t;for(var n=e.parentNode;n;){if(t...
  function wo (line 2) | function wo(e){return!(e=e[ho]||e[mo])||5!==e.tag&&6!==e.tag&&13!==e.tag...
  function xo (line 2) | function xo(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(...
  function ko (line 2) | function ko(e){return e[po]||null}
  function Co (line 2) | function Co(e){return{current:e}}
  function Eo (line 2) | function Eo(e){0>So||(e.current=_o[So],_o[So]=null,So--)}
  function No (line 2) | function No(e,t){So++,_o[So]=e.current,e.current=t}
  function Lo (line 2) | function Lo(e,t){var n=e.type.contextTypes;if(!n)return Mo;var r=e.state...
  function zo (line 2) | function zo(e){return null!==(e=e.childContextTypes)&&void 0!==e}
  function jo (line 2) | function jo(){Eo(Do),Eo(Ao)}
  function Oo (line 2) | function Oo(e,t,n){if(Ao.current!==Mo)throw Error(i(168));No(Ao,t),No(Do...
  function To (line 2) | function To(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"...
  function Io (line 2) | function Io(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMerged...
  function Ro (line 2) | function Ro(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=To(e...
  function Uo (line 2) | function Uo(e){null===Fo?Fo=[e]:Fo.push(e)}
  function Ho (line 2) | function Ho(){if(!qo&&null!==Fo){qo=!0;var e=0,t=bt;try{var n=Fo;for(bt=...
  function Jo (line 2) | function Jo(e,t){Vo[Wo++]=$o,Vo[Wo++]=Zo,Zo=e,$o=t}
  function ei (line 2) | function ei(e,t,n){Yo[Xo++]=Go,Yo[Xo++]=Qo,Yo[Xo++]=Ko,Ko=e;var r=Go;e=Q...
  function ti (line 2) | function ti(e){null!==e.return&&(Jo(e,1),ei(e,1,0))}
  function ni (line 2) | function ni(e){for(;e===Zo;)Zo=Vo[--Wo],Vo[Wo]=null,$o=Vo[--Wo],Vo[Wo]=n...
  function li (line 2) | function li(e,t){var n=Pu(5,null,null,0);n.elementType="DELETED",n.state...
  function si (line 2) | function si(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==...
  function ui (line 2) | function ui(e){return 0!==(1&e.mode)&&0===(128&e.flags)}
  function ci (line 2) | function ci(e){if(ii){var t=oi;if(t){var n=t;if(!si(e,t)){if(ui(e))throw...
  function di (line 2) | function di(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag...
  function fi (line 2) | function fi(e){if(e!==ri)return!1;if(!ii)return di(e),ii=!0,!1;var t;if(...
  function hi (line 2) | function hi(){for(var e=oi;e;)e=uo(e.nextSibling)}
  function pi (line 2) | function pi(){oi=ri=null,ii=!1}
  function mi (line 2) | function mi(e){null===ai?ai=[e]:ai.push(e)}
  function vi (line 2) | function vi(e,t){if(e&&e.defaultProps){for(var n in t=I({},t),e=e.defaul...
  function ki (line 2) | function ki(){xi=wi=bi=null}
  function _i (line 2) | function _i(e){var t=yi.current;Eo(yi),e._currentValue=t}
  function Si (line 2) | function Si(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)...
  function Ci (line 2) | function Ci(e,t){bi=e,xi=wi=null,null!==(e=e.dependencies)&&null!==e.fir...
  function Ei (line 2) | function Ei(e){var t=e._currentValue;if(xi!==e)if(e={context:e,memoizedV...
  function Mi (line 2) | function Mi(e){null===Ni?Ni=[e]:Ni.push(e)}
  function Ai (line 2) | function Ai(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,Mi(t)...
  function Di (line 2) | function Di(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t)...
  function Li (line 2) | function Li(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:...
  function zi (line 2) | function zi(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={base...
  function ji (line 2) | function ji(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:n...
  function Oi (line 2) | function Oi(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.sh...
  function Ti (line 2) | function Ti(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!==(4194240...
  function Ii (line 2) | function Ii(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r...
  function Ri (line 2) | function Ri(e,t,n,r){var o=e.updateQueue;Pi=!1;var i=o.firstBaseUpdate,a...
  function Fi (line 2) | function Fi(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.le...
  function qi (line 2) | function qi(e,t,n,r){n=null===(n=n(r,t=e.memoizedState))||void 0===n?t:I...
  function Hi (line 2) | function Hi(e,t,n,r,o,i,a){return"function"===typeof(e=e.stateNode).shou...
  function Vi (line 2) | function Vi(e,t,n){var r=!1,o=Mo,i=t.contextType;return"object"===typeof...
  function Wi (line 2) | function Wi(e,t,n,r){e=t.state,"function"===typeof t.componentWillReceiv...
  function Zi (line 2) | function Zi(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState...
  function $i (line 2) | function $i(e,t,n){if(null!==(e=n.ref)&&"function"!==typeof e&&"object"!...
  function Yi (line 2) | function Yi(e,t){throw e=Object.prototype.toString.call(t),Error(i(31,"[...
  function Xi (line 2) | function Xi(e){return(0,e._init)(e._payload)}
  function Ki (line 2) | function Ki(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.delet...
  function ra (line 2) | function ra(e){if(e===Ji)throw Error(i(174));return e}
  function oa (line 2) | function oa(e,t){switch(No(na,t),No(ta,e),No(ea,Ji),e=t.nodeType){case 9...
  function ia (line 2) | function ia(){Eo(ea),Eo(ta),Eo(na)}
  function aa (line 2) | function aa(e){ra(na.current);var t=ra(ea.current),n=se(t,e.type);t!==n&...
  function la (line 2) | function la(e){ta.current===e&&(Eo(ea),Eo(ta))}
  function ua (line 2) | function ua(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedSta...
  function da (line 2) | function da(){for(var e=0;e<ca.length;e++)ca[e]._workInProgressVersionPr...
  function ka (line 2) | function ka(){throw Error(i(321))}
  function _a (line 2) | function _a(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length...
  function Sa (line 2) | function Sa(e,t,n,r,o,a){if(pa=a,ma=t,t.memoizedState=null,t.updateQueue...
  function Ca (line 2) | function Ca(){var e=0!==wa;return wa=0,e}
  function Ea (line 2) | function Ea(){var e={memoizedState:null,baseState:null,baseQueue:null,qu...
  function Na (line 2) | function Na(){if(null===ga){var e=ma.alternate;e=null!==e?e.memoizedStat...
  function Ma (line 2) | function Ma(e,t){return"function"===typeof t?t(e):t}
  function Aa (line 2) | function Aa(e){var t=Na(),n=t.queue;if(null===n)throw Error(i(311));n.la...
  function Da (line 2) | function Da(e){var t=Na(),n=t.queue;if(null===n)throw Error(i(311));n.la...
  function Pa (line 2) | function Pa(){}
  function La (line 2) | function La(e,t){var n=ma,r=Na(),o=t(),a=!lr(r.memoizedState,o);if(a&&(r...
  function za (line 2) | function za(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=ma...
  function ja (line 2) | function ja(e,t,n,r){t.value=n,t.getSnapshot=r,Ta(t)&&Ia(e)}
  function Oa (line 2) | function Oa(e,t,n){return n((function(){Ta(t)&&Ia(e)}))}
  function Ta (line 2) | function Ta(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!lr(e,n...
  function Ia (line 2) | function Ia(e){var t=Di(e,1);null!==t&&nu(t,e,1,-1)}
  function Ra (line 2) | function Ra(e){var t=Ea();return"function"===typeof e&&(e=e()),t.memoize...
  function Fa (line 2) | function Fa(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null...
  function Ba (line 2) | function Ba(){return Na().memoizedState}
  function qa (line 2) | function qa(e,t,n,r){var o=Ea();ma.flags|=e,o.memoizedState=Fa(1|t,n,voi...
  function Ua (line 2) | function Ua(e,t,n,r){var o=Na();r=void 0===r?null:r;var i=void 0;if(null...
  function Ha (line 2) | function Ha(e,t){return qa(8390656,8,e,t)}
  function Va (line 2) | function Va(e,t){return Ua(2048,8,e,t)}
  function Wa (line 2) | function Wa(e,t){return Ua(4,2,e,t)}
  function Za (line 2) | function Za(e,t){return Ua(4,4,e,t)}
  function $a (line 2) | function $a(e,t){return"function"===typeof t?(e=e(),t(e),function(){t(nu...
  function Ya (line 2) | function Ya(e,t,n){return n=null!==n&&void 0!==n?n.concat([e]):null,Ua(4...
  function Xa (line 2) | function Xa(){}
  function Ka (line 2) | function Ka(e,t){var n=Na();t=void 0===t?null:t;var r=n.memoizedState;re...
  function Ga (line 2) | function Ga(e,t){var n=Na();t=void 0===t?null:t;var r=n.memoizedState;re...
  function Qa (line 2) | function Qa(e,t,n){return 0===(21&pa)?(e.baseState&&(e.baseState=!1,wl=!...
  function Ja (line 2) | function Ja(e,t){var n=bt;bt=0!==n&&4>n?n:4,e(!0);var r=ha.transition;ha...
  function el (line 2) | function el(){return Na().memoizedState}
  function tl (line 2) | function tl(e,t,n){var r=tu(e);if(n={lane:r,action:n,hasEagerState:!1,ea...
  function nl (line 2) | function nl(e,t,n){var r=tu(e),o={lane:r,action:n,hasEagerState:!1,eager...
  function rl (line 2) | function rl(e){var t=e.alternate;return e===ma||null!==t&&t===ma}
  function ol (line 2) | function ol(e,t){ba=ya=!0;var n=e.pending;null===n?t.next=t:(t.next=n.ne...
  function il (line 2) | function il(e,t,n){if(0!==(4194240&n)){var r=t.lanes;n|=r&=e.pendingLane...
  function cl (line 2) | function cl(e,t){try{var n="",r=t;do{n+=q(r),r=r.return}while(r);var o=n...
  function dl (line 2) | function dl(e,t,n){return{value:e,source:null,stack:null!=n?n:null,diges...
  function fl (line 2) | function fl(e,t){try{console.error(t.value)}catch(n){setTimeout((functio...
  function pl (line 2) | function pl(e,t,n){(n=ji(-1,n)).tag=3,n.payload={element:null};var r=t.v...
  function ml (line 2) | function ml(e,t,n){(n=ji(-1,n)).tag=3;var r=e.type.getDerivedStateFromEr...
  function gl (line 2) | function gl(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new hl;v...
  function vl (line 2) | function vl(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)...
  function yl (line 2) | function yl(e,t,n,r,o){return 0===(1&e.mode)?(e===t?e.flags|=65536:(e.fl...
  function xl (line 2) | function xl(e,t,n,r){t.child=null===e?Qi(t,null,n,r):Gi(t,e.child,n,r)}
  function kl (line 2) | function kl(e,t,n,r,o){n=n.render;var i=t.ref;return Ci(t,o),r=Sa(e,t,n,...
  function _l (line 2) | function _l(e,t,n,r,o){if(null===e){var i=n.type;return"function"!==type...
  function Sl (line 2) | function Sl(e,t,n,r,o){if(null!==e){var i=e.memoizedProps;if(sr(i,r)&&e....
  function Cl (line 2) | function Cl(e,t,n){var r=t.pendingProps,o=r.children,i=null!==e?e.memoiz...
  function El (line 2) | function El(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&...
  function Nl (line 2) | function Nl(e,t,n,r,o){var i=zo(n)?Po:Ao.current;return i=Lo(t,i),Ci(t,o...
  function Ml (line 2) | function Ml(e,t,n,r,o){if(zo(n)){var i=!0;Io(t)}else i=!1;if(Ci(t,o),nul...
  function Al (line 2) | function Al(e,t,n,r,o,i){El(e,t);var a=0!==(128&t.flags);if(!r&&!a)retur...
  function Dl (line 2) | function Dl(e){var t=e.stateNode;t.pendingContext?Oo(0,t.pendingContext,...
  function Pl (line 2) | function Pl(e,t,n,r,o){return pi(),mi(o),t.flags|=256,xl(e,t,n,r),t.child}
  function Tl (line 2) | function Tl(e){return{baseLanes:e,cachePool:null,transitions:null}}
  function Il (line 2) | function Il(e,t,n){var r,o=t.pendingProps,a=sa.current,l=!1,s=0!==(128&t...
  function Rl (line 2) | function Rl(e,t){return(t=Tu({mode:"visible",children:t},e.mode,0,null))...
  function Fl (line 2) | function Fl(e,t,n,r){return null!==r&&mi(r),Gi(t,e.child,null,n),(e=Rl(t...
  function Bl (line 2) | function Bl(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),S...
  function ql (line 2) | function ql(e,t,n,r,o){var i=e.memoizedState;null===i?e.memoizedState={i...
  function Ul (line 2) | function Ul(e,t,n){var r=t.pendingProps,o=r.revealOrder,i=r.tail;if(xl(e...
  function Hl (line 2) | function Hl(e,t){0===(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate...
  function Vl (line 2) | function Vl(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ts|=t.la...
  function Wl (line 2) | function Wl(e,t){if(!ii)switch(e.tailMode){case"hidden":t=e.tail;for(var...
  function Zl (line 2) | function Zl(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0...
  function $l (line 2) | function $l(e,t,n){var r=t.pendingProps;switch(ni(t),t.tag){case 2:case ...
  function Yl (line 2) | function Yl(e,t){switch(ni(t),t.tag){case 1:return zo(t.type)&&jo(),6553...
  function Jl (line 2) | function Jl(e,t){var n=e.ref;if(null!==n)if("function"===typeof n)try{n(...
  function es (line 2) | function es(e,t,n){try{n()}catch(r){Su(e,t,r)}}
  function ns (line 2) | function ns(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffec...
  function rs (line 2) | function rs(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null...
  function os (line 2) | function os(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"fun...
  function is (line 2) | function is(e){var t=e.alternate;null!==t&&(e.alternate=null,is(t)),e.ch...
  function as (line 2) | function as(e){return 5===e.tag||3===e.tag||4===e.tag}
  function ls (line 2) | function ls(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||as(...
  function ss (line 2) | function ss(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nod...
  function us (line 2) | function us(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertB...
  function fs (line 2) | function fs(e,t,n){for(n=n.child;null!==n;)hs(e,t,n),n=n.sibling}
  function hs (line 2) | function hs(e,t,n){if(it&&"function"===typeof it.onCommitFiberUnmount)tr...
  function ps (line 2) | function ps(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n...
  function ms (line 2) | function ms(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r+...
  function gs (line 2) | function gs(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 1...
  function vs (line 2) | function vs(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;...
  function ys (line 2) | function ys(e,t,n){Ql=e,bs(e,t,n)}
  function bs (line 2) | function bs(e,t,n){for(var r=0!==(1&e.mode);null!==Ql;){var o=Ql,i=o.chi...
  function ws (line 2) | function ws(e){for(;null!==Ql;){var t=Ql;if(0!==(8772&t.flags)){var n=t....
  function xs (line 2) | function xs(e){for(;null!==Ql;){var t=Ql;if(t===e){Ql=null;break}var n=t...
  function ks (line 2) | function ks(e){for(;null!==Ql;){var t=Ql;try{switch(t.tag){case 0:case 1...
  function eu (line 2) | function eu(){return 0!==(6&Ms)?Ge():-1!==Qs?Qs:Qs=Ge()}
  function tu (line 2) | function tu(e){return 0===(1&e.mode)?1:0!==(2&Ms)&&0!==Ps?Ps&-Ps:null!==...
  function nu (line 2) | function nu(e,t,n,r){if(50<Ks)throw Ks=0,Gs=null,Error(i(185));vt(e,n,r)...
  function ru (line 2) | function ru(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspend...
  function ou (line 2) | function ou(e,t){if(Qs=-1,Js=0,0!==(6&Ms))throw Error(i(327));var n=e.ca...
  function iu (line 2) | function iu(e,t){var n=Fs;return e.current.memoizedState.isDehydrated&&(...
  function au (line 2) | function au(e){null===Bs?Bs=e:Bs.push.apply(Bs,e)}
  function lu (line 2) | function lu(e,t){for(t&=~Rs,t&=~Is,e.suspendedLanes|=t,e.pingedLanes&=~t...
  function su (line 2) | function su(e){if(0!==(6&Ms))throw Error(i(327));ku();var t=ft(e,0);if(0...
  function uu (line 2) | function uu(e,t){var n=Ms;Ms|=1;try{return e(t)}finally{0===(Ms=n)&&(Us=...
  function cu (line 2) | function cu(e){null!==Ys&&0===Ys.tag&&0===(6&Ms)&&ku();var t=Ms;Ms|=1;va...
  function du (line 2) | function du(){Ls=zs.current,Eo(zs)}
  function fu (line 2) | function fu(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHa...
  function hu (line 2) | function hu(e,t){for(;;){var n=Ds;try{if(ki(),fa.current=al,ya){for(var ...
  function pu (line 2) | function pu(){var e=Cs.current;return Cs.current=al,null===e?al:e}
  function mu (line 2) | function mu(){0!==js&&3!==js&&2!==js||(js=4),null===As||0===(268435455&T...
  function gu (line 2) | function gu(e,t){var n=Ms;Ms|=2;var r=pu();for(As===e&&Ps===t||(Hs=null,...
  function vu (line 2) | function vu(){for(;null!==Ds;)bu(Ds)}
  function yu (line 2) | function yu(){for(;null!==Ds&&!Xe();)bu(Ds)}
  function bu (line 2) | function bu(e){var t=_s(e.alternate,e,Ls);e.memoizedProps=e.pendingProps...
  function wu (line 2) | function wu(e){var t=e;do{var n=t.alternate;if(e=t.return,0===(32768&t.f...
  function xu (line 2) | function xu(e,t,n){var r=bt,o=Ns.transition;try{Ns.transition=null,bt=1,...
  function ku (line 2) | function ku(){if(null!==Ys){var e=wt(Xs),t=Ns.transition,n=bt;try{if(Ns....
  function _u (line 2) | function _u(e,t,n){e=Oi(e,t=pl(0,t=cl(n,t),1),1),t=eu(),null!==e&&(vt(e,...
  function Su (line 2) | function Su(e,t,n){if(3===e.tag)_u(e,e,n);else for(;null!==t;){if(3===t....
  function Cu (line 2) | function Cu(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=eu(),e.ping...
  function Eu (line 2) | function Eu(e,t){0===t&&(0===(1&e.mode)?t=1:(t=ct,0===(130023424&(ct<<=1...
  function Nu (line 2) | function Nu(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Eu(e,n)}
  function Mu (line 2) | function Mu(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.mem...
  function Au (line 2) | function Au(e,t){return $e(e,t)}
  function Du (line 2) | function Du(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this....
  function Pu (line 2) | function Pu(e,t,n,r){return new Du(e,t,n,r)}
  function Lu (line 2) | function Lu(e){return!(!(e=e.prototype)||!e.isReactComponent)}
  function zu (line 2) | function zu(e,t){var n=e.alternate;return null===n?((n=Pu(e.tag,t,e.key,...
  function ju (line 2) | function ju(e,t,n,r,o,a){var l=2;if(r=e,"function"===typeof e)Lu(e)&&(l=...
  function Ou (line 2) | function Ou(e,t,n,r){return(e=Pu(7,e,r,t)).lanes=n,e}
  function Tu (line 2) | function Tu(e,t,n,r){return(e=Pu(22,e,r,t)).elementType=z,e.lanes=n,e.st...
  function Iu (line 2) | function Iu(e,t,n){return(e=Pu(6,e,null,t)).lanes=n,e}
  function Ru (line 2) | function Ru(e,t,n){return(t=Pu(4,null!==e.children?e.children:[],e.key,t...
  function Fu (line 2) | function Fu(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork...
  function Bu (line 2) | function Bu(e,t,n,r,o,i,a,l,s){return e=new Fu(e,t,n,l,s),1===t?(t=1,!0=...
  function qu (line 2) | function qu(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?argum...
  function Uu (line 2) | function Uu(e){if(!e)return Mo;e:{if(Ue(e=e._reactInternals)!==e||1!==e....
  function Hu (line 2) | function Hu(e,t,n,r,o,i,a,l,s){return(e=Bu(n,r,!0,e,0,i,0,l,s)).context=...
  function Vu (line 2) | function Vu(e,t,n,r){var o=t.current,i=eu(),a=tu(o);return n=Uu(n),null=...
  function Wu (line 2) | function Wu(e){return(e=e.current).child?(e.child.tag,e.child.stateNode)...
  function Zu (line 2) | function Zu(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var...
  function $u (line 2) | function $u(e,t){Zu(e,t),(e=e.alternate)&&Zu(e,t)}
  function Xu (line 2) | function Xu(e){this._internalRoot=e}
  function Ku (line 2) | function Ku(e){this._internalRoot=e}
  function Gu (line 2) | function Gu(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeTy...
  function Qu (line 2) | function Qu(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeTy...
  function Ju (line 2) | function Ju(){}
  function ec (line 2) | function ec(e,t,n,r,o){var i=n._reactRootContainer;if(i){var a=i;if("fun...
  function u (line 2) | function u(e,t,n){var r,i={},u=null,c=null;for(r in void 0!==n&&(u=""+n)...
  function v (line 2) | function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n...
  function y (line 2) | function y(){}
  function b (line 2) | function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n...
  function C (line 2) | function C(e,t,r){var o,i={},a=null,l=null;if(null!=t)for(o in void 0!==...
  function E (line 2) | function E(e){return"object"===typeof e&&null!==e&&e.$$typeof===n}
  function M (line 2) | function M(e,t){return"object"===typeof e&&null!==e&&null!=e.key?functio...
  function A (line 2) | function A(e,t,o,i,a){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=...
  function D (line 2) | function D(e,t,n){if(null==e)return e;var r=[],o=0;return A(e,r,"","",(f...
  function P (line 2) | function P(e){if(-1===e._status){var t=e._result;(t=t()).then((function(...
  function n (line 2) | function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[...
  function r (line 2) | function r(e){return 0===e.length?null:e[0]}
  function o (line 2) | function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t)...
  function i (line 2) | function i(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}
  function w (line 2) | function w(e){for(var t=r(c);null!==t;){if(null===t.callback)o(c);else{i...
  function x (line 2) | function x(e){if(g=!1,w(e),!m)if(null!==r(u))m=!0,z(k);else{var t=r(c);n...
  function k (line 2) | function k(e,n){m=!1,g&&(g=!1,y(E),E=-1),p=!0;var i=h;try{for(w(n),f=r(u...
  function A (line 2) | function A(){return!(t.unstable_now()-M<N)}
  function D (line 2) | function D(){if(null!==C){var e=t.unstable_now();M=e;var n=!0;try{n=C(!0...
  function z (line 2) | function z(e){C=e,S||(S=!0,_())}
  function j (line 2) | function j(e,n){E=v((function(){e(t.unstable_now())}),n)}
  function u (line 2) | function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!o(e,n)}...
  function e (line 2) | function e(e){if(!s){if(s=!0,a=e,e=r(e),void 0!==o&&f.hasValue){var t=f....
  function o (line 2) | function o(e){if(!n.o(r,e))return Promise.resolve().then((function(){var...
  function o (line 2) | function o(e){if(!n.o(r,e))return Promise.resolve().then((function(){var...
  function o (line 2) | function o(e){if(!n.o(r,e))return Promise.resolve().then((function(){var...
  function o (line 2) | function o(e){if(!n.o(r,e))return Promise.resolve().then((function(){var...
  function r (line 2) | function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Ar...
  function o (line 2) | function o(e,t){var n="undefined"!==typeof Symbol&&e[Symbol.iterator]||e...
  function r (line 2) | function r(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||...
  function a (line 2) | function a(e){return function(e){if(Array.isArray(e))return(0,r.Z)(e)}(e...
  function o (line 2) | function o(e,t){if(e){if("string"===typeof e)return(0,r.Z)(e,t);var n=Ob...
  function n (line 2) | function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={expo...
  function o (line 2) | function o(e){if(Array.isArray(e))return e}
  function a (line 2) | function a(){throw new TypeError("Invalid attempt to destructure non-ite...
  function l (line 2) | function l(e,t){return o(e)||function(e,t){var n=null==e?null:"undefined...
  function u (line 2) | function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
  function c (line 2) | function c(e){return c="function"==typeof Symbol&&"symbol"==typeof Symbo...
  function d (line 2) | function d(e){var t=function(e,t){if("object"!==c(e)||null===e)return e;...
  function f (line 2) | function f(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function h (line 2) | function h(e,t,n){return t&&f(e.prototype,t),n&&f(e,n),Object.defineProp...
  function p (line 2) | function p(e,t){return p=Object.setPrototypeOf?Object.setPrototypeOf.bin...
  function m (line 2) | function m(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("...
  function g (line 2) | function g(e){return g=Object.setPrototypeOf?Object.getPrototypeOf.bind(...
  function v (line 2) | function v(){if("undefined"===typeof Reflect||!Reflect.construct)return!...
  function y (line 2) | function y(e,t){if(t&&("object"===c(t)||"function"===typeof t))return t;...
  function b (line 2) | function b(e){var t=v();return function(){var n,r=g(e);if(t){var o=g(thi...
  function w (line 2) | function w(e,t,n){return w=v()?Reflect.construct.bind():function(e,t,n){...
  function x (line 2) | function x(e){var t="function"===typeof Map?new Map:void 0;return x=func...
  function C (line 2) | function C(){return C=Object.assign?Object.assign.bind():function(e){for...
  function M (line 2) | function M(e,t){if(!1===e||null===e||"undefined"===typeof e)throw new Er...
  function A (line 2) | function A(e,t){return{usr:e.state,key:e.key,idx:t}}
  function D (line 2) | function D(e,t,n,r){return void 0===n&&(n=null),C({pathname:"string"===t...
  function P (line 2) | function P(e){var t=e.pathname,n=void 0===t?"/":t,r=e.search,o=void 0===...
  function L (line 2) | function L(e){var t={};if(e){var n=e.indexOf("#");n>=0&&(t.hash=e.substr...
  function z (line 2) | function z(e,t,n,r){void 0===r&&(r={});var o=r,i=o.window,a=void 0===i?d...
  function j (line 2) | function j(e,t,n){void 0===n&&(n="/");var r=H(("string"===typeof t?L(t):...
  function O (line 2) | function O(e,t,n,r){void 0===t&&(t=[]),void 0===n&&(n=[]),void 0===r&&(r...
  function T (line 2) | function T(e){var t=e.split("/");if(0===t.length)return[];var n,r=o(n=t)...
  function F (line 2) | function F(e,t){var n=e.split("/"),r=n.length;return n.some(R)&&(r+=-2),...
  function B (line 2) | function B(e,t){for(var n=e.routesMeta,r={},o="/",i=[],a=0;a<n.length;++...
  function q (line 2) | function q(e,t){"string"===typeof e&&(e={path:e,caseSensitive:!1,end:!0}...
  function U (line 2) | function U(e){try{return decodeURI(e)}catch(t){return V(!1,'The URL path...
  function H (line 2) | function H(e,t){if("/"===t)return e;if(!e.toLowerCase().startsWith(t.toL...
  function V (line 2) | function V(e,t){if(!e){"undefined"!==typeof console&&console.warn(t);try...
  function W (line 2) | function W(e,t,n,r){return"Cannot include a '"+e+"' character in a manua...
  function Z (line 2) | function Z(e){return e.filter((function(e,t){return 0===t||e.route.path&...
  function $ (line 2) | function $(e,t,n,r){var o;void 0===r&&(r=!1),"string"===typeof e?o=L(e):...
  function n (line 2) | function n(){return u(this,n),t.apply(this,arguments)}
  function J (line 2) | function J(e){return null!=e&&"number"===typeof e.status&&"string"===typ...
  function ne (line 2) | function ne(){return ne=Object.assign?Object.assign.bind():function(e){f...
  function se (line 2) | function se(e){var t=e.getSnapshot,n=e.value;try{var r=t();return!re(n,r...
  function ge (line 2) | function ge(){return null!=e.useContext(he)}
  function ve (line 2) | function ve(){return ge()||M(!1),e.useContext(he).location}
  function ye (line 2) | function ye(){ge()||M(!1);var t=e.useContext(fe),n=t.basename,r=t.naviga...
  function be (line 2) | function be(t,n){var r=(void 0===n?{}:n).relative,o=e.useContext(pe).mat...
  function we (line 2) | function we(){var t=function(){var t,n=e.useContext(me),r=Ee(ke.UseRoute...
  function r (line 2) | function r(e){var t;return u(this,r),(t=n.call(this,e)).state={location:...
  function Se (line 2) | function Se(t){var n=t.routeContext,r=t.match,o=t.children,i=e.useContex...
  function Ce (line 2) | function Ce(t,n,r){if(void 0===n&&(n=[]),null==t){if(null==r||!r.errors)...
  function Ee (line 2) | function Ee(t){var n=e.useContext(ce);return n||M(!1),n}
  function Ne (line 2) | function Ne(t){var n=function(t){var n=e.useContext(pe);return n||M(!1),...
  function Ae (line 2) | function Ae(e){M(!1)}
  function De (line 2) | function De(t){var n=t.basename,r=void 0===n?"/":n,o=t.children,i=void 0...
  function Pe (line 2) | function Pe(t){var n=t.children,r=t.location,o=e.useContext(ue);return f...
  function ze (line 2) | function ze(t,n){void 0===n&&(n=[]);var r=[];return e.Children.forEach(t...
  function je (line 2) | function je(){return je=Object.assign?Object.assign.bind():function(e){f...
  function Oe (line 2) | function Oe(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r...
  function Ie (line 2) | function Ie(t){var n,r=t.basename,o=t.children,i=t.window,a=e.useRef();n...
  function Ue (line 2) | function Ue(e,t,n){return(t=d(t))in e?Object.defineProperty(e,t,{value:n...
  function He (line 2) | function He(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
  function Ve (line 2) | function Ve(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments...
  function We (line 2) | function We(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)...
  function $e (line 2) | function $e(e){if("string"===typeof e||"number"===typeof e)return""+e;va...
  function Xe (line 2) | function Xe(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments...
  function Qe (line 2) | function Qe(e,t){if(Object.is(e,t))return!0;if("object"!==typeof e||null...
  function et (line 2) | function et(){for(var e,t=0,n=arguments.length,r={};t<n;++t){if(!(e=argu...
  function tt (line 2) | function tt(e){this._=e}
  function nt (line 2) | function nt(e,t){return e.trim().split(/^|\s+/).map((function(e){var n="...
  function rt (line 2) | function rt(e,t){for(var n,r=0,o=e.length;r<o;++r)if((n=e[r]).name===t)r...
  function ot (line 2) | function ot(e,t,n){for(var r=0,o=e.length;r<o;++r)if(e[r].name===t){e[r]...
  function at (line 2) | function at(){}
  function lt (line 2) | function lt(e){return null==e?at:function(){return this.querySelector(e)}}
  function st (line 2) | function st(e){return null==e?[]:Array.isArray(e)?e:Array.from(e)}
  function ut (line 2) | function ut(){return[]}
  function ct (line 2) | function ct(e){return null==e?ut:function(){return this.querySelectorAll...
  function dt (line 2) | function dt(e){return function(){return this.matches(e)}}
  function ft (line 2) | function ft(e){return function(t){return t.matches(e)}}
  function pt (line 2) | function pt(){return this.firstElementChild}
  function gt (line 2) | function gt(){return Array.from(this.children)}
  function vt (line 2) | function vt(e){return new Array(e.length)}
  function yt (line 2) | function yt(e,t){this.ownerDocument=e.ownerDocument,this.namespaceURI=e....
  function bt (line 2) | function bt(e){return function(){return e}}
  function wt (line 2) | function wt(e,t,n,r,o,i){for(var a,l=0,s=t.length,u=i.length;l<u;++l)(a=...
  function xt (line 2) | function xt(e,t,n,r,o,i,a){var l,s,u,c=new Map,d=t.length,f=i.length,h=n...
  function kt (line 2) | function kt(e){return e.__data__}
  function _t (line 2) | function _t(e){return"object"===typeof e&&"length"in e?e:Array.from(e)}
  function St (line 2) | function St(e,t){return e<t?-1:e>t?1:e>=t?0:NaN}
  function Nt (line 2) | function Nt(e){var t=e+="",n=t.indexOf(":");return n>=0&&"xmlns"!==(t=e....
  function Mt (line 2) | function Mt(e){return function(){this.removeAttribute(e)}}
  function At (line 2) | function At(e){return function(){this.removeAttributeNS(e.space,e.local)}}
  function Dt (line 2) | function Dt(e,t){return function(){this.setAttribute(e,t)}}
  function Pt (line 2) | function Pt(e,t){return function(){this.setAttributeNS(e.space,e.local,t)}}
  function Lt (line 2) | function Lt(e,t){return function(){var n=t.apply(this,arguments);null==n...
  function zt (line 2) | function zt(e,t){return function(){var n=t.apply(this,arguments);null==n...
  function jt (line 2) | function jt(e){return e.ownerDocument&&e.ownerDocument.defaultView||e.do...
  function Ot (line 2) | function Ot(e){return function(){this.style.removeProperty(e)}}
  function Tt (line 2) | function Tt(e,t,n){return function(){this.style.setProperty(e,t,n)}}
  function It (line 2) | function It(e,t,n){return function(){var r=t.apply(this,arguments);null=...
  function Rt (line 2) | function Rt(e,t){return e.style.getPropertyValue(t)||jt(e).getComputedSt...
  function Ft (line 2) | function Ft(e){return function(){delete this[e]}}
  function Bt (line 2) | function Bt(e,t){return function(){this[e]=t}}
  function qt (line 2) | function qt(e,t){return function(){var n=t.apply(this,arguments);null==n...
  function Ut (line 2) | function Ut(e){return e.trim().split(/^|\s+/)}
  function Ht (line 2) | function Ht(e){return e.classList||new Vt(e)}
  function Vt (line 2) | function Vt(e){this._node=e,this._names=Ut(e.getAttribute("class")||"")}
  function Wt (line 2) | function Wt(e,t){for(var n=Ht(e),r=-1,o=t.length;++r<o;)n.add(t[r])}
  function Zt (line 2) | function Zt(e,t){for(var n=Ht(e),r=-1,o=t.length;++r<o;)n.remove(t[r])}
  function $t (line 2) | function $t(e){return function(){Wt(this,e)}}
  function Yt (line 2) | function Yt(e){return function(){Zt(this,e)}}
  function Xt (line 2) | function Xt(e,t){return function(){(t.apply(this,arguments)?Wt:Zt)(this,...
  function Kt (line 2) | function Kt(){this.textContent=""}
  function Gt (line 2) | function Gt(e){return function(){this.textContent=e}}
  function Qt (line 2) | function Qt(e){return function(){var t=e.apply(this,arguments);this.text...
  function Jt (line 2) | function Jt(){this.innerHTML=""}
  function en (line 2) | function en(e){return function(){this.innerHTML=e}}
  function tn (line 2) | function tn(e){return function(){var t=e.apply(this,arguments);this.inne...
  function nn (line 2) | function nn(){this.nextSibling&&this.parentNode.appendChild(this)}
  function rn (line 2) | function rn(){this.previousSibling&&this.parentNode.insertBefore(this,th...
  function on (line 2) | function on(e){return function(){var t=this.ownerDocument,n=this.namespa...
  function an (line 2) | function an(e){return function(){return this.ownerDocument.createElement...
  function ln (line 2) | function ln(e){var t=Nt(e);return(t.local?an:on)(t)}
  function sn (line 2) | function sn(){return null}
  function un (line 2) | function un(){var e=this.parentNode;e&&e.removeChild(this)}
  function cn (line 2) | function cn(){var e=this.cloneNode(!1),t=this.parentNode;return t?t.inse...
  function dn (line 2) | function dn(){var e=this.cloneNode(!0),t=this.parentNode;return t?t.inse...
  function fn (line 2) | function fn(e){return e.trim().split(/^|\s+/).map((function(e){var t="",...
  function hn (line 2) | function hn(e){return function(){var t=this.__on;if(t){for(var n,r=0,o=-...
  function pn (line 2) | function pn(e,t,n){return function(){var r,o=this.__on,i=function(e){ret...
  function mn (line 2) | function mn(e,t,n){var r=jt(e),o=r.CustomEvent;"function"===typeof o?o=n...
  function gn (line 2) | function gn(e,t){return function(){return mn(this,e,t)}}
  function vn (line 2) | function vn(e,t){return function(){return mn(this,e,t.apply(this,argumen...
  function yn (line 2) | function yn(){yn=function(){return e};var e={},t=Object.prototype,n=t.ha...
  function wn (line 2) | function wn(){var e,t,n,r,o,i,a;return yn().wrap((function(l){for(;;)swi...
  function kn (line 2) | function kn(e,t){this._groups=e,this._parents=t}
  function _n (line 2) | function _n(){return new kn([[document.documentElement]],xn)}
  function t (line 2) | function t(t,n){return t&&n?e(t.__data__,n.__data__):!t-!n}
  function Cn (line 2) | function Cn(e){return"string"===typeof e?new kn([[document.querySelector...
  function En (line 2) | function En(e,t){if(e=function(e){for(var t;t=e.sourceEvent;)e=t;return ...
  function An (line 2) | function An(e){e.stopImmediatePropagation()}
  function Dn (line 2) | function Dn(e){e.preventDefault(),e.stopImmediatePropagation()}
  function Pn (line 2) | function Pn(e){var t=e.document.documentElement,n=Cn(e).on("dragstart.dr...
  function Ln (line 2) | function Ln(e,t){var n=e.document.documentElement,r=Cn(e).on("dragstart....
  function jn (line 2) | function jn(e,t){var n=t.sourceEvent,r=t.subject,o=t.target,i=t.identifi...
  function On (line 2) | function On(e){return!e.ctrlKey&&!e.button}
  function Tn (line 2) | function Tn(){return this.parentNode}
  function In (line 2) | function In(e,t){return null==t?{x:e.x,y:e.y}:t}
  function Rn (line 2) | function Rn(){return navigator.maxTouchPoints||"ontouchstart"in this}
  function Fn (line 2) | function Fn(e){return((e=Math.exp(e))+1/e)/2}
  function o (line 2) | function o(e,o){var i,a,l=e[0],s=e[1],u=e[2],c=o[0],d=o[1],f=o[2],h=c-l,...
  function Gn (line 2) | function Gn(){return $n||(Kn(Qn),$n=Xn.now()+Yn)}
  function Qn (line 2) | function Qn(){$n=0}
  function Jn (line 2) | function Jn(){this._call=this._time=this._next=null}
  function er (line 2) | function er(e,t,n){var r=new Jn;return r.restart(e,t,n),r}
  function tr (line 2) | function tr(){$n=(Zn=Xn.now())+Yn,Hn=Vn=0;try{!function(){Gn(),++Hn;for(...
  function nr (line 2) | function nr(){var e=Xn.now(),t=e-Zn;t>1e3&&(Yn-=t,Zn=e)}
  function rr (line 2) | function rr(e){Hn||(Vn&&(Vn=clearTimeout(Vn)),e-$n>24?(e<1/0&&(Vn=setTim...
  function or (line 2) | function or(e,t,n){var r=new Jn;return t=null==t?0:+t,r.restart((functio...
  function lr (line 2) | function lr(e,t,n,r,o,i){var a=e.__transition;if(a){if(n in a)return}els...
  function sr (line 2) | function sr(e,t){var n=cr(e,t);if(n.state>0)throw new Error("too late; a...
  function ur (line 2) | function ur(e,t){var n=cr(e,t);if(n.state>3)throw new Error("too late; a...
  function cr (line 2) | function cr(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("...
  function dr (line 2) | function dr(e,t){var n,r,o,i=e.__transition,a=!0;if(i){for(o in t=null==...
  function fr (line 2) | function fr(e,t){return e=+e,t=+t,function(n){return e*(1-n)+t*n}}
  function gr (line 2) | function gr(e,t,n,r,o,i){var a,l,s;return(a=Math.sqrt(e*e+t*t))&&(e/=a,t...
  function vr (line 2) | function vr(e,t,n,r){function o(e){return e.length?e.pop()+" ":""}return...
  function wr (line 2) | function wr(e,t){var n,r;return function(){var o=ur(this,e),i=o.tween;if...
  function xr (line 2) | function xr(e,t,n){var r,o;if("function"!==typeof n)throw new Error;retu...
  function kr (line 2) | function kr(e,t,n){var r=e._id;return e.each((function(){var e=ur(this,r...
  function _r (line 2) | function _r(e,t,n){e.prototype=t.prototype=n,n.constructor=e}
  function Sr (line 2) | function Sr(e,t){var n=Object.create(e.prototype);for(var r in t)n[r]=t[...
  function Cr (line 2) | function Cr(){}
  function Fr (line 2) | function Fr(){return this.rgb().formatHex()}
  function Br (line 2) | function Br(){return this.rgb().formatRgb()}
  function qr (line 2) | function qr(e){var t,n;return e=(e+"").trim().toLowerCase(),(t=Pr.exec(e...
  function Ur (line 2) | function Ur(e){return new Zr(e>>16&255,e>>8&255,255&e,1)}
  function Hr (line 2) | function Hr(e,t,n,r){return r<=0&&(e=t=n=NaN),new Zr(e,t,n,r)}
  function Vr (line 2) | function Vr(e){return e instanceof Cr||(e=qr(e)),e?new Zr((e=e.rgb()).r,...
  function Wr (line 2) | function Wr(e,t,n,r){return 1===arguments.length?Vr(e):new Zr(e,t,n,null...
  function Zr (line 2) | function Zr(e,t,n,r){this.r=+e,this.g=+t,this.b=+n,this.opacity=+r}
  function $r (line 2) | function $r(){return"#".concat(Gr(this.r)).concat(Gr(this.g)).concat(Gr(...
  function Yr (line 2) | function Yr(){var e=Xr(this.opacity);return"".concat(1===e?"rgb(":"rgba(...
  function Xr (line 2) | function Xr(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}
  function Kr (line 2) | function Kr(e){return Math.max(0,Math.min(255,Math.round(e)||0))}
  function Gr (line 2) | function Gr(e){return((e=Kr(e))<16?"0":"")+e.toString(16)}
  function Qr (line 2) | function Qr(e,t,n,r){return r<=0?e=t=n=NaN:n<=0||n>=1?e=t=NaN:t<=0&&(e=N...
  function Jr (line 2) | function Jr(e){if(e instanceof eo)return new eo(e.h,e.s,e.l,e.opacity);i...
  function eo (line 2) | function eo(e,t,n,r){this.h=+e,this.s=+t,this.l=+n,this.opacity=+r}
  function to (line 2) | function to(e){return(e=(e||0)%360)<0?e+360:e}
  function no (line 2) | function no(e){return Math.max(0,Math.min(1,e||0))}
  function ro (line 2) | function ro(e,t,n){return 255*(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(...
  function oo (line 2) | function oo(e,t,n,r,o){var i=e*e,a=i*e;return((1-3*e+3*i-a)*t+(4-6*i+3*a...
  function ao (line 2) | function ao(e,t){return function(n){return e+n*t}}
  function lo (line 2) | function lo(e){return 1===(e=+e)?so:function(t,n){return n-t?function(e,...
  function so (line 2) | function so(e,t){var n=t-e;return n?ao(e,n):io(isNaN(e)?t:e)}
  function r (line 2) | function r(e,t){var r=n((e=Wr(e)).r,(t=Wr(t)).r),o=n(e.g,t.g),i=n(e.b,t....
  function co (line 2) | function co(e){return function(t){var n,r,o=t.length,i=new Array(o),a=ne...
  function po (line 2) | function po(e,t){var n,r,o,i=fo.lastIndex=ho.lastIndex=0,a=-1,l=[],s=[];...
  function mo (line 2) | function mo(e,t){var n;return("number"===typeof t?fr:t instanceof qr?uo:...
  function go (line 2) | function go(e){return function(){this.removeAttribute(e)}}
  function vo (line 2) | function vo(e){return function(){this.removeAttributeNS(e.space,e.local)}}
  function yo (line 2) | function yo(e,t,n){var r,o,i=n+"";return function(){var a=this.getAttrib...
  function bo (line 2) | function bo(e,t,n){var r,o,i=n+"";return function(){var a=this.getAttrib...
  function wo (line 2) | function wo(e,t,n){var r,o,i;return function(){var a,l,s=n(this);if(null...
  function xo (line 2) | function xo(e,t,n){var r,o,i;return function(){var a,l,s=n(this);if(null...
  function ko (line 2) | function ko(e,t){return function(n){this.setAttribute(e,t.call(this,n))}}
  function _o (line 2) | function _o(e,t){return function(n){this.setAttributeNS(e.space,e.local,...
  function So (line 2) | function So(e,t){var n,r;function o(){var o=t.apply(this,arguments);retu...
  function Co (line 2) | function Co(e,t){var n,r;function o(){var o=t.apply(this,arguments);retu...
  function Eo (line 2) | function Eo(e,t){return function(){sr(this,e).delay=+t.apply(this,argume...
  function No (line 2) | function No(e,t){return t=+t,function(){sr(this,e).delay=t}}
  function Mo (line 2) | function Mo(e,t){return function(){ur(this,e).duration=+t.apply(this,arg...
  function Ao (line 2) | function Ao(e,t){return t=+t,function(){ur(this,e).duration=t}}
  function Do (line 2) | function Do(e,t){if("function"!==typeof t)throw new Error;return functio...
  function Po (line 2) | function Po(e,t,n){var r,o,i=function(e){return(e+"").trim().split(/^|\s...
  function zo (line 2) | function zo(e){return function(){this.style.removeProperty(e)}}
  function jo (line 2) | function jo(e,t,n){return function(r){this.style.setProperty(e,t.call(th...
  function Oo (line 2) | function Oo(e,t,n){var r,o;function i(){var i=t.apply(this,arguments);re...
  function To (line 2) | function To(e){return function(t){this.textContent=e.call(this,t)}}
  function Io (line 2) | function Io(e){var t,n;function r(){var r=e.apply(this,arguments);return...
  function Fo (line 2) | function Fo(e,t,n,r){this._groups=e,this._parents=t,this._name=n,this._i...
  function Bo (line 2) | function Bo(){return++Ro}
  function Ho (line 2) | function Ho(e,t){for(var n;!(n=e.__transition)||!(n=n[t]);)if(!(e=e.pare...
  function Wo (line 2) | function Wo(e,t){var n=t.sourceEvent,r=t.target,o=t.transform,i=t.dispat...
  function Zo (line 2) | function Zo(e,t,n){this.k=e,this.x=t,this.y=n}
  function Yo (line 2) | function Yo(e){e.stopImmediatePropagation()}
  function Xo (line 2) | function Xo(e){e.preventDefault(),e.stopImmediatePropagation()}
  function Ko (line 2) | function Ko(e){return(!e.ctrlKey||"wheel"===e.type)&&!e.button}
  function Go (line 2) | function Go(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGEle...
  function Qo (line 2) | function Qo(){return this.__zoom||$o}
  function Jo (line 2) | function Jo(e){return-e.deltaY*(1===e.deltaMode?.05:e.deltaMode?1:.002)*...
  function ei (line 2) | function ei(){return navigator.maxTouchPoints||"ontouchstart"in this}
  function ti (line 2) | function ti(e,t,n){var r=e.invertX(t[0][0])-n[0][0],o=e.invertX(t[1][0])...
  function fi (line 2) | function fi(t,n){var r=(0,e.useContext)(ui);if(null===r)throw new Error(...
  function mi (line 2) | function mi(e){var t=e.position,n=e.children,r=e.className,o=e.style,i=W...
  function gi (line 2) | function gi(e){var t=e.proOptions,n=e.position,r=void 0===n?"bottom-righ...
  function Pi (line 2) | function Pi(e){var t,n,r=function(e){return"nativeEvent"in e}(e)?e.nativ...
  function Fi (line 2) | function Fi(e,t,n){return void 0===n?n:function(r){var o=t().edges.find(...
  function Bi (line 2) | function Bi(e){var t=e.sourceX,n=e.sourceY,r=e.targetX,o=e.targetY,i=Mat...
  function qi (line 2) | function qi(e){var t=e.sourceX,n=e.sourceY,r=e.targetX,o=e.targetY,i=e.s...
  function Ui (line 2) | function Ui(e){var t=e.pos,n=e.x1,r=e.y1,o=e.x2,i=e.y2;return t===Ri.Lef...
  function Hi (line 2) | function Hi(e){var t=e.sourceX,n=e.sourceY,r=e.sourcePosition,o=void 0==...
  function $i (line 2) | function $i(e){var t,n,r=e.source,o=e.sourcePosition,i=void 0===o?Ri.Bot...
  function Yi (line 2) | function Yi(e){var t=e.sourceX,n=e.sourceY,r=e.sourcePosition,o=void 0==...
  function Qi (line 2) | function Qi(e,t){return e>=0?.5*e:25*t*Math.sqrt(-e)}
  function Ji (line 2) | function Ji(e){var t=e.pos,n=e.x1,r=e.y1,o=e.x2,i=e.y2,a=e.c;switch(t){c...
  function ea (line 2) | function ea(e){var t=e.sourceX,n=e.sourceY,r=e.sourcePosition,o=void 0==...
  function oa (line 2) | function oa(e,t,n,r,o,i,a){var l=a.elementFromPoint(e.clientX,e.clientY)...
  function ia (line 2) | function ia(e){null===e||void 0===e||e.classList.remove("react-flow__han...
  function aa (line 2) | function aa(e){var t=e.event,n=e.handleId,r=e.nodeId,o=e.onConnect,i=e.i...
  function Da (line 2) | function Da(e,t){return Qe(e.selectedNodes.map(Aa),t.selectedNodes.map(A...
  function za (line 2) | function za(e){var t=e.onSelectionChange,n=fi(La);return t||n?(0,Ze.jsx)...
  function Oa (line 2) | function Oa(t,n){(0,e.useEffect)((function(){"undefined"!==typeof t&&n(t...
  function Ta (line 2) | function Ta(t,n,r){(0,e.useEffect)((function(){"undefined"!==typeof n&&r...
  function Ha (line 2) | function Ha(e){var t=e.rfId,n=fi(Ua);return(0,Ze.jsx)("div",{id:"".conca...
  function Va (line 2) | function Va(e){var t=e.rfId,n=e.disableKeyboardA11y;return(0,Ze.jsxs)(Ze...
  function Ka (line 2) | function Ka(e){var t={default:Xa(e.default||ta),straight:Xa(e.bezier||Gi...
  function Ga (line 2) | function Ga(e,t){var n=arguments.length>2&&void 0!==arguments[2]?argumen...
  function Qa (line 2) | function Qa(e,t){if(!e)return null;var n=null;return 1!==e.length&&t?t&&...
  function Ja (line 2) | function Ja(e){var t,n,r,o,i,a=(null===e||void 0===e||null===(t=e[Mi])||...
  function el (line 2) | function el(e,t){if(!e.parentNode)return!1;var n=t.get(e.parentNode);ret...
  function tl (line 2) | function tl(e,t,n){var r=e;do{var o;if(null!==(o=r)&&void 0!==o&&o.match...
  function nl (line 2) | function nl(e,t,n){return Array.from(e.values()).filter((function(t){ret...
  function rl (line 2) | function rl(e,t,n,r){var o=arguments.length>4&&void 0!==arguments[4]?arg...
  function ol (line 2) | function ol(e){var t=e.nodeId,n=e.dragItems,r=e.nodeInternals,o=n.map((f...
  function al (line 2) | function al(e,t,n){return void 0===n?n:function(r){var o=t().nodeInterna...
  function ll (line 2) | function ll(e){var t=e.id,n=e.store,r=e.unselect,o=void 0!==r&&r,i=n.get...
  function sl (line 2) | function sl(e){return function(t,n,r){return null===e||void 0===e?void 0...
  function ul (line 2) | function ul(t){var n=t.nodeRef,r=t.disabled,o=void 0!==r&&r,i=t.noDragCl...
  function cl (line 2) | function cl(){var t=hi();return(0,e.useCallback)((function(e){var n=t.ge...
  function hl (line 2) | function hl(e){var t={input:fl(e.input||Sa),default:fl(e.default||ka),ou...
  function gl (line 2) | function gl(e,t,n){return e.filter((function(e){return n||e.length===t.s...
  function vl (line 2) | function vl(e,t){return t.includes(e)?"code":"key"}
  function yl (line 2) | function yl(e,t,n,r){var o,i,a,l,s,u,c,d;if(!e.parentNode)return n;var f...
  function bl (line 2) | function bl(e,t,n){e.forEach((function(r){if(r.parentNode&&!e.has(r.pare...
  function wl (line 2) | function wl(e,t,n,r){var o=new Map,i={},a=r?1e3:0;return e.forEach((func...
  function xl (line 2) | function xl(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments...
  function kl (line 2) | function kl(e,t){return e.forEach((function(e){var n,r=t.get(e.id);r&&t....
  function _l (line 2) | function _l(e,t){return t.map((function(t){var n=e.find((function(e){ret...
  function Sl (line 2) | function Sl(e){var t=e.changedNodes,n=e.changedEdges,r=e.get,o=e.set,i=r...
  function Al (line 2) | function Al(){var t=Ml(),n=hi(),r=(0,e.useCallback)((function(){return n...
  function g (line 2) | function g(e){e.property("__zoom",Qo).on("wheel.zoom",_,{passive:!1}).on...
  function v (line 2) | function v(e,t){return(t=Math.max(s[0],Math.min(s[1],t)))===e.k?e:new Zo...
  function y (line 2) | function y(e,t,n){var r=t[0]-n[0]*e.k,o=t[1]-n[1]*e.k;return r===e.x&&o=...
  function b (line 2) | function b(e){return[(+e[0][0]+ +e[1][0])/2,(+e[0][1]+ +e[1][1])/2]}
  function w (line 2) | function w(e,t,n,r){e.on("start.zoom",(function(){x(this,arguments).even...
  function x (line 2) | function x(e,t,n){return!n&&e.__zooming||new k(e,t)}
  function k (line 2) | function k(e,t){this.that=e,this.args=t,this.active=0,this.sourceEvent=n...
  function _ (line 2) | function _(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;...
  function S (line 2) | function S(e){for(var t=arguments.length,o=new Array(t>1?t-1:0),a=1;a<t;...
  function C (line 2) | function C(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a<t;...
  function E (line 2) | function E(n){for(var o=arguments.length,i=new Array(o>1?o-1:0),a=1;a<o;...
  function N (line 2) | function N(e){if(this.__zooming){for(var t=arguments.length,n=new Array(...
  function M (line 2) | function M(e){for(var r=arguments.length,o=new Array(r>1?r-1:0),i=1;i<r;...
  function Il (line 2) | function Il(){var e=fi(Tl,Qe),t=e.userSelectionActive,n=e.userSelectionR...
  function Rl (line 2) | function Rl(e,t){var n=e.find((function(e){return e.id===t.parentNode}))...
  function Fl (line 2) | function Fl(e,t){if(e.some((function(e){return"reset"===e.type})))return...
  function Bl (line 2) | function Bl(e,t){return Fl(e,t)}
  function Ul (line 2) | function Ul(e,t){return e.reduce((function(e,n){var r=t.includes(n.id);r...
  function Hl (line 2) | function Hl(e,t){return{x:e.clientX-t.left,y:e.clientY-t.top}}
  function rs (line 2) | function rs(t,n,r){var o=fi((0,e.useCallback)((function(e){return t?e.ed...
  function ps (line 2) | function ps(e){var t=e.children,n=fi(hs);return(0,Ze.jsx)("div",{classNa...
  function xs (line 2) | function xs(t,n){(0,e.useRef)(null);return(0,e.useMemo)((function(){retu...
  function As (line 2) | function As(t){return function(n){var r=l((0,e.useState)(n),2),o=r[0],i=...
  function zs (line 2) | function zs(){return(0,Ze.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg"...
  function js (line 2) | function js(){return(0,Ze.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg"...
  function Os (line 2) | function Os(){return(0,Ze.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg"...
  function Ts (line 2) | function Ts(){return(0,Ze.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg"...
  function Is (line 2) | function Is(){return(0,Ze.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg"...
  function Ws (line 2) | function Ws(e){var t=e.color,n=e.dimensions,r=e.lineWidth;return(0,Ze.js...
  function Zs (line 2) | function Zs(e){var t=e.color,n=e.radius;return(0,Ze.jsx)("circle",{cx:n,...
  function Ks (line 2) | function Ks(t){var n=t.variant,r=void 0===n?Hs.Dots:n,o=t.gap,i=void 0==...
  function ou (line 2) | function ou(e,t,n,r,o,i,a){try{var l=e[i](a),s=l.value}catch(u){return v...
  function iu (line 2) | function iu(e){return function(){var t=this,n=arguments;return new Promi...
  function yu (line 2) | function yu(t){var n=l((0,e.useState)(""),2),r=n[0],o=n[1],i=l((0,e.useS...
  function bu (line 2) | function bu(){return(0,Ze.jsxs)("svg",{style:{position:"absolute",top:0,...
  function Su (line 2) | function Su(e){return(0,Ze.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg...
  function Cu (line 2) | function Cu(){return(0,Ze.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg...
  function Eu (line 2) | function Eu(){return(0,Ze.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg...
  function Nu (line 2) | function Nu(){return(0,Ze.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg...
  function Mu (line 2) | function Mu(){return(0,Ze.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg...
  function Au (line 2) | function Au(t){var n=l((0,e.useState)(""),2),r=n[0],o=n[1],i=l((0,e.useS...
  function Ou (line 2) | function Ou(){var t=function(){var t=e.useContext(pe).matches,n=t[t.leng...
  function Tu (line 2) | function Tu(){return(0,Ze.jsxs)("div",{children:[(0,Ze.jsx)("h2",{childr...

FILE: src/App/SQLHabitLogo.tsx
  function SQLHabitLogo (line 1) | function SQLHabitLogo() {

FILE: src/App/index.tsx
  function App (line 7) | function App() {
  function Layout (line 29) | function Layout() {
  function Database (line 39) | function Database() {
  function NoMatch (line 50) | function NoMatch() {

FILE: src/Visualizer/components/CloseIcon.tsx
  function CloseIcon (line 3) | function CloseIcon(props: CloseIconProps) {

FILE: src/Visualizer/components/DatabaseIcon.tsx
  function DatabaseIcon (line 1) | function DatabaseIcon() {

FILE: src/Visualizer/components/DatabaseMenuSidebar.tsx
  function DatabaseMenuSidebar (line 7) | function DatabaseMenuSidebar(props: DatabaseMenuPopupProps) {

FILE: src/Visualizer/components/InfoIcon.tsx
  function InfoIcon (line 1) | function InfoIcon() {

FILE: src/Visualizer/components/InfoPopup.tsx
  function InfoPopup (line 6) | function InfoPopup(props: PopupProps) {

FILE: src/Visualizer/components/KeyIcon.tsx
  function KeyIcon (line 1) | function KeyIcon() {

FILE: src/Visualizer/components/Markers.tsx
  function Markers (line 1) | function Markers() {

FILE: src/Visualizer/components/MaximizeIcon.tsx
  function MaximizeIcon (line 4) | function MaximizeIcon() {

FILE: src/Visualizer/components/MinimizeIcon.tsx
  function MinimizeIcon (line 4) | function MinimizeIcon() {

FILE: src/Visualizer/helpers/calculateEdges.ts
  type CalculateEdgesOptions (line 8) | interface CalculateEdgesOptions {

FILE: src/Visualizer/index.tsx
  type FlowProps (line 44) | interface FlowProps {
  type VisualizerProps (line 48) | interface VisualizerProps {

FILE: src/Visualizer/types/CloseIconProps.ts
  type CloseIconProps (line 1) | type CloseIconProps = {

FILE: src/Visualizer/types/DatabaseConfig.ts
  type Database (line 6) | type Database = {
  type Databases (line 12) | type Databases = {
  type DatabaseConfig (line 16) | type DatabaseConfig = {
  type DatabaseConfigs (line 23) | type DatabaseConfigs = {

FILE: src/Visualizer/types/EdgeConfig.ts
  type EdgeConfig (line 1) | interface EdgeConfig {

FILE: src/Visualizer/types/PopupProps.ts
  type DatabasePopupProps (line 1) | type DatabasePopupProps = {
  type PopupProps (line 6) | type PopupProps = {
  type DatabaseMenuPopupProps (line 10) | type DatabaseMenuPopupProps = DatabasePopupProps & PopupProps;

FILE: src/Visualizer/types/Position.ts
  type Position (line 1) | interface Position {

FILE: src/Visualizer/types/SchemaColors.ts
  type SchemaColors (line 1) | interface SchemaColors {

FILE: src/Visualizer/types/TableColumnConfig.ts
  type TableColumnConfig (line 1) | interface TableColumnConfig {

FILE: src/Visualizer/types/TableConfig.ts
  type TableConfig (line 3) | interface TableConfig {

FILE: src/Visualizer/types/TablePositions.ts
  type TablePositions (line 3) | interface TablePositions {

FILE: src/setupTests.ts
  class ResizeObserver (line 9) | class ResizeObserver {
    method constructor (line 12) | constructor(callback: globalThis.ResizeObserverCallback) {
    method observe (line 16) | observe(target: Element) {
    method unobserve (line 20) | unobserve() {}
    method disconnect (line 22) | disconnect() {}
  class DOMMatrixReadOnly (line 28) | class DOMMatrixReadOnly {
    method constructor (line 30) | constructor(transform: string) {
  method get (line 41) | get() {
  method get (line 46) | get() {
Condensed preview — 213 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (901K chars).
[
  {
    "path": ".github/workflows/deploy.yml",
    "chars": 1587,
    "preview": "# https://dev.to/github/how-to-deploy-a-static-site-in-any-framework-of-your-choice-github-pages-neh\nname: Deploy to Git"
  },
  {
    "path": ".gitignore",
    "chars": 84,
    "preview": ".DS_Store\n.cache\nnode_modules\ndist\n.env\n.eslintcache\n.idea\n.log\n.rollup.cache\n*.csv\n"
  },
  {
    "path": ".npmrc",
    "chars": 7,
    "preview": "8.19.3\n"
  },
  {
    "path": ".nvmrc",
    "chars": 8,
    "preview": "16.19.0\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1009,
    "preview": "# SQL Schema Visualizer Contribution Guidelines\n\nFirst of all, thank you for your interest in contributing to the Schema"
  },
  {
    "path": "LICENSE",
    "chars": 1087,
    "preview": "MIT License\n\nCopyright (c) 2023 Anatoli Makarevich @ SQL Habit\n\nPermission is hereby granted, free of charge, to any per"
  },
  {
    "path": "README.md",
    "chars": 13018,
    "preview": "![SQL Schema Visualizer snapshot](https://raw.githubusercontent.com/sqlhabit/sql_schema_visualizer/main/docs/snapshot.pn"
  },
  {
    "path": "bin/create_db_pages",
    "chars": 363,
    "preview": "#!/usr/bin/env node\n\nconst databases = require(\"../src/config/databases.json\");\n\nconst fs = require(\"fs\").promises;\n\n// "
  },
  {
    "path": "bin/import",
    "chars": 6229,
    "preview": "#!/usr/bin/env node\n\nconst fs = require(\"fs\").promises;\n\nconst SCHEMA_COLORS_TEMPLATE_FILE = \"src/config/schemaColors.js"
  },
  {
    "path": "bin/reset",
    "chars": 906,
    "preview": "#!/usr/bin/env node\n\nconst fs = require(\"fs\").promises;\n\nconst resetConfigFile = async (filePath, templatePath = `${file"
  },
  {
    "path": "build/asset-manifest.json",
    "chars": 4686,
    "preview": "{\n  \"files\": {\n    \"main.css\": \"/sql_schema_visualizer/static/css/main.9f228f45.css\",\n    \"main.js\": \"/sql_schema_visual"
  },
  {
    "path": "build/databases/bindle.html",
    "chars": 900,
    "preview": "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"/><link rel=\"icon\" href=\"/sql_schema_visualizer/favicon.ico\"/>"
  },
  {
    "path": "build/databases/ecommerce.html",
    "chars": 900,
    "preview": "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"/><link rel=\"icon\" href=\"/sql_schema_visualizer/favicon.ico\"/>"
  },
  {
    "path": "build/databases/finance.html",
    "chars": 900,
    "preview": "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"/><link rel=\"icon\" href=\"/sql_schema_visualizer/favicon.ico\"/>"
  },
  {
    "path": "build/databases/live.html",
    "chars": 900,
    "preview": "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"/><link rel=\"icon\" href=\"/sql_schema_visualizer/favicon.ico\"/>"
  },
  {
    "path": "build/databases/movies.html",
    "chars": 900,
    "preview": "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"/><link rel=\"icon\" href=\"/sql_schema_visualizer/favicon.ico\"/>"
  },
  {
    "path": "build/databases/nba.html",
    "chars": 900,
    "preview": "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"/><link rel=\"icon\" href=\"/sql_schema_visualizer/favicon.ico\"/>"
  },
  {
    "path": "build/databases/the-bank-job.html",
    "chars": 900,
    "preview": "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"/><link rel=\"icon\" href=\"/sql_schema_visualizer/favicon.ico\"/>"
  },
  {
    "path": "build/index.html",
    "chars": 900,
    "preview": "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"/><link rel=\"icon\" href=\"/sql_schema_visualizer/favicon.ico\"/>"
  },
  {
    "path": "build/static/css/main.9f228f45.css",
    "chars": 14035,
    "preview": "@import url(https://fonts.googleapis.com/css?family=Muli:400,400i,500,600,700,800&display=swap);.react-flow__resize-cont"
  },
  {
    "path": "build/static/js/226.0d90ab44.chunk.js",
    "chars": 15934,
    "preview": "/*! For license information please see 226.0d90ab44.chunk.js.LICENSE.txt */\n\"use strict\";(self.webpackChunksql_schema_vi"
  },
  {
    "path": "build/static/js/226.0d90ab44.chunk.js.LICENSE.txt",
    "chars": 73,
    "preview": "/*! Copyright Twitter Inc. and other contributors. Licensed under MIT */\n"
  },
  {
    "path": "build/static/js/394.14a9b9da.chunk.js",
    "chars": 62917,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[394],{1506:funct"
  },
  {
    "path": "build/static/js/bindle-edges-json.94501736.chunk.js",
    "chars": 1497,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[691],{8866:funct"
  },
  {
    "path": "build/static/js/bindle-schemaColors-json.b87e5760.chunk.js",
    "chars": 290,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[480],{1737:funct"
  },
  {
    "path": "build/static/js/bindle-tablePositions-json.847db583.chunk.js",
    "chars": 695,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[356],{3366:funct"
  },
  {
    "path": "build/static/js/bindle-tables.0d2bfe46.chunk.js",
    "chars": 14037,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[112],{2905:funct"
  },
  {
    "path": "build/static/js/ecommerce-edges-json.fe131063.chunk.js",
    "chars": 1270,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[547],{5336:funct"
  },
  {
    "path": "build/static/js/ecommerce-schemaColors-json.fdb98809.chunk.js",
    "chars": 196,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[415],{1090:funct"
  },
  {
    "path": "build/static/js/ecommerce-tablePositions-json.03a16298.chunk.js",
    "chars": 520,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[743],{9543:funct"
  },
  {
    "path": "build/static/js/ecommerce-tables.f5264437.chunk.js",
    "chars": 7402,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[679],{4213:funct"
  },
  {
    "path": "build/static/js/finance-edges-json.cc1c201e.chunk.js",
    "chars": 264,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[575],{5490:funct"
  },
  {
    "path": "build/static/js/finance-schemaColors-json.e0d3a5af.chunk.js",
    "chars": 196,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[988],{5881:funct"
  },
  {
    "path": "build/static/js/finance-tablePositions-json.9ab03387.chunk.js",
    "chars": 231,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[342],{514:functi"
  },
  {
    "path": "build/static/js/finance-tables.eac6da84.chunk.js",
    "chars": 1245,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[990],{8986:funct"
  },
  {
    "path": "build/static/js/live-edges-json.849f23e8.chunk.js",
    "chars": 826,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[961],{8140:funct"
  },
  {
    "path": "build/static/js/live-schemaColors-json.3efe2122.chunk.js",
    "chars": 225,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[418],{8669:funct"
  },
  {
    "path": "build/static/js/live-tablePositions-json.88001c8e.chunk.js",
    "chars": 339,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[583],{6431:funct"
  },
  {
    "path": "build/static/js/live-tables.5a699030.chunk.js",
    "chars": 4657,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[752],{3456:funct"
  },
  {
    "path": "build/static/js/main.33dfc6b0.js",
    "chars": 474117,
    "preview": "/*! For license information please see main.33dfc6b0.js.LICENSE.txt */\n!function(){var e={6927:function(e,t,n){\"use stri"
  },
  {
    "path": "build/static/js/main.33dfc6b0.js.LICENSE.txt",
    "chars": 2335,
    "preview": "/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/rege"
  },
  {
    "path": "build/static/js/movies-edges-json.5b3266f6.chunk.js",
    "chars": 984,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[127],{8997:funct"
  },
  {
    "path": "build/static/js/movies-schemaColors-json.a48d91cc.chunk.js",
    "chars": 196,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[822],{5544:funct"
  },
  {
    "path": "build/static/js/movies-tablePositions-json.1435348f.chunk.js",
    "chars": 414,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[250],{8863:funct"
  },
  {
    "path": "build/static/js/movies-tables.37f21107.chunk.js",
    "chars": 3309,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[281],{1233:funct"
  },
  {
    "path": "build/static/js/nba-edges-json.b14b1c04.chunk.js",
    "chars": 696,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[87],{6469:functi"
  },
  {
    "path": "build/static/js/nba-schemaColors-json.e0912a1a.chunk.js",
    "chars": 196,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[741],{1873:funct"
  },
  {
    "path": "build/static/js/nba-tablePositions-json.eda5bb0d.chunk.js",
    "chars": 344,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[869],{4139:funct"
  },
  {
    "path": "build/static/js/nba-tables.7858f3c9.chunk.js",
    "chars": 5989,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[63],{4156:functi"
  },
  {
    "path": "build/static/js/the-bank-job-edges-json.f4126c62.chunk.js",
    "chars": 1853,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[335],{4879:funct"
  },
  {
    "path": "build/static/js/the-bank-job-schemaColors-json.00b0e9ee.chunk.js",
    "chars": 303,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[906],{4189:funct"
  },
  {
    "path": "build/static/js/the-bank-job-tablePositions-json.1ddd80ab.chunk.js",
    "chars": 900,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[972],{3388:funct"
  },
  {
    "path": "build/static/js/the-bank-job-tables.b72c42c8.chunk.js",
    "chars": 10741,
    "preview": "\"use strict\";(self.webpackChunksql_schema_visualizer=self.webpackChunksql_schema_visualizer||[]).push([[449],{2865:funct"
  },
  {
    "path": "design_notes/0001_using_regular_links.md",
    "chars": 587,
    "preview": "# Using regular links\n\n:calendar: **Last edited on Feb 5, 2023**\n\nYou may have noticed that Visualizer uses regular `<a>"
  },
  {
    "path": "package.json",
    "chars": 1637,
    "preview": "{\n  \"name\": \"sql_schema_visualizer\",\n  \"version\": \"1.5.0\",\n  \"homepage\": \"https://sqlhabit.github.io/sql_schema_visualiz"
  },
  {
    "path": "public/index.html",
    "chars": 808,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <link rel=\"icon\" href=\"%PUBLIC_URL%/favicon.i"
  },
  {
    "path": "schema.csv.template",
    "chars": 6264,
    "preview": "\"table_schema\",\"table_name\",\"column_name\",\"data_type\",\"ordinal_position\"\n\"adjust\",\"callbacks\",\"id\",\"bigint\",1\n\"adjust\",\""
  },
  {
    "path": "src/App/App.css",
    "chars": 455,
    "preview": ".App {\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n}\n\n.App-header {\n  height: 40px;\n  display: flex;\n  al"
  },
  {
    "path": "src/App/App.test.tsx",
    "chars": 557,
    "preview": "import { render, } from \"@testing-library/react\";\nimport { createMemoryHistory } from \"history\";\n\nimport App from \".\";\ni"
  },
  {
    "path": "src/App/SQLHabitLogo.tsx",
    "chars": 3595,
    "preview": "function SQLHabitLogo() {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"101\"\n      height=\"2"
  },
  {
    "path": "src/App/index.tsx",
    "chars": 1291,
    "preview": "import Visualizer from \"../Visualizer\";\nimport SQLHabitLogo from \"./SQLHabitLogo\";\nimport { Routes, Route, Outlet, Link,"
  },
  {
    "path": "src/Visualizer/Style.ts",
    "chars": 337,
    "preview": "import \"./style/flow.css\";\nimport \"./style/react-flow.scss\";\nimport \"./style/table.scss\";\nimport \"./style/column-name.sc"
  },
  {
    "path": "src/Visualizer/Visualizer.test.tsx",
    "chars": 772,
    "preview": "import { render, waitFor } from \"@testing-library/react\";\nimport Visualizer from \".\";\n\nconst wrapperStyle = { width: 120"
  },
  {
    "path": "src/Visualizer/components/CloseIcon.tsx",
    "chars": 494,
    "preview": "import { CloseIconProps } from \"../types\";\n\nexport function CloseIcon(props: CloseIconProps) {\n  return (\n    <svg\n     "
  },
  {
    "path": "src/Visualizer/components/DatabaseIcon.tsx",
    "chars": 833,
    "preview": "function DatabaseIcon() {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"48\"\n      height=\"48"
  },
  {
    "path": "src/Visualizer/components/DatabaseMenuSidebar.tsx",
    "chars": 3798,
    "preview": "import { useState, useEffect } from \"react\";\nimport { markdown } from \"../helpers\";\nimport { CloseIcon, InfoIcon } from "
  },
  {
    "path": "src/Visualizer/components/InfoIcon.tsx",
    "chars": 498,
    "preview": "export function InfoIcon() {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"512\"\n      height"
  },
  {
    "path": "src/Visualizer/components/InfoPopup.tsx",
    "chars": 2508,
    "preview": "import { useState, useEffect } from \"react\";\nimport { markdown } from \"../helpers\";\nimport { CloseIcon } from \"../compon"
  },
  {
    "path": "src/Visualizer/components/KeyIcon.tsx",
    "chars": 1478,
    "preview": "export function KeyIcon() {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"800\"\n      height="
  },
  {
    "path": "src/Visualizer/components/Markers.tsx",
    "chars": 3607,
    "preview": "export function Markers() {\n  return (\n    <svg style={{ position: \"absolute\", top: 0, left: 0 }}>\n      <defs>\n        "
  },
  {
    "path": "src/Visualizer/components/MaximizeIcon.tsx",
    "chars": 1431,
    "preview": "// https://www.svgrepo.com/svg/469238/maximize-size\n// https://svg2jsx.com/\n\nexport function MaximizeIcon() {\n  return ("
  },
  {
    "path": "src/Visualizer/components/MinimizeIcon.tsx",
    "chars": 1435,
    "preview": "// https://www.svgrepo.com/svg/469278/minimize-size\n// https://svg2jsx.com/\n\nexport function MinimizeIcon() {\n  return ("
  },
  {
    "path": "src/Visualizer/components/TableNode.tsx",
    "chars": 6258,
    "preview": "import { useState, FC, useEffect, memo, useCallback } from \"react\";\nimport { Handle, Position, NodeProps } from \"reactfl"
  },
  {
    "path": "src/Visualizer/components/index.ts",
    "chars": 271,
    "preview": "export * from \"./InfoPopup\";\nexport * from \"./Markers\";\nexport * from \"./TableNode\";\nexport * from \"./CloseIcon\"\nexport "
  },
  {
    "path": "src/Visualizer/helpers/calculateEdges.ts",
    "chars": 1732,
    "preview": "import { edgeMarkerName } from \"./edgeMarkerName\";\nimport { edgeClassName } from \"./edgeClassName\";\nimport { calculateSo"
  },
  {
    "path": "src/Visualizer/helpers/calculateSourcePosition.ts",
    "chars": 450,
    "preview": "export const calculateSourcePosition = (\n  sourceNodeWidth: number,\n  sourceNodeX: number,\n  targetNodeWidth: number,\n  "
  },
  {
    "path": "src/Visualizer/helpers/calculateTargetPosition.ts",
    "chars": 450,
    "preview": "export const calculateTargetPosition = (\n  sourceNodeWidth: number,\n  sourceNodeX: number,\n  targetNodeWidth: number,\n  "
  },
  {
    "path": "src/Visualizer/helpers/edgeClassName.ts",
    "chars": 385,
    "preview": "export const edgeClassName = (edgeConfig: any, targetPosition?: string) => {\n  let className = edgeConfig.relation === \""
  },
  {
    "path": "src/Visualizer/helpers/edgeMarkerName.ts",
    "chars": 376,
    "preview": "export const edgeMarkerName = (edgeConfig: any, targetPosition?: string) => {\n  let markerName = edgeConfig.relation ==="
  },
  {
    "path": "src/Visualizer/helpers/fullTableName.ts",
    "chars": 190,
    "preview": "export const fullTableName = (tableName: string, schemaName = \"public\") => {\n  if(tableName.includes(\".\")) {\n    return "
  },
  {
    "path": "src/Visualizer/helpers/index.ts",
    "chars": 473,
    "preview": "export * from \"./edgeClassName\";\nexport * from \"./edgeMarkerName\";\nexport * from \"./calculateTargetPosition\";\nexport * f"
  },
  {
    "path": "src/Visualizer/helpers/initializeNodes.ts",
    "chars": 1962,
    "preview": "import { fullTableName } from \"./fullTableName\";\nimport { DatabaseConfig, EdgeConfig, Position, TableConfig, TablePositi"
  },
  {
    "path": "src/Visualizer/helpers/loadDatabaseConfig.ts",
    "chars": 1665,
    "preview": "import { EdgeConfig, SchemaColors, TableConfig, TablePositions } from \"../types\";\nimport { fullTableName } from \"./fullT"
  },
  {
    "path": "src/Visualizer/helpers/loadDatabases.ts",
    "chars": 802,
    "preview": "import { DatabaseConfigs, DatabaseConfig } from \"../types\";\nimport { loadDatabaseConfig } from \"../helpers\";\nimport data"
  },
  {
    "path": "src/Visualizer/helpers/logTablePositions.ts",
    "chars": 675,
    "preview": "import { Node } from \"reactflow\";\nimport { TablePositions } from \"../types\";\n\nexport const logTablePositions = (tableNod"
  },
  {
    "path": "src/Visualizer/helpers/markdown.ts",
    "chars": 2422,
    "preview": "import MarkdownIt from \"markdown-it\";\nimport Token from \"markdown-it/lib/token\";\n\n// Lazy initialization - only load emo"
  },
  {
    "path": "src/Visualizer/helpers/moveSVGInFront.ts",
    "chars": 233,
    "preview": "// An SVG z-index hack to move selected edge on top of other edges.\nexport const moveSVGInFront = (element?: Element | n"
  },
  {
    "path": "src/Visualizer/helpers/setEdgeClassName.ts",
    "chars": 651,
    "preview": "import { Edge } from \"reactflow\";\n\nexport const setEdgeClassName = (edge: Edge) => {\n  if(edge.className?.includes(\"has-"
  },
  {
    "path": "src/Visualizer/helpers/setHighlightEdgeClassName.ts",
    "chars": 1514,
    "preview": "import { Edge } from \"reactflow\";\nimport { moveSVGInFront } from \"./moveSVGInFront\";\n\nexport const setHighlightEdgeClass"
  },
  {
    "path": "src/Visualizer/helpers/tableHighlights.ts",
    "chars": 1010,
    "preview": "const currentUrl = new URL(window.location.href)\nconst urlParams = currentUrl.searchParams\nconst highlights = (urlParams"
  },
  {
    "path": "src/Visualizer/index.tsx",
    "chars": 12213,
    "preview": "import { useCallback, useEffect, useState } from \"react\";\nimport ReactFlow, {\n  Node, useNodesState, useEdgesState,\n  Co"
  },
  {
    "path": "src/Visualizer/style/column-name.scss",
    "chars": 1560,
    "preview": ".column-name {\n  $root: &;\n\n  position: relative;\n  z-index: 50;\n\n  border-bottom: 0;\n\n  font-size: 12px;\n  line-height:"
  },
  {
    "path": "src/Visualizer/style/database-menu-sidebar.scss",
    "chars": 3032,
    "preview": ".database-menu-sidebar {\n  width: 100%;\n  height: 100%;\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 100000;\n  bac"
  },
  {
    "path": "src/Visualizer/style/flow.css",
    "chars": 141,
    "preview": ".Flow {\n  width: 100%;\n  height: 100%;\n\n  flex-grow: 1;\n  font-size: 12px;\n}\n\n:not(:root):fullscreen::backdrop {\n  backg"
  },
  {
    "path": "src/Visualizer/style/handle.css",
    "chars": 272,
    "preview": ".left-handle {\n  width: 2px;\n  height: 2px;\n  min-width: 2px;\n  left: 0;\n  top: 50%;\n  transform: translateX(-50%) trans"
  },
  {
    "path": "src/Visualizer/style/has-many-edge.scss",
    "chars": 746,
    "preview": ".has-many-edge {\n/* https://reactflow.dev/docs/guides/theming/#react-flow-class-names */\n  &.selected path.react-flow__e"
  },
  {
    "path": "src/Visualizer/style/has-one-edge.scss",
    "chars": 748,
    "preview": ".has-one-edge {\n  /* https://reactflow.dev/docs/guides/theming/#react-flow-class-names */\n  &.selected path.react-flow__"
  },
  {
    "path": "src/Visualizer/style/info-popup.scss",
    "chars": 905,
    "preview": ".info-popup {\n  width: 100%;\n  height: 100%;\n  position: fixed;\n  top: 0;\n  left: 0;\n  display: flex;\n  align-items: cen"
  },
  {
    "path": "src/Visualizer/style/key-icon.css",
    "chars": 66,
    "preview": ".key-icon {\n  width: 12px;\n  height: 12px;\n  margin-right: 4px;\n}\n"
  },
  {
    "path": "src/Visualizer/style/react-flow.scss",
    "chars": 501,
    "preview": ".react-flow {\n  &__node-custom {\n    border: 1px solid #555;\n    padding: 10px;\n    width: 300px;\n    border-radius: 5px"
  },
  {
    "path": "src/Visualizer/style/table.scss",
    "chars": 1576,
    "preview": ".table {\n  $root: &;\n\n  background-color: #FFF;\n\n  &__name {\n    position: relative;\n    padding: 8px;\n\n    border: 0;\n "
  },
  {
    "path": "src/Visualizer/types/CloseIconProps.ts",
    "chars": 77,
    "preview": "export type CloseIconProps = {\n  className?: string,\n  onClick?: Function\n};\n"
  },
  {
    "path": "src/Visualizer/types/DatabaseConfig.ts",
    "chars": 568,
    "preview": "import { EdgeConfig } from \"./EdgeConfig\";\nimport { SchemaColors } from \"./SchemaColors\";\nimport { TableConfig } from \"."
  },
  {
    "path": "src/Visualizer/types/EdgeConfig.ts",
    "chars": 185,
    "preview": "export interface EdgeConfig {\n  source: string;\n  sourceKey: string;\n  target: string;\n  targetKey: string;\n  relation: "
  },
  {
    "path": "src/Visualizer/types/PopupProps.ts",
    "chars": 203,
    "preview": "export type DatabasePopupProps = {\n  headline: string;\n  subheadline?: string;\n}\n\nexport type PopupProps = {\n  onClose: "
  },
  {
    "path": "src/Visualizer/types/Position.ts",
    "chars": 57,
    "preview": "export interface Position {\n  x: number;\n  y: number;\n};\n"
  },
  {
    "path": "src/Visualizer/types/SchemaColors.ts",
    "chars": 67,
    "preview": "export interface SchemaColors {\n  [schemaName: string] : string\n};\n"
  },
  {
    "path": "src/Visualizer/types/TableColumnConfig.ts",
    "chars": 135,
    "preview": "export interface TableColumnConfig {\n  name: string;\n  description: string;\n  type: string;\n  handleType?: string;\n  key"
  },
  {
    "path": "src/Visualizer/types/TableConfig.ts",
    "chars": 206,
    "preview": "import { TableColumnConfig } from \"./TableColumnConfig\";\n\nexport interface TableConfig {\n  schema?: string;\n  schemaColo"
  },
  {
    "path": "src/Visualizer/types/TablePositions.ts",
    "chars": 110,
    "preview": "import { Position } from \"./Position\";\n\nexport interface TablePositions {\n  [tableName: string] : Position\n};\n"
  },
  {
    "path": "src/Visualizer/types/index.ts",
    "chars": 253,
    "preview": "export * from \"./EdgeConfig\";\nexport * from \"./Position\";\nexport * from \"./TablePositions\";\nexport * from \"./SchemaColor"
  },
  {
    "path": "src/config/databases/bindle/edges.json",
    "chars": 1787,
    "preview": "[\n  {\n    \"source\": \"users\",\n    \"sourceKey\": \"id\",\n    \"target\": \"purchases\",\n    \"targetKey\": \"user_id\",\n    \"relation"
  },
  {
    "path": "src/config/databases/bindle/schemaColors.json",
    "chars": 160,
    "preview": "{\n  \"DEFAULT\": \"#91C4F2\",\n  \"public\": \"#BEB8EB\",\n  \"adjust\": \"#AFA2FF\",\n  \"helpers\": \"#75C9C8\",\n  \"web_analytics\": \"#F6B"
  },
  {
    "path": "src/config/databases/bindle/tablePositions.json",
    "chars": 807,
    "preview": "{\n  \"adjust.callbacks\": {\n    \"x\": 864,\n    \"y\": -192\n  },\n  \"helpers.dates\": {\n    \"x\": 512,\n    \"y\": 528\n  },\n  \"mobil"
  },
  {
    "path": "src/config/databases/bindle/tables/accounts.json",
    "chars": 900,
    "preview": "{\n  \"name\": \"accounts\",\n  \"description\": \"Accounts of platforms users can sign up with. Bindle users might have Facebook"
  },
  {
    "path": "src/config/databases/bindle/tables/adjust_callbacks.json",
    "chars": 2254,
    "preview": "{\n  \"schema\": \"adjust\",\n  \"name\": \"callbacks\",\n  \"description\": \"Adjust is a mobile attribution service, sort of Google "
  },
  {
    "path": "src/config/databases/bindle/tables/books.json",
    "chars": 754,
    "preview": "{\n  \"name\": \"books\",\n  \"description\": \"All books available in the Bindle's library.\",\n  \"columns\": [\n    {\n      \"name\":"
  },
  {
    "path": "src/config/databases/bindle/tables/books_users.json",
    "chars": 598,
    "preview": "{\n  \"name\": \"books_users\",\n  \"description\": \"A join table for many-to-many relationship between users and books.\",\n  \"co"
  },
  {
    "path": "src/config/databases/bindle/tables/devices.json",
    "chars": 1087,
    "preview": "{\n  \"name\": \"devices\",\n  \"description\": \"This table keeps track of all devices users log in to Bindle with – browsers or"
  },
  {
    "path": "src/config/databases/bindle/tables/helpers_dates.json",
    "chars": 553,
    "preview": "{\n  \"schema\": \"helpers\",\n  \"name\": \"dates\",\n  \"description\": \"A helper table with consecutive dates. Might be useful to "
  },
  {
    "path": "src/config/databases/bindle/tables/marketing_spends.json",
    "chars": 1295,
    "preview": "{\n  \"name\": \"marketing_spends\",\n  \"description\": \"A table that keeps track of Bindle's marketing investments per campaig"
  },
  {
    "path": "src/config/databases/bindle/tables/mobile_analytics_events.json",
    "chars": 1865,
    "preview": "{\n  \"schema\": \"mobile_analytics\",\n  \"name\": \"events\",\n  \"description\": \"This analytics table contains all events fired b"
  },
  {
    "path": "src/config/databases/bindle/tables/products.json",
    "chars": 457,
    "preview": "{\n  \"name\": \"products\",\n  \"description\": \"The list of all purchasable Bindle products (subscriptions).\",\n  \"columns\": [\n"
  },
  {
    "path": "src/config/databases/bindle/tables/profiles.json",
    "chars": 904,
    "preview": "{\n  \"name\": \"profiles\",\n  \"description\": \"To avoid growing the users table further, users' profile information was extra"
  },
  {
    "path": "src/config/databases/bindle/tables/purchases.json",
    "chars": 985,
    "preview": "{\n  \"name\": \"purchases\",\n  \"description\": \"This table contains all purchase transactions.\",\n  \"columns\": [\n    {\n      \""
  },
  {
    "path": "src/config/databases/bindle/tables/users.json",
    "chars": 3029,
    "preview": "{\n  \"name\": \"users\",\n  \"description\": \"This table contains all user records of Bindle.\",\n  \"columns\": [\n    {\n      \"nam"
  },
  {
    "path": "src/config/databases/bindle/tables/web_analytics_events.json",
    "chars": 968,
    "preview": "{\n  \"schema\": \"web_analytics\",\n  \"name\": \"events\",\n  \"description\": \"This table contains all events that happen on Bindl"
  },
  {
    "path": "src/config/databases/bindle/tables/web_analytics_pageviews.json",
    "chars": 1693,
    "preview": "{\n  \"schema\": \"web_analytics\",\n  \"name\": \"pageviews\",\n  \"description\": \"This table contains all pageviews of Bindle's we"
  },
  {
    "path": "src/config/databases/bindle/tables.ts",
    "chars": 1243,
    "preview": "import { TableConfig } from \"../../../Visualizer/types\";\n\nimport accountsTable from \"./tables/accounts.json\";\nimport adj"
  },
  {
    "path": "src/config/databases/ecommerce/edges.json",
    "chars": 1512,
    "preview": "[\n  {\n    \"source\": \"vendors\",\n    \"sourceKey\": \"id\",\n    \"target\": \"items\",\n    \"targetKey\": \"vendor_id\",\n    \"relation"
  },
  {
    "path": "src/config/databases/ecommerce/schemaColors.json",
    "chars": 49,
    "preview": "{\n  \"DEFAULT\": \"#91C4F2\",\n  \"public\": \"#91C4F2\"\n}"
  },
  {
    "path": "src/config/databases/ecommerce/tablePositions.json",
    "chars": 556,
    "preview": "{\n  \"public.carts\": {\n    \"x\": 672,\n    \"y\": 368\n  },\n  \"public.carts_items\": {\n    \"x\": 464,\n    \"y\": 560\n  },\n  \"publi"
  },
  {
    "path": "src/config/databases/ecommerce/tables/carts.json",
    "chars": 581,
    "preview": "{\n  \"name\": \"carts\",\n  \"description\": \"This table contains all carts (purchased or not) that were ever assembled by user"
  },
  {
    "path": "src/config/databases/ecommerce/tables/carts_items.json",
    "chars": 649,
    "preview": "{\n  \"name\": \"carts_items\",\n  \"description\": \"This is a join table that enables many-to-many relation between carts and i"
  },
  {
    "path": "src/config/databases/ecommerce/tables/categories.json",
    "chars": 897,
    "preview": "{\n  \"name\": \"categories\",\n  \"description\": \"This table contains item categories. Note that cateories are nested and a ca"
  },
  {
    "path": "src/config/databases/ecommerce/tables/discount_codes.json",
    "chars": 1243,
    "preview": "{\n  \"name\": \"discount_codes\",\n  \"description\": \"Thsi table contains all discount codes that could be redeemed by a user "
  },
  {
    "path": "src/config/databases/ecommerce/tables/items.json",
    "chars": 1170,
    "preview": "{\n  \"name\": \"items\",\n  \"description\": \"This table contains all items that could be purchased by users. Note that only pu"
  },
  {
    "path": "src/config/databases/ecommerce/tables/purchases.json",
    "chars": 1116,
    "preview": "{\n  \"name\": \"purchases\",\n  \"description\": \"This table contains all cart purchases.\",\n  \"schemaColor\": \"#91C4F2\",\n  \"colu"
  },
  {
    "path": "src/config/databases/ecommerce/tables/returns.json",
    "chars": 945,
    "preview": "{\n  \"name\": \"returns\",\n  \"description\": \"This table contains all returns (full carts or partial item returns).\",\n  \"sche"
  },
  {
    "path": "src/config/databases/ecommerce/tables/reviews.json",
    "chars": 913,
    "preview": "{\n  \"name\": \"reviews\",\n  \"description\": \"This table contains all user reviews for individual items.\",\n  \"schemaColor\": \""
  },
  {
    "path": "src/config/databases/ecommerce/tables/users.json",
    "chars": 916,
    "preview": "{\n  \"name\": \"users\",\n  \"description\": \"This table contains all user records (accounts).\",\n  \"schemaColor\": \"#91C4F2\",\n  "
  },
  {
    "path": "src/config/databases/ecommerce/tables/vendors.json",
    "chars": 597,
    "preview": "{\n  \"name\": \"vendors\",\n  \"description\": \"This table contains all vendors (people or companies that sell items on our E-c"
  },
  {
    "path": "src/config/databases/ecommerce/tables.ts",
    "chars": 803,
    "preview": "import { TableConfig } from \"../../../Visualizer/types\";\n\nimport cartsTable from \"./tables/carts.json\";\nimport cartsItem"
  },
  {
    "path": "src/config/databases/finance/edges.json",
    "chars": 146,
    "preview": "[\n  {\n    \"source\": \"vendors\",\n    \"sourceKey\": \"id\",\n    \"target\": \"transactions\",\n    \"targetKey\": \"vendor_id\",\n    \"r"
  },
  {
    "path": "src/config/databases/finance/schemaColors.json",
    "chars": 49,
    "preview": "{\n  \"DEFAULT\": \"#91C4F2\",\n  \"public\": \"#91C4F2\"\n}"
  },
  {
    "path": "src/config/databases/finance/tablePositions.json",
    "chars": 116,
    "preview": "{\n  \"public.transactions\": {\n    \"x\": 192,\n    \"y\": 176\n  },\n  \"public.vendors\": {\n    \"x\": -64,\n    \"y\": 240\n  }\n}\n"
  },
  {
    "path": "src/config/databases/finance/tables/transactions.json",
    "chars": 738,
    "preview": "{\n  \"name\": \"transactions\",\n  \"description\": \"This table contains transactions of all vendors.\",\n  \"schemaColor\": \"#91C4"
  },
  {
    "path": "src/config/databases/finance/tables/vendors.json",
    "chars": 483,
    "preview": "{\n  \"name\": \"vendors\",\n  \"description\": \"This table contains all vendors.\",\n  \"schemaColor\": \"#91C4F2\",\n  \"columns\": [\n "
  },
  {
    "path": "src/config/databases/finance/tables.ts",
    "chars": 264,
    "preview": "import { TableConfig } from \"../../../Visualizer/types\";\n\nimport transactionsTable from \"./tables/transactions.json\";\nim"
  },
  {
    "path": "src/config/databases/live/edges.json",
    "chars": 900,
    "preview": "[\n  {\n    \"source\": \"products\",\n    \"sourceKey\": \"id\",\n    \"target\": \"purchases\",\n    \"targetKey\": \"product_id\",\n    \"re"
  },
  {
    "path": "src/config/databases/live/schemaColors.json",
    "chars": 83,
    "preview": "{\n  \"DEFAULT\": \"#91C4F2\",\n  \"public\": \"#91C4F2\",\n  \"mobile_analytics\": \"#FFD791\"\n}\n"
  },
  {
    "path": "src/config/databases/live/tablePositions.json",
    "chars": 280,
    "preview": "{\n  \"mobile_analytics.events\": {\n    \"x\": 784,\n    \"y\": -128\n  },\n  \"public.products\": {\n    \"x\": 0,\n    \"y\": 96\n  },\n  "
  },
  {
    "path": "src/config/databases/live/tables/mobile_analytics_events.json",
    "chars": 1539,
    "preview": "{\n  \"schema\": \"mobile_analytics\",\n  \"name\": \"events\",\n  \"description\": \"This analytics table contains all events tracked"
  },
  {
    "path": "src/config/databases/live/tables/products.json",
    "chars": 802,
    "preview": "{\n  \"name\": \"products\",\n  \"description\": \"All available products (available via subscriptions or one-time payments) user"
  },
  {
    "path": "src/config/databases/live/tables/purchases.json",
    "chars": 1013,
    "preview": "{\n  \"name\": \"purchases\",\n  \"description\": \"This table contains all purchase records.\",\n  \"schemaColor\": \"#91C4F2\",\n  \"co"
  },
  {
    "path": "src/config/databases/live/tables/trials.json",
    "chars": 1020,
    "preview": "{\n  \"name\": \"trials\",\n  \"description\": \"This table contains all started trials (trials are available only for subscripti"
  },
  {
    "path": "src/config/databases/live/tables/users.json",
    "chars": 1409,
    "preview": "{\n  \"name\": \"users\",\n  \"description\": \"This table contains all user records (accounts).\",\n  \"schemaColor\": \"#91C4F2\",\n  "
  },
  {
    "path": "src/config/databases/live/tables.ts",
    "chars": 491,
    "preview": "import { TableConfig } from \"../../../Visualizer/types\";\n\nimport productsTable from \"./tables/products.json\";\nimport pur"
  },
  {
    "path": "src/config/databases/movies/edges.json",
    "chars": 1106,
    "preview": "[\n  {\n    \"source\": \"actors\",\n    \"sourceKey\": \"id\",\n    \"target\": \"actors_movies\",\n    \"targetKey\": \"actor_id\",\n    \"re"
  },
  {
    "path": "src/config/databases/movies/schemaColors.json",
    "chars": 49,
    "preview": "{\n  \"DEFAULT\": \"#91C4F2\",\n  \"public\": \"#91C4F2\"\n}"
  },
  {
    "path": "src/config/databases/movies/tablePositions.json",
    "chars": 393,
    "preview": "{\n  \"public.actors\": {\n    \"x\": -112,\n    \"y\": 160\n  },\n  \"public.actors_movies\": {\n    \"x\": 176,\n    \"y\": -16\n  },\n  \"p"
  },
  {
    "path": "src/config/databases/movies/tables/actors.json",
    "chars": 342,
    "preview": "{\n  \"name\": \"actors\",\n  \"description\": \"This table contains movie actors.\",\n  \"schemaColor\": \"#91C4F2\",\n  \"columns\": [\n "
  },
  {
    "path": "src/config/databases/movies/tables/actors_movies.json",
    "chars": 469,
    "preview": "{\n  \"name\": \"actors_movies\",\n  \"description\": \"This is a join table between actors and movies, since they have many-to-m"
  },
  {
    "path": "src/config/databases/movies/tables/directors.json",
    "chars": 354,
    "preview": "{\n  \"name\": \"directors\",\n  \"description\": \"This table contains movie directors.\",\n  \"schemaColor\": \"#91C4F2\",\n  \"columns"
  },
  {
    "path": "src/config/databases/movies/tables/genres.json",
    "chars": 343,
    "preview": "{\n  \"name\": \"genres\",\n  \"description\": \"This table contains movie genres.\",\n  \"schemaColor\": \"#91C4F2\",\n  \"columns\": [\n "
  },
  {
    "path": "src/config/databases/movies/tables/genres_movies.json",
    "chars": 438,
    "preview": "{\n  \"name\": \"genres_movies\",\n  \"description\": \"This is an association (aka join aka many-to-many relationship) table bet"
  },
  {
    "path": "src/config/databases/movies/tables/movies.json",
    "chars": 1292,
    "preview": "{\n  \"name\": \"movies\",\n  \"description\": \"This table contains all dataset movies.\",\n  \"schemaColor\": \"#91C4F2\",\n  \"columns"
  },
  {
    "path": "src/config/databases/movies/tables/ratings.json",
    "chars": 646,
    "preview": "{\n  \"name\": \"ratings\",\n  \"description\": \"This table contains individual user ratings for all movies.\",\n  \"schemaColor\": "
  },
  {
    "path": "src/config/databases/movies/tables.ts",
    "chars": 608,
    "preview": "import { TableConfig } from \"../../../Visualizer/types\";\n\nimport actorsTable from \"./tables/actors.json\";\nimport actorsM"
  },
  {
    "path": "src/config/databases/nba/edges.json",
    "chars": 723,
    "preview": "[\n  {\n    \"source\": \"players\",\n    \"sourceKey\": \"id\",\n    \"target\": \"player_game_stats\",\n    \"targetKey\": \"player_id\",\n "
  },
  {
    "path": "src/config/databases/nba/schemaColors.json",
    "chars": 49,
    "preview": "{\n  \"DEFAULT\": \"#91C4F2\",\n  \"public\": \"#91C4F2\"\n}"
  },
  {
    "path": "src/config/databases/nba/tablePositions.json",
    "chars": 285,
    "preview": "{\n  \"public.games\": {\n    \"x\": 32,\n    \"y\": 48\n  },\n  \"public.player_game_stats\": {\n    \"x\": 400,\n    \"y\": 288\n  },\n  \"p"
  },
  {
    "path": "src/config/databases/nba/tables/games.json",
    "chars": 1296,
    "preview": "{\n  \"name\": \"games\",\n  \"description\": \"This table contains all NBA games since NBA was found in 1949.\",\n  \"schemaColor\":"
  },
  {
    "path": "src/config/databases/nba/tables/player_game_stats.json",
    "chars": 2418,
    "preview": "{\n  \"name\": \"player_game_stats\",\n  \"description\": \"This table contains player stats for individual games.\",\n  \"schemaCol"
  },
  {
    "path": "src/config/databases/nba/tables/players.json",
    "chars": 395,
    "preview": "{\n  \"name\": \"players\",\n  \"description\": \"This table contains all players who have played in at least one NBA game.\",\n  \""
  },
  {
    "path": "src/config/databases/nba/tables/team_game_stats.json",
    "chars": 2688,
    "preview": "{\n  \"name\": \"team_game_stats\",\n  \"description\": \"This table contains team stats for individual games.\",\n  \"schemaColor\":"
  },
  {
    "path": "src/config/databases/nba/tables/teams.json",
    "chars": 796,
    "preview": "{\n  \"name\": \"teams\",\n  \"description\": \"This table contains all NBA teams (including dissolved or merged teams).\",\n  \"sch"
  },
  {
    "path": "src/config/databases/nba/tables.ts",
    "chars": 481,
    "preview": "import { TableConfig } from \"../../../Visualizer/types\";\n\nimport gamesTable from \"./tables/games.json\";\nimport playerGam"
  },
  {
    "path": "src/config/databases/the-bank-job/edges.json",
    "chars": 2167,
    "preview": "[\n  {\n    \"source\": \"bank.accounts\",\n    \"sourceKey\": \"id\",\n    \"target\": \"bank.safe_deposit_boxes\",\n    \"targetKey\": \"a"
  },
  {
    "path": "src/config/databases/the-bank-job/schemaColors.json",
    "chars": 177,
    "preview": "{\n  \"DEFAULT\": \"#91C4F2\",\n  \"bank\": \"#BEB8EB\",\n  \"interpol\": \"#AFA2FF\",\n  \"sellmycar_com\": \"#75C9C8\",\n  \"nyc_dot\": \"#F6B"
  },
  {
    "path": "src/config/databases/the-bank-job/tablePositions.json",
    "chars": 1088,
    "preview": "{\n  \"bank.accounts\": {\n    \"x\": 100,\n    \"y\": 100\n  },\n  \"bank.authorized_vehicles\": {\n    \"x\": 1200,\n    \"y\": 384\n  },\n"
  },
  {
    "path": "src/config/databases/the-bank-job/tables/accounts.json",
    "chars": 728,
    "preview": "{\n  \"schema\": \"bank\",\n  \"name\": \"accounts\",\n  \"description\": \"Information about the bank accounts.\",\n  \"columns\": [\n    "
  },
  {
    "path": "src/config/databases/the-bank-job/tables/art_works.json",
    "chars": 478,
    "preview": "{\n  \"schema\": \"fake\",\n  \"name\": \"art_works\",\n  \"description\": \"Fake art works database.\",\n  \"columns\": [\n    {\n      \"na"
  },
  {
    "path": "src/config/databases/the-bank-job/tables/authorized_vehicles.json",
    "chars": 1037,
    "preview": "{\n  \"schema\": \"bank\",\n  \"name\": \"authorized_vehicles\",\n  \"description\": \"This table contains all vehicles authorized to "
  },
  {
    "path": "src/config/databases/the-bank-job/tables/cases.json",
    "chars": 955,
    "preview": "{\n  \"schema\": \"interpol\",\n  \"name\": \"cases\",\n  \"description\": \"Interpol case records.\",\n  \"columns\": [\n    {\n      \"name"
  },
  {
    "path": "src/config/databases/the-bank-job/tables/cases_crime_types.json",
    "chars": 356,
    "preview": "{\n  \"schema\": \"interpol\",\n  \"name\": \"cases_crime_types\",\n  \"description\": \"This is a join table between cases and crime "
  },
  {
    "path": "src/config/databases/the-bank-job/tables/cases_criminals.json",
    "chars": 367,
    "preview": "{\n  \"schema\": \"interpol\",\n  \"name\": \"cases_criminals\",\n  \"description\": \"This is a join table between cases and criminal"
  },
  {
    "path": "src/config/databases/the-bank-job/tables/crime_types.json",
    "chars": 461,
    "preview": "{\n  \"schema\": \"interpol\",\n  \"name\": \"crime_types\",\n  \"description\": \"Crime types.\",\n  \"columns\": [\n    {\n      \"name\": \""
  },
  {
    "path": "src/config/databases/the-bank-job/tables/criminal_aliases.json",
    "chars": 537,
    "preview": "{\n  \"schema\": \"interpol\",\n  \"name\": \"criminal_aliases\",\n  \"description\": \"This table contains all aliases used by crimin"
  },
  {
    "path": "src/config/databases/the-bank-job/tables/criminals.json",
    "chars": 951,
    "preview": "{\n  \"schema\": \"interpol\",\n  \"name\": \"criminals\",\n  \"description\": \"Criminal records.\",\n  \"columns\": [\n    {\n      \"name\""
  },
  {
    "path": "src/config/databases/the-bank-job/tables/employees.json",
    "chars": 945,
    "preview": "{\n  \"schema\": \"bank\",\n  \"name\": \"employees\",\n  \"description\": \"Bank employee records.\",\n  \"columns\": [\n    {\n      \"name"
  },
  {
    "path": "src/config/databases/the-bank-job/tables/event_log.json",
    "chars": 667,
    "preview": "{\n  \"schema\": \"bank\",\n  \"name\": \"event_log\",\n  \"description\": \"Event log of everything happening at the bank.\",\n  \"colum"
  },
  {
    "path": "src/config/databases/the-bank-job/tables/road_camera_events.json",
    "chars": 1222,
    "preview": "{\n  \"schema\": \"nyc_dot\",\n  \"name\": \"road_camera_events\",\n  \"description\": \"This table contains all events captured by NY"
  },
  {
    "path": "src/config/databases/the-bank-job/tables/safe_deposit_boxes.json",
    "chars": 1062,
    "preview": "{\n  \"schema\": \"bank\",\n  \"name\": \"safe_deposit_boxes\",\n  \"description\": \"Safe deposit boxes.\",\n  \"columns\": [\n    {\n     "
  },
  {
    "path": "src/config/databases/the-bank-job/tables/storage_units.json",
    "chars": 600,
    "preview": "{\n  \"schema\": \"penn_station\",\n  \"name\": \"storage_units\",\n  \"description\": \"Storage units at Penn Station.\",\n  \"columns\":"
  },
  {
    "path": "src/config/databases/the-bank-job/tables/storage_units_log.json",
    "chars": 635,
    "preview": "{\n  \"schema\": \"penn_station\",\n  \"name\": \"storage_units_log\",\n  \"description\": \"Log entries for storage unit events at Pe"
  },
  {
    "path": "src/config/databases/the-bank-job/tables/transactions.json",
    "chars": 1190,
    "preview": "{\n  \"schema\": \"fake\",\n  \"name\": \"transactions\",\n  \"description\": \"Transactions of fake art works.\",\n  \"columns\": [\n    {"
  },
  {
    "path": "src/config/databases/the-bank-job/tables/vaults.json",
    "chars": 324,
    "preview": "{\n  \"schema\": \"bank\",\n  \"name\": \"vaults\",\n  \"description\": \"Bank vaults.\",\n  \"columns\": [\n    {\n      \"name\": \"id\",\n    "
  },
  {
    "path": "src/config/databases/the-bank-job/tables/vehicles.json",
    "chars": 1365,
    "preview": "{\n  \"schema\": \"sellmycar_com\",\n  \"name\": \"vehicles\",\n  \"description\": \"This table contains all vehicles listed for sale "
  },
  {
    "path": "src/config/databases/the-bank-job/tables.ts",
    "chars": 1554,
    "preview": "import { TableConfig } from \"../../../Visualizer/types\";\n\nimport accountsTable from \"./tables/accounts.json\";\nimport vau"
  }
]

// ... and 13 more files (download for full content)

About this extraction

This page contains the full source code of the sqlhabit/sql_schema_visualizer GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 213 files (807.4 KB), approximately 291.0k tokens, and a symbol index with 779 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!