[
  {
    "path": ".formatter.exs",
    "content": "# Used by \"mix format\"\n[\n  inputs: [\"{mix,.formatter}.exs\", \"{config,lib,test}/**/*.{ex,exs}\"]\n]\n"
  },
  {
    "path": ".gitignore",
    "content": "# The directory Mix will write compiled artifacts to.\n/_build/\n\n# If you run \"mix test --cover\", coverage assets end up here.\n/cover/\n\n# The directory Mix downloads your dependencies sources to.\n/deps/\n\n# Where third-party dependencies like ExDoc output generated docs.\n/doc/\n\n# Ignore .fetch files in case you like to edit your project deps locally.\n/.fetch\n\n# If the VM crashes, it generates a dump, let's ignore it too.\nerl_crash.dump\n\n# Also ignore archive artifacts (built via \"mix archive.build\").\n*.ez\n\n# Ignore package tarball (built via \"mix hex.build\").\necto_erd-*.tar\n\n# Temporary files, for example, from tests.\n/tmp/\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# Ecto.ERD\n\n[![Hex.pm](https://img.shields.io/hexpm/v/ecto_erd.svg)](https://hex.pm/packages/ecto_erd)\n\nA mix task for generating an ERD (Entity-Relationship Diagram) in various\nformats for all Ecto schemas in your project.\n\nSupported formats:\n\n* [DOT](https://en.wikipedia.org/wiki/DOT_(graph_description_language)) (default)\n* [PlantUML](https://plantuml.com)\n* [DBML](https://www.dbml.org/)\n* [QuickDBD](https://www.quickdatabasediagrams.com)\n* [Mermaid](https://mermaid-js.github.io/mermaid/#/entityRelationshipDiagram)\n\n![Simple blog demo](assets/simple_blog_dot_demo.png)\n<details>\n  <summary>Definition of schemas</summary>\n\n  ```elixir\n  defmodule Blog.Post do\n    use Ecto.Schema\n\n    schema \"posts\" do\n      field(:title, :string)\n      field(:text, :string)\n      timestamps()\n      belongs_to(:user, Blog.User)\n      has_many(:comments, Blog.Comment)\n    end\n  end\n\n  defmodule Blog.Comment do\n    use Ecto.Schema\n\n    schema \"comments\" do\n      field(:text, :string)\n      timestamps()\n      belongs_to(:post, Blog.Post)\n      belongs_to(:user, Blog.User)\n    end\n  end\n\n  defmodule Blog.User do\n    use Ecto.Schema\n\n    schema \"users\" do\n      field(:email, :string)\n      has_many(:posts, Blog.Post)\n      has_many(:comments, Blog.Comment)\n    end\n  end\n  ```\n\n</details>\n\n## Installation\n\nThe package can be installed by adding `ecto_erd` to your list of dependencies\nin `mix.exs`:\n\n```elixir\ndef deps do\n  [\n    {:ecto_erd, \"~> 0.6\", only: :dev}\n  ]\nend\n```\n\n## Usage\n\nJust run:\n\n```sh\nmix ecto.gen.erd\n```\n\nThe command above produces a DOT file, which you can convert to an\nimage using the Graphviz utility:\n\n```sh\ndot -Tpng ecto_erd.dot -o erd.png\n```\n\nConfiguration is possible via the `.ecto_erd.exs` file.\nThe docs can be found at [https://hexdocs.pm/ecto_erd](https://hexdocs.pm/ecto_erd).\nConfiguration examples and output for a few open-source projects can be\nfound in the PAGES section under EXAMPLES.\n\n## Troubleshooting\n\nTrying to run `ecto_erd` in an umbrella project? You might see this error:\n\n```\n$ mix ecto.gen.erd\n** (RuntimeError) Unable to detect `:otp_app`, please specify it explicitly\n```\n\nThe easiest solution is to run the command on one of the apps in the `apps/` directory. Another option is to create a configuration file and specify the `:otp_app`. See the [docs for details](https://hexdocs.pm/ecto_erd/Mix.Tasks.Ecto.Gen.Erd.html#module-configuration-file).\n"
  },
  {
    "path": "examples/dbml/changelog.com/Clusters.dbml",
    "content": "TableGroup EPISODE {\n  episodes\n  episode_guests\n  episode_hosts\n  episode_requests\n  episode_sponsors\n  episode_stats\n  episode_topics\n}\nTableGroup NEWS {\n  news_ads\n  news_issues\n  news_issue_ads\n  news_issue_items\n  news_items\n  news_item_comments\n  news_item_topics\n  news_queue\n  news_sources\n  news_sponsorships\n}\nTableGroup PERSON {\n  people\n}\nTableGroup PODCAST {\n  podcasts\n  podcast_hosts\n  podcast_topics\n}\nTableGroup POST {\n  posts\n  post_topics\n}\nTableGroup SPONSOR {\n  sponsors\n  sponsor_reps\n}\n\n\nTable feeds {\n  id integer [pk]\n  name varchar\n  slug varchar\n  description varchar\n  title_format varchar\n  plusplus boolean\n  autosub boolean\n  starts_at timestamp\n  cover varchar\n  podcast_ids array\n  person_ids array\n  owner_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable subscriptions {\n  id integer [pk]\n  unsubscribed_at timestamp\n  context varchar\n  episode_id integer\n  item_id integer\n  person_id integer\n  podcast_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable topics {\n  id integer [pk]\n  name varchar\n  slug varchar\n  description varchar\n  website varchar\n  twitter_handle varchar\n  icon varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable schema_migrations {\n  version integer [pk]\n  inserted_at timestamp\n}\n\nTable oban_jobs {\n  id integer [pk]\n  state varchar\n  queue varchar\n  worker varchar\n  args jsonb\n  meta jsonb\n  tags array\n  errors array\n  attempt integer\n  attempted_by array\n  max_attempts integer\n  priority integer\n  attempted_at timestamp\n  cancelled_at timestamp\n  completed_at timestamp\n  discarded_at timestamp\n  inserted_at timestamp\n  scheduled_at timestamp\n}\n\nTable episodes {\n  id integer [pk]\n  slug varchar\n  guid varchar\n  title varchar\n  subtitle varchar\n  type integer\n  featured boolean\n  highlight varchar\n  subhighlight varchar\n  summary varchar\n  notes varchar\n  doc_url varchar\n  socialize_url varchar\n  published boolean\n  published_at timestamp\n  recorded_at timestamp\n  recorded_live boolean\n  youtube_id varchar\n  cover varchar\n  audio_file varchar\n  audio_bytes integer\n  audio_duration integer\n  audio_chapters jsonb\n  plusplus_file varchar\n  plusplus_bytes integer\n  plusplus_duration integer\n  plusplus_chapters jsonb\n  download_count float\n  import_count float\n  reach_count integer\n  email_subject varchar\n  email_teaser varchar\n  email_content varchar\n  email_sends integer\n  email_opens integer\n  transcript array\n  podcast_id integer\n  request_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable episode_guests {\n  id integer [pk]\n  position integer\n  thanks boolean\n  discount_code varchar\n  episode_id integer\n  person_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable episode_hosts {\n  id integer [pk]\n  position integer\n  person_id integer\n  episode_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable episode_requests {\n  id integer [pk]\n  status integer\n  hosts varchar\n  guests varchar\n  topics varchar\n  pitch varchar\n  pronunciation varchar\n  message varchar\n  podcast_id integer\n  submitter_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable episode_sponsors {\n  id integer [pk]\n  position integer\n  title varchar\n  link_url varchar\n  description varchar\n  starts_at float\n  ends_at float\n  episode_id integer\n  sponsor_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable episode_stats {\n  id integer [pk]\n  date date\n  episode_bytes integer\n  total_bytes integer\n  downloads float\n  uniques integer\n  demographics jsonb\n  episode_id integer\n  podcast_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable episode_topics {\n  id integer [pk]\n  position integer\n  topic_id integer\n  episode_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_ads {\n  id integer [pk]\n  url varchar\n  headline varchar\n  story varchar\n  image varchar\n  active boolean\n  newsletter boolean\n  impression_count integer\n  click_count integer\n  sponsorship_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_issues {\n  id integer [pk]\n  slug varchar\n  note varchar\n  teaser varchar\n  published boolean\n  published_at timestamp\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_issue_ads {\n  id integer [pk]\n  position integer\n  image boolean\n  ad_id integer\n  issue_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_issue_items {\n  id integer [pk]\n  position integer\n  image boolean\n  issue_id integer\n  item_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_items {\n  id integer [pk]\n  status integer\n  type integer\n  url varchar\n  headline varchar\n  story varchar\n  image varchar\n  object_id varchar\n  feed_only boolean\n  pinned boolean\n  published_at timestamp\n  refreshed_at timestamp\n  impression_count integer\n  click_count integer\n  message varchar\n  author_id integer\n  logger_id integer\n  submitter_id integer\n  source_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_item_comments {\n  id integer [pk]\n  content varchar\n  approved boolean\n  edited_at timestamp\n  deleted_at timestamp\n  item_id integer\n  author_id integer\n  parent_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_item_topics {\n  id integer [pk]\n  position integer\n  item_id integer\n  topic_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_queue {\n  id integer [pk]\n  position float\n  item_id integer\n}\n\nTable news_sources {\n  id integer [pk]\n  name varchar\n  slug varchar\n  website varchar\n  twitter_handle varchar\n  description varchar\n  feed varchar\n  regex varchar\n  publication boolean\n  icon varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_sponsorships {\n  id integer [pk]\n  name varchar\n  weeks array\n  impression_count integer\n  click_count integer\n  sponsor_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable people {\n  id integer [pk]\n  name varchar\n  email varchar\n  handle varchar\n  github_handle varchar\n  linkedin_handle varchar\n  mastodon_handle varchar\n  twitter_handle varchar\n  slack_id varchar\n  website varchar\n  bio varchar\n  location varchar\n  auth_token varchar\n  auth_token_expires_at timestamp\n  joined_at timestamp\n  signed_in_at timestamp\n  approved boolean\n  avatar varchar\n  admin boolean\n  host boolean\n  editor boolean\n  public_profile boolean\n  settings jsonb\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable podcasts {\n  id integer [pk]\n  name varchar\n  slug varchar\n  status integer\n  welcome varchar\n  description varchar\n  extended_description varchar\n  vanity_domain varchar\n  keywords varchar\n  mastodon_handle varchar\n  twitter_handle varchar\n  apple_url varchar\n  spotify_url varchar\n  riverside_url varchar\n  chartable_id varchar\n  schedule_note varchar\n  download_count float\n  reach_count integer\n  recorded_live boolean\n  partner boolean\n  position integer\n  subscribers jsonb\n  cover varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable podcast_hosts {\n  id integer [pk]\n  position integer\n  retired boolean\n  person_id integer\n  podcast_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable podcast_topics {\n  id integer [pk]\n  position integer\n  podcast_id integer\n  topic_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable posts {\n  id integer [pk]\n  title varchar\n  subtitle varchar\n  slug varchar\n  guid varchar\n  canonical_url varchar\n  image varchar\n  tldr varchar\n  body varchar\n  published boolean\n  published_at timestamp\n  author_id integer\n  editor_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable post_topics {\n  id integer [pk]\n  position integer\n  topic_id integer\n  post_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable sponsors {\n  id integer [pk]\n  name varchar\n  description varchar\n  website varchar\n  github_handle varchar\n  twitter_handle varchar\n  avatar varchar\n  color_logo varchar\n  dark_logo varchar\n  light_logo varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable sponsor_reps {\n  id integer [pk]\n  sponsor_id integer\n  person_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nRef: episode_requests.id - episodes.request_id\nRef: episodes.id < episode_guests.episode_id\nRef: episodes.id < episode_hosts.episode_id\nRef: episodes.id < episode_sponsors.episode_id\nRef: episodes.id < episode_stats.episode_id\nRef: episodes.id < episode_topics.episode_id\nRef: episodes.id < subscriptions.episode_id\nRef: news_ads.id < news_issue_ads.ad_id\nRef: news_issues.id < news_issue_ads.issue_id\nRef: news_issues.id < news_issue_items.issue_id\nRef: news_item_comments.id < news_item_comments.parent_id\nRef: news_items.id < news_issue_items.item_id\nRef: news_items.id < news_item_comments.item_id\nRef: news_items.id < news_item_topics.item_id\nRef: news_items.id - news_queue.item_id\nRef: news_items.id < subscriptions.item_id\nRef: news_sources.id < news_items.source_id\nRef: news_sponsorships.id < news_ads.sponsorship_id\nRef: people.id < episode_guests.person_id\nRef: people.id < episode_hosts.person_id\nRef: people.id < episode_requests.submitter_id\nRef: people.id < feeds.owner_id\nRef: people.id < news_item_comments.author_id\nRef: people.id < news_items.author_id\nRef: people.id < news_items.logger_id\nRef: people.id < news_items.submitter_id\nRef: people.id < podcast_hosts.person_id\nRef: people.id < posts.author_id\nRef: people.id < posts.editor_id\nRef: people.id < sponsor_reps.person_id\nRef: people.id < subscriptions.person_id\nRef: podcasts.id < episode_requests.podcast_id\nRef: podcasts.id < episode_stats.podcast_id\nRef: podcasts.id < episodes.podcast_id\nRef: podcasts.id < podcast_hosts.podcast_id\nRef: podcasts.id < podcast_topics.podcast_id\nRef: podcasts.id < subscriptions.podcast_id\nRef: posts.id < post_topics.post_id\nRef: sponsors.id < episode_sponsors.sponsor_id\nRef: sponsors.id < news_sponsorships.sponsor_id\nRef: sponsors.id < sponsor_reps.sponsor_id\nRef: topics.id < episode_topics.topic_id\nRef: topics.id < news_item_topics.topic_id\nRef: topics.id < podcast_topics.topic_id\nRef: topics.id < post_topics.topic_id"
  },
  {
    "path": "examples/dbml/changelog.com/Default.dbml",
    "content": "\n\nTable episodes {\n  id integer [pk]\n  slug varchar\n  guid varchar\n  title varchar\n  subtitle varchar\n  type integer\n  featured boolean\n  highlight varchar\n  subhighlight varchar\n  summary varchar\n  notes varchar\n  doc_url varchar\n  socialize_url varchar\n  published boolean\n  published_at timestamp\n  recorded_at timestamp\n  recorded_live boolean\n  youtube_id varchar\n  cover varchar\n  audio_file varchar\n  audio_bytes integer\n  audio_duration integer\n  audio_chapters jsonb\n  plusplus_file varchar\n  plusplus_bytes integer\n  plusplus_duration integer\n  plusplus_chapters jsonb\n  download_count float\n  import_count float\n  reach_count integer\n  email_subject varchar\n  email_teaser varchar\n  email_content varchar\n  email_sends integer\n  email_opens integer\n  transcript array\n  podcast_id integer\n  request_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable episode_guests {\n  id integer [pk]\n  position integer\n  thanks boolean\n  discount_code varchar\n  episode_id integer\n  person_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable episode_hosts {\n  id integer [pk]\n  position integer\n  person_id integer\n  episode_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable episode_requests {\n  id integer [pk]\n  status integer\n  hosts varchar\n  guests varchar\n  topics varchar\n  pitch varchar\n  pronunciation varchar\n  message varchar\n  podcast_id integer\n  submitter_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable episode_sponsors {\n  id integer [pk]\n  position integer\n  title varchar\n  link_url varchar\n  description varchar\n  starts_at float\n  ends_at float\n  episode_id integer\n  sponsor_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable episode_stats {\n  id integer [pk]\n  date date\n  episode_bytes integer\n  total_bytes integer\n  downloads float\n  uniques integer\n  demographics jsonb\n  episode_id integer\n  podcast_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable episode_topics {\n  id integer [pk]\n  position integer\n  topic_id integer\n  episode_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable feeds {\n  id integer [pk]\n  name varchar\n  slug varchar\n  description varchar\n  title_format varchar\n  plusplus boolean\n  autosub boolean\n  starts_at timestamp\n  cover varchar\n  podcast_ids array\n  person_ids array\n  owner_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_ads {\n  id integer [pk]\n  url varchar\n  headline varchar\n  story varchar\n  image varchar\n  active boolean\n  newsletter boolean\n  impression_count integer\n  click_count integer\n  sponsorship_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_issues {\n  id integer [pk]\n  slug varchar\n  note varchar\n  teaser varchar\n  published boolean\n  published_at timestamp\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_issue_ads {\n  id integer [pk]\n  position integer\n  image boolean\n  ad_id integer\n  issue_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_issue_items {\n  id integer [pk]\n  position integer\n  image boolean\n  issue_id integer\n  item_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_items {\n  id integer [pk]\n  status integer\n  type integer\n  url varchar\n  headline varchar\n  story varchar\n  image varchar\n  object_id varchar\n  feed_only boolean\n  pinned boolean\n  published_at timestamp\n  refreshed_at timestamp\n  impression_count integer\n  click_count integer\n  message varchar\n  author_id integer\n  logger_id integer\n  submitter_id integer\n  source_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_item_comments {\n  id integer [pk]\n  content varchar\n  approved boolean\n  edited_at timestamp\n  deleted_at timestamp\n  item_id integer\n  author_id integer\n  parent_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_item_topics {\n  id integer [pk]\n  position integer\n  item_id integer\n  topic_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_queue {\n  id integer [pk]\n  position float\n  item_id integer\n}\n\nTable news_sources {\n  id integer [pk]\n  name varchar\n  slug varchar\n  website varchar\n  twitter_handle varchar\n  description varchar\n  feed varchar\n  regex varchar\n  publication boolean\n  icon varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable news_sponsorships {\n  id integer [pk]\n  name varchar\n  weeks array\n  impression_count integer\n  click_count integer\n  sponsor_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable people {\n  id integer [pk]\n  name varchar\n  email varchar\n  handle varchar\n  github_handle varchar\n  linkedin_handle varchar\n  mastodon_handle varchar\n  twitter_handle varchar\n  slack_id varchar\n  website varchar\n  bio varchar\n  location varchar\n  auth_token varchar\n  auth_token_expires_at timestamp\n  joined_at timestamp\n  signed_in_at timestamp\n  approved boolean\n  avatar varchar\n  admin boolean\n  host boolean\n  editor boolean\n  public_profile boolean\n  settings jsonb\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable podcasts {\n  id integer [pk]\n  name varchar\n  slug varchar\n  status integer\n  welcome varchar\n  description varchar\n  extended_description varchar\n  vanity_domain varchar\n  keywords varchar\n  mastodon_handle varchar\n  twitter_handle varchar\n  apple_url varchar\n  spotify_url varchar\n  riverside_url varchar\n  chartable_id varchar\n  schedule_note varchar\n  download_count float\n  reach_count integer\n  recorded_live boolean\n  partner boolean\n  position integer\n  subscribers jsonb\n  cover varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable podcast_hosts {\n  id integer [pk]\n  position integer\n  retired boolean\n  person_id integer\n  podcast_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable podcast_topics {\n  id integer [pk]\n  position integer\n  podcast_id integer\n  topic_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable posts {\n  id integer [pk]\n  title varchar\n  subtitle varchar\n  slug varchar\n  guid varchar\n  canonical_url varchar\n  image varchar\n  tldr varchar\n  body varchar\n  published boolean\n  published_at timestamp\n  author_id integer\n  editor_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable post_topics {\n  id integer [pk]\n  position integer\n  topic_id integer\n  post_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable sponsors {\n  id integer [pk]\n  name varchar\n  description varchar\n  website varchar\n  github_handle varchar\n  twitter_handle varchar\n  avatar varchar\n  color_logo varchar\n  dark_logo varchar\n  light_logo varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable sponsor_reps {\n  id integer [pk]\n  sponsor_id integer\n  person_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable subscriptions {\n  id integer [pk]\n  unsubscribed_at timestamp\n  context varchar\n  episode_id integer\n  item_id integer\n  person_id integer\n  podcast_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable topics {\n  id integer [pk]\n  name varchar\n  slug varchar\n  description varchar\n  website varchar\n  twitter_handle varchar\n  icon varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable schema_migrations {\n  version integer [pk]\n  inserted_at timestamp\n}\n\nTable oban_jobs {\n  id integer [pk]\n  state varchar\n  queue varchar\n  worker varchar\n  args jsonb\n  meta jsonb\n  tags array\n  errors array\n  attempt integer\n  attempted_by array\n  max_attempts integer\n  priority integer\n  attempted_at timestamp\n  cancelled_at timestamp\n  completed_at timestamp\n  discarded_at timestamp\n  inserted_at timestamp\n  scheduled_at timestamp\n}\n\nRef: episode_requests.id - episodes.request_id\nRef: episodes.id < episode_guests.episode_id\nRef: episodes.id < episode_hosts.episode_id\nRef: episodes.id < episode_sponsors.episode_id\nRef: episodes.id < episode_stats.episode_id\nRef: episodes.id < episode_topics.episode_id\nRef: episodes.id < subscriptions.episode_id\nRef: news_ads.id < news_issue_ads.ad_id\nRef: news_issues.id < news_issue_ads.issue_id\nRef: news_issues.id < news_issue_items.issue_id\nRef: news_item_comments.id < news_item_comments.parent_id\nRef: news_items.id < news_issue_items.item_id\nRef: news_items.id < news_item_comments.item_id\nRef: news_items.id < news_item_topics.item_id\nRef: news_items.id - news_queue.item_id\nRef: news_items.id < subscriptions.item_id\nRef: news_sources.id < news_items.source_id\nRef: news_sponsorships.id < news_ads.sponsorship_id\nRef: people.id < episode_guests.person_id\nRef: people.id < episode_hosts.person_id\nRef: people.id < episode_requests.submitter_id\nRef: people.id < feeds.owner_id\nRef: people.id < news_item_comments.author_id\nRef: people.id < news_items.author_id\nRef: people.id < news_items.logger_id\nRef: people.id < news_items.submitter_id\nRef: people.id < podcast_hosts.person_id\nRef: people.id < posts.author_id\nRef: people.id < posts.editor_id\nRef: people.id < sponsor_reps.person_id\nRef: people.id < subscriptions.person_id\nRef: podcasts.id < episode_requests.podcast_id\nRef: podcasts.id < episode_stats.podcast_id\nRef: podcasts.id < episodes.podcast_id\nRef: podcasts.id < podcast_hosts.podcast_id\nRef: podcasts.id < podcast_topics.podcast_id\nRef: podcasts.id < subscriptions.podcast_id\nRef: posts.id < post_topics.post_id\nRef: sponsors.id < episode_sponsors.sponsor_id\nRef: sponsors.id < news_sponsorships.sponsor_id\nRef: sponsors.id < sponsor_reps.sponsor_id\nRef: topics.id < episode_topics.topic_id\nRef: topics.id < news_item_topics.topic_id\nRef: topics.id < podcast_topics.topic_id\nRef: topics.id < post_topics.topic_id"
  },
  {
    "path": "examples/dbml/hexpm/Contexts-as-clusters.dbml",
    "content": "TableGroup \"Ecto.Migration\" {\n  schema_migrations\n}\nTableGroup \"Hexpm.Accounts\" {\n  audit_logs\n  emails\n  keys\n  organizations\n  organization_users\n  password_resets\n  sessions\n  users\n}\nTableGroup \"Hexpm.BlockAddress\" {\n  blocked_addresses\n}\nTableGroup \"Hexpm.Repository\" {\n  downloads\n  installs\n  packages\n  package_dependants\n  package_downloads\n  package_owners\n  package_reports\n  package_report_comments\n  package_report_releases\n  releases\n  release_downloads\n  repositories\n  requirements\n}\nTableGroup \"Hexpm.ShortURLs\" {\n  short_urls\n}\n\n\nTable schema_migrations {\n  version integer [pk]\n  inserted_at timestamp\n}\n\nTable audit_logs {\n  id integer [pk]\n  user_agent varchar\n  remote_ip varchar\n  action varchar\n  params jsonb\n  user_id integer\n  organization_id integer\n  key_id integer\n  inserted_at timestamp\n}\n\nTable emails {\n  id integer [pk]\n  email varchar\n  verified boolean\n  primary boolean\n  public boolean\n  gravatar boolean\n  verification_key varchar\n  verification_expiry timestamp\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable keys {\n  id integer [pk]\n  name varchar\n  secret_first varchar\n  secret_second varchar\n  public boolean\n  revoke_at timestamp\n  inserted_at timestamp\n  updated_at timestamp\n  last_use jsonb\n  user_id integer\n  organization_id integer\n  permissions jsonb\n}\n\nTable organizations {\n  id integer [pk]\n  name varchar\n  billing_active boolean\n  billing_override boolean\n  trial_end timestamp\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable organization_users {\n  id integer [pk]\n  role varchar\n  organization_id integer\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable password_resets {\n  id integer [pk]\n  key varchar\n  primary_email varchar\n  user_id integer\n  inserted_at timestamp\n}\n\nTable sessions {\n  id integer [pk]\n  token bytea\n  data jsonb\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable users {\n  id integer [pk]\n  username varchar\n  full_name varchar\n  password varchar\n  service boolean\n  deactivated_at timestamp\n  role varchar\n  inserted_at timestamp\n  updated_at timestamp\n  handles jsonb\n  tfa jsonb\n  organization_id integer\n}\n\nTable blocked_addresses {\n  id integer [pk]\n  ip varchar\n  comment varchar\n}\n\nTable downloads {\n  id integer [pk]\n  package_id integer\n  release_id integer\n  downloads integer\n  day date\n}\n\nTable installs {\n  id integer [pk]\n  hex varchar\n  elixirs array\n}\n\nTable packages {\n  id integer [pk]\n  name varchar\n  docs_updated_at timestamp\n  inserted_at timestamp\n  updated_at timestamp\n  repository_id integer\n  meta jsonb\n}\n\nTable package_dependants {\n  id integer [pk]\n  package_id integer\n  name varchar\n  repo varchar\n}\n\nTable package_downloads {\n  package_id integer\n  view varchar\n  downloads integer\n}\n\nTable package_owners {\n  id integer [pk]\n  level varchar\n  package_id integer\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable package_reports {\n  id integer [pk]\n  state varchar\n  description varchar\n  author_id integer\n  package_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable package_report_comments {\n  id integer [pk]\n  text varchar\n  inserted_at timestamp\n  updated_at timestamp\n  package_report_id integer\n  author_id integer\n}\n\nTable package_report_releases {\n  id integer [pk]\n  release_id integer\n  package_report_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable releases {\n  id integer [pk]\n  version varchar\n  inner_checksum bytea\n  outer_checksum bytea\n  has_docs boolean\n  inserted_at timestamp\n  updated_at timestamp\n  package_id integer\n  publisher_id integer\n  meta jsonb\n  retirement jsonb\n}\n\nTable release_downloads {\n  package_id integer\n  release_id integer\n  downloads integer\n}\n\nTable repositories {\n  id integer [pk]\n  name varchar\n  inserted_at timestamp\n  updated_at timestamp\n  organization_id integer\n}\n\nTable requirements {\n  id integer [pk]\n  app varchar\n  requirement varchar\n  optional boolean\n  release_id integer\n  dependency_id integer\n}\n\nTable short_urls {\n  id integer [pk]\n  url varchar\n  short_code varchar\n  inserted_at timestamp\n}\n\nRef: keys.id < audit_logs.key_id\nRef: organizations.id < audit_logs.organization_id\nRef: organizations.id < keys.organization_id\nRef: organizations.id < organization_users.organization_id\nRef: organizations.id - repositories.organization_id\nRef: organizations.id - users.organization_id\nRef: package_reports.id < package_report_comments.package_report_id\nRef: package_reports.id < package_report_releases.package_report_id\nRef: packages.id < downloads.package_id\nRef: packages.id < package_dependants.package_id\nRef: packages.id < package_downloads.package_id\nRef: packages.id < package_owners.package_id\nRef: packages.id < package_reports.package_id\nRef: packages.id < release_downloads.package_id\nRef: packages.id < releases.package_id\nRef: packages.id < requirements.dependency_id\nRef: releases.id < downloads.release_id\nRef: releases.id < package_report_releases.release_id\nRef: releases.id - release_downloads.release_id\nRef: releases.id < requirements.release_id\nRef: repositories.id < packages.repository_id\nRef: users.id < audit_logs.user_id\nRef: users.id < emails.user_id\nRef: users.id < keys.user_id\nRef: users.id < organization_users.user_id\nRef: users.id < package_owners.user_id\nRef: users.id < package_report_comments.author_id\nRef: users.id < package_reports.author_id\nRef: users.id < password_resets.user_id\nRef: users.id < releases.publisher_id"
  },
  {
    "path": "examples/dbml/hexpm/Default.dbml",
    "content": "\n\nTable schema_migrations {\n  version integer [pk]\n  inserted_at timestamp\n}\n\nTable audit_logs {\n  id integer [pk]\n  user_agent varchar\n  remote_ip varchar\n  action varchar\n  params jsonb\n  user_id integer\n  organization_id integer\n  key_id integer\n  inserted_at timestamp\n}\n\nTable emails {\n  id integer [pk]\n  email varchar\n  verified boolean\n  primary boolean\n  public boolean\n  gravatar boolean\n  verification_key varchar\n  verification_expiry timestamp\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable keys {\n  id integer [pk]\n  name varchar\n  secret_first varchar\n  secret_second varchar\n  public boolean\n  revoke_at timestamp\n  inserted_at timestamp\n  updated_at timestamp\n  last_use jsonb\n  user_id integer\n  organization_id integer\n  permissions jsonb\n}\n\nTable organizations {\n  id integer [pk]\n  name varchar\n  billing_active boolean\n  billing_override boolean\n  trial_end timestamp\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable organization_users {\n  id integer [pk]\n  role varchar\n  organization_id integer\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable password_resets {\n  id integer [pk]\n  key varchar\n  primary_email varchar\n  user_id integer\n  inserted_at timestamp\n}\n\nTable sessions {\n  id integer [pk]\n  token bytea\n  data jsonb\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable users {\n  id integer [pk]\n  username varchar\n  full_name varchar\n  password varchar\n  service boolean\n  deactivated_at timestamp\n  role varchar\n  inserted_at timestamp\n  updated_at timestamp\n  handles jsonb\n  tfa jsonb\n  organization_id integer\n}\n\nTable blocked_addresses {\n  id integer [pk]\n  ip varchar\n  comment varchar\n}\n\nTable downloads {\n  id integer [pk]\n  package_id integer\n  release_id integer\n  downloads integer\n  day date\n}\n\nTable installs {\n  id integer [pk]\n  hex varchar\n  elixirs array\n}\n\nTable packages {\n  id integer [pk]\n  name varchar\n  docs_updated_at timestamp\n  inserted_at timestamp\n  updated_at timestamp\n  repository_id integer\n  meta jsonb\n}\n\nTable package_dependants {\n  id integer [pk]\n  package_id integer\n  name varchar\n  repo varchar\n}\n\nTable package_downloads {\n  package_id integer\n  view varchar\n  downloads integer\n}\n\nTable package_owners {\n  id integer [pk]\n  level varchar\n  package_id integer\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable package_reports {\n  id integer [pk]\n  state varchar\n  description varchar\n  author_id integer\n  package_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable package_report_comments {\n  id integer [pk]\n  text varchar\n  inserted_at timestamp\n  updated_at timestamp\n  package_report_id integer\n  author_id integer\n}\n\nTable package_report_releases {\n  id integer [pk]\n  release_id integer\n  package_report_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable releases {\n  id integer [pk]\n  version varchar\n  inner_checksum bytea\n  outer_checksum bytea\n  has_docs boolean\n  inserted_at timestamp\n  updated_at timestamp\n  package_id integer\n  publisher_id integer\n  meta jsonb\n  retirement jsonb\n}\n\nTable release_downloads {\n  package_id integer\n  release_id integer\n  downloads integer\n}\n\nTable repositories {\n  id integer [pk]\n  name varchar\n  inserted_at timestamp\n  updated_at timestamp\n  organization_id integer\n}\n\nTable requirements {\n  id integer [pk]\n  app varchar\n  requirement varchar\n  optional boolean\n  release_id integer\n  dependency_id integer\n}\n\nTable short_urls {\n  id integer [pk]\n  url varchar\n  short_code varchar\n  inserted_at timestamp\n}\n\nRef: keys.id < audit_logs.key_id\nRef: organizations.id < audit_logs.organization_id\nRef: organizations.id < keys.organization_id\nRef: organizations.id < organization_users.organization_id\nRef: organizations.id - repositories.organization_id\nRef: organizations.id - users.organization_id\nRef: package_reports.id < package_report_comments.package_report_id\nRef: package_reports.id < package_report_releases.package_report_id\nRef: packages.id < downloads.package_id\nRef: packages.id < package_dependants.package_id\nRef: packages.id < package_downloads.package_id\nRef: packages.id < package_owners.package_id\nRef: packages.id < package_reports.package_id\nRef: packages.id < release_downloads.package_id\nRef: packages.id < releases.package_id\nRef: packages.id < requirements.dependency_id\nRef: releases.id < downloads.release_id\nRef: releases.id < package_report_releases.release_id\nRef: releases.id - release_downloads.release_id\nRef: releases.id < requirements.release_id\nRef: repositories.id < packages.repository_id\nRef: users.id < audit_logs.user_id\nRef: users.id < emails.user_id\nRef: users.id < keys.user_id\nRef: users.id < organization_users.user_id\nRef: users.id < package_owners.user_id\nRef: users.id < package_report_comments.author_id\nRef: users.id < package_reports.author_id\nRef: users.id < password_resets.user_id\nRef: users.id < releases.publisher_id"
  },
  {
    "path": "examples/dbml/hexpm/Only-selected-cluster-Accounts-context.dbml",
    "content": "TableGroup \"Hexpm.Accounts\" {\n  audit_logs\n  emails\n  keys\n  organizations\n  organization_users\n  password_resets\n  sessions\n  users\n}\n\n\nTable audit_logs {\n  id integer [pk]\n  user_agent varchar\n  remote_ip varchar\n  action varchar\n  params jsonb\n  user_id integer\n  organization_id integer\n  key_id integer\n  inserted_at timestamp\n}\n\nTable emails {\n  id integer [pk]\n  email varchar\n  verified boolean\n  primary boolean\n  public boolean\n  gravatar boolean\n  verification_key varchar\n  verification_expiry timestamp\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable keys {\n  id integer [pk]\n  name varchar\n  secret_first varchar\n  secret_second varchar\n  public boolean\n  revoke_at timestamp\n  inserted_at timestamp\n  updated_at timestamp\n  last_use jsonb\n  user_id integer\n  organization_id integer\n  permissions jsonb\n}\n\nTable organizations {\n  id integer [pk]\n  name varchar\n  billing_active boolean\n  billing_override boolean\n  trial_end timestamp\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable organization_users {\n  id integer [pk]\n  role varchar\n  organization_id integer\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable password_resets {\n  id integer [pk]\n  key varchar\n  primary_email varchar\n  user_id integer\n  inserted_at timestamp\n}\n\nTable sessions {\n  id integer [pk]\n  token bytea\n  data jsonb\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable users {\n  id integer [pk]\n  username varchar\n  full_name varchar\n  password varchar\n  service boolean\n  deactivated_at timestamp\n  role varchar\n  inserted_at timestamp\n  updated_at timestamp\n  handles jsonb\n  tfa jsonb\n  organization_id integer\n}\n\nRef: keys.id < audit_logs.key_id\nRef: organizations.id < audit_logs.organization_id\nRef: organizations.id < keys.organization_id\nRef: organizations.id < organization_users.organization_id\nRef: organizations.id - users.organization_id\nRef: users.id < audit_logs.user_id\nRef: users.id < emails.user_id\nRef: users.id < keys.user_id\nRef: users.id < organization_users.user_id\nRef: users.id < password_resets.user_id"
  },
  {
    "path": "examples/dbml/plausible-analytics/Contexts-as-clusters.dbml",
    "content": "TableGroup \"Ecto.Migration\" {\n  schema_migrations\n}\nTableGroup \"FunWithFlags.Store\" {\n  fun_with_flags_toggles\n}\nTableGroup Oban {\n  oban_jobs\n}\nTableGroup Plausible {\n  events_v2\n  sessions_v2\n  funnels\n  goals\n  sites\n}\nTableGroup \"Plausible.Auth\" {\n  api_keys\n  email_activation_codes\n  invitations\n  totp_recovery_codes\n  users\n}\nTableGroup \"Plausible.Billing\" {\n  enterprise_plans\n  subscriptions\n}\nTableGroup \"Plausible.DataMigration\" {\n  domains_lookup\n}\nTableGroup \"Plausible.Funnel\" {\n  funnel_steps\n}\nTableGroup \"Plausible.Imported\" {\n  imported_browsers\n  imported_devices\n  imported_entry_pages\n  imported_exit_pages\n  imported_locations\n  imported_operating_systems\n  imported_pages\n  site_imports\n  imported_sources\n  imported_visitors\n}\nTableGroup \"Plausible.Ingestion\" {\n  ingest_counters\n}\nTableGroup \"Plausible.Plugins\" {\n  plugins_api_tokens\n}\nTableGroup \"Plausible.Shield\" {\n  shield_rules_country\n  shield_rules_hostname\n  shield_rules_ip\n  shield_rules_page\n}\nTableGroup \"Plausible.Site\" {\n  google_auth\n  site_memberships\n  monthly_reports\n  shared_links\n  spike_notifications\n  site_user_preferences\n  weekly_reports\n}\n\nEnum billing_interval {\n  yearly\n  monthly\n}\n\nEnum currency {\n  XBD\n  BYN\n  HKD\n  XOF\n  SOS\n  ARS\n  EGP\n  XDR\n  GMD\n  MAD\n  XAG\n  XAU\n  COU\n  UYW\n  LKR\n  SAR\n  BBD\n  XCD\n  ZMW\n  ZWL\n  CZK\n  JPY\n  SEK\n  PLN\n  KYD\n  THB\n  QAR\n  SLL\n  RON\n  CUC\n  MOP\n  CHW\n  KGS\n  ALL\n  CLP\n  XXX\n  IDR\n  BZD\n  PYG\n  LAK\n  OMR\n  HRK\n  CHF\n  BTN\n  MRU\n  GEL\n  BOV\n  AFN\n  RSD\n  XTS\n  UYU\n  BHD\n  HNL\n  GBP\n  WST\n  COP\n  MKD\n  ZAR\n  SYP\n  SZL\n  HTG\n  SVC\n  NPR\n  MXV\n  MMK\n  PKR\n  GTQ\n  AWG\n  SGD\n  TWD\n  AOA\n  TOP\n  XBB\n  KRW\n  XBA\n  TRY\n  XPT\n  SBD\n  MUR\n  NIO\n  CNY\n  BWP\n  NOK\n  LSL\n  IRR\n  BOB\n  BRL\n  SDG\n  BIF\n  BDT\n  UYI\n  NGN\n  LBP\n  GYD\n  RWF\n  ILS\n  PGK\n  TTD\n  SSP\n  MWK\n  ETB\n  INR\n  AUD\n  XPD\n  CVE\n  TMT\n  YER\n  BAM\n  XSU\n  MVR\n  SCR\n  JOD\n  CHE\n  CUP\n  PAB\n  MGA\n  VES\n  JMD\n  VUV\n  MNT\n  NZD\n  XBC\n  KES\n  GNF\n  XAF\n  TZS\n  BND\n  MYR\n  LRD\n  KPW\n  PHP\n  IQD\n  CRC\n  UZS\n  TND\n  DJF\n  DOP\n  GIP\n  XUA\n  CLF\n  MDL\n  NAD\n  PEN\n  CDF\n  USD\n  BGN\n  STN\n  UAH\n  EUR\n  FKP\n  GHS\n  BSD\n  CAD\n  FJD\n  SRD\n  KHR\n  MXN\n  HUF\n  UGX\n  AED\n  XPF\n  DZD\n  RUB\n  KZT\n  AZN\n  KMF\n  AMD\n  VND\n  USN\n  BMD\n  ANG\n  KWD\n  TJS\n  LYD\n  DKK\n  ERN\n  ISK\n  MZN\n  SHP\n}\n\nEnum role {\n  owner\n  admin\n  viewer\n}\n\nEnum action {\n  allow\n  deny\n}\n\nEnum source {\n  noop\n  csv\n  universal_analytics\n  google_analytics_4\n}\n\nEnum site_imports_status {\n  pending\n  failed\n  completed\n  importing\n}\n\nEnum subscriptions_status {\n  active\n  deleted\n  past_due\n  paused\n}\n\nEnum theme {\n  system\n  light\n  dark\n}\n\nTable schema_migrations {\n  version integer [pk]\n  inserted_at timestamp\n}\n\nTable fun_with_flags_toggles {\n  id integer [pk]\n  flag_name varchar\n  gate_type varchar\n  target varchar\n  enabled boolean\n}\n\nTable oban_jobs {\n  id integer [pk]\n  state varchar\n  queue varchar\n  worker varchar\n  args jsonb\n  meta jsonb\n  tags array\n  errors array\n  attempt integer\n  attempted_by array\n  max_attempts integer\n  priority integer\n  attempted_at timestamp\n  cancelled_at timestamp\n  completed_at timestamp\n  discarded_at timestamp\n  inserted_at timestamp\n  scheduled_at timestamp\n}\n\nTable events_v2 {\n  name unknown\n  site_id unknown\n  hostname varchar\n  pathname varchar\n  user_id unknown\n  session_id unknown\n  timestamp timestamp\n  \"meta.key\" array\n  \"meta.value\" array\n  revenue_source_amount unknown\n  revenue_source_currency unknown\n  revenue_reporting_amount unknown\n  revenue_reporting_currency unknown\n  referrer varchar\n  referrer_source varchar\n  utm_medium varchar\n  utm_source varchar\n  utm_campaign varchar\n  utm_content varchar\n  utm_term varchar\n  country_code unknown\n  subdivision1_code unknown\n  subdivision2_code unknown\n  city_geoname_id unknown\n  screen_size unknown\n  operating_system unknown\n  operating_system_version unknown\n  browser unknown\n  browser_version unknown\n}\n\nTable sessions_v2 {\n  hostname varchar\n  site_id unknown\n  user_id unknown\n  session_id unknown\n  start timestamp\n  duration unknown\n  is_bounce unknown\n  entry_page varchar\n  exit_page varchar\n  exit_page_hostname varchar\n  pageviews unknown\n  events unknown\n  sign unknown\n  \"entry_meta.key\" array\n  \"entry_meta.value\" array\n  utm_medium varchar\n  utm_source varchar\n  utm_campaign varchar\n  utm_content varchar\n  utm_term varchar\n  referrer varchar\n  referrer_source varchar\n  country_code unknown\n  subdivision1_code unknown\n  subdivision2_code unknown\n  city_geoname_id unknown\n  screen_size unknown\n  operating_system unknown\n  operating_system_version unknown\n  browser unknown\n  browser_version unknown\n  timestamp timestamp\n  transferred_from varchar\n}\n\nTable funnels {\n  id integer [pk]\n  name varchar\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable goals {\n  id integer [pk]\n  event_name varchar\n  page_path varchar\n  currency currency\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable sites {\n  id integer [pk]\n  domain varchar\n  timezone varchar\n  public boolean\n  locked boolean\n  stats_start_date date\n  native_stats_start_at timestamp\n  allowed_event_props array\n  conversions_enabled boolean\n  props_enabled boolean\n  funnels_enabled boolean\n  ingest_rate_limit_scale_seconds integer\n  ingest_rate_limit_threshold integer\n  domain_changed_from varchar\n  domain_changed_at timestamp\n  imported_data jsonb\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable api_keys {\n  id integer [pk]\n  name varchar\n  scopes array\n  hourly_request_limit integer\n  key_hash varchar\n  key_prefix varchar\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable email_activation_codes {\n  id integer [pk]\n  code varchar\n  issued_at timestamp\n  user_id integer\n}\n\nTable invitations {\n  id integer [pk]\n  invitation_id varchar\n  email varchar\n  role role\n  inviter_id integer\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable totp_recovery_codes {\n  id integer [pk]\n  code_digest varchar\n  user_id integer\n  inserted_at timestamp\n}\n\nTable users {\n  id integer [pk]\n  email varchar\n  password_hash varchar\n  name varchar\n  last_seen timestamp\n  trial_expiry_date date\n  theme theme\n  email_verified boolean\n  previous_email varchar\n  accept_traffic_until date\n  allow_next_upgrade_override boolean\n  totp_enabled boolean\n  totp_secret bytea\n  totp_token varchar\n  totp_last_used_at timestamp\n  grace_period jsonb\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable enterprise_plans {\n  id integer [pk]\n  paddle_plan_id varchar\n  billing_interval billing_interval\n  monthly_pageview_limit integer\n  site_limit integer\n  team_member_limit integer\n  features array\n  hourly_api_request_limit integer\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable subscriptions {\n  id integer [pk]\n  paddle_subscription_id varchar\n  paddle_plan_id varchar\n  update_url varchar\n  cancel_url varchar\n  status subscriptions_status\n  next_bill_amount varchar\n  next_bill_date date\n  last_bill_date date\n  currency_code varchar\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable domains_lookup {\n  site_id unknown\n  domain varchar\n}\n\nTable funnel_steps {\n  id integer [pk]\n  step_order integer\n  funnel_id integer\n  goal_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable imported_browsers {\n  site_id unknown\n  import_id unknown\n  date date\n  browser varchar\n  browser_version varchar\n  visitors unknown\n  visits unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_devices {\n  site_id unknown\n  import_id unknown\n  date date\n  device varchar\n  visitors unknown\n  visits unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_entry_pages {\n  site_id unknown\n  import_id unknown\n  date date\n  entry_page varchar\n  visitors unknown\n  entrances unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_exit_pages {\n  site_id unknown\n  import_id unknown\n  date date\n  exit_page varchar\n  exits unknown\n  visitors unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_locations {\n  site_id unknown\n  import_id unknown\n  date date\n  country varchar\n  region varchar\n  city unknown\n  visitors unknown\n  visits unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_operating_systems {\n  site_id unknown\n  import_id unknown\n  date date\n  operating_system varchar\n  operating_system_version varchar\n  visitors unknown\n  visits unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_pages {\n  site_id unknown\n  import_id unknown\n  date date\n  hostname varchar\n  page varchar\n  visits unknown\n  visitors unknown\n  active_visitors unknown\n  pageviews unknown\n  exits unknown\n  time_on_page unknown\n}\n\nTable site_imports {\n  id integer [pk]\n  start_date date\n  end_date date\n  label varchar\n  source source\n  status site_imports_status\n  legacy boolean\n  site_id integer\n  imported_by_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable imported_sources {\n  site_id unknown\n  import_id unknown\n  date date\n  source varchar\n  referrer varchar\n  utm_source varchar\n  utm_medium varchar\n  utm_campaign varchar\n  utm_content varchar\n  utm_term varchar\n  visitors unknown\n  visits unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_visitors {\n  site_id unknown\n  import_id unknown\n  date date\n  visitors unknown\n  pageviews unknown\n  bounces unknown\n  visits unknown\n  visit_duration unknown\n}\n\nTable ingest_counters {\n  event_timebucket timestamp\n  site_id unknown\n  domain unknown\n  metric unknown\n  value unknown\n}\n\nTable plugins_api_tokens {\n  id uuid [pk]\n  inserted_at timestamp\n  updated_at timestamp\n  token_hash bytea\n  description varchar\n  hint varchar\n  last_used_at timestamp\n  site_id integer\n}\n\nTable shield_rules_country {\n  id uuid [pk]\n  site_id integer\n  country_code varchar\n  action action\n  added_by varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable shield_rules_hostname {\n  id uuid [pk]\n  site_id integer\n  hostname varchar\n  hostname_pattern varchar\n  action action\n  added_by varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable shield_rules_ip {\n  id uuid [pk]\n  site_id integer\n  inet inet\n  action action\n  description varchar\n  added_by varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable shield_rules_page {\n  id uuid [pk]\n  site_id integer\n  page_path varchar\n  page_path_pattern varchar\n  action action\n  added_by varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable google_auth {\n  id integer [pk]\n  email varchar\n  property varchar\n  refresh_token varchar\n  access_token varchar\n  expires timestamp\n  user_id integer\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable site_memberships {\n  id integer [pk]\n  role role\n  site_id integer\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable monthly_reports {\n  id integer [pk]\n  recipients array\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable shared_links {\n  id integer [pk]\n  site_id integer\n  name varchar\n  slug varchar\n  password_hash varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable spike_notifications {\n  id integer [pk]\n  recipients array\n  threshold integer\n  last_sent timestamp\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable site_user_preferences {\n  id integer [pk]\n  pinned_at timestamp\n  user_id integer\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable weekly_reports {\n  id integer [pk]\n  recipients array\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nRef: funnels.id < funnel_steps.funnel_id\nRef: goals.id < funnel_steps.goal_id\nRef: sites.id < funnels.site_id\nRef: sites.id < goals.site_id\nRef: sites.id - google_auth.site_id\nRef: sites.id < invitations.site_id\nRef: sites.id - monthly_reports.site_id\nRef: sites.id < plugins_api_tokens.site_id\nRef: sites.id < shared_links.site_id\nRef: sites.id < shield_rules_country.site_id\nRef: sites.id < shield_rules_hostname.site_id\nRef: sites.id < shield_rules_ip.site_id\nRef: sites.id < shield_rules_page.site_id\nRef: sites.id < site_imports.site_id\nRef: sites.id - site_memberships.site_id\nRef: sites.id < site_user_preferences.site_id\nRef: sites.id - spike_notifications.site_id\nRef: sites.id - weekly_reports.site_id\nRef: users.id < api_keys.user_id\nRef: users.id < email_activation_codes.user_id\nRef: users.id - enterprise_plans.user_id\nRef: users.id - google_auth.user_id\nRef: users.id < invitations.inviter_id\nRef: users.id < site_imports.imported_by_id\nRef: users.id < site_memberships.user_id\nRef: users.id < site_user_preferences.user_id\nRef: users.id - subscriptions.user_id\nRef: users.id < totp_recovery_codes.user_id"
  },
  {
    "path": "examples/dbml/plausible-analytics/Default.dbml",
    "content": "\nEnum billing_interval {\n  yearly\n  monthly\n}\n\nEnum currency {\n  KMF\n  AUD\n  SAR\n  BWP\n  BBD\n  EGP\n  YER\n  CDF\n  IQD\n  MRU\n  JOD\n  XPT\n  XBB\n  NGN\n  BDT\n  CNY\n  ANG\n  GTQ\n  HTG\n  TWD\n  OMR\n  STN\n  AOA\n  MUR\n  XCD\n  TND\n  THB\n  KES\n  GIP\n  MZN\n  ERN\n  MAD\n  FKP\n  MVR\n  BND\n  KZT\n  EUR\n  SYP\n  MYR\n  RSD\n  KRW\n  COU\n  GMD\n  ILS\n  BAM\n  XAG\n  AZN\n  AFN\n  AWG\n  SOS\n  PAB\n  AED\n  UYI\n  BTN\n  USN\n  KPW\n  IDR\n  XPD\n  MOP\n  GEL\n  MXV\n  CHW\n  XAF\n  UGX\n  DJF\n  SGD\n  PGK\n  IRR\n  VES\n  PHP\n  SSP\n  BOB\n  XDR\n  JPY\n  BHD\n  UAH\n  ZAR\n  BSD\n  TMT\n  XOF\n  XTS\n  MNT\n  XSU\n  XPF\n  TTD\n  PLN\n  AMD\n  SBD\n  LSL\n  GBP\n  DOP\n  SEK\n  MDL\n  CUP\n  CZK\n  SZL\n  COP\n  XAU\n  NOK\n  CLF\n  RWF\n  NAD\n  KHR\n  TRY\n  LAK\n  SDG\n  XXX\n  PEN\n  LBP\n  BZD\n  CLP\n  KGS\n  TZS\n  GNF\n  KWD\n  NZD\n  SVC\n  LRD\n  CHF\n  PKR\n  SHP\n  XUA\n  XBD\n  LYD\n  BIF\n  JMD\n  ALL\n  BYN\n  CUC\n  UZS\n  MKD\n  ZWL\n  RON\n  NIO\n  MMK\n  SRD\n  ETB\n  ARS\n  GHS\n  XBA\n  XBC\n  UYW\n  HKD\n  ISK\n  DZD\n  MWK\n  RUB\n  SLL\n  SCR\n  CHE\n  CVE\n  VND\n  ZMW\n  HNL\n  HUF\n  INR\n  DKK\n  FJD\n  HRK\n  UYU\n  PYG\n  BMD\n  KYD\n  VUV\n  BGN\n  TOP\n  MXN\n  CAD\n  MGA\n  BOV\n  BRL\n  WST\n  NPR\n  CRC\n  GYD\n  TJS\n  LKR\n  QAR\n  USD\n}\n\nEnum role {\n  owner\n  admin\n  viewer\n}\n\nEnum action {\n  allow\n  deny\n}\n\nEnum source {\n  noop\n  csv\n  universal_analytics\n  google_analytics_4\n}\n\nEnum site_imports_status {\n  pending\n  failed\n  completed\n  importing\n}\n\nEnum subscriptions_status {\n  active\n  deleted\n  past_due\n  paused\n}\n\nEnum theme {\n  system\n  light\n  dark\n}\n\nTable schema_migrations {\n  version integer [pk]\n  inserted_at timestamp\n}\n\nTable fun_with_flags_toggles {\n  id integer [pk]\n  flag_name varchar\n  gate_type varchar\n  target varchar\n  enabled boolean\n}\n\nTable oban_jobs {\n  id integer [pk]\n  state varchar\n  queue varchar\n  worker varchar\n  args jsonb\n  meta jsonb\n  tags array\n  errors array\n  attempt integer\n  attempted_by array\n  max_attempts integer\n  priority integer\n  attempted_at timestamp\n  cancelled_at timestamp\n  completed_at timestamp\n  discarded_at timestamp\n  inserted_at timestamp\n  scheduled_at timestamp\n}\n\nTable api_keys {\n  id integer [pk]\n  name varchar\n  scopes array\n  hourly_request_limit integer\n  key_hash varchar\n  key_prefix varchar\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable email_activation_codes {\n  id integer [pk]\n  code varchar\n  issued_at timestamp\n  user_id integer\n}\n\nTable invitations {\n  id integer [pk]\n  invitation_id varchar\n  email varchar\n  role role\n  inviter_id integer\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable totp_recovery_codes {\n  id integer [pk]\n  code_digest varchar\n  user_id integer\n  inserted_at timestamp\n}\n\nTable users {\n  id integer [pk]\n  email varchar\n  password_hash varchar\n  name varchar\n  last_seen timestamp\n  trial_expiry_date date\n  theme theme\n  email_verified boolean\n  previous_email varchar\n  accept_traffic_until date\n  allow_next_upgrade_override boolean\n  totp_enabled boolean\n  totp_secret bytea\n  totp_token varchar\n  totp_last_used_at timestamp\n  grace_period jsonb\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable enterprise_plans {\n  id integer [pk]\n  paddle_plan_id varchar\n  billing_interval billing_interval\n  monthly_pageview_limit integer\n  site_limit integer\n  team_member_limit integer\n  features array\n  hourly_api_request_limit integer\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable subscriptions {\n  id integer [pk]\n  paddle_subscription_id varchar\n  paddle_plan_id varchar\n  update_url varchar\n  cancel_url varchar\n  status subscriptions_status\n  next_bill_amount varchar\n  next_bill_date date\n  last_bill_date date\n  currency_code varchar\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable events_v2 {\n  name unknown\n  site_id unknown\n  hostname varchar\n  pathname varchar\n  user_id unknown\n  session_id unknown\n  timestamp timestamp\n  \"meta.key\" array\n  \"meta.value\" array\n  revenue_source_amount unknown\n  revenue_source_currency unknown\n  revenue_reporting_amount unknown\n  revenue_reporting_currency unknown\n  referrer varchar\n  referrer_source varchar\n  utm_medium varchar\n  utm_source varchar\n  utm_campaign varchar\n  utm_content varchar\n  utm_term varchar\n  country_code unknown\n  subdivision1_code unknown\n  subdivision2_code unknown\n  city_geoname_id unknown\n  screen_size unknown\n  operating_system unknown\n  operating_system_version unknown\n  browser unknown\n  browser_version unknown\n}\n\nTable sessions_v2 {\n  hostname varchar\n  site_id unknown\n  user_id unknown\n  session_id unknown\n  start timestamp\n  duration unknown\n  is_bounce unknown\n  entry_page varchar\n  exit_page varchar\n  exit_page_hostname varchar\n  pageviews unknown\n  events unknown\n  sign unknown\n  \"entry_meta.key\" array\n  \"entry_meta.value\" array\n  utm_medium varchar\n  utm_source varchar\n  utm_campaign varchar\n  utm_content varchar\n  utm_term varchar\n  referrer varchar\n  referrer_source varchar\n  country_code unknown\n  subdivision1_code unknown\n  subdivision2_code unknown\n  city_geoname_id unknown\n  screen_size unknown\n  operating_system unknown\n  operating_system_version unknown\n  browser unknown\n  browser_version unknown\n  timestamp timestamp\n  transferred_from varchar\n}\n\nTable domains_lookup {\n  site_id unknown\n  domain varchar\n}\n\nTable funnels {\n  id integer [pk]\n  name varchar\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable funnel_steps {\n  id integer [pk]\n  step_order integer\n  funnel_id integer\n  goal_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable goals {\n  id integer [pk]\n  event_name varchar\n  page_path varchar\n  currency currency\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable imported_browsers {\n  site_id unknown\n  import_id unknown\n  date date\n  browser varchar\n  browser_version varchar\n  visitors unknown\n  visits unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_devices {\n  site_id unknown\n  import_id unknown\n  date date\n  device varchar\n  visitors unknown\n  visits unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_entry_pages {\n  site_id unknown\n  import_id unknown\n  date date\n  entry_page varchar\n  visitors unknown\n  entrances unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_exit_pages {\n  site_id unknown\n  import_id unknown\n  date date\n  exit_page varchar\n  exits unknown\n  visitors unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_locations {\n  site_id unknown\n  import_id unknown\n  date date\n  country varchar\n  region varchar\n  city unknown\n  visitors unknown\n  visits unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_operating_systems {\n  site_id unknown\n  import_id unknown\n  date date\n  operating_system varchar\n  operating_system_version varchar\n  visitors unknown\n  visits unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_pages {\n  site_id unknown\n  import_id unknown\n  date date\n  hostname varchar\n  page varchar\n  visits unknown\n  visitors unknown\n  active_visitors unknown\n  pageviews unknown\n  exits unknown\n  time_on_page unknown\n}\n\nTable site_imports {\n  id integer [pk]\n  start_date date\n  end_date date\n  label varchar\n  source source\n  status site_imports_status\n  legacy boolean\n  site_id integer\n  imported_by_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable imported_sources {\n  site_id unknown\n  import_id unknown\n  date date\n  source varchar\n  referrer varchar\n  utm_source varchar\n  utm_medium varchar\n  utm_campaign varchar\n  utm_content varchar\n  utm_term varchar\n  visitors unknown\n  visits unknown\n  visit_duration unknown\n  pageviews unknown\n  bounces unknown\n}\n\nTable imported_visitors {\n  site_id unknown\n  import_id unknown\n  date date\n  visitors unknown\n  pageviews unknown\n  bounces unknown\n  visits unknown\n  visit_duration unknown\n}\n\nTable ingest_counters {\n  event_timebucket timestamp\n  site_id unknown\n  domain unknown\n  metric unknown\n  value unknown\n}\n\nTable plugins_api_tokens {\n  id uuid [pk]\n  inserted_at timestamp\n  updated_at timestamp\n  token_hash bytea\n  description varchar\n  hint varchar\n  last_used_at timestamp\n  site_id integer\n}\n\nTable shield_rules_country {\n  id uuid [pk]\n  site_id integer\n  country_code varchar\n  action action\n  added_by varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable shield_rules_hostname {\n  id uuid [pk]\n  site_id integer\n  hostname varchar\n  hostname_pattern varchar\n  action action\n  added_by varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable shield_rules_ip {\n  id uuid [pk]\n  site_id integer\n  inet inet\n  action action\n  description varchar\n  added_by varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable shield_rules_page {\n  id uuid [pk]\n  site_id integer\n  page_path varchar\n  page_path_pattern varchar\n  action action\n  added_by varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable sites {\n  id integer [pk]\n  domain varchar\n  timezone varchar\n  public boolean\n  locked boolean\n  stats_start_date date\n  native_stats_start_at timestamp\n  allowed_event_props array\n  conversions_enabled boolean\n  props_enabled boolean\n  funnels_enabled boolean\n  ingest_rate_limit_scale_seconds integer\n  ingest_rate_limit_threshold integer\n  domain_changed_from varchar\n  domain_changed_at timestamp\n  imported_data jsonb\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable google_auth {\n  id integer [pk]\n  email varchar\n  property varchar\n  refresh_token varchar\n  access_token varchar\n  expires timestamp\n  user_id integer\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable site_memberships {\n  id integer [pk]\n  role role\n  site_id integer\n  user_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable monthly_reports {\n  id integer [pk]\n  recipients array\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable shared_links {\n  id integer [pk]\n  site_id integer\n  name varchar\n  slug varchar\n  password_hash varchar\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable spike_notifications {\n  id integer [pk]\n  recipients array\n  threshold integer\n  last_sent timestamp\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable site_user_preferences {\n  id integer [pk]\n  pinned_at timestamp\n  user_id integer\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nTable weekly_reports {\n  id integer [pk]\n  recipients array\n  site_id integer\n  inserted_at timestamp\n  updated_at timestamp\n}\n\nRef: funnels.id < funnel_steps.funnel_id\nRef: goals.id < funnel_steps.goal_id\nRef: sites.id < funnels.site_id\nRef: sites.id < goals.site_id\nRef: sites.id - google_auth.site_id\nRef: sites.id < invitations.site_id\nRef: sites.id - monthly_reports.site_id\nRef: sites.id < plugins_api_tokens.site_id\nRef: sites.id < shared_links.site_id\nRef: sites.id < shield_rules_country.site_id\nRef: sites.id < shield_rules_hostname.site_id\nRef: sites.id < shield_rules_ip.site_id\nRef: sites.id < shield_rules_page.site_id\nRef: sites.id < site_imports.site_id\nRef: sites.id - site_memberships.site_id\nRef: sites.id < site_user_preferences.site_id\nRef: sites.id - spike_notifications.site_id\nRef: sites.id - weekly_reports.site_id\nRef: users.id < api_keys.user_id\nRef: users.id < email_activation_codes.user_id\nRef: users.id - enterprise_plans.user_id\nRef: users.id - google_auth.user_id\nRef: users.id < invitations.inviter_id\nRef: users.id < site_imports.imported_by_id\nRef: users.id < site_memberships.user_id\nRef: users.id < site_user_preferences.user_id\nRef: users.id - subscriptions.user_id\nRef: users.id < totp_recovery_codes.user_id"
  },
  {
    "path": "examples/dot/changelog.com/Clusters.dot",
    "content": "digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \"Changelog.Feed\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Feed   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>feeds</i></font></td></tr><tr><td align='left' port='field@id'>:id               <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@name'>:name             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@slug'>:slug             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@description'>:description      <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@title_format'>:title_format     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@plusplus'>:plusplus         <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@autosub'>:autosub          <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@starts_at'>:starts_at        <i><font color='gray54'>:utc_datetime                  </font></i></td></tr><tr><td align='left' port='field@cover'>:cover            <i><font color='gray54'>Changelog.Files.Cover.Type     </font></i></td></tr><tr><td align='left' port='field@podcast_ids'>:podcast_ids      <i><font color='gray54'>{:array, :integer}             </font></i></td></tr><tr><td align='left' port='field@person_ids'>:person_ids       <i><font color='gray54'>{:array, :integer}             </font></i></td></tr><tr><td align='left' port='field@owner_id'>:owner_id         <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at      <i><font color='gray54'>:naive_datetime                </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at       <i><font color='gray54'>:naive_datetime                </font></i></td></tr></table>>]\n  \"Changelog.Subscription\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Subscription   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>subscriptions</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@unsubscribed_at'>:unsubscribed_at     <i><font color='gray54'>:utc_datetime       </font></i></td></tr><tr><td align='left' port='field@context'>:context             <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@episode_id'>:episode_id          <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@item_id'>:item_id             <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@person_id'>:person_id           <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@podcast_id'>:podcast_id          <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.Topic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Topic   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>topics</i></font></td></tr><tr><td align='left' port='field@id'>:id                 <i><font color='gray54'>:id                           </font></i></td></tr><tr><td align='left' port='field@name'>:name               <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@slug'>:slug               <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@description'>:description        <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@website'>:website            <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@twitter_handle'>:twitter_handle     <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@icon'>:icon               <i><font color='gray54'>Changelog.Files.Icon.Type     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at        <i><font color='gray54'>:naive_datetime               </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at         <i><font color='gray54'>:naive_datetime               </font></i></td></tr></table>>]\n  \"Ecto.Migration.SchemaMigration\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Ecto.Migration.SchemaMigration   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>schema_migrations</i></font></td></tr><tr><td align='left' port='field@version'>:version         <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Oban.Job\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Oban.Job   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>oban_jobs</i></font></td></tr><tr><td align='left' port='field@id'>:id               <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@state'>:state            <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@queue'>:queue            <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@worker'>:worker           <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@args'>:args             <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@meta'>:meta             <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@tags'>:tags             <i><font color='gray54'>{:array, :string}      </font></i></td></tr><tr><td align='left' port='field@errors'>:errors           <i><font color='gray54'>{:array, :map}         </font></i></td></tr><tr><td align='left' port='field@attempt'>:attempt          <i><font color='gray54'>:integer               </font></i></td></tr><tr><td align='left' port='field@attempted_by'>:attempted_by     <i><font color='gray54'>{:array, :string}      </font></i></td></tr><tr><td align='left' port='field@max_attempts'>:max_attempts     <i><font color='gray54'>:integer               </font></i></td></tr><tr><td align='left' port='field@priority'>:priority         <i><font color='gray54'>:integer               </font></i></td></tr><tr><td align='left' port='field@attempted_at'>:attempted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@cancelled_at'>:cancelled_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@completed_at'>:completed_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@discarded_at'>:discarded_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at      <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@scheduled_at'>:scheduled_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  subgraph cluster_EPISODE {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#b4eeb4\"\n    label = <<font point-size='24'><b>EPISODE</b></font>>\n    \"Changelog.Episode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Episode   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episodes</i></font></td></tr><tr><td align='left' port='field@id'>:id                    <i><font color='gray54'>:id                                                  </font></i></td></tr><tr><td align='left' port='field@slug'>:slug                  <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@guid'>:guid                  <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@title'>:title                 <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@subtitle'>:subtitle              <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@type'>:type                  <i><font color='gray54'>Changelog.Episode.Type                               </font></i></td></tr><tr><td align='left' port='field@featured'>:featured              <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@highlight'>:highlight             <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@subhighlight'>:subhighlight          <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@summary'>:summary               <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@notes'>:notes                 <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@doc_url'>:doc_url               <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@socialize_url'>:socialize_url         <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@published'>:published             <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@published_at'>:published_at          <i><font color='gray54'>:utc_datetime                                        </font></i></td></tr><tr><td align='left' port='field@recorded_at'>:recorded_at           <i><font color='gray54'>:utc_datetime                                        </font></i></td></tr><tr><td align='left' port='field@recorded_live'>:recorded_live         <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@youtube_id'>:youtube_id            <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@cover'>:cover                 <i><font color='gray54'>Changelog.Files.Cover.Type                           </font></i></td></tr><tr><td align='left' port='field@audio_file'>:audio_file            <i><font color='gray54'>Changelog.Files.Audio.Type                           </font></i></td></tr><tr><td align='left' port='field@audio_bytes'>:audio_bytes           <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@audio_duration'>:audio_duration        <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@audio_chapters'>:audio_chapters        <i><font color='gray54'>#Ecto.Embedded&lt;[many: Changelog.EpisodeChapter]&gt;     </font></i></td></tr><tr><td align='left' port='field@plusplus_file'>:plusplus_file         <i><font color='gray54'>Changelog.Files.PlusPlus.Type                        </font></i></td></tr><tr><td align='left' port='field@plusplus_bytes'>:plusplus_bytes        <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@plusplus_duration'>:plusplus_duration     <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@plusplus_chapters'>:plusplus_chapters     <i><font color='gray54'>#Ecto.Embedded&lt;[many: Changelog.EpisodeChapter]&gt;     </font></i></td></tr><tr><td align='left' port='field@download_count'>:download_count        <i><font color='gray54'>:float                                               </font></i></td></tr><tr><td align='left' port='field@import_count'>:import_count          <i><font color='gray54'>:float                                               </font></i></td></tr><tr><td align='left' port='field@reach_count'>:reach_count           <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@email_subject'>:email_subject         <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@email_teaser'>:email_teaser          <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@email_content'>:email_content         <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@email_sends'>:email_sends           <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@email_opens'>:email_opens           <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@transcript'>:transcript            <i><font color='gray54'>{:array, :map}                                       </font></i></td></tr><tr><td align='left' port='field@podcast_id'>:podcast_id            <i><font color='gray54'>:id                                                  </font></i></td></tr><tr><td align='left' port='field@request_id'>:request_id            <i><font color='gray54'>:id                                                  </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at           <i><font color='gray54'>:naive_datetime                                      </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at            <i><font color='gray54'>:naive_datetime                                      </font></i></td></tr></table>>]\n  \"Changelog.EpisodeChapter\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Changelog.EpisodeChapter   </font></td></tr><tr><td align='left' port='field@id'>:id            <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@title'>:title         <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@starts_at'>:starts_at     <i><font color='gray54'>:float         </font></i></td></tr><tr><td align='left' port='field@ends_at'>:ends_at       <i><font color='gray54'>:float         </font></i></td></tr><tr><td align='left' port='field@link_url'>:link_url      <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@image_url'>:image_url     <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  \"Changelog.EpisodeGuest\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeGuest   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episode_guests</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position          <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@thanks'>:thanks            <i><font color='gray54'>:boolean            </font></i></td></tr><tr><td align='left' port='field@discount_code'>:discount_code     <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@episode_id'>:episode_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@person_id'>:person_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.EpisodeHost\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeHost   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episode_hosts</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@person_id'>:person_id       <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@episode_id'>:episode_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.EpisodeRequest\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeRequest   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episode_requests</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                                 </font></i></td></tr><tr><td align='left' port='field@status'>:status            <i><font color='gray54'>Changelog.EpisodeRequest.Status     </font></i></td></tr><tr><td align='left' port='field@hosts'>:hosts             <i><font color='gray54'>:string                             </font></i></td></tr><tr><td align='left' port='field@guests'>:guests            <i><font color='gray54'>:string                             </font></i></td></tr><tr><td align='left' port='field@topics'>:topics            <i><font color='gray54'>:string                             </font></i></td></tr><tr><td align='left' port='field@pitch'>:pitch             <i><font color='gray54'>:string                             </font></i></td></tr><tr><td align='left' port='field@pronunciation'>:pronunciation     <i><font color='gray54'>:string                             </font></i></td></tr><tr><td align='left' port='field@message'>:message           <i><font color='gray54'>:string                             </font></i></td></tr><tr><td align='left' port='field@podcast_id'>:podcast_id        <i><font color='gray54'>:id                                 </font></i></td></tr><tr><td align='left' port='field@submitter_id'>:submitter_id      <i><font color='gray54'>:id                                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime                     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime                     </font></i></td></tr></table>>]\n  \"Changelog.EpisodeSponsor\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeSponsor   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episode_sponsors</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@title'>:title           <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@link_url'>:link_url        <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@description'>:description     <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@starts_at'>:starts_at       <i><font color='gray54'>:float              </font></i></td></tr><tr><td align='left' port='field@ends_at'>:ends_at         <i><font color='gray54'>:float              </font></i></td></tr><tr><td align='left' port='field@episode_id'>:episode_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@sponsor_id'>:sponsor_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.EpisodeStat\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeStat   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episode_stats</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@date'>:date              <i><font color='gray54'>:date               </font></i></td></tr><tr><td align='left' port='field@episode_bytes'>:episode_bytes     <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@total_bytes'>:total_bytes       <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@downloads'>:downloads         <i><font color='gray54'>:float              </font></i></td></tr><tr><td align='left' port='field@uniques'>:uniques           <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@demographics'>:demographics      <i><font color='gray54'>:map                </font></i></td></tr><tr><td align='left' port='field@episode_id'>:episode_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@podcast_id'>:podcast_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.EpisodeTopic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeTopic   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episode_topics</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@topic_id'>:topic_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@episode_id'>:episode_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  }\n  subgraph cluster_NEWS {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#eee5de\"\n    label = <<font point-size='24'><b>NEWS</b></font>>\n    \"Changelog.NewsAd\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsAd   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_ads</i></font></td></tr><tr><td align='left' port='field@id'>:id                   <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@url'>:url                  <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@headline'>:headline             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@story'>:story                <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@image'>:image                <i><font color='gray54'>Changelog.Files.Image.Type     </font></i></td></tr><tr><td align='left' port='field@active'>:active               <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@newsletter'>:newsletter           <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@impression_count'>:impression_count     <i><font color='gray54'>:integer                       </font></i></td></tr><tr><td align='left' port='field@click_count'>:click_count          <i><font color='gray54'>:integer                       </font></i></td></tr><tr><td align='left' port='field@sponsorship_id'>:sponsorship_id       <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at          <i><font color='gray54'>:naive_datetime                </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at           <i><font color='gray54'>:naive_datetime                </font></i></td></tr></table>>]\n  \"Changelog.NewsIssue\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsIssue   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_issues</i></font></td></tr><tr><td align='left' port='field@id'>:id               <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@slug'>:slug             <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@note'>:note             <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@teaser'>:teaser           <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@published'>:published        <i><font color='gray54'>:boolean            </font></i></td></tr><tr><td align='left' port='field@published_at'>:published_at     <i><font color='gray54'>:utc_datetime       </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.NewsIssueAd\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsIssueAd   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_issue_ads</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@image'>:image           <i><font color='gray54'>:boolean            </font></i></td></tr><tr><td align='left' port='field@ad_id'>:ad_id           <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@issue_id'>:issue_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.NewsIssueItem\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsIssueItem   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_issue_items</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@image'>:image           <i><font color='gray54'>:boolean            </font></i></td></tr><tr><td align='left' port='field@issue_id'>:issue_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@item_id'>:item_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.NewsItem\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsItem   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_items</i></font></td></tr><tr><td align='left' port='field@id'>:id                   <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@status'>:status               <i><font color='gray54'>Changelog.NewsItem.Status      </font></i></td></tr><tr><td align='left' port='field@type'>:type                 <i><font color='gray54'>Changelog.NewsItem.Type        </font></i></td></tr><tr><td align='left' port='field@url'>:url                  <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@headline'>:headline             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@story'>:story                <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@image'>:image                <i><font color='gray54'>Changelog.Files.Image.Type     </font></i></td></tr><tr><td align='left' port='field@object_id'>:object_id            <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@feed_only'>:feed_only            <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@pinned'>:pinned               <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@published_at'>:published_at         <i><font color='gray54'>:utc_datetime                  </font></i></td></tr><tr><td align='left' port='field@refreshed_at'>:refreshed_at         <i><font color='gray54'>:utc_datetime                  </font></i></td></tr><tr><td align='left' port='field@impression_count'>:impression_count     <i><font color='gray54'>:integer                       </font></i></td></tr><tr><td align='left' port='field@click_count'>:click_count          <i><font color='gray54'>:integer                       </font></i></td></tr><tr><td align='left' port='field@message'>:message              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@author_id'>:author_id            <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@logger_id'>:logger_id            <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@submitter_id'>:submitter_id         <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@source_id'>:source_id            <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at          <i><font color='gray54'>:naive_datetime                </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at           <i><font color='gray54'>:naive_datetime                </font></i></td></tr></table>>]\n  \"Changelog.NewsItemComment\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsItemComment   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_item_comments</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@content'>:content         <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@approved'>:approved        <i><font color='gray54'>:boolean            </font></i></td></tr><tr><td align='left' port='field@edited_at'>:edited_at       <i><font color='gray54'>:utc_datetime       </font></i></td></tr><tr><td align='left' port='field@deleted_at'>:deleted_at      <i><font color='gray54'>:utc_datetime       </font></i></td></tr><tr><td align='left' port='field@item_id'>:item_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@author_id'>:author_id       <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@parent_id'>:parent_id       <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.NewsItemTopic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsItemTopic   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_item_topics</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@item_id'>:item_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@topic_id'>:topic_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.NewsQueue\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsQueue   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_queue</i></font></td></tr><tr><td align='left' port='field@id'>:id           <i><font color='gray54'>:id        </font></i></td></tr><tr><td align='left' port='field@position'>:position     <i><font color='gray54'>:float     </font></i></td></tr><tr><td align='left' port='field@item_id'>:item_id      <i><font color='gray54'>:id        </font></i></td></tr></table>>]\n  \"Changelog.NewsSource\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsSource   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_sources</i></font></td></tr><tr><td align='left' port='field@id'>:id                 <i><font color='gray54'>:id                           </font></i></td></tr><tr><td align='left' port='field@name'>:name               <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@slug'>:slug               <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@website'>:website            <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@twitter_handle'>:twitter_handle     <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@description'>:description        <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@feed'>:feed               <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@regex'>:regex              <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@publication'>:publication        <i><font color='gray54'>:boolean                      </font></i></td></tr><tr><td align='left' port='field@icon'>:icon               <i><font color='gray54'>Changelog.Files.Icon.Type     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at        <i><font color='gray54'>:naive_datetime               </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at         <i><font color='gray54'>:naive_datetime               </font></i></td></tr></table>>]\n  \"Changelog.NewsSponsorship\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsSponsorship   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_sponsorships</i></font></td></tr><tr><td align='left' port='field@id'>:id                   <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@name'>:name                 <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@weeks'>:weeks                <i><font color='gray54'>{:array, :date}     </font></i></td></tr><tr><td align='left' port='field@impression_count'>:impression_count     <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@click_count'>:click_count          <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@sponsor_id'>:sponsor_id           <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at          <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at           <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  }\n  subgraph cluster_PERSON {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0ffff\"\n    label = <<font point-size='24'><b>PERSON</b></font>>\n    \"Changelog.Person\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Person   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>people</i></font></td></tr><tr><td align='left' port='field@id'>:id                        <i><font color='gray54'>:id                                                  </font></i></td></tr><tr><td align='left' port='field@name'>:name                      <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@email'>:email                     <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@handle'>:handle                    <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@github_handle'>:github_handle             <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@linkedin_handle'>:linkedin_handle           <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@mastodon_handle'>:mastodon_handle           <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@twitter_handle'>:twitter_handle            <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@slack_id'>:slack_id                  <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@website'>:website                   <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@bio'>:bio                       <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@location'>:location                  <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@auth_token'>:auth_token                <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@auth_token_expires_at'>:auth_token_expires_at     <i><font color='gray54'>:utc_datetime                                        </font></i></td></tr><tr><td align='left' port='field@joined_at'>:joined_at                 <i><font color='gray54'>:utc_datetime                                        </font></i></td></tr><tr><td align='left' port='field@signed_in_at'>:signed_in_at              <i><font color='gray54'>:utc_datetime                                        </font></i></td></tr><tr><td align='left' port='field@approved'>:approved                  <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@avatar'>:avatar                    <i><font color='gray54'>Changelog.Files.Avatar.Type                          </font></i></td></tr><tr><td align='left' port='field@admin'>:admin                     <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@host'>:host                      <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@editor'>:editor                    <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@public_profile'>:public_profile            <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@settings'>:settings                  <i><font color='gray54'>#Ecto.Embedded&lt;[one: Changelog.Person.Settings]&gt;     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at               <i><font color='gray54'>:naive_datetime                                      </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at                <i><font color='gray54'>:naive_datetime                                      </font></i></td></tr></table>>]\n  \"Changelog.Person.Settings\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Changelog.Person.Settings   </font></td></tr><tr><td align='left' port='field@subscribe_to_contributed_news'>:subscribe_to_contributed_news          <i><font color='gray54'>:boolean     </font></i></td></tr><tr><td align='left' port='field@subscribe_to_participated_episodes'>:subscribe_to_participated_episodes     <i><font color='gray54'>:boolean     </font></i></td></tr><tr><td align='left' port='field@email_on_authored_news'>:email_on_authored_news                 <i><font color='gray54'>:boolean     </font></i></td></tr><tr><td align='left' port='field@email_on_submitted_news'>:email_on_submitted_news                <i><font color='gray54'>:boolean     </font></i></td></tr><tr><td align='left' port='field@email_on_comment_replies'>:email_on_comment_replies               <i><font color='gray54'>:boolean     </font></i></td></tr><tr><td align='left' port='field@email_on_comment_mentions'>:email_on_comment_mentions              <i><font color='gray54'>:boolean     </font></i></td></tr></table>>]\n  }\n  subgraph cluster_PODCAST {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#ffefd5\"\n    label = <<font point-size='24'><b>PODCAST</b></font>>\n    \"Changelog.Podcast\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Podcast   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>podcasts</i></font></td></tr><tr><td align='left' port='field@id'>:id                       <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@name'>:name                     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@slug'>:slug                     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@status'>:status                   <i><font color='gray54'>Changelog.Podcast.Status       </font></i></td></tr><tr><td align='left' port='field@welcome'>:welcome                  <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@description'>:description              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@extended_description'>:extended_description     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@vanity_domain'>:vanity_domain            <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@keywords'>:keywords                 <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@mastodon_handle'>:mastodon_handle          <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@twitter_handle'>:twitter_handle           <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@apple_url'>:apple_url                <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@spotify_url'>:spotify_url              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@riverside_url'>:riverside_url            <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@chartable_id'>:chartable_id             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@schedule_note'>:schedule_note            <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@download_count'>:download_count           <i><font color='gray54'>:float                         </font></i></td></tr><tr><td align='left' port='field@reach_count'>:reach_count              <i><font color='gray54'>:integer                       </font></i></td></tr><tr><td align='left' port='field@recorded_live'>:recorded_live            <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@partner'>:partner                  <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@position'>:position                 <i><font color='gray54'>:integer                       </font></i></td></tr><tr><td align='left' port='field@subscribers'>:subscribers              <i><font color='gray54'>:map                           </font></i></td></tr><tr><td align='left' port='field@cover'>:cover                    <i><font color='gray54'>Changelog.Files.Cover.Type     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at              <i><font color='gray54'>:naive_datetime                </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at               <i><font color='gray54'>:naive_datetime                </font></i></td></tr></table>>]\n  \"Changelog.PodcastHost\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.PodcastHost   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>podcast_hosts</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@retired'>:retired         <i><font color='gray54'>:boolean            </font></i></td></tr><tr><td align='left' port='field@person_id'>:person_id       <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@podcast_id'>:podcast_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.PodcastTopic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.PodcastTopic   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>podcast_topics</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@podcast_id'>:podcast_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@topic_id'>:topic_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  }\n  subgraph cluster_POST {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#eee5de\"\n    label = <<font point-size='24'><b>POST</b></font>>\n    \"Changelog.Post\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Post   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>posts</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@title'>:title             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@subtitle'>:subtitle          <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@slug'>:slug              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@guid'>:guid              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@canonical_url'>:canonical_url     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@image'>:image             <i><font color='gray54'>Changelog.Files.Image.Type     </font></i></td></tr><tr><td align='left' port='field@tldr'>:tldr              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@body'>:body              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@published'>:published         <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@published_at'>:published_at      <i><font color='gray54'>:utc_datetime                  </font></i></td></tr><tr><td align='left' port='field@author_id'>:author_id         <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@editor_id'>:editor_id         <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime                </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime                </font></i></td></tr></table>>]\n  \"Changelog.PostTopic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.PostTopic   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>post_topics</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@topic_id'>:topic_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@post_id'>:post_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  }\n  subgraph cluster_SPONSOR {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#fffafa\"\n    label = <<font point-size='24'><b>SPONSOR</b></font>>\n    \"Changelog.Sponsor\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Sponsor   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>sponsors</i></font></td></tr><tr><td align='left' port='field@id'>:id                 <i><font color='gray54'>:id                                </font></i></td></tr><tr><td align='left' port='field@name'>:name               <i><font color='gray54'>:string                            </font></i></td></tr><tr><td align='left' port='field@description'>:description        <i><font color='gray54'>:string                            </font></i></td></tr><tr><td align='left' port='field@website'>:website            <i><font color='gray54'>:string                            </font></i></td></tr><tr><td align='left' port='field@github_handle'>:github_handle      <i><font color='gray54'>:string                            </font></i></td></tr><tr><td align='left' port='field@twitter_handle'>:twitter_handle     <i><font color='gray54'>:string                            </font></i></td></tr><tr><td align='left' port='field@avatar'>:avatar             <i><font color='gray54'>Changelog.Files.Avatar.Type        </font></i></td></tr><tr><td align='left' port='field@color_logo'>:color_logo         <i><font color='gray54'>Changelog.Files.ColorLogo.Type     </font></i></td></tr><tr><td align='left' port='field@dark_logo'>:dark_logo          <i><font color='gray54'>Changelog.Files.DarkLogo.Type      </font></i></td></tr><tr><td align='left' port='field@light_logo'>:light_logo         <i><font color='gray54'>Changelog.Files.LightLogo.Type     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at        <i><font color='gray54'>:naive_datetime                    </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at         <i><font color='gray54'>:naive_datetime                    </font></i></td></tr></table>>]\n  \"Changelog.SponsorRep\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.SponsorRep   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>sponsor_reps</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@sponsor_id'>:sponsor_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@person_id'>:person_id       <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  }\n\n  \"Changelog.EpisodeRequest\":\"field@id\":e -> \"Changelog.Episode\":\"field@request_id\":w [dir=none]\n  \"Changelog.Episode\":\"field@audio_chapters\":e -> \"Changelog.EpisodeChapter\":\"header@schema_module\":w\n  \"Changelog.Episode\":\"field@id\":e -> \"Changelog.EpisodeGuest\":\"field@episode_id\":w\n  \"Changelog.Episode\":\"field@id\":e -> \"Changelog.EpisodeHost\":\"field@episode_id\":w\n  \"Changelog.Episode\":\"field@id\":e -> \"Changelog.EpisodeSponsor\":\"field@episode_id\":w\n  \"Changelog.Episode\":\"field@id\":e -> \"Changelog.EpisodeStat\":\"field@episode_id\":w\n  \"Changelog.Episode\":\"field@id\":e -> \"Changelog.EpisodeTopic\":\"field@episode_id\":w\n  \"Changelog.Episode\":\"field@id\":e -> \"Changelog.Subscription\":\"field@episode_id\":w\n  \"Changelog.Episode\":\"field@plusplus_chapters\":e -> \"Changelog.EpisodeChapter\":\"header@schema_module\":w\n  \"Changelog.NewsAd\":\"field@id\":e -> \"Changelog.NewsIssueAd\":\"field@ad_id\":w\n  \"Changelog.NewsIssue\":\"field@id\":e -> \"Changelog.NewsIssueAd\":\"field@issue_id\":w\n  \"Changelog.NewsIssue\":\"field@id\":e -> \"Changelog.NewsIssueItem\":\"field@issue_id\":w\n  \"Changelog.NewsItemComment\":\"field@id\":e -> \"Changelog.NewsItemComment\":\"field@parent_id\":w\n  \"Changelog.NewsItem\":\"field@id\":e -> \"Changelog.NewsIssueItem\":\"field@item_id\":w\n  \"Changelog.NewsItem\":\"field@id\":e -> \"Changelog.NewsItemComment\":\"field@item_id\":w\n  \"Changelog.NewsItem\":\"field@id\":e -> \"Changelog.NewsItemTopic\":\"field@item_id\":w\n  \"Changelog.NewsItem\":\"field@id\":e -> \"Changelog.NewsQueue\":\"field@item_id\":w [dir=none]\n  \"Changelog.NewsItem\":\"field@id\":e -> \"Changelog.Subscription\":\"field@item_id\":w\n  \"Changelog.NewsSource\":\"field@id\":e -> \"Changelog.NewsItem\":\"field@source_id\":w\n  \"Changelog.NewsSponsorship\":\"field@id\":e -> \"Changelog.NewsAd\":\"field@sponsorship_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.EpisodeGuest\":\"field@person_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.EpisodeHost\":\"field@person_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.EpisodeRequest\":\"field@submitter_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.Feed\":\"field@owner_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.NewsItemComment\":\"field@author_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.NewsItem\":\"field@author_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.NewsItem\":\"field@logger_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.NewsItem\":\"field@submitter_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.PodcastHost\":\"field@person_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.Post\":\"field@author_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.Post\":\"field@editor_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.SponsorRep\":\"field@person_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.Subscription\":\"field@person_id\":w\n  \"Changelog.Person\":\"field@settings\":e -> \"Changelog.Person.Settings\":\"header@schema_module\":w [dir=none]\n  \"Changelog.Podcast\":\"field@id\":e -> \"Changelog.EpisodeRequest\":\"field@podcast_id\":w\n  \"Changelog.Podcast\":\"field@id\":e -> \"Changelog.EpisodeStat\":\"field@podcast_id\":w\n  \"Changelog.Podcast\":\"field@id\":e -> \"Changelog.Episode\":\"field@podcast_id\":w\n  \"Changelog.Podcast\":\"field@id\":e -> \"Changelog.PodcastHost\":\"field@podcast_id\":w\n  \"Changelog.Podcast\":\"field@id\":e -> \"Changelog.PodcastTopic\":\"field@podcast_id\":w\n  \"Changelog.Podcast\":\"field@id\":e -> \"Changelog.Subscription\":\"field@podcast_id\":w\n  \"Changelog.Post\":\"field@id\":e -> \"Changelog.PostTopic\":\"field@post_id\":w\n  \"Changelog.Sponsor\":\"field@id\":e -> \"Changelog.EpisodeSponsor\":\"field@sponsor_id\":w\n  \"Changelog.Sponsor\":\"field@id\":e -> \"Changelog.NewsSponsorship\":\"field@sponsor_id\":w\n  \"Changelog.Sponsor\":\"field@id\":e -> \"Changelog.SponsorRep\":\"field@sponsor_id\":w\n  \"Changelog.Topic\":\"field@id\":e -> \"Changelog.EpisodeTopic\":\"field@topic_id\":w\n  \"Changelog.Topic\":\"field@id\":e -> \"Changelog.NewsItemTopic\":\"field@topic_id\":w\n  \"Changelog.Topic\":\"field@id\":e -> \"Changelog.PodcastTopic\":\"field@topic_id\":w\n  \"Changelog.Topic\":\"field@id\":e -> \"Changelog.PostTopic\":\"field@topic_id\":w\n}\n"
  },
  {
    "path": "examples/dot/changelog.com/Default.dot",
    "content": "digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \"Changelog.Episode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Episode   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episodes</i></font></td></tr><tr><td align='left' port='field@id'>:id                    <i><font color='gray54'>:id                                                  </font></i></td></tr><tr><td align='left' port='field@slug'>:slug                  <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@guid'>:guid                  <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@title'>:title                 <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@subtitle'>:subtitle              <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@type'>:type                  <i><font color='gray54'>Changelog.Episode.Type                               </font></i></td></tr><tr><td align='left' port='field@featured'>:featured              <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@highlight'>:highlight             <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@subhighlight'>:subhighlight          <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@summary'>:summary               <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@notes'>:notes                 <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@doc_url'>:doc_url               <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@socialize_url'>:socialize_url         <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@published'>:published             <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@published_at'>:published_at          <i><font color='gray54'>:utc_datetime                                        </font></i></td></tr><tr><td align='left' port='field@recorded_at'>:recorded_at           <i><font color='gray54'>:utc_datetime                                        </font></i></td></tr><tr><td align='left' port='field@recorded_live'>:recorded_live         <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@youtube_id'>:youtube_id            <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@cover'>:cover                 <i><font color='gray54'>Changelog.Files.Cover.Type                           </font></i></td></tr><tr><td align='left' port='field@audio_file'>:audio_file            <i><font color='gray54'>Changelog.Files.Audio.Type                           </font></i></td></tr><tr><td align='left' port='field@audio_bytes'>:audio_bytes           <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@audio_duration'>:audio_duration        <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@audio_chapters'>:audio_chapters        <i><font color='gray54'>#Ecto.Embedded&lt;[many: Changelog.EpisodeChapter]&gt;     </font></i></td></tr><tr><td align='left' port='field@plusplus_file'>:plusplus_file         <i><font color='gray54'>Changelog.Files.PlusPlus.Type                        </font></i></td></tr><tr><td align='left' port='field@plusplus_bytes'>:plusplus_bytes        <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@plusplus_duration'>:plusplus_duration     <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@plusplus_chapters'>:plusplus_chapters     <i><font color='gray54'>#Ecto.Embedded&lt;[many: Changelog.EpisodeChapter]&gt;     </font></i></td></tr><tr><td align='left' port='field@download_count'>:download_count        <i><font color='gray54'>:float                                               </font></i></td></tr><tr><td align='left' port='field@import_count'>:import_count          <i><font color='gray54'>:float                                               </font></i></td></tr><tr><td align='left' port='field@reach_count'>:reach_count           <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@email_subject'>:email_subject         <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@email_teaser'>:email_teaser          <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@email_content'>:email_content         <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@email_sends'>:email_sends           <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@email_opens'>:email_opens           <i><font color='gray54'>:integer                                             </font></i></td></tr><tr><td align='left' port='field@transcript'>:transcript            <i><font color='gray54'>{:array, :map}                                       </font></i></td></tr><tr><td align='left' port='field@podcast_id'>:podcast_id            <i><font color='gray54'>:id                                                  </font></i></td></tr><tr><td align='left' port='field@request_id'>:request_id            <i><font color='gray54'>:id                                                  </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at           <i><font color='gray54'>:naive_datetime                                      </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at            <i><font color='gray54'>:naive_datetime                                      </font></i></td></tr></table>>]\n  \"Changelog.EpisodeChapter\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Changelog.EpisodeChapter   </font></td></tr><tr><td align='left' port='field@id'>:id            <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@title'>:title         <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@starts_at'>:starts_at     <i><font color='gray54'>:float         </font></i></td></tr><tr><td align='left' port='field@ends_at'>:ends_at       <i><font color='gray54'>:float         </font></i></td></tr><tr><td align='left' port='field@link_url'>:link_url      <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@image_url'>:image_url     <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  \"Changelog.EpisodeGuest\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeGuest   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episode_guests</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position          <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@thanks'>:thanks            <i><font color='gray54'>:boolean            </font></i></td></tr><tr><td align='left' port='field@discount_code'>:discount_code     <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@episode_id'>:episode_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@person_id'>:person_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.EpisodeHost\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeHost   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episode_hosts</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@person_id'>:person_id       <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@episode_id'>:episode_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.EpisodeRequest\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeRequest   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episode_requests</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                                 </font></i></td></tr><tr><td align='left' port='field@status'>:status            <i><font color='gray54'>Changelog.EpisodeRequest.Status     </font></i></td></tr><tr><td align='left' port='field@hosts'>:hosts             <i><font color='gray54'>:string                             </font></i></td></tr><tr><td align='left' port='field@guests'>:guests            <i><font color='gray54'>:string                             </font></i></td></tr><tr><td align='left' port='field@topics'>:topics            <i><font color='gray54'>:string                             </font></i></td></tr><tr><td align='left' port='field@pitch'>:pitch             <i><font color='gray54'>:string                             </font></i></td></tr><tr><td align='left' port='field@pronunciation'>:pronunciation     <i><font color='gray54'>:string                             </font></i></td></tr><tr><td align='left' port='field@message'>:message           <i><font color='gray54'>:string                             </font></i></td></tr><tr><td align='left' port='field@podcast_id'>:podcast_id        <i><font color='gray54'>:id                                 </font></i></td></tr><tr><td align='left' port='field@submitter_id'>:submitter_id      <i><font color='gray54'>:id                                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime                     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime                     </font></i></td></tr></table>>]\n  \"Changelog.EpisodeSponsor\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeSponsor   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episode_sponsors</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@title'>:title           <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@link_url'>:link_url        <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@description'>:description     <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@starts_at'>:starts_at       <i><font color='gray54'>:float              </font></i></td></tr><tr><td align='left' port='field@ends_at'>:ends_at         <i><font color='gray54'>:float              </font></i></td></tr><tr><td align='left' port='field@episode_id'>:episode_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@sponsor_id'>:sponsor_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.EpisodeStat\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeStat   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episode_stats</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@date'>:date              <i><font color='gray54'>:date               </font></i></td></tr><tr><td align='left' port='field@episode_bytes'>:episode_bytes     <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@total_bytes'>:total_bytes       <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@downloads'>:downloads         <i><font color='gray54'>:float              </font></i></td></tr><tr><td align='left' port='field@uniques'>:uniques           <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@demographics'>:demographics      <i><font color='gray54'>:map                </font></i></td></tr><tr><td align='left' port='field@episode_id'>:episode_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@podcast_id'>:podcast_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.EpisodeTopic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeTopic   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>episode_topics</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@topic_id'>:topic_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@episode_id'>:episode_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.Feed\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Feed   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>feeds</i></font></td></tr><tr><td align='left' port='field@id'>:id               <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@name'>:name             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@slug'>:slug             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@description'>:description      <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@title_format'>:title_format     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@plusplus'>:plusplus         <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@autosub'>:autosub          <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@starts_at'>:starts_at        <i><font color='gray54'>:utc_datetime                  </font></i></td></tr><tr><td align='left' port='field@cover'>:cover            <i><font color='gray54'>Changelog.Files.Cover.Type     </font></i></td></tr><tr><td align='left' port='field@podcast_ids'>:podcast_ids      <i><font color='gray54'>{:array, :integer}             </font></i></td></tr><tr><td align='left' port='field@person_ids'>:person_ids       <i><font color='gray54'>{:array, :integer}             </font></i></td></tr><tr><td align='left' port='field@owner_id'>:owner_id         <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at      <i><font color='gray54'>:naive_datetime                </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at       <i><font color='gray54'>:naive_datetime                </font></i></td></tr></table>>]\n  \"Changelog.NewsAd\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsAd   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_ads</i></font></td></tr><tr><td align='left' port='field@id'>:id                   <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@url'>:url                  <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@headline'>:headline             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@story'>:story                <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@image'>:image                <i><font color='gray54'>Changelog.Files.Image.Type     </font></i></td></tr><tr><td align='left' port='field@active'>:active               <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@newsletter'>:newsletter           <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@impression_count'>:impression_count     <i><font color='gray54'>:integer                       </font></i></td></tr><tr><td align='left' port='field@click_count'>:click_count          <i><font color='gray54'>:integer                       </font></i></td></tr><tr><td align='left' port='field@sponsorship_id'>:sponsorship_id       <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at          <i><font color='gray54'>:naive_datetime                </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at           <i><font color='gray54'>:naive_datetime                </font></i></td></tr></table>>]\n  \"Changelog.NewsIssue\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsIssue   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_issues</i></font></td></tr><tr><td align='left' port='field@id'>:id               <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@slug'>:slug             <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@note'>:note             <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@teaser'>:teaser           <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@published'>:published        <i><font color='gray54'>:boolean            </font></i></td></tr><tr><td align='left' port='field@published_at'>:published_at     <i><font color='gray54'>:utc_datetime       </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.NewsIssueAd\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsIssueAd   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_issue_ads</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@image'>:image           <i><font color='gray54'>:boolean            </font></i></td></tr><tr><td align='left' port='field@ad_id'>:ad_id           <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@issue_id'>:issue_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.NewsIssueItem\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsIssueItem   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_issue_items</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@image'>:image           <i><font color='gray54'>:boolean            </font></i></td></tr><tr><td align='left' port='field@issue_id'>:issue_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@item_id'>:item_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.NewsItem\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsItem   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_items</i></font></td></tr><tr><td align='left' port='field@id'>:id                   <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@status'>:status               <i><font color='gray54'>Changelog.NewsItem.Status      </font></i></td></tr><tr><td align='left' port='field@type'>:type                 <i><font color='gray54'>Changelog.NewsItem.Type        </font></i></td></tr><tr><td align='left' port='field@url'>:url                  <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@headline'>:headline             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@story'>:story                <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@image'>:image                <i><font color='gray54'>Changelog.Files.Image.Type     </font></i></td></tr><tr><td align='left' port='field@object_id'>:object_id            <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@feed_only'>:feed_only            <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@pinned'>:pinned               <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@published_at'>:published_at         <i><font color='gray54'>:utc_datetime                  </font></i></td></tr><tr><td align='left' port='field@refreshed_at'>:refreshed_at         <i><font color='gray54'>:utc_datetime                  </font></i></td></tr><tr><td align='left' port='field@impression_count'>:impression_count     <i><font color='gray54'>:integer                       </font></i></td></tr><tr><td align='left' port='field@click_count'>:click_count          <i><font color='gray54'>:integer                       </font></i></td></tr><tr><td align='left' port='field@message'>:message              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@author_id'>:author_id            <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@logger_id'>:logger_id            <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@submitter_id'>:submitter_id         <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@source_id'>:source_id            <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at          <i><font color='gray54'>:naive_datetime                </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at           <i><font color='gray54'>:naive_datetime                </font></i></td></tr></table>>]\n  \"Changelog.NewsItemComment\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsItemComment   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_item_comments</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@content'>:content         <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@approved'>:approved        <i><font color='gray54'>:boolean            </font></i></td></tr><tr><td align='left' port='field@edited_at'>:edited_at       <i><font color='gray54'>:utc_datetime       </font></i></td></tr><tr><td align='left' port='field@deleted_at'>:deleted_at      <i><font color='gray54'>:utc_datetime       </font></i></td></tr><tr><td align='left' port='field@item_id'>:item_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@author_id'>:author_id       <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@parent_id'>:parent_id       <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.NewsItemTopic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsItemTopic   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_item_topics</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@item_id'>:item_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@topic_id'>:topic_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.NewsQueue\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsQueue   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_queue</i></font></td></tr><tr><td align='left' port='field@id'>:id           <i><font color='gray54'>:id        </font></i></td></tr><tr><td align='left' port='field@position'>:position     <i><font color='gray54'>:float     </font></i></td></tr><tr><td align='left' port='field@item_id'>:item_id      <i><font color='gray54'>:id        </font></i></td></tr></table>>]\n  \"Changelog.NewsSource\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsSource   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_sources</i></font></td></tr><tr><td align='left' port='field@id'>:id                 <i><font color='gray54'>:id                           </font></i></td></tr><tr><td align='left' port='field@name'>:name               <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@slug'>:slug               <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@website'>:website            <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@twitter_handle'>:twitter_handle     <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@description'>:description        <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@feed'>:feed               <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@regex'>:regex              <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@publication'>:publication        <i><font color='gray54'>:boolean                      </font></i></td></tr><tr><td align='left' port='field@icon'>:icon               <i><font color='gray54'>Changelog.Files.Icon.Type     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at        <i><font color='gray54'>:naive_datetime               </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at         <i><font color='gray54'>:naive_datetime               </font></i></td></tr></table>>]\n  \"Changelog.NewsSponsorship\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsSponsorship   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>news_sponsorships</i></font></td></tr><tr><td align='left' port='field@id'>:id                   <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@name'>:name                 <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@weeks'>:weeks                <i><font color='gray54'>{:array, :date}     </font></i></td></tr><tr><td align='left' port='field@impression_count'>:impression_count     <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@click_count'>:click_count          <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@sponsor_id'>:sponsor_id           <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at          <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at           <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.Person\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Person   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>people</i></font></td></tr><tr><td align='left' port='field@id'>:id                        <i><font color='gray54'>:id                                                  </font></i></td></tr><tr><td align='left' port='field@name'>:name                      <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@email'>:email                     <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@handle'>:handle                    <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@github_handle'>:github_handle             <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@linkedin_handle'>:linkedin_handle           <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@mastodon_handle'>:mastodon_handle           <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@twitter_handle'>:twitter_handle            <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@slack_id'>:slack_id                  <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@website'>:website                   <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@bio'>:bio                       <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@location'>:location                  <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@auth_token'>:auth_token                <i><font color='gray54'>:string                                              </font></i></td></tr><tr><td align='left' port='field@auth_token_expires_at'>:auth_token_expires_at     <i><font color='gray54'>:utc_datetime                                        </font></i></td></tr><tr><td align='left' port='field@joined_at'>:joined_at                 <i><font color='gray54'>:utc_datetime                                        </font></i></td></tr><tr><td align='left' port='field@signed_in_at'>:signed_in_at              <i><font color='gray54'>:utc_datetime                                        </font></i></td></tr><tr><td align='left' port='field@approved'>:approved                  <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@avatar'>:avatar                    <i><font color='gray54'>Changelog.Files.Avatar.Type                          </font></i></td></tr><tr><td align='left' port='field@admin'>:admin                     <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@host'>:host                      <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@editor'>:editor                    <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@public_profile'>:public_profile            <i><font color='gray54'>:boolean                                             </font></i></td></tr><tr><td align='left' port='field@settings'>:settings                  <i><font color='gray54'>#Ecto.Embedded&lt;[one: Changelog.Person.Settings]&gt;     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at               <i><font color='gray54'>:naive_datetime                                      </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at                <i><font color='gray54'>:naive_datetime                                      </font></i></td></tr></table>>]\n  \"Changelog.Person.Settings\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Changelog.Person.Settings   </font></td></tr><tr><td align='left' port='field@subscribe_to_contributed_news'>:subscribe_to_contributed_news          <i><font color='gray54'>:boolean     </font></i></td></tr><tr><td align='left' port='field@subscribe_to_participated_episodes'>:subscribe_to_participated_episodes     <i><font color='gray54'>:boolean     </font></i></td></tr><tr><td align='left' port='field@email_on_authored_news'>:email_on_authored_news                 <i><font color='gray54'>:boolean     </font></i></td></tr><tr><td align='left' port='field@email_on_submitted_news'>:email_on_submitted_news                <i><font color='gray54'>:boolean     </font></i></td></tr><tr><td align='left' port='field@email_on_comment_replies'>:email_on_comment_replies               <i><font color='gray54'>:boolean     </font></i></td></tr><tr><td align='left' port='field@email_on_comment_mentions'>:email_on_comment_mentions              <i><font color='gray54'>:boolean     </font></i></td></tr></table>>]\n  \"Changelog.Podcast\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Podcast   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>podcasts</i></font></td></tr><tr><td align='left' port='field@id'>:id                       <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@name'>:name                     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@slug'>:slug                     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@status'>:status                   <i><font color='gray54'>Changelog.Podcast.Status       </font></i></td></tr><tr><td align='left' port='field@welcome'>:welcome                  <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@description'>:description              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@extended_description'>:extended_description     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@vanity_domain'>:vanity_domain            <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@keywords'>:keywords                 <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@mastodon_handle'>:mastodon_handle          <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@twitter_handle'>:twitter_handle           <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@apple_url'>:apple_url                <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@spotify_url'>:spotify_url              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@riverside_url'>:riverside_url            <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@chartable_id'>:chartable_id             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@schedule_note'>:schedule_note            <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@download_count'>:download_count           <i><font color='gray54'>:float                         </font></i></td></tr><tr><td align='left' port='field@reach_count'>:reach_count              <i><font color='gray54'>:integer                       </font></i></td></tr><tr><td align='left' port='field@recorded_live'>:recorded_live            <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@partner'>:partner                  <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@position'>:position                 <i><font color='gray54'>:integer                       </font></i></td></tr><tr><td align='left' port='field@subscribers'>:subscribers              <i><font color='gray54'>:map                           </font></i></td></tr><tr><td align='left' port='field@cover'>:cover                    <i><font color='gray54'>Changelog.Files.Cover.Type     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at              <i><font color='gray54'>:naive_datetime                </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at               <i><font color='gray54'>:naive_datetime                </font></i></td></tr></table>>]\n  \"Changelog.PodcastHost\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.PodcastHost   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>podcast_hosts</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@retired'>:retired         <i><font color='gray54'>:boolean            </font></i></td></tr><tr><td align='left' port='field@person_id'>:person_id       <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@podcast_id'>:podcast_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.PodcastTopic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.PodcastTopic   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>podcast_topics</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@podcast_id'>:podcast_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@topic_id'>:topic_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.Post\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Post   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>posts</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@title'>:title             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@subtitle'>:subtitle          <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@slug'>:slug              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@guid'>:guid              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@canonical_url'>:canonical_url     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@image'>:image             <i><font color='gray54'>Changelog.Files.Image.Type     </font></i></td></tr><tr><td align='left' port='field@tldr'>:tldr              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@body'>:body              <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@published'>:published         <i><font color='gray54'>:boolean                       </font></i></td></tr><tr><td align='left' port='field@published_at'>:published_at      <i><font color='gray54'>:utc_datetime                  </font></i></td></tr><tr><td align='left' port='field@author_id'>:author_id         <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@editor_id'>:editor_id         <i><font color='gray54'>:id                            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime                </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime                </font></i></td></tr></table>>]\n  \"Changelog.PostTopic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.PostTopic   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>post_topics</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@position'>:position        <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@topic_id'>:topic_id        <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@post_id'>:post_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.Sponsor\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Sponsor   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>sponsors</i></font></td></tr><tr><td align='left' port='field@id'>:id                 <i><font color='gray54'>:id                                </font></i></td></tr><tr><td align='left' port='field@name'>:name               <i><font color='gray54'>:string                            </font></i></td></tr><tr><td align='left' port='field@description'>:description        <i><font color='gray54'>:string                            </font></i></td></tr><tr><td align='left' port='field@website'>:website            <i><font color='gray54'>:string                            </font></i></td></tr><tr><td align='left' port='field@github_handle'>:github_handle      <i><font color='gray54'>:string                            </font></i></td></tr><tr><td align='left' port='field@twitter_handle'>:twitter_handle     <i><font color='gray54'>:string                            </font></i></td></tr><tr><td align='left' port='field@avatar'>:avatar             <i><font color='gray54'>Changelog.Files.Avatar.Type        </font></i></td></tr><tr><td align='left' port='field@color_logo'>:color_logo         <i><font color='gray54'>Changelog.Files.ColorLogo.Type     </font></i></td></tr><tr><td align='left' port='field@dark_logo'>:dark_logo          <i><font color='gray54'>Changelog.Files.DarkLogo.Type      </font></i></td></tr><tr><td align='left' port='field@light_logo'>:light_logo         <i><font color='gray54'>Changelog.Files.LightLogo.Type     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at        <i><font color='gray54'>:naive_datetime                    </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at         <i><font color='gray54'>:naive_datetime                    </font></i></td></tr></table>>]\n  \"Changelog.SponsorRep\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.SponsorRep   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>sponsor_reps</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@sponsor_id'>:sponsor_id      <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@person_id'>:person_id       <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.Subscription\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Subscription   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>subscriptions</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@unsubscribed_at'>:unsubscribed_at     <i><font color='gray54'>:utc_datetime       </font></i></td></tr><tr><td align='left' port='field@context'>:context             <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@episode_id'>:episode_id          <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@item_id'>:item_id             <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@person_id'>:person_id           <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@podcast_id'>:podcast_id          <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Changelog.Topic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Topic   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>topics</i></font></td></tr><tr><td align='left' port='field@id'>:id                 <i><font color='gray54'>:id                           </font></i></td></tr><tr><td align='left' port='field@name'>:name               <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@slug'>:slug               <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@description'>:description        <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@website'>:website            <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@twitter_handle'>:twitter_handle     <i><font color='gray54'>:string                       </font></i></td></tr><tr><td align='left' port='field@icon'>:icon               <i><font color='gray54'>Changelog.Files.Icon.Type     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at        <i><font color='gray54'>:naive_datetime               </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at         <i><font color='gray54'>:naive_datetime               </font></i></td></tr></table>>]\n  \"Ecto.Migration.SchemaMigration\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Ecto.Migration.SchemaMigration   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>schema_migrations</i></font></td></tr><tr><td align='left' port='field@version'>:version         <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Oban.Job\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Oban.Job   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>oban_jobs</i></font></td></tr><tr><td align='left' port='field@id'>:id               <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@state'>:state            <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@queue'>:queue            <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@worker'>:worker           <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@args'>:args             <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@meta'>:meta             <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@tags'>:tags             <i><font color='gray54'>{:array, :string}      </font></i></td></tr><tr><td align='left' port='field@errors'>:errors           <i><font color='gray54'>{:array, :map}         </font></i></td></tr><tr><td align='left' port='field@attempt'>:attempt          <i><font color='gray54'>:integer               </font></i></td></tr><tr><td align='left' port='field@attempted_by'>:attempted_by     <i><font color='gray54'>{:array, :string}      </font></i></td></tr><tr><td align='left' port='field@max_attempts'>:max_attempts     <i><font color='gray54'>:integer               </font></i></td></tr><tr><td align='left' port='field@priority'>:priority         <i><font color='gray54'>:integer               </font></i></td></tr><tr><td align='left' port='field@attempted_at'>:attempted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@cancelled_at'>:cancelled_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@completed_at'>:completed_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@discarded_at'>:discarded_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at      <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@scheduled_at'>:scheduled_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n\n  \"Changelog.EpisodeRequest\":\"field@id\":e -> \"Changelog.Episode\":\"field@request_id\":w [dir=none]\n  \"Changelog.Episode\":\"field@audio_chapters\":e -> \"Changelog.EpisodeChapter\":\"header@schema_module\":w\n  \"Changelog.Episode\":\"field@id\":e -> \"Changelog.EpisodeGuest\":\"field@episode_id\":w\n  \"Changelog.Episode\":\"field@id\":e -> \"Changelog.EpisodeHost\":\"field@episode_id\":w\n  \"Changelog.Episode\":\"field@id\":e -> \"Changelog.EpisodeSponsor\":\"field@episode_id\":w\n  \"Changelog.Episode\":\"field@id\":e -> \"Changelog.EpisodeStat\":\"field@episode_id\":w\n  \"Changelog.Episode\":\"field@id\":e -> \"Changelog.EpisodeTopic\":\"field@episode_id\":w\n  \"Changelog.Episode\":\"field@id\":e -> \"Changelog.Subscription\":\"field@episode_id\":w\n  \"Changelog.Episode\":\"field@plusplus_chapters\":e -> \"Changelog.EpisodeChapter\":\"header@schema_module\":w\n  \"Changelog.NewsAd\":\"field@id\":e -> \"Changelog.NewsIssueAd\":\"field@ad_id\":w\n  \"Changelog.NewsIssue\":\"field@id\":e -> \"Changelog.NewsIssueAd\":\"field@issue_id\":w\n  \"Changelog.NewsIssue\":\"field@id\":e -> \"Changelog.NewsIssueItem\":\"field@issue_id\":w\n  \"Changelog.NewsItemComment\":\"field@id\":e -> \"Changelog.NewsItemComment\":\"field@parent_id\":w\n  \"Changelog.NewsItem\":\"field@id\":e -> \"Changelog.NewsIssueItem\":\"field@item_id\":w\n  \"Changelog.NewsItem\":\"field@id\":e -> \"Changelog.NewsItemComment\":\"field@item_id\":w\n  \"Changelog.NewsItem\":\"field@id\":e -> \"Changelog.NewsItemTopic\":\"field@item_id\":w\n  \"Changelog.NewsItem\":\"field@id\":e -> \"Changelog.NewsQueue\":\"field@item_id\":w [dir=none]\n  \"Changelog.NewsItem\":\"field@id\":e -> \"Changelog.Subscription\":\"field@item_id\":w\n  \"Changelog.NewsSource\":\"field@id\":e -> \"Changelog.NewsItem\":\"field@source_id\":w\n  \"Changelog.NewsSponsorship\":\"field@id\":e -> \"Changelog.NewsAd\":\"field@sponsorship_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.EpisodeGuest\":\"field@person_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.EpisodeHost\":\"field@person_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.EpisodeRequest\":\"field@submitter_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.Feed\":\"field@owner_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.NewsItemComment\":\"field@author_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.NewsItem\":\"field@author_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.NewsItem\":\"field@logger_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.NewsItem\":\"field@submitter_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.PodcastHost\":\"field@person_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.Post\":\"field@author_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.Post\":\"field@editor_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.SponsorRep\":\"field@person_id\":w\n  \"Changelog.Person\":\"field@id\":e -> \"Changelog.Subscription\":\"field@person_id\":w\n  \"Changelog.Person\":\"field@settings\":e -> \"Changelog.Person.Settings\":\"header@schema_module\":w [dir=none]\n  \"Changelog.Podcast\":\"field@id\":e -> \"Changelog.EpisodeRequest\":\"field@podcast_id\":w\n  \"Changelog.Podcast\":\"field@id\":e -> \"Changelog.EpisodeStat\":\"field@podcast_id\":w\n  \"Changelog.Podcast\":\"field@id\":e -> \"Changelog.Episode\":\"field@podcast_id\":w\n  \"Changelog.Podcast\":\"field@id\":e -> \"Changelog.PodcastHost\":\"field@podcast_id\":w\n  \"Changelog.Podcast\":\"field@id\":e -> \"Changelog.PodcastTopic\":\"field@podcast_id\":w\n  \"Changelog.Podcast\":\"field@id\":e -> \"Changelog.Subscription\":\"field@podcast_id\":w\n  \"Changelog.Post\":\"field@id\":e -> \"Changelog.PostTopic\":\"field@post_id\":w\n  \"Changelog.Sponsor\":\"field@id\":e -> \"Changelog.EpisodeSponsor\":\"field@sponsor_id\":w\n  \"Changelog.Sponsor\":\"field@id\":e -> \"Changelog.NewsSponsorship\":\"field@sponsor_id\":w\n  \"Changelog.Sponsor\":\"field@id\":e -> \"Changelog.SponsorRep\":\"field@sponsor_id\":w\n  \"Changelog.Topic\":\"field@id\":e -> \"Changelog.EpisodeTopic\":\"field@topic_id\":w\n  \"Changelog.Topic\":\"field@id\":e -> \"Changelog.NewsItemTopic\":\"field@topic_id\":w\n  \"Changelog.Topic\":\"field@id\":e -> \"Changelog.PodcastTopic\":\"field@topic_id\":w\n  \"Changelog.Topic\":\"field@id\":e -> \"Changelog.PostTopic\":\"field@topic_id\":w\n}\n"
  },
  {
    "path": "examples/dot/changelog.com/No-fields.dot",
    "content": "strict digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \"Changelog.Episode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Episode   </font></td></tr><tr><td><font point-size='14'><i>episodes</i></font></td></tr></table>>]\n  \"Changelog.EpisodeChapter\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeChapter   </font></td></tr></table>>]\n  \"Changelog.EpisodeGuest\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeGuest   </font></td></tr><tr><td><font point-size='14'><i>episode_guests</i></font></td></tr></table>>]\n  \"Changelog.EpisodeHost\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeHost   </font></td></tr><tr><td><font point-size='14'><i>episode_hosts</i></font></td></tr></table>>]\n  \"Changelog.EpisodeRequest\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeRequest   </font></td></tr><tr><td><font point-size='14'><i>episode_requests</i></font></td></tr></table>>]\n  \"Changelog.EpisodeSponsor\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeSponsor   </font></td></tr><tr><td><font point-size='14'><i>episode_sponsors</i></font></td></tr></table>>]\n  \"Changelog.EpisodeStat\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeStat   </font></td></tr><tr><td><font point-size='14'><i>episode_stats</i></font></td></tr></table>>]\n  \"Changelog.EpisodeTopic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.EpisodeTopic   </font></td></tr><tr><td><font point-size='14'><i>episode_topics</i></font></td></tr></table>>]\n  \"Changelog.Feed\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Feed   </font></td></tr><tr><td><font point-size='14'><i>feeds</i></font></td></tr></table>>]\n  \"Changelog.NewsAd\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsAd   </font></td></tr><tr><td><font point-size='14'><i>news_ads</i></font></td></tr></table>>]\n  \"Changelog.NewsIssue\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsIssue   </font></td></tr><tr><td><font point-size='14'><i>news_issues</i></font></td></tr></table>>]\n  \"Changelog.NewsIssueAd\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsIssueAd   </font></td></tr><tr><td><font point-size='14'><i>news_issue_ads</i></font></td></tr></table>>]\n  \"Changelog.NewsIssueItem\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsIssueItem   </font></td></tr><tr><td><font point-size='14'><i>news_issue_items</i></font></td></tr></table>>]\n  \"Changelog.NewsItem\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsItem   </font></td></tr><tr><td><font point-size='14'><i>news_items</i></font></td></tr></table>>]\n  \"Changelog.NewsItemComment\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsItemComment   </font></td></tr><tr><td><font point-size='14'><i>news_item_comments</i></font></td></tr></table>>]\n  \"Changelog.NewsItemTopic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsItemTopic   </font></td></tr><tr><td><font point-size='14'><i>news_item_topics</i></font></td></tr></table>>]\n  \"Changelog.NewsQueue\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsQueue   </font></td></tr><tr><td><font point-size='14'><i>news_queue</i></font></td></tr></table>>]\n  \"Changelog.NewsSource\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsSource   </font></td></tr><tr><td><font point-size='14'><i>news_sources</i></font></td></tr></table>>]\n  \"Changelog.NewsSponsorship\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.NewsSponsorship   </font></td></tr><tr><td><font point-size='14'><i>news_sponsorships</i></font></td></tr></table>>]\n  \"Changelog.Person\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Person   </font></td></tr><tr><td><font point-size='14'><i>people</i></font></td></tr></table>>]\n  \"Changelog.Person.Settings\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Person.Settings   </font></td></tr></table>>]\n  \"Changelog.Podcast\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Podcast   </font></td></tr><tr><td><font point-size='14'><i>podcasts</i></font></td></tr></table>>]\n  \"Changelog.PodcastHost\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.PodcastHost   </font></td></tr><tr><td><font point-size='14'><i>podcast_hosts</i></font></td></tr></table>>]\n  \"Changelog.PodcastTopic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.PodcastTopic   </font></td></tr><tr><td><font point-size='14'><i>podcast_topics</i></font></td></tr></table>>]\n  \"Changelog.Post\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Post   </font></td></tr><tr><td><font point-size='14'><i>posts</i></font></td></tr></table>>]\n  \"Changelog.PostTopic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.PostTopic   </font></td></tr><tr><td><font point-size='14'><i>post_topics</i></font></td></tr></table>>]\n  \"Changelog.Sponsor\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Sponsor   </font></td></tr><tr><td><font point-size='14'><i>sponsors</i></font></td></tr></table>>]\n  \"Changelog.SponsorRep\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.SponsorRep   </font></td></tr><tr><td><font point-size='14'><i>sponsor_reps</i></font></td></tr></table>>]\n  \"Changelog.Subscription\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Subscription   </font></td></tr><tr><td><font point-size='14'><i>subscriptions</i></font></td></tr></table>>]\n  \"Changelog.Topic\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Changelog.Topic   </font></td></tr><tr><td><font point-size='14'><i>topics</i></font></td></tr></table>>]\n  \"Ecto.Migration.SchemaMigration\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Ecto.Migration.SchemaMigration   </font></td></tr><tr><td><font point-size='14'><i>schema_migrations</i></font></td></tr></table>>]\n  \"Oban.Job\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Oban.Job   </font></td></tr><tr><td><font point-size='14'><i>oban_jobs</i></font></td></tr></table>>]\n\n  \"Changelog.EpisodeRequest\":e -> \"Changelog.Episode\":w [dir=none]\n  \"Changelog.Episode\":e -> \"Changelog.EpisodeChapter\":w\n  \"Changelog.Episode\":e -> \"Changelog.EpisodeGuest\":w\n  \"Changelog.Episode\":e -> \"Changelog.EpisodeHost\":w\n  \"Changelog.Episode\":e -> \"Changelog.EpisodeSponsor\":w\n  \"Changelog.Episode\":e -> \"Changelog.EpisodeStat\":w\n  \"Changelog.Episode\":e -> \"Changelog.EpisodeTopic\":w\n  \"Changelog.Episode\":e -> \"Changelog.Subscription\":w\n  \"Changelog.Episode\":e -> \"Changelog.EpisodeChapter\":w\n  \"Changelog.NewsAd\":e -> \"Changelog.NewsIssueAd\":w\n  \"Changelog.NewsIssue\":e -> \"Changelog.NewsIssueAd\":w\n  \"Changelog.NewsIssue\":e -> \"Changelog.NewsIssueItem\":w\n  \"Changelog.NewsItemComment\":e -> \"Changelog.NewsItemComment\":w\n  \"Changelog.NewsItem\":e -> \"Changelog.NewsIssueItem\":w\n  \"Changelog.NewsItem\":e -> \"Changelog.NewsItemComment\":w\n  \"Changelog.NewsItem\":e -> \"Changelog.NewsItemTopic\":w\n  \"Changelog.NewsItem\":e -> \"Changelog.NewsQueue\":w [dir=none]\n  \"Changelog.NewsItem\":e -> \"Changelog.Subscription\":w\n  \"Changelog.NewsSource\":e -> \"Changelog.NewsItem\":w\n  \"Changelog.NewsSponsorship\":e -> \"Changelog.NewsAd\":w\n  \"Changelog.Person\":e -> \"Changelog.EpisodeGuest\":w\n  \"Changelog.Person\":e -> \"Changelog.EpisodeHost\":w\n  \"Changelog.Person\":e -> \"Changelog.EpisodeRequest\":w\n  \"Changelog.Person\":e -> \"Changelog.Feed\":w\n  \"Changelog.Person\":e -> \"Changelog.NewsItemComment\":w\n  \"Changelog.Person\":e -> \"Changelog.NewsItem\":w\n  \"Changelog.Person\":e -> \"Changelog.NewsItem\":w\n  \"Changelog.Person\":e -> \"Changelog.NewsItem\":w\n  \"Changelog.Person\":e -> \"Changelog.PodcastHost\":w\n  \"Changelog.Person\":e -> \"Changelog.Post\":w\n  \"Changelog.Person\":e -> \"Changelog.Post\":w\n  \"Changelog.Person\":e -> \"Changelog.SponsorRep\":w\n  \"Changelog.Person\":e -> \"Changelog.Subscription\":w\n  \"Changelog.Person\":e -> \"Changelog.Person.Settings\":w [dir=none]\n  \"Changelog.Podcast\":e -> \"Changelog.EpisodeRequest\":w\n  \"Changelog.Podcast\":e -> \"Changelog.EpisodeStat\":w\n  \"Changelog.Podcast\":e -> \"Changelog.Episode\":w\n  \"Changelog.Podcast\":e -> \"Changelog.PodcastHost\":w\n  \"Changelog.Podcast\":e -> \"Changelog.PodcastTopic\":w\n  \"Changelog.Podcast\":e -> \"Changelog.Subscription\":w\n  \"Changelog.Post\":e -> \"Changelog.PostTopic\":w\n  \"Changelog.Sponsor\":e -> \"Changelog.EpisodeSponsor\":w\n  \"Changelog.Sponsor\":e -> \"Changelog.NewsSponsorship\":w\n  \"Changelog.Sponsor\":e -> \"Changelog.SponsorRep\":w\n  \"Changelog.Topic\":e -> \"Changelog.EpisodeTopic\":w\n  \"Changelog.Topic\":e -> \"Changelog.NewsItemTopic\":w\n  \"Changelog.Topic\":e -> \"Changelog.PodcastTopic\":w\n  \"Changelog.Topic\":e -> \"Changelog.PostTopic\":w\n}\n"
  },
  {
    "path": "examples/dot/hexpm/Contexts-as-clusters-no-fields.dot",
    "content": "strict digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \n  subgraph \"cluster_Ecto.Migration\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0f8ff\"\n    label = <<font point-size='24'><b>Ecto.Migration</b></font>>\n    \"Ecto.Migration.SchemaMigration\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Ecto.Migration.SchemaMigration   </font></td></tr><tr><td><font point-size='14'><i>schema_migrations</i></font></td></tr></table>>]\n  }\n  subgraph \"cluster_Hexpm.Accounts\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#8deeee\"\n    label = <<font point-size='24'><b>Hexpm.Accounts</b></font>>\n    \"Hexpm.Accounts.AuditLog\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.AuditLog   </font></td></tr><tr><td><font point-size='14'><i>audit_logs</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.Email\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Email   </font></td></tr><tr><td><font point-size='14'><i>emails</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.Key\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Key   </font></td></tr><tr><td><font point-size='14'><i>keys</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.Key.Use\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Key.Use   </font></td></tr></table>>]\n  \"Hexpm.Accounts.KeyPermission\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.KeyPermission   </font></td></tr></table>>]\n  \"Hexpm.Accounts.Organization\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Organization   </font></td></tr><tr><td><font point-size='14'><i>organizations</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.OrganizationUser\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.OrganizationUser   </font></td></tr><tr><td><font point-size='14'><i>organization_users</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.PasswordReset\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.PasswordReset   </font></td></tr><tr><td><font point-size='14'><i>password_resets</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.RecoveryCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.RecoveryCode   </font></td></tr></table>>]\n  \"Hexpm.Accounts.Session\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Session   </font></td></tr><tr><td><font point-size='14'><i>sessions</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.TFA\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.TFA   </font></td></tr></table>>]\n  \"Hexpm.Accounts.User\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.User   </font></td></tr><tr><td><font point-size='14'><i>users</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.UserHandles\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.UserHandles   </font></td></tr></table>>]\n  }\n  subgraph \"cluster_Hexpm.BlockAddress\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#fffafa\"\n    label = <<font point-size='24'><b>Hexpm.BlockAddress</b></font>>\n    \"Hexpm.BlockAddress.Entry\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.BlockAddress.Entry   </font></td></tr><tr><td><font point-size='14'><i>blocked_addresses</i></font></td></tr></table>>]\n  }\n  subgraph \"cluster_Hexpm.Repository\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#eedfcc\"\n    label = <<font point-size='24'><b>Hexpm.Repository</b></font>>\n    \"Hexpm.Repository.Download\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Download   </font></td></tr><tr><td><font point-size='14'><i>downloads</i></font></td></tr></table>>]\n  \"Hexpm.Repository.Install\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Install   </font></td></tr><tr><td><font point-size='14'><i>installs</i></font></td></tr></table>>]\n  \"Hexpm.Repository.Package\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Package   </font></td></tr><tr><td><font point-size='14'><i>packages</i></font></td></tr></table>>]\n  \"Hexpm.Repository.PackageDependant\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageDependant   </font></td></tr><tr><td><font point-size='14'><i>package_dependants</i></font></td></tr></table>>]\n  \"Hexpm.Repository.PackageDownload\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageDownload   </font></td></tr><tr><td><font point-size='14'><i>package_downloads</i></font></td></tr></table>>]\n  \"Hexpm.Repository.PackageMetadata\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageMetadata   </font></td></tr></table>>]\n  \"Hexpm.Repository.PackageOwner\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageOwner   </font></td></tr><tr><td><font point-size='14'><i>package_owners</i></font></td></tr></table>>]\n  \"Hexpm.Repository.PackageReport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageReport   </font></td></tr><tr><td><font point-size='14'><i>package_reports</i></font></td></tr></table>>]\n  \"Hexpm.Repository.PackageReportComment\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageReportComment   </font></td></tr><tr><td><font point-size='14'><i>package_report_comments</i></font></td></tr></table>>]\n  \"Hexpm.Repository.PackageReportRelease\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageReportRelease   </font></td></tr><tr><td><font point-size='14'><i>package_report_releases</i></font></td></tr></table>>]\n  \"Hexpm.Repository.Release\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Release   </font></td></tr><tr><td><font point-size='14'><i>releases</i></font></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseDownload\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseDownload   </font></td></tr><tr><td><font point-size='14'><i>release_downloads</i></font></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseMetadata\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseMetadata   </font></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseRetirement\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseRetirement   </font></td></tr></table>>]\n  \"Hexpm.Repository.Repository\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Repository   </font></td></tr><tr><td><font point-size='14'><i>repositories</i></font></td></tr></table>>]\n  \"Hexpm.Repository.Requirement\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Requirement   </font></td></tr><tr><td><font point-size='14'><i>requirements</i></font></td></tr></table>>]\n  }\n  subgraph \"cluster_Hexpm.ShortURLs\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#b4eeb4\"\n    label = <<font point-size='24'><b>Hexpm.ShortURLs</b></font>>\n    \"Hexpm.ShortURLs.ShortURL\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.ShortURLs.ShortURL   </font></td></tr><tr><td><font point-size='14'><i>short_urls</i></font></td></tr></table>>]\n  }\n\n  \"Hexpm.Accounts.TFA\":e -> \"Hexpm.Accounts.RecoveryCode\":w\n  \"Hexpm.Accounts.Key\":e -> \"Hexpm.Accounts.AuditLog\":w\n  \"Hexpm.Accounts.Key\":e -> \"Hexpm.Accounts.Key.Use\":w [dir=none]\n  \"Hexpm.Accounts.Key\":e -> \"Hexpm.Accounts.KeyPermission\":w\n  \"Hexpm.Accounts.Organization\":e -> \"Hexpm.Accounts.AuditLog\":w\n  \"Hexpm.Accounts.Organization\":e -> \"Hexpm.Accounts.Key\":w\n  \"Hexpm.Accounts.Organization\":e -> \"Hexpm.Accounts.OrganizationUser\":w\n  \"Hexpm.Accounts.Organization\":e -> \"Hexpm.Repository.Repository\":w [dir=none]\n  \"Hexpm.Accounts.Organization\":e -> \"Hexpm.Accounts.User\":w [dir=none]\n  \"Hexpm.Repository.PackageReport\":e -> \"Hexpm.Repository.PackageReportComment\":w\n  \"Hexpm.Repository.PackageReport\":e -> \"Hexpm.Repository.PackageReportRelease\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.Download\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.PackageDependant\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.PackageDownload\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.PackageOwner\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.PackageReport\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.ReleaseDownload\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.Release\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.Requirement\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.PackageMetadata\":w [dir=none]\n  \"Hexpm.Repository.Release\":e -> \"Hexpm.Repository.Download\":w\n  \"Hexpm.Repository.Release\":e -> \"Hexpm.Repository.PackageReportRelease\":w\n  \"Hexpm.Repository.Release\":e -> \"Hexpm.Repository.ReleaseDownload\":w [dir=none]\n  \"Hexpm.Repository.Release\":e -> \"Hexpm.Repository.Requirement\":w\n  \"Hexpm.Repository.Release\":e -> \"Hexpm.Repository.ReleaseMetadata\":w [dir=none]\n  \"Hexpm.Repository.Release\":e -> \"Hexpm.Repository.ReleaseRetirement\":w [dir=none]\n  \"Hexpm.Repository.Repository\":e -> \"Hexpm.Repository.Package\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.UserHandles\":w [dir=none]\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.AuditLog\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.Email\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.Key\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.OrganizationUser\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Repository.PackageOwner\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Repository.PackageReportComment\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Repository.PackageReport\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.PasswordReset\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Repository.Release\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.TFA\":w [dir=none]\n}\n"
  },
  {
    "path": "examples/dot/hexpm/Contexts-as-clusters.dot",
    "content": "digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \n  subgraph \"cluster_Ecto.Migration\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0f8ff\"\n    label = <<font point-size='24'><b>Ecto.Migration</b></font>>\n    \"Ecto.Migration.SchemaMigration\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Ecto.Migration.SchemaMigration   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>schema_migrations</i></font></td></tr><tr><td align='left' port='field@version'>:version         <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Hexpm.Accounts\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#8deeee\"\n    label = <<font point-size='24'><b>Hexpm.Accounts</b></font>>\n    \"Hexpm.Accounts.AuditLog\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.AuditLog   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>audit_logs</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@user_agent'>:user_agent          <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@remote_ip'>:remote_ip           <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@action'>:action              <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@params'>:params              <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id             <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@key_id'>:key_id              <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Email\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Email   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>emails</i></font></td></tr><tr><td align='left' port='field@id'>:id                      <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@email'>:email                   <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@verified'>:verified                <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@primary'>:primary                 <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@public'>:public                  <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@gravatar'>:gravatar                <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@verification_key'>:verification_key        <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@verification_expiry'>:verification_expiry     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                 <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at             <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at              <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Key\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Key   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>keys</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                                                      </font></i></td></tr><tr><td align='left' port='field@name'>:name                <i><font color='gray54'>:string                                                  </font></i></td></tr><tr><td align='left' port='field@secret_first'>:secret_first        <i><font color='gray54'>:string                                                  </font></i></td></tr><tr><td align='left' port='field@secret_second'>:secret_second       <i><font color='gray54'>:string                                                  </font></i></td></tr><tr><td align='left' port='field@public'>:public              <i><font color='gray54'>:boolean                                                 </font></i></td></tr><tr><td align='left' port='field@revoke_at'>:revoke_at           <i><font color='gray54'>:utc_datetime_usec                                       </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec                                       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec                                       </font></i></td></tr><tr><td align='left' port='field@last_use'>:last_use            <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Accounts.Key.Use]&gt;            </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id             <i><font color='gray54'>:id                                                      </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                                                      </font></i></td></tr><tr><td align='left' port='field@permissions'>:permissions         <i><font color='gray54'>#Ecto.Embedded&lt;[many: Hexpm.Accounts.KeyPermission]&gt;     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Key.Use\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Key.Use   </font></td></tr><tr><td align='left' port='field@id'>:id             <i><font color='gray54'>:binary_id             </font></i></td></tr><tr><td align='left' port='field@used_at'>:used_at        <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@user_agent'>:user_agent     <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@ip'>:ip             <i><font color='gray54'>:string                </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.KeyPermission\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.KeyPermission   </font></td></tr><tr><td align='left' port='field@id'>:id           <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@domain'>:domain       <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@resource'>:resource     <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Organization\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Organization   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>organizations</i></font></td></tr><tr><td align='left' port='field@id'>:id                   <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@name'>:name                 <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@billing_active'>:billing_active       <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@billing_override'>:billing_override     <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@trial_end'>:trial_end            <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at          <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at           <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.OrganizationUser\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.OrganizationUser   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>organization_users</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@role'>:role                <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id             <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.PasswordReset\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.PasswordReset   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>password_resets</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@key'>:key               <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@primary_email'>:primary_email     <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id           <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.RecoveryCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.RecoveryCode   </font></td></tr><tr><td align='left' port='field@id'>:id          <i><font color='gray54'>:binary_id             </font></i></td></tr><tr><td align='left' port='field@code'>:code        <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@used_at'>:used_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Session\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Session   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>sessions</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@token'>:token           <i><font color='gray54'>:binary                </font></i></td></tr><tr><td align='left' port='field@data'>:data            <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.TFA\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.TFA   </font></td></tr><tr><td align='left' port='field@secret'>:secret             <i><font color='gray54'>:string                                                 </font></i></td></tr><tr><td align='left' port='field@tfa_enabled'>:tfa_enabled        <i><font color='gray54'>:boolean                                                </font></i></td></tr><tr><td align='left' port='field@app_enabled'>:app_enabled        <i><font color='gray54'>:boolean                                                </font></i></td></tr><tr><td align='left' port='field@recovery_codes'>:recovery_codes     <i><font color='gray54'>#Ecto.Embedded&lt;[many: Hexpm.Accounts.RecoveryCode]&gt;     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.User\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.User   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>users</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                                                   </font></i></td></tr><tr><td align='left' port='field@username'>:username            <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@full_name'>:full_name           <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@password'>:password            <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@service'>:service             <i><font color='gray54'>:boolean                                              </font></i></td></tr><tr><td align='left' port='field@deactivated_at'>:deactivated_at      <i><font color='gray54'>:utc_datetime_usec                                    </font></i></td></tr><tr><td align='left' port='field@role'>:role                <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec                                    </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec                                    </font></i></td></tr><tr><td align='left' port='field@handles'>:handles             <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Accounts.UserHandles]&gt;     </font></i></td></tr><tr><td align='left' port='field@tfa'>:tfa                 <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Accounts.TFA]&gt;             </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                                                   </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.UserHandles\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.UserHandles   </font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@twitter'>:twitter         <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@github'>:github          <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@elixirforum'>:elixirforum     <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@freenode'>:freenode        <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@slack'>:slack           <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Hexpm.BlockAddress\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#fffafa\"\n    label = <<font point-size='24'><b>Hexpm.BlockAddress</b></font>>\n    \"Hexpm.BlockAddress.Entry\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.BlockAddress.Entry   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>blocked_addresses</i></font></td></tr><tr><td align='left' port='field@id'>:id          <i><font color='gray54'>:id         </font></i></td></tr><tr><td align='left' port='field@ip'>:ip          <i><font color='gray54'>:string     </font></i></td></tr><tr><td align='left' port='field@comment'>:comment     <i><font color='gray54'>:string     </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Hexpm.Repository\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#eedfcc\"\n    label = <<font point-size='24'><b>Hexpm.Repository</b></font>>\n    \"Hexpm.Repository.Download\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Download   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>downloads</i></font></td></tr><tr><td align='left' port='field@id'>:id             <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@package_id'>:package_id     <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@release_id'>:release_id     <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@downloads'>:downloads      <i><font color='gray54'>:integer     </font></i></td></tr><tr><td align='left' port='field@day'>:day            <i><font color='gray54'>:date        </font></i></td></tr></table>>]\n  \"Hexpm.Repository.Install\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Install   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>installs</i></font></td></tr><tr><td align='left' port='field@id'>:id          <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@hex'>:hex         <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@elixirs'>:elixirs     <i><font color='gray54'>{:array, :string}     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.Package\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Package   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>packages</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                                                         </font></i></td></tr><tr><td align='left' port='field@name'>:name                <i><font color='gray54'>:string                                                     </font></i></td></tr><tr><td align='left' port='field@docs_updated_at'>:docs_updated_at     <i><font color='gray54'>:utc_datetime_usec                                          </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec                                          </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec                                          </font></i></td></tr><tr><td align='left' port='field@repository_id'>:repository_id       <i><font color='gray54'>:id                                                         </font></i></td></tr><tr><td align='left' port='field@meta'>:meta                <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Repository.PackageMetadata]&gt;     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageDependant\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageDependant   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>package_dependants</i></font></td></tr><tr><td align='left' port='field@id'>:id             <i><font color='gray54'>:id         </font></i></td></tr><tr><td align='left' port='field@package_id'>:package_id     <i><font color='gray54'>:id         </font></i></td></tr><tr><td align='left' port='field@name'>:name           <i><font color='gray54'>:string     </font></i></td></tr><tr><td align='left' port='field@repo'>:repo           <i><font color='gray54'>:string     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageDownload\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageDownload   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>package_downloads</i></font></td></tr><tr><td align='left' port='field@package_id'>:package_id     <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@view'>:view           <i><font color='gray54'>:string      </font></i></td></tr><tr><td align='left' port='field@downloads'>:downloads      <i><font color='gray54'>:integer     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageMetadata\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageMetadata   </font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id            </font></i></td></tr><tr><td align='left' port='field@description'>:description     <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@licenses'>:licenses        <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@links'>:links           <i><font color='gray54'>{:map, :string}       </font></i></td></tr><tr><td align='left' port='field@maintainers'>:maintainers     <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@extra'>:extra           <i><font color='gray54'>:map                  </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageOwner\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageOwner   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>package_owners</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@level'>:level           <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@package_id'>:package_id      <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id         <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageReport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageReport   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>package_reports</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@state'>:state           <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@description'>:description     <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@author_id'>:author_id       <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@package_id'>:package_id      <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageReportComment\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageReportComment   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>package_report_comments</i></font></td></tr><tr><td align='left' port='field@id'>:id                    <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@text'>:text                  <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at           <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at            <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@package_report_id'>:package_report_id     <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@author_id'>:author_id             <i><font color='gray54'>:id                    </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageReportRelease\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageReportRelease   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>package_report_releases</i></font></td></tr><tr><td align='left' port='field@id'>:id                    <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@release_id'>:release_id            <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@package_report_id'>:package_report_id     <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at           <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at            <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.Release\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Release   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>releases</i></font></td></tr><tr><td align='left' port='field@id'>:id                 <i><font color='gray54'>:id                                                           </font></i></td></tr><tr><td align='left' port='field@version'>:version            <i><font color='gray54'>Hexpm.Version                                                 </font></i></td></tr><tr><td align='left' port='field@inner_checksum'>:inner_checksum     <i><font color='gray54'>:binary                                                       </font></i></td></tr><tr><td align='left' port='field@outer_checksum'>:outer_checksum     <i><font color='gray54'>:binary                                                       </font></i></td></tr><tr><td align='left' port='field@has_docs'>:has_docs           <i><font color='gray54'>:boolean                                                      </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at        <i><font color='gray54'>:utc_datetime_usec                                            </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at         <i><font color='gray54'>:utc_datetime_usec                                            </font></i></td></tr><tr><td align='left' port='field@package_id'>:package_id         <i><font color='gray54'>:id                                                           </font></i></td></tr><tr><td align='left' port='field@publisher_id'>:publisher_id       <i><font color='gray54'>:id                                                           </font></i></td></tr><tr><td align='left' port='field@meta'>:meta               <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Repository.ReleaseMetadata]&gt;       </font></i></td></tr><tr><td align='left' port='field@retirement'>:retirement         <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Repository.ReleaseRetirement]&gt;     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseDownload\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseDownload   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>release_downloads</i></font></td></tr><tr><td align='left' port='field@package_id'>:package_id     <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@release_id'>:release_id     <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@downloads'>:downloads      <i><font color='gray54'>:integer     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseMetadata\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseMetadata   </font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id            </font></i></td></tr><tr><td align='left' port='field@app'>:app             <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@build_tools'>:build_tools     <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@elixir'>:elixir          <i><font color='gray54'>:string               </font></i></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseRetirement\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseRetirement   </font></td></tr><tr><td align='left' port='field@id'>:id          <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@reason'>:reason      <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@message'>:message     <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  \"Hexpm.Repository.Repository\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Repository   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>repositories</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@name'>:name                <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                    </font></i></td></tr></table>>]\n  \"Hexpm.Repository.Requirement\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Requirement   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>requirements</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@app'>:app               <i><font color='gray54'>:string      </font></i></td></tr><tr><td align='left' port='field@requirement'>:requirement       <i><font color='gray54'>:string      </font></i></td></tr><tr><td align='left' port='field@optional'>:optional          <i><font color='gray54'>:boolean     </font></i></td></tr><tr><td align='left' port='field@release_id'>:release_id        <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@dependency_id'>:dependency_id     <i><font color='gray54'>:id          </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Hexpm.ShortURLs\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#b4eeb4\"\n    label = <<font point-size='24'><b>Hexpm.ShortURLs</b></font>>\n    \"Hexpm.ShortURLs.ShortURL\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.ShortURLs.ShortURL   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>short_urls</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@url'>:url             <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@short_code'>:short_code      <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  }\n\n  \"Hexpm.Accounts.TFA\":\"field@recovery_codes\":e -> \"Hexpm.Accounts.RecoveryCode\":\"header@schema_module\":w\n  \"Hexpm.Accounts.Key\":\"field@id\":e -> \"Hexpm.Accounts.AuditLog\":\"field@key_id\":w\n  \"Hexpm.Accounts.Key\":\"field@last_use\":e -> \"Hexpm.Accounts.Key.Use\":\"header@schema_module\":w [dir=none]\n  \"Hexpm.Accounts.Key\":\"field@permissions\":e -> \"Hexpm.Accounts.KeyPermission\":\"header@schema_module\":w\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Accounts.AuditLog\":\"field@organization_id\":w\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Accounts.Key\":\"field@organization_id\":w\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Accounts.OrganizationUser\":\"field@organization_id\":w\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Repository.Repository\":\"field@organization_id\":w [dir=none]\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Accounts.User\":\"field@organization_id\":w [dir=none]\n  \"Hexpm.Repository.PackageReport\":\"field@id\":e -> \"Hexpm.Repository.PackageReportComment\":\"field@package_report_id\":w\n  \"Hexpm.Repository.PackageReport\":\"field@id\":e -> \"Hexpm.Repository.PackageReportRelease\":\"field@package_report_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.Download\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.PackageDependant\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.PackageDownload\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.PackageOwner\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.PackageReport\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.ReleaseDownload\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.Release\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.Requirement\":\"field@dependency_id\":w\n  \"Hexpm.Repository.Package\":\"field@meta\":e -> \"Hexpm.Repository.PackageMetadata\":\"header@schema_module\":w [dir=none]\n  \"Hexpm.Repository.Release\":\"field@id\":e -> \"Hexpm.Repository.Download\":\"field@release_id\":w\n  \"Hexpm.Repository.Release\":\"field@id\":e -> \"Hexpm.Repository.PackageReportRelease\":\"field@release_id\":w\n  \"Hexpm.Repository.Release\":\"field@id\":e -> \"Hexpm.Repository.ReleaseDownload\":\"field@release_id\":w [dir=none]\n  \"Hexpm.Repository.Release\":\"field@id\":e -> \"Hexpm.Repository.Requirement\":\"field@release_id\":w\n  \"Hexpm.Repository.Release\":\"field@meta\":e -> \"Hexpm.Repository.ReleaseMetadata\":\"header@schema_module\":w [dir=none]\n  \"Hexpm.Repository.Release\":\"field@retirement\":e -> \"Hexpm.Repository.ReleaseRetirement\":\"header@schema_module\":w [dir=none]\n  \"Hexpm.Repository.Repository\":\"field@id\":e -> \"Hexpm.Repository.Package\":\"field@repository_id\":w\n  \"Hexpm.Accounts.User\":\"field@handles\":e -> \"Hexpm.Accounts.UserHandles\":\"header@schema_module\":w [dir=none]\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.AuditLog\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.Email\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.Key\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.OrganizationUser\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Repository.PackageOwner\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Repository.PackageReportComment\":\"field@author_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Repository.PackageReport\":\"field@author_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.PasswordReset\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Repository.Release\":\"field@publisher_id\":w\n  \"Hexpm.Accounts.User\":\"field@tfa\":e -> \"Hexpm.Accounts.TFA\":\"header@schema_module\":w [dir=none]\n}\n"
  },
  {
    "path": "examples/dot/hexpm/Default.dot",
    "content": "digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \"Ecto.Migration.SchemaMigration\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Ecto.Migration.SchemaMigration   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>schema_migrations</i></font></td></tr><tr><td align='left' port='field@version'>:version         <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.AuditLog\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.AuditLog   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>audit_logs</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@user_agent'>:user_agent          <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@remote_ip'>:remote_ip           <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@action'>:action              <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@params'>:params              <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id             <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@key_id'>:key_id              <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Email\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Email   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>emails</i></font></td></tr><tr><td align='left' port='field@id'>:id                      <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@email'>:email                   <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@verified'>:verified                <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@primary'>:primary                 <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@public'>:public                  <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@gravatar'>:gravatar                <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@verification_key'>:verification_key        <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@verification_expiry'>:verification_expiry     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                 <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at             <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at              <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Key\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Key   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>keys</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                                                      </font></i></td></tr><tr><td align='left' port='field@name'>:name                <i><font color='gray54'>:string                                                  </font></i></td></tr><tr><td align='left' port='field@secret_first'>:secret_first        <i><font color='gray54'>:string                                                  </font></i></td></tr><tr><td align='left' port='field@secret_second'>:secret_second       <i><font color='gray54'>:string                                                  </font></i></td></tr><tr><td align='left' port='field@public'>:public              <i><font color='gray54'>:boolean                                                 </font></i></td></tr><tr><td align='left' port='field@revoke_at'>:revoke_at           <i><font color='gray54'>:utc_datetime_usec                                       </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec                                       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec                                       </font></i></td></tr><tr><td align='left' port='field@last_use'>:last_use            <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Accounts.Key.Use]&gt;            </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id             <i><font color='gray54'>:id                                                      </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                                                      </font></i></td></tr><tr><td align='left' port='field@permissions'>:permissions         <i><font color='gray54'>#Ecto.Embedded&lt;[many: Hexpm.Accounts.KeyPermission]&gt;     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Key.Use\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Key.Use   </font></td></tr><tr><td align='left' port='field@id'>:id             <i><font color='gray54'>:binary_id             </font></i></td></tr><tr><td align='left' port='field@used_at'>:used_at        <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@user_agent'>:user_agent     <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@ip'>:ip             <i><font color='gray54'>:string                </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.KeyPermission\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.KeyPermission   </font></td></tr><tr><td align='left' port='field@id'>:id           <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@domain'>:domain       <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@resource'>:resource     <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Organization\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Organization   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>organizations</i></font></td></tr><tr><td align='left' port='field@id'>:id                   <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@name'>:name                 <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@billing_active'>:billing_active       <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@billing_override'>:billing_override     <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@trial_end'>:trial_end            <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at          <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at           <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.OrganizationUser\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.OrganizationUser   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>organization_users</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@role'>:role                <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id             <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.PasswordReset\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.PasswordReset   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>password_resets</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@key'>:key               <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@primary_email'>:primary_email     <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id           <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.RecoveryCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.RecoveryCode   </font></td></tr><tr><td align='left' port='field@id'>:id          <i><font color='gray54'>:binary_id             </font></i></td></tr><tr><td align='left' port='field@code'>:code        <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@used_at'>:used_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Session\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Session   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>sessions</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@token'>:token           <i><font color='gray54'>:binary                </font></i></td></tr><tr><td align='left' port='field@data'>:data            <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.TFA\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.TFA   </font></td></tr><tr><td align='left' port='field@secret'>:secret             <i><font color='gray54'>:string                                                 </font></i></td></tr><tr><td align='left' port='field@tfa_enabled'>:tfa_enabled        <i><font color='gray54'>:boolean                                                </font></i></td></tr><tr><td align='left' port='field@app_enabled'>:app_enabled        <i><font color='gray54'>:boolean                                                </font></i></td></tr><tr><td align='left' port='field@recovery_codes'>:recovery_codes     <i><font color='gray54'>#Ecto.Embedded&lt;[many: Hexpm.Accounts.RecoveryCode]&gt;     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.User\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.User   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>users</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                                                   </font></i></td></tr><tr><td align='left' port='field@username'>:username            <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@full_name'>:full_name           <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@password'>:password            <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@service'>:service             <i><font color='gray54'>:boolean                                              </font></i></td></tr><tr><td align='left' port='field@deactivated_at'>:deactivated_at      <i><font color='gray54'>:utc_datetime_usec                                    </font></i></td></tr><tr><td align='left' port='field@role'>:role                <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec                                    </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec                                    </font></i></td></tr><tr><td align='left' port='field@handles'>:handles             <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Accounts.UserHandles]&gt;     </font></i></td></tr><tr><td align='left' port='field@tfa'>:tfa                 <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Accounts.TFA]&gt;             </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                                                   </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.UserHandles\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.UserHandles   </font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@twitter'>:twitter         <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@github'>:github          <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@elixirforum'>:elixirforum     <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@freenode'>:freenode        <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@slack'>:slack           <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  \"Hexpm.BlockAddress.Entry\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.BlockAddress.Entry   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>blocked_addresses</i></font></td></tr><tr><td align='left' port='field@id'>:id          <i><font color='gray54'>:id         </font></i></td></tr><tr><td align='left' port='field@ip'>:ip          <i><font color='gray54'>:string     </font></i></td></tr><tr><td align='left' port='field@comment'>:comment     <i><font color='gray54'>:string     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.Download\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Download   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>downloads</i></font></td></tr><tr><td align='left' port='field@id'>:id             <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@package_id'>:package_id     <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@release_id'>:release_id     <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@downloads'>:downloads      <i><font color='gray54'>:integer     </font></i></td></tr><tr><td align='left' port='field@day'>:day            <i><font color='gray54'>:date        </font></i></td></tr></table>>]\n  \"Hexpm.Repository.Install\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Install   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>installs</i></font></td></tr><tr><td align='left' port='field@id'>:id          <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@hex'>:hex         <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@elixirs'>:elixirs     <i><font color='gray54'>{:array, :string}     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.Package\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Package   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>packages</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                                                         </font></i></td></tr><tr><td align='left' port='field@name'>:name                <i><font color='gray54'>:string                                                     </font></i></td></tr><tr><td align='left' port='field@docs_updated_at'>:docs_updated_at     <i><font color='gray54'>:utc_datetime_usec                                          </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec                                          </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec                                          </font></i></td></tr><tr><td align='left' port='field@repository_id'>:repository_id       <i><font color='gray54'>:id                                                         </font></i></td></tr><tr><td align='left' port='field@meta'>:meta                <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Repository.PackageMetadata]&gt;     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageDependant\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageDependant   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>package_dependants</i></font></td></tr><tr><td align='left' port='field@id'>:id             <i><font color='gray54'>:id         </font></i></td></tr><tr><td align='left' port='field@package_id'>:package_id     <i><font color='gray54'>:id         </font></i></td></tr><tr><td align='left' port='field@name'>:name           <i><font color='gray54'>:string     </font></i></td></tr><tr><td align='left' port='field@repo'>:repo           <i><font color='gray54'>:string     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageDownload\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageDownload   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>package_downloads</i></font></td></tr><tr><td align='left' port='field@package_id'>:package_id     <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@view'>:view           <i><font color='gray54'>:string      </font></i></td></tr><tr><td align='left' port='field@downloads'>:downloads      <i><font color='gray54'>:integer     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageMetadata\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageMetadata   </font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id            </font></i></td></tr><tr><td align='left' port='field@description'>:description     <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@licenses'>:licenses        <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@links'>:links           <i><font color='gray54'>{:map, :string}       </font></i></td></tr><tr><td align='left' port='field@maintainers'>:maintainers     <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@extra'>:extra           <i><font color='gray54'>:map                  </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageOwner\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageOwner   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>package_owners</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@level'>:level           <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@package_id'>:package_id      <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id         <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageReport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageReport   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>package_reports</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@state'>:state           <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@description'>:description     <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@author_id'>:author_id       <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@package_id'>:package_id      <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageReportComment\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageReportComment   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>package_report_comments</i></font></td></tr><tr><td align='left' port='field@id'>:id                    <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@text'>:text                  <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at           <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at            <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@package_report_id'>:package_report_id     <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@author_id'>:author_id             <i><font color='gray54'>:id                    </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageReportRelease\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageReportRelease   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>package_report_releases</i></font></td></tr><tr><td align='left' port='field@id'>:id                    <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@release_id'>:release_id            <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@package_report_id'>:package_report_id     <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at           <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at            <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.Release\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Release   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>releases</i></font></td></tr><tr><td align='left' port='field@id'>:id                 <i><font color='gray54'>:id                                                           </font></i></td></tr><tr><td align='left' port='field@version'>:version            <i><font color='gray54'>Hexpm.Version                                                 </font></i></td></tr><tr><td align='left' port='field@inner_checksum'>:inner_checksum     <i><font color='gray54'>:binary                                                       </font></i></td></tr><tr><td align='left' port='field@outer_checksum'>:outer_checksum     <i><font color='gray54'>:binary                                                       </font></i></td></tr><tr><td align='left' port='field@has_docs'>:has_docs           <i><font color='gray54'>:boolean                                                      </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at        <i><font color='gray54'>:utc_datetime_usec                                            </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at         <i><font color='gray54'>:utc_datetime_usec                                            </font></i></td></tr><tr><td align='left' port='field@package_id'>:package_id         <i><font color='gray54'>:id                                                           </font></i></td></tr><tr><td align='left' port='field@publisher_id'>:publisher_id       <i><font color='gray54'>:id                                                           </font></i></td></tr><tr><td align='left' port='field@meta'>:meta               <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Repository.ReleaseMetadata]&gt;       </font></i></td></tr><tr><td align='left' port='field@retirement'>:retirement         <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Repository.ReleaseRetirement]&gt;     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseDownload\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseDownload   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>release_downloads</i></font></td></tr><tr><td align='left' port='field@package_id'>:package_id     <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@release_id'>:release_id     <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@downloads'>:downloads      <i><font color='gray54'>:integer     </font></i></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseMetadata\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseMetadata   </font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id            </font></i></td></tr><tr><td align='left' port='field@app'>:app             <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@build_tools'>:build_tools     <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@elixir'>:elixir          <i><font color='gray54'>:string               </font></i></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseRetirement\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseRetirement   </font></td></tr><tr><td align='left' port='field@id'>:id          <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@reason'>:reason      <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@message'>:message     <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  \"Hexpm.Repository.Repository\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Repository   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>repositories</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@name'>:name                <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                    </font></i></td></tr></table>>]\n  \"Hexpm.Repository.Requirement\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Requirement   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>requirements</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@app'>:app               <i><font color='gray54'>:string      </font></i></td></tr><tr><td align='left' port='field@requirement'>:requirement       <i><font color='gray54'>:string      </font></i></td></tr><tr><td align='left' port='field@optional'>:optional          <i><font color='gray54'>:boolean     </font></i></td></tr><tr><td align='left' port='field@release_id'>:release_id        <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@dependency_id'>:dependency_id     <i><font color='gray54'>:id          </font></i></td></tr></table>>]\n  \"Hexpm.ShortURLs.ShortURL\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.ShortURLs.ShortURL   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>short_urls</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@url'>:url             <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@short_code'>:short_code      <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n\n  \"Hexpm.Accounts.TFA\":\"field@recovery_codes\":e -> \"Hexpm.Accounts.RecoveryCode\":\"header@schema_module\":w\n  \"Hexpm.Accounts.Key\":\"field@id\":e -> \"Hexpm.Accounts.AuditLog\":\"field@key_id\":w\n  \"Hexpm.Accounts.Key\":\"field@last_use\":e -> \"Hexpm.Accounts.Key.Use\":\"header@schema_module\":w [dir=none]\n  \"Hexpm.Accounts.Key\":\"field@permissions\":e -> \"Hexpm.Accounts.KeyPermission\":\"header@schema_module\":w\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Accounts.AuditLog\":\"field@organization_id\":w\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Accounts.Key\":\"field@organization_id\":w\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Accounts.OrganizationUser\":\"field@organization_id\":w\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Repository.Repository\":\"field@organization_id\":w [dir=none]\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Accounts.User\":\"field@organization_id\":w [dir=none]\n  \"Hexpm.Repository.PackageReport\":\"field@id\":e -> \"Hexpm.Repository.PackageReportComment\":\"field@package_report_id\":w\n  \"Hexpm.Repository.PackageReport\":\"field@id\":e -> \"Hexpm.Repository.PackageReportRelease\":\"field@package_report_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.Download\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.PackageDependant\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.PackageDownload\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.PackageOwner\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.PackageReport\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.ReleaseDownload\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.Release\":\"field@package_id\":w\n  \"Hexpm.Repository.Package\":\"field@id\":e -> \"Hexpm.Repository.Requirement\":\"field@dependency_id\":w\n  \"Hexpm.Repository.Package\":\"field@meta\":e -> \"Hexpm.Repository.PackageMetadata\":\"header@schema_module\":w [dir=none]\n  \"Hexpm.Repository.Release\":\"field@id\":e -> \"Hexpm.Repository.Download\":\"field@release_id\":w\n  \"Hexpm.Repository.Release\":\"field@id\":e -> \"Hexpm.Repository.PackageReportRelease\":\"field@release_id\":w\n  \"Hexpm.Repository.Release\":\"field@id\":e -> \"Hexpm.Repository.ReleaseDownload\":\"field@release_id\":w [dir=none]\n  \"Hexpm.Repository.Release\":\"field@id\":e -> \"Hexpm.Repository.Requirement\":\"field@release_id\":w\n  \"Hexpm.Repository.Release\":\"field@meta\":e -> \"Hexpm.Repository.ReleaseMetadata\":\"header@schema_module\":w [dir=none]\n  \"Hexpm.Repository.Release\":\"field@retirement\":e -> \"Hexpm.Repository.ReleaseRetirement\":\"header@schema_module\":w [dir=none]\n  \"Hexpm.Repository.Repository\":\"field@id\":e -> \"Hexpm.Repository.Package\":\"field@repository_id\":w\n  \"Hexpm.Accounts.User\":\"field@handles\":e -> \"Hexpm.Accounts.UserHandles\":\"header@schema_module\":w [dir=none]\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.AuditLog\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.Email\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.Key\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.OrganizationUser\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Repository.PackageOwner\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Repository.PackageReportComment\":\"field@author_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Repository.PackageReport\":\"field@author_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.PasswordReset\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Repository.Release\":\"field@publisher_id\":w\n  \"Hexpm.Accounts.User\":\"field@tfa\":e -> \"Hexpm.Accounts.TFA\":\"header@schema_module\":w [dir=none]\n}\n"
  },
  {
    "path": "examples/dot/hexpm/No-fields.dot",
    "content": "strict digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \"Ecto.Migration.SchemaMigration\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Ecto.Migration.SchemaMigration   </font></td></tr><tr><td><font point-size='14'><i>schema_migrations</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.AuditLog\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.AuditLog   </font></td></tr><tr><td><font point-size='14'><i>audit_logs</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.Email\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Email   </font></td></tr><tr><td><font point-size='14'><i>emails</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.Key\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Key   </font></td></tr><tr><td><font point-size='14'><i>keys</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.Key.Use\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Key.Use   </font></td></tr></table>>]\n  \"Hexpm.Accounts.KeyPermission\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.KeyPermission   </font></td></tr></table>>]\n  \"Hexpm.Accounts.Organization\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Organization   </font></td></tr><tr><td><font point-size='14'><i>organizations</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.OrganizationUser\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.OrganizationUser   </font></td></tr><tr><td><font point-size='14'><i>organization_users</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.PasswordReset\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.PasswordReset   </font></td></tr><tr><td><font point-size='14'><i>password_resets</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.RecoveryCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.RecoveryCode   </font></td></tr></table>>]\n  \"Hexpm.Accounts.Session\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Session   </font></td></tr><tr><td><font point-size='14'><i>sessions</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.TFA\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.TFA   </font></td></tr></table>>]\n  \"Hexpm.Accounts.User\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.User   </font></td></tr><tr><td><font point-size='14'><i>users</i></font></td></tr></table>>]\n  \"Hexpm.Accounts.UserHandles\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.UserHandles   </font></td></tr></table>>]\n  \"Hexpm.BlockAddress.Entry\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.BlockAddress.Entry   </font></td></tr><tr><td><font point-size='14'><i>blocked_addresses</i></font></td></tr></table>>]\n  \"Hexpm.Repository.Download\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Download   </font></td></tr><tr><td><font point-size='14'><i>downloads</i></font></td></tr></table>>]\n  \"Hexpm.Repository.Install\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Install   </font></td></tr><tr><td><font point-size='14'><i>installs</i></font></td></tr></table>>]\n  \"Hexpm.Repository.Package\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Package   </font></td></tr><tr><td><font point-size='14'><i>packages</i></font></td></tr></table>>]\n  \"Hexpm.Repository.PackageDependant\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageDependant   </font></td></tr><tr><td><font point-size='14'><i>package_dependants</i></font></td></tr></table>>]\n  \"Hexpm.Repository.PackageDownload\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageDownload   </font></td></tr><tr><td><font point-size='14'><i>package_downloads</i></font></td></tr></table>>]\n  \"Hexpm.Repository.PackageMetadata\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageMetadata   </font></td></tr></table>>]\n  \"Hexpm.Repository.PackageOwner\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageOwner   </font></td></tr><tr><td><font point-size='14'><i>package_owners</i></font></td></tr></table>>]\n  \"Hexpm.Repository.PackageReport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageReport   </font></td></tr><tr><td><font point-size='14'><i>package_reports</i></font></td></tr></table>>]\n  \"Hexpm.Repository.PackageReportComment\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageReportComment   </font></td></tr><tr><td><font point-size='14'><i>package_report_comments</i></font></td></tr></table>>]\n  \"Hexpm.Repository.PackageReportRelease\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageReportRelease   </font></td></tr><tr><td><font point-size='14'><i>package_report_releases</i></font></td></tr></table>>]\n  \"Hexpm.Repository.Release\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Release   </font></td></tr><tr><td><font point-size='14'><i>releases</i></font></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseDownload\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseDownload   </font></td></tr><tr><td><font point-size='14'><i>release_downloads</i></font></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseMetadata\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseMetadata   </font></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseRetirement\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseRetirement   </font></td></tr></table>>]\n  \"Hexpm.Repository.Repository\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Repository   </font></td></tr><tr><td><font point-size='14'><i>repositories</i></font></td></tr></table>>]\n  \"Hexpm.Repository.Requirement\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Repository.Requirement   </font></td></tr><tr><td><font point-size='14'><i>requirements</i></font></td></tr></table>>]\n  \"Hexpm.ShortURLs.ShortURL\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.ShortURLs.ShortURL   </font></td></tr><tr><td><font point-size='14'><i>short_urls</i></font></td></tr></table>>]\n\n  \"Hexpm.Accounts.TFA\":e -> \"Hexpm.Accounts.RecoveryCode\":w\n  \"Hexpm.Accounts.Key\":e -> \"Hexpm.Accounts.AuditLog\":w\n  \"Hexpm.Accounts.Key\":e -> \"Hexpm.Accounts.Key.Use\":w [dir=none]\n  \"Hexpm.Accounts.Key\":e -> \"Hexpm.Accounts.KeyPermission\":w\n  \"Hexpm.Accounts.Organization\":e -> \"Hexpm.Accounts.AuditLog\":w\n  \"Hexpm.Accounts.Organization\":e -> \"Hexpm.Accounts.Key\":w\n  \"Hexpm.Accounts.Organization\":e -> \"Hexpm.Accounts.OrganizationUser\":w\n  \"Hexpm.Accounts.Organization\":e -> \"Hexpm.Repository.Repository\":w [dir=none]\n  \"Hexpm.Accounts.Organization\":e -> \"Hexpm.Accounts.User\":w [dir=none]\n  \"Hexpm.Repository.PackageReport\":e -> \"Hexpm.Repository.PackageReportComment\":w\n  \"Hexpm.Repository.PackageReport\":e -> \"Hexpm.Repository.PackageReportRelease\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.Download\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.PackageDependant\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.PackageDownload\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.PackageOwner\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.PackageReport\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.ReleaseDownload\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.Release\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.Requirement\":w\n  \"Hexpm.Repository.Package\":e -> \"Hexpm.Repository.PackageMetadata\":w [dir=none]\n  \"Hexpm.Repository.Release\":e -> \"Hexpm.Repository.Download\":w\n  \"Hexpm.Repository.Release\":e -> \"Hexpm.Repository.PackageReportRelease\":w\n  \"Hexpm.Repository.Release\":e -> \"Hexpm.Repository.ReleaseDownload\":w [dir=none]\n  \"Hexpm.Repository.Release\":e -> \"Hexpm.Repository.Requirement\":w\n  \"Hexpm.Repository.Release\":e -> \"Hexpm.Repository.ReleaseMetadata\":w [dir=none]\n  \"Hexpm.Repository.Release\":e -> \"Hexpm.Repository.ReleaseRetirement\":w [dir=none]\n  \"Hexpm.Repository.Repository\":e -> \"Hexpm.Repository.Package\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.UserHandles\":w [dir=none]\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.AuditLog\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.Email\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.Key\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.OrganizationUser\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Repository.PackageOwner\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Repository.PackageReportComment\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Repository.PackageReport\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.PasswordReset\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Repository.Release\":w\n  \"Hexpm.Accounts.User\":e -> \"Hexpm.Accounts.TFA\":w [dir=none]\n}\n"
  },
  {
    "path": "examples/dot/hexpm/Only-embedded-schemas.dot",
    "content": "digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \"Hexpm.Accounts.Key.Use\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Key.Use   </font></td></tr><tr><td align='left' port='field@id'>:id             <i><font color='gray54'>:binary_id             </font></i></td></tr><tr><td align='left' port='field@used_at'>:used_at        <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@user_agent'>:user_agent     <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@ip'>:ip             <i><font color='gray54'>:string                </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.KeyPermission\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.KeyPermission   </font></td></tr><tr><td align='left' port='field@id'>:id           <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@domain'>:domain       <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@resource'>:resource     <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.RecoveryCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.RecoveryCode   </font></td></tr><tr><td align='left' port='field@id'>:id          <i><font color='gray54'>:binary_id             </font></i></td></tr><tr><td align='left' port='field@code'>:code        <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@used_at'>:used_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.TFA\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.TFA   </font></td></tr><tr><td align='left' port='field@secret'>:secret             <i><font color='gray54'>:string                                                 </font></i></td></tr><tr><td align='left' port='field@tfa_enabled'>:tfa_enabled        <i><font color='gray54'>:boolean                                                </font></i></td></tr><tr><td align='left' port='field@app_enabled'>:app_enabled        <i><font color='gray54'>:boolean                                                </font></i></td></tr><tr><td align='left' port='field@recovery_codes'>:recovery_codes     <i><font color='gray54'>#Ecto.Embedded&lt;[many: Hexpm.Accounts.RecoveryCode]&gt;     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.UserHandles\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.UserHandles   </font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@twitter'>:twitter         <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@github'>:github          <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@elixirforum'>:elixirforum     <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@freenode'>:freenode        <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@slack'>:slack           <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  \"Hexpm.Repository.PackageMetadata\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Repository.PackageMetadata   </font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id            </font></i></td></tr><tr><td align='left' port='field@description'>:description     <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@licenses'>:licenses        <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@links'>:links           <i><font color='gray54'>{:map, :string}       </font></i></td></tr><tr><td align='left' port='field@maintainers'>:maintainers     <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@extra'>:extra           <i><font color='gray54'>:map                  </font></i></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseMetadata\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseMetadata   </font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id            </font></i></td></tr><tr><td align='left' port='field@app'>:app             <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@build_tools'>:build_tools     <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@elixir'>:elixir          <i><font color='gray54'>:string               </font></i></td></tr></table>>]\n  \"Hexpm.Repository.ReleaseRetirement\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Repository.ReleaseRetirement   </font></td></tr><tr><td align='left' port='field@id'>:id          <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@reason'>:reason      <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@message'>:message     <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n\n  \"Hexpm.Accounts.TFA\":\"field@recovery_codes\":e -> \"Hexpm.Accounts.RecoveryCode\":\"header@schema_module\":w\n}\n"
  },
  {
    "path": "examples/dot/hexpm/Only-selected-cluster-Accounts-context.dot",
    "content": "digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \n  subgraph \"cluster_Hexpm.Accounts\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#8deeee\"\n    label = <<font point-size='24'><b>Hexpm.Accounts</b></font>>\n    \"Hexpm.Accounts.AuditLog\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.AuditLog   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>audit_logs</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@user_agent'>:user_agent          <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@remote_ip'>:remote_ip           <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@action'>:action              <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@params'>:params              <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id             <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@key_id'>:key_id              <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Email\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Email   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>emails</i></font></td></tr><tr><td align='left' port='field@id'>:id                      <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@email'>:email                   <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@verified'>:verified                <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@primary'>:primary                 <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@public'>:public                  <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@gravatar'>:gravatar                <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@verification_key'>:verification_key        <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@verification_expiry'>:verification_expiry     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                 <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at             <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at              <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Key\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Key   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>keys</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                                                      </font></i></td></tr><tr><td align='left' port='field@name'>:name                <i><font color='gray54'>:string                                                  </font></i></td></tr><tr><td align='left' port='field@secret_first'>:secret_first        <i><font color='gray54'>:string                                                  </font></i></td></tr><tr><td align='left' port='field@secret_second'>:secret_second       <i><font color='gray54'>:string                                                  </font></i></td></tr><tr><td align='left' port='field@public'>:public              <i><font color='gray54'>:boolean                                                 </font></i></td></tr><tr><td align='left' port='field@revoke_at'>:revoke_at           <i><font color='gray54'>:utc_datetime_usec                                       </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec                                       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec                                       </font></i></td></tr><tr><td align='left' port='field@last_use'>:last_use            <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Accounts.Key.Use]&gt;            </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id             <i><font color='gray54'>:id                                                      </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                                                      </font></i></td></tr><tr><td align='left' port='field@permissions'>:permissions         <i><font color='gray54'>#Ecto.Embedded&lt;[many: Hexpm.Accounts.KeyPermission]&gt;     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Key.Use\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Key.Use   </font></td></tr><tr><td align='left' port='field@id'>:id             <i><font color='gray54'>:binary_id             </font></i></td></tr><tr><td align='left' port='field@used_at'>:used_at        <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@user_agent'>:user_agent     <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@ip'>:ip             <i><font color='gray54'>:string                </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.KeyPermission\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.KeyPermission   </font></td></tr><tr><td align='left' port='field@id'>:id           <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@domain'>:domain       <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@resource'>:resource     <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Organization\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Organization   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>organizations</i></font></td></tr><tr><td align='left' port='field@id'>:id                   <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@name'>:name                 <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@billing_active'>:billing_active       <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@billing_override'>:billing_override     <i><font color='gray54'>:boolean               </font></i></td></tr><tr><td align='left' port='field@trial_end'>:trial_end            <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at          <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at           <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.OrganizationUser\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.OrganizationUser   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>organization_users</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@role'>:role                <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id             <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.PasswordReset\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.PasswordReset   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>password_resets</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@key'>:key               <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@primary_email'>:primary_email     <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id           <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.RecoveryCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.RecoveryCode   </font></td></tr><tr><td align='left' port='field@id'>:id          <i><font color='gray54'>:binary_id             </font></i></td></tr><tr><td align='left' port='field@code'>:code        <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@used_at'>:used_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.Session\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.Session   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>sessions</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@token'>:token           <i><font color='gray54'>:binary                </font></i></td></tr><tr><td align='left' port='field@data'>:data            <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.TFA\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.TFA   </font></td></tr><tr><td align='left' port='field@secret'>:secret             <i><font color='gray54'>:string                                                 </font></i></td></tr><tr><td align='left' port='field@tfa_enabled'>:tfa_enabled        <i><font color='gray54'>:boolean                                                </font></i></td></tr><tr><td align='left' port='field@app_enabled'>:app_enabled        <i><font color='gray54'>:boolean                                                </font></i></td></tr><tr><td align='left' port='field@recovery_codes'>:recovery_codes     <i><font color='gray54'>#Ecto.Embedded&lt;[many: Hexpm.Accounts.RecoveryCode]&gt;     </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.User\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.User   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>users</i></font></td></tr><tr><td align='left' port='field@id'>:id                  <i><font color='gray54'>:id                                                   </font></i></td></tr><tr><td align='left' port='field@username'>:username            <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@full_name'>:full_name           <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@password'>:password            <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@service'>:service             <i><font color='gray54'>:boolean                                              </font></i></td></tr><tr><td align='left' port='field@deactivated_at'>:deactivated_at      <i><font color='gray54'>:utc_datetime_usec                                    </font></i></td></tr><tr><td align='left' port='field@role'>:role                <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at         <i><font color='gray54'>:utc_datetime_usec                                    </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at          <i><font color='gray54'>:utc_datetime_usec                                    </font></i></td></tr><tr><td align='left' port='field@handles'>:handles             <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Accounts.UserHandles]&gt;     </font></i></td></tr><tr><td align='left' port='field@tfa'>:tfa                 <i><font color='gray54'>#Ecto.Embedded&lt;[one: Hexpm.Accounts.TFA]&gt;             </font></i></td></tr><tr><td align='left' port='field@organization_id'>:organization_id     <i><font color='gray54'>:id                                                   </font></i></td></tr></table>>]\n  \"Hexpm.Accounts.UserHandles\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Hexpm.Accounts.UserHandles   </font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@twitter'>:twitter         <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@github'>:github          <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@elixirforum'>:elixirforum     <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@freenode'>:freenode        <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@slack'>:slack           <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  }\n\n  \"Hexpm.Accounts.TFA\":\"field@recovery_codes\":e -> \"Hexpm.Accounts.RecoveryCode\":\"header@schema_module\":w\n  \"Hexpm.Accounts.Key\":\"field@id\":e -> \"Hexpm.Accounts.AuditLog\":\"field@key_id\":w\n  \"Hexpm.Accounts.Key\":\"field@last_use\":e -> \"Hexpm.Accounts.Key.Use\":\"header@schema_module\":w [dir=none]\n  \"Hexpm.Accounts.Key\":\"field@permissions\":e -> \"Hexpm.Accounts.KeyPermission\":\"header@schema_module\":w\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Accounts.AuditLog\":\"field@organization_id\":w\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Accounts.Key\":\"field@organization_id\":w\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Accounts.OrganizationUser\":\"field@organization_id\":w\n  \"Hexpm.Accounts.Organization\":\"field@id\":e -> \"Hexpm.Accounts.User\":\"field@organization_id\":w [dir=none]\n  \"Hexpm.Accounts.User\":\"field@handles\":e -> \"Hexpm.Accounts.UserHandles\":\"header@schema_module\":w [dir=none]\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.AuditLog\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.Email\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.Key\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.OrganizationUser\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@id\":e -> \"Hexpm.Accounts.PasswordReset\":\"field@user_id\":w\n  \"Hexpm.Accounts.User\":\"field@tfa\":e -> \"Hexpm.Accounts.TFA\":\"header@schema_module\":w [dir=none]\n}\n"
  },
  {
    "path": "examples/dot/plausible-analytics/Contexts-as-clusters-no-fields.dot",
    "content": "strict digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \n  subgraph \"cluster_Ecto.Migration\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0f8ff\"\n    label = <<font point-size='24'><b>Ecto.Migration</b></font>>\n    \"Ecto.Migration.SchemaMigration\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Ecto.Migration.SchemaMigration   </font></td></tr><tr><td><font point-size='14'><i>schema_migrations</i></font></td></tr></table>>]\n  }\n  subgraph \"cluster_FunWithFlags.Store\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0ffff\"\n    label = <<font point-size='24'><b>FunWithFlags.Store</b></font>>\n    \"FunWithFlags.Store.Persistent.Ecto.Record\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   FunWithFlags.Store.Persistent.Ecto.Record   </font></td></tr><tr><td><font point-size='14'><i>fun_with_flags_toggles</i></font></td></tr></table>>]\n  }\n  subgraph cluster_Oban {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0ffff\"\n    label = <<font point-size='24'><b>Oban</b></font>>\n    \"Oban.Job\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Oban.Job   </font></td></tr><tr><td><font point-size='14'><i>oban_jobs</i></font></td></tr></table>>]\n  }\n  subgraph cluster_Plausible {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#eee5de\"\n    label = <<font point-size='24'><b>Plausible</b></font>>\n    \"Plausible.ClickhouseEventV2\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.ClickhouseEventV2   </font></td></tr><tr><td><font point-size='14'><i>events_v2</i></font></td></tr></table>>]\n  \"Plausible.ClickhouseSessionV2\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.ClickhouseSessionV2   </font></td></tr><tr><td><font point-size='14'><i>sessions_v2</i></font></td></tr></table>>]\n  \"Plausible.Funnel\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Funnel   </font></td></tr><tr><td><font point-size='14'><i>funnels</i></font></td></tr></table>>]\n  \"Plausible.Goal\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Goal   </font></td></tr><tr><td><font point-size='14'><i>goals</i></font></td></tr></table>>]\n  \"Plausible.Site\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site   </font></td></tr><tr><td><font point-size='14'><i>sites</i></font></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Auth\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#ffefd5\"\n    label = <<font point-size='24'><b>Plausible.Auth</b></font>>\n    \"Plausible.Auth.ApiKey\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.ApiKey   </font></td></tr><tr><td><font point-size='14'><i>api_keys</i></font></td></tr></table>>]\n  \"Plausible.Auth.EmailActivationCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.EmailActivationCode   </font></td></tr><tr><td><font point-size='14'><i>email_activation_codes</i></font></td></tr></table>>]\n  \"Plausible.Auth.GracePeriod\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.GracePeriod   </font></td></tr></table>>]\n  \"Plausible.Auth.Invitation\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.Invitation   </font></td></tr><tr><td><font point-size='14'><i>invitations</i></font></td></tr></table>>]\n  \"Plausible.Auth.TOTP.RecoveryCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.TOTP.RecoveryCode   </font></td></tr><tr><td><font point-size='14'><i>totp_recovery_codes</i></font></td></tr></table>>]\n  \"Plausible.Auth.User\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.User   </font></td></tr><tr><td><font point-size='14'><i>users</i></font></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Billing\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0ffff\"\n    label = <<font point-size='24'><b>Plausible.Billing</b></font>>\n    \"Plausible.Billing.EnterprisePlan\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Billing.EnterprisePlan   </font></td></tr><tr><td><font point-size='14'><i>enterprise_plans</i></font></td></tr></table>>]\n  \"Plausible.Billing.Plan\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Billing.Plan   </font></td></tr></table>>]\n  \"Plausible.Billing.Subscription\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Billing.Subscription   </font></td></tr><tr><td><font point-size='14'><i>subscriptions</i></font></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.DataMigration\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#8deeee\"\n    label = <<font point-size='24'><b>Plausible.DataMigration</b></font>>\n    \"Plausible.DataMigration.NumericIDs.DomainsLookup\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.DataMigration.NumericIDs.DomainsLookup   </font></td></tr><tr><td><font point-size='14'><i>domains_lookup</i></font></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Funnel\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#fffafa\"\n    label = <<font point-size='24'><b>Plausible.Funnel</b></font>>\n    \"Plausible.Funnel.Step\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Funnel.Step   </font></td></tr><tr><td><font point-size='14'><i>funnel_steps</i></font></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Imported\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#eedfcc\"\n    label = <<font point-size='24'><b>Plausible.Imported</b></font>>\n    \"Plausible.Imported.Browser\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Browser   </font></td></tr><tr><td><font point-size='14'><i>imported_browsers</i></font></td></tr></table>>]\n  \"Plausible.Imported.Device\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Device   </font></td></tr><tr><td><font point-size='14'><i>imported_devices</i></font></td></tr></table>>]\n  \"Plausible.Imported.EntryPage\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.EntryPage   </font></td></tr><tr><td><font point-size='14'><i>imported_entry_pages</i></font></td></tr></table>>]\n  \"Plausible.Imported.ExitPage\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.ExitPage   </font></td></tr><tr><td><font point-size='14'><i>imported_exit_pages</i></font></td></tr></table>>]\n  \"Plausible.Imported.Location\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Location   </font></td></tr><tr><td><font point-size='14'><i>imported_locations</i></font></td></tr></table>>]\n  \"Plausible.Imported.OperatingSystem\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.OperatingSystem   </font></td></tr><tr><td><font point-size='14'><i>imported_operating_systems</i></font></td></tr></table>>]\n  \"Plausible.Imported.Page\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Page   </font></td></tr><tr><td><font point-size='14'><i>imported_pages</i></font></td></tr></table>>]\n  \"Plausible.Imported.SiteImport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.SiteImport   </font></td></tr><tr><td><font point-size='14'><i>site_imports</i></font></td></tr></table>>]\n  \"Plausible.Imported.Source\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Source   </font></td></tr><tr><td><font point-size='14'><i>imported_sources</i></font></td></tr></table>>]\n  \"Plausible.Imported.Visitor\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Visitor   </font></td></tr><tr><td><font point-size='14'><i>imported_visitors</i></font></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Ingestion\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#8deeee\"\n    label = <<font point-size='24'><b>Plausible.Ingestion</b></font>>\n    \"Plausible.Ingestion.Counters.Record\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Ingestion.Counters.Record   </font></td></tr><tr><td><font point-size='14'><i>ingest_counters</i></font></td></tr></table>>]\n  \"Plausible.Ingestion.Request\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Ingestion.Request   </font></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Plugins\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#eee5de\"\n    label = <<font point-size='24'><b>Plausible.Plugins</b></font>>\n    \"Plausible.Plugins.API.Token\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Plugins.API.Token   </font></td></tr><tr><td><font point-size='14'><i>plugins_api_tokens</i></font></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Shield\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#8deeee\"\n    label = <<font point-size='24'><b>Plausible.Shield</b></font>>\n    \"Plausible.Shield.CountryRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.CountryRule   </font></td></tr><tr><td><font point-size='14'><i>shield_rules_country</i></font></td></tr></table>>]\n  \"Plausible.Shield.HostnameRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.HostnameRule   </font></td></tr><tr><td><font point-size='14'><i>shield_rules_hostname</i></font></td></tr></table>>]\n  \"Plausible.Shield.IPRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.IPRule   </font></td></tr><tr><td><font point-size='14'><i>shield_rules_ip</i></font></td></tr></table>>]\n  \"Plausible.Shield.PageRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.PageRule   </font></td></tr><tr><td><font point-size='14'><i>shield_rules_page</i></font></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Site\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0f8ff\"\n    label = <<font point-size='24'><b>Plausible.Site</b></font>>\n    \"Plausible.Site.GoogleAuth\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.GoogleAuth   </font></td></tr><tr><td><font point-size='14'><i>google_auth</i></font></td></tr></table>>]\n  \"Plausible.Site.ImportedData\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.ImportedData   </font></td></tr></table>>]\n  \"Plausible.Site.Membership\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.Membership   </font></td></tr><tr><td><font point-size='14'><i>site_memberships</i></font></td></tr></table>>]\n  \"Plausible.Site.MonthlyReport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.MonthlyReport   </font></td></tr><tr><td><font point-size='14'><i>monthly_reports</i></font></td></tr></table>>]\n  \"Plausible.Site.SharedLink\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.SharedLink   </font></td></tr><tr><td><font point-size='14'><i>shared_links</i></font></td></tr></table>>]\n  \"Plausible.Site.SpikeNotification\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.SpikeNotification   </font></td></tr><tr><td><font point-size='14'><i>spike_notifications</i></font></td></tr></table>>]\n  \"Plausible.Site.UserPreference\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.UserPreference   </font></td></tr><tr><td><font point-size='14'><i>site_user_preferences</i></font></td></tr></table>>]\n  \"Plausible.Site.WeeklyReport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.WeeklyReport   </font></td></tr><tr><td><font point-size='14'><i>weekly_reports</i></font></td></tr></table>>]\n  }\n\n  \"Plausible.Funnel\":e -> \"Plausible.Funnel.Step\":w\n  \"Plausible.Goal\":e -> \"Plausible.Funnel.Step\":w\n  \"Plausible.Site\":e -> \"Plausible.Funnel\":w\n  \"Plausible.Site\":e -> \"Plausible.Goal\":w\n  \"Plausible.Site\":e -> \"Plausible.Site.GoogleAuth\":w [dir=none]\n  \"Plausible.Site\":e -> \"Plausible.Auth.Invitation\":w\n  \"Plausible.Site\":e -> \"Plausible.Site.MonthlyReport\":w [dir=none]\n  \"Plausible.Site\":e -> \"Plausible.Plugins.API.Token\":w\n  \"Plausible.Site\":e -> \"Plausible.Site.SharedLink\":w\n  \"Plausible.Site\":e -> \"Plausible.Shield.CountryRule\":w\n  \"Plausible.Site\":e -> \"Plausible.Shield.HostnameRule\":w\n  \"Plausible.Site\":e -> \"Plausible.Shield.IPRule\":w\n  \"Plausible.Site\":e -> \"Plausible.Shield.PageRule\":w\n  \"Plausible.Site\":e -> \"Plausible.Imported.SiteImport\":w\n  \"Plausible.Site\":e -> \"Plausible.Site.Membership\":w [dir=none]\n  \"Plausible.Site\":e -> \"Plausible.Site.UserPreference\":w\n  \"Plausible.Site\":e -> \"Plausible.Site.SpikeNotification\":w [dir=none]\n  \"Plausible.Site\":e -> \"Plausible.Site.WeeklyReport\":w [dir=none]\n  \"Plausible.Site\":e -> \"Plausible.Site.ImportedData\":w [dir=none]\n  \"Plausible.Auth.User\":e -> \"Plausible.Auth.GracePeriod\":w [dir=none]\n  \"Plausible.Auth.User\":e -> \"Plausible.Auth.ApiKey\":w\n  \"Plausible.Auth.User\":e -> \"Plausible.Auth.EmailActivationCode\":w\n  \"Plausible.Auth.User\":e -> \"Plausible.Billing.EnterprisePlan\":w [dir=none]\n  \"Plausible.Auth.User\":e -> \"Plausible.Site.GoogleAuth\":w [dir=none]\n  \"Plausible.Auth.User\":e -> \"Plausible.Auth.Invitation\":w\n  \"Plausible.Auth.User\":e -> \"Plausible.Imported.SiteImport\":w\n  \"Plausible.Auth.User\":e -> \"Plausible.Site.Membership\":w\n  \"Plausible.Auth.User\":e -> \"Plausible.Site.UserPreference\":w\n  \"Plausible.Auth.User\":e -> \"Plausible.Billing.Subscription\":w [dir=none]\n  \"Plausible.Auth.User\":e -> \"Plausible.Auth.TOTP.RecoveryCode\":w\n}\n"
  },
  {
    "path": "examples/dot/plausible-analytics/Contexts-as-clusters.dot",
    "content": "digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \n  subgraph \"cluster_Ecto.Migration\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0f8ff\"\n    label = <<font point-size='24'><b>Ecto.Migration</b></font>>\n    \"Ecto.Migration.SchemaMigration\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Ecto.Migration.SchemaMigration   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>schema_migrations</i></font></td></tr><tr><td align='left' port='field@version'>:version         <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_FunWithFlags.Store\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0ffff\"\n    label = <<font point-size='24'><b>FunWithFlags.Store</b></font>>\n    \"FunWithFlags.Store.Persistent.Ecto.Record\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   FunWithFlags.Store.Persistent.Ecto.Record   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>fun_with_flags_toggles</i></font></td></tr><tr><td align='left' port='field@id'>:id            <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@flag_name'>:flag_name     <i><font color='gray54'>:string      </font></i></td></tr><tr><td align='left' port='field@gate_type'>:gate_type     <i><font color='gray54'>:string      </font></i></td></tr><tr><td align='left' port='field@target'>:target        <i><font color='gray54'>:string      </font></i></td></tr><tr><td align='left' port='field@enabled'>:enabled       <i><font color='gray54'>:boolean     </font></i></td></tr></table>>]\n  }\n  subgraph cluster_Oban {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0ffff\"\n    label = <<font point-size='24'><b>Oban</b></font>>\n    \"Oban.Job\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Oban.Job   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>oban_jobs</i></font></td></tr><tr><td align='left' port='field@id'>:id               <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@state'>:state            <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@queue'>:queue            <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@worker'>:worker           <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@args'>:args             <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@meta'>:meta             <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@tags'>:tags             <i><font color='gray54'>{:array, :string}      </font></i></td></tr><tr><td align='left' port='field@errors'>:errors           <i><font color='gray54'>{:array, :map}         </font></i></td></tr><tr><td align='left' port='field@attempt'>:attempt          <i><font color='gray54'>:integer               </font></i></td></tr><tr><td align='left' port='field@attempted_by'>:attempted_by     <i><font color='gray54'>{:array, :string}      </font></i></td></tr><tr><td align='left' port='field@max_attempts'>:max_attempts     <i><font color='gray54'>:integer               </font></i></td></tr><tr><td align='left' port='field@priority'>:priority         <i><font color='gray54'>:integer               </font></i></td></tr><tr><td align='left' port='field@attempted_at'>:attempted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@cancelled_at'>:cancelled_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@completed_at'>:completed_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@discarded_at'>:discarded_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at      <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@scheduled_at'>:scheduled_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  }\n  subgraph cluster_Plausible {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#eee5de\"\n    label = <<font point-size='24'><b>Plausible</b></font>>\n    \"Plausible.ClickhouseEventV2\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.ClickhouseEventV2   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>events_v2</i></font></td></tr><tr><td align='left' port='field@name'>:name                           <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id                        <i><font color='gray54'>{:parameterized, Ch, :u64}                             </font></i></td></tr><tr><td align='left' port='field@hostname'>:hostname                       <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@pathname'>:pathname                       <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                        <i><font color='gray54'>{:parameterized, Ch, :u64}                             </font></i></td></tr><tr><td align='left' port='field@session_id'>:session_id                     <i><font color='gray54'>{:parameterized, Ch, :u64}                             </font></i></td></tr><tr><td align='left' port='field@timestamp'>:timestamp                      <i><font color='gray54'>:naive_datetime                                        </font></i></td></tr><tr><td align='left' port='field@meta.key'>:&quot;meta.key&quot;                     <i><font color='gray54'>{:array, :string}                                      </font></i></td></tr><tr><td align='left' port='field@meta.value'>:&quot;meta.value&quot;                   <i><font color='gray54'>{:array, :string}                                      </font></i></td></tr><tr><td align='left' port='field@revenue_source_amount'>:revenue_source_amount          <i><font color='gray54'>{:parameterized, Ch, {:nullable, {:decimal64, 3}}}     </font></i></td></tr><tr><td align='left' port='field@revenue_source_currency'>:revenue_source_currency        <i><font color='gray54'>{:parameterized, Ch, {:fixed_string, 3}}               </font></i></td></tr><tr><td align='left' port='field@revenue_reporting_amount'>:revenue_reporting_amount       <i><font color='gray54'>{:parameterized, Ch, {:nullable, {:decimal64, 3}}}     </font></i></td></tr><tr><td align='left' port='field@revenue_reporting_currency'>:revenue_reporting_currency     <i><font color='gray54'>{:parameterized, Ch, {:fixed_string, 3}}               </font></i></td></tr><tr><td align='left' port='field@referrer'>:referrer                       <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@referrer_source'>:referrer_source                <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@utm_medium'>:utm_medium                     <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@utm_source'>:utm_source                     <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@utm_campaign'>:utm_campaign                   <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@utm_content'>:utm_content                    <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@utm_term'>:utm_term                       <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@country_code'>:country_code                   <i><font color='gray54'>{:parameterized, Ch, {:fixed_string, 2}}               </font></i></td></tr><tr><td align='left' port='field@subdivision1_code'>:subdivision1_code              <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@subdivision2_code'>:subdivision2_code              <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@city_geoname_id'>:city_geoname_id                <i><font color='gray54'>{:parameterized, Ch, :u32}                             </font></i></td></tr><tr><td align='left' port='field@screen_size'>:screen_size                    <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@operating_system'>:operating_system               <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@operating_system_version'>:operating_system_version       <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@browser'>:browser                        <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@browser_version'>:browser_version                <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr></table>>]\n  \"Plausible.ClickhouseSessionV2\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.ClickhouseSessionV2   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>sessions_v2</i></font></td></tr><tr><td align='left' port='field@hostname'>:hostname                     <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id                      <i><font color='gray54'>{:parameterized, Ch, :u64}                                       </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                      <i><font color='gray54'>{:parameterized, Ch, :u64}                                       </font></i></td></tr><tr><td align='left' port='field@session_id'>:session_id                   <i><font color='gray54'>{:parameterized, Ch, :u64}                                       </font></i></td></tr><tr><td align='left' port='field@start'>:start                        <i><font color='gray54'>:naive_datetime                                                  </font></i></td></tr><tr><td align='left' port='field@duration'>:duration                     <i><font color='gray54'>{:parameterized, Ch, :u32}                                       </font></i></td></tr><tr><td align='left' port='field@is_bounce'>:is_bounce                    <i><font color='gray54'>Plausible.ClickhouseSessionV2.BoolUInt8                          </font></i></td></tr><tr><td align='left' port='field@entry_page'>:entry_page                   <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@exit_page'>:exit_page                    <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@exit_page_hostname'>:exit_page_hostname           <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews                    <i><font color='gray54'>{:parameterized, Ch, :i32}                                       </font></i></td></tr><tr><td align='left' port='field@events'>:events                       <i><font color='gray54'>{:parameterized, Ch, :i32}                                       </font></i></td></tr><tr><td align='left' port='field@sign'>:sign                         <i><font color='gray54'>{:parameterized, Ch, :i8}                                        </font></i></td></tr><tr><td align='left' port='field@entry_meta.key'>:&quot;entry_meta.key&quot;             <i><font color='gray54'>{:array, :string}                                                </font></i></td></tr><tr><td align='left' port='field@entry_meta.value'>:&quot;entry_meta.value&quot;           <i><font color='gray54'>{:array, :string}                                                </font></i></td></tr><tr><td align='left' port='field@utm_medium'>:utm_medium                   <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@utm_source'>:utm_source                   <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@utm_campaign'>:utm_campaign                 <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@utm_content'>:utm_content                  <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@utm_term'>:utm_term                     <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@referrer'>:referrer                     <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@referrer_source'>:referrer_source              <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@country_code'>:country_code                 <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, {:fixed_string, 2}}}     </font></i></td></tr><tr><td align='left' port='field@subdivision1_code'>:subdivision1_code            <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@subdivision2_code'>:subdivision2_code            <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@city_geoname_id'>:city_geoname_id              <i><font color='gray54'>{:parameterized, Ch, :u32}                                       </font></i></td></tr><tr><td align='left' port='field@screen_size'>:screen_size                  <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@operating_system'>:operating_system             <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@operating_system_version'>:operating_system_version     <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@browser'>:browser                      <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@browser_version'>:browser_version              <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@timestamp'>:timestamp                    <i><font color='gray54'>:naive_datetime                                                  </font></i></td></tr><tr><td align='left' port='field@transferred_from'>:transferred_from             <i><font color='gray54'>:string                                                          </font></i></td></tr></table>>]\n  \"Plausible.Funnel\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Funnel   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>funnels</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@name'>:name            <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Plausible.Goal\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Goal   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>goals</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                                                                          </font></i></td></tr><tr><td align='left' port='field@event_name'>:event_name      <i><font color='gray54'>:string                                                                      </font></i></td></tr><tr><td align='left' port='field@page_path'>:page_path       <i><font color='gray54'>:string                                                                      </font></i></td></tr><tr><td align='left' port='field@currency'>:currency        <i><font color='gray54'>#Enum&lt;[:AED, :AFN, :ALL, :AMD, :ANG, :AOA, :ARS, :AUD, :AWG, :AZN, ...]&gt;     </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                                                                          </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime                                                              </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime                                                              </font></i></td></tr></table>>]\n  \"Plausible.Site\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>sites</i></font></td></tr><tr><td align='left' port='field@id'>:id                                  <i><font color='gray54'>:id                                                    </font></i></td></tr><tr><td align='left' port='field@domain'>:domain                              <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@timezone'>:timezone                            <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@public'>:public                              <i><font color='gray54'>:boolean                                               </font></i></td></tr><tr><td align='left' port='field@locked'>:locked                              <i><font color='gray54'>:boolean                                               </font></i></td></tr><tr><td align='left' port='field@stats_start_date'>:stats_start_date                    <i><font color='gray54'>:date                                                  </font></i></td></tr><tr><td align='left' port='field@native_stats_start_at'>:native_stats_start_at               <i><font color='gray54'>:naive_datetime                                        </font></i></td></tr><tr><td align='left' port='field@allowed_event_props'>:allowed_event_props                 <i><font color='gray54'>{:array, :string}                                      </font></i></td></tr><tr><td align='left' port='field@conversions_enabled'>:conversions_enabled                 <i><font color='gray54'>:boolean                                               </font></i></td></tr><tr><td align='left' port='field@props_enabled'>:props_enabled                       <i><font color='gray54'>:boolean                                               </font></i></td></tr><tr><td align='left' port='field@funnels_enabled'>:funnels_enabled                     <i><font color='gray54'>:boolean                                               </font></i></td></tr><tr><td align='left' port='field@ingest_rate_limit_scale_seconds'>:ingest_rate_limit_scale_seconds     <i><font color='gray54'>:integer                                               </font></i></td></tr><tr><td align='left' port='field@ingest_rate_limit_threshold'>:ingest_rate_limit_threshold         <i><font color='gray54'>:integer                                               </font></i></td></tr><tr><td align='left' port='field@domain_changed_from'>:domain_changed_from                 <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@domain_changed_at'>:domain_changed_at                   <i><font color='gray54'>:naive_datetime                                        </font></i></td></tr><tr><td align='left' port='field@imported_data'>:imported_data                       <i><font color='gray54'>#Ecto.Embedded&lt;[one: Plausible.Site.ImportedData]&gt;     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at                         <i><font color='gray54'>:naive_datetime                                        </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at                          <i><font color='gray54'>:naive_datetime                                        </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Auth\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#ffefd5\"\n    label = <<font point-size='24'><b>Plausible.Auth</b></font>>\n    \"Plausible.Auth.ApiKey\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.ApiKey   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>api_keys</i></font></td></tr><tr><td align='left' port='field@id'>:id                       <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@name'>:name                     <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@scopes'>:scopes                   <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@hourly_request_limit'>:hourly_request_limit     <i><font color='gray54'>:integer              </font></i></td></tr><tr><td align='left' port='field@key_hash'>:key_hash                 <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@key_prefix'>:key_prefix               <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                  <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at              <i><font color='gray54'>:naive_datetime       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at               <i><font color='gray54'>:naive_datetime       </font></i></td></tr></table>>]\n  \"Plausible.Auth.EmailActivationCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.EmailActivationCode   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>email_activation_codes</i></font></td></tr><tr><td align='left' port='field@id'>:id            <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@code'>:code          <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@issued_at'>:issued_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id       <i><font color='gray54'>:id                 </font></i></td></tr></table>>]\n  \"Plausible.Auth.GracePeriod\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Plausible.Auth.GracePeriod   </font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@end_date'>:end_date        <i><font color='gray54'>:date          </font></i></td></tr><tr><td align='left' port='field@is_over'>:is_over         <i><font color='gray54'>:boolean       </font></i></td></tr><tr><td align='left' port='field@manual_lock'>:manual_lock     <i><font color='gray54'>:boolean       </font></i></td></tr></table>>]\n  \"Plausible.Auth.Invitation\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.Invitation   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>invitations</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                                  </font></i></td></tr><tr><td align='left' port='field@invitation_id'>:invitation_id     <i><font color='gray54'>:string                              </font></i></td></tr><tr><td align='left' port='field@email'>:email             <i><font color='gray54'>:string                              </font></i></td></tr><tr><td align='left' port='field@role'>:role              <i><font color='gray54'>#Enum&lt;[:admin, :owner, :viewer]&gt;     </font></i></td></tr><tr><td align='left' port='field@inviter_id'>:inviter_id        <i><font color='gray54'>:id                                  </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id           <i><font color='gray54'>:id                                  </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime                      </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime                      </font></i></td></tr></table>>]\n  \"Plausible.Auth.TOTP.RecoveryCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.TOTP.RecoveryCode   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>totp_recovery_codes</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@code_digest'>:code_digest     <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Plausible.Auth.User\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.User   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>users</i></font></td></tr><tr><td align='left' port='field@id'>:id                              <i><font color='gray54'>:id                                                   </font></i></td></tr><tr><td align='left' port='field@email'>:email                           <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@password_hash'>:password_hash                   <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@name'>:name                            <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@last_seen'>:last_seen                       <i><font color='gray54'>:naive_datetime                                       </font></i></td></tr><tr><td align='left' port='field@trial_expiry_date'>:trial_expiry_date               <i><font color='gray54'>:date                                                 </font></i></td></tr><tr><td align='left' port='field@theme'>:theme                           <i><font color='gray54'>#Enum&lt;[:dark, :light, :system]&gt;                       </font></i></td></tr><tr><td align='left' port='field@email_verified'>:email_verified                  <i><font color='gray54'>:boolean                                              </font></i></td></tr><tr><td align='left' port='field@previous_email'>:previous_email                  <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@accept_traffic_until'>:accept_traffic_until            <i><font color='gray54'>:date                                                 </font></i></td></tr><tr><td align='left' port='field@allow_next_upgrade_override'>:allow_next_upgrade_override     <i><font color='gray54'>:boolean                                              </font></i></td></tr><tr><td align='left' port='field@totp_enabled'>:totp_enabled                    <i><font color='gray54'>:boolean                                              </font></i></td></tr><tr><td align='left' port='field@totp_secret'>:totp_secret                     <i><font color='gray54'>Plausible.Auth.TOTP.EncryptedBinary                   </font></i></td></tr><tr><td align='left' port='field@totp_token'>:totp_token                      <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@totp_last_used_at'>:totp_last_used_at               <i><font color='gray54'>:naive_datetime                                       </font></i></td></tr><tr><td align='left' port='field@grace_period'>:grace_period                    <i><font color='gray54'>#Ecto.Embedded&lt;[one: Plausible.Auth.GracePeriod]&gt;     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at                     <i><font color='gray54'>:naive_datetime                                       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at                      <i><font color='gray54'>:naive_datetime                                       </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Billing\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0ffff\"\n    label = <<font point-size='24'><b>Plausible.Billing</b></font>>\n    \"Plausible.Billing.EnterprisePlan\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Billing.EnterprisePlan   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>enterprise_plans</i></font></td></tr><tr><td align='left' port='field@id'>:id                           <i><font color='gray54'>:id                                    </font></i></td></tr><tr><td align='left' port='field@paddle_plan_id'>:paddle_plan_id               <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@billing_interval'>:billing_interval             <i><font color='gray54'>#Enum&lt;[:monthly, :yearly]&gt;             </font></i></td></tr><tr><td align='left' port='field@monthly_pageview_limit'>:monthly_pageview_limit       <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@site_limit'>:site_limit                   <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@team_member_limit'>:team_member_limit            <i><font color='gray54'>Plausible.Billing.Ecto.Limit           </font></i></td></tr><tr><td align='left' port='field@features'>:features                     <i><font color='gray54'>Plausible.Billing.Ecto.FeatureList     </font></i></td></tr><tr><td align='left' port='field@hourly_api_request_limit'>:hourly_api_request_limit     <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                      <i><font color='gray54'>:id                                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at                  <i><font color='gray54'>:naive_datetime                        </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at                   <i><font color='gray54'>:naive_datetime                        </font></i></td></tr></table>>]\n  \"Plausible.Billing.Plan\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Plausible.Billing.Plan   </font></td></tr><tr><td align='left' port='field@id'>:id                          <i><font color='gray54'>:binary_id                             </font></i></td></tr><tr><td align='left' port='field@generation'>:generation                  <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@kind'>:kind                        <i><font color='gray54'>#Enum&lt;[:business, :growth]&gt;            </font></i></td></tr><tr><td align='left' port='field@features'>:features                    <i><font color='gray54'>Plausible.Billing.Ecto.FeatureList     </font></i></td></tr><tr><td align='left' port='field@monthly_pageview_limit'>:monthly_pageview_limit      <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@site_limit'>:site_limit                  <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@team_member_limit'>:team_member_limit           <i><font color='gray54'>Plausible.Billing.Ecto.Limit           </font></i></td></tr><tr><td align='left' port='field@volume'>:volume                      <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@data_retention_in_years'>:data_retention_in_years     <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@monthly_cost'>:monthly_cost                <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@monthly_product_id'>:monthly_product_id          <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@yearly_cost'>:yearly_cost                 <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@yearly_product_id'>:yearly_product_id           <i><font color='gray54'>:string                                </font></i></td></tr></table>>]\n  \"Plausible.Billing.Subscription\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Billing.Subscription   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>subscriptions</i></font></td></tr><tr><td align='left' port='field@id'>:id                         <i><font color='gray54'>:id                                                </font></i></td></tr><tr><td align='left' port='field@paddle_subscription_id'>:paddle_subscription_id     <i><font color='gray54'>:string                                            </font></i></td></tr><tr><td align='left' port='field@paddle_plan_id'>:paddle_plan_id             <i><font color='gray54'>:string                                            </font></i></td></tr><tr><td align='left' port='field@update_url'>:update_url                 <i><font color='gray54'>:string                                            </font></i></td></tr><tr><td align='left' port='field@cancel_url'>:cancel_url                 <i><font color='gray54'>:string                                            </font></i></td></tr><tr><td align='left' port='field@status'>:status                     <i><font color='gray54'>#Enum&lt;[:active, :deleted, :past_due, :paused]&gt;     </font></i></td></tr><tr><td align='left' port='field@next_bill_amount'>:next_bill_amount           <i><font color='gray54'>:string                                            </font></i></td></tr><tr><td align='left' port='field@next_bill_date'>:next_bill_date             <i><font color='gray54'>:date                                              </font></i></td></tr><tr><td align='left' port='field@last_bill_date'>:last_bill_date             <i><font color='gray54'>:date                                              </font></i></td></tr><tr><td align='left' port='field@currency_code'>:currency_code              <i><font color='gray54'>:string                                            </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                    <i><font color='gray54'>:id                                                </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at                <i><font color='gray54'>:naive_datetime                                    </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at                 <i><font color='gray54'>:naive_datetime                                    </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.DataMigration\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#8deeee\"\n    label = <<font point-size='24'><b>Plausible.DataMigration</b></font>>\n    \"Plausible.DataMigration.NumericIDs.DomainsLookup\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.DataMigration.NumericIDs.DomainsLookup   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>domains_lookup</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@domain'>:domain      <i><font color='gray54'>:string                        </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Funnel\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#fffafa\"\n    label = <<font point-size='24'><b>Plausible.Funnel</b></font>>\n    \"Plausible.Funnel.Step\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Funnel.Step   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>funnel_steps</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@step_order'>:step_order      <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@funnel_id'>:funnel_id       <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@goal_id'>:goal_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Imported\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#eedfcc\"\n    label = <<font point-size='24'><b>Plausible.Imported</b></font>>\n    \"Plausible.Imported.Browser\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Browser   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_browsers</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id             <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date                <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@browser'>:browser             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@browser_version'>:browser_version     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visits'>:visits              <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration      <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces             <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.Device\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Device   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_devices</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date               <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@device'>:device             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visits'>:visits             <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces            <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.EntryPage\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.EntryPage   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_entry_pages</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date               <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@entry_page'>:entry_page         <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@entrances'>:entrances          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces            <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.ExitPage\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.ExitPage   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_exit_pages</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date               <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@exit_page'>:exit_page          <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@exits'>:exits              <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces            <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.Location\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Location   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_locations</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date               <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@country'>:country            <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@region'>:region             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@city'>:city               <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visits'>:visits             <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces            <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.OperatingSystem\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.OperatingSystem   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_operating_systems</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id                      <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id                    <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date                         <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@operating_system'>:operating_system             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@operating_system_version'>:operating_system_version     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors                     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visits'>:visits                       <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration               <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews                    <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces                      <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.Page\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Page   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_pages</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id             <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date                <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@hostname'>:hostname            <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@page'>:page                <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@visits'>:visits              <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@active_visitors'>:active_visitors     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@exits'>:exits               <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@time_on_page'>:time_on_page        <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.SiteImport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.SiteImport   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>site_imports</i></font></td></tr><tr><td align='left' port='field@id'>:id                 <i><font color='gray54'>:id                                                                 </font></i></td></tr><tr><td align='left' port='field@start_date'>:start_date         <i><font color='gray54'>:date                                                               </font></i></td></tr><tr><td align='left' port='field@end_date'>:end_date           <i><font color='gray54'>:date                                                               </font></i></td></tr><tr><td align='left' port='field@label'>:label              <i><font color='gray54'>:string                                                             </font></i></td></tr><tr><td align='left' port='field@source'>:source             <i><font color='gray54'>#Enum&lt;[:csv, :google_analytics_4, :noop, :universal_analytics]&gt;     </font></i></td></tr><tr><td align='left' port='field@status'>:status             <i><font color='gray54'>#Enum&lt;[:completed, :failed, :importing, :pending]&gt;                  </font></i></td></tr><tr><td align='left' port='field@legacy'>:legacy             <i><font color='gray54'>:boolean                                                            </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>:id                                                                 </font></i></td></tr><tr><td align='left' port='field@imported_by_id'>:imported_by_id     <i><font color='gray54'>:id                                                                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at        <i><font color='gray54'>:naive_datetime                                                     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at         <i><font color='gray54'>:naive_datetime                                                     </font></i></td></tr></table>>]\n  \"Plausible.Imported.Source\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Source   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_sources</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date               <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@source'>:source             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@referrer'>:referrer           <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@utm_source'>:utm_source         <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@utm_medium'>:utm_medium         <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@utm_campaign'>:utm_campaign       <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@utm_content'>:utm_content        <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@utm_term'>:utm_term           <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visits'>:visits             <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces            <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.Visitor\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Visitor   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_visitors</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date               <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visits'>:visits             <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Ingestion\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#8deeee\"\n    label = <<font point-size='24'><b>Plausible.Ingestion</b></font>>\n    \"Plausible.Ingestion.Counters.Record\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Ingestion.Counters.Record   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>ingest_counters</i></font></td></tr><tr><td align='left' port='field@event_timebucket'>:event_timebucket     <i><font color='gray54'>:utc_datetime                                         </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id              <i><font color='gray54'>{:parameterized, Ch, {:nullable, :u64}}               </font></i></td></tr><tr><td align='left' port='field@domain'>:domain               <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}     </font></i></td></tr><tr><td align='left' port='field@metric'>:metric               <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}     </font></i></td></tr><tr><td align='left' port='field@value'>:value                <i><font color='gray54'>{:parameterized, Ch, :u64}                            </font></i></td></tr></table>>]\n  \"Plausible.Ingestion.Request\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Plausible.Ingestion.Request   </font></td></tr><tr><td align='left' port='field@remote_ip'>:remote_ip             <i><font color='gray54'>:string                      </font></i></td></tr><tr><td align='left' port='field@user_agent'>:user_agent            <i><font color='gray54'>:string                      </font></i></td></tr><tr><td align='left' port='field@event_name'>:event_name            <i><font color='gray54'>Plausible.Ecto.EventName     </font></i></td></tr><tr><td align='left' port='field@uri'>:uri                   <i><font color='gray54'>:map                         </font></i></td></tr><tr><td align='left' port='field@hostname'>:hostname              <i><font color='gray54'>:string                      </font></i></td></tr><tr><td align='left' port='field@referrer'>:referrer              <i><font color='gray54'>:string                      </font></i></td></tr><tr><td align='left' port='field@domains'>:domains               <i><font color='gray54'>{:array, :string}            </font></i></td></tr><tr><td align='left' port='field@ip_classification'>:ip_classification     <i><font color='gray54'>:string                      </font></i></td></tr><tr><td align='left' port='field@hash_mode'>:hash_mode             <i><font color='gray54'>:integer                     </font></i></td></tr><tr><td align='left' port='field@pathname'>:pathname              <i><font color='gray54'>:string                      </font></i></td></tr><tr><td align='left' port='field@props'>:props                 <i><font color='gray54'>:map                         </font></i></td></tr><tr><td align='left' port='field@revenue_source'>:revenue_source        <i><font color='gray54'>:map                         </font></i></td></tr><tr><td align='left' port='field@query_params'>:query_params          <i><font color='gray54'>:map                         </font></i></td></tr><tr><td align='left' port='field@timestamp'>:timestamp             <i><font color='gray54'>:naive_datetime              </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Plugins\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#eee5de\"\n    label = <<font point-size='24'><b>Plausible.Plugins</b></font>>\n    \"Plausible.Plugins.API.Token\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Plugins.API.Token   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>plugins_api_tokens</i></font></td></tr><tr><td align='left' port='field@id'>:id               <i><font color='gray54'>:binary_id          </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@token_hash'>:token_hash       <i><font color='gray54'>:binary             </font></i></td></tr><tr><td align='left' port='field@description'>:description      <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@hint'>:hint             <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@last_used_at'>:last_used_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id          <i><font color='gray54'>:id                 </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Shield\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#8deeee\"\n    label = <<font point-size='24'><b>Plausible.Shield</b></font>>\n    \"Plausible.Shield.CountryRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.CountryRule   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>shield_rules_country</i></font></td></tr><tr><td align='left' port='field@id'>:id               <i><font color='gray54'>:binary_id                 </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id          <i><font color='gray54'>:id                        </font></i></td></tr><tr><td align='left' port='field@country_code'>:country_code     <i><font color='gray54'>:string                    </font></i></td></tr><tr><td align='left' port='field@action'>:action           <i><font color='gray54'>#Enum&lt;[:allow, :deny]&gt;     </font></i></td></tr><tr><td align='left' port='field@added_by'>:added_by         <i><font color='gray54'>:string                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at      <i><font color='gray54'>:naive_datetime            </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at       <i><font color='gray54'>:naive_datetime            </font></i></td></tr></table>>]\n  \"Plausible.Shield.HostnameRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.HostnameRule   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>shield_rules_hostname</i></font></td></tr><tr><td align='left' port='field@id'>:id                   <i><font color='gray54'>:binary_id                             </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id              <i><font color='gray54'>:id                                    </font></i></td></tr><tr><td align='left' port='field@hostname'>:hostname             <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@hostname_pattern'>:hostname_pattern     <i><font color='gray54'>Plausible.Ecto.Types.CompiledRegex     </font></i></td></tr><tr><td align='left' port='field@action'>:action               <i><font color='gray54'>#Enum&lt;[:allow, :deny]&gt;                 </font></i></td></tr><tr><td align='left' port='field@added_by'>:added_by             <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at          <i><font color='gray54'>:naive_datetime                        </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at           <i><font color='gray54'>:naive_datetime                        </font></i></td></tr></table>>]\n  \"Plausible.Shield.IPRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.IPRule   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>shield_rules_ip</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id                 </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                        </font></i></td></tr><tr><td align='left' port='field@inet'>:inet            <i><font color='gray54'>EctoNetwork.INET           </font></i></td></tr><tr><td align='left' port='field@action'>:action          <i><font color='gray54'>#Enum&lt;[:allow, :deny]&gt;     </font></i></td></tr><tr><td align='left' port='field@description'>:description     <i><font color='gray54'>:string                    </font></i></td></tr><tr><td align='left' port='field@added_by'>:added_by        <i><font color='gray54'>:string                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime            </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime            </font></i></td></tr></table>>]\n  \"Plausible.Shield.PageRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.PageRule   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>shield_rules_page</i></font></td></tr><tr><td align='left' port='field@id'>:id                    <i><font color='gray54'>:binary_id                             </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id               <i><font color='gray54'>:id                                    </font></i></td></tr><tr><td align='left' port='field@page_path'>:page_path             <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@page_path_pattern'>:page_path_pattern     <i><font color='gray54'>Plausible.Ecto.Types.CompiledRegex     </font></i></td></tr><tr><td align='left' port='field@action'>:action                <i><font color='gray54'>#Enum&lt;[:allow, :deny]&gt;                 </font></i></td></tr><tr><td align='left' port='field@added_by'>:added_by              <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at           <i><font color='gray54'>:naive_datetime                        </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at            <i><font color='gray54'>:naive_datetime                        </font></i></td></tr></table>>]\n  }\n  subgraph \"cluster_Plausible.Site\" {\n    style=filled\n    fontname=\"Roboto Mono\"\n    color = \"#f0f8ff\"\n    label = <<font point-size='24'><b>Plausible.Site</b></font>>\n    \"Plausible.Site.GoogleAuth\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.GoogleAuth   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>google_auth</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@email'>:email             <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@property'>:property          <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@refresh_token'>:refresh_token     <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@access_token'>:access_token      <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@expires'>:expires           <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id           <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id           <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Plausible.Site.ImportedData\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Plausible.Site.ImportedData   </font></td></tr><tr><td align='left' port='field@id'>:id             <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@start_date'>:start_date     <i><font color='gray54'>:date          </font></i></td></tr><tr><td align='left' port='field@end_date'>:end_date       <i><font color='gray54'>:date          </font></i></td></tr><tr><td align='left' port='field@source'>:source         <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@status'>:status         <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  \"Plausible.Site.Membership\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.Membership   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>site_memberships</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                                  </font></i></td></tr><tr><td align='left' port='field@role'>:role            <i><font color='gray54'>#Enum&lt;[:admin, :owner, :viewer]&gt;     </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                                  </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id         <i><font color='gray54'>:id                                  </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime                      </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime                      </font></i></td></tr></table>>]\n  \"Plausible.Site.MonthlyReport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.MonthlyReport   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>monthly_reports</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@recipients'>:recipients      <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime       </font></i></td></tr></table>>]\n  \"Plausible.Site.SharedLink\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.SharedLink   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>shared_links</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id           <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@name'>:name              <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@slug'>:slug              <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@password_hash'>:password_hash     <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Plausible.Site.SpikeNotification\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.SpikeNotification   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>spike_notifications</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@recipients'>:recipients      <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@threshold'>:threshold       <i><font color='gray54'>:integer              </font></i></td></tr><tr><td align='left' port='field@last_sent'>:last_sent       <i><font color='gray54'>:naive_datetime       </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime       </font></i></td></tr></table>>]\n  \"Plausible.Site.UserPreference\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.UserPreference   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>site_user_preferences</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@pinned_at'>:pinned_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Plausible.Site.WeeklyReport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.WeeklyReport   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>weekly_reports</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@recipients'>:recipients      <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime       </font></i></td></tr></table>>]\n  }\n\n  \"Plausible.Funnel\":\"field@id\":e -> \"Plausible.Funnel.Step\":\"field@funnel_id\":w\n  \"Plausible.Goal\":\"field@id\":e -> \"Plausible.Funnel.Step\":\"field@goal_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Funnel\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Goal\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.GoogleAuth\":\"field@site_id\":w [dir=none]\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Auth.Invitation\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.MonthlyReport\":\"field@site_id\":w [dir=none]\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Plugins.API.Token\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.SharedLink\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Shield.CountryRule\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Shield.HostnameRule\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Shield.IPRule\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Shield.PageRule\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Imported.SiteImport\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.Membership\":\"field@site_id\":w [dir=none]\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.UserPreference\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.SpikeNotification\":\"field@site_id\":w [dir=none]\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.WeeklyReport\":\"field@site_id\":w [dir=none]\n  \"Plausible.Site\":\"field@imported_data\":e -> \"Plausible.Site.ImportedData\":\"header@schema_module\":w [dir=none]\n  \"Plausible.Auth.User\":\"field@grace_period\":e -> \"Plausible.Auth.GracePeriod\":\"header@schema_module\":w [dir=none]\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Auth.ApiKey\":\"field@user_id\":w\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Auth.EmailActivationCode\":\"field@user_id\":w\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Billing.EnterprisePlan\":\"field@user_id\":w [dir=none]\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Site.GoogleAuth\":\"field@user_id\":w [dir=none]\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Auth.Invitation\":\"field@inviter_id\":w\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Imported.SiteImport\":\"field@imported_by_id\":w\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Site.Membership\":\"field@user_id\":w\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Site.UserPreference\":\"field@user_id\":w\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Billing.Subscription\":\"field@user_id\":w [dir=none]\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Auth.TOTP.RecoveryCode\":\"field@user_id\":w\n}\n"
  },
  {
    "path": "examples/dot/plausible-analytics/Default.dot",
    "content": "digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \"Ecto.Migration.SchemaMigration\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Ecto.Migration.SchemaMigration   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>schema_migrations</i></font></td></tr><tr><td align='left' port='field@version'>:version         <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"FunWithFlags.Store.Persistent.Ecto.Record\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   FunWithFlags.Store.Persistent.Ecto.Record   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>fun_with_flags_toggles</i></font></td></tr><tr><td align='left' port='field@id'>:id            <i><font color='gray54'>:id          </font></i></td></tr><tr><td align='left' port='field@flag_name'>:flag_name     <i><font color='gray54'>:string      </font></i></td></tr><tr><td align='left' port='field@gate_type'>:gate_type     <i><font color='gray54'>:string      </font></i></td></tr><tr><td align='left' port='field@target'>:target        <i><font color='gray54'>:string      </font></i></td></tr><tr><td align='left' port='field@enabled'>:enabled       <i><font color='gray54'>:boolean     </font></i></td></tr></table>>]\n  \"Oban.Job\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Oban.Job   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>oban_jobs</i></font></td></tr><tr><td align='left' port='field@id'>:id               <i><font color='gray54'>:id                    </font></i></td></tr><tr><td align='left' port='field@state'>:state            <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@queue'>:queue            <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@worker'>:worker           <i><font color='gray54'>:string                </font></i></td></tr><tr><td align='left' port='field@args'>:args             <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@meta'>:meta             <i><font color='gray54'>:map                   </font></i></td></tr><tr><td align='left' port='field@tags'>:tags             <i><font color='gray54'>{:array, :string}      </font></i></td></tr><tr><td align='left' port='field@errors'>:errors           <i><font color='gray54'>{:array, :map}         </font></i></td></tr><tr><td align='left' port='field@attempt'>:attempt          <i><font color='gray54'>:integer               </font></i></td></tr><tr><td align='left' port='field@attempted_by'>:attempted_by     <i><font color='gray54'>{:array, :string}      </font></i></td></tr><tr><td align='left' port='field@max_attempts'>:max_attempts     <i><font color='gray54'>:integer               </font></i></td></tr><tr><td align='left' port='field@priority'>:priority         <i><font color='gray54'>:integer               </font></i></td></tr><tr><td align='left' port='field@attempted_at'>:attempted_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@cancelled_at'>:cancelled_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@completed_at'>:completed_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@discarded_at'>:discarded_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at      <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr><tr><td align='left' port='field@scheduled_at'>:scheduled_at     <i><font color='gray54'>:utc_datetime_usec     </font></i></td></tr></table>>]\n  \"Plausible.Auth.ApiKey\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.ApiKey   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>api_keys</i></font></td></tr><tr><td align='left' port='field@id'>:id                       <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@name'>:name                     <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@scopes'>:scopes                   <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@hourly_request_limit'>:hourly_request_limit     <i><font color='gray54'>:integer              </font></i></td></tr><tr><td align='left' port='field@key_hash'>:key_hash                 <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@key_prefix'>:key_prefix               <i><font color='gray54'>:string               </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                  <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at              <i><font color='gray54'>:naive_datetime       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at               <i><font color='gray54'>:naive_datetime       </font></i></td></tr></table>>]\n  \"Plausible.Auth.EmailActivationCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.EmailActivationCode   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>email_activation_codes</i></font></td></tr><tr><td align='left' port='field@id'>:id            <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@code'>:code          <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@issued_at'>:issued_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id       <i><font color='gray54'>:id                 </font></i></td></tr></table>>]\n  \"Plausible.Auth.GracePeriod\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Plausible.Auth.GracePeriod   </font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@end_date'>:end_date        <i><font color='gray54'>:date          </font></i></td></tr><tr><td align='left' port='field@is_over'>:is_over         <i><font color='gray54'>:boolean       </font></i></td></tr><tr><td align='left' port='field@manual_lock'>:manual_lock     <i><font color='gray54'>:boolean       </font></i></td></tr></table>>]\n  \"Plausible.Auth.Invitation\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.Invitation   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>invitations</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                                  </font></i></td></tr><tr><td align='left' port='field@invitation_id'>:invitation_id     <i><font color='gray54'>:string                              </font></i></td></tr><tr><td align='left' port='field@email'>:email             <i><font color='gray54'>:string                              </font></i></td></tr><tr><td align='left' port='field@role'>:role              <i><font color='gray54'>#Enum&lt;[:admin, :owner, :viewer]&gt;     </font></i></td></tr><tr><td align='left' port='field@inviter_id'>:inviter_id        <i><font color='gray54'>:id                                  </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id           <i><font color='gray54'>:id                                  </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime                      </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime                      </font></i></td></tr></table>>]\n  \"Plausible.Auth.TOTP.RecoveryCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.TOTP.RecoveryCode   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>totp_recovery_codes</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@code_digest'>:code_digest     <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Plausible.Auth.User\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.User   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>users</i></font></td></tr><tr><td align='left' port='field@id'>:id                              <i><font color='gray54'>:id                                                   </font></i></td></tr><tr><td align='left' port='field@email'>:email                           <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@password_hash'>:password_hash                   <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@name'>:name                            <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@last_seen'>:last_seen                       <i><font color='gray54'>:naive_datetime                                       </font></i></td></tr><tr><td align='left' port='field@trial_expiry_date'>:trial_expiry_date               <i><font color='gray54'>:date                                                 </font></i></td></tr><tr><td align='left' port='field@theme'>:theme                           <i><font color='gray54'>#Enum&lt;[:dark, :light, :system]&gt;                       </font></i></td></tr><tr><td align='left' port='field@email_verified'>:email_verified                  <i><font color='gray54'>:boolean                                              </font></i></td></tr><tr><td align='left' port='field@previous_email'>:previous_email                  <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@accept_traffic_until'>:accept_traffic_until            <i><font color='gray54'>:date                                                 </font></i></td></tr><tr><td align='left' port='field@allow_next_upgrade_override'>:allow_next_upgrade_override     <i><font color='gray54'>:boolean                                              </font></i></td></tr><tr><td align='left' port='field@totp_enabled'>:totp_enabled                    <i><font color='gray54'>:boolean                                              </font></i></td></tr><tr><td align='left' port='field@totp_secret'>:totp_secret                     <i><font color='gray54'>Plausible.Auth.TOTP.EncryptedBinary                   </font></i></td></tr><tr><td align='left' port='field@totp_token'>:totp_token                      <i><font color='gray54'>:string                                               </font></i></td></tr><tr><td align='left' port='field@totp_last_used_at'>:totp_last_used_at               <i><font color='gray54'>:naive_datetime                                       </font></i></td></tr><tr><td align='left' port='field@grace_period'>:grace_period                    <i><font color='gray54'>#Ecto.Embedded&lt;[one: Plausible.Auth.GracePeriod]&gt;     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at                     <i><font color='gray54'>:naive_datetime                                       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at                      <i><font color='gray54'>:naive_datetime                                       </font></i></td></tr></table>>]\n  \"Plausible.Billing.EnterprisePlan\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Billing.EnterprisePlan   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>enterprise_plans</i></font></td></tr><tr><td align='left' port='field@id'>:id                           <i><font color='gray54'>:id                                    </font></i></td></tr><tr><td align='left' port='field@paddle_plan_id'>:paddle_plan_id               <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@billing_interval'>:billing_interval             <i><font color='gray54'>#Enum&lt;[:monthly, :yearly]&gt;             </font></i></td></tr><tr><td align='left' port='field@monthly_pageview_limit'>:monthly_pageview_limit       <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@site_limit'>:site_limit                   <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@team_member_limit'>:team_member_limit            <i><font color='gray54'>Plausible.Billing.Ecto.Limit           </font></i></td></tr><tr><td align='left' port='field@features'>:features                     <i><font color='gray54'>Plausible.Billing.Ecto.FeatureList     </font></i></td></tr><tr><td align='left' port='field@hourly_api_request_limit'>:hourly_api_request_limit     <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                      <i><font color='gray54'>:id                                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at                  <i><font color='gray54'>:naive_datetime                        </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at                   <i><font color='gray54'>:naive_datetime                        </font></i></td></tr></table>>]\n  \"Plausible.Billing.Plan\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Plausible.Billing.Plan   </font></td></tr><tr><td align='left' port='field@id'>:id                          <i><font color='gray54'>:binary_id                             </font></i></td></tr><tr><td align='left' port='field@generation'>:generation                  <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@kind'>:kind                        <i><font color='gray54'>#Enum&lt;[:business, :growth]&gt;            </font></i></td></tr><tr><td align='left' port='field@features'>:features                    <i><font color='gray54'>Plausible.Billing.Ecto.FeatureList     </font></i></td></tr><tr><td align='left' port='field@monthly_pageview_limit'>:monthly_pageview_limit      <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@site_limit'>:site_limit                  <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@team_member_limit'>:team_member_limit           <i><font color='gray54'>Plausible.Billing.Ecto.Limit           </font></i></td></tr><tr><td align='left' port='field@volume'>:volume                      <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@data_retention_in_years'>:data_retention_in_years     <i><font color='gray54'>:integer                               </font></i></td></tr><tr><td align='left' port='field@monthly_cost'>:monthly_cost                <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@monthly_product_id'>:monthly_product_id          <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@yearly_cost'>:yearly_cost                 <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@yearly_product_id'>:yearly_product_id           <i><font color='gray54'>:string                                </font></i></td></tr></table>>]\n  \"Plausible.Billing.Subscription\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Billing.Subscription   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>subscriptions</i></font></td></tr><tr><td align='left' port='field@id'>:id                         <i><font color='gray54'>:id                                                </font></i></td></tr><tr><td align='left' port='field@paddle_subscription_id'>:paddle_subscription_id     <i><font color='gray54'>:string                                            </font></i></td></tr><tr><td align='left' port='field@paddle_plan_id'>:paddle_plan_id             <i><font color='gray54'>:string                                            </font></i></td></tr><tr><td align='left' port='field@update_url'>:update_url                 <i><font color='gray54'>:string                                            </font></i></td></tr><tr><td align='left' port='field@cancel_url'>:cancel_url                 <i><font color='gray54'>:string                                            </font></i></td></tr><tr><td align='left' port='field@status'>:status                     <i><font color='gray54'>#Enum&lt;[:active, :deleted, :past_due, :paused]&gt;     </font></i></td></tr><tr><td align='left' port='field@next_bill_amount'>:next_bill_amount           <i><font color='gray54'>:string                                            </font></i></td></tr><tr><td align='left' port='field@next_bill_date'>:next_bill_date             <i><font color='gray54'>:date                                              </font></i></td></tr><tr><td align='left' port='field@last_bill_date'>:last_bill_date             <i><font color='gray54'>:date                                              </font></i></td></tr><tr><td align='left' port='field@currency_code'>:currency_code              <i><font color='gray54'>:string                                            </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                    <i><font color='gray54'>:id                                                </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at                <i><font color='gray54'>:naive_datetime                                    </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at                 <i><font color='gray54'>:naive_datetime                                    </font></i></td></tr></table>>]\n  \"Plausible.ClickhouseEventV2\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.ClickhouseEventV2   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>events_v2</i></font></td></tr><tr><td align='left' port='field@name'>:name                           <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id                        <i><font color='gray54'>{:parameterized, Ch, :u64}                             </font></i></td></tr><tr><td align='left' port='field@hostname'>:hostname                       <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@pathname'>:pathname                       <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                        <i><font color='gray54'>{:parameterized, Ch, :u64}                             </font></i></td></tr><tr><td align='left' port='field@session_id'>:session_id                     <i><font color='gray54'>{:parameterized, Ch, :u64}                             </font></i></td></tr><tr><td align='left' port='field@timestamp'>:timestamp                      <i><font color='gray54'>:naive_datetime                                        </font></i></td></tr><tr><td align='left' port='field@meta.key'>:&quot;meta.key&quot;                     <i><font color='gray54'>{:array, :string}                                      </font></i></td></tr><tr><td align='left' port='field@meta.value'>:&quot;meta.value&quot;                   <i><font color='gray54'>{:array, :string}                                      </font></i></td></tr><tr><td align='left' port='field@revenue_source_amount'>:revenue_source_amount          <i><font color='gray54'>{:parameterized, Ch, {:nullable, {:decimal64, 3}}}     </font></i></td></tr><tr><td align='left' port='field@revenue_source_currency'>:revenue_source_currency        <i><font color='gray54'>{:parameterized, Ch, {:fixed_string, 3}}               </font></i></td></tr><tr><td align='left' port='field@revenue_reporting_amount'>:revenue_reporting_amount       <i><font color='gray54'>{:parameterized, Ch, {:nullable, {:decimal64, 3}}}     </font></i></td></tr><tr><td align='left' port='field@revenue_reporting_currency'>:revenue_reporting_currency     <i><font color='gray54'>{:parameterized, Ch, {:fixed_string, 3}}               </font></i></td></tr><tr><td align='left' port='field@referrer'>:referrer                       <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@referrer_source'>:referrer_source                <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@utm_medium'>:utm_medium                     <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@utm_source'>:utm_source                     <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@utm_campaign'>:utm_campaign                   <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@utm_content'>:utm_content                    <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@utm_term'>:utm_term                       <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@country_code'>:country_code                   <i><font color='gray54'>{:parameterized, Ch, {:fixed_string, 2}}               </font></i></td></tr><tr><td align='left' port='field@subdivision1_code'>:subdivision1_code              <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@subdivision2_code'>:subdivision2_code              <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@city_geoname_id'>:city_geoname_id                <i><font color='gray54'>{:parameterized, Ch, :u32}                             </font></i></td></tr><tr><td align='left' port='field@screen_size'>:screen_size                    <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@operating_system'>:operating_system               <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@operating_system_version'>:operating_system_version       <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@browser'>:browser                        <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr><tr><td align='left' port='field@browser_version'>:browser_version                <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}      </font></i></td></tr></table>>]\n  \"Plausible.ClickhouseSessionV2\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.ClickhouseSessionV2   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>sessions_v2</i></font></td></tr><tr><td align='left' port='field@hostname'>:hostname                     <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id                      <i><font color='gray54'>{:parameterized, Ch, :u64}                                       </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id                      <i><font color='gray54'>{:parameterized, Ch, :u64}                                       </font></i></td></tr><tr><td align='left' port='field@session_id'>:session_id                   <i><font color='gray54'>{:parameterized, Ch, :u64}                                       </font></i></td></tr><tr><td align='left' port='field@start'>:start                        <i><font color='gray54'>:naive_datetime                                                  </font></i></td></tr><tr><td align='left' port='field@duration'>:duration                     <i><font color='gray54'>{:parameterized, Ch, :u32}                                       </font></i></td></tr><tr><td align='left' port='field@is_bounce'>:is_bounce                    <i><font color='gray54'>Plausible.ClickhouseSessionV2.BoolUInt8                          </font></i></td></tr><tr><td align='left' port='field@entry_page'>:entry_page                   <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@exit_page'>:exit_page                    <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@exit_page_hostname'>:exit_page_hostname           <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews                    <i><font color='gray54'>{:parameterized, Ch, :i32}                                       </font></i></td></tr><tr><td align='left' port='field@events'>:events                       <i><font color='gray54'>{:parameterized, Ch, :i32}                                       </font></i></td></tr><tr><td align='left' port='field@sign'>:sign                         <i><font color='gray54'>{:parameterized, Ch, :i8}                                        </font></i></td></tr><tr><td align='left' port='field@entry_meta.key'>:&quot;entry_meta.key&quot;             <i><font color='gray54'>{:array, :string}                                                </font></i></td></tr><tr><td align='left' port='field@entry_meta.value'>:&quot;entry_meta.value&quot;           <i><font color='gray54'>{:array, :string}                                                </font></i></td></tr><tr><td align='left' port='field@utm_medium'>:utm_medium                   <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@utm_source'>:utm_source                   <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@utm_campaign'>:utm_campaign                 <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@utm_content'>:utm_content                  <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@utm_term'>:utm_term                     <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@referrer'>:referrer                     <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@referrer_source'>:referrer_source              <i><font color='gray54'>:string                                                          </font></i></td></tr><tr><td align='left' port='field@country_code'>:country_code                 <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, {:fixed_string, 2}}}     </font></i></td></tr><tr><td align='left' port='field@subdivision1_code'>:subdivision1_code            <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@subdivision2_code'>:subdivision2_code            <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@city_geoname_id'>:city_geoname_id              <i><font color='gray54'>{:parameterized, Ch, :u32}                                       </font></i></td></tr><tr><td align='left' port='field@screen_size'>:screen_size                  <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@operating_system'>:operating_system             <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@operating_system_version'>:operating_system_version     <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@browser'>:browser                      <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@browser_version'>:browser_version              <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}                </font></i></td></tr><tr><td align='left' port='field@timestamp'>:timestamp                    <i><font color='gray54'>:naive_datetime                                                  </font></i></td></tr><tr><td align='left' port='field@transferred_from'>:transferred_from             <i><font color='gray54'>:string                                                          </font></i></td></tr></table>>]\n  \"Plausible.DataMigration.NumericIDs.DomainsLookup\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.DataMigration.NumericIDs.DomainsLookup   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>domains_lookup</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@domain'>:domain      <i><font color='gray54'>:string                        </font></i></td></tr></table>>]\n  \"Plausible.Funnel\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Funnel   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>funnels</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@name'>:name            <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Plausible.Funnel.Step\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Funnel.Step   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>funnel_steps</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@step_order'>:step_order      <i><font color='gray54'>:integer            </font></i></td></tr><tr><td align='left' port='field@funnel_id'>:funnel_id       <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@goal_id'>:goal_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Plausible.Goal\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Goal   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>goals</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                                                                          </font></i></td></tr><tr><td align='left' port='field@event_name'>:event_name      <i><font color='gray54'>:string                                                                      </font></i></td></tr><tr><td align='left' port='field@page_path'>:page_path       <i><font color='gray54'>:string                                                                      </font></i></td></tr><tr><td align='left' port='field@currency'>:currency        <i><font color='gray54'>#Enum&lt;[:AED, :AFN, :ALL, :AMD, :ANG, :AOA, :ARS, :AUD, :AWG, :AZN, ...]&gt;     </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                                                                          </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime                                                              </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime                                                              </font></i></td></tr></table>>]\n  \"Plausible.Imported.Browser\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Browser   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_browsers</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id             <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date                <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@browser'>:browser             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@browser_version'>:browser_version     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visits'>:visits              <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration      <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces             <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.Device\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Device   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_devices</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date               <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@device'>:device             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visits'>:visits             <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces            <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.EntryPage\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.EntryPage   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_entry_pages</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date               <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@entry_page'>:entry_page         <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@entrances'>:entrances          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces            <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.ExitPage\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.ExitPage   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_exit_pages</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date               <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@exit_page'>:exit_page          <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@exits'>:exits              <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces            <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.Location\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Location   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_locations</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date               <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@country'>:country            <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@region'>:region             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@city'>:city               <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visits'>:visits             <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces            <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.OperatingSystem\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.OperatingSystem   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_operating_systems</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id                      <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id                    <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date                         <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@operating_system'>:operating_system             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@operating_system_version'>:operating_system_version     <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors                     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visits'>:visits                       <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration               <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews                    <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces                      <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.Page\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Page   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_pages</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id             <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date                <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@hostname'>:hostname            <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@page'>:page                <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@visits'>:visits              <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@active_visitors'>:active_visitors     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@exits'>:exits               <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@time_on_page'>:time_on_page        <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.SiteImport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.SiteImport   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>site_imports</i></font></td></tr><tr><td align='left' port='field@id'>:id                 <i><font color='gray54'>:id                                                                 </font></i></td></tr><tr><td align='left' port='field@start_date'>:start_date         <i><font color='gray54'>:date                                                               </font></i></td></tr><tr><td align='left' port='field@end_date'>:end_date           <i><font color='gray54'>:date                                                               </font></i></td></tr><tr><td align='left' port='field@label'>:label              <i><font color='gray54'>:string                                                             </font></i></td></tr><tr><td align='left' port='field@source'>:source             <i><font color='gray54'>#Enum&lt;[:csv, :google_analytics_4, :noop, :universal_analytics]&gt;     </font></i></td></tr><tr><td align='left' port='field@status'>:status             <i><font color='gray54'>#Enum&lt;[:completed, :failed, :importing, :pending]&gt;                  </font></i></td></tr><tr><td align='left' port='field@legacy'>:legacy             <i><font color='gray54'>:boolean                                                            </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>:id                                                                 </font></i></td></tr><tr><td align='left' port='field@imported_by_id'>:imported_by_id     <i><font color='gray54'>:id                                                                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at        <i><font color='gray54'>:naive_datetime                                                     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at         <i><font color='gray54'>:naive_datetime                                                     </font></i></td></tr></table>>]\n  \"Plausible.Imported.Source\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Source   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_sources</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date               <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@source'>:source             <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@referrer'>:referrer           <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@utm_source'>:utm_source         <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@utm_medium'>:utm_medium         <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@utm_campaign'>:utm_campaign       <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@utm_content'>:utm_content        <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@utm_term'>:utm_term           <i><font color='gray54'>:string                        </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visits'>:visits             <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces            <i><font color='gray54'>{:parameterized, Ch, :u32}     </font></i></td></tr></table>>]\n  \"Plausible.Imported.Visitor\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Visitor   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>imported_visitors</i></font></td></tr><tr><td align='left' port='field@site_id'>:site_id            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@import_id'>:import_id          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@date'>:date               <i><font color='gray54'>:date                          </font></i></td></tr><tr><td align='left' port='field@visitors'>:visitors           <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@pageviews'>:pageviews          <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@bounces'>:bounces            <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visits'>:visits             <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr><tr><td align='left' port='field@visit_duration'>:visit_duration     <i><font color='gray54'>{:parameterized, Ch, :u64}     </font></i></td></tr></table>>]\n  \"Plausible.Ingestion.Counters.Record\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Ingestion.Counters.Record   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>ingest_counters</i></font></td></tr><tr><td align='left' port='field@event_timebucket'>:event_timebucket     <i><font color='gray54'>:utc_datetime                                         </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id              <i><font color='gray54'>{:parameterized, Ch, {:nullable, :u64}}               </font></i></td></tr><tr><td align='left' port='field@domain'>:domain               <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}     </font></i></td></tr><tr><td align='left' port='field@metric'>:metric               <i><font color='gray54'>{:parameterized, Ch, {:low_cardinality, :string}}     </font></i></td></tr><tr><td align='left' port='field@value'>:value                <i><font color='gray54'>{:parameterized, Ch, :u64}                            </font></i></td></tr></table>>]\n  \"Plausible.Ingestion.Request\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Plausible.Ingestion.Request   </font></td></tr><tr><td align='left' port='field@remote_ip'>:remote_ip             <i><font color='gray54'>:string                      </font></i></td></tr><tr><td align='left' port='field@user_agent'>:user_agent            <i><font color='gray54'>:string                      </font></i></td></tr><tr><td align='left' port='field@event_name'>:event_name            <i><font color='gray54'>Plausible.Ecto.EventName     </font></i></td></tr><tr><td align='left' port='field@uri'>:uri                   <i><font color='gray54'>:map                         </font></i></td></tr><tr><td align='left' port='field@hostname'>:hostname              <i><font color='gray54'>:string                      </font></i></td></tr><tr><td align='left' port='field@referrer'>:referrer              <i><font color='gray54'>:string                      </font></i></td></tr><tr><td align='left' port='field@domains'>:domains               <i><font color='gray54'>{:array, :string}            </font></i></td></tr><tr><td align='left' port='field@ip_classification'>:ip_classification     <i><font color='gray54'>:string                      </font></i></td></tr><tr><td align='left' port='field@hash_mode'>:hash_mode             <i><font color='gray54'>:integer                     </font></i></td></tr><tr><td align='left' port='field@pathname'>:pathname              <i><font color='gray54'>:string                      </font></i></td></tr><tr><td align='left' port='field@props'>:props                 <i><font color='gray54'>:map                         </font></i></td></tr><tr><td align='left' port='field@revenue_source'>:revenue_source        <i><font color='gray54'>:map                         </font></i></td></tr><tr><td align='left' port='field@query_params'>:query_params          <i><font color='gray54'>:map                         </font></i></td></tr><tr><td align='left' port='field@timestamp'>:timestamp             <i><font color='gray54'>:naive_datetime              </font></i></td></tr></table>>]\n  \"Plausible.Plugins.API.Token\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Plugins.API.Token   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>plugins_api_tokens</i></font></td></tr><tr><td align='left' port='field@id'>:id               <i><font color='gray54'>:binary_id          </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@token_hash'>:token_hash       <i><font color='gray54'>:binary             </font></i></td></tr><tr><td align='left' port='field@description'>:description      <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@hint'>:hint             <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@last_used_at'>:last_used_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id          <i><font color='gray54'>:id                 </font></i></td></tr></table>>]\n  \"Plausible.Shield.CountryRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.CountryRule   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>shield_rules_country</i></font></td></tr><tr><td align='left' port='field@id'>:id               <i><font color='gray54'>:binary_id                 </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id          <i><font color='gray54'>:id                        </font></i></td></tr><tr><td align='left' port='field@country_code'>:country_code     <i><font color='gray54'>:string                    </font></i></td></tr><tr><td align='left' port='field@action'>:action           <i><font color='gray54'>#Enum&lt;[:allow, :deny]&gt;     </font></i></td></tr><tr><td align='left' port='field@added_by'>:added_by         <i><font color='gray54'>:string                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at      <i><font color='gray54'>:naive_datetime            </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at       <i><font color='gray54'>:naive_datetime            </font></i></td></tr></table>>]\n  \"Plausible.Shield.HostnameRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.HostnameRule   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>shield_rules_hostname</i></font></td></tr><tr><td align='left' port='field@id'>:id                   <i><font color='gray54'>:binary_id                             </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id              <i><font color='gray54'>:id                                    </font></i></td></tr><tr><td align='left' port='field@hostname'>:hostname             <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@hostname_pattern'>:hostname_pattern     <i><font color='gray54'>Plausible.Ecto.Types.CompiledRegex     </font></i></td></tr><tr><td align='left' port='field@action'>:action               <i><font color='gray54'>#Enum&lt;[:allow, :deny]&gt;                 </font></i></td></tr><tr><td align='left' port='field@added_by'>:added_by             <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at          <i><font color='gray54'>:naive_datetime                        </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at           <i><font color='gray54'>:naive_datetime                        </font></i></td></tr></table>>]\n  \"Plausible.Shield.IPRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.IPRule   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>shield_rules_ip</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:binary_id                 </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                        </font></i></td></tr><tr><td align='left' port='field@inet'>:inet            <i><font color='gray54'>EctoNetwork.INET           </font></i></td></tr><tr><td align='left' port='field@action'>:action          <i><font color='gray54'>#Enum&lt;[:allow, :deny]&gt;     </font></i></td></tr><tr><td align='left' port='field@description'>:description     <i><font color='gray54'>:string                    </font></i></td></tr><tr><td align='left' port='field@added_by'>:added_by        <i><font color='gray54'>:string                    </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime            </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime            </font></i></td></tr></table>>]\n  \"Plausible.Shield.PageRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.PageRule   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>shield_rules_page</i></font></td></tr><tr><td align='left' port='field@id'>:id                    <i><font color='gray54'>:binary_id                             </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id               <i><font color='gray54'>:id                                    </font></i></td></tr><tr><td align='left' port='field@page_path'>:page_path             <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@page_path_pattern'>:page_path_pattern     <i><font color='gray54'>Plausible.Ecto.Types.CompiledRegex     </font></i></td></tr><tr><td align='left' port='field@action'>:action                <i><font color='gray54'>#Enum&lt;[:allow, :deny]&gt;                 </font></i></td></tr><tr><td align='left' port='field@added_by'>:added_by              <i><font color='gray54'>:string                                </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at           <i><font color='gray54'>:naive_datetime                        </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at            <i><font color='gray54'>:naive_datetime                        </font></i></td></tr></table>>]\n  \"Plausible.Site\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>sites</i></font></td></tr><tr><td align='left' port='field@id'>:id                                  <i><font color='gray54'>:id                                                    </font></i></td></tr><tr><td align='left' port='field@domain'>:domain                              <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@timezone'>:timezone                            <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@public'>:public                              <i><font color='gray54'>:boolean                                               </font></i></td></tr><tr><td align='left' port='field@locked'>:locked                              <i><font color='gray54'>:boolean                                               </font></i></td></tr><tr><td align='left' port='field@stats_start_date'>:stats_start_date                    <i><font color='gray54'>:date                                                  </font></i></td></tr><tr><td align='left' port='field@native_stats_start_at'>:native_stats_start_at               <i><font color='gray54'>:naive_datetime                                        </font></i></td></tr><tr><td align='left' port='field@allowed_event_props'>:allowed_event_props                 <i><font color='gray54'>{:array, :string}                                      </font></i></td></tr><tr><td align='left' port='field@conversions_enabled'>:conversions_enabled                 <i><font color='gray54'>:boolean                                               </font></i></td></tr><tr><td align='left' port='field@props_enabled'>:props_enabled                       <i><font color='gray54'>:boolean                                               </font></i></td></tr><tr><td align='left' port='field@funnels_enabled'>:funnels_enabled                     <i><font color='gray54'>:boolean                                               </font></i></td></tr><tr><td align='left' port='field@ingest_rate_limit_scale_seconds'>:ingest_rate_limit_scale_seconds     <i><font color='gray54'>:integer                                               </font></i></td></tr><tr><td align='left' port='field@ingest_rate_limit_threshold'>:ingest_rate_limit_threshold         <i><font color='gray54'>:integer                                               </font></i></td></tr><tr><td align='left' port='field@domain_changed_from'>:domain_changed_from                 <i><font color='gray54'>:string                                                </font></i></td></tr><tr><td align='left' port='field@domain_changed_at'>:domain_changed_at                   <i><font color='gray54'>:naive_datetime                                        </font></i></td></tr><tr><td align='left' port='field@imported_data'>:imported_data                       <i><font color='gray54'>#Ecto.Embedded&lt;[one: Plausible.Site.ImportedData]&gt;     </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at                         <i><font color='gray54'>:naive_datetime                                        </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at                          <i><font color='gray54'>:naive_datetime                                        </font></i></td></tr></table>>]\n  \"Plausible.Site.GoogleAuth\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.GoogleAuth   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>google_auth</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@email'>:email             <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@property'>:property          <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@refresh_token'>:refresh_token     <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@access_token'>:access_token      <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@expires'>:expires           <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id           <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id           <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Plausible.Site.ImportedData\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td border='1' sides='b' colspan='2' port='header@schema_module'><font point-size='18'>   Plausible.Site.ImportedData   </font></td></tr><tr><td align='left' port='field@id'>:id             <i><font color='gray54'>:binary_id     </font></i></td></tr><tr><td align='left' port='field@start_date'>:start_date     <i><font color='gray54'>:date          </font></i></td></tr><tr><td align='left' port='field@end_date'>:end_date       <i><font color='gray54'>:date          </font></i></td></tr><tr><td align='left' port='field@source'>:source         <i><font color='gray54'>:string        </font></i></td></tr><tr><td align='left' port='field@status'>:status         <i><font color='gray54'>:string        </font></i></td></tr></table>>]\n  \"Plausible.Site.Membership\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.Membership   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>site_memberships</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                                  </font></i></td></tr><tr><td align='left' port='field@role'>:role            <i><font color='gray54'>#Enum&lt;[:admin, :owner, :viewer]&gt;     </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                                  </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id         <i><font color='gray54'>:id                                  </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime                      </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime                      </font></i></td></tr></table>>]\n  \"Plausible.Site.MonthlyReport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.MonthlyReport   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>monthly_reports</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@recipients'>:recipients      <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime       </font></i></td></tr></table>>]\n  \"Plausible.Site.SharedLink\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.SharedLink   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>shared_links</i></font></td></tr><tr><td align='left' port='field@id'>:id                <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id           <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@name'>:name              <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@slug'>:slug              <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@password_hash'>:password_hash     <i><font color='gray54'>:string             </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at        <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Plausible.Site.SpikeNotification\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.SpikeNotification   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>spike_notifications</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@recipients'>:recipients      <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@threshold'>:threshold       <i><font color='gray54'>:integer              </font></i></td></tr><tr><td align='left' port='field@last_sent'>:last_sent       <i><font color='gray54'>:naive_datetime       </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime       </font></i></td></tr></table>>]\n  \"Plausible.Site.UserPreference\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.UserPreference   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>site_user_preferences</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@pinned_at'>:pinned_at       <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@user_id'>:user_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                 </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime     </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime     </font></i></td></tr></table>>]\n  \"Plausible.Site.WeeklyReport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.WeeklyReport   </font></td></tr><tr><td border='1' sides='b' colspan='2'><font point-size='14'><i>weekly_reports</i></font></td></tr><tr><td align='left' port='field@id'>:id              <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@recipients'>:recipients      <i><font color='gray54'>{:array, :string}     </font></i></td></tr><tr><td align='left' port='field@site_id'>:site_id         <i><font color='gray54'>:id                   </font></i></td></tr><tr><td align='left' port='field@inserted_at'>:inserted_at     <i><font color='gray54'>:naive_datetime       </font></i></td></tr><tr><td align='left' port='field@updated_at'>:updated_at      <i><font color='gray54'>:naive_datetime       </font></i></td></tr></table>>]\n\n  \"Plausible.Funnel\":\"field@id\":e -> \"Plausible.Funnel.Step\":\"field@funnel_id\":w\n  \"Plausible.Goal\":\"field@id\":e -> \"Plausible.Funnel.Step\":\"field@goal_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Funnel\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Goal\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.GoogleAuth\":\"field@site_id\":w [dir=none]\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Auth.Invitation\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.MonthlyReport\":\"field@site_id\":w [dir=none]\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Plugins.API.Token\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.SharedLink\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Shield.CountryRule\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Shield.HostnameRule\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Shield.IPRule\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Shield.PageRule\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Imported.SiteImport\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.Membership\":\"field@site_id\":w [dir=none]\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.UserPreference\":\"field@site_id\":w\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.SpikeNotification\":\"field@site_id\":w [dir=none]\n  \"Plausible.Site\":\"field@id\":e -> \"Plausible.Site.WeeklyReport\":\"field@site_id\":w [dir=none]\n  \"Plausible.Site\":\"field@imported_data\":e -> \"Plausible.Site.ImportedData\":\"header@schema_module\":w [dir=none]\n  \"Plausible.Auth.User\":\"field@grace_period\":e -> \"Plausible.Auth.GracePeriod\":\"header@schema_module\":w [dir=none]\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Auth.ApiKey\":\"field@user_id\":w\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Auth.EmailActivationCode\":\"field@user_id\":w\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Billing.EnterprisePlan\":\"field@user_id\":w [dir=none]\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Site.GoogleAuth\":\"field@user_id\":w [dir=none]\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Auth.Invitation\":\"field@inviter_id\":w\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Imported.SiteImport\":\"field@imported_by_id\":w\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Site.Membership\":\"field@user_id\":w\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Site.UserPreference\":\"field@user_id\":w\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Billing.Subscription\":\"field@user_id\":w [dir=none]\n  \"Plausible.Auth.User\":\"field@id\":e -> \"Plausible.Auth.TOTP.RecoveryCode\":\"field@user_id\":w\n}\n"
  },
  {
    "path": "examples/dot/plausible-analytics/No-fields.dot",
    "content": "strict digraph {\n  ranksep=1.0; rankdir=LR;\n  node [shape = none, fontname=\"Roboto Mono\"];\n  \"Ecto.Migration.SchemaMigration\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Ecto.Migration.SchemaMigration   </font></td></tr><tr><td><font point-size='14'><i>schema_migrations</i></font></td></tr></table>>]\n  \"FunWithFlags.Store.Persistent.Ecto.Record\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   FunWithFlags.Store.Persistent.Ecto.Record   </font></td></tr><tr><td><font point-size='14'><i>fun_with_flags_toggles</i></font></td></tr></table>>]\n  \"Oban.Job\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Oban.Job   </font></td></tr><tr><td><font point-size='14'><i>oban_jobs</i></font></td></tr></table>>]\n  \"Plausible.Auth.ApiKey\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.ApiKey   </font></td></tr><tr><td><font point-size='14'><i>api_keys</i></font></td></tr></table>>]\n  \"Plausible.Auth.EmailActivationCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.EmailActivationCode   </font></td></tr><tr><td><font point-size='14'><i>email_activation_codes</i></font></td></tr></table>>]\n  \"Plausible.Auth.GracePeriod\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.GracePeriod   </font></td></tr></table>>]\n  \"Plausible.Auth.Invitation\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.Invitation   </font></td></tr><tr><td><font point-size='14'><i>invitations</i></font></td></tr></table>>]\n  \"Plausible.Auth.TOTP.RecoveryCode\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.TOTP.RecoveryCode   </font></td></tr><tr><td><font point-size='14'><i>totp_recovery_codes</i></font></td></tr></table>>]\n  \"Plausible.Auth.User\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Auth.User   </font></td></tr><tr><td><font point-size='14'><i>users</i></font></td></tr></table>>]\n  \"Plausible.Billing.EnterprisePlan\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Billing.EnterprisePlan   </font></td></tr><tr><td><font point-size='14'><i>enterprise_plans</i></font></td></tr></table>>]\n  \"Plausible.Billing.Plan\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Billing.Plan   </font></td></tr></table>>]\n  \"Plausible.Billing.Subscription\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Billing.Subscription   </font></td></tr><tr><td><font point-size='14'><i>subscriptions</i></font></td></tr></table>>]\n  \"Plausible.ClickhouseEventV2\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.ClickhouseEventV2   </font></td></tr><tr><td><font point-size='14'><i>events_v2</i></font></td></tr></table>>]\n  \"Plausible.ClickhouseSessionV2\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.ClickhouseSessionV2   </font></td></tr><tr><td><font point-size='14'><i>sessions_v2</i></font></td></tr></table>>]\n  \"Plausible.DataMigration.NumericIDs.DomainsLookup\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.DataMigration.NumericIDs.DomainsLookup   </font></td></tr><tr><td><font point-size='14'><i>domains_lookup</i></font></td></tr></table>>]\n  \"Plausible.Funnel\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Funnel   </font></td></tr><tr><td><font point-size='14'><i>funnels</i></font></td></tr></table>>]\n  \"Plausible.Funnel.Step\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Funnel.Step   </font></td></tr><tr><td><font point-size='14'><i>funnel_steps</i></font></td></tr></table>>]\n  \"Plausible.Goal\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Goal   </font></td></tr><tr><td><font point-size='14'><i>goals</i></font></td></tr></table>>]\n  \"Plausible.Imported.Browser\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Browser   </font></td></tr><tr><td><font point-size='14'><i>imported_browsers</i></font></td></tr></table>>]\n  \"Plausible.Imported.Device\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Device   </font></td></tr><tr><td><font point-size='14'><i>imported_devices</i></font></td></tr></table>>]\n  \"Plausible.Imported.EntryPage\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.EntryPage   </font></td></tr><tr><td><font point-size='14'><i>imported_entry_pages</i></font></td></tr></table>>]\n  \"Plausible.Imported.ExitPage\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.ExitPage   </font></td></tr><tr><td><font point-size='14'><i>imported_exit_pages</i></font></td></tr></table>>]\n  \"Plausible.Imported.Location\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Location   </font></td></tr><tr><td><font point-size='14'><i>imported_locations</i></font></td></tr></table>>]\n  \"Plausible.Imported.OperatingSystem\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.OperatingSystem   </font></td></tr><tr><td><font point-size='14'><i>imported_operating_systems</i></font></td></tr></table>>]\n  \"Plausible.Imported.Page\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Page   </font></td></tr><tr><td><font point-size='14'><i>imported_pages</i></font></td></tr></table>>]\n  \"Plausible.Imported.SiteImport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.SiteImport   </font></td></tr><tr><td><font point-size='14'><i>site_imports</i></font></td></tr></table>>]\n  \"Plausible.Imported.Source\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Source   </font></td></tr><tr><td><font point-size='14'><i>imported_sources</i></font></td></tr></table>>]\n  \"Plausible.Imported.Visitor\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Imported.Visitor   </font></td></tr><tr><td><font point-size='14'><i>imported_visitors</i></font></td></tr></table>>]\n  \"Plausible.Ingestion.Counters.Record\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Ingestion.Counters.Record   </font></td></tr><tr><td><font point-size='14'><i>ingest_counters</i></font></td></tr></table>>]\n  \"Plausible.Ingestion.Request\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Ingestion.Request   </font></td></tr></table>>]\n  \"Plausible.Plugins.API.Token\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Plugins.API.Token   </font></td></tr><tr><td><font point-size='14'><i>plugins_api_tokens</i></font></td></tr></table>>]\n  \"Plausible.Shield.CountryRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.CountryRule   </font></td></tr><tr><td><font point-size='14'><i>shield_rules_country</i></font></td></tr></table>>]\n  \"Plausible.Shield.HostnameRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.HostnameRule   </font></td></tr><tr><td><font point-size='14'><i>shield_rules_hostname</i></font></td></tr></table>>]\n  \"Plausible.Shield.IPRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.IPRule   </font></td></tr><tr><td><font point-size='14'><i>shield_rules_ip</i></font></td></tr></table>>]\n  \"Plausible.Shield.PageRule\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Shield.PageRule   </font></td></tr><tr><td><font point-size='14'><i>shield_rules_page</i></font></td></tr></table>>]\n  \"Plausible.Site\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site   </font></td></tr><tr><td><font point-size='14'><i>sites</i></font></td></tr></table>>]\n  \"Plausible.Site.GoogleAuth\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.GoogleAuth   </font></td></tr><tr><td><font point-size='14'><i>google_auth</i></font></td></tr></table>>]\n  \"Plausible.Site.ImportedData\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.ImportedData   </font></td></tr></table>>]\n  \"Plausible.Site.Membership\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.Membership   </font></td></tr><tr><td><font point-size='14'><i>site_memberships</i></font></td></tr></table>>]\n  \"Plausible.Site.MonthlyReport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.MonthlyReport   </font></td></tr><tr><td><font point-size='14'><i>monthly_reports</i></font></td></tr></table>>]\n  \"Plausible.Site.SharedLink\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.SharedLink   </font></td></tr><tr><td><font point-size='14'><i>shared_links</i></font></td></tr></table>>]\n  \"Plausible.Site.SpikeNotification\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.SpikeNotification   </font></td></tr><tr><td><font point-size='14'><i>spike_notifications</i></font></td></tr></table>>]\n  \"Plausible.Site.UserPreference\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.UserPreference   </font></td></tr><tr><td><font point-size='14'><i>site_user_preferences</i></font></td></tr></table>>]\n  \"Plausible.Site.WeeklyReport\" [label= <<table align='left' border='1' style='rounded' cellspacing='0' cellpadding='4' cellborder='0'><tr><td port='header@schema_module'><font point-size='18'>   Plausible.Site.WeeklyReport   </font></td></tr><tr><td><font point-size='14'><i>weekly_reports</i></font></td></tr></table>>]\n\n  \"Plausible.Funnel\":e -> \"Plausible.Funnel.Step\":w\n  \"Plausible.Goal\":e -> \"Plausible.Funnel.Step\":w\n  \"Plausible.Site\":e -> \"Plausible.Funnel\":w\n  \"Plausible.Site\":e -> \"Plausible.Goal\":w\n  \"Plausible.Site\":e -> \"Plausible.Site.GoogleAuth\":w [dir=none]\n  \"Plausible.Site\":e -> \"Plausible.Auth.Invitation\":w\n  \"Plausible.Site\":e -> \"Plausible.Site.MonthlyReport\":w [dir=none]\n  \"Plausible.Site\":e -> \"Plausible.Plugins.API.Token\":w\n  \"Plausible.Site\":e -> \"Plausible.Site.SharedLink\":w\n  \"Plausible.Site\":e -> \"Plausible.Shield.CountryRule\":w\n  \"Plausible.Site\":e -> \"Plausible.Shield.HostnameRule\":w\n  \"Plausible.Site\":e -> \"Plausible.Shield.IPRule\":w\n  \"Plausible.Site\":e -> \"Plausible.Shield.PageRule\":w\n  \"Plausible.Site\":e -> \"Plausible.Imported.SiteImport\":w\n  \"Plausible.Site\":e -> \"Plausible.Site.Membership\":w [dir=none]\n  \"Plausible.Site\":e -> \"Plausible.Site.UserPreference\":w\n  \"Plausible.Site\":e -> \"Plausible.Site.SpikeNotification\":w [dir=none]\n  \"Plausible.Site\":e -> \"Plausible.Site.WeeklyReport\":w [dir=none]\n  \"Plausible.Site\":e -> \"Plausible.Site.ImportedData\":w [dir=none]\n  \"Plausible.Auth.User\":e -> \"Plausible.Auth.GracePeriod\":w [dir=none]\n  \"Plausible.Auth.User\":e -> \"Plausible.Auth.ApiKey\":w\n  \"Plausible.Auth.User\":e -> \"Plausible.Auth.EmailActivationCode\":w\n  \"Plausible.Auth.User\":e -> \"Plausible.Billing.EnterprisePlan\":w [dir=none]\n  \"Plausible.Auth.User\":e -> \"Plausible.Site.GoogleAuth\":w [dir=none]\n  \"Plausible.Auth.User\":e -> \"Plausible.Auth.Invitation\":w\n  \"Plausible.Auth.User\":e -> \"Plausible.Imported.SiteImport\":w\n  \"Plausible.Auth.User\":e -> \"Plausible.Site.Membership\":w\n  \"Plausible.Auth.User\":e -> \"Plausible.Site.UserPreference\":w\n  \"Plausible.Auth.User\":e -> \"Plausible.Billing.Subscription\":w [dir=none]\n  \"Plausible.Auth.User\":e -> \"Plausible.Auth.TOTP.RecoveryCode\":w\n}\n"
  },
  {
    "path": "examples/mermaid/changelog.com/Default.mmd",
    "content": "erDiagram\n  episodes {\n    integer id PK\n    varchar slug\n    varchar guid\n    varchar title\n    varchar subtitle\n    integer type\n    boolean featured\n    varchar highlight\n    varchar subhighlight\n    varchar summary\n    varchar notes\n    varchar doc_url\n    varchar socialize_url\n    boolean published\n    timestamp published_at\n    timestamp recorded_at\n    boolean recorded_live\n    varchar youtube_id\n    varchar cover\n    varchar audio_file\n    integer audio_bytes\n    integer audio_duration\n    jsonb audio_chapters\n    varchar plusplus_file\n    integer plusplus_bytes\n    integer plusplus_duration\n    jsonb plusplus_chapters\n    float download_count\n    float import_count\n    integer reach_count\n    varchar email_subject\n    varchar email_teaser\n    varchar email_content\n    integer email_sends\n    integer email_opens\n    array transcript\n    integer podcast_id\n    integer request_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  episode_guests {\n    integer id PK\n    integer position\n    boolean thanks\n    varchar discount_code\n    integer episode_id\n    integer person_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  episode_hosts {\n    integer id PK\n    integer position\n    integer person_id\n    integer episode_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  episode_requests {\n    integer id PK\n    integer status\n    varchar hosts\n    varchar guests\n    varchar topics\n    varchar pitch\n    varchar pronunciation\n    varchar message\n    integer podcast_id\n    integer submitter_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  episode_sponsors {\n    integer id PK\n    integer position\n    varchar title\n    varchar link_url\n    varchar description\n    float starts_at\n    float ends_at\n    integer episode_id\n    integer sponsor_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  episode_stats {\n    integer id PK\n    date date\n    integer episode_bytes\n    integer total_bytes\n    float downloads\n    integer uniques\n    jsonb demographics\n    integer episode_id\n    integer podcast_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  episode_topics {\n    integer id PK\n    integer position\n    integer topic_id\n    integer episode_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  feeds {\n    integer id PK\n    varchar name\n    varchar slug\n    varchar description\n    varchar title_format\n    boolean plusplus\n    boolean autosub\n    timestamp starts_at\n    varchar cover\n    array podcast_ids\n    array person_ids\n    integer owner_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  news_ads {\n    integer id PK\n    varchar url\n    varchar headline\n    varchar story\n    varchar image\n    boolean active\n    boolean newsletter\n    integer impression_count\n    integer click_count\n    integer sponsorship_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  news_issues {\n    integer id PK\n    varchar slug\n    varchar note\n    varchar teaser\n    boolean published\n    timestamp published_at\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  news_issue_ads {\n    integer id PK\n    integer position\n    boolean image\n    integer ad_id\n    integer issue_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  news_issue_items {\n    integer id PK\n    integer position\n    boolean image\n    integer issue_id\n    integer item_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  news_items {\n    integer id PK\n    integer status\n    integer type\n    varchar url\n    varchar headline\n    varchar story\n    varchar image\n    varchar object_id\n    boolean feed_only\n    boolean pinned\n    timestamp published_at\n    timestamp refreshed_at\n    integer impression_count\n    integer click_count\n    varchar message\n    integer author_id\n    integer logger_id\n    integer submitter_id\n    integer source_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  news_item_comments {\n    integer id PK\n    varchar content\n    boolean approved\n    timestamp edited_at\n    timestamp deleted_at\n    integer item_id\n    integer author_id\n    integer parent_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  news_item_topics {\n    integer id PK\n    integer position\n    integer item_id\n    integer topic_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  news_queue {\n    integer id PK\n    float position\n    integer item_id\n  }\n  news_sources {\n    integer id PK\n    varchar name\n    varchar slug\n    varchar website\n    varchar twitter_handle\n    varchar description\n    varchar feed\n    varchar regex\n    boolean publication\n    varchar icon\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  news_sponsorships {\n    integer id PK\n    varchar name\n    array weeks\n    integer impression_count\n    integer click_count\n    integer sponsor_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  people {\n    integer id PK\n    varchar name\n    varchar email\n    varchar handle\n    varchar github_handle\n    varchar linkedin_handle\n    varchar mastodon_handle\n    varchar twitter_handle\n    varchar slack_id\n    varchar website\n    varchar bio\n    varchar location\n    varchar auth_token\n    timestamp auth_token_expires_at\n    timestamp joined_at\n    timestamp signed_in_at\n    boolean approved\n    varchar avatar\n    boolean admin\n    boolean host\n    boolean editor\n    boolean public_profile\n    jsonb settings\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  podcasts {\n    integer id PK\n    varchar name\n    varchar slug\n    integer status\n    varchar welcome\n    varchar description\n    varchar extended_description\n    varchar vanity_domain\n    varchar keywords\n    varchar mastodon_handle\n    varchar twitter_handle\n    varchar apple_url\n    varchar spotify_url\n    varchar riverside_url\n    varchar chartable_id\n    varchar schedule_note\n    float download_count\n    integer reach_count\n    boolean recorded_live\n    boolean partner\n    integer position\n    jsonb subscribers\n    varchar cover\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  podcast_hosts {\n    integer id PK\n    integer position\n    boolean retired\n    integer person_id\n    integer podcast_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  podcast_topics {\n    integer id PK\n    integer position\n    integer podcast_id\n    integer topic_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  posts {\n    integer id PK\n    varchar title\n    varchar subtitle\n    varchar slug\n    varchar guid\n    varchar canonical_url\n    varchar image\n    varchar tldr\n    varchar body\n    boolean published\n    timestamp published_at\n    integer author_id\n    integer editor_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  post_topics {\n    integer id PK\n    integer position\n    integer topic_id\n    integer post_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  sponsors {\n    integer id PK\n    varchar name\n    varchar description\n    varchar website\n    varchar github_handle\n    varchar twitter_handle\n    varchar avatar\n    varchar color_logo\n    varchar dark_logo\n    varchar light_logo\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  sponsor_reps {\n    integer id PK\n    integer sponsor_id\n    integer person_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  subscriptions {\n    integer id PK\n    timestamp unsubscribed_at\n    varchar context\n    integer episode_id\n    integer item_id\n    integer person_id\n    integer podcast_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  topics {\n    integer id PK\n    varchar name\n    varchar slug\n    varchar description\n    varchar website\n    varchar twitter_handle\n    varchar icon\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  schema_migrations {\n    integer version PK\n    timestamp inserted_at\n  }\n  oban_jobs {\n    integer id PK\n    varchar state\n    varchar queue\n    varchar worker\n    jsonb args\n    jsonb meta\n    array tags\n    array errors\n    integer attempt\n    array attempted_by\n    integer max_attempts\n    integer priority\n    timestamp attempted_at\n    timestamp cancelled_at\n    timestamp completed_at\n    timestamp discarded_at\n    timestamp inserted_at\n    timestamp scheduled_at\n  }\n  episode_requests ||--o| episodes : \"\"\n  episodes ||--|{ episode_guests : \"\"\n  episodes ||--|{ episode_hosts : \"\"\n  episodes ||--|{ episode_sponsors : \"\"\n  episodes ||--|{ episode_stats : \"\"\n  episodes ||--|{ episode_topics : \"\"\n  episodes ||--|{ subscriptions : \"\"\n  news_ads ||--|{ news_issue_ads : \"\"\n  news_issues ||--|{ news_issue_ads : \"\"\n  news_issues ||--|{ news_issue_items : \"\"\n  news_item_comments ||--|{ news_item_comments : \"\"\n  news_items ||--|{ news_issue_items : \"\"\n  news_items ||--|{ news_item_comments : \"\"\n  news_items ||--|{ news_item_topics : \"\"\n  news_items ||--o| news_queue : \"\"\n  news_items ||--|{ subscriptions : \"\"\n  news_sources ||--|{ news_items : \"\"\n  news_sponsorships ||--|{ news_ads : \"\"\n  people ||--|{ episode_guests : \"\"\n  people ||--|{ episode_hosts : \"\"\n  people ||--|{ episode_requests : \"\"\n  people ||--|{ feeds : \"\"\n  people ||--|{ news_item_comments : \"\"\n  people ||--|{ news_items : \"\"\n  people ||--|{ news_items : \"\"\n  people ||--|{ news_items : \"\"\n  people ||--|{ podcast_hosts : \"\"\n  people ||--|{ posts : \"\"\n  people ||--|{ posts : \"\"\n  people ||--|{ sponsor_reps : \"\"\n  people ||--|{ subscriptions : \"\"\n  podcasts ||--|{ episode_requests : \"\"\n  podcasts ||--|{ episode_stats : \"\"\n  podcasts ||--|{ episodes : \"\"\n  podcasts ||--|{ podcast_hosts : \"\"\n  podcasts ||--|{ podcast_topics : \"\"\n  podcasts ||--|{ subscriptions : \"\"\n  posts ||--|{ post_topics : \"\"\n  sponsors ||--|{ episode_sponsors : \"\"\n  sponsors ||--|{ news_sponsorships : \"\"\n  sponsors ||--|{ sponsor_reps : \"\"\n  topics ||--|{ episode_topics : \"\"\n  topics ||--|{ news_item_topics : \"\"\n  topics ||--|{ podcast_topics : \"\"\n  topics ||--|{ post_topics : \"\"\n"
  },
  {
    "path": "examples/mermaid/changelog.com/No-fields.mmd",
    "content": "erDiagram\n  episodes\n  episode_guests\n  episode_hosts\n  episode_requests\n  episode_sponsors\n  episode_stats\n  episode_topics\n  feeds\n  news_ads\n  news_issues\n  news_issue_ads\n  news_issue_items\n  news_items\n  news_item_comments\n  news_item_topics\n  news_queue\n  news_sources\n  news_sponsorships\n  people\n  podcasts\n  podcast_hosts\n  podcast_topics\n  posts\n  post_topics\n  sponsors\n  sponsor_reps\n  subscriptions\n  topics\n  schema_migrations\n  oban_jobs\n  episode_requests ||--o| episodes : \"\"\n  episodes ||--|{ episode_guests : \"\"\n  episodes ||--|{ episode_hosts : \"\"\n  episodes ||--|{ episode_sponsors : \"\"\n  episodes ||--|{ episode_stats : \"\"\n  episodes ||--|{ episode_topics : \"\"\n  episodes ||--|{ subscriptions : \"\"\n  news_ads ||--|{ news_issue_ads : \"\"\n  news_issues ||--|{ news_issue_ads : \"\"\n  news_issues ||--|{ news_issue_items : \"\"\n  news_item_comments ||--|{ news_item_comments : \"\"\n  news_items ||--|{ news_issue_items : \"\"\n  news_items ||--|{ news_item_comments : \"\"\n  news_items ||--|{ news_item_topics : \"\"\n  news_items ||--o| news_queue : \"\"\n  news_items ||--|{ subscriptions : \"\"\n  news_sources ||--|{ news_items : \"\"\n  news_sponsorships ||--|{ news_ads : \"\"\n  people ||--|{ episode_guests : \"\"\n  people ||--|{ episode_hosts : \"\"\n  people ||--|{ episode_requests : \"\"\n  people ||--|{ feeds : \"\"\n  people ||--|{ news_item_comments : \"\"\n  people ||--|{ news_items : \"\"\n  people ||--|{ news_items : \"\"\n  people ||--|{ news_items : \"\"\n  people ||--|{ podcast_hosts : \"\"\n  people ||--|{ posts : \"\"\n  people ||--|{ posts : \"\"\n  people ||--|{ sponsor_reps : \"\"\n  people ||--|{ subscriptions : \"\"\n  podcasts ||--|{ episode_requests : \"\"\n  podcasts ||--|{ episode_stats : \"\"\n  podcasts ||--|{ episodes : \"\"\n  podcasts ||--|{ podcast_hosts : \"\"\n  podcasts ||--|{ podcast_topics : \"\"\n  podcasts ||--|{ subscriptions : \"\"\n  posts ||--|{ post_topics : \"\"\n  sponsors ||--|{ episode_sponsors : \"\"\n  sponsors ||--|{ news_sponsorships : \"\"\n  sponsors ||--|{ sponsor_reps : \"\"\n  topics ||--|{ episode_topics : \"\"\n  topics ||--|{ news_item_topics : \"\"\n  topics ||--|{ podcast_topics : \"\"\n  topics ||--|{ post_topics : \"\"\n"
  },
  {
    "path": "examples/mermaid/hexpm/Default.mmd",
    "content": "erDiagram\n  schema_migrations {\n    integer version PK\n    timestamp inserted_at\n  }\n  audit_logs {\n    integer id PK\n    varchar user_agent\n    varchar remote_ip\n    varchar action\n    jsonb params\n    integer user_id\n    integer organization_id\n    integer key_id\n    timestamp inserted_at\n  }\n  emails {\n    integer id PK\n    varchar email\n    boolean verified\n    boolean primary\n    boolean public\n    boolean gravatar\n    varchar verification_key\n    timestamp verification_expiry\n    integer user_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  keys {\n    integer id PK\n    varchar name\n    varchar secret_first\n    varchar secret_second\n    boolean public\n    timestamp revoke_at\n    timestamp inserted_at\n    timestamp updated_at\n    jsonb last_use\n    integer user_id\n    integer organization_id\n    jsonb permissions\n  }\n  organizations {\n    integer id PK\n    varchar name\n    boolean billing_active\n    boolean billing_override\n    timestamp trial_end\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  organization_users {\n    integer id PK\n    varchar role\n    integer organization_id\n    integer user_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  password_resets {\n    integer id PK\n    varchar key\n    varchar primary_email\n    integer user_id\n    timestamp inserted_at\n  }\n  sessions {\n    integer id PK\n    bytea token\n    jsonb data\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  users {\n    integer id PK\n    varchar username\n    varchar full_name\n    varchar password\n    boolean service\n    timestamp deactivated_at\n    varchar role\n    timestamp inserted_at\n    timestamp updated_at\n    jsonb handles\n    jsonb tfa\n    integer organization_id\n  }\n  blocked_addresses {\n    integer id PK\n    varchar ip\n    varchar comment\n  }\n  downloads {\n    integer id PK\n    integer package_id\n    integer release_id\n    integer downloads\n    date day\n  }\n  installs {\n    integer id PK\n    varchar hex\n    array elixirs\n  }\n  packages {\n    integer id PK\n    varchar name\n    timestamp docs_updated_at\n    timestamp inserted_at\n    timestamp updated_at\n    integer repository_id\n    jsonb meta\n  }\n  package_dependants {\n    integer id PK\n    integer package_id\n    varchar name\n    varchar repo\n  }\n  package_downloads {\n    integer package_id\n    varchar view\n    integer downloads\n  }\n  package_owners {\n    integer id PK\n    varchar level\n    integer package_id\n    integer user_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  package_reports {\n    integer id PK\n    varchar state\n    varchar description\n    integer author_id\n    integer package_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  package_report_comments {\n    integer id PK\n    varchar text\n    timestamp inserted_at\n    timestamp updated_at\n    integer package_report_id\n    integer author_id\n  }\n  package_report_releases {\n    integer id PK\n    integer release_id\n    integer package_report_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  releases {\n    integer id PK\n    varchar version\n    bytea inner_checksum\n    bytea outer_checksum\n    boolean has_docs\n    timestamp inserted_at\n    timestamp updated_at\n    integer package_id\n    integer publisher_id\n    jsonb meta\n    jsonb retirement\n  }\n  release_downloads {\n    integer package_id\n    integer release_id\n    integer downloads\n  }\n  repositories {\n    integer id PK\n    varchar name\n    timestamp inserted_at\n    timestamp updated_at\n    integer organization_id\n  }\n  requirements {\n    integer id PK\n    varchar app\n    varchar requirement\n    boolean optional\n    integer release_id\n    integer dependency_id\n  }\n  short_urls {\n    integer id PK\n    varchar url\n    varchar short_code\n    timestamp inserted_at\n  }\n  keys ||--|{ audit_logs : \"\"\n  organizations ||--|{ audit_logs : \"\"\n  organizations ||--|{ keys : \"\"\n  organizations ||--|{ organization_users : \"\"\n  organizations ||--o| repositories : \"\"\n  organizations ||--o| users : \"\"\n  package_reports ||--|{ package_report_comments : \"\"\n  package_reports ||--|{ package_report_releases : \"\"\n  packages ||--|{ downloads : \"\"\n  packages ||--|{ package_dependants : \"\"\n  packages ||--|{ package_downloads : \"\"\n  packages ||--|{ package_owners : \"\"\n  packages ||--|{ package_reports : \"\"\n  packages ||--|{ release_downloads : \"\"\n  packages ||--|{ releases : \"\"\n  packages ||--|{ requirements : \"\"\n  releases ||--|{ downloads : \"\"\n  releases ||--|{ package_report_releases : \"\"\n  releases ||--o| release_downloads : \"\"\n  releases ||--|{ requirements : \"\"\n  repositories ||--|{ packages : \"\"\n  users ||--|{ audit_logs : \"\"\n  users ||--|{ emails : \"\"\n  users ||--|{ keys : \"\"\n  users ||--|{ organization_users : \"\"\n  users ||--|{ package_owners : \"\"\n  users ||--|{ package_report_comments : \"\"\n  users ||--|{ package_reports : \"\"\n  users ||--|{ password_resets : \"\"\n  users ||--|{ releases : \"\"\n"
  },
  {
    "path": "examples/mermaid/hexpm/No-fields.mmd",
    "content": "erDiagram\n  schema_migrations\n  audit_logs\n  emails\n  keys\n  organizations\n  organization_users\n  password_resets\n  sessions\n  users\n  blocked_addresses\n  downloads\n  installs\n  packages\n  package_dependants\n  package_downloads\n  package_owners\n  package_reports\n  package_report_comments\n  package_report_releases\n  releases\n  release_downloads\n  repositories\n  requirements\n  short_urls\n  keys ||--|{ audit_logs : \"\"\n  organizations ||--|{ audit_logs : \"\"\n  organizations ||--|{ keys : \"\"\n  organizations ||--|{ organization_users : \"\"\n  organizations ||--o| repositories : \"\"\n  organizations ||--o| users : \"\"\n  package_reports ||--|{ package_report_comments : \"\"\n  package_reports ||--|{ package_report_releases : \"\"\n  packages ||--|{ downloads : \"\"\n  packages ||--|{ package_dependants : \"\"\n  packages ||--|{ package_downloads : \"\"\n  packages ||--|{ package_owners : \"\"\n  packages ||--|{ package_reports : \"\"\n  packages ||--|{ release_downloads : \"\"\n  packages ||--|{ releases : \"\"\n  packages ||--|{ requirements : \"\"\n  releases ||--|{ downloads : \"\"\n  releases ||--|{ package_report_releases : \"\"\n  releases ||--o| release_downloads : \"\"\n  releases ||--|{ requirements : \"\"\n  repositories ||--|{ packages : \"\"\n  users ||--|{ audit_logs : \"\"\n  users ||--|{ emails : \"\"\n  users ||--|{ keys : \"\"\n  users ||--|{ organization_users : \"\"\n  users ||--|{ package_owners : \"\"\n  users ||--|{ package_report_comments : \"\"\n  users ||--|{ package_reports : \"\"\n  users ||--|{ password_resets : \"\"\n  users ||--|{ releases : \"\"\n"
  },
  {
    "path": "examples/mermaid/plausible-analytics/Default.mmd",
    "content": "erDiagram\n  schema_migrations {\n    integer version PK\n    timestamp inserted_at\n  }\n  fun_with_flags_toggles {\n    integer id PK\n    varchar flag_name\n    varchar gate_type\n    varchar target\n    boolean enabled\n  }\n  oban_jobs {\n    integer id PK\n    varchar state\n    varchar queue\n    varchar worker\n    jsonb args\n    jsonb meta\n    array tags\n    array errors\n    integer attempt\n    array attempted_by\n    integer max_attempts\n    integer priority\n    timestamp attempted_at\n    timestamp cancelled_at\n    timestamp completed_at\n    timestamp discarded_at\n    timestamp inserted_at\n    timestamp scheduled_at\n  }\n  api_keys {\n    integer id PK\n    varchar name\n    array scopes\n    integer hourly_request_limit\n    varchar key_hash\n    varchar key_prefix\n    integer user_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  email_activation_codes {\n    integer id PK\n    varchar code\n    timestamp issued_at\n    integer user_id\n  }\n  invitations {\n    integer id PK\n    varchar invitation_id\n    varchar email\n    varchar role\n    integer inviter_id\n    integer site_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  totp_recovery_codes {\n    integer id PK\n    varchar code_digest\n    integer user_id\n    timestamp inserted_at\n  }\n  users {\n    integer id PK\n    varchar email\n    varchar password_hash\n    varchar name\n    timestamp last_seen\n    date trial_expiry_date\n    varchar theme\n    boolean email_verified\n    varchar previous_email\n    date accept_traffic_until\n    boolean allow_next_upgrade_override\n    boolean totp_enabled\n    bytea totp_secret\n    varchar totp_token\n    timestamp totp_last_used_at\n    jsonb grace_period\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  enterprise_plans {\n    integer id PK\n    varchar paddle_plan_id\n    varchar billing_interval\n    integer monthly_pageview_limit\n    integer site_limit\n    integer team_member_limit\n    array features\n    integer hourly_api_request_limit\n    integer user_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  subscriptions {\n    integer id PK\n    varchar paddle_subscription_id\n    varchar paddle_plan_id\n    varchar update_url\n    varchar cancel_url\n    varchar status\n    varchar next_bill_amount\n    date next_bill_date\n    date last_bill_date\n    varchar currency_code\n    integer user_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  events_v2 {\n    unknown name\n    unknown site_id\n    varchar hostname\n    varchar pathname\n    unknown user_id\n    unknown session_id\n    timestamp timestamp\n    unknown revenue_source_amount\n    unknown revenue_source_currency\n    unknown revenue_reporting_amount\n    unknown revenue_reporting_currency\n    varchar referrer\n    varchar referrer_source\n    varchar utm_medium\n    varchar utm_source\n    varchar utm_campaign\n    varchar utm_content\n    varchar utm_term\n    unknown country_code\n    unknown subdivision1_code\n    unknown subdivision2_code\n    unknown city_geoname_id\n    unknown screen_size\n    unknown operating_system\n    unknown operating_system_version\n    unknown browser\n    unknown browser_version\n  }\n  sessions_v2 {\n    varchar hostname\n    unknown site_id\n    unknown user_id\n    unknown session_id\n    timestamp start\n    unknown duration\n    unknown is_bounce\n    varchar entry_page\n    varchar exit_page\n    varchar exit_page_hostname\n    unknown pageviews\n    unknown events\n    unknown sign\n    varchar utm_medium\n    varchar utm_source\n    varchar utm_campaign\n    varchar utm_content\n    varchar utm_term\n    varchar referrer\n    varchar referrer_source\n    unknown country_code\n    unknown subdivision1_code\n    unknown subdivision2_code\n    unknown city_geoname_id\n    unknown screen_size\n    unknown operating_system\n    unknown operating_system_version\n    unknown browser\n    unknown browser_version\n    timestamp timestamp\n    varchar transferred_from\n  }\n  domains_lookup {\n    unknown site_id\n    varchar domain\n  }\n  funnels {\n    integer id PK\n    varchar name\n    integer site_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  funnel_steps {\n    integer id PK\n    integer step_order\n    integer funnel_id\n    integer goal_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  goals {\n    integer id PK\n    varchar event_name\n    varchar page_path\n    varchar currency\n    integer site_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  imported_browsers {\n    unknown site_id\n    unknown import_id\n    date date\n    varchar browser\n    varchar browser_version\n    unknown visitors\n    unknown visits\n    unknown visit_duration\n    unknown pageviews\n    unknown bounces\n  }\n  imported_devices {\n    unknown site_id\n    unknown import_id\n    date date\n    varchar device\n    unknown visitors\n    unknown visits\n    unknown visit_duration\n    unknown pageviews\n    unknown bounces\n  }\n  imported_entry_pages {\n    unknown site_id\n    unknown import_id\n    date date\n    varchar entry_page\n    unknown visitors\n    unknown entrances\n    unknown visit_duration\n    unknown pageviews\n    unknown bounces\n  }\n  imported_exit_pages {\n    unknown site_id\n    unknown import_id\n    date date\n    varchar exit_page\n    unknown exits\n    unknown visitors\n    unknown visit_duration\n    unknown pageviews\n    unknown bounces\n  }\n  imported_locations {\n    unknown site_id\n    unknown import_id\n    date date\n    varchar country\n    varchar region\n    unknown city\n    unknown visitors\n    unknown visits\n    unknown visit_duration\n    unknown pageviews\n    unknown bounces\n  }\n  imported_operating_systems {\n    unknown site_id\n    unknown import_id\n    date date\n    varchar operating_system\n    varchar operating_system_version\n    unknown visitors\n    unknown visits\n    unknown visit_duration\n    unknown pageviews\n    unknown bounces\n  }\n  imported_pages {\n    unknown site_id\n    unknown import_id\n    date date\n    varchar hostname\n    varchar page\n    unknown visits\n    unknown visitors\n    unknown active_visitors\n    unknown pageviews\n    unknown exits\n    unknown time_on_page\n  }\n  site_imports {\n    integer id PK\n    date start_date\n    date end_date\n    varchar label\n    varchar source\n    varchar status\n    boolean legacy\n    integer site_id\n    integer imported_by_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  imported_sources {\n    unknown site_id\n    unknown import_id\n    date date\n    varchar source\n    varchar referrer\n    varchar utm_source\n    varchar utm_medium\n    varchar utm_campaign\n    varchar utm_content\n    varchar utm_term\n    unknown visitors\n    unknown visits\n    unknown visit_duration\n    unknown pageviews\n    unknown bounces\n  }\n  imported_visitors {\n    unknown site_id\n    unknown import_id\n    date date\n    unknown visitors\n    unknown pageviews\n    unknown bounces\n    unknown visits\n    unknown visit_duration\n  }\n  ingest_counters {\n    timestamp event_timebucket\n    unknown site_id\n    unknown domain\n    unknown metric\n    unknown value\n  }\n  plugins_api_tokens {\n    uuid id PK\n    timestamp inserted_at\n    timestamp updated_at\n    bytea token_hash\n    varchar description\n    varchar hint\n    timestamp last_used_at\n    integer site_id\n  }\n  shield_rules_country {\n    uuid id PK\n    integer site_id\n    varchar country_code\n    varchar action\n    varchar added_by\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  shield_rules_hostname {\n    uuid id PK\n    integer site_id\n    varchar hostname\n    varchar hostname_pattern\n    varchar action\n    varchar added_by\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  shield_rules_ip {\n    uuid id PK\n    integer site_id\n    inet inet\n    varchar action\n    varchar description\n    varchar added_by\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  shield_rules_page {\n    uuid id PK\n    integer site_id\n    varchar page_path\n    varchar page_path_pattern\n    varchar action\n    varchar added_by\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  sites {\n    integer id PK\n    varchar domain\n    varchar timezone\n    boolean public\n    boolean locked\n    date stats_start_date\n    timestamp native_stats_start_at\n    array allowed_event_props\n    boolean conversions_enabled\n    boolean props_enabled\n    boolean funnels_enabled\n    integer ingest_rate_limit_scale_seconds\n    integer ingest_rate_limit_threshold\n    varchar domain_changed_from\n    timestamp domain_changed_at\n    jsonb imported_data\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  google_auth {\n    integer id PK\n    varchar email\n    varchar property\n    varchar refresh_token\n    varchar access_token\n    timestamp expires\n    integer user_id\n    integer site_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  site_memberships {\n    integer id PK\n    varchar role\n    integer site_id\n    integer user_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  monthly_reports {\n    integer id PK\n    array recipients\n    integer site_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  shared_links {\n    integer id PK\n    integer site_id\n    varchar name\n    varchar slug\n    varchar password_hash\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  spike_notifications {\n    integer id PK\n    array recipients\n    integer threshold\n    timestamp last_sent\n    integer site_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  site_user_preferences {\n    integer id PK\n    timestamp pinned_at\n    integer user_id\n    integer site_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  weekly_reports {\n    integer id PK\n    array recipients\n    integer site_id\n    timestamp inserted_at\n    timestamp updated_at\n  }\n  funnels ||--|{ funnel_steps : \"\"\n  goals ||--|{ funnel_steps : \"\"\n  sites ||--|{ funnels : \"\"\n  sites ||--|{ goals : \"\"\n  sites ||--o| google_auth : \"\"\n  sites ||--|{ invitations : \"\"\n  sites ||--o| monthly_reports : \"\"\n  sites ||--|{ plugins_api_tokens : \"\"\n  sites ||--|{ shared_links : \"\"\n  sites ||--|{ shield_rules_country : \"\"\n  sites ||--|{ shield_rules_hostname : \"\"\n  sites ||--|{ shield_rules_ip : \"\"\n  sites ||--|{ shield_rules_page : \"\"\n  sites ||--|{ site_imports : \"\"\n  sites ||--o| site_memberships : \"\"\n  sites ||--|{ site_user_preferences : \"\"\n  sites ||--o| spike_notifications : \"\"\n  sites ||--o| weekly_reports : \"\"\n  users ||--|{ api_keys : \"\"\n  users ||--|{ email_activation_codes : \"\"\n  users ||--o| enterprise_plans : \"\"\n  users ||--o| google_auth : \"\"\n  users ||--|{ invitations : \"\"\n  users ||--|{ site_imports : \"\"\n  users ||--|{ site_memberships : \"\"\n  users ||--|{ site_user_preferences : \"\"\n  users ||--o| subscriptions : \"\"\n  users ||--|{ totp_recovery_codes : \"\"\n"
  },
  {
    "path": "examples/mermaid/plausible-analytics/No-fields.mmd",
    "content": "erDiagram\n  schema_migrations\n  fun_with_flags_toggles\n  oban_jobs\n  api_keys\n  email_activation_codes\n  invitations\n  totp_recovery_codes\n  users\n  enterprise_plans\n  subscriptions\n  events_v2\n  sessions_v2\n  domains_lookup\n  funnels\n  funnel_steps\n  goals\n  imported_browsers\n  imported_devices\n  imported_entry_pages\n  imported_exit_pages\n  imported_locations\n  imported_operating_systems\n  imported_pages\n  site_imports\n  imported_sources\n  imported_visitors\n  ingest_counters\n  plugins_api_tokens\n  shield_rules_country\n  shield_rules_hostname\n  shield_rules_ip\n  shield_rules_page\n  sites\n  google_auth\n  site_memberships\n  monthly_reports\n  shared_links\n  spike_notifications\n  site_user_preferences\n  weekly_reports\n  funnels ||--|{ funnel_steps : \"\"\n  goals ||--|{ funnel_steps : \"\"\n  sites ||--|{ funnels : \"\"\n  sites ||--|{ goals : \"\"\n  sites ||--o| google_auth : \"\"\n  sites ||--|{ invitations : \"\"\n  sites ||--o| monthly_reports : \"\"\n  sites ||--|{ plugins_api_tokens : \"\"\n  sites ||--|{ shared_links : \"\"\n  sites ||--|{ shield_rules_country : \"\"\n  sites ||--|{ shield_rules_hostname : \"\"\n  sites ||--|{ shield_rules_ip : \"\"\n  sites ||--|{ shield_rules_page : \"\"\n  sites ||--|{ site_imports : \"\"\n  sites ||--o| site_memberships : \"\"\n  sites ||--|{ site_user_preferences : \"\"\n  sites ||--o| spike_notifications : \"\"\n  sites ||--o| weekly_reports : \"\"\n  users ||--|{ api_keys : \"\"\n  users ||--|{ email_activation_codes : \"\"\n  users ||--o| enterprise_plans : \"\"\n  users ||--o| google_auth : \"\"\n  users ||--|{ invitations : \"\"\n  users ||--|{ site_imports : \"\"\n  users ||--|{ site_memberships : \"\"\n  users ||--|{ site_user_preferences : \"\"\n  users ||--o| subscriptions : \"\"\n  users ||--|{ totp_recovery_codes : \"\"\n"
  },
  {
    "path": "examples/plantuml/changelog.com/Clusters.puml",
    "content": "@startuml\n\nset namespaceSeparator none\nhide circle\nhide methods\n\nskinparam linetype ortho\nskinparam defaultFontName Roboto Mono\nskinparam shadowing false\n\nnamespace EPISODE #b4eeb4 {\n  entity Changelog.Episode {\n    id : id\n    --\n    slug : string\n    guid : string\n    title : string\n    subtitle : string\n    type : integer\n    featured : boolean\n    highlight : string\n    subhighlight : string\n    summary : string\n    notes : string\n    doc_url : string\n    socialize_url : string\n    published : boolean\n    published_at : utc_datetime\n    recorded_at : utc_datetime\n    recorded_live : boolean\n    youtube_id : string\n    cover : string\n    audio_file : string\n    audio_bytes : integer\n    audio_duration : integer\n    audio_chapters : map\n    plusplus_file : string\n    plusplus_bytes : integer\n    plusplus_duration : integer\n    plusplus_chapters : map\n    download_count : float\n    import_count : float\n    reach_count : integer\n    email_subject : string\n    email_teaser : string\n    email_content : string\n    email_sends : integer\n    email_opens : integer\n    transcript : array\n    podcast_id : id\n    request_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.EpisodeChapter {\n    id : binary_id\n    --\n    title : string\n    starts_at : float\n    ends_at : float\n    link_url : string\n    image_url : string\n  }\n\n  entity Changelog.EpisodeGuest {\n    id : id\n    --\n    position : integer\n    thanks : boolean\n    discount_code : string\n    episode_id : id\n    person_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.EpisodeHost {\n    id : id\n    --\n    position : integer\n    person_id : id\n    episode_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.EpisodeRequest {\n    id : id\n    --\n    status : integer\n    hosts : string\n    guests : string\n    topics : string\n    pitch : string\n    pronunciation : string\n    message : string\n    podcast_id : id\n    submitter_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.EpisodeSponsor {\n    id : id\n    --\n    position : integer\n    title : string\n    link_url : string\n    description : string\n    starts_at : float\n    ends_at : float\n    episode_id : id\n    sponsor_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.EpisodeStat {\n    id : id\n    --\n    date : date\n    episode_bytes : integer\n    total_bytes : integer\n    downloads : float\n    uniques : integer\n    demographics : map\n    episode_id : id\n    podcast_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.EpisodeTopic {\n    id : id\n    --\n    position : integer\n    topic_id : id\n    episode_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n}\nnamespace NEWS #eee5de {\n  entity Changelog.NewsAd {\n    id : id\n    --\n    url : string\n    headline : string\n    story : string\n    image : string\n    active : boolean\n    newsletter : boolean\n    impression_count : integer\n    click_count : integer\n    sponsorship_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.NewsIssue {\n    id : id\n    --\n    slug : string\n    note : string\n    teaser : string\n    published : boolean\n    published_at : utc_datetime\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.NewsIssueAd {\n    id : id\n    --\n    position : integer\n    image : boolean\n    ad_id : id\n    issue_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.NewsIssueItem {\n    id : id\n    --\n    position : integer\n    image : boolean\n    issue_id : id\n    item_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.NewsItem {\n    id : id\n    --\n    status : integer\n    type : integer\n    url : string\n    headline : string\n    story : string\n    image : string\n    object_id : string\n    feed_only : boolean\n    pinned : boolean\n    published_at : utc_datetime\n    refreshed_at : utc_datetime\n    impression_count : integer\n    click_count : integer\n    message : string\n    author_id : id\n    logger_id : id\n    submitter_id : id\n    source_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.NewsItemComment {\n    id : id\n    --\n    content : string\n    approved : boolean\n    edited_at : utc_datetime\n    deleted_at : utc_datetime\n    item_id : id\n    author_id : id\n    parent_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.NewsItemTopic {\n    id : id\n    --\n    position : integer\n    item_id : id\n    topic_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.NewsQueue {\n    id : id\n    --\n    position : float\n    item_id : id\n  }\n\n  entity Changelog.NewsSource {\n    id : id\n    --\n    name : string\n    slug : string\n    website : string\n    twitter_handle : string\n    description : string\n    feed : string\n    regex : string\n    publication : boolean\n    icon : string\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.NewsSponsorship {\n    id : id\n    --\n    name : string\n    weeks : array\n    impression_count : integer\n    click_count : integer\n    sponsor_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n}\nnamespace PERSON #f0ffff {\n  entity Changelog.Person {\n    id : id\n    --\n    name : string\n    email : string\n    handle : string\n    github_handle : string\n    linkedin_handle : string\n    mastodon_handle : string\n    twitter_handle : string\n    slack_id : string\n    website : string\n    bio : string\n    location : string\n    auth_token : string\n    auth_token_expires_at : utc_datetime\n    joined_at : utc_datetime\n    signed_in_at : utc_datetime\n    approved : boolean\n    avatar : string\n    admin : boolean\n    host : boolean\n    editor : boolean\n    public_profile : boolean\n    settings : map\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.Person.Settings {\n    subscribe_to_contributed_news : boolean\n    subscribe_to_participated_episodes : boolean\n    email_on_authored_news : boolean\n    email_on_submitted_news : boolean\n    email_on_comment_replies : boolean\n    email_on_comment_mentions : boolean\n  }\n\n}\nnamespace PODCAST #ffefd5 {\n  entity Changelog.Podcast {\n    id : id\n    --\n    name : string\n    slug : string\n    status : integer\n    welcome : string\n    description : string\n    extended_description : string\n    vanity_domain : string\n    keywords : string\n    mastodon_handle : string\n    twitter_handle : string\n    apple_url : string\n    spotify_url : string\n    riverside_url : string\n    chartable_id : string\n    schedule_note : string\n    download_count : float\n    reach_count : integer\n    recorded_live : boolean\n    partner : boolean\n    position : integer\n    subscribers : map\n    cover : string\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.PodcastHost {\n    id : id\n    --\n    position : integer\n    retired : boolean\n    person_id : id\n    podcast_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.PodcastTopic {\n    id : id\n    --\n    position : integer\n    podcast_id : id\n    topic_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n}\nnamespace POST #eee5de {\n  entity Changelog.Post {\n    id : id\n    --\n    title : string\n    subtitle : string\n    slug : string\n    guid : string\n    canonical_url : string\n    image : string\n    tldr : string\n    body : string\n    published : boolean\n    published_at : utc_datetime\n    author_id : id\n    editor_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.PostTopic {\n    id : id\n    --\n    position : integer\n    topic_id : id\n    post_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n}\nnamespace SPONSOR #fffafa {\n  entity Changelog.Sponsor {\n    id : id\n    --\n    name : string\n    description : string\n    website : string\n    github_handle : string\n    twitter_handle : string\n    avatar : string\n    color_logo : string\n    dark_logo : string\n    light_logo : string\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Changelog.SponsorRep {\n    id : id\n    --\n    sponsor_id : id\n    person_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n}\n\nentity Changelog.Feed {\n  id : id\n  --\n  name : string\n  slug : string\n  description : string\n  title_format : string\n  plusplus : boolean\n  autosub : boolean\n  starts_at : utc_datetime\n  cover : string\n  podcast_ids : array\n  person_ids : array\n  owner_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.Subscription {\n  id : id\n  --\n  unsubscribed_at : utc_datetime\n  context : string\n  episode_id : id\n  item_id : id\n  person_id : id\n  podcast_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.Topic {\n  id : id\n  --\n  name : string\n  slug : string\n  description : string\n  website : string\n  twitter_handle : string\n  icon : string\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Ecto.Migration.SchemaMigration {\n  version : integer\n  --\n  inserted_at : naive_datetime\n}\n\nentity Oban.Job {\n  id : id\n  --\n  state : string\n  queue : string\n  worker : string\n  args : map\n  meta : map\n  tags : array\n  errors : array\n  attempt : integer\n  attempted_by : array\n  max_attempts : integer\n  priority : integer\n  attempted_at : utc_datetime_usec\n  cancelled_at : utc_datetime_usec\n  completed_at : utc_datetime_usec\n  discarded_at : utc_datetime_usec\n  inserted_at : utc_datetime_usec\n  scheduled_at : utc_datetime_usec\n}\n\nChangelog.EpisodeRequest ||--o| Changelog.Episode\nChangelog.Episode ||--|{ Changelog.EpisodeChapter\nChangelog.Episode ||--|{ Changelog.EpisodeGuest\nChangelog.Episode ||--|{ Changelog.EpisodeHost\nChangelog.Episode ||--|{ Changelog.EpisodeSponsor\nChangelog.Episode ||--|{ Changelog.EpisodeStat\nChangelog.Episode ||--|{ Changelog.EpisodeTopic\nChangelog.Episode ||--|{ Changelog.Subscription\nChangelog.NewsAd ||--|{ Changelog.NewsIssueAd\nChangelog.NewsIssue ||--|{ Changelog.NewsIssueAd\nChangelog.NewsIssue ||--|{ Changelog.NewsIssueItem\nChangelog.NewsItemComment ||--|{ Changelog.NewsItemComment\nChangelog.NewsItem ||--|{ Changelog.NewsIssueItem\nChangelog.NewsItem ||--|{ Changelog.NewsItemComment\nChangelog.NewsItem ||--|{ Changelog.NewsItemTopic\nChangelog.NewsItem ||--o| Changelog.NewsQueue\nChangelog.NewsItem ||--|{ Changelog.Subscription\nChangelog.NewsSource ||--|{ Changelog.NewsItem\nChangelog.NewsSponsorship ||--|{ Changelog.NewsAd\nChangelog.Person ||--|{ Changelog.EpisodeGuest\nChangelog.Person ||--|{ Changelog.EpisodeHost\nChangelog.Person ||--|{ Changelog.EpisodeRequest\nChangelog.Person ||--|{ Changelog.Feed\nChangelog.Person ||--|{ Changelog.NewsItemComment\nChangelog.Person ||--|{ Changelog.NewsItem\nChangelog.Person ||--|{ Changelog.PodcastHost\nChangelog.Person ||--|{ Changelog.Post\nChangelog.Person ||--|{ Changelog.SponsorRep\nChangelog.Person ||--|{ Changelog.Subscription\nChangelog.Person ||--o| Changelog.Person.Settings\nChangelog.Podcast ||--|{ Changelog.EpisodeRequest\nChangelog.Podcast ||--|{ Changelog.EpisodeStat\nChangelog.Podcast ||--|{ Changelog.Episode\nChangelog.Podcast ||--|{ Changelog.PodcastHost\nChangelog.Podcast ||--|{ Changelog.PodcastTopic\nChangelog.Podcast ||--|{ Changelog.Subscription\nChangelog.Post ||--|{ Changelog.PostTopic\nChangelog.Sponsor ||--|{ Changelog.EpisodeSponsor\nChangelog.Sponsor ||--|{ Changelog.NewsSponsorship\nChangelog.Sponsor ||--|{ Changelog.SponsorRep\nChangelog.Topic ||--|{ Changelog.EpisodeTopic\nChangelog.Topic ||--|{ Changelog.NewsItemTopic\nChangelog.Topic ||--|{ Changelog.PodcastTopic\nChangelog.Topic ||--|{ Changelog.PostTopic\n@enduml\n"
  },
  {
    "path": "examples/plantuml/changelog.com/Default.puml",
    "content": "@startuml\n\nset namespaceSeparator none\nhide circle\nhide methods\n\nskinparam linetype ortho\nskinparam defaultFontName Roboto Mono\nskinparam shadowing false\n\n\nentity Changelog.Episode {\n  id : id\n  --\n  slug : string\n  guid : string\n  title : string\n  subtitle : string\n  type : integer\n  featured : boolean\n  highlight : string\n  subhighlight : string\n  summary : string\n  notes : string\n  doc_url : string\n  socialize_url : string\n  published : boolean\n  published_at : utc_datetime\n  recorded_at : utc_datetime\n  recorded_live : boolean\n  youtube_id : string\n  cover : string\n  audio_file : string\n  audio_bytes : integer\n  audio_duration : integer\n  audio_chapters : map\n  plusplus_file : string\n  plusplus_bytes : integer\n  plusplus_duration : integer\n  plusplus_chapters : map\n  download_count : float\n  import_count : float\n  reach_count : integer\n  email_subject : string\n  email_teaser : string\n  email_content : string\n  email_sends : integer\n  email_opens : integer\n  transcript : array\n  podcast_id : id\n  request_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.EpisodeChapter {\n  id : binary_id\n  --\n  title : string\n  starts_at : float\n  ends_at : float\n  link_url : string\n  image_url : string\n}\n\nentity Changelog.EpisodeGuest {\n  id : id\n  --\n  position : integer\n  thanks : boolean\n  discount_code : string\n  episode_id : id\n  person_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.EpisodeHost {\n  id : id\n  --\n  position : integer\n  person_id : id\n  episode_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.EpisodeRequest {\n  id : id\n  --\n  status : integer\n  hosts : string\n  guests : string\n  topics : string\n  pitch : string\n  pronunciation : string\n  message : string\n  podcast_id : id\n  submitter_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.EpisodeSponsor {\n  id : id\n  --\n  position : integer\n  title : string\n  link_url : string\n  description : string\n  starts_at : float\n  ends_at : float\n  episode_id : id\n  sponsor_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.EpisodeStat {\n  id : id\n  --\n  date : date\n  episode_bytes : integer\n  total_bytes : integer\n  downloads : float\n  uniques : integer\n  demographics : map\n  episode_id : id\n  podcast_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.EpisodeTopic {\n  id : id\n  --\n  position : integer\n  topic_id : id\n  episode_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.Feed {\n  id : id\n  --\n  name : string\n  slug : string\n  description : string\n  title_format : string\n  plusplus : boolean\n  autosub : boolean\n  starts_at : utc_datetime\n  cover : string\n  podcast_ids : array\n  person_ids : array\n  owner_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.NewsAd {\n  id : id\n  --\n  url : string\n  headline : string\n  story : string\n  image : string\n  active : boolean\n  newsletter : boolean\n  impression_count : integer\n  click_count : integer\n  sponsorship_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.NewsIssue {\n  id : id\n  --\n  slug : string\n  note : string\n  teaser : string\n  published : boolean\n  published_at : utc_datetime\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.NewsIssueAd {\n  id : id\n  --\n  position : integer\n  image : boolean\n  ad_id : id\n  issue_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.NewsIssueItem {\n  id : id\n  --\n  position : integer\n  image : boolean\n  issue_id : id\n  item_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.NewsItem {\n  id : id\n  --\n  status : integer\n  type : integer\n  url : string\n  headline : string\n  story : string\n  image : string\n  object_id : string\n  feed_only : boolean\n  pinned : boolean\n  published_at : utc_datetime\n  refreshed_at : utc_datetime\n  impression_count : integer\n  click_count : integer\n  message : string\n  author_id : id\n  logger_id : id\n  submitter_id : id\n  source_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.NewsItemComment {\n  id : id\n  --\n  content : string\n  approved : boolean\n  edited_at : utc_datetime\n  deleted_at : utc_datetime\n  item_id : id\n  author_id : id\n  parent_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.NewsItemTopic {\n  id : id\n  --\n  position : integer\n  item_id : id\n  topic_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.NewsQueue {\n  id : id\n  --\n  position : float\n  item_id : id\n}\n\nentity Changelog.NewsSource {\n  id : id\n  --\n  name : string\n  slug : string\n  website : string\n  twitter_handle : string\n  description : string\n  feed : string\n  regex : string\n  publication : boolean\n  icon : string\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.NewsSponsorship {\n  id : id\n  --\n  name : string\n  weeks : array\n  impression_count : integer\n  click_count : integer\n  sponsor_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.Person {\n  id : id\n  --\n  name : string\n  email : string\n  handle : string\n  github_handle : string\n  linkedin_handle : string\n  mastodon_handle : string\n  twitter_handle : string\n  slack_id : string\n  website : string\n  bio : string\n  location : string\n  auth_token : string\n  auth_token_expires_at : utc_datetime\n  joined_at : utc_datetime\n  signed_in_at : utc_datetime\n  approved : boolean\n  avatar : string\n  admin : boolean\n  host : boolean\n  editor : boolean\n  public_profile : boolean\n  settings : map\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.Person.Settings {\n  subscribe_to_contributed_news : boolean\n  subscribe_to_participated_episodes : boolean\n  email_on_authored_news : boolean\n  email_on_submitted_news : boolean\n  email_on_comment_replies : boolean\n  email_on_comment_mentions : boolean\n}\n\nentity Changelog.Podcast {\n  id : id\n  --\n  name : string\n  slug : string\n  status : integer\n  welcome : string\n  description : string\n  extended_description : string\n  vanity_domain : string\n  keywords : string\n  mastodon_handle : string\n  twitter_handle : string\n  apple_url : string\n  spotify_url : string\n  riverside_url : string\n  chartable_id : string\n  schedule_note : string\n  download_count : float\n  reach_count : integer\n  recorded_live : boolean\n  partner : boolean\n  position : integer\n  subscribers : map\n  cover : string\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.PodcastHost {\n  id : id\n  --\n  position : integer\n  retired : boolean\n  person_id : id\n  podcast_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.PodcastTopic {\n  id : id\n  --\n  position : integer\n  podcast_id : id\n  topic_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.Post {\n  id : id\n  --\n  title : string\n  subtitle : string\n  slug : string\n  guid : string\n  canonical_url : string\n  image : string\n  tldr : string\n  body : string\n  published : boolean\n  published_at : utc_datetime\n  author_id : id\n  editor_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.PostTopic {\n  id : id\n  --\n  position : integer\n  topic_id : id\n  post_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.Sponsor {\n  id : id\n  --\n  name : string\n  description : string\n  website : string\n  github_handle : string\n  twitter_handle : string\n  avatar : string\n  color_logo : string\n  dark_logo : string\n  light_logo : string\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.SponsorRep {\n  id : id\n  --\n  sponsor_id : id\n  person_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.Subscription {\n  id : id\n  --\n  unsubscribed_at : utc_datetime\n  context : string\n  episode_id : id\n  item_id : id\n  person_id : id\n  podcast_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Changelog.Topic {\n  id : id\n  --\n  name : string\n  slug : string\n  description : string\n  website : string\n  twitter_handle : string\n  icon : string\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Ecto.Migration.SchemaMigration {\n  version : integer\n  --\n  inserted_at : naive_datetime\n}\n\nentity Oban.Job {\n  id : id\n  --\n  state : string\n  queue : string\n  worker : string\n  args : map\n  meta : map\n  tags : array\n  errors : array\n  attempt : integer\n  attempted_by : array\n  max_attempts : integer\n  priority : integer\n  attempted_at : utc_datetime_usec\n  cancelled_at : utc_datetime_usec\n  completed_at : utc_datetime_usec\n  discarded_at : utc_datetime_usec\n  inserted_at : utc_datetime_usec\n  scheduled_at : utc_datetime_usec\n}\n\nChangelog.EpisodeRequest ||--o| Changelog.Episode\nChangelog.Episode ||--|{ Changelog.EpisodeChapter\nChangelog.Episode ||--|{ Changelog.EpisodeGuest\nChangelog.Episode ||--|{ Changelog.EpisodeHost\nChangelog.Episode ||--|{ Changelog.EpisodeSponsor\nChangelog.Episode ||--|{ Changelog.EpisodeStat\nChangelog.Episode ||--|{ Changelog.EpisodeTopic\nChangelog.Episode ||--|{ Changelog.Subscription\nChangelog.NewsAd ||--|{ Changelog.NewsIssueAd\nChangelog.NewsIssue ||--|{ Changelog.NewsIssueAd\nChangelog.NewsIssue ||--|{ Changelog.NewsIssueItem\nChangelog.NewsItemComment ||--|{ Changelog.NewsItemComment\nChangelog.NewsItem ||--|{ Changelog.NewsIssueItem\nChangelog.NewsItem ||--|{ Changelog.NewsItemComment\nChangelog.NewsItem ||--|{ Changelog.NewsItemTopic\nChangelog.NewsItem ||--o| Changelog.NewsQueue\nChangelog.NewsItem ||--|{ Changelog.Subscription\nChangelog.NewsSource ||--|{ Changelog.NewsItem\nChangelog.NewsSponsorship ||--|{ Changelog.NewsAd\nChangelog.Person ||--|{ Changelog.EpisodeGuest\nChangelog.Person ||--|{ Changelog.EpisodeHost\nChangelog.Person ||--|{ Changelog.EpisodeRequest\nChangelog.Person ||--|{ Changelog.Feed\nChangelog.Person ||--|{ Changelog.NewsItemComment\nChangelog.Person ||--|{ Changelog.NewsItem\nChangelog.Person ||--|{ Changelog.PodcastHost\nChangelog.Person ||--|{ Changelog.Post\nChangelog.Person ||--|{ Changelog.SponsorRep\nChangelog.Person ||--|{ Changelog.Subscription\nChangelog.Person ||--o| Changelog.Person.Settings\nChangelog.Podcast ||--|{ Changelog.EpisodeRequest\nChangelog.Podcast ||--|{ Changelog.EpisodeStat\nChangelog.Podcast ||--|{ Changelog.Episode\nChangelog.Podcast ||--|{ Changelog.PodcastHost\nChangelog.Podcast ||--|{ Changelog.PodcastTopic\nChangelog.Podcast ||--|{ Changelog.Subscription\nChangelog.Post ||--|{ Changelog.PostTopic\nChangelog.Sponsor ||--|{ Changelog.EpisodeSponsor\nChangelog.Sponsor ||--|{ Changelog.NewsSponsorship\nChangelog.Sponsor ||--|{ Changelog.SponsorRep\nChangelog.Topic ||--|{ Changelog.EpisodeTopic\nChangelog.Topic ||--|{ Changelog.NewsItemTopic\nChangelog.Topic ||--|{ Changelog.PodcastTopic\nChangelog.Topic ||--|{ Changelog.PostTopic\n@enduml\n"
  },
  {
    "path": "examples/plantuml/hexpm/Contexts-as-clusters-no-fields.puml",
    "content": "@startuml\n\nset namespaceSeparator none\nhide circle\nhide methods\nhide fields\nskinparam linetype ortho\nskinparam defaultFontName Roboto Mono\nskinparam shadowing false\n\nnamespace Ecto.Migration #f0f8ff {\n  entity Ecto.Migration.SchemaMigration\n}\nnamespace Hexpm.Accounts #8deeee {\n  entity Hexpm.Accounts.AuditLog\n  entity Hexpm.Accounts.Email\n  entity Hexpm.Accounts.Key\n  entity Hexpm.Accounts.Key.Use\n  entity Hexpm.Accounts.KeyPermission\n  entity Hexpm.Accounts.Organization\n  entity Hexpm.Accounts.OrganizationUser\n  entity Hexpm.Accounts.PasswordReset\n  entity Hexpm.Accounts.RecoveryCode\n  entity Hexpm.Accounts.Session\n  entity Hexpm.Accounts.TFA\n  entity Hexpm.Accounts.User\n  entity Hexpm.Accounts.UserHandles\n}\nnamespace Hexpm.BlockAddress #fffafa {\n  entity Hexpm.BlockAddress.Entry\n}\nnamespace Hexpm.Repository #eedfcc {\n  entity Hexpm.Repository.Download\n  entity Hexpm.Repository.Install\n  entity Hexpm.Repository.Package\n  entity Hexpm.Repository.PackageDependant\n  entity Hexpm.Repository.PackageDownload\n  entity Hexpm.Repository.PackageMetadata\n  entity Hexpm.Repository.PackageOwner\n  entity Hexpm.Repository.PackageReport\n  entity Hexpm.Repository.PackageReportComment\n  entity Hexpm.Repository.PackageReportRelease\n  entity Hexpm.Repository.Release\n  entity Hexpm.Repository.ReleaseDownload\n  entity Hexpm.Repository.ReleaseMetadata\n  entity Hexpm.Repository.ReleaseRetirement\n  entity Hexpm.Repository.Repository\n  entity Hexpm.Repository.Requirement\n}\nnamespace Hexpm.ShortURLs #b4eeb4 {\n  entity Hexpm.ShortURLs.ShortURL\n}\n\n\nHexpm.Accounts.TFA ||--|{ Hexpm.Accounts.RecoveryCode\nHexpm.Accounts.Key ||--|{ Hexpm.Accounts.AuditLog\nHexpm.Accounts.Key ||--o| Hexpm.Accounts.Key.Use\nHexpm.Accounts.Key ||--|{ Hexpm.Accounts.KeyPermission\nHexpm.Accounts.Organization ||--|{ Hexpm.Accounts.AuditLog\nHexpm.Accounts.Organization ||--|{ Hexpm.Accounts.Key\nHexpm.Accounts.Organization ||--|{ Hexpm.Accounts.OrganizationUser\nHexpm.Accounts.Organization ||--o| Hexpm.Repository.Repository\nHexpm.Accounts.Organization ||--o| Hexpm.Accounts.User\nHexpm.Repository.PackageReport ||--|{ Hexpm.Repository.PackageReportComment\nHexpm.Repository.PackageReport ||--|{ Hexpm.Repository.PackageReportRelease\nHexpm.Repository.Package ||--|{ Hexpm.Repository.Download\nHexpm.Repository.Package ||--|{ Hexpm.Repository.PackageDependant\nHexpm.Repository.Package ||--|{ Hexpm.Repository.PackageDownload\nHexpm.Repository.Package ||--|{ Hexpm.Repository.PackageOwner\nHexpm.Repository.Package ||--|{ Hexpm.Repository.PackageReport\nHexpm.Repository.Package ||--|{ Hexpm.Repository.ReleaseDownload\nHexpm.Repository.Package ||--|{ Hexpm.Repository.Release\nHexpm.Repository.Package ||--|{ Hexpm.Repository.Requirement\nHexpm.Repository.Package ||--o| Hexpm.Repository.PackageMetadata\nHexpm.Repository.Release ||--|{ Hexpm.Repository.Download\nHexpm.Repository.Release ||--|{ Hexpm.Repository.PackageReportRelease\nHexpm.Repository.Release ||--o| Hexpm.Repository.ReleaseDownload\nHexpm.Repository.Release ||--|{ Hexpm.Repository.Requirement\nHexpm.Repository.Release ||--o| Hexpm.Repository.ReleaseMetadata\nHexpm.Repository.Release ||--o| Hexpm.Repository.ReleaseRetirement\nHexpm.Repository.Repository ||--|{ Hexpm.Repository.Package\nHexpm.Accounts.User ||--o| Hexpm.Accounts.UserHandles\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.AuditLog\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.Email\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.Key\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.OrganizationUser\nHexpm.Accounts.User ||--|{ Hexpm.Repository.PackageOwner\nHexpm.Accounts.User ||--|{ Hexpm.Repository.PackageReportComment\nHexpm.Accounts.User ||--|{ Hexpm.Repository.PackageReport\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.PasswordReset\nHexpm.Accounts.User ||--|{ Hexpm.Repository.Release\nHexpm.Accounts.User ||--o| Hexpm.Accounts.TFA\n@enduml\n"
  },
  {
    "path": "examples/plantuml/hexpm/Contexts-as-clusters.puml",
    "content": "@startuml\n\nset namespaceSeparator none\nhide circle\nhide methods\n\nskinparam linetype ortho\nskinparam defaultFontName Roboto Mono\nskinparam shadowing false\n\nnamespace Ecto.Migration #f0f8ff {\n  entity Ecto.Migration.SchemaMigration {\n    version : integer\n    --\n    inserted_at : naive_datetime\n  }\n\n}\nnamespace Hexpm.Accounts #8deeee {\n  entity Hexpm.Accounts.AuditLog {\n    id : id\n    --\n    user_agent : string\n    remote_ip : string\n    action : string\n    params : map\n    user_id : id\n    organization_id : id\n    key_id : id\n    inserted_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.Email {\n    id : id\n    --\n    email : string\n    verified : boolean\n    primary : boolean\n    public : boolean\n    gravatar : boolean\n    verification_key : string\n    verification_expiry : utc_datetime_usec\n    user_id : id\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.Key {\n    id : id\n    --\n    name : string\n    secret_first : string\n    secret_second : string\n    public : boolean\n    revoke_at : utc_datetime_usec\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n    last_use : map\n    user_id : id\n    organization_id : id\n    permissions : map\n  }\n\n  entity Hexpm.Accounts.Key.Use {\n    id : binary_id\n    --\n    used_at : utc_datetime_usec\n    user_agent : string\n    ip : string\n  }\n\n  entity Hexpm.Accounts.KeyPermission {\n    id : binary_id\n    --\n    domain : string\n    resource : string\n  }\n\n  entity Hexpm.Accounts.Organization {\n    id : id\n    --\n    name : string\n    billing_active : boolean\n    billing_override : boolean\n    trial_end : utc_datetime_usec\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.OrganizationUser {\n    id : id\n    --\n    role : string\n    organization_id : id\n    user_id : id\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.PasswordReset {\n    id : id\n    --\n    key : string\n    primary_email : string\n    user_id : id\n    inserted_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.RecoveryCode {\n    id : binary_id\n    --\n    code : string\n    used_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.Session {\n    id : id\n    --\n    token : binary\n    data : map\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.TFA {\n    secret : string\n    tfa_enabled : boolean\n    app_enabled : boolean\n    recovery_codes : map\n  }\n\n  entity Hexpm.Accounts.User {\n    id : id\n    --\n    username : string\n    full_name : string\n    password : string\n    service : boolean\n    deactivated_at : utc_datetime_usec\n    role : string\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n    handles : map\n    tfa : map\n    organization_id : id\n  }\n\n  entity Hexpm.Accounts.UserHandles {\n    id : binary_id\n    --\n    twitter : string\n    github : string\n    elixirforum : string\n    freenode : string\n    slack : string\n  }\n\n}\nnamespace Hexpm.BlockAddress #fffafa {\n  entity Hexpm.BlockAddress.Entry {\n    id : id\n    --\n    ip : string\n    comment : string\n  }\n\n}\nnamespace Hexpm.Repository #eedfcc {\n  entity Hexpm.Repository.Download {\n    id : id\n    --\n    package_id : id\n    release_id : id\n    downloads : integer\n    day : date\n  }\n\n  entity Hexpm.Repository.Install {\n    id : id\n    --\n    hex : string\n    elixirs : array\n  }\n\n  entity Hexpm.Repository.Package {\n    id : id\n    --\n    name : string\n    docs_updated_at : utc_datetime_usec\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n    repository_id : id\n    meta : map\n  }\n\n  entity Hexpm.Repository.PackageDependant {\n    id : id\n    --\n    package_id : id\n    name : string\n    repo : string\n  }\n\n  entity Hexpm.Repository.PackageDownload {\n    package_id : id\n    view : string\n    downloads : integer\n  }\n\n  entity Hexpm.Repository.PackageMetadata {\n    id : binary_id\n    --\n    description : string\n    licenses : array\n    links : map\n    maintainers : array\n    extra : map\n  }\n\n  entity Hexpm.Repository.PackageOwner {\n    id : id\n    --\n    level : string\n    package_id : id\n    user_id : id\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Repository.PackageReport {\n    id : id\n    --\n    state : string\n    description : string\n    author_id : id\n    package_id : id\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Repository.PackageReportComment {\n    id : id\n    --\n    text : string\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n    package_report_id : id\n    author_id : id\n  }\n\n  entity Hexpm.Repository.PackageReportRelease {\n    id : id\n    --\n    release_id : id\n    package_report_id : id\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Repository.Release {\n    id : id\n    --\n    version : string\n    inner_checksum : binary\n    outer_checksum : binary\n    has_docs : boolean\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n    package_id : id\n    publisher_id : id\n    meta : map\n    retirement : map\n  }\n\n  entity Hexpm.Repository.ReleaseDownload {\n    package_id : id\n    release_id : id\n    downloads : integer\n  }\n\n  entity Hexpm.Repository.ReleaseMetadata {\n    id : binary_id\n    --\n    app : string\n    build_tools : array\n    elixir : string\n  }\n\n  entity Hexpm.Repository.ReleaseRetirement {\n    id : binary_id\n    --\n    reason : string\n    message : string\n  }\n\n  entity Hexpm.Repository.Repository {\n    id : id\n    --\n    name : string\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n    organization_id : id\n  }\n\n  entity Hexpm.Repository.Requirement {\n    id : id\n    --\n    app : string\n    requirement : string\n    optional : boolean\n    release_id : id\n    dependency_id : id\n  }\n\n}\nnamespace Hexpm.ShortURLs #b4eeb4 {\n  entity Hexpm.ShortURLs.ShortURL {\n    id : id\n    --\n    url : string\n    short_code : string\n    inserted_at : utc_datetime_usec\n  }\n\n}\n\n\nHexpm.Accounts.TFA ||--|{ Hexpm.Accounts.RecoveryCode\nHexpm.Accounts.Key ||--|{ Hexpm.Accounts.AuditLog\nHexpm.Accounts.Key ||--o| Hexpm.Accounts.Key.Use\nHexpm.Accounts.Key ||--|{ Hexpm.Accounts.KeyPermission\nHexpm.Accounts.Organization ||--|{ Hexpm.Accounts.AuditLog\nHexpm.Accounts.Organization ||--|{ Hexpm.Accounts.Key\nHexpm.Accounts.Organization ||--|{ Hexpm.Accounts.OrganizationUser\nHexpm.Accounts.Organization ||--o| Hexpm.Repository.Repository\nHexpm.Accounts.Organization ||--o| Hexpm.Accounts.User\nHexpm.Repository.PackageReport ||--|{ Hexpm.Repository.PackageReportComment\nHexpm.Repository.PackageReport ||--|{ Hexpm.Repository.PackageReportRelease\nHexpm.Repository.Package ||--|{ Hexpm.Repository.Download\nHexpm.Repository.Package ||--|{ Hexpm.Repository.PackageDependant\nHexpm.Repository.Package ||--|{ Hexpm.Repository.PackageDownload\nHexpm.Repository.Package ||--|{ Hexpm.Repository.PackageOwner\nHexpm.Repository.Package ||--|{ Hexpm.Repository.PackageReport\nHexpm.Repository.Package ||--|{ Hexpm.Repository.ReleaseDownload\nHexpm.Repository.Package ||--|{ Hexpm.Repository.Release\nHexpm.Repository.Package ||--|{ Hexpm.Repository.Requirement\nHexpm.Repository.Package ||--o| Hexpm.Repository.PackageMetadata\nHexpm.Repository.Release ||--|{ Hexpm.Repository.Download\nHexpm.Repository.Release ||--|{ Hexpm.Repository.PackageReportRelease\nHexpm.Repository.Release ||--o| Hexpm.Repository.ReleaseDownload\nHexpm.Repository.Release ||--|{ Hexpm.Repository.Requirement\nHexpm.Repository.Release ||--o| Hexpm.Repository.ReleaseMetadata\nHexpm.Repository.Release ||--o| Hexpm.Repository.ReleaseRetirement\nHexpm.Repository.Repository ||--|{ Hexpm.Repository.Package\nHexpm.Accounts.User ||--o| Hexpm.Accounts.UserHandles\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.AuditLog\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.Email\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.Key\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.OrganizationUser\nHexpm.Accounts.User ||--|{ Hexpm.Repository.PackageOwner\nHexpm.Accounts.User ||--|{ Hexpm.Repository.PackageReportComment\nHexpm.Accounts.User ||--|{ Hexpm.Repository.PackageReport\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.PasswordReset\nHexpm.Accounts.User ||--|{ Hexpm.Repository.Release\nHexpm.Accounts.User ||--o| Hexpm.Accounts.TFA\n@enduml\n"
  },
  {
    "path": "examples/plantuml/hexpm/Default.puml",
    "content": "@startuml\n\nset namespaceSeparator none\nhide circle\nhide methods\n\nskinparam linetype ortho\nskinparam defaultFontName Roboto Mono\nskinparam shadowing false\n\n\nentity Ecto.Migration.SchemaMigration {\n  version : integer\n  --\n  inserted_at : naive_datetime\n}\n\nentity Hexpm.Accounts.AuditLog {\n  id : id\n  --\n  user_agent : string\n  remote_ip : string\n  action : string\n  params : map\n  user_id : id\n  organization_id : id\n  key_id : id\n  inserted_at : utc_datetime_usec\n}\n\nentity Hexpm.Accounts.Email {\n  id : id\n  --\n  email : string\n  verified : boolean\n  primary : boolean\n  public : boolean\n  gravatar : boolean\n  verification_key : string\n  verification_expiry : utc_datetime_usec\n  user_id : id\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n}\n\nentity Hexpm.Accounts.Key {\n  id : id\n  --\n  name : string\n  secret_first : string\n  secret_second : string\n  public : boolean\n  revoke_at : utc_datetime_usec\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n  last_use : map\n  user_id : id\n  organization_id : id\n  permissions : map\n}\n\nentity Hexpm.Accounts.Key.Use {\n  id : binary_id\n  --\n  used_at : utc_datetime_usec\n  user_agent : string\n  ip : string\n}\n\nentity Hexpm.Accounts.KeyPermission {\n  id : binary_id\n  --\n  domain : string\n  resource : string\n}\n\nentity Hexpm.Accounts.Organization {\n  id : id\n  --\n  name : string\n  billing_active : boolean\n  billing_override : boolean\n  trial_end : utc_datetime_usec\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n}\n\nentity Hexpm.Accounts.OrganizationUser {\n  id : id\n  --\n  role : string\n  organization_id : id\n  user_id : id\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n}\n\nentity Hexpm.Accounts.PasswordReset {\n  id : id\n  --\n  key : string\n  primary_email : string\n  user_id : id\n  inserted_at : utc_datetime_usec\n}\n\nentity Hexpm.Accounts.RecoveryCode {\n  id : binary_id\n  --\n  code : string\n  used_at : utc_datetime_usec\n}\n\nentity Hexpm.Accounts.Session {\n  id : id\n  --\n  token : binary\n  data : map\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n}\n\nentity Hexpm.Accounts.TFA {\n  secret : string\n  tfa_enabled : boolean\n  app_enabled : boolean\n  recovery_codes : map\n}\n\nentity Hexpm.Accounts.User {\n  id : id\n  --\n  username : string\n  full_name : string\n  password : string\n  service : boolean\n  deactivated_at : utc_datetime_usec\n  role : string\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n  handles : map\n  tfa : map\n  organization_id : id\n}\n\nentity Hexpm.Accounts.UserHandles {\n  id : binary_id\n  --\n  twitter : string\n  github : string\n  elixirforum : string\n  freenode : string\n  slack : string\n}\n\nentity Hexpm.BlockAddress.Entry {\n  id : id\n  --\n  ip : string\n  comment : string\n}\n\nentity Hexpm.Repository.Download {\n  id : id\n  --\n  package_id : id\n  release_id : id\n  downloads : integer\n  day : date\n}\n\nentity Hexpm.Repository.Install {\n  id : id\n  --\n  hex : string\n  elixirs : array\n}\n\nentity Hexpm.Repository.Package {\n  id : id\n  --\n  name : string\n  docs_updated_at : utc_datetime_usec\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n  repository_id : id\n  meta : map\n}\n\nentity Hexpm.Repository.PackageDependant {\n  id : id\n  --\n  package_id : id\n  name : string\n  repo : string\n}\n\nentity Hexpm.Repository.PackageDownload {\n  package_id : id\n  view : string\n  downloads : integer\n}\n\nentity Hexpm.Repository.PackageMetadata {\n  id : binary_id\n  --\n  description : string\n  licenses : array\n  links : map\n  maintainers : array\n  extra : map\n}\n\nentity Hexpm.Repository.PackageOwner {\n  id : id\n  --\n  level : string\n  package_id : id\n  user_id : id\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n}\n\nentity Hexpm.Repository.PackageReport {\n  id : id\n  --\n  state : string\n  description : string\n  author_id : id\n  package_id : id\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n}\n\nentity Hexpm.Repository.PackageReportComment {\n  id : id\n  --\n  text : string\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n  package_report_id : id\n  author_id : id\n}\n\nentity Hexpm.Repository.PackageReportRelease {\n  id : id\n  --\n  release_id : id\n  package_report_id : id\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n}\n\nentity Hexpm.Repository.Release {\n  id : id\n  --\n  version : string\n  inner_checksum : binary\n  outer_checksum : binary\n  has_docs : boolean\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n  package_id : id\n  publisher_id : id\n  meta : map\n  retirement : map\n}\n\nentity Hexpm.Repository.ReleaseDownload {\n  package_id : id\n  release_id : id\n  downloads : integer\n}\n\nentity Hexpm.Repository.ReleaseMetadata {\n  id : binary_id\n  --\n  app : string\n  build_tools : array\n  elixir : string\n}\n\nentity Hexpm.Repository.ReleaseRetirement {\n  id : binary_id\n  --\n  reason : string\n  message : string\n}\n\nentity Hexpm.Repository.Repository {\n  id : id\n  --\n  name : string\n  inserted_at : utc_datetime_usec\n  updated_at : utc_datetime_usec\n  organization_id : id\n}\n\nentity Hexpm.Repository.Requirement {\n  id : id\n  --\n  app : string\n  requirement : string\n  optional : boolean\n  release_id : id\n  dependency_id : id\n}\n\nentity Hexpm.ShortURLs.ShortURL {\n  id : id\n  --\n  url : string\n  short_code : string\n  inserted_at : utc_datetime_usec\n}\n\nHexpm.Accounts.TFA ||--|{ Hexpm.Accounts.RecoveryCode\nHexpm.Accounts.Key ||--|{ Hexpm.Accounts.AuditLog\nHexpm.Accounts.Key ||--o| Hexpm.Accounts.Key.Use\nHexpm.Accounts.Key ||--|{ Hexpm.Accounts.KeyPermission\nHexpm.Accounts.Organization ||--|{ Hexpm.Accounts.AuditLog\nHexpm.Accounts.Organization ||--|{ Hexpm.Accounts.Key\nHexpm.Accounts.Organization ||--|{ Hexpm.Accounts.OrganizationUser\nHexpm.Accounts.Organization ||--o| Hexpm.Repository.Repository\nHexpm.Accounts.Organization ||--o| Hexpm.Accounts.User\nHexpm.Repository.PackageReport ||--|{ Hexpm.Repository.PackageReportComment\nHexpm.Repository.PackageReport ||--|{ Hexpm.Repository.PackageReportRelease\nHexpm.Repository.Package ||--|{ Hexpm.Repository.Download\nHexpm.Repository.Package ||--|{ Hexpm.Repository.PackageDependant\nHexpm.Repository.Package ||--|{ Hexpm.Repository.PackageDownload\nHexpm.Repository.Package ||--|{ Hexpm.Repository.PackageOwner\nHexpm.Repository.Package ||--|{ Hexpm.Repository.PackageReport\nHexpm.Repository.Package ||--|{ Hexpm.Repository.ReleaseDownload\nHexpm.Repository.Package ||--|{ Hexpm.Repository.Release\nHexpm.Repository.Package ||--|{ Hexpm.Repository.Requirement\nHexpm.Repository.Package ||--o| Hexpm.Repository.PackageMetadata\nHexpm.Repository.Release ||--|{ Hexpm.Repository.Download\nHexpm.Repository.Release ||--|{ Hexpm.Repository.PackageReportRelease\nHexpm.Repository.Release ||--o| Hexpm.Repository.ReleaseDownload\nHexpm.Repository.Release ||--|{ Hexpm.Repository.Requirement\nHexpm.Repository.Release ||--o| Hexpm.Repository.ReleaseMetadata\nHexpm.Repository.Release ||--o| Hexpm.Repository.ReleaseRetirement\nHexpm.Repository.Repository ||--|{ Hexpm.Repository.Package\nHexpm.Accounts.User ||--o| Hexpm.Accounts.UserHandles\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.AuditLog\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.Email\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.Key\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.OrganizationUser\nHexpm.Accounts.User ||--|{ Hexpm.Repository.PackageOwner\nHexpm.Accounts.User ||--|{ Hexpm.Repository.PackageReportComment\nHexpm.Accounts.User ||--|{ Hexpm.Repository.PackageReport\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.PasswordReset\nHexpm.Accounts.User ||--|{ Hexpm.Repository.Release\nHexpm.Accounts.User ||--o| Hexpm.Accounts.TFA\n@enduml\n"
  },
  {
    "path": "examples/plantuml/hexpm/Only-embedded-schemas.puml",
    "content": "@startuml\n\nset namespaceSeparator none\nhide circle\nhide methods\n\nskinparam linetype ortho\nskinparam defaultFontName Roboto Mono\nskinparam shadowing false\n\n\nentity Hexpm.Accounts.Key.Use {\n  id : binary_id\n  --\n  used_at : utc_datetime_usec\n  user_agent : string\n  ip : string\n}\n\nentity Hexpm.Accounts.KeyPermission {\n  id : binary_id\n  --\n  domain : string\n  resource : string\n}\n\nentity Hexpm.Accounts.RecoveryCode {\n  id : binary_id\n  --\n  code : string\n  used_at : utc_datetime_usec\n}\n\nentity Hexpm.Accounts.TFA {\n  secret : string\n  tfa_enabled : boolean\n  app_enabled : boolean\n  recovery_codes : map\n}\n\nentity Hexpm.Accounts.UserHandles {\n  id : binary_id\n  --\n  twitter : string\n  github : string\n  elixirforum : string\n  freenode : string\n  slack : string\n}\n\nentity Hexpm.Repository.PackageMetadata {\n  id : binary_id\n  --\n  description : string\n  licenses : array\n  links : map\n  maintainers : array\n  extra : map\n}\n\nentity Hexpm.Repository.ReleaseMetadata {\n  id : binary_id\n  --\n  app : string\n  build_tools : array\n  elixir : string\n}\n\nentity Hexpm.Repository.ReleaseRetirement {\n  id : binary_id\n  --\n  reason : string\n  message : string\n}\n\nHexpm.Accounts.TFA ||--|{ Hexpm.Accounts.RecoveryCode\n@enduml\n"
  },
  {
    "path": "examples/plantuml/hexpm/Only-selected-cluster-Accounts-context.puml",
    "content": "@startuml\n\nset namespaceSeparator none\nhide circle\nhide methods\n\nskinparam linetype ortho\nskinparam defaultFontName Roboto Mono\nskinparam shadowing false\n\nnamespace Hexpm.Accounts #8deeee {\n  entity Hexpm.Accounts.AuditLog {\n    id : id\n    --\n    user_agent : string\n    remote_ip : string\n    action : string\n    params : map\n    user_id : id\n    organization_id : id\n    key_id : id\n    inserted_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.Email {\n    id : id\n    --\n    email : string\n    verified : boolean\n    primary : boolean\n    public : boolean\n    gravatar : boolean\n    verification_key : string\n    verification_expiry : utc_datetime_usec\n    user_id : id\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.Key {\n    id : id\n    --\n    name : string\n    secret_first : string\n    secret_second : string\n    public : boolean\n    revoke_at : utc_datetime_usec\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n    last_use : map\n    user_id : id\n    organization_id : id\n    permissions : map\n  }\n\n  entity Hexpm.Accounts.Key.Use {\n    id : binary_id\n    --\n    used_at : utc_datetime_usec\n    user_agent : string\n    ip : string\n  }\n\n  entity Hexpm.Accounts.KeyPermission {\n    id : binary_id\n    --\n    domain : string\n    resource : string\n  }\n\n  entity Hexpm.Accounts.Organization {\n    id : id\n    --\n    name : string\n    billing_active : boolean\n    billing_override : boolean\n    trial_end : utc_datetime_usec\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.OrganizationUser {\n    id : id\n    --\n    role : string\n    organization_id : id\n    user_id : id\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.PasswordReset {\n    id : id\n    --\n    key : string\n    primary_email : string\n    user_id : id\n    inserted_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.RecoveryCode {\n    id : binary_id\n    --\n    code : string\n    used_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.Session {\n    id : id\n    --\n    token : binary\n    data : map\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n  }\n\n  entity Hexpm.Accounts.TFA {\n    secret : string\n    tfa_enabled : boolean\n    app_enabled : boolean\n    recovery_codes : map\n  }\n\n  entity Hexpm.Accounts.User {\n    id : id\n    --\n    username : string\n    full_name : string\n    password : string\n    service : boolean\n    deactivated_at : utc_datetime_usec\n    role : string\n    inserted_at : utc_datetime_usec\n    updated_at : utc_datetime_usec\n    handles : map\n    tfa : map\n    organization_id : id\n  }\n\n  entity Hexpm.Accounts.UserHandles {\n    id : binary_id\n    --\n    twitter : string\n    github : string\n    elixirforum : string\n    freenode : string\n    slack : string\n  }\n\n}\n\n\nHexpm.Accounts.TFA ||--|{ Hexpm.Accounts.RecoveryCode\nHexpm.Accounts.Key ||--|{ Hexpm.Accounts.AuditLog\nHexpm.Accounts.Key ||--o| Hexpm.Accounts.Key.Use\nHexpm.Accounts.Key ||--|{ Hexpm.Accounts.KeyPermission\nHexpm.Accounts.Organization ||--|{ Hexpm.Accounts.AuditLog\nHexpm.Accounts.Organization ||--|{ Hexpm.Accounts.Key\nHexpm.Accounts.Organization ||--|{ Hexpm.Accounts.OrganizationUser\nHexpm.Accounts.Organization ||--o| Hexpm.Accounts.User\nHexpm.Accounts.User ||--o| Hexpm.Accounts.UserHandles\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.AuditLog\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.Email\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.Key\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.OrganizationUser\nHexpm.Accounts.User ||--|{ Hexpm.Accounts.PasswordReset\nHexpm.Accounts.User ||--o| Hexpm.Accounts.TFA\n@enduml\n"
  },
  {
    "path": "examples/plantuml/plausible-analytics/Contexts-as-clusters-no-fields.puml",
    "content": "@startuml\n\nset namespaceSeparator none\nhide circle\nhide methods\nhide fields\nskinparam linetype ortho\nskinparam defaultFontName Roboto Mono\nskinparam shadowing false\n\nnamespace Ecto.Migration #f0f8ff {\n  entity Ecto.Migration.SchemaMigration\n}\nnamespace FunWithFlags.Store #f0ffff {\n  entity FunWithFlags.Store.Persistent.Ecto.Record\n}\nnamespace Oban #f0ffff {\n  entity Oban.Job\n}\nnamespace Plausible #eee5de {\n  entity Plausible.ClickhouseEventV2\n  entity Plausible.ClickhouseSessionV2\n  entity Plausible.Funnel\n  entity Plausible.Goal\n  entity Plausible.Site\n}\nnamespace Plausible.Auth #ffefd5 {\n  entity Plausible.Auth.ApiKey\n  entity Plausible.Auth.EmailActivationCode\n  entity Plausible.Auth.GracePeriod\n  entity Plausible.Auth.Invitation\n  entity Plausible.Auth.TOTP.RecoveryCode\n  entity Plausible.Auth.User\n}\nnamespace Plausible.Billing #f0ffff {\n  entity Plausible.Billing.EnterprisePlan\n  entity Plausible.Billing.Plan\n  entity Plausible.Billing.Subscription\n}\nnamespace Plausible.DataMigration #8deeee {\n  entity Plausible.DataMigration.NumericIDs.DomainsLookup\n}\nnamespace Plausible.Funnel #fffafa {\n  entity Plausible.Funnel.Step\n}\nnamespace Plausible.Imported #eedfcc {\n  entity Plausible.Imported.Browser\n  entity Plausible.Imported.Device\n  entity Plausible.Imported.EntryPage\n  entity Plausible.Imported.ExitPage\n  entity Plausible.Imported.Location\n  entity Plausible.Imported.OperatingSystem\n  entity Plausible.Imported.Page\n  entity Plausible.Imported.SiteImport\n  entity Plausible.Imported.Source\n  entity Plausible.Imported.Visitor\n}\nnamespace Plausible.Ingestion #8deeee {\n  entity Plausible.Ingestion.Counters.Record\n  entity Plausible.Ingestion.Request\n}\nnamespace Plausible.Plugins #eee5de {\n  entity Plausible.Plugins.API.Token\n}\nnamespace Plausible.Shield #8deeee {\n  entity Plausible.Shield.CountryRule\n  entity Plausible.Shield.HostnameRule\n  entity Plausible.Shield.IPRule\n  entity Plausible.Shield.PageRule\n}\nnamespace Plausible.Site #f0f8ff {\n  entity Plausible.Site.GoogleAuth\n  entity Plausible.Site.ImportedData\n  entity Plausible.Site.Membership\n  entity Plausible.Site.MonthlyReport\n  entity Plausible.Site.SharedLink\n  entity Plausible.Site.SpikeNotification\n  entity Plausible.Site.UserPreference\n  entity Plausible.Site.WeeklyReport\n}\n\n\nPlausible.Funnel ||--|{ Plausible.Funnel.Step\nPlausible.Goal ||--|{ Plausible.Funnel.Step\nPlausible.Site ||--|{ Plausible.Funnel\nPlausible.Site ||--|{ Plausible.Goal\nPlausible.Site ||--o| Plausible.Site.GoogleAuth\nPlausible.Site ||--|{ Plausible.Auth.Invitation\nPlausible.Site ||--o| Plausible.Site.MonthlyReport\nPlausible.Site ||--|{ Plausible.Plugins.API.Token\nPlausible.Site ||--|{ Plausible.Site.SharedLink\nPlausible.Site ||--|{ Plausible.Shield.CountryRule\nPlausible.Site ||--|{ Plausible.Shield.HostnameRule\nPlausible.Site ||--|{ Plausible.Shield.IPRule\nPlausible.Site ||--|{ Plausible.Shield.PageRule\nPlausible.Site ||--|{ Plausible.Imported.SiteImport\nPlausible.Site ||--o| Plausible.Site.Membership\nPlausible.Site ||--|{ Plausible.Site.UserPreference\nPlausible.Site ||--o| Plausible.Site.SpikeNotification\nPlausible.Site ||--o| Plausible.Site.WeeklyReport\nPlausible.Site ||--o| Plausible.Site.ImportedData\nPlausible.Auth.User ||--o| Plausible.Auth.GracePeriod\nPlausible.Auth.User ||--|{ Plausible.Auth.ApiKey\nPlausible.Auth.User ||--|{ Plausible.Auth.EmailActivationCode\nPlausible.Auth.User ||--o| Plausible.Billing.EnterprisePlan\nPlausible.Auth.User ||--o| Plausible.Site.GoogleAuth\nPlausible.Auth.User ||--|{ Plausible.Auth.Invitation\nPlausible.Auth.User ||--|{ Plausible.Imported.SiteImport\nPlausible.Auth.User ||--|{ Plausible.Site.Membership\nPlausible.Auth.User ||--|{ Plausible.Site.UserPreference\nPlausible.Auth.User ||--o| Plausible.Billing.Subscription\nPlausible.Auth.User ||--|{ Plausible.Auth.TOTP.RecoveryCode\n@enduml\n"
  },
  {
    "path": "examples/plantuml/plausible-analytics/Contexts-as-clusters.puml",
    "content": "@startuml\n\nset namespaceSeparator none\nhide circle\nhide methods\n\nskinparam linetype ortho\nskinparam defaultFontName Roboto Mono\nskinparam shadowing false\n\nnamespace Ecto.Migration #f0f8ff {\n  entity Ecto.Migration.SchemaMigration {\n    version : integer\n    --\n    inserted_at : naive_datetime\n  }\n\n}\nnamespace FunWithFlags.Store #f0ffff {\n  entity FunWithFlags.Store.Persistent.Ecto.Record {\n    id : id\n    --\n    flag_name : string\n    gate_type : string\n    target : string\n    enabled : boolean\n  }\n\n}\nnamespace Oban #f0ffff {\n  entity Oban.Job {\n    id : id\n    --\n    state : string\n    queue : string\n    worker : string\n    args : map\n    meta : map\n    tags : array\n    errors : array\n    attempt : integer\n    attempted_by : array\n    max_attempts : integer\n    priority : integer\n    attempted_at : utc_datetime_usec\n    cancelled_at : utc_datetime_usec\n    completed_at : utc_datetime_usec\n    discarded_at : utc_datetime_usec\n    inserted_at : utc_datetime_usec\n    scheduled_at : utc_datetime_usec\n  }\n\n}\nnamespace Plausible #eee5de {\n  entity Plausible.ClickhouseEventV2 {\n    name : unknown\n    site_id : unknown\n    hostname : string\n    pathname : string\n    user_id : unknown\n    session_id : unknown\n    timestamp : naive_datetime\n    meta.key : array\n    meta.value : array\n    revenue_source_amount : unknown\n    revenue_source_currency : unknown\n    revenue_reporting_amount : unknown\n    revenue_reporting_currency : unknown\n    referrer : string\n    referrer_source : string\n    utm_medium : string\n    utm_source : string\n    utm_campaign : string\n    utm_content : string\n    utm_term : string\n    country_code : unknown\n    subdivision1_code : unknown\n    subdivision2_code : unknown\n    city_geoname_id : unknown\n    screen_size : unknown\n    operating_system : unknown\n    operating_system_version : unknown\n    browser : unknown\n    browser_version : unknown\n  }\n\n  entity Plausible.ClickhouseSessionV2 {\n    hostname : string\n    site_id : unknown\n    user_id : unknown\n    session_id : unknown\n    start : naive_datetime\n    duration : unknown\n    is_bounce : unknown\n    entry_page : string\n    exit_page : string\n    exit_page_hostname : string\n    pageviews : unknown\n    events : unknown\n    sign : unknown\n    entry_meta.key : array\n    entry_meta.value : array\n    utm_medium : string\n    utm_source : string\n    utm_campaign : string\n    utm_content : string\n    utm_term : string\n    referrer : string\n    referrer_source : string\n    country_code : unknown\n    subdivision1_code : unknown\n    subdivision2_code : unknown\n    city_geoname_id : unknown\n    screen_size : unknown\n    operating_system : unknown\n    operating_system_version : unknown\n    browser : unknown\n    browser_version : unknown\n    timestamp : naive_datetime\n    transferred_from : string\n  }\n\n  entity Plausible.Funnel {\n    id : id\n    --\n    name : string\n    site_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Goal {\n    id : id\n    --\n    event_name : string\n    page_path : string\n    currency : enum(XBD,BYN,HKD,XOF,SOS,ARS,EGP,XDR,GMD,...)\n    site_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Site {\n    id : id\n    --\n    domain : string\n    timezone : string\n    public : boolean\n    locked : boolean\n    stats_start_date : date\n    native_stats_start_at : naive_datetime\n    allowed_event_props : array\n    conversions_enabled : boolean\n    props_enabled : boolean\n    funnels_enabled : boolean\n    ingest_rate_limit_scale_seconds : integer\n    ingest_rate_limit_threshold : integer\n    domain_changed_from : string\n    domain_changed_at : naive_datetime\n    imported_data : map\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n}\nnamespace Plausible.Auth #ffefd5 {\n  entity Plausible.Auth.ApiKey {\n    id : id\n    --\n    name : string\n    scopes : array\n    hourly_request_limit : integer\n    key_hash : string\n    key_prefix : string\n    user_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Auth.EmailActivationCode {\n    id : id\n    --\n    code : string\n    issued_at : naive_datetime\n    user_id : id\n  }\n\n  entity Plausible.Auth.GracePeriod {\n    id : binary_id\n    --\n    end_date : date\n    is_over : boolean\n    manual_lock : boolean\n  }\n\n  entity Plausible.Auth.Invitation {\n    id : id\n    --\n    invitation_id : string\n    email : string\n    role : enum(owner,admin,viewer)\n    inviter_id : id\n    site_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Auth.TOTP.RecoveryCode {\n    id : id\n    --\n    code_digest : string\n    user_id : id\n    inserted_at : naive_datetime\n  }\n\n  entity Plausible.Auth.User {\n    id : id\n    --\n    email : string\n    password_hash : string\n    name : string\n    last_seen : naive_datetime\n    trial_expiry_date : date\n    theme : enum(system,light,dark)\n    email_verified : boolean\n    previous_email : string\n    accept_traffic_until : date\n    allow_next_upgrade_override : boolean\n    totp_enabled : boolean\n    totp_secret : binary\n    totp_token : string\n    totp_last_used_at : naive_datetime\n    grace_period : map\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n}\nnamespace Plausible.Billing #f0ffff {\n  entity Plausible.Billing.EnterprisePlan {\n    id : id\n    --\n    paddle_plan_id : string\n    billing_interval : enum(yearly,monthly)\n    monthly_pageview_limit : integer\n    site_limit : integer\n    team_member_limit : integer\n    features : array\n    hourly_api_request_limit : integer\n    user_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Billing.Plan {\n    id : binary_id\n    --\n    generation : integer\n    kind : enum(growth,business)\n    features : array\n    monthly_pageview_limit : integer\n    site_limit : integer\n    team_member_limit : integer\n    volume : string\n    data_retention_in_years : integer\n    monthly_cost : string\n    monthly_product_id : string\n    yearly_cost : string\n    yearly_product_id : string\n  }\n\n  entity Plausible.Billing.Subscription {\n    id : id\n    --\n    paddle_subscription_id : string\n    paddle_plan_id : string\n    update_url : string\n    cancel_url : string\n    status : enum(active,deleted,past_due,paused)\n    next_bill_amount : string\n    next_bill_date : date\n    last_bill_date : date\n    currency_code : string\n    user_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n}\nnamespace Plausible.DataMigration #8deeee {\n  entity Plausible.DataMigration.NumericIDs.DomainsLookup {\n    site_id : unknown\n    domain : string\n  }\n\n}\nnamespace Plausible.Funnel #fffafa {\n  entity Plausible.Funnel.Step {\n    id : id\n    --\n    step_order : integer\n    funnel_id : id\n    goal_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n}\nnamespace Plausible.Imported #eedfcc {\n  entity Plausible.Imported.Browser {\n    site_id : unknown\n    import_id : unknown\n    date : date\n    browser : string\n    browser_version : string\n    visitors : unknown\n    visits : unknown\n    visit_duration : unknown\n    pageviews : unknown\n    bounces : unknown\n  }\n\n  entity Plausible.Imported.Device {\n    site_id : unknown\n    import_id : unknown\n    date : date\n    device : string\n    visitors : unknown\n    visits : unknown\n    visit_duration : unknown\n    pageviews : unknown\n    bounces : unknown\n  }\n\n  entity Plausible.Imported.EntryPage {\n    site_id : unknown\n    import_id : unknown\n    date : date\n    entry_page : string\n    visitors : unknown\n    entrances : unknown\n    visit_duration : unknown\n    pageviews : unknown\n    bounces : unknown\n  }\n\n  entity Plausible.Imported.ExitPage {\n    site_id : unknown\n    import_id : unknown\n    date : date\n    exit_page : string\n    exits : unknown\n    visitors : unknown\n    visit_duration : unknown\n    pageviews : unknown\n    bounces : unknown\n  }\n\n  entity Plausible.Imported.Location {\n    site_id : unknown\n    import_id : unknown\n    date : date\n    country : string\n    region : string\n    city : unknown\n    visitors : unknown\n    visits : unknown\n    visit_duration : unknown\n    pageviews : unknown\n    bounces : unknown\n  }\n\n  entity Plausible.Imported.OperatingSystem {\n    site_id : unknown\n    import_id : unknown\n    date : date\n    operating_system : string\n    operating_system_version : string\n    visitors : unknown\n    visits : unknown\n    visit_duration : unknown\n    pageviews : unknown\n    bounces : unknown\n  }\n\n  entity Plausible.Imported.Page {\n    site_id : unknown\n    import_id : unknown\n    date : date\n    hostname : string\n    page : string\n    visits : unknown\n    visitors : unknown\n    active_visitors : unknown\n    pageviews : unknown\n    exits : unknown\n    time_on_page : unknown\n  }\n\n  entity Plausible.Imported.SiteImport {\n    id : id\n    --\n    start_date : date\n    end_date : date\n    label : string\n    source : enum(noop,csv,universal_analytics,google_analytics_4)\n    status : enum(pending,failed,completed,importing)\n    legacy : boolean\n    site_id : id\n    imported_by_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Imported.Source {\n    site_id : unknown\n    import_id : unknown\n    date : date\n    source : string\n    referrer : string\n    utm_source : string\n    utm_medium : string\n    utm_campaign : string\n    utm_content : string\n    utm_term : string\n    visitors : unknown\n    visits : unknown\n    visit_duration : unknown\n    pageviews : unknown\n    bounces : unknown\n  }\n\n  entity Plausible.Imported.Visitor {\n    site_id : unknown\n    import_id : unknown\n    date : date\n    visitors : unknown\n    pageviews : unknown\n    bounces : unknown\n    visits : unknown\n    visit_duration : unknown\n  }\n\n}\nnamespace Plausible.Ingestion #8deeee {\n  entity Plausible.Ingestion.Counters.Record {\n    event_timebucket : utc_datetime\n    site_id : unknown\n    domain : unknown\n    metric : unknown\n    value : unknown\n  }\n\n  entity Plausible.Ingestion.Request {\n    remote_ip : string\n    user_agent : string\n    event_name : string\n    uri : map\n    hostname : string\n    referrer : string\n    domains : array\n    ip_classification : string\n    hash_mode : integer\n    pathname : string\n    props : map\n    revenue_source : map\n    query_params : map\n    timestamp : naive_datetime\n  }\n\n}\nnamespace Plausible.Plugins #eee5de {\n  entity Plausible.Plugins.API.Token {\n    id : binary_id\n    --\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n    token_hash : binary\n    description : string\n    hint : string\n    last_used_at : naive_datetime\n    site_id : id\n  }\n\n}\nnamespace Plausible.Shield #8deeee {\n  entity Plausible.Shield.CountryRule {\n    id : binary_id\n    --\n    site_id : id\n    country_code : string\n    action : enum(allow,deny)\n    added_by : string\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Shield.HostnameRule {\n    id : binary_id\n    --\n    site_id : id\n    hostname : string\n    hostname_pattern : string\n    action : enum(allow,deny)\n    added_by : string\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Shield.IPRule {\n    id : binary_id\n    --\n    site_id : id\n    inet : inet\n    action : enum(allow,deny)\n    description : string\n    added_by : string\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Shield.PageRule {\n    id : binary_id\n    --\n    site_id : id\n    page_path : string\n    page_path_pattern : string\n    action : enum(allow,deny)\n    added_by : string\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n}\nnamespace Plausible.Site #f0f8ff {\n  entity Plausible.Site.GoogleAuth {\n    id : id\n    --\n    email : string\n    property : string\n    refresh_token : string\n    access_token : string\n    expires : naive_datetime\n    user_id : id\n    site_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Site.ImportedData {\n    id : binary_id\n    --\n    start_date : date\n    end_date : date\n    source : string\n    status : string\n  }\n\n  entity Plausible.Site.Membership {\n    id : id\n    --\n    role : enum(owner,admin,viewer)\n    site_id : id\n    user_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Site.MonthlyReport {\n    id : id\n    --\n    recipients : array\n    site_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Site.SharedLink {\n    id : id\n    --\n    site_id : id\n    name : string\n    slug : string\n    password_hash : string\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Site.SpikeNotification {\n    id : id\n    --\n    recipients : array\n    threshold : integer\n    last_sent : naive_datetime\n    site_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Site.UserPreference {\n    id : id\n    --\n    pinned_at : naive_datetime\n    user_id : id\n    site_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n  entity Plausible.Site.WeeklyReport {\n    id : id\n    --\n    recipients : array\n    site_id : id\n    inserted_at : naive_datetime\n    updated_at : naive_datetime\n  }\n\n}\n\n\nPlausible.Funnel ||--|{ Plausible.Funnel.Step\nPlausible.Goal ||--|{ Plausible.Funnel.Step\nPlausible.Site ||--|{ Plausible.Funnel\nPlausible.Site ||--|{ Plausible.Goal\nPlausible.Site ||--o| Plausible.Site.GoogleAuth\nPlausible.Site ||--|{ Plausible.Auth.Invitation\nPlausible.Site ||--o| Plausible.Site.MonthlyReport\nPlausible.Site ||--|{ Plausible.Plugins.API.Token\nPlausible.Site ||--|{ Plausible.Site.SharedLink\nPlausible.Site ||--|{ Plausible.Shield.CountryRule\nPlausible.Site ||--|{ Plausible.Shield.HostnameRule\nPlausible.Site ||--|{ Plausible.Shield.IPRule\nPlausible.Site ||--|{ Plausible.Shield.PageRule\nPlausible.Site ||--|{ Plausible.Imported.SiteImport\nPlausible.Site ||--o| Plausible.Site.Membership\nPlausible.Site ||--|{ Plausible.Site.UserPreference\nPlausible.Site ||--o| Plausible.Site.SpikeNotification\nPlausible.Site ||--o| Plausible.Site.WeeklyReport\nPlausible.Site ||--o| Plausible.Site.ImportedData\nPlausible.Auth.User ||--o| Plausible.Auth.GracePeriod\nPlausible.Auth.User ||--|{ Plausible.Auth.ApiKey\nPlausible.Auth.User ||--|{ Plausible.Auth.EmailActivationCode\nPlausible.Auth.User ||--o| Plausible.Billing.EnterprisePlan\nPlausible.Auth.User ||--o| Plausible.Site.GoogleAuth\nPlausible.Auth.User ||--|{ Plausible.Auth.Invitation\nPlausible.Auth.User ||--|{ Plausible.Imported.SiteImport\nPlausible.Auth.User ||--|{ Plausible.Site.Membership\nPlausible.Auth.User ||--|{ Plausible.Site.UserPreference\nPlausible.Auth.User ||--o| Plausible.Billing.Subscription\nPlausible.Auth.User ||--|{ Plausible.Auth.TOTP.RecoveryCode\n@enduml\n"
  },
  {
    "path": "examples/plantuml/plausible-analytics/Default.puml",
    "content": "@startuml\n\nset namespaceSeparator none\nhide circle\nhide methods\n\nskinparam linetype ortho\nskinparam defaultFontName Roboto Mono\nskinparam shadowing false\n\n\nentity Ecto.Migration.SchemaMigration {\n  version : integer\n  --\n  inserted_at : naive_datetime\n}\n\nentity FunWithFlags.Store.Persistent.Ecto.Record {\n  id : id\n  --\n  flag_name : string\n  gate_type : string\n  target : string\n  enabled : boolean\n}\n\nentity Oban.Job {\n  id : id\n  --\n  state : string\n  queue : string\n  worker : string\n  args : map\n  meta : map\n  tags : array\n  errors : array\n  attempt : integer\n  attempted_by : array\n  max_attempts : integer\n  priority : integer\n  attempted_at : utc_datetime_usec\n  cancelled_at : utc_datetime_usec\n  completed_at : utc_datetime_usec\n  discarded_at : utc_datetime_usec\n  inserted_at : utc_datetime_usec\n  scheduled_at : utc_datetime_usec\n}\n\nentity Plausible.Auth.ApiKey {\n  id : id\n  --\n  name : string\n  scopes : array\n  hourly_request_limit : integer\n  key_hash : string\n  key_prefix : string\n  user_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Auth.EmailActivationCode {\n  id : id\n  --\n  code : string\n  issued_at : naive_datetime\n  user_id : id\n}\n\nentity Plausible.Auth.GracePeriod {\n  id : binary_id\n  --\n  end_date : date\n  is_over : boolean\n  manual_lock : boolean\n}\n\nentity Plausible.Auth.Invitation {\n  id : id\n  --\n  invitation_id : string\n  email : string\n  role : enum(owner,admin,viewer)\n  inviter_id : id\n  site_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Auth.TOTP.RecoveryCode {\n  id : id\n  --\n  code_digest : string\n  user_id : id\n  inserted_at : naive_datetime\n}\n\nentity Plausible.Auth.User {\n  id : id\n  --\n  email : string\n  password_hash : string\n  name : string\n  last_seen : naive_datetime\n  trial_expiry_date : date\n  theme : enum(system,light,dark)\n  email_verified : boolean\n  previous_email : string\n  accept_traffic_until : date\n  allow_next_upgrade_override : boolean\n  totp_enabled : boolean\n  totp_secret : binary\n  totp_token : string\n  totp_last_used_at : naive_datetime\n  grace_period : map\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Billing.EnterprisePlan {\n  id : id\n  --\n  paddle_plan_id : string\n  billing_interval : enum(yearly,monthly)\n  monthly_pageview_limit : integer\n  site_limit : integer\n  team_member_limit : integer\n  features : array\n  hourly_api_request_limit : integer\n  user_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Billing.Plan {\n  id : binary_id\n  --\n  generation : integer\n  kind : enum(growth,business)\n  features : array\n  monthly_pageview_limit : integer\n  site_limit : integer\n  team_member_limit : integer\n  volume : string\n  data_retention_in_years : integer\n  monthly_cost : string\n  monthly_product_id : string\n  yearly_cost : string\n  yearly_product_id : string\n}\n\nentity Plausible.Billing.Subscription {\n  id : id\n  --\n  paddle_subscription_id : string\n  paddle_plan_id : string\n  update_url : string\n  cancel_url : string\n  status : enum(active,deleted,past_due,paused)\n  next_bill_amount : string\n  next_bill_date : date\n  last_bill_date : date\n  currency_code : string\n  user_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.ClickhouseEventV2 {\n  name : unknown\n  site_id : unknown\n  hostname : string\n  pathname : string\n  user_id : unknown\n  session_id : unknown\n  timestamp : naive_datetime\n  meta.key : array\n  meta.value : array\n  revenue_source_amount : unknown\n  revenue_source_currency : unknown\n  revenue_reporting_amount : unknown\n  revenue_reporting_currency : unknown\n  referrer : string\n  referrer_source : string\n  utm_medium : string\n  utm_source : string\n  utm_campaign : string\n  utm_content : string\n  utm_term : string\n  country_code : unknown\n  subdivision1_code : unknown\n  subdivision2_code : unknown\n  city_geoname_id : unknown\n  screen_size : unknown\n  operating_system : unknown\n  operating_system_version : unknown\n  browser : unknown\n  browser_version : unknown\n}\n\nentity Plausible.ClickhouseSessionV2 {\n  hostname : string\n  site_id : unknown\n  user_id : unknown\n  session_id : unknown\n  start : naive_datetime\n  duration : unknown\n  is_bounce : unknown\n  entry_page : string\n  exit_page : string\n  exit_page_hostname : string\n  pageviews : unknown\n  events : unknown\n  sign : unknown\n  entry_meta.key : array\n  entry_meta.value : array\n  utm_medium : string\n  utm_source : string\n  utm_campaign : string\n  utm_content : string\n  utm_term : string\n  referrer : string\n  referrer_source : string\n  country_code : unknown\n  subdivision1_code : unknown\n  subdivision2_code : unknown\n  city_geoname_id : unknown\n  screen_size : unknown\n  operating_system : unknown\n  operating_system_version : unknown\n  browser : unknown\n  browser_version : unknown\n  timestamp : naive_datetime\n  transferred_from : string\n}\n\nentity Plausible.DataMigration.NumericIDs.DomainsLookup {\n  site_id : unknown\n  domain : string\n}\n\nentity Plausible.Funnel {\n  id : id\n  --\n  name : string\n  site_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Funnel.Step {\n  id : id\n  --\n  step_order : integer\n  funnel_id : id\n  goal_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Goal {\n  id : id\n  --\n  event_name : string\n  page_path : string\n  currency : enum(KMF,AUD,SAR,BWP,BBD,EGP,YER,CDF,IQD,...)\n  site_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Imported.Browser {\n  site_id : unknown\n  import_id : unknown\n  date : date\n  browser : string\n  browser_version : string\n  visitors : unknown\n  visits : unknown\n  visit_duration : unknown\n  pageviews : unknown\n  bounces : unknown\n}\n\nentity Plausible.Imported.Device {\n  site_id : unknown\n  import_id : unknown\n  date : date\n  device : string\n  visitors : unknown\n  visits : unknown\n  visit_duration : unknown\n  pageviews : unknown\n  bounces : unknown\n}\n\nentity Plausible.Imported.EntryPage {\n  site_id : unknown\n  import_id : unknown\n  date : date\n  entry_page : string\n  visitors : unknown\n  entrances : unknown\n  visit_duration : unknown\n  pageviews : unknown\n  bounces : unknown\n}\n\nentity Plausible.Imported.ExitPage {\n  site_id : unknown\n  import_id : unknown\n  date : date\n  exit_page : string\n  exits : unknown\n  visitors : unknown\n  visit_duration : unknown\n  pageviews : unknown\n  bounces : unknown\n}\n\nentity Plausible.Imported.Location {\n  site_id : unknown\n  import_id : unknown\n  date : date\n  country : string\n  region : string\n  city : unknown\n  visitors : unknown\n  visits : unknown\n  visit_duration : unknown\n  pageviews : unknown\n  bounces : unknown\n}\n\nentity Plausible.Imported.OperatingSystem {\n  site_id : unknown\n  import_id : unknown\n  date : date\n  operating_system : string\n  operating_system_version : string\n  visitors : unknown\n  visits : unknown\n  visit_duration : unknown\n  pageviews : unknown\n  bounces : unknown\n}\n\nentity Plausible.Imported.Page {\n  site_id : unknown\n  import_id : unknown\n  date : date\n  hostname : string\n  page : string\n  visits : unknown\n  visitors : unknown\n  active_visitors : unknown\n  pageviews : unknown\n  exits : unknown\n  time_on_page : unknown\n}\n\nentity Plausible.Imported.SiteImport {\n  id : id\n  --\n  start_date : date\n  end_date : date\n  label : string\n  source : enum(noop,csv,universal_analytics,google_analytics_4)\n  status : enum(pending,failed,completed,importing)\n  legacy : boolean\n  site_id : id\n  imported_by_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Imported.Source {\n  site_id : unknown\n  import_id : unknown\n  date : date\n  source : string\n  referrer : string\n  utm_source : string\n  utm_medium : string\n  utm_campaign : string\n  utm_content : string\n  utm_term : string\n  visitors : unknown\n  visits : unknown\n  visit_duration : unknown\n  pageviews : unknown\n  bounces : unknown\n}\n\nentity Plausible.Imported.Visitor {\n  site_id : unknown\n  import_id : unknown\n  date : date\n  visitors : unknown\n  pageviews : unknown\n  bounces : unknown\n  visits : unknown\n  visit_duration : unknown\n}\n\nentity Plausible.Ingestion.Counters.Record {\n  event_timebucket : utc_datetime\n  site_id : unknown\n  domain : unknown\n  metric : unknown\n  value : unknown\n}\n\nentity Plausible.Ingestion.Request {\n  remote_ip : string\n  user_agent : string\n  event_name : string\n  uri : map\n  hostname : string\n  referrer : string\n  domains : array\n  ip_classification : string\n  hash_mode : integer\n  pathname : string\n  props : map\n  revenue_source : map\n  query_params : map\n  timestamp : naive_datetime\n}\n\nentity Plausible.Plugins.API.Token {\n  id : binary_id\n  --\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n  token_hash : binary\n  description : string\n  hint : string\n  last_used_at : naive_datetime\n  site_id : id\n}\n\nentity Plausible.Shield.CountryRule {\n  id : binary_id\n  --\n  site_id : id\n  country_code : string\n  action : enum(allow,deny)\n  added_by : string\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Shield.HostnameRule {\n  id : binary_id\n  --\n  site_id : id\n  hostname : string\n  hostname_pattern : string\n  action : enum(allow,deny)\n  added_by : string\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Shield.IPRule {\n  id : binary_id\n  --\n  site_id : id\n  inet : inet\n  action : enum(allow,deny)\n  description : string\n  added_by : string\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Shield.PageRule {\n  id : binary_id\n  --\n  site_id : id\n  page_path : string\n  page_path_pattern : string\n  action : enum(allow,deny)\n  added_by : string\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Site {\n  id : id\n  --\n  domain : string\n  timezone : string\n  public : boolean\n  locked : boolean\n  stats_start_date : date\n  native_stats_start_at : naive_datetime\n  allowed_event_props : array\n  conversions_enabled : boolean\n  props_enabled : boolean\n  funnels_enabled : boolean\n  ingest_rate_limit_scale_seconds : integer\n  ingest_rate_limit_threshold : integer\n  domain_changed_from : string\n  domain_changed_at : naive_datetime\n  imported_data : map\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Site.GoogleAuth {\n  id : id\n  --\n  email : string\n  property : string\n  refresh_token : string\n  access_token : string\n  expires : naive_datetime\n  user_id : id\n  site_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Site.ImportedData {\n  id : binary_id\n  --\n  start_date : date\n  end_date : date\n  source : string\n  status : string\n}\n\nentity Plausible.Site.Membership {\n  id : id\n  --\n  role : enum(owner,admin,viewer)\n  site_id : id\n  user_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Site.MonthlyReport {\n  id : id\n  --\n  recipients : array\n  site_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Site.SharedLink {\n  id : id\n  --\n  site_id : id\n  name : string\n  slug : string\n  password_hash : string\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Site.SpikeNotification {\n  id : id\n  --\n  recipients : array\n  threshold : integer\n  last_sent : naive_datetime\n  site_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Site.UserPreference {\n  id : id\n  --\n  pinned_at : naive_datetime\n  user_id : id\n  site_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nentity Plausible.Site.WeeklyReport {\n  id : id\n  --\n  recipients : array\n  site_id : id\n  inserted_at : naive_datetime\n  updated_at : naive_datetime\n}\n\nPlausible.Funnel ||--|{ Plausible.Funnel.Step\nPlausible.Goal ||--|{ Plausible.Funnel.Step\nPlausible.Site ||--|{ Plausible.Funnel\nPlausible.Site ||--|{ Plausible.Goal\nPlausible.Site ||--o| Plausible.Site.GoogleAuth\nPlausible.Site ||--|{ Plausible.Auth.Invitation\nPlausible.Site ||--o| Plausible.Site.MonthlyReport\nPlausible.Site ||--|{ Plausible.Plugins.API.Token\nPlausible.Site ||--|{ Plausible.Site.SharedLink\nPlausible.Site ||--|{ Plausible.Shield.CountryRule\nPlausible.Site ||--|{ Plausible.Shield.HostnameRule\nPlausible.Site ||--|{ Plausible.Shield.IPRule\nPlausible.Site ||--|{ Plausible.Shield.PageRule\nPlausible.Site ||--|{ Plausible.Imported.SiteImport\nPlausible.Site ||--o| Plausible.Site.Membership\nPlausible.Site ||--|{ Plausible.Site.UserPreference\nPlausible.Site ||--o| Plausible.Site.SpikeNotification\nPlausible.Site ||--o| Plausible.Site.WeeklyReport\nPlausible.Site ||--o| Plausible.Site.ImportedData\nPlausible.Auth.User ||--o| Plausible.Auth.GracePeriod\nPlausible.Auth.User ||--|{ Plausible.Auth.ApiKey\nPlausible.Auth.User ||--|{ Plausible.Auth.EmailActivationCode\nPlausible.Auth.User ||--o| Plausible.Billing.EnterprisePlan\nPlausible.Auth.User ||--o| Plausible.Site.GoogleAuth\nPlausible.Auth.User ||--|{ Plausible.Auth.Invitation\nPlausible.Auth.User ||--|{ Plausible.Imported.SiteImport\nPlausible.Auth.User ||--|{ Plausible.Site.Membership\nPlausible.Auth.User ||--|{ Plausible.Site.UserPreference\nPlausible.Auth.User ||--o| Plausible.Billing.Subscription\nPlausible.Auth.User ||--|{ Plausible.Auth.TOTP.RecoveryCode\n@enduml\n"
  },
  {
    "path": "examples/quick_dbd/changelog.com/Default.qdbd",
    "content": "episodes\n---\nid integer PK\nslug varchar\nguid varchar\ntitle varchar\nsubtitle varchar\ntype integer\nfeatured boolean\nhighlight varchar\nsubhighlight varchar\nsummary varchar\nnotes varchar\ndoc_url varchar\nsocialize_url varchar\npublished boolean\npublished_at timestamp\nrecorded_at timestamp\nrecorded_live boolean\nyoutube_id varchar\ncover varchar\naudio_file varchar\naudio_bytes integer\naudio_duration integer\naudio_chapters jsonb\nplusplus_file varchar\nplusplus_bytes integer\nplusplus_duration integer\nplusplus_chapters jsonb\ndownload_count float\nimport_count float\nreach_count integer\nemail_subject varchar\nemail_teaser varchar\nemail_content varchar\nemail_sends integer\nemail_opens integer\ntranscript array\npodcast_id integer FK >- podcasts.id\nrequest_id integer FK - episode_requests.id\ninserted_at timestamp\nupdated_at timestamp\n\nepisode_guests\n---\nid integer PK\nposition integer\nthanks boolean\ndiscount_code varchar\nepisode_id integer FK >- episodes.id\nperson_id integer FK >- people.id\ninserted_at timestamp\nupdated_at timestamp\n\nepisode_hosts\n---\nid integer PK\nposition integer\nperson_id integer FK >- people.id\nepisode_id integer FK >- episodes.id\ninserted_at timestamp\nupdated_at timestamp\n\nepisode_requests\n---\nid integer PK\nstatus integer\nhosts varchar\nguests varchar\ntopics varchar\npitch varchar\npronunciation varchar\nmessage varchar\npodcast_id integer FK >- podcasts.id\nsubmitter_id integer FK >- people.id\ninserted_at timestamp\nupdated_at timestamp\n\nepisode_sponsors\n---\nid integer PK\nposition integer\ntitle varchar\nlink_url varchar\ndescription varchar\nstarts_at float\nends_at float\nepisode_id integer FK >- episodes.id\nsponsor_id integer FK >- sponsors.id\ninserted_at timestamp\nupdated_at timestamp\n\nepisode_stats\n---\nid integer PK\ndate date\nepisode_bytes integer\ntotal_bytes integer\ndownloads float\nuniques integer\ndemographics jsonb\nepisode_id integer FK >- episodes.id\npodcast_id integer FK >- podcasts.id\ninserted_at timestamp\nupdated_at timestamp\n\nepisode_topics\n---\nid integer PK\nposition integer\ntopic_id integer FK >- topics.id\nepisode_id integer FK >- episodes.id\ninserted_at timestamp\nupdated_at timestamp\n\nfeeds\n---\nid integer PK\nname varchar\nslug varchar\ndescription varchar\ntitle_format varchar\nplusplus boolean\nautosub boolean\nstarts_at timestamp\ncover varchar\npodcast_ids array\nperson_ids array\nowner_id integer FK >- people.id\ninserted_at timestamp\nupdated_at timestamp\n\nnews_ads\n---\nid integer PK\nurl varchar\nheadline varchar\nstory varchar\nimage varchar\nactive boolean\nnewsletter boolean\nimpression_count integer\nclick_count integer\nsponsorship_id integer FK >- news_sponsorships.id\ninserted_at timestamp\nupdated_at timestamp\n\nnews_issues\n---\nid integer PK\nslug varchar\nnote varchar\nteaser varchar\npublished boolean\npublished_at timestamp\ninserted_at timestamp\nupdated_at timestamp\n\nnews_issue_ads\n---\nid integer PK\nposition integer\nimage boolean\nad_id integer FK >- news_ads.id\nissue_id integer FK >- news_issues.id\ninserted_at timestamp\nupdated_at timestamp\n\nnews_issue_items\n---\nid integer PK\nposition integer\nimage boolean\nissue_id integer FK >- news_issues.id\nitem_id integer FK >- news_items.id\ninserted_at timestamp\nupdated_at timestamp\n\nnews_items\n---\nid integer PK\nstatus integer\ntype integer\nurl varchar\nheadline varchar\nstory varchar\nimage varchar\nobject_id varchar\nfeed_only boolean\npinned boolean\npublished_at timestamp\nrefreshed_at timestamp\nimpression_count integer\nclick_count integer\nmessage varchar\nauthor_id integer FK >- people.id\nlogger_id integer FK >- people.id\nsubmitter_id integer FK >- people.id\nsource_id integer FK >- news_sources.id\ninserted_at timestamp\nupdated_at timestamp\n\nnews_item_comments\n---\nid integer PK\ncontent varchar\napproved boolean\nedited_at timestamp\ndeleted_at timestamp\nitem_id integer FK >- news_items.id\nauthor_id integer FK >- people.id\nparent_id integer FK >- news_item_comments.id\ninserted_at timestamp\nupdated_at timestamp\n\nnews_item_topics\n---\nid integer PK\nposition integer\nitem_id integer FK >- news_items.id\ntopic_id integer FK >- topics.id\ninserted_at timestamp\nupdated_at timestamp\n\nnews_queue\n---\nid integer PK\nposition float\nitem_id integer FK - news_items.id\n\nnews_sources\n---\nid integer PK\nname varchar\nslug varchar\nwebsite varchar\ntwitter_handle varchar\ndescription varchar\nfeed varchar\nregex varchar\npublication boolean\nicon varchar\ninserted_at timestamp\nupdated_at timestamp\n\nnews_sponsorships\n---\nid integer PK\nname varchar\nweeks array\nimpression_count integer\nclick_count integer\nsponsor_id integer FK >- sponsors.id\ninserted_at timestamp\nupdated_at timestamp\n\npeople\n---\nid integer PK\nname varchar\nemail varchar\nhandle varchar\ngithub_handle varchar\nlinkedin_handle varchar\nmastodon_handle varchar\ntwitter_handle varchar\nslack_id varchar\nwebsite varchar\nbio varchar\nlocation varchar\nauth_token varchar\nauth_token_expires_at timestamp\njoined_at timestamp\nsigned_in_at timestamp\napproved boolean\navatar varchar\nadmin boolean\nhost boolean\neditor boolean\npublic_profile boolean\nsettings jsonb\ninserted_at timestamp\nupdated_at timestamp\n\npodcasts\n---\nid integer PK\nname varchar\nslug varchar\nstatus integer\nwelcome varchar\ndescription varchar\nextended_description varchar\nvanity_domain varchar\nkeywords varchar\nmastodon_handle varchar\ntwitter_handle varchar\napple_url varchar\nspotify_url varchar\nriverside_url varchar\nchartable_id varchar\nschedule_note varchar\ndownload_count float\nreach_count integer\nrecorded_live boolean\npartner boolean\nposition integer\nsubscribers jsonb\ncover varchar\ninserted_at timestamp\nupdated_at timestamp\n\npodcast_hosts\n---\nid integer PK\nposition integer\nretired boolean\nperson_id integer FK >- people.id\npodcast_id integer FK >- podcasts.id\ninserted_at timestamp\nupdated_at timestamp\n\npodcast_topics\n---\nid integer PK\nposition integer\npodcast_id integer FK >- podcasts.id\ntopic_id integer FK >- topics.id\ninserted_at timestamp\nupdated_at timestamp\n\nposts\n---\nid integer PK\ntitle varchar\nsubtitle varchar\nslug varchar\nguid varchar\ncanonical_url varchar\nimage varchar\ntldr varchar\nbody varchar\npublished boolean\npublished_at timestamp\nauthor_id integer FK >- people.id\neditor_id integer FK >- people.id\ninserted_at timestamp\nupdated_at timestamp\n\npost_topics\n---\nid integer PK\nposition integer\ntopic_id integer FK >- topics.id\npost_id integer FK >- posts.id\ninserted_at timestamp\nupdated_at timestamp\n\nsponsors\n---\nid integer PK\nname varchar\ndescription varchar\nwebsite varchar\ngithub_handle varchar\ntwitter_handle varchar\navatar varchar\ncolor_logo varchar\ndark_logo varchar\nlight_logo varchar\ninserted_at timestamp\nupdated_at timestamp\n\nsponsor_reps\n---\nid integer PK\nsponsor_id integer FK >- sponsors.id\nperson_id integer FK >- people.id\ninserted_at timestamp\nupdated_at timestamp\n\nsubscriptions\n---\nid integer PK\nunsubscribed_at timestamp\ncontext varchar\nepisode_id integer FK >- episodes.id\nitem_id integer FK >- news_items.id\nperson_id integer FK >- people.id\npodcast_id integer FK >- podcasts.id\ninserted_at timestamp\nupdated_at timestamp\n\ntopics\n---\nid integer PK\nname varchar\nslug varchar\ndescription varchar\nwebsite varchar\ntwitter_handle varchar\nicon varchar\ninserted_at timestamp\nupdated_at timestamp\n\nschema_migrations\n---\nversion integer PK\ninserted_at timestamp\n\noban_jobs\n---\nid integer PK\nstate varchar\nqueue varchar\nworker varchar\nargs jsonb\nmeta jsonb\ntags array\nerrors array\nattempt integer\nattempted_by array\nmax_attempts integer\npriority integer\nattempted_at timestamp\ncancelled_at timestamp\ncompleted_at timestamp\ndiscarded_at timestamp\ninserted_at timestamp\nscheduled_at timestamp"
  },
  {
    "path": "examples/quick_dbd/hexpm/Default.qdbd",
    "content": "schema_migrations\n---\nversion integer PK\ninserted_at timestamp\n\naudit_logs\n---\nid integer PK\nuser_agent varchar\nremote_ip varchar\naction varchar\nparams jsonb\nuser_id integer FK >- users.id\norganization_id integer FK >- organizations.id\nkey_id integer FK >- keys.id\ninserted_at timestamp\n\nemails\n---\nid integer PK\nemail varchar\nverified boolean\nprimary boolean\npublic boolean\ngravatar boolean\nverification_key varchar\nverification_expiry timestamp\nuser_id integer FK >- users.id\ninserted_at timestamp\nupdated_at timestamp\n\nkeys\n---\nid integer PK\nname varchar\nsecret_first varchar\nsecret_second varchar\npublic boolean\nrevoke_at timestamp\ninserted_at timestamp\nupdated_at timestamp\nlast_use jsonb\nuser_id integer FK >- users.id\norganization_id integer FK >- organizations.id\npermissions jsonb\n\norganizations\n---\nid integer PK\nname varchar\nbilling_active boolean\nbilling_override boolean\ntrial_end timestamp\ninserted_at timestamp\nupdated_at timestamp\n\norganization_users\n---\nid integer PK\nrole varchar\norganization_id integer FK >- organizations.id\nuser_id integer FK >- users.id\ninserted_at timestamp\nupdated_at timestamp\n\npassword_resets\n---\nid integer PK\nkey varchar\nprimary_email varchar\nuser_id integer FK >- users.id\ninserted_at timestamp\n\nsessions\n---\nid integer PK\ntoken bytea\ndata jsonb\ninserted_at timestamp\nupdated_at timestamp\n\nusers\n---\nid integer PK\nusername varchar\nfull_name varchar\npassword varchar\nservice boolean\ndeactivated_at timestamp\nrole varchar\ninserted_at timestamp\nupdated_at timestamp\nhandles jsonb\ntfa jsonb\norganization_id integer FK - organizations.id\n\nblocked_addresses\n---\nid integer PK\nip varchar\ncomment varchar\n\ndownloads\n---\nid integer PK\npackage_id integer FK >- packages.id\nrelease_id integer FK >- releases.id\ndownloads integer\nday date\n\ninstalls\n---\nid integer PK\nhex varchar\nelixirs array\n\npackages\n---\nid integer PK\nname varchar\ndocs_updated_at timestamp\ninserted_at timestamp\nupdated_at timestamp\nrepository_id integer FK >- repositories.id\nmeta jsonb\n\npackage_dependants\n---\nid integer PK\npackage_id integer FK >- packages.id\nname varchar\nrepo varchar\n\npackage_downloads\n---\npackage_id integer FK >- packages.id\nview varchar\ndownloads integer\n\npackage_owners\n---\nid integer PK\nlevel varchar\npackage_id integer FK >- packages.id\nuser_id integer FK >- users.id\ninserted_at timestamp\nupdated_at timestamp\n\npackage_reports\n---\nid integer PK\nstate varchar\ndescription varchar\nauthor_id integer FK >- users.id\npackage_id integer FK >- packages.id\ninserted_at timestamp\nupdated_at timestamp\n\npackage_report_comments\n---\nid integer PK\ntext varchar\ninserted_at timestamp\nupdated_at timestamp\npackage_report_id integer FK >- package_reports.id\nauthor_id integer FK >- users.id\n\npackage_report_releases\n---\nid integer PK\nrelease_id integer FK >- releases.id\npackage_report_id integer FK >- package_reports.id\ninserted_at timestamp\nupdated_at timestamp\n\nreleases\n---\nid integer PK\nversion varchar\ninner_checksum bytea\nouter_checksum bytea\nhas_docs boolean\ninserted_at timestamp\nupdated_at timestamp\npackage_id integer FK >- packages.id\npublisher_id integer FK >- users.id\nmeta jsonb\nretirement jsonb\n\nrelease_downloads\n---\npackage_id integer FK >- packages.id\nrelease_id integer FK - releases.id\ndownloads integer\n\nrepositories\n---\nid integer PK\nname varchar\ninserted_at timestamp\nupdated_at timestamp\norganization_id integer FK - organizations.id\n\nrequirements\n---\nid integer PK\napp varchar\nrequirement varchar\noptional boolean\nrelease_id integer FK >- releases.id\ndependency_id integer FK >- packages.id\n\nshort_urls\n---\nid integer PK\nurl varchar\nshort_code varchar\ninserted_at timestamp"
  },
  {
    "path": "examples/quick_dbd/hexpm/Only-selected-cluster-Accounts-context.qdbd",
    "content": "audit_logs\n---\nid integer PK\nuser_agent varchar\nremote_ip varchar\naction varchar\nparams jsonb\nuser_id integer FK >- users.id\norganization_id integer FK >- organizations.id\nkey_id integer FK >- keys.id\ninserted_at timestamp\n\nemails\n---\nid integer PK\nemail varchar\nverified boolean\nprimary boolean\npublic boolean\ngravatar boolean\nverification_key varchar\nverification_expiry timestamp\nuser_id integer FK >- users.id\ninserted_at timestamp\nupdated_at timestamp\n\nkeys\n---\nid integer PK\nname varchar\nsecret_first varchar\nsecret_second varchar\npublic boolean\nrevoke_at timestamp\ninserted_at timestamp\nupdated_at timestamp\nlast_use jsonb\nuser_id integer FK >- users.id\norganization_id integer FK >- organizations.id\npermissions jsonb\n\norganizations\n---\nid integer PK\nname varchar\nbilling_active boolean\nbilling_override boolean\ntrial_end timestamp\ninserted_at timestamp\nupdated_at timestamp\n\norganization_users\n---\nid integer PK\nrole varchar\norganization_id integer FK >- organizations.id\nuser_id integer FK >- users.id\ninserted_at timestamp\nupdated_at timestamp\n\npassword_resets\n---\nid integer PK\nkey varchar\nprimary_email varchar\nuser_id integer FK >- users.id\ninserted_at timestamp\n\nsessions\n---\nid integer PK\ntoken bytea\ndata jsonb\ninserted_at timestamp\nupdated_at timestamp\n\nusers\n---\nid integer PK\nusername varchar\nfull_name varchar\npassword varchar\nservice boolean\ndeactivated_at timestamp\nrole varchar\ninserted_at timestamp\nupdated_at timestamp\nhandles jsonb\ntfa jsonb\norganization_id integer FK - organizations.id"
  },
  {
    "path": "examples/quick_dbd/plausible-analytics/Default.qdbd",
    "content": "schema_migrations\n---\nversion integer PK\ninserted_at timestamp\n\nfun_with_flags_toggles\n---\nid integer PK\nflag_name varchar\ngate_type varchar\ntarget varchar\nenabled boolean\n\noban_jobs\n---\nid integer PK\nstate varchar\nqueue varchar\nworker varchar\nargs jsonb\nmeta jsonb\ntags array\nerrors array\nattempt integer\nattempted_by array\nmax_attempts integer\npriority integer\nattempted_at timestamp\ncancelled_at timestamp\ncompleted_at timestamp\ndiscarded_at timestamp\ninserted_at timestamp\nscheduled_at timestamp\n\napi_keys\n---\nid integer PK\nname varchar\nscopes array\nhourly_request_limit integer\nkey_hash varchar\nkey_prefix varchar\nuser_id integer FK >- users.id\ninserted_at timestamp\nupdated_at timestamp\n\nemail_activation_codes\n---\nid integer PK\ncode varchar\nissued_at timestamp\nuser_id integer FK >- users.id\n\ninvitations\n---\nid integer PK\ninvitation_id varchar\nemail varchar\nrole \"enum(owner,admin,viewer)\"\ninviter_id integer FK >- users.id\nsite_id integer FK >- sites.id\ninserted_at timestamp\nupdated_at timestamp\n\ntotp_recovery_codes\n---\nid integer PK\ncode_digest varchar\nuser_id integer FK >- users.id\ninserted_at timestamp\n\nusers\n---\nid integer PK\nemail varchar\npassword_hash varchar\nname varchar\nlast_seen timestamp\ntrial_expiry_date date\ntheme \"enum(system,light,dark)\"\nemail_verified boolean\nprevious_email varchar\naccept_traffic_until date\nallow_next_upgrade_override boolean\ntotp_enabled boolean\ntotp_secret bytea\ntotp_token varchar\ntotp_last_used_at timestamp\ngrace_period jsonb\ninserted_at timestamp\nupdated_at timestamp\n\nenterprise_plans\n---\nid integer PK\npaddle_plan_id varchar\nbilling_interval \"enum(yearly,monthly)\"\nmonthly_pageview_limit integer\nsite_limit integer\nteam_member_limit integer\nfeatures array\nhourly_api_request_limit integer\nuser_id integer FK - users.id\ninserted_at timestamp\nupdated_at timestamp\n\nsubscriptions\n---\nid integer PK\npaddle_subscription_id varchar\npaddle_plan_id varchar\nupdate_url varchar\ncancel_url varchar\nstatus \"enum(active,deleted,past_due,paused)\"\nnext_bill_amount varchar\nnext_bill_date date\nlast_bill_date date\ncurrency_code varchar\nuser_id integer FK - users.id\ninserted_at timestamp\nupdated_at timestamp\n\nevents_v2\n---\nname unknown\nsite_id unknown\nhostname varchar\npathname varchar\nuser_id unknown\nsession_id unknown\ntimestamp timestamp\n\"meta.key\" array\n\"meta.value\" array\nrevenue_source_amount unknown\nrevenue_source_currency unknown\nrevenue_reporting_amount unknown\nrevenue_reporting_currency unknown\nreferrer varchar\nreferrer_source varchar\nutm_medium varchar\nutm_source varchar\nutm_campaign varchar\nutm_content varchar\nutm_term varchar\ncountry_code unknown\nsubdivision1_code unknown\nsubdivision2_code unknown\ncity_geoname_id unknown\nscreen_size unknown\noperating_system unknown\noperating_system_version unknown\nbrowser unknown\nbrowser_version unknown\n\nsessions_v2\n---\nhostname varchar\nsite_id unknown\nuser_id unknown\nsession_id unknown\nstart timestamp\nduration unknown\nis_bounce unknown\nentry_page varchar\nexit_page varchar\nexit_page_hostname varchar\npageviews unknown\nevents unknown\nsign unknown\n\"entry_meta.key\" array\n\"entry_meta.value\" array\nutm_medium varchar\nutm_source varchar\nutm_campaign varchar\nutm_content varchar\nutm_term varchar\nreferrer varchar\nreferrer_source varchar\ncountry_code unknown\nsubdivision1_code unknown\nsubdivision2_code unknown\ncity_geoname_id unknown\nscreen_size unknown\noperating_system unknown\noperating_system_version unknown\nbrowser unknown\nbrowser_version unknown\ntimestamp timestamp\ntransferred_from varchar\n\ndomains_lookup\n---\nsite_id unknown\ndomain varchar\n\nfunnels\n---\nid integer PK\nname varchar\nsite_id integer FK >- sites.id\ninserted_at timestamp\nupdated_at timestamp\n\nfunnel_steps\n---\nid integer PK\nstep_order integer\nfunnel_id integer FK >- funnels.id\ngoal_id integer FK >- goals.id\ninserted_at timestamp\nupdated_at timestamp\n\ngoals\n---\nid integer PK\nevent_name varchar\npage_path varchar\ncurrency \"enum(KMF,AUD,SAR,BWP,BBD,EGP,YER,CDF,IQD,MRU,JOD,XPT,XBB,NGN,BDT,CNY,ANG,GTQ,HTG,TWD,OMR,STN,AOA,MUR,XCD,TND,THB,KES,GIP,MZN,ERN,MAD,FKP,MVR,BND,KZT,EUR,SYP,MYR,RSD,KRW,COU,GMD,ILS,BAM,XAG,AZN,AFN,AWG,SOS,PAB,AED,UYI,BTN,USN,KPW,IDR,XPD,MOP,GEL,MXV,CHW,XAF,UGX,DJF,SGD,PGK,IRR,VES,PHP,SSP,BOB,XDR,JPY,BHD,UAH,ZAR,BSD,TMT,XOF,XTS,MNT,XSU,XPF,TTD,PLN,AMD,SBD,LSL,GBP,DOP,SEK,MDL,CUP,CZK,SZL,COP,XAU,NOK,CLF,RWF,NAD,KHR,TRY,LAK,SDG,XXX,PEN,LBP,BZD,CLP,KGS,TZS,GNF,KWD,NZD,SVC,LRD,CHF,PKR,SHP,XUA,XBD,LYD,BIF,JMD,ALL,BYN,CUC,UZS,MKD,ZWL,RON,NIO,MMK,SRD,ETB,ARS,GHS,XBA,XBC,UYW,HKD,ISK,DZD,MWK,RUB,SLL,SCR,CHE,CVE,VND,ZMW,HNL,HUF,INR,DKK,FJD,HRK,UYU,PYG,BMD,KYD,VUV,BGN,TOP,MXN,CAD,MGA,BOV,BRL,WST,NPR,CRC,GYD,TJS,LKR,QAR,USD)\"\nsite_id integer FK >- sites.id\ninserted_at timestamp\nupdated_at timestamp\n\nimported_browsers\n---\nsite_id unknown\nimport_id unknown\ndate date\nbrowser varchar\nbrowser_version varchar\nvisitors unknown\nvisits unknown\nvisit_duration unknown\npageviews unknown\nbounces unknown\n\nimported_devices\n---\nsite_id unknown\nimport_id unknown\ndate date\ndevice varchar\nvisitors unknown\nvisits unknown\nvisit_duration unknown\npageviews unknown\nbounces unknown\n\nimported_entry_pages\n---\nsite_id unknown\nimport_id unknown\ndate date\nentry_page varchar\nvisitors unknown\nentrances unknown\nvisit_duration unknown\npageviews unknown\nbounces unknown\n\nimported_exit_pages\n---\nsite_id unknown\nimport_id unknown\ndate date\nexit_page varchar\nexits unknown\nvisitors unknown\nvisit_duration unknown\npageviews unknown\nbounces unknown\n\nimported_locations\n---\nsite_id unknown\nimport_id unknown\ndate date\ncountry varchar\nregion varchar\ncity unknown\nvisitors unknown\nvisits unknown\nvisit_duration unknown\npageviews unknown\nbounces unknown\n\nimported_operating_systems\n---\nsite_id unknown\nimport_id unknown\ndate date\noperating_system varchar\noperating_system_version varchar\nvisitors unknown\nvisits unknown\nvisit_duration unknown\npageviews unknown\nbounces unknown\n\nimported_pages\n---\nsite_id unknown\nimport_id unknown\ndate date\nhostname varchar\npage varchar\nvisits unknown\nvisitors unknown\nactive_visitors unknown\npageviews unknown\nexits unknown\ntime_on_page unknown\n\nsite_imports\n---\nid integer PK\nstart_date date\nend_date date\nlabel varchar\nsource \"enum(noop,csv,universal_analytics,google_analytics_4)\"\nstatus \"enum(pending,failed,completed,importing)\"\nlegacy boolean\nsite_id integer FK >- sites.id\nimported_by_id integer FK >- users.id\ninserted_at timestamp\nupdated_at timestamp\n\nimported_sources\n---\nsite_id unknown\nimport_id unknown\ndate date\nsource varchar\nreferrer varchar\nutm_source varchar\nutm_medium varchar\nutm_campaign varchar\nutm_content varchar\nutm_term varchar\nvisitors unknown\nvisits unknown\nvisit_duration unknown\npageviews unknown\nbounces unknown\n\nimported_visitors\n---\nsite_id unknown\nimport_id unknown\ndate date\nvisitors unknown\npageviews unknown\nbounces unknown\nvisits unknown\nvisit_duration unknown\n\ningest_counters\n---\nevent_timebucket timestamp\nsite_id unknown\ndomain unknown\nmetric unknown\nvalue unknown\n\nplugins_api_tokens\n---\nid uuid PK\ninserted_at timestamp\nupdated_at timestamp\ntoken_hash bytea\ndescription varchar\nhint varchar\nlast_used_at timestamp\nsite_id integer FK >- sites.id\n\nshield_rules_country\n---\nid uuid PK\nsite_id integer FK >- sites.id\ncountry_code varchar\naction \"enum(allow,deny)\"\nadded_by varchar\ninserted_at timestamp\nupdated_at timestamp\n\nshield_rules_hostname\n---\nid uuid PK\nsite_id integer FK >- sites.id\nhostname varchar\nhostname_pattern varchar\naction \"enum(allow,deny)\"\nadded_by varchar\ninserted_at timestamp\nupdated_at timestamp\n\nshield_rules_ip\n---\nid uuid PK\nsite_id integer FK >- sites.id\ninet inet\naction \"enum(allow,deny)\"\ndescription varchar\nadded_by varchar\ninserted_at timestamp\nupdated_at timestamp\n\nshield_rules_page\n---\nid uuid PK\nsite_id integer FK >- sites.id\npage_path varchar\npage_path_pattern varchar\naction \"enum(allow,deny)\"\nadded_by varchar\ninserted_at timestamp\nupdated_at timestamp\n\nsites\n---\nid integer PK\ndomain varchar\ntimezone varchar\npublic boolean\nlocked boolean\nstats_start_date date\nnative_stats_start_at timestamp\nallowed_event_props array\nconversions_enabled boolean\nprops_enabled boolean\nfunnels_enabled boolean\ningest_rate_limit_scale_seconds integer\ningest_rate_limit_threshold integer\ndomain_changed_from varchar\ndomain_changed_at timestamp\nimported_data jsonb\ninserted_at timestamp\nupdated_at timestamp\n\ngoogle_auth\n---\nid integer PK\nemail varchar\nproperty varchar\nrefresh_token varchar\naccess_token varchar\nexpires timestamp\nuser_id integer FK - users.id\nsite_id integer FK - sites.id\ninserted_at timestamp\nupdated_at timestamp\n\nsite_memberships\n---\nid integer PK\nrole \"enum(owner,admin,viewer)\"\nsite_id integer FK - sites.id\nuser_id integer FK >- users.id\ninserted_at timestamp\nupdated_at timestamp\n\nmonthly_reports\n---\nid integer PK\nrecipients array\nsite_id integer FK - sites.id\ninserted_at timestamp\nupdated_at timestamp\n\nshared_links\n---\nid integer PK\nsite_id integer FK >- sites.id\nname varchar\nslug varchar\npassword_hash varchar\ninserted_at timestamp\nupdated_at timestamp\n\nspike_notifications\n---\nid integer PK\nrecipients array\nthreshold integer\nlast_sent timestamp\nsite_id integer FK - sites.id\ninserted_at timestamp\nupdated_at timestamp\n\nsite_user_preferences\n---\nid integer PK\npinned_at timestamp\nuser_id integer FK >- users.id\nsite_id integer FK >- sites.id\ninserted_at timestamp\nupdated_at timestamp\n\nweekly_reports\n---\nid integer PK\nrecipients array\nsite_id integer FK - sites.id\ninserted_at timestamp\nupdated_at timestamp"
  },
  {
    "path": "examples_generator.exs",
    "content": "defmodule Ecto.ERD.ExamplesGenerator do\n  require Logger\n\n  @shared_examples [\n    [name: \"Default\", formats: [:dbml, :dot, :qdbd, :puml, :mmd]],\n    [\n      name: \"No fields\",\n      formats: [:dot, :mmd],\n      config: \"\"\"\n      [\n        columns: []\n      ]\n      \"\"\"\n    ],\n    [\n      name: \"Contexts as clusters\",\n      formats: [:dbml, :dot, :puml],\n      config: \"\"\"\n      alias Ecto.ERD.Node\n\n      [\n        map_node: fn\n          %Node{schema_module: schema_module} = node ->\n            case Module.split(schema_module) do\n              [_] -> node\n              [namespace, _] -> node |> Node.set_cluster(namespace)\n              parts -> node |> Node.set_cluster(parts |> Enum.take(2) |> Enum.join(\".\"))\n            end\n        end\n      ]\n      \"\"\"\n    ],\n    [\n      name: \"Contexts as clusters (no fields)\",\n      formats: [:dot, :puml],\n      config: \"\"\"\n      alias Ecto.ERD.Node\n\n      [\n        columns: [],\n        map_node: fn\n          %Node{schema_module: schema_module} = node ->\n            case Module.split(schema_module) do\n              [_] -> node\n              [namespace, _] -> node |> Node.set_cluster(namespace)\n              parts -> node |> Node.set_cluster(parts |> Enum.take(2) |> Enum.join(\".\"))\n            end\n        end\n      ]\n      \"\"\"\n    ]\n  ]\n\n  @data %{\n    \"plausible-analytics\" => %{\n      repo: \"git@github.com:plausible/analytics.git\",\n      commit: \"ca25b6c7649c6ab9c9268eb57c7931dca1393b94\",\n      examples: @shared_examples\n    },\n    \"changelog.com\" => %{\n      repo: \"git@github.com:thechangelog/changelog.com.git\",\n      commit: \"840f6e4fa69e51b680d5462f99db9f5953bf0fdf\",\n      examples:\n        Enum.filter(@shared_examples, fn example -> example[:name] in [\"Default\", \"No fields\"] end) ++\n          [\n            [\n              name: \"Clusters\",\n              formats: [:dbml, :dot, :puml],\n              config: \"\"\"\n              alias Ecto.ERD.Node\n\n              [\n                map_node: fn\n                  %Node{schema_module: schema_module} = node ->\n                    cluster_name =\n                      cond do\n                        schema_module in [\n                          Changelog.Episode,\n                          Changelog.EpisodeChapter,\n                          Changelog.EpisodeGuest,\n                          Changelog.EpisodeHost,\n                          Changelog.EpisodeRequest,\n                          Changelog.EpisodeSponsor,\n                          Changelog.EpisodeStat,\n                          Changelog.EpisodeTopic\n                        ] ->\n                          \"EPISODE\"\n\n                        schema_module in [Changelog.Post, Changelog.PostTopic] ->\n                          \"POST\"\n\n                        schema_module in [Changelog.Podcast, Changelog.PodcastHost, Changelog.PodcastTopic] ->\n                          \"PODCAST\"\n\n                        schema_module in [Changelog.Sponsor, Changelog.SponsorRep] ->\n                          \"SPONSOR\"\n\n                        schema_module in [Changelog.Person, Changelog.Person.Settings] ->\n                          \"PERSON\"\n\n                        schema_module in [\n                            Changelog.EpisodeNewsItem,\n                            Changelog.NewsAd,\n                            Changelog.NewsIssue,\n                            Changelog.NewsIssueAd,\n                            Changelog.NewsIssueItem,\n                            Changelog.NewsItem,\n                            Changelog.NewsItemComment,\n                            Changelog.NewsItemTopic,\n                            Changelog.NewsQueue,\n                            Changelog.NewsSource,\n                            Changelog.NewsSponsorship,\n                            Changelog.PostNewsItem\n                          ] -> \"NEWS\"\n\n                        true ->\n                          nil\n                      end\n\n                    Node.set_cluster(node, cluster_name)\n                end\n              ]\n              \"\"\"\n            ]\n          ]\n    },\n    \"hexpm\" => %{\n      repo: \"git@github.com:hexpm/hexpm.git\",\n      commit: \"1fb4816abaa8ef23f40795dfa93b9e6b7c569452\",\n      examples:\n        @shared_examples ++\n          [\n            [\n              name: \"Only selected cluster (Accounts context)\",\n              formats: [:dbml, :dot, :qdbd, :puml],\n              config: \"\"\"\n              alias Ecto.ERD.Node\n\n              [\n                map_node: fn\n                  %Node{schema_module: schema_module} = node ->\n                    cluster_name = schema_module |> Module.split() |> Enum.take(2) |> Enum.join(\".\")\n                    case cluster_name do\n                      \"Hexpm.Accounts\" -> node |> Node.set_cluster(cluster_name)\n                      _ -> nil\n                    end\n                end\n              ]\n              \"\"\"\n            ],\n            [\n              name: \"Only embedded schemas\",\n              formats: [:dot, :puml],\n              config: \"\"\"\n              alias Ecto.ERD.Node\n\n              [\n                map_node: fn\n                  %Node{source: nil} = node -> node\n                  _ -> nil\n                end\n              ]\n              \"\"\"\n            ]\n          ]\n    }\n  }\n\n  @formats %{\n    dot: %{examples_dir: \"examples/dot\", name: \"DOT\", image?: true},\n    dbml: %{examples_dir: \"examples/dbml\", name: \"DBML\", image?: false},\n    qdbd: %{examples_dir: \"examples/quick_dbd\", name: \"QuickDBD\", image?: false},\n    puml: %{examples_dir: \"examples/plantuml\", name: \"PlantUML\", image?: true},\n    mmd: %{examples_dir: \"examples/mermaid\", name: \"Mermaid\", image?: false}\n  }\n\n  def run(source_url_root) do\n    File.mkdir_p(\"tmp/docs\")\n    Enum.each(@formats, fn {_, %{examples_dir: dir}} -> File.mkdir_p(dir) end)\n    File.mkdir(\"tmp/repos\")\n    File.mkdir(\"tmp/config_files\")\n\n    Logger.debug(\"Init projects\", ansi_color: :yellow)\n\n    Enum.each(@data, fn {project_name, %{repo: repo, commit: commit}} ->\n      Enum.each(@formats, fn {_, %{examples_dir: dir}} ->\n        File.mkdir(Path.join(dir, project_name))\n      end)\n\n      File.mkdir(Path.join(\"tmp/config_files\", project_name))\n      init_project(project_name, repo, commit)\n    end)\n\n    Logger.debug(\"Generating examples\", ansi_color: :yellow)\n\n    @data\n    |> Enum.flat_map(fn {project_name, %{examples: examples}} ->\n      Enum.map(examples, fn example ->\n        Task.async(fn -> generate_example(example, project_name) end)\n      end)\n    end)\n    |> Task.yield_many(:infinity)\n\n    Logger.debug(\"Generating markdown docs\", ansi_color: :yellow)\n    Enum.each(@data, &generate_doc(&1, source_url_root))\n    Logger.debug(\"Done\", ansi_color: :green)\n  end\n\n  defp generate_doc({project_name, %{repo: repo, examples: examples}}, source_url_root) do\n    examples_md =\n      examples\n      |> Enum.map_join(\"\\n\\n\", fn example ->\n        config_content =\n          if example[:config] do\n            \"\"\"\n            #### Config file\n\n            ```elixir\n            # .ecto_erd.exs\n            #{example[:config]}\n            ```\n            \"\"\"\n          end\n\n        output =\n          example[:formats]\n          |> Enum.map(fn\n            format ->\n              document_url =\n                Path.join([\n                  source_url_root,\n                  @formats[format].examples_dir,\n                  project_name,\n                  slugify(example[:name]) <> \".#{format}\"\n                ])\n\n              image_url =\n                if @formats[format].image? do\n                  Path.rootname(document_url) <> \".png\"\n                end\n\n              [\n                \"**#{@formats[format].name}**\"\n                | Enum.map([document_url, image_url], fn\n                    nil -> \"—\"\n                    url -> \"[View](#{url})\"\n                  end)\n              ]\n          end)\n\n        output_content = \"\"\"\n        #### Output\n\n        #{as_table(output, [\"Format\", \"Document\", \"Image\"])}\n        \"\"\"\n\n        \"\"\"\n        ## #{example[:name]}\n\n        #{output_content}\n\n        #{config_content}\n        \"\"\"\n      end)\n\n    content = \"\"\"\n    # #{project_name}\n\n    Repo: `#{repo}`\n\n    #{examples_md}\n    \"\"\"\n\n    File.write!(Path.join(\"tmp/docs\", project_name <> \".md\"), content)\n  end\n\n  defp generate_example(example, project_name) do\n    Logger.debug(\"#{project_name}: generating #{example[:name]}\")\n    slug = slugify(example[:name])\n\n    example[:formats]\n    |> Enum.map(fn\n      format ->\n        {format,\n         Path.expand(\n           Path.join([@formats[format].examples_dir, project_name, slug <> \".#{format}\"])\n         )}\n    end)\n    |> Enum.each(fn {format, output_path} ->\n      old_output_content =\n        case File.read(output_path) do\n          {:ok, content} -> content\n          {:error, _} -> nil\n        end\n\n      if example[:config] do\n        config_path = Path.expand(Path.join([\"tmp/config_files\", project_name, slug <> \".exs\"]))\n        File.write!(config_path, example[:config])\n\n        System.cmd(\n          \"mix\",\n          [\n            \"ecto.gen.erd\",\n            \"--output-path=#{output_path}\",\n            \"--config-path=#{config_path}\"\n          ],\n          cd: Path.join(\"tmp/repos\", project_name)\n        )\n      else\n        System.cmd(\"mix\", [\"ecto.gen.erd\", \"--output-path=#{output_path}\"],\n          cd: Path.join(\"tmp/repos\", project_name)\n        )\n      end\n\n      {:ok, new_output_content} = File.read(output_path)\n\n      if @formats[format].image? and\n           (old_output_content != new_output_content or\n              not File.exists?(Path.rootname(output_path) <> \".png\")) do\n        Logger.debug(\"Generating image from #{output_path}\")\n        generate_image(format, output_path)\n      end\n    end)\n\n    Logger.debug(\"#{project_name}: generated #{example[:name]}\")\n  end\n\n  defp generate_image(:dot, file) do\n    System.cmd(\"dot\", [\"-Tpng\", file, \"-o\", Path.rootname(file) <> \".png\"])\n  end\n\n  defp generate_image(:puml, file) do\n    System.cmd(\"plantuml\", [file], env: %{\"PLANTUML_LIMIT_SIZE\" => \"8192\"})\n  end\n\n  defp init_project(project_name, repo, commit) do\n    Logger.debug(\"#{project_name}: clone repo\")\n    System.cmd(\"git\", [\"clone\", repo, project_name], cd: \"tmp/repos\")\n    System.cmd(\"git\", [\"fetch\", \"origin\"], cd: Path.join(\"tmp/repos\", project_name))\n    System.cmd(\"git\", [\"checkout\", \"--\", \".\"], cd: Path.join(\"tmp/repos\", project_name))\n    System.cmd(\"git\", [\"checkout\", commit], cd: Path.join(\"tmp/repos\", project_name))\n    add_ecto_erd_to_dependencies(Path.join([\"tmp/repos\", project_name, \"mix.exs\"]))\n    Logger.debug(\"#{project_name}: get dependencies\")\n\n    System.cmd(\"mix\", [\"deps.get\"], cd: Path.join(\"tmp/repos\", project_name))\n\n    Logger.debug(\"#{project_name}: compile\")\n\n    {_, 0} = System.cmd(\"mix\", [\"compile\"], cd: Path.join(\"tmp/repos\", project_name))\n  end\n\n  defp slugify(name) do\n    name |> String.replace(~r/\\s+/, \"-\") |> String.replace(~r/[^\\w-]+/, \"\")\n  end\n\n  defp add_ecto_erd_to_dependencies(path) do\n    dependency_line = inspect({:ecto_erd, path: \"../../../\"})\n    content = File.read!(path)\n\n    if String.contains?(content, dependency_line) do\n      Logger.debug(\"#{dependency_line} already present in #{path}\")\n    else\n      new_content =\n        content\n        |> String.replace(~r|defp? deps(?:\\(\\))? do\\n( +)\\[|, ~s|\\\\0\\n\\\\1  #{dependency_line},|)\n\n      File.write!(path, new_content)\n      Logger.debug(\"Added #{dependency_line} to #{path}\")\n    end\n  end\n\n  def projects, do: Map.keys(@data)\n\n  defp as_table(rows, header) do\n    columns_number = length(header)\n\n    column_widths =\n      1..columns_number\n      |> Map.new(fn column_number ->\n        max_length =\n          [header | rows]\n          |> Enum.map(fn row ->\n            row |> Enum.at(column_number - 1) |> to_string |> String.length()\n          end)\n          |> Enum.max()\n\n        {column_number, max_length}\n      end)\n\n    header_delimiter =\n      1..columns_number\n      |> Enum.map(fn column_number -> String.duplicate(\"-\", column_widths[column_number]) end)\n\n    ([header, header_delimiter] ++ rows)\n    |> Enum.map(fn row ->\n      body =\n        row\n        |> Enum.with_index(1)\n        |> Enum.map_join(\" | \", fn {cell, column_number} ->\n          cell |> to_string() |> String.pad_trailing(column_widths[column_number])\n        end)\n\n      \"| \" <> body <> \" |\"\n    end)\n    |> Enum.intersperse(\"\\n\")\n  end\nend\n"
  },
  {
    "path": "lib/ecto/erd/color.ex",
    "content": "defmodule Ecto.ERD.Color do\n  @moduledoc false\n  @colors ~w(\n      #eedfcc\n      #f0ffff\n      #eee5de\n      #fffafa\n      #f0f8ff\n      #8deeee\n      #b4eeb4\n      #eee685\n      #eee5de\n      #ffefd5\n    )\n  def get(term) do\n    Enum.at(@colors, :erlang.phash2(term, length(@colors)))\n  end\nend\n"
  },
  {
    "path": "lib/ecto/erd/document/dbml.ex",
    "content": "defmodule Ecto.ERD.Document.DBML do\n  @moduledoc false\n  alias Ecto.ERD.{Node, Field, Edge, Graph, Render}\n\n  @behaviour Ecto.ERD.Document\n\n  @impl true\n  def schemaless?, do: true\n\n  @impl true\n  def render(%Graph{nodes: nodes, edges: edges}, _options) do\n    groups =\n      nodes\n      |> Enum.group_by(& &1.cluster, & &1.source)\n      |> Map.delete(nil)\n      |> Enum.map_join(fn {cluster_name, sources} ->\n        \"\"\"\n        TableGroup #{Render.in_quotes(cluster_name)} {\n          #{Enum.map_join(sources, \"\\n  \", &Render.in_quotes/1)}\n        }\n        \"\"\"\n      end)\n\n    enums_mapping = enums_mapping(nodes)\n\n    enums =\n      enums_mapping\n      |> Map.values()\n      |> Enum.uniq()\n      |> Enum.map_join(\"\\n\", fn {name, values} ->\n        \"\"\"\n        Enum #{Render.in_quotes(name)} {\n          #{values |> Enum.map_join(\"\\n  \", &Render.in_quotes/1)}\n        }\n        \"\"\"\n      end)\n\n    tables =\n      Enum.map_join(nodes, \"\\n\", fn %Node{source: source, fields: fields} ->\n        enum_name_by_field_name = fn field_name ->\n          {enum_name, _values} = enums_mapping[[source, field_name]]\n          enum_name\n        end\n\n        \"\"\"\n        Table #{Render.in_quotes(source)} {\n          #{Enum.map_join(fields, \"\\n  \", &render_field(&1, enum_name_by_field_name))}\n        }\n        \"\"\"\n      end)\n\n    refs =\n      edges\n      |> Enum.map(&render_edge/1)\n      |> Enum.reject(&is_nil/1)\n      |> Enum.join(\"\\n\")\n\n    groups <> \"\\n\" <> enums <> \"\\n\" <> tables <> \"\\n\" <> refs\n  end\n\n  defp render_edge(%Edge{to: {nil, _, _}}), do: nil\n\n  defp render_edge(%Edge{\n         from: {from_source, _from_schema, {:field, from_field}},\n         to: {to_source, _to_schema, {:field, to_field}},\n         assoc_types: assoc_types\n       }) do\n    operator =\n      if {:has, :one} in assoc_types do\n        \"-\"\n      else\n        \"<\"\n      end\n\n    [\n      \"Ref:\",\n      Render.in_quotes(from_source) <> \".\" <> Render.in_quotes(from_field),\n      operator,\n      Render.in_quotes(to_source) <> \".\" <> Render.in_quotes(to_field)\n    ]\n    |> Enum.join(\" \")\n  end\n\n  # tries to cut name from #source_#field format to just #field\n  @doc false\n  def enums_mapping(nodes) do\n    nodes\n    |> Enum.flat_map(fn %Node{source: source, fields: fields} ->\n      fields\n      |> Enum.flat_map(fn\n        %Field{name: name, type: {:parameterized, {Ecto.Enum, %{on_dump: on_dump}}}} ->\n          values = on_dump |> Map.values() |> Enum.sort()\n          [{source, name, values}]\n\n        _ ->\n          []\n      end)\n    end)\n    |> Enum.group_by(fn {_source, name, _values} -> name end, fn {source, _name, values} ->\n      {source, values}\n    end)\n    |> Enum.flat_map(fn {name, items} ->\n      values_to_sources =\n        Enum.group_by(items, fn {_source, values} -> values end, fn {source, _values} ->\n          source\n        end)\n\n      enum_name =\n        if map_size(values_to_sources) == 1 do\n          fn _ -> to_string(name) end\n        else\n          fn source -> \"#{source}_#{name}\" end\n        end\n\n      Enum.map(items, fn {source, values} ->\n        {[source, name], {enum_name.(source), values}}\n      end)\n    end)\n    |> Map.new()\n  end\n\n  defp render_field(%Field{name: name, type: type, primary?: primary?}, enum_name_by_field_name) do\n    settings =\n      if primary? do\n        \" [pk]\"\n      else\n        \"\"\n      end\n\n    case type do\n      {:parameterized, {Ecto.Enum, _}} ->\n        \"#{Render.in_quotes(name)} #{Render.in_quotes(enum_name_by_field_name.(name))}#{settings}\"\n\n      _ ->\n        \"#{Render.in_quotes(name)} #{format_type(type)}#{settings}\"\n    end\n  end\n\n  defp format_type(type) do\n    case Ecto.Type.type(type) do\n      {:array, _t} -> \"array\"\n      :id -> \"integer\"\n      :identity -> \"bigint\"\n      :binary_id -> \"uuid\"\n      :string -> \"varchar\"\n      :binary -> \"bytea\"\n      :map -> \"jsonb\"\n      {:map, _} -> \"jsonb\"\n      :time_usec -> \"time\"\n      :utc_datetime -> \"timestamp\"\n      :utc_datetime_usec -> \"timestamp\"\n      :naive_datetime -> \"timestamp\"\n      :naive_datetime_usec -> \"timestamp\"\n      atom when is_atom(atom) -> Atom.to_string(atom)\n      {:parameterized, _} -> \"unknown\"\n    end\n  end\nend\n"
  },
  {
    "path": "lib/ecto/erd/document/dot.ex",
    "content": "defmodule Ecto.ERD.Document.Dot do\n  @moduledoc false\n  alias Ecto.ERD.{HTML, Edge, Node, Field, Graph, Render}\n  @behaviour Ecto.ERD.Document\n\n  @impl true\n  def schemaless?, do: false\n\n  @impl true\n  def render(%Graph{nodes: nodes, edges: edges}, opts) do\n    fontname = opts[:fontname] || \"Roboto Mono\"\n    columns = opts[:columns] || [:name, :type]\n\n    clusters = Enum.group_by(nodes, & &1.cluster)\n    {global_nodes, clusters} = Map.pop(clusters, nil)\n    global_nodes = List.wrap(global_nodes)\n\n    subgraphs =\n      Enum.map(clusters, fn {cluster_name, nodes} ->\n        \"\"\"\n          subgraph #{Render.in_quotes(\"cluster_#{cluster_name}\")} {\n            style=filled\n            fontname=#{Render.in_quotes(fontname)}\n            color = #{Render.in_quotes(Ecto.ERD.Color.get(cluster_name))}\n            label = <#{{:font, [\"point-size\": 24], {:b, [], cluster_name}} |> HTML.to_iodata()}>\n            #{Enum.map_join(nodes, \"\\n  \", &render_node(&1, columns))}\n          }\n        \"\"\"\n      end)\n\n    strict? = columns == []\n\n    \"\"\"\n    #{if strict?, do: \"strict \"}digraph {\n      ranksep=1.0; rankdir=LR;\n      node [shape = none, fontname=#{Render.in_quotes(fontname)}];\n      #{Enum.map_join(global_nodes, \"\\n  \", &render_node(&1, columns))}\n    #{subgraphs}\n      #{Enum.map_join(edges, \"\\n  \", &render_edge(&1, columns == []))}\n    }\n    \"\"\"\n  end\n\n  defp render_edge(\n         %Edge{\n           from: from,\n           to: to,\n           assoc_types: assoc_types\n         },\n         skip_port?\n       ) do\n    result = \"#{render_position(from, skip_port?)}:e -> #{render_position(to, skip_port?)}:w\"\n\n    # don't draw arrow if relation is 1 <-> 1\n    if {:has, :one} in assoc_types do\n      result <> \" [dir=none]\"\n    else\n      result\n    end\n  end\n\n  defp render_position({source, schema_module, port}, skip_port?) do\n    string = Render.in_quotes(Node.id(source, schema_module))\n    if skip_port?, do: string, else: string <> \":\" <> Render.in_quotes(Edge.port_name(port))\n  end\n\n  defp render_node(\n         %Node{\n           fields: fields,\n           source: source,\n           schema_module: schema_module\n         },\n         columns\n       ) do\n    field_rows =\n      if columns == [] or fields == [] do\n        []\n      else\n        column_width =\n          Map.new(\n            columns,\n            fn column ->\n              max_length =\n                fields\n                |> Enum.map(fn field -> field |> format_field(column) |> String.length() end)\n                |> Enum.max()\n\n              {column, max_length + 5}\n            end\n          )\n\n        Enum.map(fields, fn %Field{name: name} = field ->\n          {:tr, [],\n           {:td, [align: :left, port: Edge.port_name({:field, name})],\n            Enum.map(columns, fn\n              column ->\n                text = String.pad_trailing(format_field(field, column), column_width[column])\n\n                case column do\n                  :type -> {:i, [], {:font, [color: :gray54], text}}\n                  :name -> if field.primary?, do: {:b, [], text}, else: text\n                end\n            end)}}\n        end)\n      end\n\n    table =\n      {:table,\n       [align: :left, border: 1, style: :rounded, cellspacing: 0, cellpadding: 4, cellborder: 0],\n       [\n         if(schema_module,\n           do:\n             {:tr, [],\n              {:td,\n               if(not is_nil(source) or Enum.empty?(field_rows),\n                 do: [],\n                 else: [border: 1, sides: :b, colspan: length(columns)]\n               ) ++\n                 [\n                   port: Edge.port_name({:header, :schema_module})\n                 ], {:font, [\"point-size\": 18], \"   \" <> inspect(schema_module) <> \"   \"}}}\n         ),\n         if(source,\n           do:\n             {:tr, [],\n              {:td,\n               if(Enum.empty?(field_rows),\n                 do: [],\n                 else: [border: 1, sides: :b, colspan: length(columns)]\n               ),\n               [\n                 {:font, [\"point-size\": 14], {:i, [], source}}\n               ]}}\n         ),\n         field_rows\n       ]}\n      |> HTML.to_iodata()\n\n    Render.in_quotes(Node.id(source, schema_module)) <> \" [label= <#{table}>]\"\n  end\n\n  defp format_field(%Field{name: name}, :name), do: inspect(name)\n\n  defp format_field(%Field{type: type}, :type), do: format_type(type)\n\n  defp format_type({:parameterized, {Ecto.Enum, %{on_dump: on_dump}}}) do\n    \"#Enum<#{inspect(Enum.sort(Map.keys(on_dump)), limit: 10)}>\"\n  end\n\n  defp format_type(\n         {:parameterized,\n          {Ecto.Embedded, %Ecto.Embedded{cardinality: cardinality, related: related}}}\n       ) do\n    \"#Ecto.Embedded<#{inspect([{cardinality, related}])}>\"\n  end\n\n  defp format_type({:array, type}) do\n    \"{:array, #{format_type(type)}}\"\n  end\n\n  defp format_type(type), do: inspect(type)\nend\n"
  },
  {
    "path": "lib/ecto/erd/document/mermaid.ex",
    "content": "defmodule Ecto.ERD.Document.Mermaid do\n  @moduledoc false\n  alias Ecto.ERD.{Node, Field, Edge, Graph}\n  @behaviour Ecto.ERD.Document\n  require Logger\n\n  @impl true\n  def schemaless?, do: true\n\n  @impl true\n  def render(%Graph{nodes: nodes, edges: edges}, opts) do\n    fields_config =\n      case opts[:columns] || [:type, :name] do\n        [] ->\n          :hide_fields\n\n        [:type, :name] ->\n          :show_fields\n\n        _ ->\n          raise \"\"\"\n          Mermaid doesn't support rich customization of columns.\n          You should either set :columns to `[]` in order to hide fields or keep the default value.\n          \"\"\"\n      end\n\n    \"\"\"\n    erDiagram\n      #{nodes |> Enum.map(&render_node(&1, fields_config)) |> Enum.reject(&is_nil/1) |> Enum.join(\"\\n  \")}\n      #{edges |> Enum.map(&render_edge/1) |> Enum.reject(&is_nil/1) |> Enum.join(\"\\n  \")}\n    \"\"\"\n  end\n\n  defp render_node(%Node{source: source, fields: fields}, fields_config) do\n    if name_valid?(source) do\n      case fields_config do\n        :show_fields ->\n          [\n            source,\n            \" {\\n\",\n            fields\n            |> Enum.map(&render_field/1)\n            |> Enum.reject(&is_nil/1)\n            |> Enum.map(&[\"    \", &1])\n            |> Enum.intersperse(\"\\n\"),\n            \"\\n  }\"\n          ]\n\n        :hide_fields ->\n          source\n      end\n    else\n      Logger.warning(\"Source #{inspect(source)} contains invalid symbols and cannot be displayed\")\n\n      nil\n    end\n  end\n\n  defp render_edge(%Edge{\n         from: {from_source, _from_schema, {:field, _from_field}},\n         to: {to_source, _to_schema, {:field, _to_field}},\n         assoc_types: assoc_types\n       }) do\n    if name_valid?(from_source) and name_valid?(to_source) do\n      operator =\n        if {:has, :one} in assoc_types do\n          \"||--o|\"\n        else\n          \"||--|{\"\n        end\n\n      [\n        from_source,\n        operator,\n        to_source,\n        \":\",\n        \"\\\"\\\"\"\n      ]\n      |> Enum.join(\" \")\n    end\n  end\n\n  defp render_field(%Field{} = field) do\n    if name_valid?(to_string(field.name)) do\n      format_type(field.type) <>\n        \" \" <>\n        to_string(field.name) <>\n        if field.primary? do\n          \" PK\"\n        else\n          \"\"\n        end <>\n        if field.comment do\n          ~s( \"#{field.comment}\")\n        else\n          \"\"\n        end\n    else\n      Logger.warning(\n        \"Field name #{inspect(field.name)} contains invalid symbols and cannot be displayed\"\n      )\n\n      nil\n    end\n  end\n\n  defp format_type(type) do\n    case Ecto.Type.type(type) do\n      {:array, _t} -> \"array\"\n      :id -> \"integer\"\n      :identity -> \"bigint\"\n      :binary_id -> \"uuid\"\n      :string -> \"varchar\"\n      :binary -> \"bytea\"\n      :map -> \"jsonb\"\n      {:map, _} -> \"jsonb\"\n      :time_usec -> \"time\"\n      :utc_datetime -> \"timestamp\"\n      :utc_datetime_usec -> \"timestamp\"\n      :naive_datetime -> \"timestamp\"\n      :naive_datetime_usec -> \"timestamp\"\n      atom when is_atom(atom) -> Atom.to_string(atom)\n      {:parameterized, _} -> \"unknown\"\n    end\n  end\n\n  defp name_valid?(source_or_field) do\n    source_or_field =~ ~r/^[a-zA-z\\-_\\d]+$/\n  end\nend\n"
  },
  {
    "path": "lib/ecto/erd/document/plantuml.ex",
    "content": "defmodule Ecto.ERD.Document.PlantUML do\n  @moduledoc false\n  alias Ecto.ERD.{Node, Edge, Graph, Render, Color}\n\n  @behaviour Ecto.ERD.Document\n  @safe_name_pattern ~r/^[a-z\\d_\\.:\\?]+$/i\n\n  @impl true\n  def schemaless?, do: false\n\n  @impl true\n  def render(%Graph{nodes: nodes, edges: edges}, opts) do\n    fontname = opts[:fontname] || \"Roboto Mono\"\n    columns = opts[:columns] || [:name, :type]\n\n    clusters = Enum.group_by(nodes, & &1.cluster)\n    {global_nodes, clusters} = Map.pop(clusters, nil)\n    ensure_cluster_names_valid!(Map.keys(clusters))\n    global_nodes = List.wrap(global_nodes)\n\n    namespaces =\n      Enum.map(clusters, fn {cluster_name, nodes} ->\n        \"\"\"\n        namespace #{cluster_name} #{Color.get(cluster_name)} {\n        #{Enum.map_join(nodes, \"\\n\", &render_node(&1, columns, \"  \"))}\n        }\n        \"\"\"\n      end)\n\n    entities = Enum.map_join(global_nodes, \"\\n\", &render_node(&1, columns, \"\"))\n\n    refs =\n      edges\n      |> Enum.uniq_by(fn %Edge{\n                           from: {from_source, from_schema, _},\n                           to: {to_source, to_schema, _}\n                         } ->\n        {from_source, from_schema, to_source, to_schema}\n      end)\n      |> Enum.map_join(\"\\n\", &render_edge/1)\n\n    \"\"\"\n    @startuml\n\n    set namespaceSeparator none\n    hide circle\n    hide methods\n    #{case columns do\n      [] -> \"hide fields\"\n      _ -> \"\"\n    end}\n    skinparam linetype ortho\n    skinparam defaultFontName #{fontname}\n    skinparam shadowing false\n\n    #{namespaces}\n    #{entities}\n    #{refs}\n    @enduml\n    \"\"\"\n  end\n\n  defp render_node(\n         %Node{\n           source: source,\n           fields: fields,\n           schema_module: schema_module\n         },\n         columns,\n         padding\n       ) do\n    case columns do\n      [] ->\n        \"#{padding}entity #{Render.in_quotes(Node.id(source, schema_module), @safe_name_pattern)}\"\n\n      columns ->\n        items =\n          case Enum.split_with(fields, & &1.primary?) do\n            {[], fields} -> fields\n            {pk, fields} -> pk ++ [\"--\"] ++ fields\n          end\n\n        content =\n          Enum.map_join(items, \"\\n#{padding}  \", fn\n            \"--\" ->\n              \"--\"\n\n            field ->\n              columns\n              |> Enum.map_join(\n                \" : \",\n                fn\n                  :name -> Render.in_quotes(field.name, @safe_name_pattern)\n                  :type -> format_type(field.type)\n                end\n              )\n          end)\n\n        \"\"\"\n        #{padding}entity #{Render.in_quotes(Node.id(source, schema_module), @safe_name_pattern)} {\n        #{padding}  #{content}\n        #{padding}}\n        \"\"\"\n    end\n  end\n\n  defp render_edge(%Edge{\n         from: {from_source, from_schema, _},\n         to: {to_source, to_schema, _},\n         assoc_types: assoc_types\n       }) do\n    operator =\n      if {:has, :one} in assoc_types do\n        \"||--o|\"\n      else\n        \"||--|{\"\n      end\n\n    [\n      Render.in_quotes(Node.id(from_source, from_schema), @safe_name_pattern),\n      operator,\n      Render.in_quotes(Node.id(to_source, to_schema), @safe_name_pattern)\n    ]\n    |> Enum.join(\" \")\n  end\n\n  defp format_type({:parameterized, {Ecto.Enum, %{on_dump: on_dump}}}) do\n    elements_limit = 10\n    values = Map.values(on_dump)\n    length = length(values)\n\n    values =\n      if length <= elements_limit do\n        values\n      else\n        values\n        |> Enum.slice(0, elements_limit)\n        |> List.replace_at(-1, \"...\")\n      end\n\n    \"enum(#{Enum.join(values, \",\")})\"\n  end\n\n  defp format_type(type) do\n    case Ecto.Type.type(type) do\n      {parent, _t} -> Atom.to_string(parent)\n      atom when is_atom(atom) -> Atom.to_string(atom)\n      {:parameterized, _} -> \"unknown\"\n    end\n  end\n\n  # namespaces cannot be quoted, so this check is necessary\n  defp ensure_cluster_names_valid!(names) do\n    Enum.each(names, fn name ->\n      unless name =~ @safe_name_pattern do\n        raise \"Cluster name #{inspect(name)} contains symbols which are unsupported by PlantUML.\"\n      end\n    end)\n  end\nend\n"
  },
  {
    "path": "lib/ecto/erd/document/quick_dbd.ex",
    "content": "defmodule Ecto.ERD.Document.QuickDBD do\n  @moduledoc false\n  alias Ecto.ERD.{Node, Field, Edge, Graph, Render}\n  @behaviour Ecto.ERD.Document\n\n  @impl true\n  def schemaless?, do: true\n\n  @impl true\n  def render(%Graph{nodes: nodes, edges: edges}, _opts) do\n    foreign_keys_mapping =\n      Map.new(edges, fn %Edge{to: {to_source, _to_schema, {:field, to_field}}} = edge ->\n        {{to_source, to_field}, edge}\n      end)\n\n    Enum.map_join(nodes, \"\\n\\n\", &render_node(&1, foreign_keys_mapping))\n  end\n\n  defp render_node(%Node{source: source, fields: fields}, foreign_keys_mapping) do\n    get_fkey_edge = fn field_name -> foreign_keys_mapping[{source, field_name}] end\n\n    [\n      source,\n      \"\\n---\\n\",\n      fields\n      |> Enum.map(&render_field(&1, get_fkey_edge))\n      |> Enum.intersperse(\"\\n\")\n    ]\n  end\n\n  defp render_field(%Field{name: name, type: type, primary?: primary?}, get_fkey_edge) do\n    settings =\n      if primary? do\n        [\"PK\"]\n      else\n        case get_fkey_edge.(name) do\n          %Edge{\n            from: {from_source, _from_schema, {:field, from_field}},\n            assoc_types: assoc_types\n          } ->\n            operator =\n              if {:has, :one} in assoc_types do\n                \"-\"\n              else\n                \">-\"\n              end\n\n            [\n              \"FK #{operator} #{Render.in_quotes(from_source)}.#{Render.in_quotes(from_field)}\"\n            ]\n\n          _ ->\n            []\n        end\n      end\n\n    Enum.intersperse(\n      [Render.in_quotes(name), Render.in_quotes(format_type(type)) | settings],\n      \" \"\n    )\n  end\n\n  defp format_type({:parameterized, {Ecto.Enum, %{on_dump: on_dump}}}) do\n    \"enum(#{Enum.join(Map.values(on_dump), \",\")})\"\n  end\n\n  defp format_type(type) do\n    case Ecto.Type.type(type) do\n      {:array, _t} -> \"array\"\n      :id -> \"integer\"\n      :identity -> \"bigint\"\n      :binary_id -> \"uuid\"\n      :string -> \"varchar\"\n      :binary -> \"bytea\"\n      :map -> \"jsonb\"\n      {:map, _} -> \"jsonb\"\n      :time_usec -> \"time\"\n      :utc_datetime -> \"timestamp\"\n      :utc_datetime_usec -> \"timestamp\"\n      :naive_datetime -> \"timestamp\"\n      :naive_datetime_usec -> \"timestamp\"\n      atom when is_atom(atom) -> Atom.to_string(atom)\n      {:parameterized, _} -> \"unknown\"\n    end\n  end\nend\n"
  },
  {
    "path": "lib/ecto/erd/document.ex",
    "content": "defmodule Ecto.ERD.Document do\n  @moduledoc false\n  @callback render(Ecto.ERD.Graph.t(), opts :: Keyword.t()) :: iodata()\n  @callback schemaless?() :: boolean()\n\n  def render(schema_modules, format, map_node_callback, render_opts)\n      when is_function(map_node_callback, 1) do\n    document_module =\n      case format do\n        \".dbml\" -> Ecto.ERD.Document.DBML\n        \".dot\" -> Ecto.ERD.Document.Dot\n        \".mmd\" -> Ecto.ERD.Document.Mermaid\n        \".puml\" -> Ecto.ERD.Document.PlantUML\n        \".qdbd\" -> Ecto.ERD.Document.QuickDBD\n        format -> raise \"Unsupported format #{format}\"\n      end\n\n    schema_modules\n    |> Ecto.ERD.Graph.new(\n      if document_module.schemaless?() do\n        [:associations]\n      else\n        [:associations, :embeds]\n      end\n    )\n    |> Ecto.ERD.Graph.map_nodes(map_node_callback)\n    |> then(\n      if document_module.schemaless?() do\n        &Ecto.ERD.Graph.make_schemaless/1\n      else\n        &Function.identity/1\n      end\n    )\n    |> Ecto.ERD.Graph.sort()\n    |> document_module.render(render_opts)\n  end\nend\n"
  },
  {
    "path": "lib/ecto/erd/edge.ex",
    "content": "defmodule Ecto.ERD.Edge do\n  @moduledoc false\n  defstruct [:from, :to, :assoc_types]\n\n  def new(%{\n        from: {_source1, _module1, _port1} = from,\n        to: {_source2, _module2, _port2} = to,\n        assoc_types: assoc_types\n      })\n      when is_list(assoc_types) do\n    %__MODULE__{\n      from: from,\n      to: to,\n      assoc_types: assoc_types\n    }\n  end\n\n  def connected_with_node?(\n        %__MODULE__{\n          from: {source1, module1, _port1},\n          to: {source2, module2, _port2}\n        },\n        node\n      ) do\n    (source1 == node.source and module1 == node.schema_module) or\n      (source2 == node.source and module2 == node.schema_module)\n  end\n\n  def merge(%__MODULE__{} = edge1, %__MODULE__{} = edge2) do\n    %__MODULE__{\n      edge1\n      | assoc_types: edge1.assoc_types ++ edge2.assoc_types\n    }\n  end\n\n  def port_name({type, id}) when type in [:header, :field] and is_atom(id), do: \"#{type}@#{id}\"\nend\n"
  },
  {
    "path": "lib/ecto/erd/field.ex",
    "content": "defmodule Ecto.ERD.Field do\n  @moduledoc \"\"\"\n  Field struct.\n\n  Represents the data for an individual field in `Ecto.ERD.Node`.\n\n  You can update fields on this struct in `.ecto_erd.exs` if needed.\n  \"\"\"\n  defstruct [:name, :type, :primary?, :comment]\n\n  @typedoc \"\"\"\n  A field comment.\n\n  Rendering comments is currently supported only by the Mermaid format.\n\n  ## Example\n\n      # File: .ecto_erd.exs\n      [\n        map_node: fn\n          %Ecto.ERD.Node{schema_module: schema_module} = node ->\n            update_in(node, [Access.key(:fields), Access.all()], fn field ->\n              # `DocumentationLib` is a fictional module that returns documentation about a field\n              case DocumentationLib.doc({schema_module, field}) do\n                nil ->\n                  field\n\n                doc ->\n                  %{field | comment: doc}\n              end\n            end)\n          end\n      ]\n  \"\"\"\n  @type comment :: String.t()\n\n  @type t :: %__MODULE__{\n          name: atom(),\n          type: atom() | tuple(),\n          primary?: boolean(),\n          comment: comment() | nil\n        }\n\n  def new(%{name: name, type: type} = params) do\n    %__MODULE__{\n      name: name,\n      type: type,\n      primary?: Map.get(params, :primary?, false)\n    }\n  end\nend\n"
  },
  {
    "path": "lib/ecto/erd/graph.ex",
    "content": "defmodule Ecto.ERD.Graph do\n  @moduledoc false\n  alias Ecto.ERD.{Edge, Node, Field}\n  defstruct [:edges, :nodes]\n  require Logger\n  @type t :: %__MODULE__{}\n\n  def new(modules, relation_types) do\n    data =\n      modules\n      |> Enum.flat_map(fn module -> components(module, relation_types) end)\n      |> Enum.group_by(fn\n        %Edge{} -> :edges\n        %Node{} -> :nodes\n      end)\n\n    %__MODULE__{\n      # multiple nodes could be generated by multiple schemas which use the same table in many to many relation\n      nodes: Enum.uniq(Map.get(data, :nodes, [])),\n      edges: merge_edges_with_same_direction(Map.get(data, :edges, []))\n    }\n  end\n\n  def sort(%__MODULE__{nodes: nodes, edges: edges}) do\n    %__MODULE__{\n      nodes: Enum.sort_by(nodes, &{&1.cluster, &1.schema_module, &1.source}),\n      edges: Enum.sort_by(edges, &{&1.from, &1.to})\n    }\n  end\n\n  def map_nodes(%__MODULE__{nodes: nodes, edges: edges}, map_node_callback)\n      when is_function(map_node_callback, 1) do\n    {nodes, removed_nodes} =\n      Enum.flat_map_reduce(nodes, [], fn node, removed_nodes ->\n        case map_node_callback.(node) do\n          nil -> {[], [node | removed_nodes]}\n          node -> {[node], removed_nodes}\n        end\n      end)\n\n    edges =\n      Enum.reject(edges, fn edge ->\n        Enum.any?(removed_nodes, fn node -> Edge.connected_with_node?(edge, node) end)\n      end)\n\n    %__MODULE__{\n      nodes: List.wrap(nodes),\n      edges: edges\n    }\n  end\n\n  # it, actually, doesn't remove ALL information about schemas, but only in duplicated entities -\n  # when nodes have the same source or when edges are equal by source and port.\n  def make_schemaless(%__MODULE__{nodes: nodes, edges: edges}) do\n    nodes =\n      nodes\n      |> Enum.group_by(fn %Node{source: source} -> source end)\n      |> Map.delete(nil)\n      |> Enum.map(fn {_source, nodes} -> Enum.reduce(nodes, &Node.merge_to_schemaless/2) end)\n\n    edges =\n      edges\n      |> Enum.uniq_by(fn %Edge{from: {source1, _module1, port1}, to: {source2, _module2, port2}} ->\n        {{source1, port1}, {source2, port2}}\n      end)\n\n    %__MODULE__{\n      nodes: nodes,\n      edges: edges\n    }\n  end\n\n  defp merge_edges_with_same_direction(edges) do\n    edges\n    |> Enum.group_by(fn %Edge{from: from, to: to} -> {from, to} end)\n    |> Enum.map(fn {_direction, edges} -> Enum.reduce(edges, &Edge.merge/2) end)\n  end\n\n  defp components(schema_module, relation_types) do\n    if ecto_schema?(schema_module) do\n      relation_components =\n        Enum.flat_map(relation_types, &components_from_relations(schema_module, &1))\n\n      primary_keys = schema_module.__schema__(:primary_key)\n\n      node =\n        Node.new(\n          schema_module,\n          schema_module.__schema__(:source),\n          Enum.map(\n            schema_module.__schema__(:fields),\n            fn field ->\n              Field.new(%{\n                name: field,\n                type: schema_module.__schema__(:type, field),\n                primary?: field in primary_keys\n              })\n            end\n          )\n        )\n\n      [node | relation_components]\n    else\n      Logger.warning(\"Skipping schema #{schema_module}: not found\")\n      []\n    end\n  end\n\n  defp components_from_relations(module, :associations) do\n    :associations\n    |> module.__schema__()\n    |> Enum.flat_map(fn assoc_field ->\n      from_relation_struct(module.__schema__(:association, assoc_field))\n    end)\n  end\n\n  defp components_from_relations(module, :embeds) do\n    :embeds\n    |> module.__schema__()\n    |> Enum.flat_map(fn embed_field ->\n      from_relation_struct(module.__schema__(:embed, embed_field))\n    end)\n  end\n\n  defp from_relation_struct(%Ecto.Embedded{\n         owner: owner,\n         related: related,\n         field: field,\n         cardinality: cardinality\n       }) do\n    if ecto_schema?(related) do\n      [\n        Edge.new(%{\n          from: {owner.__schema__(:source), owner, {:field, field}},\n          to: {related.__schema__(:source), related, {:header, :schema_module}},\n          assoc_types: [has: cardinality]\n        })\n      ]\n    else\n      Logger.warning(\n        \"Skipping association `embeds_#{cardinality} #{inspect(field)}` in schema #{inspect(owner)}: #{inspect(related)} is not an Ecto schema\"\n      )\n\n      []\n    end\n  end\n\n  defp from_relation_struct(%Ecto.Association.BelongsTo{\n         owner: owner,\n         owner_key: owner_key,\n         related: related,\n         related_key: related_key,\n         field: field\n       }) do\n    if ecto_schema?(related) do\n      related_source = related.__schema__(:source)\n      owner_source = owner.__schema__(:source)\n\n      [\n        Edge.new(%{\n          from: {related_source, related, {:field, related_key}},\n          to: {owner_source, owner, {:field, owner_key}},\n          assoc_types: [:belongs_to]\n        })\n      ]\n    else\n      Logger.warning(\n        \"Skipping association `belongs_to #{inspect(field)}` in schema #{inspect(owner)}: #{inspect(related)} is not an Ecto schema\"\n      )\n\n      []\n    end\n  end\n\n  defp from_relation_struct(%Ecto.Association.Has{\n         owner: owner,\n         owner_key: owner_key,\n         related: related,\n         related_key: related_key,\n         cardinality: cardinality,\n         field: field\n       }) do\n    if ecto_schema?(related) do\n      related_source = related.__schema__(:source)\n      owner_source = owner.__schema__(:source)\n\n      [\n        Edge.new(%{\n          from: {owner_source, owner, {:field, owner_key}},\n          to: {related_source, related, {:field, related_key}},\n          assoc_types: [has: cardinality]\n        })\n      ]\n    else\n      Logger.warning(\n        \"Skipping association `has_#{cardinality} #{inspect(field)}` in schema #{inspect(owner)}: #{inspect(related)} is not an Ecto schema\"\n      )\n\n      []\n    end\n  end\n\n  defp from_relation_struct(%Ecto.Association.ManyToMany{\n         join_through: join_through,\n         owner: owner,\n         field: field,\n         related: related,\n         join_keys: [{join_source_owner_fk, owner_pk}, {join_source_related_fk, related_pk}]\n       }) do\n    if ecto_schema?(related) do\n      if is_atom(join_through) and not ecto_schema?(join_through) do\n        Logger.warning(\n          \"Skipping association `many_to_many #{inspect(field)}` in schema #{inspect(owner)}: #{inspect(join_through)} is not an Ecto schema\"\n        )\n\n        []\n      else\n        {join_module, join_source} =\n          case join_through do\n            value when is_atom(value) ->\n              {value, value.__schema__(:source)}\n\n            value when is_binary(value) ->\n              {nil, value}\n          end\n\n        nodes =\n          case join_module do\n            nil ->\n              fields = [\n                Field.new(%{\n                  name: join_source_owner_fk,\n                  type: owner.__schema__(:type, owner_pk),\n                  primary?: false\n                }),\n                Field.new(%{\n                  name: join_source_related_fk,\n                  type: related.__schema__(:type, related_pk),\n                  primary?: false\n                })\n              ]\n\n              [Node.new(join_source, Enum.sort(fields))]\n\n            _join_module ->\n              []\n          end\n\n        nodes ++\n          [\n            Edge.new(%{\n              from: {owner.__schema__(:source), owner, {:field, owner_pk}},\n              to: {join_source, join_module, {:field, join_source_owner_fk}},\n              assoc_types: [has: :many]\n            }),\n            Edge.new(%{\n              from: {related.__schema__(:source), related, {:field, related_pk}},\n              to: {join_source, join_module, {:field, join_source_related_fk}},\n              assoc_types: [has: :many]\n            })\n          ]\n      end\n    else\n      Logger.warning(\n        \"Skipping association `many_to_many #{inspect(field)}` in schema #{inspect(owner)}: module #{inspect(related)} is not an Ecto schema\"\n      )\n\n      []\n    end\n  end\n\n  defp from_relation_struct(%Ecto.Association.HasThrough{}) do\n    []\n  end\n\n  defp ecto_schema?(module) do\n    function_exported?(module, :__schema__, 1)\n  end\nend\n"
  },
  {
    "path": "lib/ecto/erd/html.ex",
    "content": "defmodule Ecto.ERD.HTML do\n  @moduledoc false\n  def to_iodata(tuples) when is_list(tuples) do\n    Enum.map(tuples, &to_iodata/1)\n  end\n\n  def to_iodata({tag_name, attrs, content}) do\n    tag(\n      to_string(tag_name),\n      attrs,\n      content\n      |> List.wrap()\n      |> to_iodata()\n    )\n  end\n\n  def to_iodata(term), do: HtmlEntities.encode(to_string(term))\n\n  defp tag(name, attrs, content) do\n    [\"<\", name, attrs(attrs), \">\", content, \"</\", name, \">\"]\n  end\n\n  defp attrs([]), do: []\n\n  defp attrs(attrs) do\n    [\n      \" \",\n      Enum.map_intersperse(attrs, \" \", fn\n        {key, value} -> [to_string(key), \"='\", to_string(value), \"'\"]\n      end)\n    ]\n  end\nend\n"
  },
  {
    "path": "lib/ecto/erd/node.ex",
    "content": "defmodule Ecto.ERD.Node do\n  @moduledoc \"\"\"\n  Node struct.\n\n  * If `source` is `nil`, then `schema_module` cannot be `nil` and node describes embedded schema.\n  * If `source` is not `nil` and `schema_module` is not `nil`, then the node describes a regular schema.\n  * If `schema_module` is `nil`, then `source` cannot be `nil`, and the node describes a source (table) that was\n  automatically inferred from many-to-many relations.\n  * If `cluster` is `nil`, then the node is rendered outside any cluster.\n  \"\"\"\n  defstruct [\n    :source,\n    :schema_module,\n    :fields,\n    :cluster\n  ]\n\n  @type t() :: %__MODULE__{\n          source: nil | String.t(),\n          schema_module: nil | module(),\n          fields: [Ecto.ERD.Field.t()],\n          cluster: nil | String.t()\n        }\n\n  @doc \"\"\"\n  Set a `cluster` for the given `node`.\n\n  A cluster is a group of nodes that are displayed together.\n  \"\"\"\n  @spec set_cluster(t(), nil | String.t()) :: t()\n  def set_cluster(%__MODULE__{} = node, cluster) when is_nil(cluster) or is_binary(cluster) do\n    %{node | cluster: cluster}\n  end\n\n  @doc false\n  def id(source, schema_module)\n      when (is_nil(source) or is_binary(source)) and is_atom(schema_module) do\n    if schema_module do\n      inspect(schema_module)\n    else\n      source\n    end\n  end\n\n  @doc false\n  def new(schema_module \\\\ nil, source, fields) do\n    %__MODULE__{\n      schema_module: schema_module,\n      source: source,\n      fields: fields\n    }\n  end\n\n  @doc false\n  def merge_to_schemaless(\n        %__MODULE__{source: source, fields: fields1, cluster: cluster1},\n        %__MODULE__{\n          source: source,\n          fields: fields2,\n          cluster: cluster2\n        }\n      )\n      when not is_nil(source) do\n    # If fields have different types with the same name, only one type will be chosen\n    fields = Enum.uniq_by(fields1 ++ fields2, & &1.name)\n\n    cluster =\n      case {cluster1, cluster2} do\n        {nil, cluster} ->\n          cluster\n\n        {cluster, nil} ->\n          cluster\n\n        {cluster, cluster} ->\n          cluster\n\n        {cluster1, cluster2} ->\n          IO.warn(\n            \"Trying to merge two nodes with source #{inspect(source)} but with different clusters \" <>\n              \"(#{inspect(cluster1)} and #{inspect(cluster2)}); removing the cluster in favor of the global space\"\n          )\n\n          nil\n      end\n\n    %__MODULE__{\n      source: source,\n      fields: fields,\n      cluster: cluster\n    }\n  end\nend\n"
  },
  {
    "path": "lib/ecto/erd/render.ex",
    "content": "defmodule Ecto.ERD.Render do\n  @moduledoc false\n\n  def in_quotes(value, pattern \\\\ ~r/^[a-z\\d_]+$/i) do\n    value = to_string(value)\n\n    # avoid redundant quotes if possible\n    if value =~ pattern do\n      value\n    else\n      \"\\\"\" <> String.replace(value, \"\\\"\", \"\\\\\\\"\") <> \"\\\"\"\n    end\n  end\nend\n"
  },
  {
    "path": "lib/ecto/erd/schema_modules.ex",
    "content": "defmodule Ecto.ERD.SchemaModules do\n  @moduledoc false\n\n  def scan(otp_app) do\n    {:ok, applications} = :application.get_key(otp_app, :applications)\n\n    [otp_app | applications]\n    |> Enum.flat_map(fn application ->\n      case :application.get_key(application, :modules) do\n        {:ok, modules} ->\n          modules\n\n        _error ->\n          []\n      end\n    end)\n    |> Enum.filter(fn module ->\n      Code.ensure_loaded!(module)\n      function_exported?(module, :__schema__, 1) and module != Ecto.Schema\n    end)\n  end\nend\n"
  },
  {
    "path": "lib/mix/tasks/ecto.gen.erd.ex",
    "content": "defmodule Mix.Tasks.Ecto.Gen.Erd do\n  @moduledoc \"\"\"\n  A Mix task that generates an ERD (Entity‑Relationship Diagram) in various formats.\n\n  Supported formats:\n  * [DOT](#module-dot) (default)\n  * [PlantUML](#module-plantuml)\n  * [DBML](#module-dbml)\n  * [QuickDBD](#module-quickdbd)\n  * [Mermaid](#module-mermaid)\n\n  Configuration examples and sample output for a few open-source projects can be found in the PAGES section under EXAMPLES.\n\n  ## DOT\n\n  The [DOT](https://en.wikipedia.org/wiki/DOT_(graph_description_language)) format can represent all available entity types:\n  * schemas\n  * embedded schemas\n  * schemaless tables (automatically derived from many-to-many relations)\n\n  Clusters are supported and can be set via the `:map_node` option using `Ecto.ERD.Node.set_cluster/2`.\n\n  Install [Graphviz](https://graphviz.org/) to convert a `*.dot` file to an image.\n\n  ```\n  $ mix ecto.gen.erd # generates ecto_erd.dot\n  $ mix ecto.gen.erd --output-path=ecto_erd.dot\n  $ mix ecto.gen.erd && dot -Tpng ecto_erd.dot -o erd.png && xdg-open erd.png\n  ```\n\n  ## PlantUML\n\n  [PlantUML](https://plantuml.com) supports the same features as DOT.\n\n  Install [PlantUML](https://plantuml.com/download) to convert a `*.puml` file to an image.\n\n  ```\n  $ mix ecto.gen.erd --output-path=erd.puml\n  $ mix ecto.gen.erd --output-path=erd.puml && plantuml erd.puml && xdg-open erd.png\n  ```\n  *Tip: If the output image is cropped, adjust the image size with the `PLANTUML_LIMIT_SIZE` environment variable.*\n\n  ## DBML\n\n  The [DBML](https://www.dbml.org/) format is more limited than DOT and PlantUML, as it focuses on tables only.\n  Multiple schemas that use the same table are merged into one. Embedded schemas\n  cannot be displayed.\n  `TableGroup`s are supported and can be set via the `:map_node` option using `Ecto.ERD.Node.set_cluster/2`.\n\n  This format is handy if you use [dbdiagram.io](https://dbdiagram.io) or [dbdocs.io](https://dbdocs.io).\n\n  ```\n  $ mix ecto.gen.erd --output-path=ecto_erd.dbml\n  ```\n\n  ## QuickDBD\n\n  A format used by [QuickDBD](https://www.quickdatabasediagrams.com), a competitor of [dbdiagram.io](https://dbdiagram.io).\n  Like DBML, it focuses on tables and cannot display embedded schemas. However, this format doesn't support clusters.\n\n  It doesn't have a reserved file extension, but we use `*.qdbd`.\n\n  ```\n  $ mix ecto.gen.erd --output-path=ecto_erd.qdbd\n  ```\n  ## Mermaid\n\n  [Mermaid](https://mermaid-js.github.io/mermaid/#/entityRelationshipDiagram) is also limited compared to [DOT](#module-dot) and [PlantUML](#module-plantuml) and focuses on tables only.\n  Multiple schemas that use the same table are merged into one. Embedded schemas cannot be displayed.\n  Clusters are not supported.\n  The benefit of this format is that it is [supported by GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/).\n  ```\n  $ mix ecto.gen.erd --output-path=ecto_erd.mmd\n  ```\n  If you have installed [mermaid-cli](https://github.com/mermaid-js/mermaid-cli) locally, you can convert the output `*.mmd` file to an image using the following command:\n  ```\n  $ mmdc -i ecto_erd.mmd -o erd.png -w 6000 -H 6000\n  ```\n  The default `-w` and `-H` values are small (`800` and `600`, respectively), so it's better to provide larger values from the start.\n\n  ## Command line options\n\n  * `--output-path` - path to the output file. Defaults to `ecto_erd.dot`. Supported file extensions: `dot`, `puml`, `dbml`, `qdbd`.\n  * `--config-path` - path to the config file. Defaults to `.ecto_erd.exs`.\n\n  ## Configuration file\n\n  When you run the `mix ecto.gen.erd` task, it tries to read configuration from the `.ecto_erd.exs` file in the current\n  working directory. The configuration file must return a keyword list.\n\n  ### Options\n\n  * `:fontname` - font name. Defaults to `Roboto Mono`. Must be a monospaced font if the output format is `dot` and more than one column is displayed.\n    Supported only for `dot` and `puml` files.\n  * `:columns` - list of columns displayed for each node (schema/source). Set to `[]` to hide fields completely.\n    Available columns: `:name`, `:type`. Supported for `dot`, `puml`, and `mmd` (`mmd` allows only `[]` or the default value).\n  Default values:\n    * `[:name, :type]` for `dot` and `puml`\n    * `[:type, :name]` for `mmd`\n  * `:map_node` - a function that removes a node from the diagram or assigns it to a cluster. Defaults to `Function.identity/1`,\n    which means all nodes are displayed outside any cluster by default.\n    Use `Ecto.ERD.Node.set_cluster/2` in this function to set a cluster. Supported only by [DOT](#module-dot), [PlantUML](#module-plantuml),\n    and [DBML](#module-dbml).\n    Return `nil` to remove a node from the diagram.\n  * `:otp_app` - the application to scan (along with its dependencies) to collect Ecto schemas.\n    Defaults to `Mix.Project.config()[:app]`. Configure this only when running the task from an umbrella root.\n\n  A configuration file with default values for `dot` and `puml` can look like this:\n\n      # .ecto_erd.exs\n      [\n        fontname: \"Roboto Mono\",\n        columns: [:name, :type],\n        map_node: &Function.identity/1,\n        otp_app: Mix.Project.config()[:app]\n      ]\n\n  \"\"\"\n  @shortdoc \"Generate an ERD\"\n  use Mix.Task\n  @requirements [\"app.config\"]\n\n  @impl true\n  def run(args) do\n    {cli_opts, _} =\n      OptionParser.parse!(args, strict: [output_path: :string, config_path: :string])\n\n    config_path = Keyword.get(cli_opts, :config_path, \".ecto_erd.exs\")\n\n    file_opts =\n      if File.exists?(config_path) do\n        {file_opts, _} = Code.eval_file(config_path)\n        file_opts\n      else\n        []\n      end\n\n    otp_app =\n      cond do\n        Keyword.has_key?(file_opts, :otp_app) -> file_opts[:otp_app]\n        not is_nil(Mix.Project.config()[:app]) -> Mix.Project.config()[:app]\n        true -> raise \"Unable to detect `:otp_app`, please specify it explicitly\"\n      end\n\n    output_path = cli_opts[:output_path] || file_opts[:output_path] || \"ecto_erd.dot\"\n    map_node_callback = file_opts[:map_node] || (&Function.identity/1)\n\n    output =\n      otp_app\n      |> Ecto.ERD.SchemaModules.scan()\n      |> Ecto.ERD.Document.render(\n        Path.extname(output_path),\n        map_node_callback,\n        Keyword.take(file_opts, [:fontname, :columns])\n      )\n\n    File.write!(output_path, output)\n  end\nend\n"
  },
  {
    "path": "mix.exs",
    "content": "# examples_generator.exs is needed only for docs and is not shipped in package\nif File.exists?(\"examples_generator.exs\") do\n  Code.compile_file(\"examples_generator.exs\")\nelse\n  defmodule Ecto.ERD.ExamplesGenerator do\n    def projects, do: []\n    def run(_), do: :noop\n  end\nend\n\ndefmodule Ecto.ERD.MixProject do\n  use Mix.Project\n  @source_url \"https://github.com/fuelen/ecto_erd/\"\n  @version \"0.6.6\"\n\n  def project do\n    [\n      app: :ecto_erd,\n      version: @version,\n      elixir: \"~> 1.12\",\n      start_permanent: Mix.env() == :prod,\n      deps: deps(),\n      package: package(),\n      description: description(),\n      name: \"Ecto ERD\",\n      docs: docs(),\n      aliases: [docs: [&generate_examples/1, \"docs\"]],\n      dialyzer: [plt_add_apps: [:mix]]\n    ]\n  end\n\n  defp description do\n    \"ERD generator for Ecto users\"\n  end\n\n  defp docs do\n    [\n      main: \"Mix.Tasks.Ecto.Gen.Erd\",\n      extras:\n        Enum.map(Ecto.ERD.ExamplesGenerator.projects(), fn project ->\n          {:\"tmp/docs/#{project}.md\", [title: project]}\n        end),\n      source_url: @source_url,\n      source_ref: \"v#{@version}\",\n      groups_for_extras: [\n        Examples: ~r\"tmp/docs/\"\n      ]\n    ]\n  end\n\n  defp package do\n    [\n      licenses: [\"Apache-2.0\"],\n      links: %{\n        GitHub: @source_url\n      }\n    ]\n  end\n\n  def application do\n    [\n      extra_applications: [:logger]\n    ]\n  end\n\n  defp generate_examples(_) do\n    run? = \"Generate examples? y/n: \" |> IO.gets() |> String.trim() |> String.downcase() == \"y\"\n\n    if run? do\n      Ecto.ERD.ExamplesGenerator.run(Path.join([@source_url, \"blob\", \"v#{@version}\"]))\n    end\n  end\n\n  defp deps do\n    [\n      {:ex_doc, \"~> 0.24\", only: :dev, runtime: false},\n      {:html_entities, \"~> 0.5\"},\n      {:ecto, \"~> 3.12\"},\n      {:dialyxir, \"~> 1.0\", only: [:dev], runtime: false}\n    ]\n  end\nend\n"
  },
  {
    "path": "test/ecto/erd_test.exs",
    "content": "defmodule Ecto.ERDTest do\n  use ExUnit.Case\n  alias Ecto.ERD.{Node, Field, Graph}\n  alias Ecto.ERD.Document.{DBML, Dot}\n\n  test inspect(&DBML.enums_mapping/1) do\n    result =\n      [\n        %Node{\n          source: \"credentials\",\n          fields: [\n            Field.new(%{\n              name: :flow,\n              type: {:parameterized, {Ecto.Enum, Ecto.Enum.init(values: [:simple, :complex])}}\n            })\n          ]\n        },\n        %Node{\n          source: \"invitations\",\n          fields: [\n            Field.new(%{\n              name: :flow,\n              type: {:parameterized, {Ecto.Enum, Ecto.Enum.init(values: [:simple, :complex])}}\n            })\n          ]\n        },\n        %Node{\n          source: \"users\",\n          fields: [\n            Field.new(%{\n              name: :status,\n              type:\n                {:parameterized,\n                 {Ecto.Enum, Ecto.Enum.init(values: [:active, :suspended, :invited])}}\n            })\n          ]\n        },\n        %Node{\n          source: \"admins\",\n          fields: [\n            Field.new(%{\n              name: :status,\n              type: {:parameterized, {Ecto.Enum, Ecto.Enum.init(values: [:active, :suspended])}}\n            })\n          ]\n        },\n        %Node{\n          source: \"projects\",\n          fields: [\n            Field.new(%{\n              name: :status,\n              type: {:parameterized, {Ecto.Enum, Ecto.Enum.init(values: [:live, :closed])}}\n            })\n          ]\n        }\n      ]\n      |> DBML.enums_mapping()\n\n    assert result == %{\n             [\"admins\", :status] => {\"admins_status\", [\"active\", \"suspended\"]},\n             [\"credentials\", :flow] => {\"flow\", [\"complex\", \"simple\"]},\n             [\"invitations\", :flow] => {\"flow\", [\"complex\", \"simple\"]},\n             [\"projects\", :status] => {\"projects_status\", [\"closed\", \"live\"]},\n             [\"users\", :status] => {\"users_status\", [\"active\", \"invited\", \"suspended\"]}\n           }\n  end\n\n  test \"DOT format renders primary key indicator\" do\n    graph = %Graph{\n      nodes: [\n        %Node{\n          source: \"users\",\n          schema_module: MyApp.User,\n          fields: [\n            Field.new(%{name: :id, type: :integer, primary?: true}),\n            Field.new(%{name: :email, type: :string, primary?: false}),\n            Field.new(%{name: :name, type: :string, primary?: false})\n          ]\n        }\n      ],\n      edges: []\n    }\n\n    result = Dot.render(graph, [])\n\n    # Verify that the primary key field is bold\n    assert result =~ ~r/<b>:id\\s*<\\/b>/\n    # Verify that non-primary fields are not bold\n    refute result =~ ~r/<b>:email\\s*<\\/b>/\n    refute result =~ ~r/<b>:name\\s*<\\/b>/\n  end\nend\n"
  },
  {
    "path": "test/test_helper.exs",
    "content": "ExUnit.start()\n"
  }
]