[
  {
    "path": ".gitattributes",
    "content": "# define GitHub repository languages\n*.puml linguist-language=PlantUML\n*.iuml linguist-language=PlantUML\n*.plantuml linguist-language=PlantUML\n\n*.puml linguist-detectable=true\n*.iuml linguist-detectable=true\n*.plantuml linguist-detectable=true\n*.md linguist-detectable=false\n"
  },
  {
    "path": ".github/stale.yml",
    "content": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 60\n# Number of days of inactivity before a stale issue is closed\ndaysUntilClose: 7\n# Issues with these labels will never be considered stale\nexemptLabels:\n  - not-stale\n  - pinned\n  - security\n# Label to use when marking an issue as stale\nstaleLabel: stale\n# Comment to post when marking an issue as stale. Set to `false` to disable\nmarkComment: >\n  This issue has been automatically marked as stale because it has not had\n  activity in the past 60 days. It will be closed in seven days if no \n  further activity occurs. Thank you for your contributions.\n# Comment to post when closing a stale issue. Set to `false` to disable\ncloseComment: false\n"
  },
  {
    "path": ".github/workflows/run-percy-tests.yml",
    "content": "name: Percy Tests\non:\n  push:\n    paths:\n    - '*.puml'\n    - 'percy/**'\n    - '.github/workflows/run-percy-tests.yml'\n  pull_request:\n    branches:\n    - '**'\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@master\n      - name: Setup Graphviz\n        uses: ts-graphviz/setup-graphviz@v2\n      - name: Process diagrams\n        uses: Timmy/plantuml-action@v1\n        with:\n          args: '-v percy -o _parsed -DRELATIVE_INCLUDE=\"./..\"'\n      - name: Upload\n        run: npx @percy/cli upload percy/_parsed\n        env:\n          PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "﻿################################################################################\n# This .gitignore file was automatically created by Microsoft(R) Visual Studio.\n################################################################################\n\n/.idea\n/.vs\n/.vscode\n"
  },
  {
    "path": ".scripts/HowToCreateANewRelease.md",
    "content": "# How to create a new release (WIP)\n\nThe idea is to\n- create a new release in the \"release/$release_version\" branch (tagged with `$release_version` and `latest`)\n- and a MR that the master branch can be updated with next beta version\n- create in PlantUML/PlantUML-stdlib a MR with the released version\n\n## 0. Preparation\n\nThe process requires following 3 versions:\n\n- **$release_version**: version which should be created (e.g. `v2.6.0`)\n- **$next_version**: version of the next beta which should be stared\n  as soon the release is created (e.g. `v2.7.0`).  \n  The master branch will be updated with a `beta1` of this version and C4Version() returns `2.7.0beta1`.  \n  If it is unknown/undefined it is calculated via the release_version. It is the next patch (release patch!=0) or subversion (release patch==0).\n- **$deployed_version**: this is the next \"plantuml(/plantuml-stdlib)\" version\n  which should be updated with this release (e.g. \"V1.2023.2\")  \n  If it is unknown/undefined it is calculated via the running PlantUML web service\n\n### 0.0 Create a new issue with the title `Release $release_version` \\(e.g. `Release v2.6.0`)\n\nand a body like in https://github.com/plantuml-stdlib/C4-PlantUML/issues/248\n\n### 0.1 Check that all open issues of the related `$release_version milestone` are fixed\n\n### 0.2 Check that all other open changes are done\n\nUpdate copyright year, contrib files, URLS, .... if required\n\n### 0.* ...\n\n### 0.x Check which is the next released version of the PlantUML(/PlantUML-stdlib)\n\nit is used as $deployed_version and written in the released README.md  \nIf it is unknown it can be calculated via `CalculateDeployedVersion` (details see below)\n\n## 1. create new release in branch `release/$release_version` (based on master)\n\nAtm following steps are semi-automated and can be executed in a bash shell:\n\n### 1.0. define the relevant versions as environment variabels and create the `release/$release_version` branch\n\n\\(in following sample the `release_version` = `v2.6.0`; `next_version` = `v2.7.0` and `deployed_version` = `V1.2022.15`)\n\n```bash\nexport release_version=v2.6.0\nexport next_version=v2.7.0\nexport deployed_version=V1.2022.15\n```\n\nIf the deployed_version is unknown it can be calculate via following (don't forget to set the environment variable after the call)\n\n```bash\npython ./.scripts/transform_files.py CalculateDeployedVersion\n```\n\nAs soon all versions are defined the `release/$release_version` branch \\(e.g. `release/v2.6.0`) can be created based on master branch\n\n```bash\ngit pull\ngit checkout master\ngit branch release/$release_version\ngit checkout release/$release_version\n```\n\n### 1.1. Update `C4Version()` in C4.puml with the new release (e.g. `2.6.0`; without `v`)\n\n```bash\npython ./.scripts/transform_files.py UpdateC4WithReleaseVersion\n```\n\n### 1.2. Update all include paths and create a release version of the README.md\n\nFollowing script calls\n\n- Update all include paths with the release version tag based branch\n- Update includes of all image urls with the release version tag based in *.md\n  (after that images displays the correct C4Version() number and uses only the release-tag path in all includes)\n- Update README.md with the new release header and title (based on the `readme_release_header.txt` template)\n\n```bash\npython ./.scripts/transform_files.py UpdateAllIncludes\npython ./.scripts/transform_files.py UpdateAllImages\npython ./.scripts/transform_files.py ReplaceREADMEHeader\n```\n\nThese changes can/should be checked and if everything is ok it can be committed.\n\nFollowing commit all changes and tag it locally with `$release_version` (e.g. `v2.5.0`) \n\n```bash\ngit checkout release/$release_version\ngit add -u *.md\ngit add -u *.puml\ngit add -u **/*.md\ngit add -u **/*.puml\ngit commit -m \"Create release (branch) $release_version\"\ngit tag \"$release_version\"\n```\n\nAnd if everything is ok it can be pushed too\n\n```bash\ngit checkout release/$release_version\ngit push -u origin release/$release_version\n```\n\n## 2. Create `Release $release_version` \\(e.g. `Release v2.6.0`) itself\n\nThis is done manually \\(incl. an additional check...)\n\n**Important:** As soon the release is finished check that \n- 'latest' tag is re-assigned to the new release branch\n- and '$release_version' tag is assigned to the new release branch\n\nAs soon the version is released the release branch has to be write protected\n\n## 3. Update master branch with $next_version beta1 version\n\n### 3.1. create a `start-$next_version-beta1` branch \\(e.g. `start-v2.7.0-beta1`) based on master branch\n\n```bash\ngit pull\ngit checkout master\ngit branch start-$next_version-beta1\ngit checkout start-$next_version-beta1\n```\n\nFollowing script update `C4Version()` in C4.puml with the next beta release (e.g. `2.7.0beta1`; without `v`)\n\n```bash\npython ./.scripts/transform_files.py UpdateC4WithNextBeta\n```\n\nFollowing commit all changes\n\n```bash\ngit checkout start-$next_version-beta1\ngit add -u C4.puml\ngit commit -m \"Update version with first beta of $next_version ($release_version was created based on previous commit)\"\n```\n\nAnd if everything is ok it can be pushed too\n\n```bash\ngit checkout start-$next_version-beta1\ngit push -u origin start-$next_version-beta1\n```\n\n### 3.2. Create a MR into master\n\nThis is done manually \\(incl. an additional check...)\n\n## 4. Create in PlantUML/PlantUML-stdlib a MR based on `release/$release_version` branch\n\n> !!! CHECK that the correct release branch is activated  !!!\n\n> It is assumed that following calls are started in \"C4-PlantUML repository\" folder\n(and not in the \"plantuml-stdlib repository\" folder)\n\nThe process requires following information too:\n\n- **$deploy_repository_folder**: folder with the local `PlantUML/PlantUML-stdlib` git repositiory.  \n  E.g. if it is parallel to the C4-PlantUML repository the it could be `../plantuml-stdlib`.\n\n### 4.1. create in a PlantUML/PlantUML-stdlib fork a `C4$release_version` branch (e.g. `C4v2.6.0`)\n\n```bash\nexport release_version=v2.6.0\nexport next_version=v2.7.0\nexport deployed_version=V1.2022.15\n\nexport deploy_repository_folder=../plantuml-stdlib\n\ngit pull\ngit checkout release/$release_version\n\ngit -C $deploy_repository_folder pull\ngit -C $deploy_repository_folder checkout master\ngit -C $deploy_repository_folder branch C4$release_version\ngit -C $deploy_repository_folder checkout C4$release_version\n```\n\n### 4.2. prepare the C4_*.puml, themes and README.md files\n\n```bash\npython ./.scripts/transform_files.py CreatePlantUMLStdlibC4Folder $deploy_repository_folder/stdlib/C4\n```\n\n### 4.3. Commit changes with comment \"Update C4-PlantUML to $release_version\"\n\n```bash\ngit -C $deploy_repository_folder add -u C4/**\ngit -C $deploy_repository_folder commit -m \"Update C4-PlantUML to $release_version\"\n```\n\n### 4.4. create a MR \"Update C4-PlantUML to $next_version\"\n\nThis is done manually \\(incl. an additional check...)\n"
  },
  {
    "path": ".scripts/plantuml-stdlib_C4_README.txt",
    "content": "---\nname: C4\ndisplay_name: C4 (C4-PlantUML)\ndescription: The C4 library enables a simple way of describing and communicate software architectures with an intuitive language.\nauthor: Ricardo Niepel, kirchsth and contributors\nversion: {release version without v}\nrelease: https://github.com/plantuml-stdlib/C4-PlantUML/tree/release/v{release version without v}\nlicense: MIT\nsource: https://github.com/plantuml-stdlib/C4-PlantUML\norigin: https://c4model.com\n---\n**C4 specific stdlib properties:**  \n![name: C4](https://img.shields.io/badge/name-C4-black)\n![display_name: C4 (C4-PlantUML)](https://img.shields.io/badge/display__name-C4_(C4--PlantUML)-black)  \n![version: {release version without v}](https://img.shields.io/badge/version-{release version without v}-black)\n[![release: https://github.com/plantuml-stdlib/C4-PlantUML/tree/release/v{release version without v}][Release Badge]][Release Link]  \n![description: The C4 library enables a simple way of describing and communicate software architectures with an intuitive language.](https://img.shields.io/badge/description-The_C4_library_enables_a_simple_way_of_describing_and_communicate_software_architectures_with_an_intuitive_language.-black)  \n[![license: MIT][License Badge]][License Link]\n![author: Ricardo Niepel, kirchsth and contributors](https://img.shields.io/badge/author-Ricardo_Niepel,_kirchsth_and_contributors-black)  \n[![source: https://github.com/plantuml-stdlib/C4-PlantUML][Source Badge]][Source Link]\n[![origin: https://c4model.com][Origin Badge]][Origin Link]  \n\n[Release Badge]: https://img.shields.io/badge/release-https://github.com/plantuml--stdlib/C4--PlantUML/tree/release/v{release version without v}-blue\n[Release Link]: https://github.com/plantuml-stdlib/C4-PlantUML/tree/release/v{release version without v}\n[License Badge]: https://img.shields.io/badge/license-MIT-green\n[License Link]: https://github.com/plantuml-stdlib/C4-PlantUML/blob/master/LICENSE\n[Source Badge]: https://img.shields.io/badge/source-https://github.com/plantuml--stdlib/C4--PlantUML-blue\n[Source Link]: https://github.com/plantuml-stdlib/C4-PlantUML\n[Origin Badge]: https://img.shields.io/badge/origin-https://c4model.com-blue\n[Origin Link]: https://c4model.com\n\n**Support and community:**  \n[![issues: C4][Issues Badge]][Issues Link]\n[![open master commits][Open Badge]][Open Link]  \n[![discussions: C4][Discussions Badge]][Discussions Link]  \n\n[Issues Badge]: https://img.shields.io/badge/issues-https://github.com/plantuml--stdlib/C4--PlantUML/issues-orange\n[Issues Link]: https://github.com/plantuml-stdlib/C4-PlantUML/issues\n[Open Badge]: https://img.shields.io/github/commits-difference/plantuml-stdlib/C4-PlantUML?base=release%2Fv{release version without v}&head=master&label=Open%20master%20commits&color=orange\n[Open Link]: https://github.com/plantuml-stdlib/C4-PlantUML/compare/v{release version without v}...master\n[Discussions Badge]: https://img.shields.io/badge/discussions-https://github.com/plantuml--stdlib/C4--PlantUML/discussions-orange\n[Discussions Link]: https://github.com/plantuml-stdlib/C4-PlantUML/discussions\n\n# C4 library (C4-PlantUML) [C4]\n\nThe C4 library enables a simple way of describing and communicate software architectures with an intuitive language.\n\nIt is the PlantUML integrated version of [C4-PlantUML](https://github.com/plantuml-stdlib/C4-PlantUML) and has the big advantage that it can be used without additional external includes.\n(E.g. container diagrams can be drawn with `!include <C4/C4_Container>` and no `!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml` is required.)\n\n## Example of usage:\n\n```plantuml\n@startuml\n!include <C4/C4_Container>\nLAYOUT_LEFT_RIGHT()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, \"Sample System\") {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n<br/>\n\n**renders following image:**\n\n[![Example](https://www.plantuml.com/plantuml/png/JL1TQy9047o_Nx5DNn8GYyN7KanJgmMhOivAdyAPRE7WFiBT1f7I_zvDjTfxMUvcPcTk9f5KeCuQSQDTRRe6uQ4OtnNZgl2Eb7OO7iKY_rXjPRMOliXgypgRopGJOeqXUfUgncetW2JlfuuK5FcGPA8yHa9RFVdEDIeSqth4f5BPrY2Si2I3Bm5yBaxf0VULQbjcxd0FUTiQNIlItYNyLDmE82_Nm-LKiYGWt0z7yFPUz5XkZ3z4w2A62EIXzhPLJB6T8TrRoeCcmW2aBHhsYXpn-nmofHF8Uyuq1iK6pT_dhh6saPKyvrAkooJx9LtGwvePKkGhzkCpUFjV8ihvQiTTpgRBP-vnWgxX-dy0)](https://www.plantuml.com/plantuml/uml/JL1TQy9047o_Nx5DNn8GYyN7KanJgmMhOivAdyAPRE7WFiBT1f7I_zvDjTfxMUvcPcTk9f5KeCuQSQDTRRe6uQ4OtnNZgl2Eb7OO7iKY_rXjPRMOliXgypgRopGJOeqXUfUgncetW2JlfuuK5FcGPA8yHa9RFVdEDIeSqth4f5BPrY2Si2I3Bm5yBaxf0VULQbjcxd0FUTiQNIlItYNyLDmE82_Nm-LKiYGWt0z7yFPUz5XkZ3z4w2A62EIXzhPLJB6T8TrRoeCcmW2aBHhsYXpn-nmofHF8Uyuq1iK6pT_dhh6saPKyvrAkooJx9LtGwvePKkGhzkCpUFjV8ihvQiTTpgRBP-vnWgxX-dy0)\n"
  },
  {
    "path": ".scripts/plantuml-stdlib_README_section.txt",
    "content": "<!-- start C4 section -->\n![name: C4](https://img.shields.io/badge/name-C4-black)\n![display_name: C4 (C4-PlantUML)](https://img.shields.io/badge/display__name-C4_(C4--PlantUML)-black)\n[![version: {release version without v}][Version Badge]][Version Link]\n![license: MIT](https://img.shields.io/badge/license-MIT-green)\n![author: Ricardo Niepel, kirchsth and contributors](https://img.shields.io/badge/author-Ricardo_Niepel,_kirchsth_and_contributors-black)  \n[![all properties see: ./stdlib/C4/README.md][See Badge]][See Link]  \n\n[Version Badge]: https://img.shields.io/badge/version-{release version without v}-blue\n[Version Link]: https://github.com/plantuml-stdlib/C4-PlantUML/tree/release/v{release version without v}\n[See Badge]: https://img.shields.io/badge/all_stdlib_specific_properties_see-./stdlib/C4/README.md-blue\n[See Link]: ./stdlib/C4/README.md\n<!-- end C4 section -->"
  },
  {
    "path": ".scripts/readme_release_header.txt",
    "content": "[![release][Release Badge]][Release Page]\n[![license MIT][License Badge]][License Page]\n &nbsp; &nbsp; &nbsp;\n[![integrated in PlantUML][Integrated Badge]][Integrated Page]\n &nbsp; &nbsp; &nbsp;\n[![commits since][Commits Since Badge]][Commit Page]\n\n[Release Badge]: https://img.shields.io/badge/release-{release version}-blue\n[Release Page]: https://github.com/plantuml-stdlib/C4-PlantUML/releases/{release version}\n[License Badge]: https://img.shields.io/github/license/plantuml-stdlib/C4-PlantUML\n[License Page]: https://github.com/plantuml-stdlib/C4-PlantUML/blob/master/LICENSE\n[Integrated Badge]: https://img.shields.io/badge/C4--PlantUML%20%20{release version}%20integrated%20in%20PlantUML%20Standard%20Library-{deploy into version}-orange\n[Integrated Page]: https://plantuml.com/stdlib#062f75176513a666\n\n[Commits Since Badge]: https://img.shields.io/github/commits-since/plantuml-stdlib/C4-PlantUML/latest?label=new%20unreleased%20changes%20in%20master%20branch\n[Commit Page]: https://github.com/plantuml-stdlib/C4-PlantUML/commits\n\n# C4-PlantUML ({release version})"
  },
  {
    "path": ".scripts/transform_files.py",
    "content": "#!/usr/bin/python\n\n# If a new version is released, version number and other topics of the source\n# has to be updated.\n# This script simplifies the update from master to a specific release (branch/tag)\n\n# IMPORTANT:\n#\n# - It is assumed that the script is stared in repository root with relative path\n#   python ./.scripts/transform_files <transformation>\n#\n# - It is assumed that\n#   - \"release_version\"      (e.g. \"v2.6.0\"),\n#   - \"next_version\"         (e.g. \"v2.7.0\")\n#                            If it is undefined it will be calculated via the release_version.\n#                            It is the next patch (release patch!=0) or subversion (release patch==0).\n#   - and \"deployed_version\" This is the next \"plantuml(/plantuml-stdlib)\" version\n#                            which should be updated with this release (e.g. \"V1.2023.2\")\n#                            If it is undefined it is calculated via the running PlantUML web service\n#   are defined as environment variable (or they will be calculated if possible)\n\n# Supported transformations/functions are\n#\n# - CalculateDeployedVersion\n#\n# - UpdateC4WithReleaseVersion\n# - UpdateAllIncludes\n# - UpdateAllImages\n# - ReplaceREADMEHeader\n# - UpdateC4WithNextBeta\n#\n# - CreatePlantUMLStdlibC4Folder [<plantuml-stdlib/C4 target folder>]\n\nimport os\nimport re\nimport sys\nimport glob\n\nimport zlib\nimport base64\nimport string\n\nimport requests\n\n# >>>>> plant uml decoder from ryardley/plant_uml_decoder.py\n# >>>>> https://gist.github.com/ryardley/64816f5097003a35f9726aab676920d0\n\nplantuml_alphabet = (\n    string.digits + string.ascii_uppercase + string.ascii_lowercase + \"-_\"\n)\nbase64_alphabet = string.ascii_uppercase + string.ascii_lowercase + string.digits + \"+/\"\nb64_to_plantuml = bytes.maketrans(\n    base64_alphabet.encode(\"utf-8\"), plantuml_alphabet.encode(\"utf-8\")\n)\nplantuml_to_b64 = bytes.maketrans(\n    plantuml_alphabet.encode(\"utf-8\"), base64_alphabet.encode(\"utf-8\")\n)\n\n\ndef plantuml_encode(plantuml_text):\n    \"\"\"zlib compress the plantuml text and encode it for the plantuml server\"\"\"\n    zlibbed_str = zlib.compress(plantuml_text.encode(\"utf-8\"))\n    compressed_string = zlibbed_str[2:-4]\n    return (\n        base64.b64encode(compressed_string).translate(b64_to_plantuml).decode(\"utf-8\")\n    )\n\n\ndef plantuml_decode(plantuml_url):\n    \"\"\"decode plantuml encoded url back to plantuml text\"\"\"\n    data = base64.b64decode(plantuml_url.translate(plantuml_to_b64).encode(\"utf-8\"))\n    dec = zlib.decompressobj()  # without check the crc.\n    header = b\"x\\x9c\"\n    return dec.decompress(header + data).decode(\"utf-8\")\n\n\n# <<<<< plant uml decoder from ryardley/plant_uml_decoder.py\n\n\ndef read_environment_variable(env_var, is_required=True):\n    if env_var not in os.environ:\n        if is_required:\n            sys.stderr.write(\n                f\"the required environment variable {env_var} is not defined\\n\"\n            )\n            sys.exit(3)\n        else:\n            return \"\"\n    return os.environ[env_var]\n\n\n# It is assumed that \"release_version\", \"next_version\" and \"deployed_version\"\n# are defined as environment variable.\n# If next_version is not defined then it is calculated based on release_version\n# If deployed_version is not defined then it is calculated based on the running PlantUML web server\ndef read_environment_variables():\n    global release_version\n    release_version = read_environment_variable(\"release_version\")\n    if release_version[0] != \"v\":\n        sys.stderr.write(\n            f\"release version {release_version} has to start with 'v' (and use a format like vX.Y.Z)\"\n        )\n        sys.exit(2)\n    release_match = re.search(\n        r\"^v(?P<v1>[0-9]+)\\.(?P<v2>[0-9]+)\\.(?P<v3>[0-9]+)$\", release_version\n    )\n    if not release_match:\n        sys.stderr.write(\n            f\"release version {release_version} has to use a format like v[0-9]+.[0-9]+.[0-9]+, e.g. v2.6.0)\"\n        )\n        sys.exit(2)\n\n    global next_version\n    next_version = read_environment_variable(\"next_version\", False)\n    if next_version == \"\":\n        v1 = int(release_match[\"v1\"])\n        v2 = int(release_match[\"v2\"])\n        v3 = int(release_match[\"v3\"])\n        next_version = calculate_next_version(release_version, v1, v2, v3)\n\n    global deployed_version\n    deployed_version = read_environment_variable(\"deployed_version\", False)\n    if deployed_version == \"\":\n        deployed_version = read_next_plantuml_version()\n\n\ndef replace_first_regex_in_file(file_path, search, replace):\n    r = re.compile(search)\n    with open(file_path, \"r\") as file:\n        filedata = file.read()\n        filedata = r.sub(replace, filedata, 1)\n    with open(file_path, \"w\") as file:\n        file.write(filedata)\n\n\ndef replace_in_file(file_path, orig, replace):\n    with open(file_path, \"r\") as file:\n        filedata = file.read()\n        filedata = filedata.replace(orig, replace)\n    with open(file_path, \"w\") as file:\n        file.write(filedata)\n\n\ndef replace_first_regex_copy_file(\n    source_path, target_path, compiled_search_regex, replace\n):\n    with open(source_path, \"r\") as file:\n        filedata = file.read()\n    filedata = compiled_search_regex.sub(replace, filedata, 1)\n    with open(target_path, \"w\") as file:\n        file.write(filedata)\n\n\ndef replace_regex_copy_file(\n    source_path, target_path, compiled_search_regex, replace\n):\n    with open(source_path, \"r\") as file:\n        filedata = file.read()\n    filedata = compiled_search_regex.sub(replace, filedata)\n    with open(target_path, \"w\") as file:\n        file.write(filedata)\n\n\n# Calculates the next version (inclusive starting v) based on the give version values.\n# If v3 == 0 then v2 is increased otherwise v3\ndef calculate_next_version(release, v1, v2, v3):\n    print(f\"calculates the next_version based on given release_version {release} ...\")\n    if v3 == 0:\n        v2 = v2 + 1\n    else:\n        v3 = v3 + 1\n    version = f\"v{v1}.{v2}.{v3}\"\n    print(\n        f\"The calculated next_version = {version}. It can be used as next_version environment variable with following statement\"\n    )\n    print(f\"    export next_version={version}\")\n    return version\n\n\n# Calculates the next released PlantUML version that it can be used as deployed_version environment variable\n# based on http://www.plantuml.com/plantuml/svg/SoWkIImgAStDuSf8JKn9BL9GBKijAixCpzFGv798pKi1oW00 response\n# This function returns \"V\" + the parsed version number  (e.g. \"V1.2022.16\")\ndef read_next_plantuml_version():\n    # the idea is that the PlantUML version is extracted out of the svg result of \"header %version()\".\n    # %version() stores beta of next version.\n    # the returned SVG response stores the version inclusive beta in a text element; e.fg. \"...<text ...>1.2022.16beta2</text>...\"\n    # and this function returns \"V\" + the parsed version number  (e.g. \"V1.2022.16\")\n    print(\n        \"calculates the next deployed_version based on the running PlantUML web server response ...\"\n    )\n    resp = requests.get(\n        \"http://www.plantuml.com/plantuml/svg/SoWkIImgAStDuSf8JKn9BL9GBKijAixCpzFGv798pKi1oW00\"\n    )\n    if resp.status_code != 200:\n        sys.stderr.write(\n            \"cannot read the svg response (with the next release version) from the PlantUML web server; please check http://www.plantuml.com/plantuml/svg/SoWkIImgAStDuSf8JKn9BL9GBKijAixCpzFGv798pKi1oW00\"\n        )\n        sys.exit(4)\n\n    # As an alternative it could be calculated via https://www.planttext.com/api/plantuml/txt/SoWkIImgIIvApSz9vL8jIoqgpipFqz3aSaZDIu680W00\n    # It would return \"1.2022.15beta6\\n\". (details see https://forum.plantuml.net/17179/ascii-art-title-produces-java-lang-illegalstateexception?show=17184#a17184)\n\n    svgbody = resp.content\n    svg = svgbody.decode(\"utf-8\")\n    # this regex ignore beta2 of the text section too: \"<text [^>]+>(?P<version>[0-9\\.]+)\"\n    r = re.compile(r\"<text [^>]+>(?P<version>[0-9\\.]+)\")\n    v = r.search(svg)[\"version\"]\n    version = \"V\" + v\n\n    print(\n        f\"The next PlantUML version = {version}. It can be used as deployed_version environment variable with following statement\"\n    )\n    print(f\"    export deployed_version={version}\")\n\n    return version\n\n\ndef update_c4_release_version():\n    # $c4Version is defined without starting 'v'\n    print(\n        f\"updating C4Version() definition in C4.puml with new release_version {release_version[1:]} ...\"\n    )\n    replace_first_regex_in_file(\n        \"C4.puml\", r'!\\$c4Version  =  \".+\"', f'!$c4Version  =  \"{release_version[1:]}\"'\n    )\n    print(\"C4Version() updated\")\n\n\ndef update_c4_next_beta_version():\n    # $c4Version is defined without starting 'v'\n    print(\n        f\"updating C4Version() definition in C4.puml with new release_version {next_version[1:]} ...\"\n    )\n    replace_first_regex_in_file(\n        \"C4.puml\", r'!\\$c4Version  =  \".+\"', f'!$c4Version  =  \"{next_version[1:]}beta1\"'\n    )\n    print(\"C4Version() updated\")\n\n\ndef update_all_includes():\n    # reference tag version is with starting 'v'\n    print(f\"updating include/theme paths with new tag version {release_version} ...\")\n    files = glob.glob(\"./**/*\", recursive=True)\n    for file in files:\n        if file.endswith(\".puml\") or file.endswith(\".md\"):\n            print(f\"    {file}\")\n            replace_in_file(\n                file,\n                \"!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/\",\n                f\"!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/{release_version}/\",\n            )\n            replace_in_file(\n                file,\n                \"from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/\",\n                f\"from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/{release_version}/\",\n            )\n            replace_in_file(\n                file,\n                \"](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/\",\n                f\"](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/{release_version}/themes/\",\n            )\n    print(f\"include/theme paths updated\")\n\n\ndef process_url_match(m: re.Match[str]):\n    base = m.group(\"base\")\n    out_format = m.group(\"format\")\n    base64 = m.group(\"base64\")\n    text = plantuml_decode(base64)\n\n    new_path = f\"!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/{release_version}/\"\n    replaced = text.replace(\n        \"!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/\",\n        new_path,\n    )\n    replaced = replaced.replace(\n        \"from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/\",\n        f\"from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/{release_version}/\",\n    )\n    replaced = replaced.replace(\n        \"](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/\",\n        f\"](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/{release_version}/themes/\",\n    )\n\n    if new_path not in replaced:\n        global found_not_replaced_include\n        found_not_replaced_include = True\n        print(\n            f\"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\\ninclude could not be replaced in base64\\n{base64}\\nthe extracted source is\\n{text}\\n------------------------------------\"\n        )\n        updated_base64 = base64\n    else:\n        updated_base64 = plantuml_encode(replaced)\n\n    return f\"{base}/{out_format}/{updated_base64}\"\n\n\ndef replace_images_in_file(file_path):\n    # extract all base64 entries\n    r = re.compile(\n        \"(?P<base>https://www\\\\.plantuml\\\\.com/plantuml)/(?P<format>(png|uml|svg))/(?P<base64>([^ )]*))\"\n    )\n    with open(file_path, \"r\") as file:\n        filedata = file.read()\n        filedata = r.sub(process_url_match, filedata)\n    with open(file_path, \"w\") as file:\n        file.write(filedata)\n\n\ndef update_all_images():\n    # reference tag version is with starting 'v'\n    print(\n        f\"updating include paths with new tag version {release_version} in images of all *.md files ...\"\n    )\n\n    global found_not_replaced_include\n    found_not_replaced_include = False\n\n    files = glob.glob(\"./**/*\", recursive=True)\n    for file in files:\n        if file.endswith(\".md\"):\n            print(f\"    {file}\")\n            replace_images_in_file(file)\n\n    if found_not_replaced_include:\n        sys.stderr.write(\n            \"!!!!!! not all images urls could be updated in the *.md files (details see log)\\n\"\n        )\n        sys.exit(3)\n\n    print(\"include paths in images updated\")\n\n\ndef replace_readme_header():\n    print(f\"updating README.md with new version {release_version} and badges ...\")\n    # remove whole part before \"# C4-PlantUML\" in README.md\n    r = re.compile(r\"[^\\#]+# C4-PlantUML\", re.M)\n    with open(\"README.md\", \"r\") as file:\n        filedata = file.read()\n    filedata = r.sub(\"# C4-PlantUML\", filedata)\n\n    with open(\"./.scripts/readme_release_header.txt\", \"r\") as header_file:\n        header = header_file.read()\n        header = header.replace(\"{release version}\", release_version).replace(\n            \"{deploy into version}\", deployed_version\n        )\n\n    filedata = filedata.replace(\"# C4-PlantUML\", header)\n\n    with open(\"README.md\", \"w\") as file:\n        file.write(filedata)\n\n    print(\"release README.md updated with new version and badges\")\n\n\ndef create_plantuml_stdlib_c4_folder(target_path):\n    print(\n        f\"prepare C4 folder of plantuml-stdlib repository in folder {target_path} ...\"\n    )\n    # remove whole begin inclusive \"!endif\" in the specific C4_*.puml files\n    inclusive_endif = re.compile(r\"'[^']+!endif\", re.M)\n\n    os.makedirs(target_path, exist_ok=True)\n    replace_first_regex_copy_file(\n        \"C4.puml\",\n        os.path.join(target_path, \"C4.puml\"),\n        re.compile(\"DOES NOT EXIST\"),\n        \"DOES NOT EXIST\",\n    )\n    replace_first_regex_copy_file(\n        \"C4_Component.puml\",\n        os.path.join(target_path, \"C4_Component.puml\"),\n        inclusive_endif,\n        \"!include <C4/C4_Container>\",\n    )\n    replace_first_regex_copy_file(\n        \"C4_Container.puml\",\n        os.path.join(target_path, \"C4_Container.puml\"),\n        inclusive_endif,\n        \"!include <C4/C4_Context>\",\n    )\n    replace_first_regex_copy_file(\n        \"C4_Context.puml\",\n        os.path.join(target_path, \"C4_Context.puml\"),\n        inclusive_endif,\n        \"!include <C4/C4>\",\n    )\n    replace_first_regex_copy_file(\n        \"C4_Deployment.puml\",\n        os.path.join(target_path, \"C4_Deployment.puml\"),\n        inclusive_endif,\n        \"!include <C4/C4_Container>\",\n    )\n    replace_first_regex_copy_file(\n        \"C4_Dynamic.puml\",\n        os.path.join(target_path, \"C4_Dynamic.puml\"),\n        inclusive_endif,\n        \"!include <C4/C4_Component>\",\n    )\n    replace_first_regex_copy_file(\n        \"C4_Sequence.puml\",\n        os.path.join(target_path, \"C4_Sequence.puml\"),\n        inclusive_endif,\n        \"!include <C4/C4_Component>\",\n    )\n\n    themes_path = target_path+\"/themes\"\n    os.makedirs(themes_path, exist_ok=True)\n    paths = glob.glob(\"./themes/puml-theme-C4_*.puml\")\n    for path in paths:\n        file = os.path.basename(path)\n        if file == \"puml-theme-C4_FirstTest.puml\":\n            continue\n        # print(f\"    {path}\")\n        replace_first_regex_copy_file(\n            path,\n            os.path.join(themes_path, file),\n            re.compile(\"DOES NOT EXIST\"),\n            \"DOES NOT EXIST\",\n        )\n\n    replace_regex_copy_file(\n        \"./.scripts/plantuml-stdlib_C4_README.txt\",\n        os.path.join(target_path, \"README.md\"),\n        re.compile(r\"\\{release version without v\\}\"),\n        release_version[1:],\n    )\n\n    with open(\"./.scripts/plantuml-stdlib_README_section.txt\", \"r\") as f:\n        section = f.read()\n    updatedSection = re.sub(r\"\\{release version without v\\}\", release_version[1:], section)\n    with open(os.path.join(target_path, \"./../../README.md\"), \"r\") as f:\n        content = f.read()\n    pattern = r'<!-- start C4 section -->.*?<!-- end C4 section -->'\n    updated_content = re.sub(pattern, updatedSection, content, flags=re.DOTALL)\n    with open(os.path.join(target_path, \"./../../README.md\"), \"w\") as f:\n        f.write(updated_content)\n\n    print(f\"all C4 related plantuml-stdlib files copied into {target_path}.\")\n\n\nif not (\n    len(sys.argv) == 2\n    or (len(sys.argv) == 3 and sys.argv[1] == \"CreatePlantUMLStdlibC4Folder\")\n):\n    u = \"Usage: python ./.scripts/transform_files.py <transformation>\\n\"\n    sys.stderr.write(\"Usage: python ./.scripts/transform_files.py <transformation>\\n\")\n    sys.exit(1)\n\nif sys.argv[0] != \"./.scripts/transform_files.py\":\n    u = \"script has to be started in repository root with relative path: ./.scripts/transform_files <transformation>\\n\"\n    sys.stderr.write(u)\n    sys.exit(1)\n\nif sys.argv[1] == \"UpdateC4WithReleaseVersion\":\n    read_environment_variables()\n    update_c4_release_version()\nelif sys.argv[1] == \"UpdateAllIncludes\":\n    read_environment_variables()\n    update_all_includes()\nelif sys.argv[1] == \"UpdateAllImages\":\n    read_environment_variables()\n    update_all_images()\nelif sys.argv[1] == \"ReplaceREADMEHeader\":\n    read_environment_variables()\n    replace_readme_header()\nelif sys.argv[1] == \"UpdateC4WithNextBeta\":\n    read_environment_variables()\n    update_c4_next_beta_version()\nelif sys.argv[1] == \"CalculateDeployedVersion\":\n    calculated_deployed_version = read_next_plantuml_version()\nelif sys.argv[1] == \"CreatePlantUMLStdlibC4Folder\":\n    read_environment_variables()\n    if len(sys.argv) == 3:\n        create_plantuml_stdlib_c4_folder(sys.argv[2])\n    else:\n        create_plantuml_stdlib_c4_folder(\".plantuml_stdlib_c4\")\nelse:\n    sys.stderr.write(f\"{sys.argv[1]} is an unsupported transformation\\n\")\n    sys.exit(1)\n"
  },
  {
    "path": "C4.puml",
    "content": "' C4-PlantUML\n\n' Global pre-settings\n' ##################################\n' NEW_C4_STYLE\n'   If NEW_C4_STYLE is set BEFORE the first C4_* file is loaded, new C4 layout style is used\n'   NEW_C4_STYLE can be set via\n'     !NEW_C4_STYLE = 1\n'   or with additional command line argument -DNEW_C4_STYLE=1\n!global NEW_C4_STYLE ?= 0\n\n' ROUNDED_STYLE\n'   If ROUNDED_STYLE is set BEFORE the first C4_* file is loaded, rectangles with rounded corners are used as default shape\n'   ROUNDED_STYLE can be set via\n'     !ROUNDED_STYLE = 1\n'   or with additional command line argument -DROUNDED_STYLE=1\n!if (NEW_C4_STYLE == 1)\n  !global ROUNDED_STYLE ?= 1\n!else\n  !global ROUNDED_STYLE ?= 0\n!endif\n\n' ENABLE_ALL_PLANT_ELEMENTS\n'   If ENABLE_ALL_PLANT_ELEMENTS is set BEFORE the first C4_* file is loaded, nearly \"all\" PlantUML elements can be used like\n'     Component(StorageA, \"Storage A \", $baseShape=\"storage\")\n'   ENABLE_ALL_PLANT_ELEMENTS can be set via\n'     !ENABLE_ALL_PLANT_ELEMENTS = 1\n'   or with additional command line argument -DENABLE_ALL_PLANT_ELEMENTS=1\n\n' NO_LAY_ROTATE\n' C4-PlantUML v2.12 fixed a missing rotation bug in Lay_* calls in combination with LAYOUT_LANDSCAPE() call\n' (details see https://github.com/plantuml-stdlib/C4-PlantUML/issues/376)\n' If older diagrams should remain unchanged the bugfix can be deactivated with following statement\n'     !NO_LAY_ROTATE = 1\n' or with follwing additional command line argument\n'     -DNO_LAY_ROTATE=1\n' like\n'    java -jar plantuml.jar -DNO_LAY_ROTATE=1 ...\n!global NO_LAY_ROTATE ?= 0\n\n'Version\n' ##################################\n!function C4Version()\n  ' 2 spaces and ' are used as unique marker, that the release scripts makes the correct version update\n  !$c4Version  =  \"2.14.0beta1\"\n  !return $c4Version\n!end function\n\n!procedure C4VersionDetails()\nrectangle C4VersionDetailsArea <<legendArea>> [\n| PlantUML | **%version()** |\n| C4-PlantUML | **C4Version()** |\n]\n!end procedure\n\n' Colors\n' ##################################\n!$ELEMENT_FONT_COLOR ?= \"#FFFFFF\"\n\n!$ARROW_COLOR ?= \"#666666\"\n!$ARROW_FONT_COLOR ?= $ARROW_COLOR\n\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_BORDER_STYLE ?= \"dashed\"\n' boundary symbols written in the same line, typically only 50% of the size in element\n!$BOUNDARY_IMAGE_SIZE_FACTOR ?= 0.5\n!$BOUNDARY_DESCR_MAX_CHAR_WIDTH ?= 35\n\n!$LEGEND_TITLE_COLOR ?= \"#000000\"\n!$LEGEND_FONT_COLOR ?= \"#FFFFFF\"\n!$LEGEND_BG_COLOR ?= \"transparent\"\n!$LEGEND_BORDER_COLOR ?= \"transparent\"\n' %darken(darkkhaki,50), #khaki\n!$LEGEND_DARK_COLOR ?= \"#66622E\"\n!$LEGEND_LIGHT_COLOR ?= \"#khaki\"\n\n!$SKETCH_BG_COLOR ?= \"#EEEBDC\"\n!$SKETCH_FONT_COLOR ?= \"\"\n!$SKETCH_WARNING_COLOR ?= \"red\"\n!$SKETCH_FONT_NAME ?= \"Comic Sans MS\"\n\n' Labels\n' ##################################\n\n!$BOUNDARY_LEGEND_TEXT ?= \"boundary\"\n\n!$LEGEND_TITLE_TEXT ?= \"Legend\"\n!$LEGEND_SHADOW_TEXT ?= \"shadow\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"no shadow\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"last text and back color\"\n!$LEGEND_NO_FONT_TEXT ?= \"last text color\"\n!$LEGEND_NO_BG_TEXT ?= \"last back color\"\n!$LEGEND_NO_LINE_TEXT ?= \"last line color\"\n!$LEGEND_SHARP_CORNER ?= \"box\"\n!$LEGEND_ROUNDED_BOX ?= \"rounded box\"\n!$LEGEND_EIGHT_SIDED ?= \"eight sided\"\n!$LEGEND_DOTTED_LINE ?= \"dotted\"\n!$LEGEND_DASHED_LINE ?= \"dashed\"\n!$LEGEND_BOLD_LINE ?= \"bold\"\n!$LEGEND_SOLID_LINE ?= \"solid\"\n\n!$LEGEND_BOUNDARY ?= \"boundary\"\n!$LEGEND_BOUNDARY_PRE_PART ?= \"\"\n!$LEGEND_BOUNDARY_POST_PART ?= \" \" + $LEGEND_BOUNDARY\n\n' ignore (boundary) transparent atm, that the legend is smaller\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n' (boundary) dashed should not be ignored atm\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"dashed, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n\n!$LEGEND_THICKNESS ?= \"thickness\"\n\n!$SKETCH_FOOTER_WARNING ?= \"Warning:\"\n!$SKETCH_FOOTER_TEXT ?= \"Created for discussion, needs to be validated\"\n\n' Styling\n' ##################################\n\n!$STEREOTYPE_FONT_SIZE ?= 12\n!global $TRANSPARENT_STEREOTYPE_FONT_SIZE = $STEREOTYPE_FONT_SIZE/2\n!$TECHN_FONT_SIZE ?= 12\n\n!$ARROW_FONT_SIZE ?= 12\n\n!$LEGEND_DETAILS_SMALL_SIZE ?= 10\n!$LEGEND_DETAILS_NORMAL_SIZE ?= 14\n!global $LEGEND_DETAILS_SIZE = $LEGEND_DETAILS_SMALL_SIZE\n\n' element symbols typically 4 times too big in legend\n!$LEGEND_IMAGE_SIZE_FACTOR ?= 0.25\n\n!$ROUNDED_BOX_SIZE ?= 25\n!$EIGHT_SIDED_SIZE ?= 18\n\n' Default element wrap width (of an element)\n!$DEFAULT_WRAP_WIDTH ?= 200\n' Maximum size in pixels, of a message (in a sequence diagram?)\n!$MAX_MESSAGE_SIZE ?= 150\n' PlantUML supports no DETERMINISTIC/automatic line breaks of \"PlantUML line\" (C4 Relationships)\n' therefore Rel...() implements an automatic line break based on spaces (like in all other objects).\n' If a $type contains \\n then these are used (and no automatic space based line breaks are done)\n' $REL_TECHN_MAX_CHAR_WIDTH defines the automatic line break position\n!$REL_TECHN_MAX_CHAR_WIDTH ?= 35\n!$REL_DESCR_MAX_CHAR_WIDTH ?= 32\n\n' internal\n' ##################################\n\n!global $SHARP_CORNER = \"sharpCorner\"\n!global $ROUNDED_BOX = \"roundedBox\"\n!global $EIGHT_SIDED = \"eightSided\"\n!if (ROUNDED_STYLE == 1)\n  !$DEFAULT_SHAPE ?= $ROUNDED_BOX\n!else\n  !$DEFAULT_SHAPE ?= $SHARP_CORNER\n!endif\n\n!global $DOTTED_LINE = \"dotted\"\n!global $DASHED_LINE = \"dashed\"\n!global $BOLD_LINE = \"bold\"\n' solid is not defined in plantUML, but works as reset of all other styles too\n!global $SOLID_LINE = \"solid\"\n\n!global $LEGEND_DETAILS_NONE = \"none\"\n!global $LEGEND_DETAILS_NORMAL = \"normal\"\n!global $LEGEND_DETAILS_SMALL = \"small\"\n\nskinparam defaultTextAlignment center\n\nskinparam wrapWidth $DEFAULT_WRAP_WIDTH\nskinparam maxMessageSize $MAX_MESSAGE_SIZE\n\nskinparam LegendFontColor $LEGEND_FONT_COLOR\nskinparam LegendBackgroundColor $LEGEND_BG_COLOR\nskinparam LegendBorderColor $LEGEND_BORDER_COLOR\n\nskinparam rectangle<<legendArea>> {\n    backgroundcolor $LEGEND_BG_COLOR\n    bordercolor $LEGEND_BORDER_COLOR\n}\n\nskinparam rectangle {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\n\nskinparam database {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\n\nskinparam queue {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\n\nskinparam participant {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\n\nskinparam arrow {\n    Color $ARROW_COLOR\n    FontColor $ARROW_FONT_COLOR\n    FontSize $ARROW_FONT_SIZE\n}\n\nskinparam person {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\n\nskinparam actor {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n    style awesome\n}\n\n!if %variable_exists(\"ENABLE_ALL_PLANT_ELEMENTS\")\nskinparam agent {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam artifact {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam boundary {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam card {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam circle {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam cloud {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam collections {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam control {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam entity {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam file {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam folder {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam frame {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam hexagon {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam interface {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam label {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam stack {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam storage {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam usecase {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\nskinparam person {\n    StereotypeFontSize $STEREOTYPE_FONT_SIZE\n}\n!endif\n\n' Some boundary skinparams have to be set as package skinparams too (PlantUML uses internal packages)\n' UpdateBoundaryStyle() called in boundary section below\nskinparam rectangle<<boundary>> {\n    StereotypeFontSize $TRANSPARENT_STEREOTYPE_FONT_SIZE\n    StereotypeFontColor $BOUNDARY_BG_COLOR\n    BorderStyle $BOUNDARY_BORDER_STYLE\n}\n\nskinparam package {\n    StereotypeFontSize $TRANSPARENT_STEREOTYPE_FONT_SIZE\n    StereotypeFontColor $BOUNDARY_BG_COLOR\n    FontStyle plain\n    BackgroundColor $BOUNDARY_BG_COLOR\n}\n\n' PlantUML compatibility utilities\n' ##################################\n\n' PlantUML v1.2025.1beta6 introduced a new %breakline() function.\n' This should be used instead of the old %newline(), if a command ends.\n' (%newline() should be only used in multiline labels,...)\n!function $bl()\n  !if (%function_exists(\"%breakline\"))\n    !return %breakline()\n  !endif\n  !return %newline()\n!endfunction\n\n' Legend and Tags\n' ##################################\n!global $tagDefaultLegend = \"\"\n!global $tagCustomLegend = \"\"\n\n' rel specific\n!unquoted function $toStereos($tags)\n  !if (%strlen($tags) == 0)\n    !return ''\n  !endif\n  !$stereos = ''\n  !$brPos = %strpos($tags, \"+\")\n  !while ($brPos >= 0)\n    !$tag = %substr($tags, 0, $brPos)\n    !$stereos = $stereos + '<<' + $tag + '>>'\n%set_variable_value(\"$\" + $tag + \"_LineLegend\", %true())\n    !$tags = %substr($tags, $brPos+1)\n    !$brPos = %strpos($tags, \"+\")\n  !endwhile\n  !if (%strlen($tags) > 0)\n    !$stereos = $stereos + '<<' + $tags + '>>'\n%set_variable_value(\"$\" + $tags + \"_LineLegend\", %true())\n  !endif\n  !return $stereos\n!endfunction\n\n' if $sprite/$techn is an empty argument, try to calculate it via the defined $tag\n!unquoted function $toRelArg($arg, $tags, $varPostfix)\n  !if ($arg > \"\")\n    !return $arg\n  !endif\n\n  !if (%strlen($tags) == 0)\n       !return $arg\n  !endif\n  !$brPos = %strpos($tags, \"+\")\n  !while ($brPos >= 0)\n    !$tag = %substr($tags, 0, $brPos)\n    !$newArg = %get_variable_value(\"$\" + $tag + $varPostfix)\n    !if ($newArg > \"\")\n       !return $newArg\n    !endif\n    !$tags = %substr($tags, $brPos+1)\n    !$brPos = %strpos($tags, \"+\")\n  !endwhile\n  !if (%strlen($tags) > 0)\n    !$newArg = %get_variable_value(\"$\" + $tags + $varPostfix)\n    !if ($newArg > \"\")\n       !return $newArg\n    !endif\n  !endif\n  !return $arg\n!endfunction\n\n' element specific (unused are hidden based on mask)\n!unquoted function $toStereos($elementType, $tags)\n  !if (%strlen($tags) == 0)\n    !$stereos = '<<' + $elementType + '>>'\n%set_variable_value(\"$\" + $elementType + \"Legend\", %true())\n    !return $stereos\n  !endif\n  !$stereos = ''\n  !$mask = $resetMask()\n  !$brPos = %strpos($tags, \"+\")\n  !while ($brPos >= 0)\n    !$tag = %substr($tags, 0, $brPos)\n    !$stereos = $stereos + '<<' + $tag + '>>'\n    !$mergedMask = $combineMaskWithTag($mask, $tag)\n    !if ($mergedMask != $mask)\n%set_variable_value(\"$\" + $tag + \"Legend\", %true())\n      !$mask = $mergedMask\n    !endif\n    !$tags = %substr($tags, $brPos+1)\n    !$brPos = %strpos($tags, \"+\")\n  !endwhile\n  !if (%strlen($tags) > 0)\n    !$stereos = $stereos + '<<' + $tags + '>>'\n    !$mergedMask = $combineMaskWithTag($mask, $tags)\n    !if ($mergedMask != $mask)\n%set_variable_value(\"$\" + $tags + \"Legend\", %true())\n      !$mask = $mergedMask\n    !endif\n  !endif\n  ' has to be last, otherwise PlantUML overwrites all tag specific skinparams\n  !$stereos = $stereos + '<<' + $elementType + '>>'\n  !$mergedMask = $combineMaskWithTag($mask, $elementType)\n  !if ($mergedMask != $mask)\n%set_variable_value(\"$\" + $elementType + \"Legend\", %true())\n    !$mask = $mergedMask\n  !endif\n  !return $stereos\n!endfunction\n\n' if $sprite/$techn is an empty argument, try to calculate it via the defined $tag\n!unquoted function $toElementArg($arg, $tags, $varPostfix, $elementType)\n  !if ($arg > \"\")\n    !return $arg\n  !endif\n\n  !if (%strlen($tags) == 0)\n    !$newArg = %get_variable_value(\"$\" + $elementType + $varPostfix)\n    !if ($newArg > \"\")\n       !return $newArg\n    !else\n       !return $arg\n    !endif\n  !endif\n  !$brPos = %strpos($tags, \"+\")\n  !while ($brPos >= 0)\n    !$tag = %substr($tags, 0, $brPos)\n    !$newArg = %get_variable_value(\"$\" + $tag + $varPostfix)\n    !if ($newArg > \"\")\n       !return $newArg\n    !endif\n    !$tags = %substr($tags, $brPos+1)\n    !$brPos = %strpos($tags, \"+\")\n  !endwhile\n  !if (%strlen($tags) > 0)\n    !$newArg = %get_variable_value(\"$\" + $tags + $varPostfix)\n    !if ($newArg > \"\")\n       !return $newArg\n    !endif\n    !$newArg = %get_variable_value(\"$\" + $elementType + $varPostfix)\n    !if ($newArg > \"\")\n       !return $newArg\n    !endif\n  !endif\n  !return $arg\n!endfunction\n\n' if $value is empty try to load it via variable, optional can it store the calculated value\n!function $restoreEmpty($elementType, $property, $value, $store)\n  !$var = \"$\" + $elementType + \"Restore\" + $property\n  !if ($value == \"\")\n    !$value = %get_variable_value($var)\n  !elseif ($store)\n    %set_variable_value($var, $value)\n  !endif\n  !return $value\n!endfunction\n\n' clear the restore property\n!function $clearRestore($elementType, $property)\n  !$var = \"$\" + $elementType + \"Restore\" + $property\n  %set_variable_value($var, \"\")\n  !return \"\"\n!endfunction\n\n!function $elementTagSkinparams($element, $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $borderStyle, $borderThickness)\n  !$elementSkin = \"skinparam \" + $element + \"<<\" + $tagStereo + \">> {\" + $bl()\n  !if ($fontColor != \"\")\n    !if (%strpos($tagStereo, \"boundary\") < 0)\n      !$elementSkin = $elementSkin + \"    StereotypeFontColor \" + $fontColor + $bl()\n    !endif\n    !$elementSkin = $elementSkin + \"    FontColor \" + $fontColor + $bl()\n  !endif\n  !if ($bgColor != \"\")\n    !$elementSkin = $elementSkin + \"    BackgroundColor \" + $bgColor + $bl()\n  !endif\n  !if ($borderColor != \"\")\n    !$elementSkin = $elementSkin + \"    BorderColor \" + $borderColor+ $bl()\n  !endif\n  !if ($shadowing == \"true\")\n    !$elementSkin = $elementSkin + \"    Shadowing<<\" + $tagStereo + \">> \" + \"true\" + $bl()\n  !endif\n  !if ($shadowing == \"false\")\n    !$elementSkin = $elementSkin + \"    Shadowing<<\" + $tagStereo + \">> \" + \"false\" + $bl()\n  !endif\n  ' only rectangle supports shape(d corners), define both skinparam that overlays are working\n  !if ($shape != \"\" && $element == \"rectangle\")\n    !if ($shape == $SHARP_CORNER)\n      !$elementSkin = $elementSkin + \"    RoundCorner \" + \"0\" + $bl()\n      !$elementSkin = $elementSkin + \"    DiagonalCorner \" + \"0\" + $bl()\n    !elseif ($shape == $ROUNDED_BOX)\n      !$elementSkin = $elementSkin + \"    RoundCorner \" + $ROUNDED_BOX_SIZE+ $bl()\n      !$elementSkin = $elementSkin + \"    DiagonalCorner \" + \"0\" + $bl()\n    !elseif ($shape == $EIGHT_SIDED)\n      !$elementSkin = $elementSkin + \"    RoundCorner \" + \"0\" + $bl()\n      !$elementSkin = $elementSkin + \"    DiagonalCorner \" + $EIGHT_SIDED_SIZE+ $bl()\n    !endif\n  !endif\n  !if ($borderStyle != \"\")\n    !$elementSkin = $elementSkin + \"    BorderStyle \" + $borderStyle + $bl()\n  !endif\n  !if ($borderThickness != \"\")\n    !$elementSkin = $elementSkin + \"    BorderThickness \" + $borderThickness + $bl()\n  !endif\n  !$elementSkin = $elementSkin + \"}\" + $bl()\n  !return $elementSkin\n!endfunction\n\n!unquoted procedure $defineSkinparams($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $borderStyle, $borderThickness)\n  ' only rectangle supports shape(d corners)\n  !$tagSkin = $elementTagSkinparams(\"rectangle\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $borderStyle, $borderThickness)\n  !$tagSkin = $tagSkin + $elementTagSkinparams(\"database\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n  !$tagSkin = $tagSkin + $elementTagSkinparams(\"queue\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n  ' plantuml.jar bug - actor have to be after person\n  !$tagSkin = $tagSkin + $elementTagSkinparams(\"person\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n  ' actor has style awesome, therefore $fontColor is ignored and text uses $bgColor too\n  !$tagSkin = $tagSkin + $elementTagSkinparams(\"actor\", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n  ' sequence requires participant\n  !$tagSkin = $tagSkin + $elementTagSkinparams(\"participant\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n  !$tagSkin = $tagSkin + $elementTagSkinparams(\"sequencebox\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n  !if (%strpos($tagStereo, \"boundary\") >= 0 && $bgColor != \"\")\n    !$tagSkin = $tagSkin + \"skinparam package<<\" + $tagStereo + \">>StereotypeFontColor \" + $bgColor + $bl()\n    !$tagSkin = $tagSkin + \"skinparam rectangle<<\" + $tagStereo + \">>StereotypeFontColor \" + $bgColor + $bl()\n  !endif\n  !if %variable_exists(\"ENABLE_ALL_PLANT_ELEMENTS\")\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"agent\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"artifact\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"card\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"cloud\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"collections\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"file\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"folder\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"frame\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"hexagon\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"package\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"stack\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"storage\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"usecase\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    ' elements without background: font uses $bgColor\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"boundary\", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"circle\", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"control\", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"entity\", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"interface\", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n    ' label uses wrong font color? (should be $bgColor too)\n    !$tagSkin = $tagSkin + $elementTagSkinparams(\"label\", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, \"\", $borderStyle, $borderThickness)\n' label colors cannot be set via skinparam use additional style\n    !$tagSkin = $tagSkin + \"<style>\" + $bl()\n    ' componentDiagram {\n    !$tagSkin = $tagSkin + \"  label {\" + $bl()\n    !$tagSkin = $tagSkin + \"    .\" + $tagStereo + \" {\" + $bl()\n    !$tagSkin = $tagSkin + \"      StereotypeFontColor \" + $bgColor + $bl()\n    !$tagSkin = $tagSkin + \"      Fontcolor \" + $bgColor + $bl()\n    !$tagSkin = $tagSkin + \"      BackgroundColor \" + $bgColor + $bl()\n    !$tagSkin = $tagSkin + \"      BorderColor \" + $borderColor + $bl()\n    !$tagSkin = $tagSkin + \"    }\" + $bl()\n    !$tagSkin = $tagSkin + \"  }\" + $bl()\n    ' }\n    !$tagSkin = $tagSkin + \"</style>\" + $bl()\n  !endif\n$tagSkin\n!endprocedure\n\n' arrow colors cannot start with # (legend background has to start with #)\n!function $colorWithoutHash($c)\n  !if (%substr($c, 0, 1) == \"#\")\n    !$c = %substr($c,1)\n  !endif\n  !return $c\n!endfunction\n\n!unquoted procedure $defineRelSkinparams($tagStereo, $textColor, $lineColor, $lineStyle, $lineThickness)\n  !$elementSkin = \"skinparam arrow<<\" + $tagStereo + \">> {\" + $bl()\n  !if ($lineColor != \"\") || ($textColor != \"\") || ($lineStyle != \"\")\n    !$elementSkin = $elementSkin + \"    Color \"\n    !if ($lineColor != \"\")\n      !$elementSkin = $elementSkin + $colorWithoutHash($lineColor)\n    !endif\n    !if ($textColor != \"\")\n      !$elementSkin = $elementSkin + \";text:\" + $colorWithoutHash($textColor)\n    !endif\n    !if ($lineStyle != \"\")\n      !$elementSkin = $elementSkin + \";line.\" + $lineStyle\n    !endif\n    !$elementSkin = $elementSkin + $bl()\n  !endif\n  !if ($lineThickness != \"\")\n    !$elementSkin = $elementSkin + \"    thickness \" + $lineThickness + $bl()\n  !endif\n  !$elementSkin = $elementSkin + \"}\" + $bl()\n$elementSkin\n!endprocedure\n\n' %is_dark() requires PlantUML version >= 1.2021.6\n!if (%function_exists(\"%is_dark\"))\n  !$PlantUMLSupportsDynamicLegendColor = %true()\n!else\n  !$PlantUMLSupportsDynamicLegendColor = %false()\n  !log \"dynamic undefined legend colors\" requires PlantUML version >= 1.2021.6, therefore only static assigned colors are used\n!endif\n\n!unquoted function $contrastLegend($color)\n  !if (%is_dark($color))\n    !$value = $LEGEND_LIGHT_COLOR\n  !else\n    !$value = $LEGEND_DARK_COLOR\n  !endif\n  !return $value\n!endfunction\n\n!unquoted function $flatLegend($color)\n  !if (%is_dark($color))\n    !$value = $LEGEND_DARK_COLOR\n  !else\n    !$value = $LEGEND_LIGHT_COLOR\n  !endif\n  !return $value\n!endfunction\n\n' legend background has to start with #\n!function $colorWithHash($c)\n  !if (%substr($c, 0, 1) != \"#\")\n    !$c = \"#\" + $c\n  !endif\n  !return $c\n!endfunction\n\n!function $addMaskFlag($mask, $attr)\n  !if ($attr == \"\")\n    !$mask = $mask + \"0\"\n  !else\n    !$mask = $mask + \"1\"\n  !endif\n  !return $mask\n!endfunction\n\n!function $orFlags($flag1, $flag2)\n  !if ($flag1 == \"0\" && $flag2 == \"0\")\n    !return \"0\"\n  !endif\n  !return \"1\"\n!endfunction\n\n!function $tagLegendMask($bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $borderStyle, $borderThickness)\n  !$mask = \"\"\n  !$mask = $addMaskFlag($mask, $bgColor)\n  !$mask = $addMaskFlag($mask, $fontColor)\n  !$mask = $addMaskFlag($mask, $borderColor)\n  !$mask = $addMaskFlag($mask, $shadowing)\n  !$mask = $addMaskFlag($mask, $shape)\n  !$mask = $addMaskFlag($mask, $sprite)\n  !$mask = $addMaskFlag($mask, $borderStyle)\n  !$mask = $addMaskFlag($mask, $borderThickness)\n  !return $mask\n!endfunction\n\n!function $resetMask()\n  !return \"00000000\"\n!endfunction\n\n!function $combineMasks($mask1, $mask2)\n  !$mask = \"\"\n  !$mask = $mask + $orFlags(%substr($mask1, 0, 1), %substr($mask2, 0, 1))\n  !$mask = $mask + $orFlags(%substr($mask1, 1, 1), %substr($mask2, 1, 1))\n  !$mask = $mask + $orFlags(%substr($mask1, 2, 1), %substr($mask2, 2, 1))\n  !$mask = $mask + $orFlags(%substr($mask1, 3, 1), %substr($mask2, 3, 1))\n  !$mask = $mask + $orFlags(%substr($mask1, 4, 1), %substr($mask2, 4, 1))\n  !$mask = $mask + $orFlags(%substr($mask1, 5, 1), %substr($mask2, 5, 1))\n  !$mask = $mask + $orFlags(%substr($mask1, 6, 1), %substr($mask2, 6, 1))\n  !$mask = $mask + $orFlags(%substr($mask1, 7, 1), %substr($mask2, 7, 1))\n  !return $mask\n!endfunction\n\n!function $combineMaskWithTag($mask1, $tag)\n  !$mask2 = %get_variable_value(\"$\" + $tag+ \"LegendMask\")\n  !if ($mask2 == \"\")\n    ' !log combineMaskWithTag $mask1, $tag, ... only $mask1\n    !return $mask1\n  !endif\n\n  ' !log combineMaskWithTag $mask1, $tag, $mask2 ... $combineMasks($mask1, $mask2)\n  !return  $combineMasks($mask1, $mask2)\n!endfunction\n\n' element symbols typically 4 times too big in legend\n!function $smallVersionSprite($sprite, $imageScale = $LEGEND_IMAGE_SIZE_FACTOR)\n  ' ,scale= ... has to be first (...,color=black,scale=0.25... is invalid too)\n  !if (%strpos($sprite, \"=\") < 0)\n    !if (%substr($sprite, 0, 4) == \"img:\")\n      !$smallSprite = $sprite + \"{scale=\" + $imageScale + \"}\"\n    !else\n      !$smallSprite = $sprite + \",scale=\" + $imageScale\n    !endif\n  !else\n    !$smallSprite = $sprite\n  !endif\n  !return $smallSprite\n!endfunction\n\n' format sprite that it can be used in diagram\n!function $getSprite($sprite)\n  ' if it starts with & it's a OpenIconic, details see https://useiconic.com/open/\n  ' if it starts with img: it's an image, details see https://plantuml.com/creole\n  !if (%substr($sprite, 0, 1) != \"&\" && %substr($sprite, 0, 4) != \"img:\")\n    !$formatted = \"<$\" + $sprite + \">\"\n  !else\n    !$formatted = \"<\" + $sprite + \">\"\n  !endif\n  !return $formatted\n!endfunction\n\n!function $setTagLegendVariables($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite, $borderStyle, $borderThickness)\n  !$bg = $bgColor\n  !$fo = $fontColor\n  !$bo = $borderColor\n\n  !if ($fo == \"\")\n    !if ($bg != \"\")\n!if ($PlantUMLSupportsDynamicLegendColor)\n      !$fo = $contrastLegend($bg)\n!else\n      !$fo = $LEGEND_DARK_COLOR\n!endif\n    !else\n      !if ($bo == \"\")\n        !$fo = $LEGEND_DARK_COLOR\n        !$bg = $LEGEND_LIGHT_COLOR\n      !else\n!if ($PlantUMLSupportsDynamicLegendColor)\n        !$fo = $flatLegend($bo)\n        !$bg = $contrastLegend($bo)\n!else\n        !$fo = $LEGEND_DARK_COLOR\n        !$bg = $LEGEND_LIGHT_COLOR\n!endif\n      !endif\n    !endif\n  !else\n    !if ($bg == \"\")\n!if ($PlantUMLSupportsDynamicLegendColor)\n      !$bg = $contrastLegend($fo)\n!else\n      !$bg = $LEGEND_LIGHT_COLOR\n!endif\n    !endif\n  !endif\n\n  !if ($bo == \"\")\n    !$bo = $bg\n  !endif\n\n  !$tagEntry = \"|\"\n  !$tagDetails = \"(\"\n  !$tagEntry = $tagEntry + \"<\" + $colorWithHash($bg) +\">\"\n  ' <U+25AF> ..white rectangle\n  !$tagEntry = $tagEntry + \"<color:\"+$bo+\"> <U+25AF></color> \"\n  !$tagEntry = $tagEntry + \"<color:\"+$fo+\">\"\n  !if ($legendSprite != \"\")\n    !$tagEntry = $tagEntry + $getSprite($legendSprite) + \" \"\n  !endif\n\n  !$isBoundary = 0\n  !if ($legendText == \"\")\n    !if (%strpos($tagStereo, \"boundary\") >= 0)\n      !if ($tagStereo == \"boundary\")\n        !$isBoundary = 1\n        !$tagEntry = $LEGEND_BOUNDARY_PRE_PART + $tagEntry + $LEGEND_BOUNDARY_POST_PART + \" \"\n      !else\n        ' if contains/ends with _boundary remove _boundary and add \"boundary (dashed)\"\n        !$pos = %strpos($tagStereo, \"_boundary\")\n        !if ($pos > 0)\n          !$isBoundary = 1\n          !$tagEntry = $tagEntry + \" \" + $LEGEND_BOUNDARY_PRE_PART + %substr($tagStereo, 0 ,$pos) + $LEGEND_BOUNDARY_POST_PART + \" \"\n        !endif\n      !endif\n    !endif\n    !if ($isBoundary == 0)\n      !$tagEntry = $tagEntry + \" \" + $tagStereo + \" \"\n    !endif\n\n    !if ($isBoundary == 1 && ($bgColor == \"#00000000\" || %lower($bgColor) == \"transparent\"))\n       !$tagDetails = $tagDetails + $LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA\n    !endif\n    !if ($shadowing == \"true\")\n      !$tagDetails = $tagDetails + $LEGEND_SHADOW_TEXT + \", \"\n    !endif\n    !if ($shadowing == \"false\")\n      !$tagDetails = $tagDetails + $LEGEND_NO_SHADOW_TEXT + \", \"\n    !endif\n    !if ($shape == $SHARP_CORNER && $shape != $DEFAULT_SHAPE)\n      !$tagDetails = $tagDetails + $LEGEND_SHARP_CORNER + \", \"\n    !endif\n    !if ($shape == $ROUNDED_BOX && $shape != $DEFAULT_SHAPE)\n      !$tagDetails = $tagDetails + $LEGEND_ROUNDED_BOX + \", \"\n    !endif\n    !if ($shape == $EIGHT_SIDED && $shape != $DEFAULT_SHAPE)\n      !$tagDetails = $tagDetails + $LEGEND_EIGHT_SIDED + \", \"\n    !endif\n    !if ($fontColor == \"\" && $bgColor == \"\")\n      !$tagDetails = $tagDetails + $LEGEND_NO_FONT_BG_TEXT + \", \"\n    !else\n      !if ($fontColor == \"\")\n        !$tagDetails = $tagDetails + $LEGEND_NO_FONT_TEXT + \", \"\n      !endif\n      !if ($bgColor == \"\")\n        !$tagDetails = $tagDetails + $LEGEND_NO_BG_TEXT + \", \"\n      !endif\n    !endif\n    !if ($borderStyle != \"\")\n      !if ($borderStyle == $DOTTED_LINE)\n        !$tagDetails = $tagDetails + $LEGEND_DOTTED_LINE + \", \"\n      !elseif ($borderStyle == $DASHED_LINE)\n        !if ($isBoundary == 1)\n          !$tagDetails = $tagDetails + $LEGEND_BOUNDARY_DASHED_INCL_COMA\n        !else\n          !$tagDetails = $tagDetails + $LEGEND_DASHED_LINE + \", \"\n        !endif\n      !elseif ($borderStyle == $BOLD_LINE)\n        !$tagDetails = $tagDetails + $LEGEND_BOLD_LINE + \", \"\n      !elseif ($borderStyle == $SOLID_LINE)\n        !$tagDetails = $tagDetails + $LEGEND_SOLID_LINE + \", \"\n      !else\n        !$tagDetails = $tagDetails + $borderStyle + \", \"\n      !endif\n    !endif\n    !if ($borderThickness != \"\")\n      !$tagDetails = $tagDetails + $LEGEND_THICKNESS + \" \" + $borderThickness + \", \"\n    !endif\n    !if ($tagDetails==\"(\" || $tagDetails==\"(, \")\n      !$tagDetails = \"</size>\"\n    !else\n      !$tagDetails = %substr($tagDetails, 0, %strlen($tagDetails)-2)\n      !$tagDetails = $tagDetails + \")</size>\"\n    !endif\n  !else\n    !$brPos = %strpos($legendText, \"\\n\")\n    !if ($brPos > 0)\n      !$tagEntry = $tagEntry + %substr($legendText, 0, $brPos) + \" \"\n      !$details = %substr($legendText, $brPos + 2)\n      !if ($details==\"\")\n        !$tagDetails = \"</size>\"\n      !else\n        !$tagDetails = $tagDetails + $details + \")</size>\"\n      !endif\n    !else\n      !$tagEntry = $tagEntry + \" \" + $legendText + \" \"\n      !$tagDetails = \"</size>\"\n    !endif\n  !endif\n\n  !$tagDetails = $tagDetails + \"</color> \"\n  !$tagDetails = $tagDetails + \"|\"\n%set_variable_value(\"$\" + $tagStereo + \"LegendEntry\", $tagEntry)\n%set_variable_value(\"$\" + $tagStereo + \"LegendDetails\", $tagDetails)\n  !return $tagEntry\n!endfunction\n\n!function $setTagRelLegendVariables($tagStereo, $textColor, $lineColor, $lineStyle, $legendText, $legendSprite, $lineThickness)\n  !$tc = $textColor\n  !$lc = $lineColor\n\n  !if ($tc == \"\")\n    !if ($PlantUMLSupportsDynamicLegendColor)\n      !$tc = $flatLegend($ARROW_FONT_COLOR)\n    !else\n      !$tc = $LEGEND_DARK_COLOR\n    !endif\n  !endif\n  !if ($lc == \"\")\n    !if ($PlantUMLSupportsDynamicLegendColor)\n      !$lc = $flatLegend($ARROW_COLOR)\n    !else\n      !$lc = $LEGEND_DARK_COLOR\n    !endif\n  !endif\n\n  !$tagEntry = \"|\"\n  !$tagDetails = \"(\"\n  ' <U+2500> ..white line\n  !$tagEntry = $tagEntry + \"<color:\"+$lc+\"> <U+2500></color> \"\n  !$tagEntry = $tagEntry + \"<color:\"+$tc+\">\"\n  !if ($legendSprite != \"\")\n    !$tagEntry = $tagEntry + $getSprite($legendSprite) + \" \"\n  !endif\n  !if ($legendText == \"\")\n    !$tagEntry = $tagEntry + \" \" + $tagStereo + \" \"\n    !if ($textColor == \"\")\n      !$tagDetails = $tagDetails + $LEGEND_NO_FONT_TEXT + \", \"\n    !endif\n    !if ($lineColor == \"\")\n      !$tagDetails = $tagDetails + $LEGEND_NO_LINE_TEXT + \", \"\n    !endif\n    !if ($lineStyle != \"\")\n      !if ($lineStyle == $DOTTED_LINE)\n        !$tagDetails = $tagDetails + $LEGEND_DOTTED_LINE + \", \"\n      !elseif ($lineStyle == $DASHED_LINE)\n        !$tagDetails = $tagDetails + $LEGEND_DASHED_LINE + \", \"\n      !elseif ($lineStyle == $BOLD_LINE)\n        !$tagDetails = $tagDetails + $LEGEND_BOLD_LINE + \", \"\n      !else\n        !$tagDetails = $tagDetails + $lineStyle + \", \"\n      !endif\n    !endif\n    !if ($lineThickness != \"\")\n      !$tagDetails = $tagDetails + $LEGEND_THICKNESS + \" \" + $lineThickness + \", \"\n    !endif\n    !if ($tagDetails==\"(\")\n      !$tagDetails = \"</size>\"\n    !else\n      !$tagDetails = %substr($tagDetails, 0, %strlen($tagDetails)-2)\n      !$tagDetails = $tagDetails + \")</size>\"\n    !endif\n  !else\n    !$brPos = %strpos($legendText, \"\\n\")\n    !if ($brPos > 0)\n      !$tagEntry = $tagEntry + \" \" + %substr($legendText, 0, $brPos) + \" \"\n      !$details = %substr($legendText, $brPos + 2)\n      !if ($details==\"\")\n        !$tagDetails = \"</size>\"\n      !else\n        !$tagDetails = $tagDetails + $details + \")</size>\"\n      !endif\n    !else\n      !$tagEntry = $tagEntry + \" \" + $legendText + \" \"\n      !$tagDetails = \"</size>\"\n    !endif\n  !endif\n\n  !$tagDetails = $tagDetails + \"</color> \"\n  !$tagDetails = $tagDetails + \"|\"\n%set_variable_value(\"$\" + $tagStereo + \"_LineLegendEntry\", $tagEntry)\n%set_variable_value(\"$\" + $tagStereo + \"_LineLegendDetails\", $tagDetails)\n  !return $tagEntry\n!endfunction\n\n!unquoted procedure $addTagToLegend($tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $legendText=\"\", $legendSprite=\"\", $borderStyle=\"\", $borderThickness=\"\")\n'' if a combined element tag is defined (e.g. \"v1.0&v1.1\") then it is typically a merged color,\n'' like a new $fontColor=\"#fdae61\" therefore it should be added to the legend\n'' and the & combined tags will be not removed\n'  !if (%strpos($tagStereo, \"&\") < 0)\n  !$dummyAlreadyVariables = $setTagLegendVariables($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite, $borderStyle, $borderThickness)\n  !$tagCustomLegend = $tagCustomLegend + $tagStereo + \"\\n\"\n  !$tagMask = $tagLegendMask( $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $borderStyle, $borderThickness)\n%set_variable_value(\"$\" + $tagStereo + \"LegendMask\", $tagMask)\n'  !endif\n!endprocedure\n\n!unquoted procedure $addRelTagToLegend($tagStereo, $textColor=\"\", $lineColor=\"\", $lineStyle=\"\", $legendText=\"\", $legendSprite=\"\", $lineThickness=\"\")\n'' Arrows have a bug with stereotype/skinparams and cannot combine text colors of one stereotype\n'' and the line color of another stereotype. Therefore the text color of one tag and the line color\n'' of another tag have to be combined via a \"workaround\" tag (\"v1.0&v1.1\").\n'' This workaround tag could be theoretically removed in the legend but after that there would\n'' be an inconsistency between the element tags and the rel tags and therefore\n'' & combined workaround tags are not removed too (and in unlikely cases the color itself could be changed)\n'  !if (%strpos($tagStereo, \"&\") < 0)\n     !$dummyAlreadyVariables = $setTagRelLegendVariables($tagStereo, $textColor, $lineColor, $lineStyle, $legendText, $legendSprite, $lineThickness)\n     !$tagCustomLegend = $tagCustomLegend + $tagStereo + \"_Line\\n\"\n'  !endif\n!endprocedure\n\n!procedure $showActiveLegendEntries($allDefined)\n  !$brPos = %strpos($allDefined, \"\\n\")\n  !while ($brPos >= 0)\n    !$tagStereo = %substr($allDefined, 0, $brPos)\n    !$allDefined = %substr($allDefined, $brPos+2)\n    !$brPos = %strpos($allDefined, \"\\n\")\n    !if (%variable_exists(\"$\" + $tagStereo + \"Legend\"))\n      ' </size> is part of legendDetails\n      !$part1 = %get_variable_value(\"$\" + $tagStereo + \"LegendEntry\")\n      !$partSize = \"<size:\" + $LEGEND_DETAILS_SIZE + \">\"\n      !$part2 = %get_variable_value(\"$\" + $tagStereo + \"LegendDetails\")\n      !$line = $part1 + $partSize + $part2\n$line\n    !endif\n  !endwhile\n  !if (%strlen($allDefined) > 0)\n    !$tagStereo = $allDefined\n    !if (%variable_exists(\"$\" + $tagStereo + \"Legend\"))\n      ' </size> is part of legendDetails\n      !$part1 = %get_variable_value(\"$\" + $tagStereo + \"LegendEntry\")\n      !$partSize = \"<size:\" + $LEGEND_DETAILS_SIZE + \">\"\n      !$part2 = %get_variable_value(\"$\" + $tagStereo + \"LegendDetails\")\n      !$line = $part1 + $partSize + $part2\n$line\n    !endif\n  !endif\n!endprocedure\n\n' normal rectangle\n!function SharpCornerShape()\n!return $SHARP_CORNER\n!endfunction\n\n!function RoundedBoxShape()\n!return $ROUNDED_BOX\n!endfunction\n\n!function EightSidedShape()\n!return $EIGHT_SIDED\n!endfunction\n\n!function DottedLine()\n!return $DOTTED_LINE\n!endfunction\n\n!function DashedLine()\n!return $DASHED_LINE\n!endfunction\n\n!function BoldLine()\n!return $BOLD_LINE\n!endfunction\n\n!function SolidLine()\n!return $SOLID_LINE\n!endfunction\n\n' used by new defined tags\n!unquoted procedure AddElementTag($tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $sprite=\"\", $techn=\"\", $legendText=\"\", $legendSprite=\"\", $borderStyle=\"\", $borderThickness=\"\")\n\n!if (NEW_C4_STYLE == 1)\n  !$swap=$bgColor\n  !$bgColor=$fontColor\n  !$fontColor=$swap\n!endif\n\n$defineSkinparams($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $borderStyle, $borderThickness)\n  !if ($sprite!=\"\")\n%set_variable_value(\"$\" + $tagStereo + \"ElementTagSprite\", $sprite)\n    !if ($legendSprite == \"\")\n      !$legendSprite = $smallVersionSprite($sprite)\n    !endif\n  !endif\n  !if ($techn != \"\")\n%set_variable_value(\"$\" + $tagStereo + \"ElementTagTechn\", $techn)\n  !endif\n$addTagToLegend($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite, $borderStyle, $borderThickness)\n!endprocedure\n\n!unquoted procedure $addElementTagInclReuse($elementName, $tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $sprite=\"\", $techn=\"\", $legendText=\"\", $legendSprite=\"\", $borderStyle=\"\", $borderThickness=\"\")\n\n'stored tags are already swapped (swap before comparing)\n!if (NEW_C4_STYLE == 1)\n  !$swap=$bgColor\n  !$bgColor=$fontColor\n  !$fontColor=$swap\n!endif\n\n  !$bgColor=$restoreEmpty($elementName, \"bgColor\", $bgColor, %false())\n  !$fontColor=$restoreEmpty($elementName, \"fontColor\", $fontColor, %false())\n  !$borderColor=$restoreEmpty($elementName, \"borderColor\", $borderColor, %false())\n  !$shadowing=$restoreEmpty($elementName, \"shadowing\", $shadowing, %false())\n  !$shape=$restoreEmpty($elementName, \"shape\", $shape, %false())\n  !$sprite=$restoreEmpty($elementName, \"sprite\", $sprite, %false())\n  !$techn=$restoreEmpty($elementName, \"techn\", $techn, %false())\n  ' new style should has its own legend text\n  ' !$legendText=$restoreEmpty($elementName, \"legendText\", $legendText, %false())\n  !$legendSprite=$restoreEmpty($elementName, \"legendSprite\", $legendSprite, %false())\n  !$borderStyle=$restoreEmpty($elementName, \"borderStyle\", $borderStyle, %false())\n  !$borderThickness=$restoreEmpty($elementName, \"borderThickness\", $borderThickness, %false())\n\n' swap back\n!if (NEW_C4_STYLE == 1)\n  !$swap=$bgColor\n  !$bgColor=$fontColor\n  !$fontColor=$swap\n!endif\n\n  AddElementTag($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite, $borderStyle, $borderThickness)\n!endprocedure\n\n' used by new defined rel tags\n!unquoted procedure AddRelTag($tagStereo, $textColor=\"\", $lineColor=\"\", $lineStyle=\"\", $sprite=\"\", $techn=\"\", $legendText=\"\", $legendSprite=\"\", $lineThickness=\"\")\n$defineRelSkinparams($tagStereo, $textColor, $lineColor, $lineStyle, $lineThickness)\n  !if ($sprite != \"\")\n%set_variable_value(\"$\" + $tagStereo + \"RelTagSprite\", $sprite)\n    !if ($legendSprite == \"\")\n      ' relation symbols typically 1:1 no additional scale required\n      !$legendSprite = $sprite\n    !endif\n  !endif\n  !if ($techn != \"\")\n%set_variable_value(\"$\" + $tagStereo + \"RelTagTechn\", $techn)\n  !endif\n$addRelTagToLegend($tagStereo, $textColor, $lineColor, $lineStyle, $legendText, $legendSprite, $lineThickness)\n!endprocedure\n\n' update the style of existing elements like person, ...\n!unquoted procedure UpdateElementStyle($elementName, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $sprite=\"\", $techn=\"\", $legendText=\"\", $legendSprite=\"\", $borderStyle=\"\", $borderThickness=\"\")\n\n!if (NEW_C4_STYLE == 1)\n  !$swap=$bgColor\n  !$bgColor=$fontColor\n  !$fontColor=$swap\n!endif\n\n!$bgColor=$restoreEmpty($elementName, \"bgColor\", $bgColor, %true())\n!$fontColor=$restoreEmpty($elementName, \"fontColor\", $fontColor, %true())\n!$borderColor=$restoreEmpty($elementName, \"borderColor\", $borderColor, %true())\n!$shadowing=$restoreEmpty($elementName, \"shadowing\", $shadowing, %true())\n!$shape=$restoreEmpty($elementName, \"shape\", $shape, %true())\n!$sprite=$restoreEmpty($elementName, \"sprite\", $sprite, %true())\n!$techn=$restoreEmpty($elementName, \"techn\", $techn, %true())\n!$legendText=$restoreEmpty($elementName, \"legendText\", $legendText, %true())\n!$legendSprite=$restoreEmpty($elementName, \"legendSprite\", $legendSprite, %true())\n!$borderStyle=$restoreEmpty($elementName, \"borderStyle\", $borderStyle, %true())\n!$borderThickness=$restoreEmpty($elementName, \"borderThickness\", $borderThickness, %true())\n\n$defineSkinparams($elementName, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $borderStyle, $borderThickness)\n  !if ($sprite != \"\")\n%set_variable_value(\"$\" + $elementName + \"ElementTagSprite\", $sprite)\n    !if ($legendSprite == \"\")\n      !$legendSprite = $smallVersionSprite($sprite)\n    !endif\n  !endif\n  !if ($techn != \"\")\n%set_variable_value(\"$\" + $elementName + \"ElementTagTechn\", $techn)\n  !endif\n  !$dummyAlreadyVariables = $setTagLegendVariables($elementName, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite, $borderStyle, $borderThickness)\n  ' default tags sets at least bgColor and fontColor\n  !$tagMask = $tagLegendMask(\"CHANGED\", \"CHANGED\", $borderColor, $shadowing, $shape, $sprite, $borderStyle, $borderThickness)\n%set_variable_value(\"$\" + $elementName + \"LegendMask\", $tagMask)\n!endprocedure\n\n/' @deprecated in favor of UpdateElementStyle '/\n!unquoted procedure UpdateSkinparamsAndLegendEntry($elementName, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\")\nUpdateElementStyle($elementName, $bgColor, $fontColor, $borderColor, $shadowing)\n!endprocedure\n\n' update the style of default relation, it has to set both properties (combined statement not working)\n!unquoted procedure UpdateRelStyle($textColor, $lineColor)\n  !$elementSkin = \"skinparam arrow {\" + $bl()\n  !$elementSkin = $elementSkin + \"    Color \" + $lineColor + $bl()\n  !$elementSkin = $elementSkin + \"    FontColor \" + $textColor + $bl()\n  !$elementSkin = $elementSkin + \"}\" + $bl()\n$elementSkin\n!endprocedure\n\n!unquoted procedure UpdateLegendTitle($newTitle)\n  !$LEGEND_TITLE_TEXT = $newTitle\n!endprocedure\n\n' tags/stereotypes have to be delimited with \\n\n!unquoted procedure SetDefaultLegendEntries($tagStereoEntries)\n  !$tagDefaultLegend = $tagStereoEntries\n!endprocedure\n\n' Links\n' ##################################\n\n!function $getLink($link)\n  !if ($link != \"\")\n    !return \"[[\" + $link + \"]]\"\n  !else\n    !return \"\"\n  !endif\n!endfunction\n\n' Line breaks\n' ##################################\n\n!unquoted function $breakText($text, $usedNewLine, $widthStr=\"-1\")\n!$width = %intval($widthStr)\n!$multiLine = \"\"\n!if (%strpos($text, \"\\n\") >= 0)\n  !while (%strpos($text, \"\\n\") >= 0)\n    !$brPos = %strpos($text, \"\\n\")\n    !if ($brPos > 0)\n      !$multiLine = $multiLine + %substr($text, 0, $brPos) + $usedNewLine\n    !else\n      ' <U+00A0> non breaking change that newLine breaks with formats can be used with \\n\\n\n      !$multiLine = $multiLine + \"<U+00A0>\" + $usedNewLine\n    !endif\n    !$text = %substr($text, $brPos+2)\n    !if (%strlen($text) == 0)\n      !$text = \"<U+00A0>\"\n    !endif\n  !endwhile\n!else\n  !while ($width>0 && %strlen($text) > $width)\n    !$brPos = $width\n    !while ($brPos > 0 && %substr($text, $brPos, 1) != ' ')\n      !$brPos = $brPos - 1\n    !endwhile\n\n    !if ($brPos < 1)\n      !$brPos = %strpos($text, \" \")\n    !else\n    !endif\n\n    !if ($brPos > 0)\n      !$multiLine = $multiLine + %substr($text, 0, $brPos) + $usedNewLine\n      !$text = %substr($text, $brPos + 1)\n    !else\n      !$multiLine = $multiLine+ $text\n      !$text = \"\"\n    !endif\n  !endwhile\n!endif\n!if (%strlen($text) > 0)\n  !$multiLine = $multiLine + $text\n!endif\n!return $multiLine\n!endfunction\n\n!unquoted function $breakLabel($text)\n!$usedNewLine = \"\\n== \"\n!$multiLine = $breakText($text, $usedNewLine)\n!return $multiLine\n!endfunction\n\n!unquoted function $breakDescr($text, $widthStr)\n  !$usedNewLine = \"\\n\"\n  !return $breakText($text, $usedNewLine, $widthStr)\n!endfunction\n\n' $breakTechn() supports //...//; $breakNode() in C4_Deployment supports no //....//\n!unquoted function $breakTechn($text, $widthStr)\n  !$usedNewLine = '</size>//\\n//<size:'+$TECHN_FONT_SIZE+'>'\n  !return $breakText($text, $usedNewLine, $widthStr)\n!endfunction\n\n' Element base layout\n' ##################################\n\n!function $getElementBase($label, $techn, $descr, $sprite)\n  !$element = \"\"\n  !if ($sprite != \"\")\n    !$element = $element + $getSprite($sprite)\n    !if ($label != \"\")\n      !$element = $element + '\\n'\n    !endif\n  !endif\n  !if ($label != \"\")\n    !$element = $element + '== ' + $breakLabel($label)\n  !else\n    !$element = $element + '<size:0>.</size>'\n  !endif\n  !if ($techn != \"\")\n    !$element = $element + '\\n//<size:' + $TECHN_FONT_SIZE + '>[' + $breakTechn($techn, '-1') + ']</size>//'\n  !endif\n  !if ($descr != \"\")\n    !$element = $element + '\\n\\n' + $descr\n  !endif\n  !return $element\n!endfunction\n\n!function $getElementLine($umlShape, $elementType, $alias, $label, $techn, $descr, $sprite, $tags, $link)\n  !$sprite=$toElementArg($sprite, $tags, \"ElementTagSprite\", $elementType)\n  !$techn=$toElementArg($techn, $tags, \"ElementTagTechn\", $elementType)\n  !$baseProp = $getElementBase($label, $techn, $descr, $sprite) + $getProps()\n  !$stereo = $toStereos($elementType,$tags)\n  !$calcLink = $getLink($link)\n\n  !$line = $umlShape + \" \" + %chr(34) + $baseProp + %chr(34) +\" \" + $stereo + \" as \" + $alias + \" \" + $calcLink\n  !return $line\n!endfunction\n\n' Element properties\n' ##################################\n\n' collect all defined properties as table rows\n!global $propTable = \"\"\n!global $propTableCaption = \"\"\n!global $propColCaption = \"=\"\n\n!global $isFirstProp = 1\n!global $firstPropCol = 1\n!global $lastPropCol = 1\n\n!function $fillMissing($col, $colNext)\n  !if ($col == \"\" && $colNext != \"\")\n    !return \" \"\n  !endif\n  !return $col\n!endfunction\n\n!function $updatePropColumns($colIdx)\n  !if ($isFirstProp == 1 && $colIdx > $firstPropCol)\n    !$firstPropCol = $colIdx\n  !endif\n  !if ($isFirstProp == 0 && $colIdx > $lastPropCol)\n    !$lastPropCol = $colIdx\n  !endif\n  !return \"\"\n!endfunction\n\n' add missing header columns, if a following row has more columns\n' (fixed in PlantUML v1.2025.1beta9; only required in older versions)\n!function $fixHeaderColumns()\n  ' the number of displayed columns considers only the first row\n  ' if another row has more columns the first has to be filled with missing columns\n  !if ($lastPropCol > $firstPropCol)\n    !$delta = $lastPropCol - $firstPropCol\n    !$delta = $delta * 2\n    !$fix = %substr(\" | | | |\", 0, $delta)\n\n    ' basically the line break \\n should be the split\n    ' but \\n is not encoded (anymore?) therefore split only via\n    ' \\ and remove the last obsolete  \\ (changed order with add\n    ' \\ at the beginning is not working).\n    ' \"\\n\" would split \\ and n ==> n would be an unwanted line break\n    !$lines = %splitstr($propTable, \"\\\")\n    ' !$lines = %splitstr_regex($propTable, \"(?=[\\x000A])\")\n    !$first = 1\n    !$newTab = \"\"\n    !foreach $item in $lines\n      !if ($first == 1)\n        !$item = $item + $fix\n        !$first = 0\n      !endif\n      !$newTab = $newTab + $item + \"\\\"\n    !endfor\n\n    !$fixLen = %strlen($newTab) - 1\n    !$newTab = %substr($newTab, 0, $fixLen)\n\n    !$propTable = $newTab\n  !endif\n\n  !$isFirstProp = 1\n  !$firstPropCol = 1\n  !$lastPropCol = 1\n\n  !return \"\"\n!endfunction\n\n!unquoted function SetPropertyHeader($col1Name, $col2Name = \"\", $col3Name = \"\", $col4Name = \"\")\n  !$col3Name = $fillMissing($col3Name, $col4Name)\n  !$col2Name = $fillMissing($col2Name, $col3Name)\n  !$col1Name = $fillMissing($col1Name, $col2Name)\n\n  !$propColCaption = \"\"\n  !$propTableCaption = \"|= \" + $col1Name + \" |\"\n  !if ($col2Name != \"\")\n    !$propTableCaption = $propTableCaption + \"= \" + $col2Name + \" |\"\n    $updatePropColumns(2)\n  !endif\n  !if ($col3Name != \"\")\n    !$propTableCaption = $propTableCaption + \"= \" + $col3Name + \" |\"\n    $updatePropColumns(3)\n  !endif\n  !if ($col4Name != \"\")\n    !$propTableCaption = $propTableCaption + \"= \" + $col4Name + \" |\"\n    $updatePropColumns(4)\n  !endif\n\n  !$isFirstProp = 0\n  !return \"\"\n!endfunction\n\n!unquoted function WithoutPropertyHeader()\n  !$propTableCaption = \"\"\n  !$propColCaption = \"=\"\n\n  !$isFirstProp = 1\n  !$firstPropCol = 1\n  !$lastPropCol = 1\n\n  !return \"\"\n!endfunction\n\n!unquoted function AddProperty($col1, $col2 = \"\", $col3 = \"\", $col4 = \"\")\n  !$col3 = $fillMissing($col3, $col4)\n  !$col2 = $fillMissing($col2, $col3)\n  !$col1 = $fillMissing($col1, $col2)\n\n  !if ($propTable == \"\")\n    !if ($propTableCaption != \"\")\n      !$propTable = $propTableCaption + \"\\n\"\n    !endif\n  !else\n    !$propTable = $propTable + \"\\n\"\n  !endif\n\n  !$propTable = $propTable + \"| \" + $col1 + \" |\"\n  !if ($col2 != \"\")\n    !$propTable = $propTable + $propColCaption + \" \" + $col2 + \" |\"\n    $updatePropColumns(2)\n  !endif\n  !if ($col3 != \"\")\n    !$propTable = $propTable + \" \" + $col3 + \" |\"\n    $updatePropColumns(3)\n  !endif\n  !if ($col4 != \"\")\n    !$propTable = $propTable + \" \" + $col4 + \" |\"\n    $updatePropColumns(4)\n  !endif\n\n  !$isFirstProp = 0\n  !return \"\"\n!endfunction\n\n!unquoted function $getProps($alignedNL = \"\\n\")\n  $fixHeaderColumns()\n\n  !if ($propTable != \"\")\n    !$retTable = $alignedNL + $propTable\n    !$propTable = \"\"\n    !return $retTable\n  !endif\n  !return \"\"\n!endfunction\n\n!unquoted function $getProps_L()\n  !return $getProps(\"\\l\")\n!endfunction\n\n!unquoted function $getProps_R()\n  !return $getProps(\"\\r\")\n!endfunction\n\nSetPropertyHeader(\"Property\",\"Value\")\n\n' Layout\n' ##################################\n\n!function $getLegendDetailsSize($detailsFormat)\n  !if $detailsFormat == $LEGEND_DETAILS_NONE\n    !$size = 0\n  !elseif $detailsFormat == $LEGEND_DETAILS_SMALL\n    !$size = $LEGEND_DETAILS_SMALL_SIZE\n  !else\n    !$size = $LEGEND_DETAILS_NORMAL_SIZE\n  !endif\n  !return $size\n!endfunction\n\n!procedure $getHideStereotype($hideStereotype)\n!if ($hideStereotype == \"true\")\nhide stereotype\n!endif\n!endprocedure\n\n!procedure $getLegendTable($detailsFormat)\n!global $LEGEND_DETAILS_SIZE = $getLegendDetailsSize($detailsFormat)\n<$colorWithHash(transparent),$colorWithHash(transparent)>|<color:$LEGEND_TITLE_COLOR>**$LEGEND_TITLE_TEXT **</color> |\n$showActiveLegendEntries($tagDefaultLegend)\n$showActiveLegendEntries($tagCustomLegend)\n!endprocedure\n\n!procedure $getLegendArea($areaAlias, $hideStereotype, $details)\n$getHideStereotype($hideStereotype)\nrectangle $areaAlias<<legendArea>> [\n$getLegendTable($details)\n]\n!endprocedure\n\n!procedure HIDE_STEREOTYPE()\nhide stereotype\n!endprocedure\n\n!unquoted procedure SET_SKETCH_STYLE($bgColor=\"_dont_change_\", $fontColor=\"_dont_change_\", $warningColor=\"_dont_change_\", $fontName=\"_dont_change_\", $footerWarning=\"_dont_change_\", $footerText=\"_dont_change_\")\n!if $bgColor != \"_dont_change_\"\n  !global $SKETCH_BG_COLOR = $bgColor\n!endif\n!if $fontColor != \"_dont_change_\"\n  !global $SKETCH_FONT_COLOR = $fontColor\n!endif\n!if $warningColor != \"_dont_change_\"\n  !global $SKETCH_WARNING_COLOR = $warningColor\n!endif\n!if $fontName != \"_dont_change_\"\n  !global $SKETCH_FONT_NAME = $fontName\n!endif\n!if $footerWarning != \"_dont_change_\"\n  !global $SKETCH_FOOTER_WARNING = $footerWarning\n!endif\n!if $footerText != \"_dont_change_\"\n  !global $SKETCH_FOOTER_TEXT = $footerText\n!endif\n!endprocedure\n\n!procedure LAYOUT_AS_SKETCH()\n!$counter=0\n!foreach $versionPart in %splitstr(%version(), \".\")\n  !$counter=$counter+1\n\n  !if ($counter == 2)\n    !$year=$versionPart\n  !endif\n\n  !if ($counter == 3)\n    !$minor=$versionPart\n  !endif\n!endfor\n\n!if ($year < 2025) || ($year == 2025 && $minor == 0)\n  skinparam handwritten true\n!else\n  !option handwritten true\n!endif\n\n!if $SKETCH_BG_COLOR > \"\"\n  skinparam backgroundColor $SKETCH_BG_COLOR\n!endif\n!if $SKETCH_FONT_COLOR > \"\"\n  skinparam footer {\n    FontColor $SKETCH_FONT_COLOR\n  }\n  !if $ARROW_COLOR == \"#666666\"\n    !global $ARROW_COLOR = $SKETCH_FONT_COLOR\n    !global $ARROW_FONT_COLOR = $SKETCH_FONT_COLOR\n    skinparam arrow {\n      Color $ARROW_COLOR\n      FontColor $ARROW_FONT_COLOR\n    }\n  !endif\n  !if $BOUNDARY_COLOR == \"#444444\"\n    !global $BOUNDARY_COLOR = $SKETCH_FONT_COLOR\n    skinparam rectangle<<boundary>> {\n      FontColor $BOUNDARY_COLOR\n      BorderColor $BOUNDARY_COLOR\n    }\n  !endif\n!endif\n!if $SKETCH_FONT_NAMES > \"\"\n  skinparam defaultFontName $SKETCH_FONT_NAME\n!endif\n!if $SKETCH_FOOTER_WARNING > \"\" || $SKETCH_FOOTER_TEXT > \"\"\n  !$line = \"footer <font color=\" + $SKETCH_WARNING_COLOR + \">\"+ $SKETCH_FOOTER_WARNING + \"</font> \" + $SKETCH_FOOTER_TEXT\n  $line\n!endif\n!endprocedure\n\n!global $fix_direction=%false()\n\n!function $down($start,$end)\n!if ($fix_direction)\n!return $start+\"RIGHT\"+$end\n!else\n!return $start+\"DOWN\"+$end\n!endif\n!endfunction\n\n!function $up($start,$end)\n!if ($fix_direction)\n!return $start+\"LEFT\"+$end\n!else\n!return $start+\"UP\"+$end\n!endif\n!endfunction\n\n!function $left($start,$end)\n!if ($fix_direction)\n!return $start+\"UP\"+$end\n!else\n!return $start+\"LEFT\"+$end\n!endif\n!endfunction\n\n!function $right($start,$end)\n!if ($fix_direction)\n!return $start+\"DOWN\"+$end\n!else\n!return $start+\"RIGHT\"+$end\n!endif\n!endfunction\n\n!procedure LAYOUT_TOP_DOWN()\n!global $fix_direction=%false()\ntop to bottom direction\n!endprocedure\n\n!procedure LAYOUT_LEFT_RIGHT()\n!global $fix_direction = %false()\nleft to right direction\n!endprocedure\n\n!procedure LAYOUT_LANDSCAPE()\n!global $fix_direction = %true()\nleft to right direction\n!endprocedure\n\n' legend details can displayed as Normal(), Small(), None()\n!function None()\n!return $LEGEND_DETAILS_NONE\n!endfunction\n\n!function Normal()\n!return $LEGEND_DETAILS_NORMAL\n!endfunction\n\n!function Small()\n!return $LEGEND_DETAILS_SMALL\n!endfunction\n\n' has to be last call in diagram\n!unquoted procedure SHOW_LEGEND($hideStereotype=\"true\", $details=Small())\n$getHideStereotype($hideStereotype)\nlegend right\n$getLegendTable($details)\nendlegend\n!endprocedure\n\n/' @deprecated in favor of SHOW_LEGEND '/\n!unquoted procedure SHOW_DYNAMIC_LEGEND($hideStereotype=\"true\")\nSHOW_LEGEND($hideStereotype)\n!endprocedure\n\n' legend is reserved and cannot be uses as alias of SHOW_FLOATING_LEGEND() therefore\n' LEGEND() is introduced. It returns the default name of the floating alias \"floating_legend_alias\"\n' and can be used in the Lay_Distance() calls\n!function LEGEND()\n!return \"floating_legend_alias\"\n!endfunction\n\n' enables that legend can be located in drawing area of the diagram. It has to be last call in diagram followed by Lay_Distance()\n!unquoted procedure SHOW_FLOATING_LEGEND($alias=LEGEND(), $hideStereotype=\"true\", $details=Small())\n$getLegendArea($alias, $hideStereotype, $details)\n!endprocedure\n\n' Boundaries\n' ##################################\n\n!unquoted procedure UpdateBoundaryStyle($elementName=\"\", $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $type=\"\", $legendText=\"\", $borderStyle=\"\", $borderThickness=\"\", $sprite=\"\", $legendSprite=\"\")\n\n!if (NEW_C4_STYLE == 1)\n  !$swap=$bgColor\n  !$bgColor=$fontColor\n  !$fontColor=$swap\n!endif\n\n  !if ($elementName != \"\")\n    !$elementBoundary = $elementName + '_boundary'\n    UpdateElementStyle($elementBoundary, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness)\n  !else\n    UpdateElementStyle(\"boundary\", $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness)\n    ' simulate color inheritance\n    UpdateBoundaryStyle(\"enterprise\", $bgColor, $fontColor, $borderColor, $shadowing, $shape, \"Enterprise\", \"\", $borderStyle, $borderThickness, $sprite, $legendSprite)\n    UpdateBoundaryStyle(\"system\", $bgColor, $fontColor, $borderColor, $shadowing, $shape, \"System\", \"\", $borderStyle, $borderThickness, $sprite, $legendSprite)\n    UpdateBoundaryStyle(\"container\", $bgColor, $fontColor, $borderColor, $shadowing, $shape, \"Container\", \"\", $borderStyle, $borderThickness, $sprite, $legendSprite)\n  !endif\n!endprocedure\n\n!unquoted procedure AddBoundaryTag($tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $type=\"\", $legendText=\"\", $borderStyle=\"\", $borderThickness=\"\", $sprite=\"\", $legendSprite=\"\")\n    !$tagBoundary = $tagStereo + '_boundary'\n    AddElementTag($tagBoundary, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness)\n!endprocedure\n\n' add _boundary to all tags that short tag version can be used\n!unquoted function $addBoundaryPostfix($tags)\n  !if (%strlen($tags) == 0)\n    !return ''\n  !endif\n  !$boundaryTags = ''\n  !$brPos = %strpos($tags, \"+\")\n  !while ($brPos >= 0)\n    !$tag = %substr($tags, 0, $brPos)\n    !$boundaryTags = $boundaryTags + $tag + '_boundary+'\n    !$tags = %substr($tags, $brPos+1)\n    !$brPos = %strpos($tags, \"+\")\n  !endwhile\n  !if (%strlen($tags) > 0)\n    !$boundaryTags = $boundaryTags + $tags + '_boundary'\n  !endif\n  !return $boundaryTags\n!endfunction\n\n!function $getBoundary($label, $type, $descr, $sprite)\n  !$line = '== '\n  !if ($sprite != \"\")\n    ' add sprite in label line that it is more compact\n    !$line = $line + $getSprite($smallVersionSprite($sprite, $BOUNDARY_IMAGE_SIZE_FACTOR)) + ' '\n  !endif\n  !$line = $line + $breakLabel($label)\n  !if ($type != \"\")\n    !$line = $line + '\\n<size:' + $TECHN_FONT_SIZE + '>[' + $type + ']</size>'\n  !endif\n  !if ($descr != \"\")\n    !$line = $line + '\\n\\n' + $breakDescr($descr, $BOUNDARY_DESCR_MAX_CHAR_WIDTH)\n  !endif\n  !return $line\n!endfunction\n\n!unquoted procedure Boundary($alias, $label, $type=\"\", $tags=\"\", $link=\"\", $descr = \"\")\n!$boundaryTags = $addBoundaryPostfix($tags)\n' boundary $type reuses $techn definition of $boundaryTags\n!$type=$toElementArg($type, $boundaryTags, \"ElementTagTechn\", \"boundary\")\n!$sprite=$toElementArg(\"\", $boundaryTags, \"ElementTagSprite\", \"boundary\")\nrectangle \"$getBoundary($label, $type, $descr, $sprite)\" $toStereos(\"boundary\", $boundaryTags) as $alias $getLink($link)\n!endprocedure\n\n' Boundary Styling\nUpdateBoundaryStyle(\"\", $bgColor=$BOUNDARY_BG_COLOR, $fontColor=$BOUNDARY_COLOR, $borderColor=$BOUNDARY_COLOR, $borderStyle=DashedLine(), $legendText=\"$BOUNDARY_LEGEND_TEXT\")\n\n' Index\n' ##################################\n\n' Dynamic/Sequence diagram supports (automatically) numbered interactions:\n'     preferred function calls\n'     (Uppercase) LastIndex(): return the last used index (function which can be used as argument)\n'     (Uppercase) Index($offset=1): returns current index and calculates next index (function which can be used as argument)\n'     (Uppercase) SetIndex($new_index): returns new set index and calculates next index (function which can be used as argument)\n\n'     old procedures calls\n'     (lowercase) increment($offset=1): increase current index (procedure which has no direct output)\n'     (lowercase) setIndex($new_index): set the new index (procedure which has no direct output)\n\n!$lastIndex = 0\n!$index = 1\n\n!procedure increment($offset=1)\n  !$lastIndex = $index\n  !$index = $index + $offset\n!endprocedure\n\n!procedure setIndex($new_index)\n  !$lastIndex = $index\n  !$index = $new_index\n!endprocedure\n\n!function Index($offset=1)\n  !$lastIndex = $index\n  !$index = $lastIndex + $offset\n  !return $lastIndex\n!endfunction\n\n!function LastIndex()\n  !return $lastIndex\n!endfunction\n\n!function SetIndex($new_index, $offset=1)\n  !$lastIndex = $new_index\n  !$index = $new_index + $offset\n  !return $lastIndex\n!endfunction\n\n!unquoted function $getPrefix($index)\n  !if ($index == \"\")\n    !$pre = Index() + \": \"\n  !else\n    !$pre = $index + \": \"\n  !endif\n  !return $pre\n!endfunction\n\n' Relationship\n' ##################################\n\n!function $getRel($direction, $alias1, $alias2, $label, $techn, $descr, $sprite, $tags, $link)\n  !$sprite = $toRelArg($sprite, $tags, \"RelTagSprite\")\n  !$techn = $toRelArg($techn, $tags, \"RelTagTechn\")\n  !$rel = $alias1 + ' ' + $direction + ' ' + $alias2\n  !if ($tags != \"\")\n    !$rel = $rel + ' ' + $toStereos($tags)\n  !endif\n  !$rel = $rel + ' : '\n  !if ($link != \"\")\n    !$rel = $rel + '**[[' + $link + ' '\n  !endif\n  !if ($sprite != \"\")\n    !$rel = $rel + $getSprite($sprite)\n    !if ($label != \"\")\n      !$rel = $rel + ' '\n    !endif\n  !endif\n  !if ($link != \"\")\n    !$usedNewLine = ']]**\\n**[[' + $link + ' '\n    ' if sprite and label is empty than the link url is shown (otherwise link cannot be activated at all)\n    !$rel = $rel + $breakText($label, $usedNewLine) + ']]**'\n  !else\n    !if ($label != \"\")\n      !$usedNewLine = '**\\n**'\n      !$rel = $rel + '**' + $breakText($label, $usedNewLine) + '**'\n    !else\n      !$rel = $rel + '<size:0>.</size>'\n    !endif\n  !endif\n  !if ($techn != \"\")\n    ' line break is not deterministic, calculate it\n    !$rel = $rel + '\\n//<size:' + $TECHN_FONT_SIZE + '>[' + $breakTechn($techn, $REL_TECHN_MAX_CHAR_WIDTH) + ']</size>//'\n  !endif\n  !if ($descr != \"\")\n    ' line break is not deterministic, calculate it\n    !$rel = $rel + '\\n\\n' + $breakDescr($descr, $REL_DESCR_MAX_CHAR_WIDTH)\n  !endif\n  !$prop = $getProps()\n  !if ($prop != \"\")\n    ' reuse table\n    !$rel = $rel + $prop\n  !endif\n  !return $rel\n!endfunction\n\n!unquoted procedure Rel_($alias1, $alias2, $label, $direction)\n$getRel($direction, $alias1, $alias2, $label, \"\", \"\", \"\", \"\", \"\")\n!endprocedure\n!unquoted procedure Rel_($alias1, $alias2, $label, $techn, $direction)\n$getRel($direction, $alias1, $alias2, $label, $techn, \"\", \"\", \"\", \"\")\n!endprocedure\n\n!unquoted procedure Rel($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel(\"-->>\", $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure BiRel($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel(\"<<-->>\", $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_Back($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel(\"<<--\", $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_Neighbor($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel(\"->>\", $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure BiRel_Neighbor($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel(\"<<->>\", $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_Back_Neighbor($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel(\"<<-\", $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_D($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($down(\"-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_Down($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($down(\"-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure BiRel_D($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($down(\"<<-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure BiRel_Down($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($down(\"<<-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_U($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($up(\"-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_Up($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($up(\"-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure BiRel_U($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($up(\"<<-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure BiRel_Up($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($up(\"<<-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_L($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($left(\"-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_Left($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($left(\"-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure BiRel_L($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($left(\"<<-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure BiRel_Left($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($left(\"<<-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_R($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($right(\"-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_Right($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($right(\"-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure BiRel_R($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($right(\"<<-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure BiRel_Right($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($right(\"<<-\",\"->>\"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n' Layout Helpers\n' ##################################\n\n!function $getHiddenLine($distance)\n  !return '-[hidden]' + %substr('------------', 0, %intval($distance) + 1)\n!endfunction\n\n!function $l_down($start,$end)\n  !if (NO_LAY_ROTATE == 0)\n    !return $down($start,$end)\n  !else\n    !return $start+\"DOWN\"+$end\n  !endif\n!endfunction\n\n!function $l_up($start,$end)\n  !if (NO_LAY_ROTATE == 0)\n    !return $up($start,$end)\n  !else\n    !return $start+\"UP\"+$end\n  !endif\n!endfunction\n\n!function $l_left($start,$end)\n  !if (NO_LAY_ROTATE == 0)\n    !return $left($start,$end)\n  !else\n    !return $start+\"LEFT\"+$end\n  !endif\n!endfunction\n\n!function $l_right($start,$end)\n  !if (NO_LAY_ROTATE == 0)\n    !return $right($start,$end)\n  !else\n    !return $start+\"RIGHT\"+$end\n  !endif\n!endfunction\n\n!unquoted procedure Lay_D($from, $to)\n$from $l_down(\"-[hidden]\",\"-\") $to\n!endprocedure\n!unquoted procedure Lay_Down($from, $to)\n$from $l_down(\"-[hidden]\",\"-\") $to\n!endprocedure\n\n!unquoted procedure Lay_U($from, $to)\n$from $l_up(\"-[hidden]\",\"-\") $to\n!endprocedure\n!unquoted procedure Lay_Up($from, $to)\n$from $l_up(\"-[hidden]\",\"-\") $to\n!endprocedure\n\n!unquoted procedure Lay_R($from, $to)\n$from $l_right(\"-[hidden]\",\"-\") $to\n!endprocedure\n!unquoted procedure Lay_Right($from, $to)\n$from $l_right(\"-[hidden]\",\"-\") $to\n!endprocedure\n\n!unquoted procedure Lay_L($from, $to)\n$from $l_left(\"-[hidden]\",\"-\") $to\n!endprocedure\n!unquoted procedure Lay_Left($from, $to)\n$from $l_left(\"-[hidden]\",\"-\") $to\n!endprocedure\n\n' PlantUML bug: lines which does \"not match\" with the orientation/direction of the diagram\n' use the same length therefore the method offers no direction at all.\n' If a direction is required the Lay_...() methods can be used\n!unquoted procedure Lay_Distance($from, $to, $distance=\"0\")\n$from $getHiddenLine($distance) $to\n!endprocedure\n"
  },
  {
    "path": "C4_Component.puml",
    "content": "' convert it with additional command line argument -DRELATIVE_INCLUDE=\"relative/absolute\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\n' Scope: A single container.\n' Primary elements: Components within the container in scope.\n' Supporting elements: Containers (within the software system in scope) plus people and software systems directly connected to the components.\n' Intended audience: Software architects and developers.\n\n' Colors\n' ##################################\n\n!$COMPONENT_FONT_COLOR ?= \"#000000\"\n!$COMPONENT_BG_COLOR ?= \"#85BBF0\"\n!$COMPONENT_BORDER_COLOR ?= \"#78A8D8\"\n\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"external component\"\n!$EXTERNAL_COMPONENT_FONT_COLOR ?= $COMPONENT_FONT_COLOR\n!$EXTERNAL_COMPONENT_BG_COLOR ?= \"#CCCCCC\"\n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= \"#BFBFBF\"\n\n' New C4 style automatically swaps font and background colors, but with those settings the component/node background would be black.\n' Therefore the colors should be displayed unchanged (the init colors have to be swapped too).\n!$NEW_C4_USE_ORIGINAL_COMPONENT_COLORS ?= 1\n!$componentColorsSwappedAlready ?= 0\n!if (NEW_C4_STYLE == 1 && $NEW_C4_USE_ORIGINAL_COMPONENT_COLORS == 1 && $componentColorsSwappedAlready == 0)\n  !$swap=$COMPONENT_BG_COLOR\n  !$COMPONENT_BG_COLOR=$COMPONENT_FONT_COLOR\n  !$COMPONENT_FONT_COLOR=$swap\n  !$swap=$EXTERNAL_COMPONENT_BG_COLOR\n  !$EXTERNAL_COMPONENT_BG_COLOR=$EXTERNAL_COMPONENT_FONT_COLOR\n  !$EXTERNAL_COMPONENT_FONT_COLOR=$swap\n  ' don't swap them again below if C4_... included again\n  !$componentColorsSwappedAlready=1\n!endif\n\n' Labels\n' ##################################\n\n!$COMPONENT_LEGEND_TEXT ?= \"component\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"external component\"\n\n' Styling\n' ##################################\n\nUpdateElementStyle(\"component\", $COMPONENT_BG_COLOR, $COMPONENT_FONT_COLOR, $COMPONENT_BORDER_COLOR, $shape=$DEFAULT_SHAPE, $legendText=\"$COMPONENT_LEGEND_TEXT\")\nUpdateElementStyle(\"external_component\", $EXTERNAL_COMPONENT_BG_COLOR, $EXTERNAL_COMPONENT_FONT_COLOR, $EXTERNAL_COMPONENT_BORDER_COLOR, $shape=$DEFAULT_SHAPE, $legendText=\"$EXTERNAL_COMPONENT_LEGEND_TEXT\")\n\n' shortcuts with default colors\n!unquoted procedure AddComponentTag($tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $sprite=\"\", $techn=\"\", $legendText=\"\", $legendSprite=\"\", $borderStyle=\"\", $borderThickness=\"\")\n  $addElementTagInclReuse(\"component\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite, $borderStyle, $borderThickness)\n!endprocedure\n!unquoted procedure AddExternalComponentTag($tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $sprite=\"\", $techn=\"\", $legendText=\"\", $legendSprite=\"\", $borderStyle=\"\", $borderThickness=\"\")\n  $addElementTagInclReuse(\"external_component\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite, $borderStyle, $borderThickness)\n!endprocedure\n\n' Layout\n' ##################################\n\nSetDefaultLegendEntries(\"person\\nsystem\\ncontainer\\ncomponent\\nexternal_person\\nexternal_system\\nexternal_container\\nexternal_component\\nenterprise_boundary\\nsystem_boundary\\ncontainer_boundary\\nboundary\")\n\n!procedure LAYOUT_WITH_LEGEND()\nhide stereotype\nlegend right\n|<color:$LEGEND_TITLE_COLOR>**Legend**</color> |\n|<$PERSON_BG_COLOR> person |\n|<$SYSTEM_BG_COLOR> system |\n|<$CONTAINER_BG_COLOR> container |\n|<$COMPONENT_BG_COLOR> component |\n|<$EXTERNAL_PERSON_BG_COLOR> external person |\n|<$EXTERNAL_SYSTEM_BG_COLOR> external system |\n|<$EXTERNAL_CONTAINER_BG_COLOR> external container |\n|<$EXTERNAL_COMPONENT_BG_COLOR> external component |\nendlegend\n!endprocedure\n\n' Elements\n' ##################################\n\n!unquoted procedure Component($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $baseShape=\"rectangle\")\n  $getElementLine($baseShape, \"component\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ComponentDb($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getElementLine(\"database\", \"component\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ComponentQueue($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getElementLine(\"queue\", \"component\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Component_Ext($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $baseShape=\"rectangle\")\n  $getElementLine($baseShape, \"external_component\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ComponentDb_Ext($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getElementLine(\"database\", \"external_component\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ComponentQueue_Ext($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getElementLine(\"queue\", \"external_component\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n"
  },
  {
    "path": "C4_Container.puml",
    "content": "' convert it with additional command line argument -DRELATIVE_INCLUDE=\"relative/absolute\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./C4_Context.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml\n!endif\n\n' Scope: A single software system.\n' Primary elements: Containers within the software system in scope.\n' Supporting elements: People and software systems directly connected to the containers.\n' Intended audience: Technical people inside and outside of the software development team; including software architects, developers and operations/support staff.\n\n' Colors\n' ##################################\n\n!$CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR\n!$CONTAINER_BG_COLOR ?= \"#438DD5\"\n!$CONTAINER_BORDER_COLOR ?= \"#3C7FC0\"\n\n!$CONTAINER_BOUNDARY_COLOR ?= $BOUNDARY_COLOR\n!$CONTAINER_BOUNDARY_BG_COLOR ?= $BOUNDARY_BG_COLOR\n!$CONTAINER_BOUNDARY_BORDER_STYLE ?= $BOUNDARY_BORDER_STYLE\n\n!$EXTERNAL_CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR\n!$EXTERNAL_CONTAINER_BG_COLOR ?= \"#B3B3B3\"\n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= \"#A6A6A6\"\n\n' Labels\n' ##################################\n\n!$CONTAINER_LEGEND_TEXT ?= \"container\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"container\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"container boundary\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"external container\"\n\n' Styling\n' ##################################\nUpdateElementStyle(\"container\", $CONTAINER_BG_COLOR, $CONTAINER_FONT_COLOR, $CONTAINER_BORDER_COLOR, $shape=$DEFAULT_SHAPE, $legendText=\"$CONTAINER_LEGEND_TEXT\")\nUpdateElementStyle(\"external_container\", $EXTERNAL_CONTAINER_BG_COLOR, $EXTERNAL_CONTAINER_FONT_COLOR, $EXTERNAL_CONTAINER_BORDER_COLOR, $shape=$DEFAULT_SHAPE, $legendText=\"$EXTERNAL_CONTAINER_LEGEND_TEXT\")\n\nUpdateBoundaryStyle(\"container\", $bgColor=$CONTAINER_BOUNDARY_BG_COLOR, $fontColor=$CONTAINER_BOUNDARY_COLOR, $borderColor=$CONTAINER_BOUNDARY_COLOR, $type=\"$CONTAINER_BOUNDARY_TYPE\", $shape=$DEFAULT_SHAPE, $legendText=\"$CONTAINER_BOUNDARY_LEGEND_TEXT\")\n\n' shortcuts with default colors\n!unquoted procedure AddContainerTag($tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $sprite=\"\", $techn=\"\", $legendText=\"\", $legendSprite=\"\", $borderStyle=\"\", $borderThickness=\"\")\n  $addElementTagInclReuse(\"container\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite, $borderStyle, $borderThickness)\n!endprocedure\n!unquoted procedure AddExternalContainerTag($tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $sprite=\"\", $techn=\"\", $legendText=\"\", $legendSprite=\"\", $borderStyle=\"\", $borderThickness=\"\")\n  $addElementTagInclReuse(\"external_container\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite, $borderStyle, $borderThickness)\n!endprocedure\n\n!unquoted procedure UpdateContainerBoundaryStyle($bgColor=$CONTAINER_BOUNDARY_BG_COLOR, $fontColor=$CONTAINER_BOUNDARY_COLOR, $borderColor=$CONTAINER_BOUNDARY_COLOR, $shadowing=\"\", $shape=\"\", $type=\"Container\", $legendText=\"\", $borderStyle=\"\", $borderThickness=\"\", $sprite=\"\", $legendSprite=\"\")\n  UpdateBoundaryStyle(\"container\", $bgColor, $fontColor, $borderColor, $shadowing, $shape, $type, $legendText, $borderStyle, $borderThickness, $sprite, $legendSprite)\n!endprocedure\n\n' Layout\n' ##################################\n\nSetDefaultLegendEntries(\"person\\nsystem\\ncontainer\\nexternal_person\\nexternal_system\\nexternal_container\\nenterprise_boundary\\nsystem_boundary\\ncontainer_boundary\\nboundary\")\n\n!procedure LAYOUT_WITH_LEGEND()\nhide stereotype\nlegend right\n|<color:$LEGEND_TITLE_COLOR>**Legend**</color> |\n|<$PERSON_BG_COLOR> person |\n|<$SYSTEM_BG_COLOR> system |\n|<$CONTAINER_BG_COLOR> container |\n|<$EXTERNAL_PERSON_BG_COLOR> external person |\n|<$EXTERNAL_SYSTEM_BG_COLOR> external system |\n|<$EXTERNAL_CONTAINER_BG_COLOR> external container |\nendlegend\n!endprocedure\n\n' Elements\n' ##################################\n\n!unquoted procedure Container($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $baseShape=\"rectangle\")\n  $getElementLine($baseShape , \"container\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ContainerDb($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getElementLine(\"database\", \"container\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ContainerQueue($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getElementLine(\"queue\", \"container\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Container_Ext($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $baseShape=\"rectangle\")\n  $getElementLine($baseShape , \"external_container\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ContainerDb_Ext($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getElementLine(\"database\", \"external_container\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ContainerQueue_Ext($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getElementLine(\"queue\", \"external_container\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n' Boundaries\n' ##################################\n\n!unquoted procedure Container_Boundary($alias, $label, $tags=\"\", $link=\"\", $descr = \"\")\n  !if ($tags != \"\")\n    !$allTags = $tags + '+container'\n  !else\n    !$allTags = 'container'\n  !endif\n  ' $type defined via $tag style\n  Boundary($alias, $label, \"\", $allTags, $link, $descr)\n!endprocedure\n"
  },
  {
    "path": "C4_Context.puml",
    "content": "' convert it with additional command line argument -DRELATIVE_INCLUDE=\"relative/absolute\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./C4.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4.puml\n!endif\n\n' Scope: A single software system.\n' Primary elements: The software system in scope.\n' Supporting elements: People and software systems directly connected to the software system in scope.\n' Intended audience: Everybody, both technical and non-technical people, inside and outside of the software development team.\n\n' Colors\n' ##################################\n\n!$PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR\n!$PERSON_BG_COLOR ?= \"#08427B\"\n!$PERSON_BORDER_COLOR ?= \"#073B6F\"\n\n!$EXTERNAL_PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR\n!$EXTERNAL_PERSON_BG_COLOR ?= \"#686868\"\n!$EXTERNAL_PERSON_BORDER_COLOR ?= \"#8A8A8A\"\n\n!$SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR\n!$SYSTEM_BG_COLOR ?= \"#1168BD\"\n!$SYSTEM_BORDER_COLOR ?= \"#3C7FC0\"\n\n!$SYSTEM_BOUNDARY_COLOR ?= $BOUNDARY_COLOR\n!$SYSTEM_BOUNDARY_BG_COLOR ?= $BOUNDARY_BG_COLOR\n!$SYSTEM_BOUNDARY_BORDER_STYLE ?= $BOUNDARY_BORDER_STYLE\n\n!$EXTERNAL_SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR\n!$EXTERNAL_SYSTEM_BG_COLOR ?= \"#999999\"\n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= \"#8A8A8A\"\n\n!$ENTERPRISE_BOUNDARY_COLOR ?= $BOUNDARY_COLOR\n!$ENTERPRISE_BOUNDARY_BG_COLOR ?= $BOUNDARY_BG_COLOR\n!$ENTERPRISE_BOUNDARY_BORDER_STYLE ?= $BOUNDARY_BORDER_STYLE\n\n' Labels\n' ##################################\n\n!$PERSON_LEGEND_TEXT ?= \"person\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"external person\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"system\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"system\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"system boundary\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"external system\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"enterprise\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"enterprise boundary\"\n\n' Styling\n' ##################################\n\nUpdateElementStyle(\"person\", $PERSON_BG_COLOR, $PERSON_FONT_COLOR, $PERSON_BORDER_COLOR, $shape=$DEFAULT_SHAPE, $legendText=\"$PERSON_LEGEND_TEXT\")\nUpdateElementStyle(\"external_person\", $EXTERNAL_PERSON_BG_COLOR, $EXTERNAL_PERSON_FONT_COLOR, $EXTERNAL_PERSON_BORDER_COLOR, $shape=$DEFAULT_SHAPE, $legendText=\"$EXTERNAL_PERSON_LEGEND_TEXT\")\nUpdateElementStyle(\"system\", $SYSTEM_BG_COLOR, $SYSTEM_FONT_COLOR, $SYSTEM_BORDER_COLOR, $shape=$DEFAULT_SHAPE, $legendText=\"$SYSTEM_LEGEND_TEXT\")\nUpdateElementStyle(\"external_system\", $EXTERNAL_SYSTEM_BG_COLOR, $EXTERNAL_SYSTEM_FONT_COLOR, $EXTERNAL_SYSTEM_BORDER_COLOR, $shape=$DEFAULT_SHAPE, $legendText=\"$EXTERNAL_SYSTEM_LEGEND_TEXT\")\n\nUpdateBoundaryStyle(\"system\", $bgColor=$SYSTEM_BOUNDARY_BG_COLOR, $fontColor=$SYSTEM_BOUNDARY_COLOR, $borderColor=$SYSTEM_BOUNDARY_COLOR, $type=\"$SYSTEM_BOUNDARY_TYPE\", $shape=$DEFAULT_SHAPE, $legendText=\"$SYSTEM_BOUNDARY_LEGEND_TEXT\")\nUpdateBoundaryStyle(\"enterprise\", $bgColor=$ENTERPRISE_BOUNDARY_BG_COLOR, $fontColor=$ENTERPRISE_BOUNDARY_COLOR, $borderColor=$ENTERPRISE_BOUNDARY_COLOR, $type=\"$ENTERPRISE_BOUNDARY_TYPE\", $shape=$DEFAULT_SHAPE, $legendText=\"$ENTERPRISE_BOUNDARY_LEGEND_TEXT\")\n\n' shortcuts with default colors\n!unquoted procedure AddPersonTag($tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $sprite=\"\", $legendText=\"\", $legendSprite=\"\", $type=\"\", $borderStyle=\"\", $borderThickness=\"\")\n  $addElementTagInclReuse(\"person\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness)\n!endprocedure\n!unquoted procedure AddExternalPersonTag($tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $sprite=\"\", $legendText=\"\", $legendSprite=\"\", $type=\"\", $borderStyle=\"\", $borderThickness=\"\")\n  $addElementTagInclReuse(\"external_person\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness)\n!endprocedure\n!unquoted procedure AddSystemTag($tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $sprite=\"\", $legendText=\"\", $legendSprite=\"\", $type=\"\", $borderStyle=\"\", $borderThickness=\"\")\n  $addElementTagInclReuse(\"system\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness)\n!endprocedure\n!unquoted procedure AddExternalSystemTag($tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $sprite=\"\", $legendText=\"\", $legendSprite=\"\", $type=\"\", $borderStyle=\"\", $borderThickness=\"\")\n  $addElementTagInclReuse(\"external_system\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness)\n!endprocedure\n\n!unquoted procedure UpdateEnterpriseBoundaryStyle($bgColor=$ENTERPRISE_BOUNDARY_BG_COLOR, $fontColor=$ENTERPRISE_BOUNDARY_COLOR, $borderColor=$ENTERPRISE_BOUNDARY_COLOR, $shadowing=\"\", $shape=\"\", $type=\"Enterprise\", $legendText=\"\", $borderStyle=\"\", $borderThickness=\"\", $sprite=\"\", $legendSprite=\"\")\n  UpdateBoundaryStyle(\"enterprise\", $bgColor, $fontColor, $borderColor, $shadowing, $shape, $type, $legendText, $borderStyle, $borderThickness, $sprite, $legendSprite)\n!endprocedure\n!unquoted procedure UpdateSystemBoundaryStyle($bgColor=$SYSTEM_BOUNDARY_BG_COLOR, $fontColor=$SYSTEM_BOUNDARY_COLOR, $borderColor=$SYSTEM_BOUNDARY_COLOR, $shadowing=\"\", $shape=\"\", $type=\"System\", $legendText=\"\", $borderStyle=\"\", $borderThickness=\"\", $sprite=\"\", $legendSprite=\"\")\n  UpdateBoundaryStyle(\"system\", $bgColor, $fontColor, $borderColor, $shadowing, $shape, $type, $legendText, $borderStyle, $borderThickness, $sprite, $legendSprite)\n!endprocedure\n\n' Sprites\n' ##################################\n\nsprite $person [48x48/16] {\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n0000000000000000000049BCCA7200000000000000000000\n0000000000000000006EFFFFFFFFB3000000000000000000\n00000000000000001CFFFFFFFFFFFF700000000000000000\n0000000000000001EFFFFFFFFFFFFFF80000000000000000\n000000000000000CFFFFFFFFFFFFFFFF6000000000000000\n000000000000007FFFFFFFFFFFFFFFFFF100000000000000\n00000000000001FFFFFFFFFFFFFFFFFFF900000000000000\n00000000000006FFFFFFFFFFFFFFFFFFFF00000000000000\n0000000000000BFFFFFFFFFFFFFFFFFFFF40000000000000\n0000000000000EFFFFFFFFFFFFFFFFFFFF70000000000000\n0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000\n0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000\n0000000000000DFFFFFFFFFFFFFFFFFFFF60000000000000\n0000000000000AFFFFFFFFFFFFFFFFFFFF40000000000000\n00000000000006FFFFFFFFFFFFFFFFFFFE00000000000000\n00000000000000EFFFFFFFFFFFFFFFFFF800000000000000\n000000000000007FFFFFFFFFFFFFFFFFF100000000000000\n000000000000000BFFFFFFFFFFFFFFFF5000000000000000\n0000000000000001DFFFFFFFFFFFFFF70000000000000000\n00000000000000000BFFFFFFFFFFFF500000000000000000\n0000000000000000005DFFFFFFFFA1000000000000000000\n0000000000000000000037ABB96100000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000025788300000000005886410000000000000\n000000000007DFFFFFFD9643347BFFFFFFFB400000000000\n0000000004EFFFFFFFFFFFFFFFFFFFFFFFFFFB1000000000\n000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFD200000000\n00000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE10000000\n0000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000000\n000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5000000\n000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD000000\n000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF200000\n00000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF600000\n00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000\n00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA00000\n00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000\n00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000\n00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000\n00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA00000\n00000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF700000\n000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE100000\n0000008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3000000\n000000014555555555555555555555555555555300000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n}\n\nsprite $person2 [48x48/16] {\n0000000000000000000049BCCA7200000000000000000000\n0000000000000000006EFFFFFFFFB3000000000000000000\n00000000000000001CFFFFFFFFFFFF700000000000000000\n0000000000000001EFFFFFFFFFFFFFF80000000000000000\n000000000000000CFFFFFFFFFFFFFFFF6000000000000000\n000000000000007FFFFFFFFFFFFFFFFFF100000000000000\n00000000000001FFFFFFFFFFFFFFFFFFF900000000000000\n00000000000006FFFFFFFFFFFFFFFFFFFF00000000000000\n0000000000000BFFFFFFFFFFFFFFFFFFFF40000000000000\n0000000000000EFFFFFFFFFFFFFFFFFFFF70000000000000\n0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000\n0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000\n0000000000000DFFFFFFFFFFFFFFFFFFFF60000000000000\n0000000000000AFFFFFFFFFFFFFFFFFFFF40000000000000\n00000000000006FFFFFFFFFFFFFFFFFFFE00000000000000\n00000000000000EFFFFFFFFFFFFFFFFFF800000000000000\n000000000000007FFFFFFFFFFFFFFFFFF100000000000000\n000000000000000BFFFFFFFFFFFFFFFF5000000000000000\n0000000000000001DFFFFFFFFFFFFFF70000000000000000\n00000000000000000BFFFFFFFFFFFF500000000000000000\n0000000000000000005DFFFFFFFFA1000000000000000000\n0000000000000000000037ABB96100000000000000000000\n000000000002578888300000000005888864100000000000\n0000000007DFFFFFFFFD9643347BFFFFFFFFFB4000000000\n00000004EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB10000000\n0000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2000000\n000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE100000\n00003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000\n0000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50000\n0003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0000\n0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2000\n000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6000\n000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000\n001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000\n001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000\n001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA000\n000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6000\n0009FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF2000\n0003FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFD0000\n0000BFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFF50000\n00003FFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFB00000\n000006FFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFE100000\n0000007FFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFD2000000\n00000004EFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFB10000000\n0000000007DF8FFFFFFFFFFFFFFFFFFFFFF8FB4000000000\n000000000002578888888888888888888864100000000000\n}\n\nsprite $robot [48x48/16] {\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000005BFFFFFFFFFFFFFFFFFFFFFE9100000000000\n0000000000AFFFFFFFFFFFFFFFFFFFFFFFFFE30000000000\n0000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFE1000000000\n000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000000000\n000000004FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000000000\n000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFD000000000\n000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000\n000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000\n000699405FFFFFFC427FFFFFFFFFC427FFFFFFE009982000\n008FFF705FFFFFE10006FFFFFFFE00007FFFFFE00FFFF100\n00CFFF705FFFFFA00001FFFFFFF900002FFFFFE00FFFF500\n00DFFF705FFFFFB00002FFFFFFFA00003FFFFFE00FFFF500\n00DFFF705FFFFFF4000AFFFFFFFF3000BFFFFFE00FFFF500\n00DFFF705FFFFFFFA8DFFFFFFFFFFA8DFFFFFFE00FFFF500\n00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500\n00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500\n00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500\n00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500\n00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500\n00CFFF705FFFFFF87777777777777777CFFFFFE00FFFF500\n008FFF705FFFFFF100000000000000009FFFFFE00FFFF100\n000699405FFFFFF76666666666666666CFFFFFE009982000\n000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000\n000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000\n000000004FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000000000\n000000000EFFFFFFFFFFFFFFFFFFFFFFFFFFFF7000000000\n0000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFD0000000000\n00000000004CFFFFFFFFFFFFFFFFFFFFFFFF910000000000\n000000000000011111111111111111111110000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000\n}\n\nsprite $robot2 [48x48/16] {\n000000000000000088888888888888880000000000000000\n000000000000000AFFFFFFFFFFFFFFFFA000000000000000\n00000000000000CFFFFFFFFFFFFFFFFFFC00000000000000\n00000000000004EFFFFFFFFFFFFFFFFFFE40000000000000\n0000000000000AFFFFFFFFFFFFFFFFFFFFA0000000000000\n00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000\n00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000\n00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000\n00000000000888FFFFFFFFFFFFFFFFFFFF88800000000000\n00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000\n00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000\n00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000\n00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000\n00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000\n00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000\n00000000000888FFFFFFFFFFFFFFFFFFFF88800000000000\n00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000\n00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000\n00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000\n00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000\n00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000\n00000000000004CFFFFFFFFFFFFFFFFFFC40000000000000\n000000488888848CFFFFFFFFFFFFFFFFC848888884000000\n00000CFFFFFFFFC888888888888888888CFFFFFFFFC00000\n00008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80000\n0000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n0008FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF8000\n0008FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF8000\n0008FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF8000\n0008FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF8000\n0000CFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFC0000\n00008FFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFF80000\n00000CFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFC00000\n000000488887578888888888888888888864688884000000\n000000000000000000000000000000000000000000000000\n}\n\n' Layout\n' ##################################\n\nSetDefaultLegendEntries(\"person\\nsystem\\nexternal_person\\nexternal_system\\nenterprise_boundary\\nsystem_boundary\\nboundary\")\n\n!procedure LAYOUT_WITH_LEGEND()\nhide stereotype\nlegend right\n|<color:$LEGEND_TITLE_COLOR>**Legend**</color> |\n|<$PERSON_BG_COLOR> person |\n|<$SYSTEM_BG_COLOR> system|\n|<$EXTERNAL_PERSON_BG_COLOR> external person |\n|<$EXTERNAL_SYSTEM_BG_COLOR> external system |\nendlegend\n!endprocedure\n\n!global $defaultPersonSprite = \"person\"\n!$dummy = $restoreEmpty(\"person\", \"sprite\", $defaultPersonSprite, %true())\nUpdateElementStyle(\"person\")\n' workaround of plantuml.jar bug - person overwrites external_person setting\n!$dummy = $restoreEmpty(\"external_person\", \"sprite\", $defaultPersonSprite, %true())\nUpdateElementStyle(\"external_person\")\n!global $portraitPerson = \"false\"\n\n!procedure $clearPersonRestore()\n  !$dummy = $clearRestore(\"person\", \"sprite\")\n  !$dummy = $clearRestore(\"person\", \"legendSprite\")\n  %set_variable_value(\"$\" + \"person\" + \"ElementTagSprite\", \"\")\n  UpdateElementStyle(\"person\")\n  ' workaround of plantuml.jar bug - person overwrites external_person setting\n  !$dummy = $clearRestore(\"external_person\", \"sprite\")\n  !$dummy = $clearRestore(\"external_person\", \"legendSprite\")\n  %set_variable_value(\"$\" + \"external_person\" + \"ElementTagSprite\", \"\")\n  UpdateElementStyle(\"external_person\")\n!endprocedure\n\n!procedure HIDE_PERSON_SPRITE()\n  !$defaultPersonSprite = \"\"\n  !$portraitPerson = \"false\"\n  $clearPersonRestore()\n!endprocedure\n\n!unquoted procedure SHOW_PERSON_SPRITE($sprite=\"\")\n  !if ($sprite == \"\")\n    !$defaultPersonSprite = \"person\"\n  !else\n    !$defaultPersonSprite = $sprite\n  !endif\n  !$dummy = $restoreEmpty(\"person\", \"sprite\", $defaultPersonSprite, %true())\n  UpdateElementStyle(\"person\")\n  ' workaround of plantuml.jar bug - person overwrites external_person setting\n  !$dummy = $restoreEmpty(\"external_person\", \"sprite\", $defaultPersonSprite, %true())\n  UpdateElementStyle(\"external_person\")\n  !$portraitPerson = \"false\"\n!endprocedure\n\n!unquoted procedure SHOW_PERSON_PORTRAIT()\n  !$defaultPersonSprite = \"\"\n  !$portraitPerson = \"portrait\"\n  $clearPersonRestore()\n!endprocedure\n\n!unquoted procedure SHOW_PERSON_OUTLINE()\n  !$defaultPersonSprite = \"\"\n  !$portraitPerson = \"outline\"\n  $clearPersonRestore()\n!endprocedure\n\n' Elements\n' ##################################\n\n!function $getPerson($label, $type, $descr, $sprite)\n  !if ($sprite == \"\") && ($defaultPersonSprite != \"\")\n    !$sprite = $defaultPersonSprite\n  !endif\n  !return $getElementBase($label, $type, $descr, $sprite)\n!endfunction\n\n!unquoted procedure Person($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\")\n!$sprite=$toElementArg($sprite, $tags, \"ElementTagSprite\", \"person\")\n' $type reuses $techn definition of $tags\n!$type=$toElementArg($type, $tags, \"ElementTagTechn\", \"person\")\n!if ($portraitPerson == \"portrait\") && ($sprite == \"\")\nactor \"$getPerson($label, $type, $descr, $sprite)$getProps()\" $toStereos(\"person\", $tags) as $alias $getLink($link)\n!elseif ($portraitPerson == \"outline\") && ($sprite == \"\")\nperson \"$getPerson($label, $type, $descr, $sprite)$getProps()\" $toStereos(\"person\", $tags) as $alias $getLink($link)\n!else\nrectangle \"$getPerson($label, $type, $descr, $sprite)$getProps()\" $toStereos(\"person\", $tags) as $alias $getLink($link)\n!endif\n!endprocedure\n\n!unquoted procedure Person_Ext($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\")\n!$sprite=$toElementArg($sprite, $tags, \"ElementTagSprite\", \"external_person\")\n' $type reuses $techn definition of $tags\n!$type=$toElementArg($type, $tags, \"ElementTagTechn\", \"external_person\")\n!if ($portraitPerson == \"portrait\") && ($sprite == \"\")\nactor \"$getPerson($label, $type, $descr, $sprite)$getProps()\" $toStereos(\"external_person\", $tags) as $alias $getLink($link)\n!elseif ($portraitPerson == \"outline\") && ($sprite == \"\")\nperson \"$getPerson($label, $type, $descr, $sprite)$getProps()\" $toStereos(\"external_person\", $tags) as $alias $getLink($link)\n!else\nrectangle \"$getPerson($label, $type, $descr, $sprite)$getProps()\" $toStereos(\"external_person\", $tags) as $alias $getLink($link)\n!endif\n!endprocedure\n\n!unquoted procedure System($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\", $baseShape=\"rectangle\")\n  ' $type reuses $techn definition of $tags\n  $getElementLine($baseShape, \"system\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure SystemDb($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\")\n  ' $type reuses $techn definition of $tags\n  $getElementLine(\"database\", \"system\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure SystemQueue($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\")\n  ' $type reuses $techn definition of $tags\n  $getElementLine(\"queue\", \"system\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure System_Ext($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\", $baseShape=\"rectangle\")\n  ' $type reuses $techn definition of $tags\n  $getElementLine($baseShape , \"external_system\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure SystemDb_Ext($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\")\n  ' $type reuses $techn definition of $tags\n  $getElementLine(\"database\", \"external_system\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure SystemQueue_Ext($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\")\n  ' $type reuses $techn definition of $tags\n  $getElementLine(\"queue\", \"external_system\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n' Boundaries\n' ##################################\n\n!unquoted procedure Enterprise_Boundary($alias, $label, $tags=\"\", $link=\"\", $descr = \"\")\n  !if ($tags != \"\")\n    !$allTags = $tags + '+enterprise'\n  !else\n    !$allTags = 'enterprise'\n  !endif\n  ' $type defined via $tag style\n  Boundary($alias, $label, \"\", $allTags, $link, $descr)\n!endprocedure\n\n!unquoted procedure System_Boundary($alias, $label, $tags=\"\", $link=\"\", $descr = \"\")\n  !if ($tags != \"\")\n    !$allTags = $tags + '+system'\n  !else\n    !$allTags = 'system'\n  !endif\n  ' $type defined via $tag style\n  Boundary($alias, $label, \"\", $allTags, $link, $descr)\n!endprocedure\n"
  },
  {
    "path": "C4_Deployment.puml",
    "content": "' convert it with additional command line argument -DRELATIVE_INCLUDE=\"relative/absolute\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\n' Colors\n' ##################################\n\n!$NODE_FONT_COLOR ?= \"#000000\"\n!$NODE_BG_COLOR ?= \"#FFFFFF\"\n!$NODE_BORDER_COLOR ?= \"#A2A2A2\"\n\n' New C4 style automatically swaps font and background colors, but with those settings the component/node background would be black.\n' Therefore the colors should be displayed unchanged (the init colors have to be swapped too).\n!$NEW_C4_USE_ORIGINAL_NODE_COLORS ?= 1\n!$nodeColorsSwappedAlready ?= 0\n!if (NEW_C4_STYLE == 1 && $NEW_C4_USE_ORIGINAL_NODE_COLORS == 1 && $nodeColorsSwappedAlready == 0)\n  !$swap=$NODE_BG_COLOR\n  !$NODE_BG_COLOR=$NODE_FONT_COLOR\n  !$NODE_FONT_COLOR=$swap\n  ' don't swap them again below if C4_... included again\n  !$nodeColorsSwappedAlready=1\n!endif\n\n' Labels\n' ##################################\n\n!$NODE_LEGEND_TEXT ?= \"node\"\n\n' Styling\n' ##################################\n\n' PlantUML supports no automatic line breaks of \"PlantUML containers\" (C4 Deployment_Node is a \"PlantUML container\")\n' therefore (Deployment_)Node() implements an automatic line break based on spaces (like in all other objects).\n' If a $type contains \\n then these are used (and no automatic space based line breaks are done)\n' $NODE_TYPE_MAX_CHAR_WIDTH defines the automatic line break position\n!$NODE_TYPE_MAX_CHAR_WIDTH ?= 35\n!$NODE_DESCR_MAX_CHAR_WIDTH ?= 32\n\nUpdateElementStyle(\"node\", $bgColor=$NODE_BG_COLOR, $fontColor=$NODE_FONT_COLOR, $borderColor=$NODE_BORDER_COLOR, $shape=$DEFAULT_SHAPE, $legendText=\"$NODE_LEGEND_TEXT\")\nskinparam rectangle<<node>> {\n    FontStyle normal\n}\n\n' shortcuts with default colors\n' node specific: $techn is only used in old scripts, new scripts uses $type ($techn has to remain, it could be called via named argument)\n!unquoted procedure AddNodeTag($tagStereo, $bgColor=\"\", $fontColor=\"\", $borderColor=\"\", $shadowing=\"\", $shape=\"\", $sprite=\"\", $type=\"\", $legendText=\"\", $legendSprite=\"\", $techn=\"\", $borderStyle=\"\", $borderThickness=\"\")\n  !$type=$type+$techn\n  $addElementTagInclReuse(\"node\", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness)\n!endprocedure\n\n' Layout\n' ##################################\n\n' comment if node should not be added to legend. No calculated legend extension required\nSetDefaultLegendEntries(\"person\\nsystem\\ncontainer\\nexternal_person\\nexternal_system\\nexternal_container\\nnode\\nenterprise_boundary\\nsystem_boundary\\ncontainer_boundary\\nboundary\")\n\n' Line breaks\n' ##################################\n\n' $breakTechn() in C4 supports //...//; $breakNode() in C4_Deployment supports no //....//\n!unquoted function $breakNode($text, $widthStr)\n  !$usedNewLine = '</size>\\n<size:'+$TECHN_FONT_SIZE+'>'\n  !return $breakText($text, $usedNewLine, $widthStr)\n!endfunction\n\n' Elements\n' ##################################\n\n!function $getNode($label, $type, $descr, $sprite)\n  !$nodeText = \"\"\n  !if ($sprite != \"\")\n    !$nodeText = $nodeText + $getSprite($sprite) + '\\n'\n  !endif\n  !$nodeText = $nodeText + '== ' + $breakText($label, \"\\n== \")\n  !if ($type != \"\")\n    !$nodeText = $nodeText + '\\n<size:' + $TECHN_FONT_SIZE + '>[' + $breakNode($type, $NODE_TYPE_MAX_CHAR_WIDTH) + ']</size>'\n  !endif\n  !if ($descr != \"\")\n    !$nodeText = $nodeText + '\\n\\n' + $breakDescr($descr, $NODE_DESCR_MAX_CHAR_WIDTH)\n  !endif\n  !return $nodeText \n!endfunction\n\n!function $getNode_L($label, $type, $descr, $sprite)\n  !$nodeText = \"\"\n  !if ($sprite != \"\")\n    !$nodeText = $nodeText + $getSprite($sprite) + '\\l'\n  !endif\n  !$nodeText = $nodeText + '== ' + $breakText($label, \"\\l== \")\n  !if ($type != \"\")\n    !$nodeText = $nodeText + '\\l<size:' + $TECHN_FONT_SIZE + '>[' + $breakNode($type, $NODE_TYPE_MAX_CHAR_WIDTH) + ']</size>'\n  !endif\n  !if ($descr != \"\")\n    !$nodeText = $nodeText + '\\l\\l' + $breakDescr($descr, $NODE_DESCR_MAX_CHAR_WIDTH)\n  !endif\n  !return $nodeText \n!endfunction\n\n!function $getNode_R($label, $type, $descr, $sprite)\n  !$nodeText = \"\"\n  !if ($sprite != \"\")\n    !$nodeText = $nodeText + $getSprite($sprite) + '\\r'\n  !endif\n  !$nodeText = $nodeText + '== ' + $breakText($label, \"\\r== \")\n  !if ($type != \"\")\n    !$nodeText = $nodeText + '\\r<size:' + $TECHN_FONT_SIZE + '>[' + $breakNode($type, $NODE_TYPE_MAX_CHAR_WIDTH) + ']</size>'\n  !endif\n  !if ($descr != \"\")\n    !$nodeText = $nodeText + '\\r\\r' + $breakDescr($descr, $NODE_DESCR_MAX_CHAR_WIDTH)\n  !endif\n  !return $nodeText \n!endfunction\n\n!unquoted procedure Deployment_Node($alias, $label, $type=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n!$sprite=$toElementArg($sprite, $tags, \"ElementTagSprite\", \"node\")\n' nodes $type reuses $techn definition of $tags\n!$type=$toElementArg($type, $tags, \"ElementTagTechn\", \"node\")\nrectangle \"$getNode($label, $type, $descr, $sprite)$getProps()\" $toStereos(\"node\",$tags) as $alias $getLink($link)\n!endprocedure\n\n!unquoted procedure Deployment_Node_L($alias, $label, $type=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n!$sprite=$toElementArg($sprite, $tags, \"ElementTagSprite\", \"node\")\n' nodes $type reuses $techn definition of $tags\n!$type=$toElementArg($type, $tags, \"ElementTagTechn\", \"node\")\nrectangle \"$getNode_L($label, $type, $descr, $sprite)$getProps_L()\" $toStereos(\"node\",$tags) as $alias $getLink($link)\n!endprocedure\n\n!unquoted procedure Deployment_Node_R($alias, $label, $type=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n!$sprite=$toElementArg($sprite, $tags, \"ElementTagSprite\", \"node\")\n' nodes $type reuses $techn definition of $tags\n!$type=$toElementArg($type, $tags, \"ElementTagTechn\", \"node\")\nrectangle \"$getNode_R($label, $type, $descr, $sprite)$getProps_R()\" $toStereos(\"node\",$tags) as $alias $getLink($link)\n!endprocedure\n\n!unquoted procedure Node($alias, $label, $type=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n!$sprite=$toElementArg($sprite, $tags, \"ElementTagSprite\", \"node\")\n' nodes $type reuses $techn definition of $tags\n!$type=$toElementArg($type, $tags, \"ElementTagTechn\", \"node\")\nrectangle \"$getNode($label, $type, $descr, $sprite)$getProps()\" $toStereos(\"node\",$tags) as $alias $getLink($link)\n!endprocedure\n\n!unquoted procedure Node_L($alias, $label, $type=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n!$sprite=$toElementArg($sprite, $tags, \"ElementTagSprite\", \"node\")\n' nodes $type reuses $techn definition of $tags\n!$type=$toElementArg($type, $tags, \"ElementTagTechn\", \"node\")\nrectangle \"$getNode_L($label, $type, $descr, $sprite)$getProps_L()\" $toStereos(\"node\",$tags) as $alias $getLink($link)\n!endprocedure\n\n!unquoted procedure Node_R($alias, $label, $type=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n!$sprite=$toElementArg($sprite, $tags, \"ElementTagSprite\", \"node\")\n' nodes $type reuses $techn definition of $tags\n!$type=$toElementArg($type, $tags, \"ElementTagTechn\", \"node\")\nrectangle \"$getNode_R($label, $type, $descr, $sprite)$getProps_R()\" $toStereos(\"node\",$tags) as $alias $getLink($link)\n!endprocedure\n"
  },
  {
    "path": "C4_Dynamic.puml",
    "content": "' convert it with additional command line argument -DRELATIVE_INCLUDE=\"relative/absolute\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\n' Scope: Interactions in an enterprise, software system or container.\n' Primary and supporting elements: Depends on the diagram scope -\n'     enterprise - people and software systems Related to the enterprise in scope\n'     software system - see system context or container diagrams,\n'     container - see component diagram.\n' Intended audience: Technical and non-technical people, inside and outside of the software development team.\n\n' Dynamic diagram introduces (automatically) numbered interactions:\n'     (lowercase) increment($offset=1): increase current index (procedure which has no direct output)\n'     (lowercase) setIndex($new_index): set the new index (procedure which has no direct output)\n'\n'     (Uppercase) LastIndex(): return the last used index (function which can be used as argument)\n'     (Uppercase) Index($offset=1): returns current index and calculates next index (function which can be used as argument)\n'     (Uppercase) SetIndex($new_index): returns new set index and calculates next index (function which can be used as argument)\n\n' Relationship override\n' ##################################\n\n' Relationship\n' ##################################\n\n!unquoted procedure Rel_($e_index, $alias1, $alias2, $label, $direction)\n$getRel($direction, $alias1, $alias2, $e_index + \": \" + $label, \"\", \"\", \"\", \"\", \"\")\n!endprocedure\n!unquoted procedure Rel_($e_index, $alias1, $alias2, $label, $techn, $direction)\n$getRel($direction, $alias1, $alias2, $e_index + \": \" + $label, $techn, \"\", \"\", \"\", \"\")\n!endprocedure\n\n' all RelIndex... calls are outdated, Rel(..., $index=...) calls should be used !!!!\n\n' first Rel() supports the $index argument too; second Rel() overwrites C4.puml definition\n!unquoted procedure Rel($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\")\n!$pre = $getPrefix($index)\n$getRel(\"-->>\", $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel($from, $to, $label, $techn, $descr, $sprite, $tags, $link, \"\")\n!endprocedure\n!unquoted procedure RelIndex($e_index, $from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel(\"-->>\", $from, $to, $e_index + \": \" + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_Back($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\")\n!$pre = $getPrefix($index)\n$getRel(\"<<--\", $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_Back($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel_Back($from, $to, $label, $techn, $descr, $sprite, $tags, $link, \"\")\n!endprocedure\n!unquoted procedure RelIndex_Back($e_index, $from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel(\"<<--\", $from, $to, $e_index + \": \" + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_Neighbor($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\")\n!$pre = $getPrefix($index)\n$getRel(\"->>\", $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_Neighbor($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel_Neighbor($from, $to, $label, $techn, $descr, $sprite, $tags, $link, \"\")\n!endprocedure\n!unquoted procedure RelIndex_Neighbor($e_index, $from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel(\"->>\", $from, $to, $e_index + \": \" + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_Back_Neighbor($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\")\n!$pre = $getPrefix($index)\n$getRel(\"<<-\", $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_Back_Neighbor($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel_Back_Neighbor($from, $to, $label, $techn, $descr, $sprite, $tags, $link, \"\")\n!endprocedure\n!unquoted procedure RelIndex_Back_Neighbor($e_index, $from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel(\"<<-\", $from, $to, $e_index + \": \" + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_D($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\")\n!$pre = $getPrefix($index)\n$getRel($down(\"-\",\"->>\"), $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_D($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel_D($from, $to, $label, $techn, $descr, $sprite, $tags, $link, \"\")\n!endprocedure\n!unquoted procedure Rel_Down($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\")\n!$pre = $getPrefix($index)\n$getRel($down(\"-\",\"->>\"), $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_Down($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel_Down($from, $to, $label, $techn, $descr, $sprite, $tags, $link, \"\")\n!endprocedure\n!unquoted procedure RelIndex_D($e_index, $from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($down(\"-\",\"->>\"), $from, $to, $e_index + \": \" + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure RelIndex_Down($e_index, $from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($down(\"-\",\"->>\"), $from, $to, $e_index + \": \" + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_U($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\")\n!$pre = $getPrefix($index)\n$getRel($up(\"-\",\"->>\"), $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_U($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel_U($from, $to, $label, $techn, $descr, $sprite, $tags, $link=, \"\")\n!endprocedure\n!unquoted procedure Rel_Up($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\")\n!$pre = $getPrefix($index)\n$getRel($up(\"-\",\"->>\"), $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_Up($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel_Up($from, $to, $label, $techn, $descr, $sprite, $tags, $link, \"\")\n!endprocedure\n!unquoted procedure RelIndex_U($e_index, $from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($up(\"-\",\"->>\"), $from, $to, $e_index + \": \" + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure RelIndex_Up($e_index, $from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($up(\"-\",\"->>\"), $from, $to, $e_index + \": \" + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_L($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\")\n!$pre = $getPrefix($index)\n$getRel($left(\"-\",\"->>\"), $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_L($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel_L($from, $to, $label, $techn, $descr, $sprite, $tags, $link, \"\")\n!endprocedure\n!unquoted procedure Rel_Left($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\")\n!$pre = $getPrefix($index)\n$getRel($left(\"-\",\"->>\"), $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_Left($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel_Left($from, $to, $label, $techn, $descr, $sprite, $tags, $link, \"\")\n!endprocedure\n!unquoted procedure RelIndex_L($e_index, $from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($left(\"-\",\"->>\"), $from, $to, $e_index + \": \" + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure RelIndex_Left($e_index, $from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($left(\"-\",\"->>\"), $from, $to, $e_index + \": \" + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Rel_R($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\")\n!$pre = $getPrefix($index)\n$getRel($right(\"-\",\"->>\"), $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_R($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel_R($from, $to, $label, $techn, $descr, $sprite, $tags, $link, \"\")\n!endprocedure\n!unquoted procedure Rel_Right($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\")\n!$pre = $getPrefix($index)\n$getRel($right(\"-\",\"->>\"), $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel_Right($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel_Right($from, $to, $label, $techn, $descr, $sprite, $tags, $link, \"\")\n!endprocedure\n!unquoted procedure RelIndex_R($e_index, $from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($right(\"-\",\"->>\"), $from, $to, $e_index + \": \" + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure RelIndex_Right($e_index, $from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n$getRel($right(\"-\",\"->>\"), $from, $to, $e_index + \": \" + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n"
  },
  {
    "path": "C4_Sequence.puml",
    "content": "﻿' convert it with additional command line argument -DRELATIVE_INCLUDE=\"relative/absolute\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\n' Scope: Interactions in an enterprise, software system or container.\n' Primary and supporting elements: Depends on the diagram scope -\n'     enterprise - people and software systems Related to the enterprise in scope\n'     software system - see system context or container diagrams,\n'     container - see component diagram.\n' Intended audience: Technical and non-technical people, inside and outside of the software development team.\n\n' Sequence diagram introduces (automatically) numbered interactions:\n'     (lowercase) increment($offset=1): increase current index (procedure which has no direct output)\n'     (lowercase) setIndex($new_index): set the new index (procedure which has no direct output)\n'\n'     (Uppercase) LastIndex(): return the last used index (function which can be used as argument)\n'     (Uppercase) Index($offset=1): returns current index and calculates next index (function which can be used as argument)\n'     (Uppercase) SetIndex($new_index): returns new set index and calculates next index (function which can be used as argument)\n\n' enables multi-level boxes\n!pragma teoz true\n\n\n' Legend redefinition\n' ##################################\n' sequence has no dashed boxes\n!if ($LEGEND_DASHED_BOUNDARY == \"dashed\")\n  !$LEGEND_DASHED_BOUNDARY = \"\"\n!endif\n!if ($LEGEND_DASHED_TRANSPARENT_BOUNDARY == \"dashed\")\n  !$LEGEND_DASHED_TRANSPARENT_BOUNDARY = \"\"\n!endif\nUpdateBoundaryStyle(\"\", $bgColor=$BOUNDARY_BG_COLOR, $fontColor=$BOUNDARY_COLOR, $borderColor=$BOUNDARY_COLOR, $shape=$DEFAULT_SHAPE)\nUpdateBoundaryStyle(\"enterprise\", $bgColor=$ENTERPRISE_BOUNDARY_BG_COLOR, $fontColor=$ENTERPRISE_BOUNDARY_COLOR, $borderColor=$ENTERPRISE_BOUNDARY_COLOR, $type=\"$ENTERPRISE_BOUNDARY_TYPE\", $shape=$DEFAULT_SHAPE)\nUpdateBoundaryStyle(\"system\", $bgColor=$SYSTEM_BOUNDARY_BG_COLOR, $fontColor=$SYSTEM_BOUNDARY_COLOR, $borderColor=$SYSTEM_BOUNDARY_COLOR, $type=\"$SYSTEM_BOUNDARY_TYPE\", $shape=$DEFAULT_SHAPE)\nUpdateBoundaryStyle(\"container\", $bgColor=$CONTAINER_BOUNDARY_BG_COLOR, $fontColor=$CONTAINER_BOUNDARY_COLOR, $borderColor=$CONTAINER_BOUNDARY_COLOR, $type=\"$CONTAINER_BOUNDARY_TYPE\", $shape=$DEFAULT_SHAPE)\n\n' Styling and Layout\n' ##################################\n\n!global $display_element_description = %false()\n\n' typically the element/participant descriptions are not displayed in a sequence diagram, but it can be activated with this call\n!unquoted procedure SHOW_ELEMENT_DESCRIPTIONS($show=\"true\")\n!if ($show == \"true\")\n  !global $display_element_description = %true()\n!else\n  !global $display_element_description = %false()\n!endif\n!endprocedure\n\n' typically the foot boxes descriptions are not displayed in a sequence diagram, but it can be activated with this call\n!unquoted procedure SHOW_FOOT_BOXES($show=\"true\")\n!if ($show == \"true\")\n  show footbox\n!else\n  hide footbox\n!endif\n!endprocedure\n\n!global $show_index = %false()\n' All relation specific (default) ordinary index numbers can be shown with this call\n!unquoted procedure SHOW_INDEX($show=\"true\")\n!if ($show == \"true\")\n  !global $show_index = %true()\n!else\n  !global $show_index = %false()\n!endif\n!endprocedure\n\n' ======= if no theme is defined hide foot box and activate C4_blue styles\n!if (%variable_exists(\"$THEME\"))\n!else\n' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,...\n' (no default values which are defined in C4.puml) \n' If skinparams and styles are defined with concrete values no variables are required \n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$ARROW_COLOR ?= \"#666666\"\n\n' replace transparent with concrete background that it can be used as font color too\n!if ($BOUNDARY_BG_COLOR == \"transparent\")\n  !$SEQUENCE_BG_COLOR = white\n!else\n  !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR\n!endif\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n' \"C4 styled\" default is that lifeline is arrow color\nskinparam SequenceLifelineBorderColor $ARROW_COLOR\n\nskinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupFontColor $BOUNDARY_COLOR\nskinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR\nskinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceReferenceFontColor $BOUNDARY_COLOR\nskinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR\n' VIA STYLE\n' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR\n<style>\nreferenceHeader {\n  fontcolor $SEQUENCE_BG_COLOR\n}\n</style>\nskinparam SequenceReferenceBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceDividerFontColor $BOUNDARY_COLOR\nskinparam SequenceDividerBorderColor $BOUNDARY_COLOR\n\n' VIA STYLE\n' skinparam SequenceDelayFontColor green\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $BOUNDARY_COLOR\n  }\n}\n</style>\n!endif\n' ======= if no theme is defined hide foot box and activate C4_blue styles\n\n!if (ROUNDED_STYLE == 1)\nskinparam participantRoundCorner $ROUNDED_BOX_SIZE\n!endif\n\n' Elements redefinition\n' ##################################\n\n' all elements have to be displayed as participant\n' participants requires ` %newline()` instead of `\\n`\n\n!unquoted function $breakWithNewline($text, $lineEnd, $lineStart, $widthStr=\"-1\")\n!$width = %intval($widthStr)\n!$multiLine = \"\"\n!if (%strpos($text, \"\\n\") >= 0)\n  !while (%strpos($text, \"\\n\") >= 0)\n    !$brPos = %strpos($text, \"\\n\")\n    !if ($brPos > 0)\n      !$multiLine = $multiLine + %substr($text, 0, $brPos) + $lineEnd + %newline() + $lineStart\n    !else\n      ' <U+00A0> non breaking change that newLine breaks with formats can be used with \\n\\n \n      !$multiLine = $multiLine + \"<U+00A0>\" + $lineEnd + %newline() + $lineStart\n    !endif\n    !$text = %substr($text, $brPos+2)\n    !if (%strlen($text) == 0)\n      !$text = \"<U+00A0>\"\n    !endif\n  !endwhile\n!else\n  !while ($width>0 && %strlen($text) > $width)\n    !$brPos = $width\n    !while ($brPos > 0 && %substr($text, $brPos, 1) != ' ')\n      !$brPos = $brPos - 1\n    !endwhile\n\n    !if ($brPos < 1)\n      !$brPos = %strpos($text, \" \")\n    !else\n    !endif\n\n    !if ($brPos > 0)\n      !$multiLine = $multiLine + %substr($text, 0, $brPos) + $lineEnd + %newline() + $lineStart\n      !$text = %substr($text, $brPos + 1)\n    !else\n      !$multiLine = $multiLine+ $text\n      !$text = \"\"\n    !endif\n  !endwhile\n!endif\n!if (%strlen($text) > 0)\n  !$multiLine = $multiLine + $text\n!endif\n!return $multiLine\n!endfunction\n\n!unquoted function $breakNewLineLabel($text)\n!$multiLine = $breakWithNewline($text, \"\", \"==\")\n!return $multiLine\n!endfunction\n\n!unquoted function $breakNewLineDescr($text)\n  !return $breakWithNewline($text, \"\", \"\", $REL_DESCR_MAX_CHAR_WIDTH)\n!endfunction\n\n!unquoted function $breakNewLineTechn($text)\n  !$lineStart = \"</size>//\"\n  !$lineEnd = '//<size:'+$TECHN_FONT_SIZE+'>'\n  !return $breakWithNewline($text, $lineStart, $lineEnd, $REL_TECHN_MAX_CHAR_WIDTH)\n!endfunction\n\n' properties are not displayed in sequence diagram (size would be too big)\n' $breakLabel() not required by participant\n!procedure $getParticipant($elementType, $alias, $label, $techn, $descr, $sprite, $tags, $link)\n  !$sprite=$toElementArg($sprite, $tags, \"ElementTagSprite\", $elementType)\n  !$techn=$toElementArg($techn, $tags, \"ElementTagTechn\", $elementType)\n  !$stereo = $toStereos($elementType,$tags)\n  !$calcLabel = \"== \" + $breakNewLineLabel($label)\n  !$calcTech = \"//<size:\" + $TECHN_FONT_SIZE + \">[\" + $breakNewLineTechn($techn) + \"]</size>//\"\n  !$calcDescr = $breakNewLineDescr($descr)\n  !$calcLink = $getLink($link)\n  !$props = $getProps()\n\nparticipant $alias $stereo $calcLink [\n!if ($sprite != \"\")\n$getSprite($sprite)\n!endif\n!if ($label != \"\")\n$calcLabel\n!endif\n!if ($techn != \"\")\n$calcTech\n!endif\n!if ($display_element_description == %true() && $descr != \"\")\n\n$calcDescr\n!endif\n]\n!endprocedure\n\n\n!unquoted procedure Person($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\")\n  ' $type reuses $techn definition of $tags\n  $getParticipant(\"person\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Person_Ext($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\")\n  ' $type reuses $techn definition of $tags\n  $getParticipant(\"external_person\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure System($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\", $baseShape=\"rectangle\")\n  ' $type reuses $techn definition of $tags\n  $getParticipant(\"system\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure SystemDb($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\")\n  ' $type reuses $techn definition of $tags\n  $getParticipant(\"system\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure SystemQueue($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\")\n  ' $type reuses $techn definition of $tags\n  $getParticipant(\"system\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure System_Ext($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\", $baseShape=\"rectangle\")\n  ' $type reuses $techn definition of $tags\n  $getParticipant(\"external_system\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure SystemDb_Ext($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\")\n  ' $type reuses $techn definition of $tags\n  $getParticipant(\"external_system\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure SystemQueue_Ext($alias, $label, $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $type=\"\")\n  ' $type reuses $techn definition of $tags\n  $getParticipant(\"external_system\", $alias, $label, $type, $descr, $sprite, $tags, $link)\n!endprocedure\n\n\n\n!unquoted procedure Container($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $baseShape=\"rectangle\")\n  $getParticipant(\"container\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ContainerDb($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getParticipant(\"container\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ContainerQueue($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getParticipant(\"container\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Container_Ext($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $baseShape=\"rectangle\")\n  $getParticipant(\"external_container\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ContainerDb_Ext($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getParticipant(\"external_container\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ContainerQueue_Ext($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getParticipant(\"external_container\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n\n\n!unquoted procedure Component($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $baseShape=\"rectangle\")\n  $getParticipant(\"component\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ComponentDb($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getParticipant(\"component\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ComponentQueue($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getParticipant(\"component\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure Component_Ext($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $baseShape=\"rectangle\")\n  $getParticipant(\"external_component\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ComponentDb_Ext($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getParticipant(\"external_component\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n!unquoted procedure ComponentQueue_Ext($alias, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\n  $getParticipant(\"external_component\", $alias, $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n\n\n' Boundary redefinition\n' ##################################\n\n' all boundaries have to be displayed as box and \n' !!! important changes: without { at the end; and boundary ends with Boundary_End() instead of }\n\n' alias ignored\n' $breakLabel() not required by participant\n\n!unquoted procedure Boundary($alias, $label, $type=\"\", $tags=\"\", $link=\"\", $descr = \"\")\n!$boundaryTags = $addBoundaryPostfix($tags)\n' boundary $type reuses $techn definition of $boundaryTags\n!$type=$toElementArg($type, $boundaryTags, \"ElementTagTechn\", \"boundary\")\n!$sprite=$toElementArg(\"\", $boundaryTags, \"ElementTagSprite\", \"boundary\")\n!$labelSprite=\"\"\n!if ($sprite != \"\")\n  ' add sprite in label line that it is more compact\n  !$labelSprite = $getSprite($smallVersionSprite($sprite, $BOUNDARY_IMAGE_SIZE_FACTOR)) + ' '\n!endif\n!if ($link != \"\")\n  !$usedNewLine = ']]\\n== [[' + $link + ' '\n  !$labelType = '== [[' + $link + ' ' + $labelSprite + $breakText($label, $usedNewLine) + ']]'\n!else\n  !$usedNewLine = '\\n== '\n  !$labelType = $labelSprite + $breakText($label, $usedNewLine)\n!endif\n!if (type != \"\")\n    !$labelType = $labelType + '\\n<size:' + $TECHN_FONT_SIZE + '>[' + $type + ']</size>'\n!endif\n!if ($display_element_description == %true() && $descr != \"\")\n    !$labelType = $labelType + '\\n\\n' + $breakDescr($descr, $BOUNDARY_DESCR_MAX_CHAR_WIDTH)\n!endif\nbox \"$labelType\" $toStereos(\"boundary\", $boundaryTags)\n!endprocedure\n\n!procedure Boundary_End()\nend box\n!endprocedure\n\n!unquoted procedure Enterprise_Boundary($alias, $label, $tags=\"\", $link=\"\", $descr = \"\")\n  !if ($tags != \"\")\n    !$allTags = $tags + '+enterprise'\n  !else\n    !$allTags = 'enterprise'\n  !endif\n  ' $type defined via $tag style\n  Boundary($alias, $label, \"\", $allTags, $link, $descr)\n!endprocedure\n\n!unquoted procedure System_Boundary($alias, $label, $tags=\"\", $link=\"\", $descr = \"\")\n  !if ($tags != \"\")\n    !$allTags = $tags + '+system'\n  !else\n    !$allTags = 'system'\n  !endif\n  ' $type defined via $tag style\n  Boundary($alias, $label, \"\", $allTags, $link, $descr)\n!endprocedure\n\n!unquoted procedure Container_Boundary($alias, $label, $tags=\"\", $link=\"\", $descr = \"\")\n  !if ($tags != \"\")\n    !$allTags = $tags + '+container'\n  !else\n    !$allTags = 'container'\n  !endif\n  ' $type defined via $tag style\n  Boundary($alias, $label, \"\", $allTags, $link, $descr)\n!endprocedure\n\n' Relationship (redefinition)\n' ##################################\n\n' only Rel is supported in sequence diagram\n\n' first Rel() supports the $index and $rel argument too; second Rel() overwrites C4.puml definition\n' don't add empty lines in procedure otherwise & calls are not working anymore '& a -> b: call' are not working anymore\n!unquoted procedure Rel($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\", $rel=\"\")\n  !if ($show_index == %true())\n    !$pre = $getPrefix($index)\n  !else\n    !$pre = \"\"\n  !endif\n  !if ($rel == \"\")\n    !$rel = \"->\"\n  !endif\n$getRel($rel, $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link)\n!endprocedure\n!unquoted procedure Rel($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\")\nRel($from, $to, $label, $techn, $descr, $sprite, $tags, $link, \"\", \"\")\n!endprocedure\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\n(c) 2018-2020 Ricardo Niepel, 2021-2026 Ricardo Niepel, kirchsth and contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "LayoutOptions.md",
    "content": "# Layout Options\n\nC4-PlantUML comes with some layout options.\n\n- [📄 C4-PlantUML](README.md#c4-plantuml)\n- [📄 Layout Options](#layout-options)\n  - [Layout Guidance and Practices](#layout-guidance-and-practices)\n    - [Overall Guidance](#overall-guidance)\n    - [Layout Practices](#layout-practices)\n  - [LAYOUT_TOP_DOWN() or LAYOUT_LEFT_RIGHT() or LAYOUT_LANDSCAPE()](#layout_top_down-or-layout_left_right-or-layout_landscape)\n  - [LAYOUT_WITH_LEGEND() or SHOW_LEGEND(?hideStereotype, ?details)](#layout_with_legend-or-show_legendhidestereotype-details)\n  - [SHOW_FLOATING_LEGEND(?alias, ?hideStereotype, ?details) and LEGEND()](#show_floating_legendalias-hidestereotype-details-and-legend)\n  - [LAYOUT_AS_SKETCH() and SET_SKETCH_STYLE(?bgColor, ?fontColor, ?warningColor, ?fontName, ?footerWarning, ?footerText)](#layout_as_sketch-and-set_sketch_stylebgcolor-fontcolor-warningcolor-fontname-footerwarning-footertext)\n  - [HIDE_STEREOTYPE()](#hide_stereotype)\n  - [HIDE_PERSON_SPRITE(), SHOW_PERSON_SPRITE(?sprite), SHOW_PERSON_PORTRAIT() and SHOW_PERSON_OUTLINE()](#hide_person_sprite-show_person_spritesprite-show_person_portrait-and-show_person_outline)\n    - [Using HIDE_PERSON_SPRITE()](#using-hide_person_sprite)\n    - [Using SHOW_PERSON_SPRITE()](#using-show_person_sprite)\n    - [Using SHOW_PERSON_SPRITE(sprite)](#using-show_person_spritesprite)\n    - [Using SHOW_PERSON_PORTRAIT()](#using-show_person_portrait)\n    - [Using SHOW_PERSON_OUTLINE()](#using-show_person_outline)\n  - [(C4 styled) Sequence diagram specific layout options](#c4-styled-sequence-diagram-specific-layout-options)\n    - [SHOW_ELEMENT_DESCRIPTIONS(?show)](#show_element_descriptionsshow)\n    - [SHOW_FOOT_BOXES(?show)](#show_foot_boxesshow)\n    - [SHOW_INDEX(?show)](#show_indexshow)\n  - [Optional support of additional PlantUML elements](#optional-support-of-additional-plantuml-elements)\n    - [List of supported PlantUML elements](#list-of-supported-plantuml-elements)\n- [📄 Themes (different styles and languages)](Themes.md#themes)\n- samples\n  - [📄 C4 Model Diagrams](samples/C4CoreDiagrams.md#c4-model-diagrams)\n\n## Layout Guidance and Practices\n\nPlantUML uses [Graphviz](https://www.graphviz.org/) for its graph visualization. Thus the rendering itself is done automatically for you - that it one of the biggest advantages of using PlantUML.\n\n...and also sometimes one of the biggest disadvantages, if the rendering is not what the user intended.\n\n### Overall Guidance\n\n1. Be minimal in the use of all directed relations - introduce the fewest possible directed `Rel_` and `Lay_` statements that achieve the desired layout. One way to do this is to immediately remove any of these you experiment with when they don't actually affect the layout at all. And of course you will remove the ones that affect it the layout in a negative way.\n2. With dynamic rendering tools (e.g. VS Code plugin) do NOT trust the first rendering as it is shifty when adding code because you do not know exactly when it grabs the current unsaved code. Wait for a bit or close and reopen preview panel.\n\n### Layout Practices\n\nThese are intended to correlate to the layout engine’s algorithm, but have (as of this writing) been determined by trial and error - not a code review.\n\nPlease read through all practices before starting.\n\n1. Create all components, containers and boundaries first - in order top to bottom or left to right.\n2. Use `Rel` (directionless) to create initial relationships.\n3. If layout is not as desired, modify **some** Rel statements to contain direction `Rel_{direction}` to force shape layouts.\n4. If the layout is not as desired, sparingly add `Lay_{direction}` to force any layouts that `Rel_{direction}` does not correct.\n5. For both `Lay_{direction}` and `Rel_{direction}` statements used above:\n   1. Exhaust attempts to get a working layout with `Rel_{direction}` before adding `Lay_{direction}`\n   2. Try to introduce the fewest possible directed statements (of either type) that result in the desired layout.\n   3. Immediately back out any directed statements that do not change the layout at all.\n   4. Order inner objects first when it creates the desired result (enclosing objects tend to follow suit when child objects are ordered).\n   5. When ordering multiple objects, only specify one relationship and, if possible in the same direction. For example if you want entity1 => entity2 => entity3, then `Rel_R(entity1,entity2)` and `Rel_R(entity2, entity3)` is the minimum possible statements and they all specify the same direction.\n   6. Try NOT to apply directed statements to both inner elements and enclosing elements to force relationships that aren't working out.\n   7. Make all orderings at the same nesting level whenever possible.\n   8. Do NOT create duplicated, opposite direction statements in an attempt to force or ensure relationships as it does not affect the results. For instance if you have `Lay_R(entity1,entity2)` which is not working as desired and then also add the opposing one as `Lay_L(entity2,entity1)` - it does not help with forcing layouts to be as you want them. It might help to use `Lay_L` **instead of** `Lay_R`, but not both together.\n6. Do not create an \"All enclosing\" boundary - the code for processing relationships seems to struggle with relationships inside this. Additionally, `SHOW_FLOATING_LEGEND()` will not display inside the All enclosing boundary.\n7. Legend statements must come after at least one usage of each of the elements you want the legend to contain.\n\n## LAYOUT_TOP_DOWN() or LAYOUT_LEFT_RIGHT() or LAYOUT_LANDSCAPE()\n\nWith the two macros `LAYOUT_TOP_DOWN()` and `LAYOUT_LEFT_RIGHT()` it is possible to easily change the flow visualization of the diagram. `LAYOUT_TOP_DOWN()` is the default.\n\n```plantuml\n@startuml LAYOUT_TOP_DOWN Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\n/' Not needed because this is the default '/\nLAYOUT_TOP_DOWN()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![LAYOUT_TOP_DOWN Sample - open link](https://www.plantuml.com/plantuml/svg/JL1DZzCm4BtxLmpba5Jg9bh4YTE6WE2msqOaPSKfSk8fjUGFovuegX3_dR4eBRayPTx7FCzJ8XbfiKQyqMusYq8u4uNqeQwZNAkVcixBj2ICitU4ZghPspeOwRBd8P4oUghRzmzT7XrVdcih4s7aqTYoGsg7iGevNzG5x3s1GrIeOC9PSYxGMIVGYH51uKakXg2enNFput0Snk7GZPyEh_joAqI7CNbNIcMrsy6coQWJHKa-RhQYl_1YEtxqYrCoNihvSGT5BsqmM6pXbm3-RfNA5QTHXi0vhpX14uBHioJjtOP7xTiTD7rNxJyFR8a8xwf7UFdUPgunngy9yacuj0U-Hv0iiLnSyouOLas44KXRDBmhSRVVrtOb_IKvvofZKdn3y-zLzrh7n4x6hyFGzQpAeXjxZ_c2bFWNCvoYj_zRdj0fllmV \"LAYOUT_TOP_DOWN Sample\")](https://www.plantuml.com/plantuml/uml/JL1DZzCm4BtxLmpba5Jg9bh4YTE6WE2msqOaPSKfSk8fjUGFovuegX3_dR4eBRayPTx7FCzJ8XbfiKQyqMusYq8u4uNqeQwZNAkVcixBj2ICitU4ZghPspeOwRBd8P4oUghRzmzT7XrVdcih4s7aqTYoGsg7iGevNzG5x3s1GrIeOC9PSYxGMIVGYH51uKakXg2enNFput0Snk7GZPyEh_joAqI7CNbNIcMrsy6coQWJHKa-RhQYl_1YEtxqYrCoNihvSGT5BsqmM6pXbm3-RfNA5QTHXi0vhpX14uBHioJjtOP7xTiTD7rNxJyFR8a8xwf7UFdUPgunngy9yacuj0U-Hv0iiLnSyouOLas44KXRDBmhSRVVrtOb_IKvvofZKdn3y-zLzrh7n4x6hyFGzQpAeXjxZ_c2bFWNCvoYj_zRdj0fllmV)\n\n`LAYOUT_LEFT_RIGHT()` rotates the flow visualization to _from Left to Right_ and directed relations like `Rel_Left()`, `Rel_Right()`, `Rel_Up()` and `Rel_Down()` are rotated too.\n\n```plantuml\n@startuml LAYOUT_LEFT_RIGHT Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nLAYOUT_LEFT_RIGHT()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![LAYOUT_LEFT_RIGHT Sample - open link](https://www.plantuml.com/plantuml/svg/JKzDR-8m4BtdLtZP0q62HApsj2Uo4OLAq4OajEefSf9fiUGFonuhGbN_UySgXVeoyhoFUM_baJiCIYQ_XEvb682T4At_b-UEZzcRm5FeWWVN6usWCUkDogtaEceM7WSfkhpykwZYwhZVvOfx14UhjYG55nfSPgD_iYjU7ezDkrlVDUtXVhDjqbcILE2yqIaVbD1pDYdY51uTH-CciwG-avjg_vkW1-xEQR-SisdDbPKmdR7tXD6xtab7w5fkBVayGySAQwNeEGgZ9xGgVyzPKLVPmxeXYGFs9rko_LCPiK9ACteMUtg6Xb59oucYWaH1jrWp2gHQ38K2IRSyPVkuf4ln2oIV2ut0v03okzKjrj6JakQsQQgQM95qHMys6q1FNuZZrHdrKx82FGGbFm40 \"LAYOUT_LEFT_RIGHT Sample\")](https://www.plantuml.com/plantuml/uml/JKzDR-8m4BtdLtZP0q62HApsj2Uo4OLAq4OajEefSf9fiUGFonuhGbN_UySgXVeoyhoFUM_baJiCIYQ_XEvb682T4At_b-UEZzcRm5FeWWVN6usWCUkDogtaEceM7WSfkhpykwZYwhZVvOfx14UhjYG55nfSPgD_iYjU7ezDkrlVDUtXVhDjqbcILE2yqIaVbD1pDYdY51uTH-CciwG-avjg_vkW1-xEQR-SisdDbPKmdR7tXD6xtab7w5fkBVayGySAQwNeEGgZ9xGgVyzPKLVPmxeXYGFs9rko_LCPiK9ACteMUtg6Xb59oucYWaH1jrWp2gHQ38K2IRSyPVkuf4ln2oIV2ut0v03okzKjrj6JakQsQQgQM95qHMys6q1FNuZZrHdrKx82FGGbFm40)\n\n`LAYOUT_LANDSCAPE()` rotates the default flow visualization to _from Left to Right_ like `LAYOUT_LEFT_RIGHT()` additional **directed relations** like Rel_Left(), Rel_Right(), Rel_Up() and Rel_Down() **are not rotated** anymore.\n\n```plantuml\n@startuml LAYOUT_LANDSCAPE Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nLAYOUT_LANDSCAPE()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSystem(S,\"S\")\nSystem(SU,\"S Up\")\nSystem(SD,\"S Down\")\nSystem(SL,\"S Left\")\nSystem(SR,\"S Right\")\n\nRel_Up(S, SU, \"Up\")\nRel_Down(S, SD, \"Down\")\nRel_Left(S, SL, \"Left\")\nRel_Right(S, SR, \"Right\")\n\nSHOW_LEGEND()\n\n@enduml\n```\n\n[![LAYOUT_LANDSCAPE Sample - open link](https://www.plantuml.com/plantuml/svg/NOzFRvj04CNlV8gjUmYM75kfUkef5ApaG1nae55FQ0sJUANzizeTXAAgtxqpCNQiSa7lDxFllRcFA0EEHeio-_tSDbsPxOewpwgjgANn6f8lolPw740S4NtyiTa4EQtV51x7mnWXzCuYM5ptpcoybfQzRYCEMXqs-VVRYb7xL6wCZ0Y1K9VJ2waiXBMdtIJvFpXT9aa58JgRoi4eknABZFygOf3emcAPrEzaPhgVRhI33EzfVxSIDwU-Dqln9n7qNMBI2GwTz9vyNk0WCk-rwYKgPnU4ygyhaTNLUhTjw4a0yMrz9vv-vJpBj7PJ57nc5EW4tUWbhPXHew8iqKmA4O90PK1JLgHkV-TsAPw6v3ElqJ3PWpvVzLchZH0vxx5fgfgsUEao_RHv08maWN-lmPdh9-VGUhLWULOjIT7wAr8mATnahrZ9h8HNl69xPdlrTiIvTjTwSXTrouNPaHaRVT22A8kPiza7Bucpc3aRdWPx6bpiwyVdbwxSFcntHKho7kmm6lqF \"LAYOUT_LANDSCAPE Sample\")](https://www.plantuml.com/plantuml/uml/NOzFRvj04CNlV8gjUmYM75kfUkef5ApaG1nae55FQ0sJUANzizeTXAAgtxqpCNQiSa7lDxFllRcFA0EEHeio-_tSDbsPxOewpwgjgANn6f8lolPw740S4NtyiTa4EQtV51x7mnWXzCuYM5ptpcoybfQzRYCEMXqs-VVRYb7xL6wCZ0Y1K9VJ2waiXBMdtIJvFpXT9aa58JgRoi4eknABZFygOf3emcAPrEzaPhgVRhI33EzfVxSIDwU-Dqln9n7qNMBI2GwTz9vyNk0WCk-rwYKgPnU4ygyhaTNLUhTjw4a0yMrz9vv-vJpBj7PJ57nc5EW4tUWbhPXHew8iqKmA4O90PK1JLgHkV-TsAPw6v3ElqJ3PWpvVzLchZH0vxx5fgfgsUEao_RHv08maWN-lmPdh9-VGUhLWULOjIT7wAr8mATnahrZ9h8HNl69xPdlrTiIvTjTwSXTrouNPaHaRVT22A8kPiza7Bucpc3aRdWPx6bpiwyVdbwxSFcntHKho7kmm6lqF)\n\n## LAYOUT_WITH_LEGEND() or SHOW_LEGEND(?hideStereotype, ?details)\n\nColors can help to add additional information or simply to make the diagram more aesthetically pleasing.\nIt can also help to save some space.\n\nAll of that is the reason, C4-PlantUML uses colors and prefer also to enable a layout without `<<stereotypes>>` and with a legend.\nThis can be enabled with `LAYOUT_WITH_LEGEND()`.\n\n```plantuml\n@startuml LAYOUT_WITH_LEGEND Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nLAYOUT_WITH_LEGEND()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![LAYOUT_WITH_LEGEND Sample - open link](https://www.plantuml.com/plantuml/svg/JKzDJy904BttLwnue2JG1kF94xKIC05iR95uQhRjA9linsPtceOO_xkp4S6zJ7RUnxotyCWTzaf6DqAtik-07H6jVqXJnuVaK-2nRteFhZKQGMFI6fLQoNNGp3nsKZHfVZyhmcg_tQIAUmH7gped1HSQN6A3VxJ9tb_sLNruhjRrPhbQxfxYIHGLuBpHCU-Kq5Csoi8K7Xr7uqQJg3oHdQeVJQyxxavnEv-oSScLbJ2UiA-8qRiSYWTeQcuj-HoWOPcrKhGSXT4ZMkMtKvQLHR9RLYHnmEwIETk-vG7Bf3I3Pw6ePsWOjRISAAgNAEWMgmQ1r8kXK23fbgTit-TqCVw2v7Ec4HYzWlnhTOsrzwIakQwgeYHM85tGgyqAqDCNmlXmHlsNB41tlP8_ \"LAYOUT_WITH_LEGEND Sample\")](https://www.plantuml.com/plantuml/uml/JKzDJy904BttLwnue2JG1kF94xKIC05iR95uQhRjA9linsPtceOO_xkp4S6zJ7RUnxotyCWTzaf6DqAtik-07H6jVqXJnuVaK-2nRteFhZKQGMFI6fLQoNNGp3nsKZHfVZyhmcg_tQIAUmH7gped1HSQN6A3VxJ9tb_sLNruhjRrPhbQxfxYIHGLuBpHCU-Kq5Csoi8K7Xr7uqQJg3oHdQeVJQyxxavnEv-oSScLbJ2UiA-8qRiSYWTeQcuj-HoWOPcrKhGSXT4ZMkMtKvQLHR9RLYHnmEwIETk-vG7Bf3I3Pw6ePsWOjRISAAgNAEWMgmQ1r8kXK23fbgTit-TqCVw2v7Ec4HYzWlnhTOsrzwIakQwgeYHM85tGgyqAqDCNmlXmHlsNB41tlP8_)\n\nInstead of a static legend (activated with `LAYOUT_WITH_LEGEND()`) a calculated legend can be activated with `SHOW_LEGEND(?hideStereotype, ?details)`.\n\nThe calculated legend has following differences:\n\n- only relevant elements are listed\n- custom tags/styles are supported\n- stereotypes can remain visible (with `SHOW_LEGEND(false)`)\n- details can be displayed in different sizes via the `$details` argument\n  - `$details = Small()` .. default; details are displayed with a smaller size compared to the legend labels\n  - `$details = Normal()` .. details and labels are displayed with same size\n  - `$details = None()` .. only the labels are displayed\n  - if `$legendText` contains `\\n` then the text before is the label and the text behind the details\n- **`SHOW_LEGEND()` has to be last call in the diagram**\n\n```plantuml\n@startuml SHOW_LEGEND Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![SHOW_LEGEND Sample - open link](https://www.plantuml.com/plantuml/svg/JL5Dgzf05DtFhxYr2oDeWgMhhfgceWkreObr6IR9RHsOZs7cXY3b_VTtWpurcqlEn-4Svdia6MWm6ghThtEptsmtnvzGIUCrYa_ATdhe4Iv4FdxBiY37z9-Yoz0E4KFdBA6bj7CcyrhQAMOLgTUgpOglgtA2JeTzPcGa30mr1JkaiXXIpreXIWpHsKJsHjabpFBfgaX1aWkpXQYkR3JD3pVONePhqgsNCBzrco_Wlm3-7f79Y6qZlUUSCxQGUwzL9qavEsEe-Bo4l2hJuwPcIq3uagxXyAUOk5nhDqQO9aKW1xp7IvQOGPFo6g4U5H4686LGAukHkxtTsoLq8pddBcDI_4RziUfPwnJPoNTNrsN5gadqO9ynMwJ8lpYTly6PLujuUQLa8Tu1 \"SHOW_LEGEND Sample\")](https://www.plantuml.com/plantuml/uml/JL5Dgzf05DtFhxYr2oDeWgMhhfgceWkreObr6IR9RHsOZs7cXY3b_VTtWpurcqlEn-4Svdia6MWm6ghThtEptsmtnvzGIUCrYa_ATdhe4Iv4FdxBiY37z9-Yoz0E4KFdBA6bj7CcyrhQAMOLgTUgpOglgtA2JeTzPcGa30mr1JkaiXXIpreXIWpHsKJsHjabpFBfgaX1aWkpXQYkR3JD3pVONePhqgsNCBzrco_Wlm3-7f79Y6qZlUUSCxQGUwzL9qavEsEe-Bo4l2hJuwPcIq3uagxXyAUOk5nhDqQO9aKW1xp7IvQOGPFo6g4U5H4686LGAukHkxtTsoLq8pddBcDI_4RziUfPwnJPoNTNrsN5gadqO9ynMwJ8lpYTly6PLujuUQLa8Tu1)\n\nLegend labels and details can be defined via `\\n` in `$legendTest` arguments too.\n\n```plantuml\n@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n' $legendText with \\n defines the label and details of the legend entry (\"backend container\" is label, \"eight sided shape\" is details)\nAddElementTag(\"backendContainer\", $fontColor=$ELEMENT_FONT_COLOR, $bgColor=\"#335DA5\", $shape=EightSidedShape(), $legendText=\"backend container\\neight sided shape\")\n' $legendText without \\n defines only a label\nAddRelTag(\"async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DashedLine(), $legendText=\"async call\")\n' if no $legendText defined, $tag is automatically the label and all additional displayed properties are the details\nAddRelTag(\"sync/async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DottedLine())\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\", $tags=\"backendContainer\")\n}\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\", $tags=\"async\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\", $tags=\"sync/async\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![SHOW_LEGEND Sample, $legendText defines legend details - open link](https://www.plantuml.com/plantuml/svg/hLDHRo8t47xdLqpsSYf815HTxwKIqd6mxUL480BIzk4aDBiUm3gllR9dIL3L_zxnRjWIagelvG7js9xFt_VDvq-1qNDLcCuFa3jx8C-W6Hurxm6LqgoTHIDRHO5MWT6M0FskAiWot4oNwMoyllqjtTpE9xE7QJfA1iF1805sK0K2ut8qvjYvqbjuVq2lCJEqeISTE7IJo-Qarm6uqZOtbI9uloFUj3q7D1MzrJAS_BIPECiepFoWZ4gko0GwXzepb-7duT3Zus0dogfCoFbSkaJ5GBGDIuCskd0JM1cT2UZDVLnwk9iD2mnC_irxhD9RCUxQq4w-r_JqxDmt2ugsSZ80xmaCPcGW-gT804m0jsqswZuG5lu8tIJ3_7kiyzCz2UZGTFSX8RtRCmIjI47OOqbnzuJOWyvOgTHG7CmQTorOopdfm_LMYeappe-kqrbwbyxNcryMyZTPp1PBsSzspMxoxiE7ZzFnnzXJNpLAu-MhUFSgrjrU_rprw3NrR_OrtzuRNhcAp-rorXm16ysrf2MPMWw6eyqZ7wQdauRnShdulIKVi_cl6oi-6XfDCUn9pQI-5D3WGunhJLC2QzqBiWr35HdWBZgF5Ri2MTSHlvYpB9q_7wL3QV182ahlIlAiIVeznQxJ1C_5HYx3_qUnOpufxdKwgsDWAZQVNMKL-cCt_r62TMkPl2M6psY_QxjBUl1d1-JNPgTRk4mRsc1Polcxke1nMIPIJTxruGyiq6iRotll3bf5UM1qeJaElye2yIdpxMrPSnjiAvitFcaM7ntaLH1doGSuQ8mzsaD301GTT2v1kg3td3xXfuN2-FusaZCwnuWRMNt50_PXwkIO_wVldEz_yOfK13XfvXz6hzwNaFhhv6_wnDrdc4sebw9jScphiQ2Jpz2SZYnMx7pqp9YJJRaij5IaqVcYLWEOnIVJUjG7p7CP9yiNUxG1Qz9I4US38TMHKBsOtqkp7W85OT3almzVLulvyCjwVRzgbJPRWYH0ctbyrPcxiFn2Qujw5cG9oTti4laivp6SNoJ2i_JNT3xjzZgV1BqgpDy0 \"SHOW_LEGEND Sample, $legendText defines legend details\")](https://www.plantuml.com/plantuml/uml/hLDHRo8t47xdLqpsSYf815HTxwKIqd6mxUL480BIzk4aDBiUm3gllR9dIL3L_zxnRjWIagelvG7js9xFt_VDvq-1qNDLcCuFa3jx8C-W6Hurxm6LqgoTHIDRHO5MWT6M0FskAiWot4oNwMoyllqjtTpE9xE7QJfA1iF1805sK0K2ut8qvjYvqbjuVq2lCJEqeISTE7IJo-Qarm6uqZOtbI9uloFUj3q7D1MzrJAS_BIPECiepFoWZ4gko0GwXzepb-7duT3Zus0dogfCoFbSkaJ5GBGDIuCskd0JM1cT2UZDVLnwk9iD2mnC_irxhD9RCUxQq4w-r_JqxDmt2ugsSZ80xmaCPcGW-gT804m0jsqswZuG5lu8tIJ3_7kiyzCz2UZGTFSX8RtRCmIjI47OOqbnzuJOWyvOgTHG7CmQTorOopdfm_LMYeappe-kqrbwbyxNcryMyZTPp1PBsSzspMxoxiE7ZzFnnzXJNpLAu-MhUFSgrjrU_rprw3NrR_OrtzuRNhcAp-rorXm16ysrf2MPMWw6eyqZ7wQdauRnShdulIKVi_cl6oi-6XfDCUn9pQI-5D3WGunhJLC2QzqBiWr35HdWBZgF5Ri2MTSHlvYpB9q_7wL3QV182ahlIlAiIVeznQxJ1C_5HYx3_qUnOpufxdKwgsDWAZQVNMKL-cCt_r62TMkPl2M6psY_QxjBUl1d1-JNPgTRk4mRsc1Polcxke1nMIPIJTxruGyiq6iRotll3bf5UM1qeJaElye2yIdpxMrPSnjiAvitFcaM7ntaLH1doGSuQ8mzsaD301GTT2v1kg3td3xXfuN2-FusaZCwnuWRMNt50_PXwkIO_wVldEz_yOfK13XfvXz6hzwNaFhhv6_wnDrdc4sebw9jScphiQ2Jpz2SZYnMx7pqp9YJJRaij5IaqVcYLWEOnIVJUjG7p7CP9yiNUxG1Qz9I4US38TMHKBsOtqkp7W85OT3almzVLulvyCjwVRzgbJPRWYH0ctbyrPcxiFn2Qujw5cG9oTti4laivp6SNoJ2i_JNT3xjzZgV1BqgpDy0)\n\nLegend details can be deactivated via `SHOW_LEGEND($details=None())`\n\n```plantuml\n@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n' $legendText with \\n defines the label and details of the legend entry (\"backend container\" is label, \"eight sided shape\" is details)\nAddElementTag(\"backendContainer\", $fontColor=$ELEMENT_FONT_COLOR, $bgColor=\"#335DA5\", $shape=EightSidedShape(), $legendText=\"backend container\\neight sided shape\")\n' $legendText without \\n defines only a label\nAddRelTag(\"async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DashedLine(), $legendText=\"async call\")\n' if no $legendText defined, $tag is automatically the label and all additional displayed properties are the details\nAddRelTag(\"sync/async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DottedLine())\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\", $tags=\"backendContainer\")\n}\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\", $tags=\"async\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\", $tags=\"sync/async\")\n\nSHOW_LEGEND($details=None())\n@enduml\n```\n\n[![SHOW_LEGEND Sample, hide details with $details=None() - open link](https://www.plantuml.com/plantuml/svg/hLDHZ-8s47xdLypczbIGM51rlPTAICT1sjiJ2ojWspwS54tY8LZds97ji8kg_lUE4nAbx5PzAGyeu_7CVDytdpyvZzPNXHhy09dH9x8Uf8TdwO-0GaWlZKR5gQ90BK19JO0shmhI7kwMstWrtz__5YVtwyNgQHdFeibqCed06wWSWJ8PAdKUtCW3l3-XbPWgIkX5Ek-6qNLnD1e0t4YTgKeGlC_99rtD2LL5RvLC5pyb2wCzCZ8xAGEJ6rAE-gsEtfVkv-dKulCaPsPLok1inbNCOiBSfgL27LIuSruecNBJkyTmzFImcXReFDatvsWX3opShQASl_VqSb7kcmP11xxfm1y95AQa8EWdY1ie1-PG9vewO1Js3CCenUnxYBDsJWJIDTLZY4ZcHmzE2XBWZbXIoBOTHp2O2n4h2elPOzurwp17OxWzSB0mojZPRRoA7-BrFlbbmt-BpMgpvNoQDzdetOSF7vVpZw6c7ZMBm_1TcBqByN0qxhEUlOR-JR_6Etf3ArFvlbn6gpDWmxccj2LLqq5trbd0u-cbvJ3VRZU_T-23D_yriVDdHRCbkYE95SVN19h-4EnQmsJ3QjE_SK4e0WBCW_9OULEWbxN5h_RCH_td8wHZXvr9G6bDITPBudfBeQhTO9zim3BzVnWRxrl6ey5WTtQUYkIpgRH0UnvcFxAnxhKdgyd3PzJVfSwZ4Vmv0FvrtXaM9fMA4YnBllzG1p0louYZnRin_845Mgb3-6ZDIOf03vGif0_Bhr97llLyDorjfi6XqbcZa_Iieu6iSgmiMGSdYQ56McW0WA2JpDX8L_0kxcDyaY7C7-y3E2Kp37q3ggzumZ4i3L-pqDNryVuNhW256qVD_jtirVjYK7-r-iOlVdXfaxZwACZ6rmuM2sfrXkPsGB7pnWRDb6fbolYWWyA5nXOr6y0qF9bEep5Wbl4wFNzvYzfX3PeZyjc4GGtOLFtzmJ_5UdBa647Z_p5ytMtMqo_x_UEkOzgak1CtIjRXLQVcIl9hhctNdf7P90-hgyvzdmTpVc4Bh-9Vu_LoU7jv5RErQQpxYOTLXVeR \"SHOW_LEGEND Sample, hide details with $details=None()\")](https://www.plantuml.com/plantuml/uml/hLDHZ-8s47xdLypczbIGM51rlPTAICT1sjiJ2ojWspwS54tY8LZds97ji8kg_lUE4nAbx5PzAGyeu_7CVDytdpyvZzPNXHhy09dH9x8Uf8TdwO-0GaWlZKR5gQ90BK19JO0shmhI7kwMstWrtz__5YVtwyNgQHdFeibqCed06wWSWJ8PAdKUtCW3l3-XbPWgIkX5Ek-6qNLnD1e0t4YTgKeGlC_99rtD2LL5RvLC5pyb2wCzCZ8xAGEJ6rAE-gsEtfVkv-dKulCaPsPLok1inbNCOiBSfgL27LIuSruecNBJkyTmzFImcXReFDatvsWX3opShQASl_VqSb7kcmP11xxfm1y95AQa8EWdY1ie1-PG9vewO1Js3CCenUnxYBDsJWJIDTLZY4ZcHmzE2XBWZbXIoBOTHp2O2n4h2elPOzurwp17OxWzSB0mojZPRRoA7-BrFlbbmt-BpMgpvNoQDzdetOSF7vVpZw6c7ZMBm_1TcBqByN0qxhEUlOR-JR_6Etf3ArFvlbn6gpDWmxccj2LLqq5trbd0u-cbvJ3VRZU_T-23D_yriVDdHRCbkYE95SVN19h-4EnQmsJ3QjE_SK4e0WBCW_9OULEWbxN5h_RCH_td8wHZXvr9G6bDITPBudfBeQhTO9zim3BzVnWRxrl6ey5WTtQUYkIpgRH0UnvcFxAnxhKdgyd3PzJVfSwZ4Vmv0FvrtXaM9fMA4YnBllzG1p0louYZnRin_845Mgb3-6ZDIOf03vGif0_Bhr97llLyDorjfi6XqbcZa_Iieu6iSgmiMGSdYQ56McW0WA2JpDX8L_0kxcDyaY7C7-y3E2Kp37q3ggzumZ4i3L-pqDNryVuNhW256qVD_jtirVjYK7-r-iOlVdXfaxZwACZ6rmuM2sfrXkPsGB7pnWRDb6fbolYWWyA5nXOr6y0qF9bEep5Wbl4wFNzvYzfX3PeZyjc4GGtOLFtzmJ_5UdBa647Z_p5ytMtMqo_x_UEkOzgak1CtIjRXLQVcIl9hhctNdf7P90-hgyvzdmTpVc4Bh-9Vu_LoU7jv5RErQQpxYOTLXVeR)\n\n## SHOW_FLOATING_LEGEND(?alias, ?hideStereotype, ?details) and LEGEND()\n\n`LAYOUT_WITH_LEGEND()` and SHOW_LEGEND(?hideStereotype)` adds the legend at the bottom right of the picture like below and additional whitespace is created.\n\n```plantuml\n@startuml Layout With Whitespace Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nPerson(a, \"Person A\")\nContainer(b, \"Container B\", \"techn\")\nSystem(c, \"System C\")\nContainer(d, \"Container D\", \"techn\")\nContainer_Ext(e, \"Ext. Container E\", \"techn\")\n\nRel_R(a, b, \"calls\")\nRel_D(b, c, \"uses\")\nRel_D(c, d, \"uses\")\nRel_R(d, e, \"updates\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![Layout With Whitespace Sample - open link](https://www.plantuml.com/plantuml/svg/LSwnReCm40RWtK_XCZbI0qkdJca1jGDjew2A4HdxL91iOzbdjNdx7eb4meJlk_y_SOWe0oPhU2FFSqBUJJZoRfmGefSAU2kjDy0U9gTCqi17H1-VYoB8t_o7icb84OAQ7OB3NCssy4QwvU8-eZRJK9HF--D2tnzDOML424HzIGqvEGYvfonZHmXnTa8-ykpwv2_PZgqfCT1YdVXhHYE26Xs5sZCTjK8HNP-yt5JrfbhTLrVkwpyKG1lwvloMhk_Jx0IcFot_E90gQKmaNR0I98emHRWPWTuObGbWCQybNfYrxrzTtzHlzMSbTkm0JYTh_W40 \"Layout With Whitespace Sample\")](https://www.plantuml.com/plantuml/uml/LSwnReCm40RWtK_XCZbI0qkdJca1jGDjew2A4HdxL91iOzbdjNdx7eb4meJlk_y_SOWe0oPhU2FFSqBUJJZoRfmGefSAU2kjDy0U9gTCqi17H1-VYoB8t_o7icb84OAQ7OB3NCssy4QwvU8-eZRJK9HF--D2tnzDOML424HzIGqvEGYvfonZHmXnTa8-ykpwv2_PZgqfCT1YdVXhHYE26Xs5sZCTjK8HNP-yt5JrfbhTLrVkwpyKG1lwvloMhk_Jx0IcFot_E90gQKmaNR0I98emHRWPWTuObGbWCQybNfYrxrzTtzHlzMSbTkm0JYTh_W40)\n\nTherefore a floating legend can be added via SHOW_FLOATING_LEGEND(), positioned with Lay_Distance() and existing whitespace is reused like below.\n\n- `SHOW_FLOATING_LEGEND(?alias, ?hideStereotype): shows the legend in the drawing area\n- `LEGEND()`: is the default alias of the created floating legend and can be used in Lay_Distance() call\n\n```plantuml\n@startuml Compact Legend Layout Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nPerson(a, \"Person A\")\nContainer(b, \"Container B\", \"techn\")\nSystem(c, \"System C\")\nContainer(d, \"Container D\", \"techn\")\nContainer_Ext(e, \"Ext. Container E\", \"techn\")\n\nRel_R(a, b, \"calls\")\nRel_D(b, c, \"uses\")\nRel_D(c, d, \"uses\")\nRel_R(d, e, \"updates\")\n\nSHOW_FLOATING_LEGEND()\nLay_Distance(LEGEND(), e, 1)\n@enduml\n```\n\n[![Compact Legend Layout Sample - open link](https://www.plantuml.com/plantuml/svg/RP5DQxD04CVl-obMUU1HQ9H2JuL2qcZJWar2qjBZigwJH5XNsHrfy-qxniH4w4LdVl-N4Pmwb1RRIZElD4gt1V03OkCUuzZAxsXVug7DMmTMrGR1OAJgAcwqD5rcuh3GPHxF7oRh3ds-Pt4b7O8b9EQKaAK16pLTFsDhiAusWRpZVZ_ocH-omHRa90mRV_PfHL07GwRjaLghG17gHpuVHOjHDBcD3bYaFnW0AVIE-DMTthhP1hJOTD-O4rLIQqUqWqb0H15i7LmPWMB4A4m0EjOK4a-OURlMA2nhmxDqaIwJ86IU1MojuVvErn9BinSQzc0AdtdqlFZPzdNr9LworUpZRRaGv_Ib96IPF8gaT2YDWW6Vpj_JMVQVU_zwof-utnyGqeBqIVgp-cmFIHzrd_cbUaf5z5D_0G00 \"Compact Legend Layout Sample\")](https://www.plantuml.com/plantuml/uml/RP5DQxD04CVl-obMUU1HQ9H2JuL2qcZJWar2qjBZigwJH5XNsHrfy-qxniH4w4LdVl-N4Pmwb1RRIZElD4gt1V03OkCUuzZAxsXVug7DMmTMrGR1OAJgAcwqD5rcuh3GPHxF7oRh3ds-Pt4b7O8b9EQKaAK16pLTFsDhiAusWRpZVZ_ocH-omHRa90mRV_PfHL07GwRjaLghG17gHpuVHOjHDBcD3bYaFnW0AVIE-DMTthhP1hJOTD-O4rLIQqUqWqb0H15i7LmPWMB4A4m0EjOK4a-OURlMA2nhmxDqaIwJ86IU1MojuVvErn9BinSQzc0AdtdqlFZPzdNr9LworUpZRRaGv_Ib96IPF8gaT2YDWW6Vpj_JMVQVU_zwof-utnyGqeBqIVgp-cmFIHzrd_cbUaf5z5D_0G00)\n\n## LAYOUT_AS_SKETCH() and SET_SKETCH_STYLE(?bgColor, ?fontColor, ?warningColor, ?fontName, ?footerWarning, ?footerText)\n\nC4-PlantUML can be especially helpful during up-front design sessions.\nOne thing which is often ignored is the fact, that these software architecture sketches are just sketches.\n\nWithout any proof\n\n- if they are technically possible\n- if they can fulfill all requirements\n- if they keep what they promise\n\nMore often these sketches are used by many people as facts and are manifested into their documentations.\nWith `LAYOUT_AS_SKETCH()` you can make a difference.\n\n```plantuml\n@startuml LAYOUT_AS_SKETCH Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nLAYOUT_AS_SKETCH()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![LAYOUT_AS_SKETCH Sample - open link](https://www.plantuml.com/plantuml/svg/NL1DI_D04BxlhvYtxw4fj0aLJvuQGx5Wgy6aYgUmILQxi1_BxeHGnF_kBDLMp6N8pFFnFBiAo3qEMi4sVttSrqrUDTNzkYusK77jb63_fEdKq0iu8BfmasMUZ-cxnCFG3a7upXeK1jFEwimfRgBM8c2lP9iLruiohlQxRQPvGE5frHJ4uD88dph2ClRNE9anLWeVh4buhwMPmoIFKmRq7AsVp5Xr937TtDh1zDmVasuvX-afxtG67mpeEziaesWRxXpfl8WMSkUKx3XAQoQqAlxF8Q_Az65T4yKBk4gNi7ikuYrNoeu1Oiq0Q84wEauGFIYKv0NrA95Q0Kej57a5olRvdIx1qv5qJh0Od3q9zTFg4ciVY4bpKzTbHQW8EbylCdS20_sAEDwyrRyfAs7w-9fV \"LAYOUT_AS_SKETCH Sample\")](https://www.plantuml.com/plantuml/uml/NL1DI_D04BxlhvYtxw4fj0aLJvuQGx5Wgy6aYgUmILQxi1_BxeHGnF_kBDLMp6N8pFFnFBiAo3qEMi4sVttSrqrUDTNzkYusK77jb63_fEdKq0iu8BfmasMUZ-cxnCFG3a7upXeK1jFEwimfRgBM8c2lP9iLruiohlQxRQPvGE5frHJ4uD88dph2ClRNE9anLWeVh4buhwMPmoIFKmRq7AsVp5Xr937TtDh1zDmVasuvX-afxtG67mpeEziaesWRxXpfl8WMSkUKx3XAQoQqAlxF8Q_Az65T4yKBk4gNi7ikuYrNoeu1Oiq0Q84wEauGFIYKv0NrA95Q0Kej57a5olRvdIx1qv5qJh0Od3q9zTFg4ciVY4bpKzTbHQW8EbylCdS20_sAEDwyrRyfAs7w-9fV)\n\nAdditional styles and the footer text can be changed with SET_SKETCH_STYLE():\n\n- `SET_SKETCH_STYLE(?bgColor, ?fontColor, ?warningColor, ?fontName, ?footerWarning, ?footerText)`:\n  Enables the modification of different sketch styles and footer.\n\nThe possible font name(s) depend on the output format (e.g. PNG uses fonts which are installed on the server and SVG fonts have to be installed on the client).\nAdditional is it possible to define comma separated fall back fonts (if the diagrams are exported as SVG. Atm\nPNG does not support fallback fonts based on a PlantUML [bug](https://forum.plantuml.net/14842/specify-fall-back-fonts-is-not-working), but this could be fixed in one of the following versions)\n\n```plantuml\n@startuml LAYOUT_AS_SKETCH Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nSET_SKETCH_STYLE($bgColor=\"lightblue\", $fontColor=\"darkblue\", $warningColor=\"darkred\", $footerWarning=\"Sketch\", $footerText=\"Created for discussion\")\n\n' PNG with font jlm_cmmi10 (typically another font is used)\n' SET_SKETCH_STYLE($fontName=\"jlm_cmmi10\")\n\n' SVG with fallback fonts MS Gothic,Comic Sans MS, Comic Sans, Chalkboard SE, Comic Neue, cursive, sans-serif (typically without \"MS Gothic\")\nSET_SKETCH_STYLE($fontName=\"MS Gothic,Comic Sans MS,Comic Sans,Chalkboard SE,Comic Neue,cursive,sans-serif\")\n\nLAYOUT_AS_SKETCH()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\nPNG with font `jlm_cmmi10`\n\n[![LAYOUT_AS_SKETCH with custom style png Sample - open link](https://www.plantuml.com/plantuml/svg/VL9TQzim57tFhxZp2ad1JTQnfq6WcGajhCt2xBRqoSZoJQD57qQwMXR6_lkkcgJEO5jUP9rxFiv5kGeaF4MZ1s-KbJgs26kYBdoSJBpOZfyLhMCJ0thfBA6biNHcqcbXa-OYKAjLCoa-N2mJT7ztEp4Y47g6we8LGbdquoxv3yfvLPUVvrLnKvVLq-ryTDOy5quxFysqUbvJeoDcEPojM7V0Zz1MUAliaTqAl_7OxhcEqnxtusbMRf3akXzK-8EcMU5H4BQmSXvQ5MGCGJcRdGy6GrWkhc7BIq9AXM_QrD8OTVaEHhJhb1HQxq1OHslqUueA40EsvtzP9yqNmk0qwttsAUN3COKD6o4tBru1xaguPcybyy8P9Q4KDe4vz5V-NWkzQPpmBPJpusY14NEGqGVrdJy2Coy2UhKwBPuYNIJ8NdEupX3-r_nVZKuA_TddfCwnJLycRNyxU_foNzMpyf0vOco9FZWx4grHDeTibauLo0jodZNbBX2Q-fEBjXL-DvANEGnBOJgDmtFuEG3-lVwxHbjiQj5rxFE83SowJlFwb5wOeU9j3hDoELxCAvPuXFVZIxXxAD9ifhNRlZod3q0Ef3ETO8g9cXHdGRLLHEY1b47DMO6x_Jgq6z5-o3u7MbhsA-hZLdsj-y1AFc-gQbaoYqbzwTxc6Ydm5TEnyiwSIgxGjj7etm00 \"LAYOUT_AS_SKETCH with custom style png Sample\")](https://www.plantuml.com/plantuml/uml/VL9TQzim57tFhxZp2ad1JTQnfq6WcGajhCt2xBRqoSZoJQD57qQwMXR6_lkkcgJEO5jUP9rxFiv5kGeaF4MZ1s-KbJgs26kYBdoSJBpOZfyLhMCJ0thfBA6biNHcqcbXa-OYKAjLCoa-N2mJT7ztEp4Y47g6we8LGbdquoxv3yfvLPUVvrLnKvVLq-ryTDOy5quxFysqUbvJeoDcEPojM7V0Zz1MUAliaTqAl_7OxhcEqnxtusbMRf3akXzK-8EcMU5H4BQmSXvQ5MGCGJcRdGy6GrWkhc7BIq9AXM_QrD8OTVaEHhJhb1HQxq1OHslqUueA40EsvtzP9yqNmk0qwttsAUN3COKD6o4tBru1xaguPcybyy8P9Q4KDe4vz5V-NWkzQPpmBPJpusY14NEGqGVrdJy2Coy2UhKwBPuYNIJ8NdEupX3-r_nVZKuA_TddfCwnJLycRNyxU_foNzMpyf0vOco9FZWx4grHDeTibauLo0jodZNbBX2Q-fEBjXL-DvANEGnBOJgDmtFuEG3-lVwxHbjiQj5rxFE83SowJlFwb5wOeU9j3hDoELxCAvPuXFVZIxXxAD9ifhNRlZod3q0Ef3ETO8g9cXHdGRLLHEY1b47DMO6x_Jgq6z5-o3u7MbhsA-hZLdsj-y1AFc-gQbaoYqbzwTxc6Ydm5TEnyiwSIgxGjj7etm00)\n\nSVG with fallback fonts MS Gothic,Comic Sans MS,Comic Sans,Chalkboard SE,Comic Neue,cursive,sans-serif\n\n[![LAYOUT_AS_SKETCH with custom style svg Sample - open link](https://www.plantuml.com/plantuml/svg/VP9lQzim4CRVvrFSl49TS9DrxDKWqCo45jPcONPR-ih8ygNHeZz6EYqBOzzz9vBK6MFB6rbtpptFxr2k0mbFqUZH6sMbZXt2cgWF7oSJBxRZ5qNhsCQ0NZfBQ6aidPdqMjWqSnceqwgTb1ykbwdqS7ytCI8GUYur9Ky8PT6F--G_gkPrKtsUr-LjKzNFT_Fyh7qfdNP-ccdrigPMHymAE5lntA5-B6s5jyeUrPtm6u_TNkiuxMdVdcRL1ackXqQDFsYQbHu5OGShvw5JGSOGbBFPnMXq3il53MnvIKYfy4sRHXgZhjv1JhjUIQ7r3eHrj4Q_bwW0CM1tmRD_BvGK2s5mcWrE-vpgyPZ3bgsG6qZQ0FSLtB2xaaNfZ99G2PkA1GnN_buBlMcTy1rd7biBZ5Y0Z3wex_mHM7aPqAlLANgAT94WUyrXdFzn_uld1ETFcXEO8yk0adQ_cpr_UQYRMNN8pBcsH1-SpKLdb2qWcwLJ1VA2d4-0kq1ecayksaxuNIwl2ZYlXEardb_0pn7mx_NVbM-nRKJViyyJjZ3hUytBKtfXBfLl2vXLo_5YNlE8HtW_leBxnpBrPbgxRNfEfW5o89tf1KjCrAGu2-gj8a8Ff0ngpWhCzkj0bzE-oJu7MLhsA-hZLWFMG-19Fc_hUbcnYaK3z61pWnJuYkbOUMTEHwxHTj7etm00 \"LAYOUT_AS_SKETCH with custom style svg Sample\")](https://www.plantuml.com/plantuml/uml/VP9lQzim4CRVvrFSl49TS9DrxDKWqCo45jPcONPR-ih8ygNHeZz6EYqBOzzz9vBK6MFB6rbtpptFxr2k0mbFqUZH6sMbZXt2cgWF7oSJBxRZ5qNhsCQ0NZfBQ6aidPdqMjWqSnceqwgTb1ykbwdqS7ytCI8GUYur9Ky8PT6F--G_gkPrKtsUr-LjKzNFT_Fyh7qfdNP-ccdrigPMHymAE5lntA5-B6s5jyeUrPtm6u_TNkiuxMdVdcRL1ackXqQDFsYQbHu5OGShvw5JGSOGbBFPnMXq3il53MnvIKYfy4sRHXgZhjv1JhjUIQ7r3eHrj4Q_bwW0CM1tmRD_BvGK2s5mcWrE-vpgyPZ3bgsG6qZQ0FSLtB2xaaNfZ99G2PkA1GnN_buBlMcTy1rd7biBZ5Y0Z3wex_mHM7aPqAlLANgAT94WUyrXdFzn_uld1ETFcXEO8yk0adQ_cpr_UQYRMNN8pBcsH1-SpKLdb2qWcwLJ1VA2d4-0kq1ecayksaxuNIwl2ZYlXEardb_0pn7mx_NVbM-nRKJViyyJjZ3hUytBKtfXBfLl2vXLo_5YNlE8HtW_leBxnpBrPbgxRNfEfW5o89tf1KjCrAGu2-gj8a8Ff0ngpWhCzkj0bzE-oJu7MLhsA-hZLWFMG-19Fc_hUbcnYaK3z61pWnJuYkbOUMTEHwxHTj7etm00)\n\nAll available (PNG) fonts can be displayed with\n\n```plantuml\n@startuml\nlistfonts\n@enduml\n```\n\n## HIDE_STEREOTYPE()\n\nTo enable a layout without `<<stereotypes>>` and legend.\nThis can be enabled with `HIDE_STEREOTYPE()`.\n\n```plantuml\n@startuml HIDE_STEREOTYPE Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nHIDE_STEREOTYPE()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![HIDE_STEREOTYPE Sample - open link](https://www.plantuml.com/plantuml/svg/JKzDQ-Cm4BtxLsYpXpYGs6JPqvxYTKrJQ5eJEoqz6TcUDW9z26c42QN_lIEQ9jLbqBoFUM_ZaJiCIYQ_X1va684T4Qt_b-UEJzcRm6FeWmSt68sWCHkCogtaEcfM7aSf-hpykwhZwh2xpnNt28vMNKaABZIup4R_P7jtKtLDM-shn_Qbhj95ajJWlD4f7vNGIpOhuXGU7KVZPekaEP6NwlwRe4VkJkcmNh9vmvMLC5-mzuJHkrn99-WxRYtvF4FF2ckb63WAesUqAdylMT7KsKFLaiG1-vEjsUwfZ5WXfPayYoqzGyEeekL4KK6Ye5kidGHIAOP2WQHRdh9zdDEb-0MIpvb6OB87-Ttg6klWIKbpsxPrGwn8kg1Ncrj0Jr-8uzKPzLEo0Jq69Jy1 \"HIDE_STEREOTYPE Sample\")](https://www.plantuml.com/plantuml/uml/JKzDQ-Cm4BtxLsYpXpYGs6JPqvxYTKrJQ5eJEoqz6TcUDW9z26c42QN_lIEQ9jLbqBoFUM_ZaJiCIYQ_X1va684T4Qt_b-UEJzcRm6FeWmSt68sWCHkCogtaEcfM7aSf-hpykwhZwh2xpnNt28vMNKaABZIup4R_P7jtKtLDM-shn_Qbhj95ajJWlD4f7vNGIpOhuXGU7KVZPekaEP6NwlwRe4VkJkcmNh9vmvMLC5-mzuJHkrn99-WxRYtvF4FF2ckb63WAesUqAdylMT7KsKFLaiG1-vEjsUwfZ5WXfPayYoqzGyEeekL4KK6Ye5kidGHIAOP2WQHRdh9zdDEb-0MIpvb6OB87-Ttg6klWIKbpsxPrGwn8kg1Ncrj0Jr-8uzKPzLEo0Jq69Jy1)\n\n## HIDE_PERSON_SPRITE(), SHOW_PERSON_SPRITE(?sprite), SHOW_PERSON_PORTRAIT() and SHOW_PERSON_OUTLINE()\n\nWith the macros `HIDE_PERSON_SPRITE()`, `SHOW_PERSON_SPRITE()` and `SHOW_PERSON_PORTRAIT()` it is possible to change the person related default sprite or person layout itself. `SHOW_PERSON_SPRITE()` is the default.\n\n- **HIDE_PERSON_SPRITE()**: deactivates the default sprite\n- **SHOW_PERSON_SPRITE()**: activates the default sprite \"person\"\n- **SHOW_PERSON_SPRITE($sprite)**: activates a specific sprite as default sprite\n- **SHOW_PERSON_PORTRAIT()**: activates portrait instead of a rectangle\n- **SHOW_PERSON_OUTLINE()**: activates person outline instead of a rectangle\n\n\"person\" and \"person2\" are predefined sprites which can be used as default sprite too.\n\n```plantuml\n@startuml predefined sprites Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nPerson(userA, \"User A\", \"with predefined sprite person\", \"person\")\nPerson(userB, \"User B\", \"with predefined sprite person2\", \"person2\")\n@enduml\n```\n\n[![Predefined sprites Sample - open link](https://www.plantuml.com/plantuml/svg/XOxDIiKm48NtUOfuLrxmDY2kNFLdgr2GhYLjHXj89c5cGb_VH2m8BbpDOVZupkbPB4c9GMS21nyUmMdEv0LOlzcO0wWxZrie3lGkaldP6B97z-bbBsjXe2sX04gtfMXoiDXiDnON_6gcfzlSNilhYucM1QY-tgU4OciJTRcoIir0dF2-oOO7VLdgrSEbfgEM_1scypVVW9zq_QqOJyNuh-An4MUygXxGrK5V \"Predefined sprites Sample\")](https://www.plantuml.com/plantuml/uml/XOxDIiKm48NtUOfuLrxmDY2kNFLdgr2GhYLjHXj89c5cGb_VH2m8BbpDOVZupkbPB4c9GMS21nyUmMdEv0LOlzcO0wWxZrie3lGkaldP6B97z-bbBsjXe2sX04gtfMXoiDXiDnON_6gcfzlSNilhYucM1QY-tgU4OciJTRcoIir0dF2-oOO7VLdgrSEbfgEM_1scypVVW9zq_QqOJyNuh-An4MUygXxGrK5V)\n\n### Using HIDE_PERSON_SPRITE()\n\n```plantuml\n@startuml HIDE_PERSON_SPRITE Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nHIDE_PERSON_SPRITE()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![HIDE_PERSON_SPRITE Sample - open link](https://www.plantuml.com/plantuml/svg/PL1TgzD047tVNp7MXvj2Ry8LdtowCGPRi3KqgJw6JJBQXVrOTYU48lvtPsbj1VCoPCwPyx6laMIWsMZOxZxLVLCVsw-7lcsEkww6LXglKRnHTjJpX70cyl53KGIvv3yLdUTXZXX6PmajvQCpXTVI9hNdI9DMGr6zVsxIwhJ_KXWP2GEl-eelfB8OSizS8VwtpjP2D1YYivcSZB8RM9LfgaX1aWkhjMWlaT3q7zri9naksVYoWQThugSr_1B0tzqeMt3efVUiynq7ABtNQfIad5tngdgxWR9jyaFTyKb0U9U_mFvRbR1IQxT4I4KZa0DkwILJpAn9iHTqYoB20AGCQlQAdEttBLr6Lv1rRZG6nH7rtrQFMAU8CVbjkwvfcPL8T_GXynafyY-cyICuy-_9AzeflUSV \"HIDE_PERSON_SPRITE Sample\")](https://www.plantuml.com/plantuml/uml/PL1TgzD047tVNp7MXvj2Ry8LdtowCGPRi3KqgJw6JJBQXVrOTYU48lvtPsbj1VCoPCwPyx6laMIWsMZOxZxLVLCVsw-7lcsEkww6LXglKRnHTjJpX70cyl53KGIvv3yLdUTXZXX6PmajvQCpXTVI9hNdI9DMGr6zVsxIwhJ_KXWP2GEl-eelfB8OSizS8VwtpjP2D1YYivcSZB8RM9LfgaX1aWkhjMWlaT3q7zri9naksVYoWQThugSr_1B0tzqeMt3efVUiynq7ABtNQfIad5tngdgxWR9jyaFTyKb0U9U_mFvRbR1IQxT4I4KZa0DkwILJpAn9iHTqYoB20AGCQlQAdEttBLr6Lv1rRZG6nH7rtrQFMAU8CVbjkwvfcPL8T_GXynafyY-cyICuy-_9AzeflUSV)\n\n### Using SHOW_PERSON_SPRITE()\n\n```plantuml\n@startuml SHOW_PERSON_SPRITE Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\n/' Not needed because this is the default with sprite \"person\" '/\nSHOW_PERSON_SPRITE()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![SHOW_PERSON_SPRITE Sample - open link](https://www.plantuml.com/plantuml/svg/PL5DQzmm4BthLqpTWxsmiKdfgQUuPcaApSQidUPeP6lI5UX3I6DCAFtl7JLfjb1V1i-yz-QzqKqY6Mcr1eRR-yUfFvo6--CqzAUlum46QOD1yKwxnQmAuKmKqgUcYNAhVsWwh_EQC2xU4Jgg5s-ROAJBQbU9bD5pqtsywdFhuUvROsKYZDoQEcP8xJ3MWR52D2KSFO53LAXWnaMoBj1P9z29AuB29xaQWestGWfH4q8HC2Rl2YWRyR_vQYT4_mTGIMMrsqFHvgeJHKa-5ZinFBCXEttsgrCoFbVBzHxAbypb3duAuE_DQhNXFCaGMESHPsX3C7gHfDa0jxhtUsY7lZuUHgP4X0_rDTnzx_AiDSPl2VAf4f07lbEG3B4SIFCk63aLOGJI5WtlIkpjrwkxYbw6hFCAuw4ueVcRwcBh8J6Jw-quzWEZCkXjUf7vWfJu5tDvYjx-Ixb1f_AB_0O0 \"SHOW_PERSON_SPRITE Sample\")](https://www.plantuml.com/plantuml/uml/PL5DQzmm4BthLqpTWxsmiKdfgQUuPcaApSQidUPeP6lI5UX3I6DCAFtl7JLfjb1V1i-yz-QzqKqY6Mcr1eRR-yUfFvo6--CqzAUlum46QOD1yKwxnQmAuKmKqgUcYNAhVsWwh_EQC2xU4Jgg5s-ROAJBQbU9bD5pqtsywdFhuUvROsKYZDoQEcP8xJ3MWR52D2KSFO53LAXWnaMoBj1P9z29AuB29xaQWestGWfH4q8HC2Rl2YWRyR_vQYT4_mTGIMMrsqFHvgeJHKa-5ZinFBCXEttsgrCoFbVBzHxAbypb3duAuE_DQhNXFCaGMESHPsX3C7gHfDa0jxhtUsY7lZuUHgP4X0_rDTnzx_AiDSPl2VAf4f07lbEG3B4SIFCk63aLOGJI5WtlIkpjrwkxYbw6hFCAuw4ueVcRwcBh8J6Jw-quzWEZCkXjUf7vWfJu5tDvYjx-Ixb1f_AB_0O0)\n\n### Using SHOW_PERSON_SPRITE(sprite)\n\n```plantuml\n@startuml SHOW_PERSON_SPRITE(sprite) Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!define osaPuml https://raw.githubusercontent.com/Crashedmind/PlantUML-opensecurityarchitecture2-icons/master\n!include osaPuml/Common.puml\n!include osaPuml/User/all.puml\n\nSHOW_PERSON_SPRITE(\"osa_user_green_architect\")\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![SHOW_PERSON_SPRITE(sprite) Sample - open link](https://www.plantuml.com/plantuml/svg/ZL1DQzj04BthLspTGnIm9H9wwYckC4sXIOGbDqUnbYRnmduiCxCOK_hVEzieTkcfkYmpx-EzqHsnHaxE5X-C7ssQG1sO8tskQzJ7wjNm8UqJ0Ox1CtYknk3gQBNFcXNnPCs-RZwjshpQFNoldIO6bDNGY48R3rZ5F_uJlCYa0kbMvl-8QL3J0IPd_5I_-wz214ym9ZHyqZWU3CF82U5sPKHBS_xbcZckRe9pmSzL_WLtabnhQz_Wehj_UXxQpRPxUXowTlkjtvGBeGwvuF2A07uuHo-kYw85fE1BdQikrMATNqECcWCAtfs8mGrVGlAJnbCvtYpLLQTTj71rhNuMIhxppogFi1zqZEBp37krZj6QKRC9VY6hvkDIhRksUjpq8a5GjzMDUlZHP6njRJYIoYL9SL1ZS54BnINBHh9KVpJCW8gD0ojP9Dr-pUrAVWF5PwRbmxPWtw-wrDeHKCwxx_ks4rOcdT6BpLTWaX7oyuB1_Isv0pybPty3 \"SHOW_PERSON_SPRITE(sprite) Sample\")](https://www.plantuml.com/plantuml/uml/ZL1DQzj04BthLspTGnIm9H9wwYckC4sXIOGbDqUnbYRnmduiCxCOK_hVEzieTkcfkYmpx-EzqHsnHaxE5X-C7ssQG1sO8tskQzJ7wjNm8UqJ0Ox1CtYknk3gQBNFcXNnPCs-RZwjshpQFNoldIO6bDNGY48R3rZ5F_uJlCYa0kbMvl-8QL3J0IPd_5I_-wz214ym9ZHyqZWU3CF82U5sPKHBS_xbcZckRe9pmSzL_WLtabnhQz_Wehj_UXxQpRPxUXowTlkjtvGBeGwvuF2A07uuHo-kYw85fE1BdQikrMATNqECcWCAtfs8mGrVGlAJnbCvtYpLLQTTj71rhNuMIhxppogFi1zqZEBp37krZj6QKRC9VY6hvkDIhRksUjpq8a5GjzMDUlZHP6njRJYIoYL9SL1ZS54BnINBHh9KVpJCW8gD0ojP9Dr-pUrAVWF5PwRbmxPWtw-wrDeHKCwxx_ks4rOcdT6BpLTWaX7oyuB1_Isv0pybPty3)\n\n### Using SHOW_PERSON_PORTRAIT()\n\n```plantuml\n@startuml SHOW_PERSON_PORTRAIT() Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nSHOW_PERSON_PORTRAIT()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\n' if a person is combined with a sprite then the rectangle layout is used again\nPerson(person, \"Person with sprite\", $sprite=\"person2\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![SHOW_PERSON_PORTRAIT() Sample - open link](https://www.plantuml.com/plantuml/svg/RL1BQzj04BxhLqpTGcHm919wAXIYcj0KcbXOIdCKAsbYB-nZsPd5cDB_tbcKHm_LGRixyptccnjY5JbP0ztTxcbeR_VTxc5eT_j-t_peopLqoWQ3nGVj9fDcX2Dpe2zr7TMfEcW-fZ4HniaxHiVLv6qTZ79PyP9uDdgijvylsrnwlFzPMqMCKKh3LXXAEunL46nH_D--A5gCv5sfPglT1bPDFZLnLEpZQbrqPsAqmpUVtApYkPokDd2np7onXjy5oFTcLPvm75G8elE48pGX63qfrjwjfBJzk86cQwk7srue4U6wkeBxNzlSQupn9u8SbO0zICwW16AJOIrUq9yqCqPWRT685ybiVrwcAtbfYiuBJ9h51UXdK10mvmDDMNCKvWo2EKg7GjICm4Tq-GSH9rRk86P6dNtYp4aaU7MGTA-BMlJ4QdalOekK1FcqtBwk5jXr7cIFvdMzx_jv9AGS_AxlsqvG6VJMVS_p7PdaYVbuZjx-Ixb1DoTh_W80 \"SHOW_PERSON_PORTRAIT() Sample\")](https://www.plantuml.com/plantuml/uml/RL1BQzj04BxhLqpTGcHm919wAXIYcj0KcbXOIdCKAsbYB-nZsPd5cDB_tbcKHm_LGRixyptccnjY5JbP0ztTxcbeR_VTxc5eT_j-t_peopLqoWQ3nGVj9fDcX2Dpe2zr7TMfEcW-fZ4HniaxHiVLv6qTZ79PyP9uDdgijvylsrnwlFzPMqMCKKh3LXXAEunL46nH_D--A5gCv5sfPglT1bPDFZLnLEpZQbrqPsAqmpUVtApYkPokDd2np7onXjy5oFTcLPvm75G8elE48pGX63qfrjwjfBJzk86cQwk7srue4U6wkeBxNzlSQupn9u8SbO0zICwW16AJOIrUq9yqCqPWRT685ybiVrwcAtbfYiuBJ9h51UXdK10mvmDDMNCKvWo2EKg7GjICm4Tq-GSH9rRk86P6dNtYp4aaU7MGTA-BMlJ4QdalOekK1FcqtBwk5jXr7cIFvdMzx_jv9AGS_AxlsqvG6VJMVS_p7PdaYVbuZjx-Ixb1DoTh_W80)\n\n### Using SHOW_PERSON_OUTLINE()\n\n> This call requires PlantUML version >= v1.2021.4!\n\n```plantuml\n@startuml SHOW_PERSON_OUTLINE() Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nSHOW_PERSON_OUTLINE()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\n' if a person is combined with a sprite then the rectangle layout is used again\nPerson(person, \"Person with sprite\", $sprite=\"person2\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![SHOW_PERSON_OUTLINE() Sample - open link](https://www.plantuml.com/plantuml/svg/RL5BQzj04BxhLqpTWcLm919wAXJY6jCK4bj4SdCK8sbYB-nZsHqXJEb_xopAeuVeeDNEV8_vHhUHCV1eDDHtXwUssZtMXtrxE3Rtl_QxV0Kr6gyf-wHihyU1uCpiuxUo33WL9yNdiHiZXTvP9ij5xqpfDTeaU1LvqAehjr-lgbGwFjoN1YDJa5Ax5GOgIw7mWiso3zsphA8GdSrnCCgkOR59fueSa5rOhBBw8dgc_U56Es2uvFtr6fRpoCiL_Cb0dZUdVAAkHUz5vuaws7YlLO-id5r8QVjv3PkwAlQxHYY1uAQuXeVVszJRQEsc22bf17OWCJqAn8oQbNX1CocMOC3Aa1QlABFzVPakvxafEYymQMPBKC-0u2db0nMJPYVC0GHpbaxqGJ41dycc5mJg6Ur9p3HUtCY9CqR1uqdIlIvgrXEh-JwBpL8IvClyzNqnmsxI88-aNzVxlfzZb0XotZLDLGigWTwwxtb-4aUvKZgUWpF_Ksx93kdF_WC0 \"SHOW_PERSON_OUTLINE() Sample\")](https://www.plantuml.com/plantuml/uml/RL5BQzj04BxhLqpTWcLm919wAXJY6jCK4bj4SdCK8sbYB-nZsHqXJEb_xopAeuVeeDNEV8_vHhUHCV1eDDHtXwUssZtMXtrxE3Rtl_QxV0Kr6gyf-wHihyU1uCpiuxUo33WL9yNdiHiZXTvP9ij5xqpfDTeaU1LvqAehjr-lgbGwFjoN1YDJa5Ax5GOgIw7mWiso3zsphA8GdSrnCCgkOR59fueSa5rOhBBw8dgc_U56Es2uvFtr6fRpoCiL_Cb0dZUdVAAkHUz5vuaws7YlLO-id5r8QVjv3PkwAlQxHYY1uAQuXeVVszJRQEsc22bf17OWCJqAn8oQbNX1CocMOC3Aa1QlABFzVPakvxafEYymQMPBKC-0u2db0nMJPYVC0GHpbaxqGJ41dycc5mJg6Ur9p3HUtCY9CqR1uqdIlIvgrXEh-JwBpL8IvClyzNqnmsxI88-aNzVxlfzZb0XotZLDLGigWTwwxtb-4aUvKZgUWpF_Ksx93kdF_WC0)\n\n## (C4 styled) Sequence diagram specific layout options\n\n- **SHOW_ELEMENT_DESCRIPTIONS(?show)**: show or hide (hidden is default) all element/participant related descriptions\n- **SHOW_FOOT_BOXES(?show)**: show or hide (hidden is default) all element/participant related foot boxes\n- **SHOW_INDEX(?show)**: show or hide (hidden is default) the relationship (call) related index (sequence number)\n\nshow is defined with `$show=true` and hide is defined with `$show=false`\n\n### SHOW_ELEMENT_DESCRIPTIONS(?show)\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Sequence.puml\n\nSHOW_ELEMENT_DESCRIPTIONS()\n\nPerson(admin, \"Administrator\", \"People that administrates the products\")\nSystem_Boundary(c1, 'Sample')\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n' in a sequence diagram Boundary_End() has to be used instead of  { }\nBoundary_End()\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![SHOW_ELEMENT_DESCRIPTIONS() Sample - open link](https://www.plantuml.com/plantuml/svg/LL1DRzD04BtxLmpX44TARHLnujHWB5gfIQtQfKThx9qsA-t7iZihgqByTtOX8U3Boc_Unvkv2OoUerR5Esbc5GN1aTc5JtNjSQbU9H_Z50FvsHecmzLiTUqKcgov2YoKdEhcurMNeQVzVQqnCFa4ZJrzZsHcgbosB_hRX-UnlM_txM4OlxHzytZN3NSFXxxS54L7FbXJej3IR66rowyCx96jNoMW8-iK0H-H0Iz32WaYSDwAE7DOROh-BSNhyREDHg1_A-VhBQnxr4cztXIGliOQHcd8bmjD8pgNx9zfWfrpIix8qfgSsBpVmgxlgaCx98ad-51Tm_vRasSxfUmI89yb05kOhNQOA3egbhddi4Xcyi1IaqfPkTaQf064SBeA28cl7ZMSguwj4UK6ZlZRSg9iBv8cCA40-mBm0tuM_xDFwvRy9ozLEoMdlEAHrFcWbqsV0eMymkqmT7rYPTBVwSNcAt58lvIV5s_rlv8RCY9gzGi0 \"SHOW_ELEMENT_DESCRIPTIONS() Sample\")](https://www.plantuml.com/plantuml/uml/LL1DRzD04BtxLmpX44TARHLnujHWB5gfIQtQfKThx9qsA-t7iZihgqByTtOX8U3Boc_Unvkv2OoUerR5Esbc5GN1aTc5JtNjSQbU9H_Z50FvsHecmzLiTUqKcgov2YoKdEhcurMNeQVzVQqnCFa4ZJrzZsHcgbosB_hRX-UnlM_txM4OlxHzytZN3NSFXxxS54L7FbXJej3IR66rowyCx96jNoMW8-iK0H-H0Iz32WaYSDwAE7DOROh-BSNhyREDHg1_A-VhBQnxr4cztXIGliOQHcd8bmjD8pgNx9zfWfrpIix8qfgSsBpVmgxlgaCx98ad-51Tm_vRasSxfUmI89yb05kOhNQOA3egbhddi4Xcyi1IaqfPkTaQf064SBeA28cl7ZMSguwj4UK6ZlZRSg9iBv8cCA40-mBm0tuM_xDFwvRy9ozLEoMdlEAHrFcWbqsV0eMymkqmT7rYPTBVwSNcAt58lvIV5s_rlv8RCY9gzGi0)\n\n### SHOW_FOOT_BOXES(?show)\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Sequence.puml\n\nSHOW_FOOT_BOXES()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample')\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n' in a sequence diagram Boundary_End() has to be used instead of  { }\nBoundary_End()\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![SHOW_FOOT_BOXES() Sample - open link](https://www.plantuml.com/plantuml/svg/LL1DRzD04BtlhnZ28OwKsYhYnAbf5EY1aWYxb9irzawRbVPZsPrLL27-ExEY8U3Bo3FluxszoOo9YxFgZV6pBPhWo1ppXwvBU6gV3H_BL3AbENWcp-qSN1Sj-igvogojcRhj-wj3NJtSV-uSPgOagx6d7uNyJ6siygg_sp-E7_VxORpTVz_rpKgf0wKSV8FQ6R-6nQPEapaXXxHOgVv5fDnu6uhNc5wQ-NeDonvTjBHSAP1lAw7GU4hDYQOHOnILHvfW4wCrCx89VY6hxTirRFf3-sKt22KHl6kluVxRjjusrePJXben0mUGVX45uefb8qumd0nB8s3Zo8fNbcHBC1uGycj3q0QV4peuHnrtNZShE6ALX8cgl1QEz44DuGdW9_nI_w7FTHl-uoVHNft5JtqbUtwcIzE7B65atWt3eHTK1VszNcG-4MVvfJgUKd3_Kcx8w-BiRm00 \"SHOW_FOOT_BOXES() Sample\")](https://www.plantuml.com/plantuml/uml/LL1DRzD04BtlhnZ28OwKsYhYnAbf5EY1aWYxb9irzawRbVPZsPrLL27-ExEY8U3Bo3FluxszoOo9YxFgZV6pBPhWo1ppXwvBU6gV3H_BL3AbENWcp-qSN1Sj-igvogojcRhj-wj3NJtSV-uSPgOagx6d7uNyJ6siygg_sp-E7_VxORpTVz_rpKgf0wKSV8FQ6R-6nQPEapaXXxHOgVv5fDnu6uhNc5wQ-NeDonvTjBHSAP1lAw7GU4hDYQOHOnILHvfW4wCrCx89VY6hxTirRFf3-sKt22KHl6kluVxRjjusrePJXben0mUGVX45uefb8qumd0nB8s3Zo8fNbcHBC1uGycj3q0QV4peuHnrtNZShE6ALX8cgl1QEz44DuGdW9_nI_w7FTHl-uoVHNft5JtqbUtwcIzE7B65atWt3eHTK1VszNcG-4MVvfJgUKd3_Kcx8w-BiRm00)\n\n### SHOW_INDEX(?show)\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Sequence.puml\n\nSHOW_INDEX()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample')\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n' in a sequence diagram Boundary_End() has to be used instead of  { }\nBoundary_End()\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![SHOW_INDEX() Sample - open link](https://www.plantuml.com/plantuml/svg/LL1DRzD04BtlhnZ28OwKsYhYnAaXH1I9bWYxb9irzawRbVPZsPsLLI7-ExEYeU3Bo3Fluxszoeo9YxFgbV6pBPhWn1ppkwvBkBIFXazbAfdI73oJvtOEheiMVULSPDRMJDt-xSMnhkvkFdSECrEIrTZJZq9-fZPMUTLVVxaVFzr-E7nlDaeTAUNW6zJE-2siTdMQp0avfDL6zK-YuiRteNYDwQcPBxUmxj55I-kD0ldsaWUDfzGiD8qOewZSqmIx6AsPaKtmArdjNszXrn_RsyCWb4Jmfhs4cs_xUjjP6vOCjLq63Y3L8Wh45Sj6d61O34iPOEF8YbUMP6im7X3oSpdG1XyJEZX77GzUDniuOPM4YQgy5exqGGtX0U0d_5B_eSzr6_xZ9z6UdSLFVILxVgQNfdTPmiYy7ePZBwWA-djzaVb8dEMNwdX8mVrBkIAlYxE_0G00 \"SHOW_INDEX() Sample\")](https://www.plantuml.com/plantuml/uml/LL1DRzD04BtlhnZ28OwKsYhYnAaXH1I9bWYxb9irzawRbVPZsPsLLI7-ExEYeU3Bo3Fluxszoeo9YxFgbV6pBPhWn1ppkwvBkBIFXazbAfdI73oJvtOEheiMVULSPDRMJDt-xSMnhkvkFdSECrEIrTZJZq9-fZPMUTLVVxaVFzr-E7nlDaeTAUNW6zJE-2siTdMQp0avfDL6zK-YuiRteNYDwQcPBxUmxj55I-kD0ldsaWUDfzGiD8qOewZSqmIx6AsPaKtmArdjNszXrn_RsyCWb4Jmfhs4cs_xUjjP6vOCjLq63Y3L8Wh45Sj6d61O34iPOEF8YbUMP6im7X3oSpdG1XyJEZX77GzUDniuOPM4YQgy5exqGGtX0U0d_5B_eSzr6_xZ9z6UdSLFVILxVgQNfdTPmiYy7ePZBwWA-djzaVb8dEMNwdX8mVrBkIAlYxE_0G00)\n\n## Optional support of additional PlantUML elements\n\nMore often a full support of all PlantUML elements are requested.  \nThey can be set via the new optional `baseShape=\"....\"` argument of the calls\n\n- `System(..., ?baseShape)`,\n- `System_Ext(..., ?baseShape)`,\n- `Container(..., ?baseShape)`,\n- `Container_Ext(..., ?baseShape)`,\n- `Component(..., ?baseShape)`,\n- `Component_Ext(..., ?baseShape)`\n\nThe already specified `...Db...()` and `...Queue...()` calls are not extended.\n\nBut based on the additional (internal) overhead it has to be explicit enabled\nvia `ENABLE_ALL_PLANT_ELEMENTS`. It can be set with following 2 options\n\n- `!ENABLE_ALL_PLANT_ELEMENTS = 1` directly in the scripts file\n  BEFORE the first C4\\_\\* file is loaded, like e.g.\n\n```plantuml\n@startuml\n!ENABLE_ALL_PLANT_ELEMENTS = 1\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n...\n@enduml\n```\n\n- or via additional command line parameter `-DENABLE_ALL_PLANT_ELEMENTS=1`\n\nIf `ENABLE_ALL_PLANT_ELEMENTS` is not set, the diagrams displays the requested \"PlantUML element\"\nbut the style is not correct displayed.\n\n**A simple sample with additional \"PlantUML elements\":**\n\n```plantuml\n@startuml\n!ENABLE_ALL_PLANT_ELEMENTS = 1\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n\nComponent(comp, \"Copy component\")\n\nComponent(config, \"Config component\", $baseShape=\"package\")\n\nComponentDb(dbA, \"DB A\")\n' alternative syntax for ComponentDb() with $baseShape=\"database\"\nComponent(dbB, \"DB B\", $baseShape=\"database\")\n\nRel_U(comp, config, \"Configured by\")\nRel_L(comp, dbA, \"Reads from\")\nRel_R(comp, dbB, \"Writes to\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![Sample with PlantUML elements - open link](https://www.plantuml.com/plantuml/svg/NOzFQy904CNl-HHZA5H13OMU2eA9XlQmfk8VF8P9CcfeiXjs9xL---vMQqrly-VttioR6aRDRLrvlJW98n6deH3fKeJ99er5l8YJpHecyEJrIfbNRK5mP6xCIn1eF8qF9H_Rh3MaSoMP98zpLGTDXT9PZWmNLPa5i-VHqess2n7KQ9Yq7QKpLJTAEatZpdktlf_RQWZ-J3Ldo7-d_g2Bo7rvSD1FSOSDuI53G-iZDZJn6ym_y40TyJph5rbejVC8Ghjv1AoOj4GkFmdCMJ9-mLvfk5SCu6IpThmBP7Ij_sTjZQEBSNHxf0kxJrPKfTjhodz1Maq5P6TBEKXSeSkxAyB2m5wh-hfUtTRkw4wNJ0POkHFhj_TTAkBNE9dt1zwKPD7MrJS0 \"Sample with PlantUML elements\")](https://www.plantuml.com/plantuml/uml/NOzFQy904CNl-HHZA5H13OMU2eA9XlQmfk8VF8P9CcfeiXjs9xL---vMQqrly-VttioR6aRDRLrvlJW98n6deH3fKeJ99er5l8YJpHecyEJrIfbNRK5mP6xCIn1eF8qF9H_Rh3MaSoMP98zpLGTDXT9PZWmNLPa5i-VHqess2n7KQ9Yq7QKpLJTAEatZpdktlf_RQWZ-J3Ldo7-d_g2Bo7rvSD1FSOSDuI53G-iZDZJn6ym_y40TyJph5rbejVC8Ghjv1AoOj4GkFmdCMJ9-mLvfk5SCu6IpThmBP7Ij_sTjZQEBSNHxf0kxJrPKfTjhodz1Maq5P6TBEKXSeSkxAyB2m5wh-hfUtTRkw4wNJ0POkHFhj_TTAkBNE9dt1zwKPD7MrJS0)\n\n### List of supported PlantUML elements\n\n| PlantUML element | Support  | Comment                                                                                                               |\n| ---------------- | -------- | --------------------------------------------------------------------------------------------------------------------- |\n| rectangle        | &#x2705; | already supported (works even without ENABLE_ALL_PLANT_ELEMENTS)                                                      |\n| database         | &#x2705; | already supported (works even without ENABLE_ALL_PLANT_ELEMENTS)                                                      |\n| queue            | &#x2705; | already supported (works even without ENABLE_ALL_PLANT_ELEMENTS)                                                      |\n| node             | &#x274C; | **should not be used**, already defined for Node() (works even without ENABLE_ALL_PLANT_ELEMENTS)                     |\n| person           | &#x274C; | **should not be used**, already defined for Person() (works even without ENABLE_ALL_PLANT_ELEMENTS)                   |\n|                  |          |                                                                                                                       |\n| actor            | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| agent            | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| artifact         | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| boundary         | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| card             | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| circle           | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| cloud            | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| collections      | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| control          | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| entity           | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| file             | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| folder           | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| frame            | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| hexagon          | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| interface        | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| label            | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| package          | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| stack            | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| storage          | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| usecase          | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n| usecase/         | &#x2611; | requires ENABLE_ALL_PLANT_ELEMENTS                                                                                    |\n|                  |          |                                                                                                                       |\n| actor/           | &#x274C; | requires ENABLE_ALL_PLANT_ELEMENTS, not working (font color not changed to $bkColor) - and/or conflict with existing? |\n\nIf `ENABLE_ALL_PLANT_ELEMENTS` is not set, the diagrams displays the requested \"PlantUML element\"\nbut the style is not correct.\n"
  },
  {
    "path": "README.md",
    "content": "[![release][Release Badge]][Release Page]\n[![license MIT][License Badge]][License Page]\n &nbsp; &nbsp; &nbsp;\n[![commits since][Commits Since Badge]][Commit Page]\n[![last commit][Last Commit Badge]][Commit Page]\n[![build result][Tests Badge]][Tests Page]\n\n[Release Badge]: https://img.shields.io/github/v/release/plantuml-stdlib/C4-PlantUML?display_name=tag\n[Release Page]: https://github.com/plantuml-stdlib/C4-PlantUML/releases/latest\n[License Badge]: https://img.shields.io/github/license/plantuml-stdlib/C4-PlantUML\n[License Page]: https://github.com/plantuml-stdlib/C4-PlantUML/blob/master/LICENSE\n\n[Commits Since Badge]: https://img.shields.io/github/commits-since/plantuml-stdlib/C4-PlantUML/latest?label=new%20unreleased%20changes\n[Last Commit Badge]: https://img.shields.io/github/last-commit/plantuml-stdlib/C4-PlantUML?color=yellow\n[Commit Page]: https://github.com/plantuml-stdlib/C4-PlantUML/commits\n[Tests Badge]: https://github.com/plantuml-stdlib/C4-PlantUML/actions/workflows/run-percy-tests.yml/badge.svg\n[Tests Page]: https://github.com/plantuml-stdlib/C4-PlantUML/actions/workflows/run-percy-tests.yml\n\n# C4-PlantUML\n\n[comment]: # (\"image is based on percy/C4_Container Diagram Sample - bigbankplc-styles.puml with NEW_C4_STYLE\")\n[![Container diagram for Internet Banking System (with !NEW_C4_STYLE=1)](https://www.plantuml.com/plantuml/svg/hLP1Zzis4xthLqoSV8YCJxj6aEHIm42yjjfiOAzToycs9sKaZIKY5AcIb1sZw7ylALdMoWcGGthPDMSuxpq-3KTwfmqgKvVSUmcO6dP0Gne47M7-1lJ9SFAUFOIFyVnD7Et-N8RJLvxtZ8cKrnb1OKobVvbC51vlSsQAEgargLGAGyBSfhASL1o5Gx_H9kCicSpVt6nSwEDgEIbH6r8s5Czj1J91whPoIhpe_VenteJRQFqGhp_kblSFeJ-s0dUOQz1rLKbbG4ZG5QQaWGam1O70ai1FK5C6iWtL8YF5cM0Y1qT6qfmgqW4S2vOMa4dnqdI07HgAKoaLZM_1CjxlBs55eEYlcYnErb5ooabamVa_6Ffgu6YDQ8kWG0r6GaAGqPu9ohnPbeMSIXB6diKV9PX-iOMNyuy2UB6tYxdaKarVXCjm5Jxiub_NzizylLnlRJx9s-pe-UlNRnUpjwv65rZHD6HvOIAMKHQvjJ-scLRPpWgRTcoGTdJWaoi1xMh6ex6JjoNUI4Dz4gd3jeVgzCoss_NZK0stE8FiqqHaJfoc2zG5PKichA81XMEO_8SyqfYUntlsmZ332QOmklWB6SDSOGbxgU1U65A23DoX-E8w93ffGoNupHFyxDf-1F-7KTpyxI_0v_78Qw5R1i_RaD9I-6cjZIn91J2__1hDe0k3t3TDarYw01gIgYb4tiG0qrJMmkYHLTzgYUzi84DryjDN5kjQyMWCVti009S3-aTAOgmgk_cH4fXL5MSf6YR5o8O-u043Y2hbJhlwD7Un1N5si38QQThOlIcSRp2Wo9hmXJVfdDhChCWXiwxGmaKspUbcWpavzeurIXMhJ00paTSSbGjlb3omZ3GWvzzdsTSYTTAHCtC28ozEQZWmT3LCWJqm94eUDQbl99KoOPpEVgpSuY9g_Zo0Fx14nSHG371MCdV5TPreCY3tFo6k5G0P7LXAr_8MYP-XGJUmt7Cu_tHgej-NC5WRgKY36wwWA6VQA7JSm8HjvBBv7K3Ht3F0sXIGAif868PS1wwlI6lWChSBCkdjDqQT9uDrYhcMtTn_ltCMqcvJVTt0kHyuv4onmCrDnrnFlvrzO--VIz-7NurF9J8UwoPWYSARbLr3ky4nxme2rf0YXnLBbTHoRo3ycXOeSWBTxXm_nJnhwr4jfjWhBEbg2lIsk_xikY2rWUvyJyq7J6Hj-XO8BdSv0ADGQ6oSwEttjiIVp8l-rdxKf1tt-zrk4zcDmtswmX_kwPg-XslfuWStx1FPpuW6hfy0PwGcE6o8Zh2PrG5yiE_bIKFUFyqcTKRe5VmSK7ndYtlP_MKPWcu9Cmrx9SjcO1qLCwJ1I4TqvbdSpIta1VE9MrTD5bbO3NJZeWr6BsJOZmCDrtMrjltHqqUhtQO5wWypAB_gojwd_WrffzLgUUrLdxRmxLVJClmjV5ZuOsylfI45cSAZQ5ystOSN76xXV-w1CodySUEP-ophitRvgKjxxwpAkkJ_0W00 \"Container diagram for Internet Banking System (with !NEW_C4_STYLE=1)\")](https://www.plantuml.com/plantuml/uml/hLP1Zzis4xthLqoSV8YCJxj6aEHIm42yjjfiOAzToycs9sKaZIKY5AcIb1sZw7ylALdMoWcGGthPDMSuxpq-3KTwfmqgKvVSUmcO6dP0Gne47M7-1lJ9SFAUFOIFyVnD7Et-N8RJLvxtZ8cKrnb1OKobVvbC51vlSsQAEgargLGAGyBSfhASL1o5Gx_H9kCicSpVt6nSwEDgEIbH6r8s5Czj1J91whPoIhpe_VenteJRQFqGhp_kblSFeJ-s0dUOQz1rLKbbG4ZG5QQaWGam1O70ai1FK5C6iWtL8YF5cM0Y1qT6qfmgqW4S2vOMa4dnqdI07HgAKoaLZM_1CjxlBs55eEYlcYnErb5ooabamVa_6Ffgu6YDQ8kWG0r6GaAGqPu9ohnPbeMSIXB6diKV9PX-iOMNyuy2UB6tYxdaKarVXCjm5Jxiub_NzizylLnlRJx9s-pe-UlNRnUpjwv65rZHD6HvOIAMKHQvjJ-scLRPpWgRTcoGTdJWaoi1xMh6ex6JjoNUI4Dz4gd3jeVgzCoss_NZK0stE8FiqqHaJfoc2zG5PKichA81XMEO_8SyqfYUntlsmZ332QOmklWB6SDSOGbxgU1U65A23DoX-E8w93ffGoNupHFyxDf-1F-7KTpyxI_0v_78Qw5R1i_RaD9I-6cjZIn91J2__1hDe0k3t3TDarYw01gIgYb4tiG0qrJMmkYHLTzgYUzi84DryjDN5kjQyMWCVti009S3-aTAOgmgk_cH4fXL5MSf6YR5o8O-u043Y2hbJhlwD7Un1N5si38QQThOlIcSRp2Wo9hmXJVfdDhChCWXiwxGmaKspUbcWpavzeurIXMhJ00paTSSbGjlb3omZ3GWvzzdsTSYTTAHCtC28ozEQZWmT3LCWJqm94eUDQbl99KoOPpEVgpSuY9g_Zo0Fx14nSHG371MCdV5TPreCY3tFo6k5G0P7LXAr_8MYP-XGJUmt7Cu_tHgej-NC5WRgKY36wwWA6VQA7JSm8HjvBBv7K3Ht3F0sXIGAif868PS1wwlI6lWChSBCkdjDqQT9uDrYhcMtTn_ltCMqcvJVTt0kHyuv4onmCrDnrnFlvrzO--VIz-7NurF9J8UwoPWYSARbLr3ky4nxme2rf0YXnLBbTHoRo3ycXOeSWBTxXm_nJnhwr4jfjWhBEbg2lIsk_xikY2rWUvyJyq7J6Hj-XO8BdSv0ADGQ6oSwEttjiIVp8l-rdxKf1tt-zrk4zcDmtswmX_kwPg-XslfuWStx1FPpuW6hfy0PwGcE6o8Zh2PrG5yiE_bIKFUFyqcTKRe5VmSK7ndYtlP_MKPWcu9Cmrx9SjcO1qLCwJ1I4TqvbdSpIta1VE9MrTD5bbO3NJZeWr6BsJOZmCDrtMrjltHqqUhtQO5wWypAB_gojwd_WrffzLgUUrLdxRmxLVJClmjV5ZuOsylfI45cSAZQ5ystOSN76xXV-w1CodySUEP-ophitRvgKjxxwpAkkJ_0W00)\n\nC4-PlantUML combines the benefits of [PlantUML](https://plantuml.com/) and the [C4 model](https://c4model.com/) for providing a simple way of describing and communicating software architectures – especially during up-front design sessions – with an intuitive language using open source and platform independent tools.\n\nC4-PlantUML includes macros, stereotypes, and other goodies (like VSCode Snippets) for creating C4 diagrams with PlantUML.\n\n- [📄 C4-PlantUML](#c4-plantuml)\n  - [Getting Started](#getting-started)\n    - [Including the C4-PlantUML library](#including-the-c4-plantuml-library)\n    - [Now let's create a C4 Container diagram](#now-lets-create-a-c4-container-diagram)\n  - [Supported Diagram Types](#supported-diagram-types)\n    - [System Context \\& System Landscape diagrams](#system-context--system-landscape-diagrams)\n    - [Container diagram](#container-diagram)\n    - [Component diagram](#component-diagram)\n    - [Dynamic diagram](#dynamic-diagram)\n    - [Deployment diagram](#deployment-diagram)\n    - [(C4 styled) Sequence diagram](#c4-styled-sequence-diagram)\n    - [Samples](#samples)\n  - [Relationship Types](#relationship-types)\n  - [Layout (arrange) elements (without relationships)](#layout-arrange-elements-without-relationships)\n    - [Compatibility mode `NO_LAY_ROTATE=1`](#compatibility-mode-no_lay_rotate1)\n  - [Global Layout Options](#global-layout-options)\n  - [Sprites and other images](#sprites-and-other-images)\n  - [Custom tags/stereotypes support and skinparam updates](#custom-tagsstereotypes-support-and-skinparam-updates)\n    - [Element specific tag definitions](#element-specific-tag-definitions)\n    - [Boundary specific tag definitions](#boundary-specific-tag-definitions)\n    - [Define a new legend title](#define-a-new-legend-title)\n    - [Comments](#comments)\n    - [Sample with different tag combinations](#sample-with-different-tag-combinations)\n    - [Sample with tag dependent sprites and custom legend text](#sample-with-tag-dependent-sprites-and-custom-legend-text)\n    - [Sample with different boundary tag combinations](#sample-with-different-boundary-tag-combinations)\n    - [Custom schema definitions (via UpdateElementStyle())](#custom-schema-definitions-via-updateelementstyle)\n  - [Element and Relationship properties](#element-and-relationship-properties)\n  - [Version information](#version-information)\n  - [Snippets for Visual Studio Code](#snippets-for-visual-studio-code)\n  - [Live Templates for IntelliJ](#live-templates-for-intellij)\n    - [Prerequisites](#prerequisites)\n    - [Install](#install)\n    - [Usage](#usage)\n  - [Advanced Samples](#advanced-samples)\n    - [techtribes.js](#techtribesjs)\n    - [Message Bus and Microservices](#message-bus-and-microservices)\n    - [(C4 styled) Sequence diagram sample](#c4-styled-sequence-diagram-sample)\n  - [Background](#background)\n  - [License](#license)\n- [📄 Layout Options](LayoutOptions.md#layout-options)\n- [📄 Themes (different styles and languages)](Themes.md#themes)\n- samples\n  - [📄 C4 Model Diagrams](samples/C4CoreDiagrams.md#c4-model-diagrams)\n\n> [!IMPORTANT]\n> **PlantUML v2.12.0:** Layout could be changed based on bugfix.  \nIf `LAYOUT_LANDSCAPE()` is combined with `Lay_*()` calls then the elements are correct positioned based on the new implementation.\nThe old implementation swapped up<->left and down<->right (details see [issue 376](https://github.com/plantuml-stdlib/C4-PlantUML/issues/376)).\nThe old behavior can be re-activated with `!NO_LAY_ROTATE=1`. Details see [Compatibility mode `NO_LAY_ROTATE=1`](#compatibility-mode-no_lay_rotate1).\n\n## Getting Started\n\n### Including the C4-PlantUML library\n\nAt the top of your C4 PlantUML `.puml` file, you need to include the `C4_Context.puml`, `C4_Container.puml` or `C4_Component.puml` file found in the `root` of this repo.\n\nTo be independent of any Internet connectivity, you can download the files found in the `root` and make use of them by supplying the command line argument `-DRELATIVE_INCLUDE=\".\"` to PlantUML:\n\n```bash\njava -jar plantuml.jar -DRELATIVE_INCLUDE=\".\"  ...\n```\n\n> For Visual Studio Code, add the following to your settings.json:\n>\n> ```json\n> \"plantuml.jarArgs\": [\n>   \"-DRELATIVE_INCLUDE=.\"\n> ]\n> ```\n\nIf you want to use the always up-to-date version of the C4-PlantUML library in this repo (which obviously requires an Internet connection every time you render a document), use the following:\n\n[comment]: # (\"!include followed with 2 spaces that it is not replaced during release based branch updates\")\n```plantuml\n!include  https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n```\n\nIf you don't need the up-to-date version, PlantUML includes the last released `C4_...` files as [standard library C4](https://plantuml.com/stdlib#062f75176513a666) \\(no additional files or Internet is required). You can use it with following:\n\n```plantuml\n!include <C4/C4_Container>\n```\n\n### Now let's create a C4 Container diagram\n\n\\(If you don't want run PlantUML locally you can use e.g. the [PlantUML Web Server](https://www.plantuml.com/plantuml/uml/ZOvFIyGm4CNl-HIrfowupSMJfvNrk6BnprccwT069fEGcI3zzhO5YoAAf_VcmVlDEub2rXB8N7bsL0Qi9jKajzPcU6z7hrFfYs1saHLPMnU3JGIyTewY0_dUdc-EtHgzFbni057CI_HsNXhW6NERLhxfC4la9croHnxakgelq2FLYtbCwYC3LVSeBlljgWzcXpJkq_selg2RE58Svpz0pxCeXaOs-UztyuJqVV3lAtR4bpa7Sq8UIg0F) too.)\n\nAfter you have included `C4_Container.puml` you can use the defined macro definitions for the C4 elements: `Person`, `Person_Ext`, `System`, `System_Ext`, `Container`, `Relationship`, `Boundary`, and `System_Boundary`\n\n```plantuml\n@startuml C4_Elements\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nPerson(personAlias, \"Label\", \"Optional Description\")\nContainer(containerAlias, \"Label\", \"Technology\", \"Optional Description\")\nSystem(systemAlias, \"Label\", \"Optional Description\")\n\nRel(personAlias, containerAlias, \"Label\", \"Optional Technology\")\n@enduml\n```\n\n[![test - open link](https://www.plantuml.com/plantuml/svg/ZOvFIyGm4CNl-HIrfowupSMJfvNrk6BnprccwT069fEGcI3zzhO5YoAAf_VcmVlDEub2rXB8N7bsL0Qi9jKajzPcU6z7hrFfYs1saHLPMnU3JGIyTewY0_dUdc-EtHgzFbni057CI_HsNXhW6NERLhxfC4la9croHnxakgelq2FLYtbCwYC3LVSeBlljgWzcXpJkq_selg2RE58Svpz0pxCeXaOs-UztyuJqVV3lAtR4bpa7Sq8UIg0F \"test\")](https://www.plantuml.com/plantuml/uml/ZOvFIyGm4CNl-HIrfowupSMJfvNrk6BnprccwT069fEGcI3zzhO5YoAAf_VcmVlDEub2rXB8N7bsL0Qi9jKajzPcU6z7hrFfYs1saHLPMnU3JGIyTewY0_dUdc-EtHgzFbni057CI_HsNXhW6NERLhxfC4la9croHnxakgelq2FLYtbCwYC3LVSeBlljgWzcXpJkq_selg2RE58Svpz0pxCeXaOs-UztyuJqVV3lAtR4bpa7Sq8UIg0F)\n\nIn addition to this, it is also possible to define a system or component boundary.\n\nTake a look at the following sample of a C4 Container Diagram:\n\n```plantuml\n@startuml Basic Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, \"Sample System\") {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n@enduml\n```\n\n[![Basic Sample - open link](https://www.plantuml.com/plantuml/svg/JK_BJkim4DtdA-RcRbAfJLJ4YbL3X611KKHIM5PECb1BVbZsM565-7V6QcdnPkGvZpbd4qXuYbfb_wGPLPmG3aGkt5ML5tFvAUaGXnZGZzOG6Yf7gokdX4cQLQ19oQ5gRbTjMksspvKMWT3pQj-mGaY3ldJ9FslH1siACMbfbf3NQSf0Nf3r-IBhZYpK-tiRpIJyiHZNJEg4TWhXXEKB-Cg0tyMvc77O2-UO-Ou3rCufEGgIrkIyQluleUxQykMXPub7k2dNi7rh4bOhPUS0gLa0ii2rd62AZefaEjdFahW8aDIe-5RWYD_da0MTGFOvqnZCNb7zbhl6sWLMydpg-xPZLY9TqAlD8rBWBwRnuQt-AzcWcQ9MFm00 \"Basic Sample\")](https://www.plantuml.com/plantuml/uml/JK_BJkim4DtdA-RcRbAfJLJ4YbL3X611KKHIM5PECb1BVbZsM565-7V6QcdnPkGvZpbd4qXuYbfb_wGPLPmG3aGkt5ML5tFvAUaGXnZGZzOG6Yf7gokdX4cQLQ19oQ5gRbTjMksspvKMWT3pQj-mGaY3ldJ9FslH1siACMbfbf3NQSf0Nf3r-IBhZYpK-tiRpIJyiHZNJEg4TWhXXEKB-Cg0tyMvc77O2-UO-Ou3rCufEGgIrkIyQluleUxQykMXPub7k2dNi7rh4bOhPUS0gLa0ii2rd62AZefaEjdFahW8aDIe-5RWYD_da0MTGFOvqnZCNb7zbhl6sWLMydpg-xPZLY9TqAlD8rBWBwRnuQt-AzcWcQ9MFm00)\n\nEntities can also be decorated with icons/sprites using the $sprite parameter, for example:\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\n!define DEVICONS https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons\n!define FONTAWESOME https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/font-awesome-5\n!include DEVICONS/angular.puml\n!include DEVICONS/java.puml\n!include DEVICONS/msql_server.puml\n!include FONTAWESOME/users.puml\n\nLAYOUT_WITH_LEGEND()\n\nPerson(user, \"Customer\", \"People that need products\", $sprite=\"users\")\nContainer(spa, \"SPA\", \"angular\", \"The main interface that the customer interacts with\", $sprite=\"angular\")\nContainer(api, \"API\", \"java\", \"Handles all business logic\", $sprite=\"java\")\nContainerDb(db, \"Database\", \"Microsoft SQL\", \"Holds product, order and invoice information\", $sprite=\"msql_server\")\n\nRel(user, spa, \"Uses\", \"https\")\nRel(spa, api, \"Uses\", \"https\")\nRel_R(api, db, \"Reads/Writes\")\n@enduml\n```\n\n[![Sprites/Icons - open link](https://www.plantuml.com/plantuml/svg/hP9BZzem4CVl-HHUr0ChBPj3sqkbIek0Tf5uK1v5FQ59F05NZfrw9l3rEmvXD-f3wg4dE_EV-VyyCtaYXi1rQPCxut9RQrGdvee-f6c0o-FHyAdEQiAGUyVe-37tPLfPSB5cGAojoTBHky4gXdRpMLe2CGO97KPI0SPXUAoYVtAdiP1FDPvydOwMYyq_WBYkG8Uthq0Zwg2GZ05LmJ3IZQVn73LweNnQBhR3_MIpd4_-AwY9mGN9bpXu_pgrMrSfk6DjeMtwT_axdE5lMaa_x84mdF7NyautQNmxjJET3RyjTzl3VhfzFimcdoUBSVy-ILQIu5q_9ZwetgWczYM6djnNw2kBYa_0oY5gLGMlwvn9n3VNJZ_s6a3lFdbPO9ygaEBDQXWzsWRZTNj2LKgACeun592trYpnlCLUDH26kiZikw2RKnS5bH7ZuMeQ_UEmulaCJbia1TOgsPqa4YdhZoRlsiNihjSuw-jCgiV0a05XT9gRF7Zo1QlDbrbZxQscsnWUb0yQWnASFFliJOvo5ZwKmCQxBgopAs4cQxJjlA-psX5Ij6z-FKc8UgD8Vt-M3-jhxysJrmYQqdr4HVa9dPPz_mG0 \"Sprites/Icons\")](https://www.plantuml.com/plantuml/uml/hP9BZzem4CVl-HHUr0ChBPj3sqkbIek0Tf5uK1v5FQ59F05NZfrw9l3rEmvXD-f3wg4dE_EV-VyyCtaYXi1rQPCxut9RQrGdvee-f6c0o-FHyAdEQiAGUyVe-37tPLfPSB5cGAojoTBHky4gXdRpMLe2CGO97KPI0SPXUAoYVtAdiP1FDPvydOwMYyq_WBYkG8Uthq0Zwg2GZ05LmJ3IZQVn73LweNnQBhR3_MIpd4_-AwY9mGN9bpXu_pgrMrSfk6DjeMtwT_axdE5lMaa_x84mdF7NyautQNmxjJET3RyjTzl3VhfzFimcdoUBSVy-ILQIu5q_9ZwetgWczYM6djnNw2kBYa_0oY5gLGMlwvn9n3VNJZ_s6a3lFdbPO9ygaEBDQXWzsWRZTNj2LKgACeun592trYpnlCLUDH26kiZikw2RKnS5bH7ZuMeQ_UEmulaCJbia1TOgsPqa4YdhZoRlsiNihjSuw-jCgiV0a05XT9gRF7Zo1QlDbrbZxQscsnWUb0yQWnASFFliJOvo5ZwKmCQxBgopAs4cQxJjlA-psX5Ij6z-FKc8UgD8Vt-M3-jhxysJrmYQqdr4HVa9dPPz_mG0)\n\nSimilar to icons/sprites is it possible to add links to all elements and relationships:\n\n```plantuml\n@startuml Basic Sample\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nPerson(admin, \"Administrator\", $sprite=\"person2\", $link=\"https://github.com/plantuml-stdlib/C4-PlantUML/blob/master/LayoutOptions.md#hide_person_sprite-or-show_person_spritesprite\")\nSystem_Boundary(c1, \"Sample System\", $link=\"https://github.com/plantuml-stdlib/C4-PlantUML\") {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", $descr=\"Allows users to compare multiple Twitter timelines\", $link=\"https://github.com/plantuml-stdlib/C4-PlantUML/blob/master/LayoutOptions.md\")\n}\nSystem(twitter, \"Twitter\", $link=\"https://github.com/plantuml-stdlib/C4-PlantUML\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\", $link=\"https://plantuml.com/link\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\", $link=\"https://plantuml.com/link\")\n@enduml\n```\n\n> `png` itself supports no links, therefore the following image is generated as `svg` image.\n> Github does not support `svg` links in README.md.\n> If you click on the image a new window is opened and there you can use the links.\n\n[![Click on the image that the links are working - open link](https://www.plantuml.com/plantuml/svg/jP9FYzH04CNl-HHjhuTPc4dOnPCmiECWUjZLOB9w39rqQHhxJrDL8GpYTxTxizb5F8W3vf0chrBl_NZ93R52dfmjNXW_s4c369aZlQugL7FvpV0uzHC13i4pU2w7uAfebSyxEs9jJLyTN-tgBDtVtLPE4GCcgJkc3MKyO1cpVr43Kl0RfPtnMo4F-JJ4g3YWt8gN5D4mx6LyUEywIzRuxtkv0YqmVoNeRUXNZ5jr2XD_Z6o2fzBfYz5ew9Q4RWdS1TpH6ERVrUKkBulcb8nSzoPCNYiyROQhnDue5os8PNOkgBmKFmgHhgUYDZFqdOen9No1NXnYj6PGcLqcwNYn5OUcBZ-yRTCAWhWkhyJTvsFErq03xkN1sZ2JoD-B10UH2A9246woR39nEnjcGC76GM86-Yyjfzf-FXQtuIKnyJzcdrzNKNm2k_u_prNT4r3kvttRrisVxglbWtyU9QFiysJmJFWEcD8ZvECh1lUFhZVWTP9-0G00 \"Click on the image that the links are working\")](https://www.plantuml.com/plantuml/uml/jP9FYzH04CNl-HHjhuTPc4dOnPCmiECWUjZLOB9w39rqQHhxJrDL8GpYTxTxizb5F8W3vf0chrBl_NZ93R52dfmjNXW_s4c369aZlQugL7FvpV0uzHC13i4pU2w7uAfebSyxEs9jJLyTN-tgBDtVtLPE4GCcgJkc3MKyO1cpVr43Kl0RfPtnMo4F-JJ4g3YWt8gN5D4mx6LyUEywIzRuxtkv0YqmVoNeRUXNZ5jr2XD_Z6o2fzBfYz5ew9Q4RWdS1TpH6ERVrUKkBulcb8nSzoPCNYiyROQhnDue5os8PNOkgBmKFmgHhgUYDZFqdOen9No1NXnYj6PGcLqcwNYn5OUcBZ-yRTCAWhWkhyJTvsFErq03xkN1sZ2JoD-B10UH2A9246woR39nEnjcGC76GM86-Yyjfzf-FXQtuIKnyJzcdrzNKNm2k_u_prNT4r3kvttRrisVxglbWtyU9QFiysJmJFWEcD8ZvECh1lUFhZVWTP9-0G00)\n\nElements and relationships can be decorated with tags and explained via a calculated legend, for example:\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nAddElementTag(\"v1.0\", $borderColor=\"#d73027\")\nAddElementTag(\"v1.1\", $fontColor=\"#d73027\")\nAddElementTag(\"backup\", $fontColor=\"orange\")\n\nAddRelTag(\"backup\", $textColor=\"orange\", $lineColor=\"orange\", $lineStyle = DashedLine())\n\nPerson(user, \"Customer\", \"People that need products\")\nPerson(admin, \"Administrator\", \"People that administrates the products via the new v1.1 components\", $tags=\"v1.1\")\nContainer(spa, \"SPA\", \"angular\", \"The main interface that the customer interacts with via v1.0\", $tags=\"v1.0\")\nContainer(spaAdmin, \"Admin SPA\", \"angular\", \"The administrator interface that the customer interacts with via new v1.1\", $tags=\"v1.1\")\nContainer(api, \"API\", \"java\", \"Handles all business logic (incl. new v1.1 extensions)\", $tags=\"v1.0+v1.1\")\nContainerDb(db, \"Database\", \"Microsoft SQL\", \"Holds product, order and invoice information\")\nContainer(archive, \"Archive\", \"Audit logging\", \"Stores 5 years\", $tags=\"backup\")\n\nRel(user, spa, \"Uses\", \"https\")\nRel(spa, api, \"Uses\", \"https\")\nRel_R(api, db, \"Reads/Writes\")\nRel(admin, spaAdmin, \"Uses\", \"https\")\nRel(spaAdmin, api, \"Uses\", \"https\")\nRel_L(api, archive, \"Writes\", \"messages\", $tags=\"backup\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![tags - open link](https://www.plantuml.com/plantuml/svg/bLJTRjfC4BtFK-pdhnT6JN3I7qMgX1G4gAb4MWg9Sed6ti5ikzwrTjRGl7rdrn08jLBrQj7CcJbppeov8G_EDvK--q-PGZSInThxcZvbcODjlrH-tUGDeIkiyMXylx1LLcimeUQ2lDGgpqOVBcOXz70tpIeWZuv3on5NW3Be-dNeVpQKSgAnuYRtKAR9vgf_cPoBDxbr4jt8Qki6oV_o-ltbk-karu6-2kWLD_qRDeVYPrEVeAq3KoA30tgE-WJfyTS9aeEQf-yCBloJHZ4GOw0roYb7qXvtdg4ZQz9Wrxb8HWrvMw7ZecI6jkOAlmOl3A8KjREoAJmblNqLo4ePXWx3gyWxyFQFMZWaaJY4put4Ha4C6DoAu9RWJTNMi2aK1K99WsWZKpwl9gKQc68n6mOcbjXeYAJttAbYY536erj1qGuG6OgTi3O7WNpBTn8dY5izfhiyfHiUwnJTp73imR-Ei3VW5TLGgp31x4iW_04R2Eyj6AcH16Wj-EGPI2IqBLKXql1jz0_Myh6W8MKDzLwAVNjADSvJcNFpCNZ8WJ0GtQd2MR8hBnRVfv7PQadxJPwB-448deRLRQmgaD-LTHLuPdofmnLhjS6WfVsLX9-DL3uCNYfJXi22JMHT7yKJWZiSm_xw-N3dg7TNszx30o65olXNm82GZnashZkzdBUcHh5p14dPerCUT-dzTH_jlvkZJRz6D6s93j9RdW2ha0XAx9IukFtsk9nEFa--ZjFUsGqQsLJwDm00 \"tags\")](https://www.plantuml.com/plantuml/uml/bLJTRjfC4BtFK-pdhnT6JN3I7qMgX1G4gAb4MWg9Sed6ti5ikzwrTjRGl7rdrn08jLBrQj7CcJbppeov8G_EDvK--q-PGZSInThxcZvbcODjlrH-tUGDeIkiyMXylx1LLcimeUQ2lDGgpqOVBcOXz70tpIeWZuv3on5NW3Be-dNeVpQKSgAnuYRtKAR9vgf_cPoBDxbr4jt8Qki6oV_o-ltbk-karu6-2kWLD_qRDeVYPrEVeAq3KoA30tgE-WJfyTS9aeEQf-yCBloJHZ4GOw0roYb7qXvtdg4ZQz9Wrxb8HWrvMw7ZecI6jkOAlmOl3A8KjREoAJmblNqLo4ePXWx3gyWxyFQFMZWaaJY4put4Ha4C6DoAu9RWJTNMi2aK1K99WsWZKpwl9gKQc68n6mOcbjXeYAJttAbYY536erj1qGuG6OgTi3O7WNpBTn8dY5izfhiyfHiUwnJTp73imR-Ei3VW5TLGgp31x4iW_04R2Eyj6AcH16Wj-EGPI2IqBLKXql1jz0_Myh6W8MKDzLwAVNjADSvJcNFpCNZ8WJ0GtQd2MR8hBnRVfv7PQadxJPwB-448deRLRQmgaD-LTHLuPdofmnLhjS6WfVsLX9-DL3uCNYfJXi22JMHT7yKJWZiSm_xw-N3dg7TNszx30o65olXNm82GZnashZkzdBUcHh5p14dPerCUT-dzTH_jlvkZJRz6D6s93j9RdW2ha0XAx9IukFtsk9nEFa--ZjFUsGqQsLJwDm00)\n\n## Supported Diagram Types\n\n> - `arg`: argument required (e.g. `alias`)\n> - `?arg`: argument optional (e.g. `?tags`); an optional argument can be directly set via its keyword `$arg=...` (e.g. `$tags=\"specificTag\"`) without the other optional arguments\n\n### System Context & System Landscape diagrams\n\n  - Import: `!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml`\n  - Macros:\n    - `Person(alias, label, ?descr, ?sprite, ?tags, ?link, ?type)`\n    - `Person_Ext(alias, label, ?descr, ?sprite, ?tags, ?link, ?type)`\n    - `System(alias, label, ?descr, ?sprite, ?tags, ?link, ?type, ?baseShape)`\n    - `SystemDb(alias, label, ?descr, ?sprite, ?tags, ?link, ?type)`\n    - `SystemQueue(alias, label, ?descr, ?sprite, ?tags, ?link, ?type)`\n    - `System_Ext(alias, label, ?descr, ?sprite, ?tags, ?link, ?type, ?baseShape)`\n    - `SystemDb_Ext(alias, label, ?descr, ?sprite, ?tags, ?link, ?type)`\n    - `SystemQueue_Ext(alias, label, ?descr, ?sprite, ?tags, ?link, ?type)`\n    - `Boundary(alias, label, ?type, ?tags, ?link, ?descr)`\n    - `Enterprise_Boundary(alias, label, ?tags, ?link, ?descr)`\n    - `System_Boundary(alias, label, ?tags, ?link, ?descr)`\n  - Sprites:\n    - `person`\n    - `person2`\n    - `robot`\n    - `robot2`\n\n  - C4 Model extension: Person() and System() support `$type` argument too. Is uses the same notation as `$techn`, e.g. `$type=\"characteristic A\"` is displayed as `[characteristic A]`\n\n### Container diagram\n\n  - Import: `!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml`\n  - Additional Macros  (based on context diagram macros):\n    - `Container(alias, label, ?techn, ?descr, ?sprite, ?tags, ?link, ?baseShape)`\n    - `ContainerDb(alias, label, ?techn, ?descr, ?sprite, ?tags, ?link)`\n    - `ContainerQueue(alias, label, ?techn, ?descr, ?sprite, ?tags, ?link)`\n    - `Container_Ext(alias, label, ?techn, ?descr, ?sprite, ?tags, ?link, ?baseShape)`\n    - `ContainerDb_Ext(alias, label, ?techn, ?descr, ?sprite, ?tags, ?link)`\n    - `ContainerQueue_Ext(alias, label, ?techn, ?descr, ?sprite, ?tags, ?link)`\n    - `Container_Boundary(alias, label, ?tags, ?link, ?descr)`\n\n### Component diagram\n\n  - Import: `!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml`\n  - Additional Macros (based on container diagram macros):\n    - `Component(alias, label, ?techn, ?descr, ?sprite, ?tags, ?link, ?baseShape)`\n    - `ComponentDb(alias, label, ?techn, ?descr, ?sprite, ?tags, ?link)`\n    - `ComponentQueue(alias, label, ?techn, ?descr, ?sprite, ?tags, ?link)`\n    - `Component_Ext(alias, label, ?techn, ?descr, ?sprite, ?tags, ?link, ?baseShape)`\n    - `ComponentDb_Ext(alias, label, ?techn, ?descr, ?sprite, ?tags, ?link)`\n    - `ComponentQueue_Ext(alias, label, ?techn, ?descr, ?sprite, ?tags, ?link)`\n\n### Dynamic diagram\n\n  - Import: `!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Dynamic.puml`\n  - Additional Macros (based on component diagram macros):\n    - (lowercase) `increment($offset=1)`: increase current index (procedure which has no direct output)\n    - (lowercase) `setIndex($new_index)`: set the new index (procedure which has no direct output)\n    - `LastIndex()`: return the last used index (function which can be used as argument)\n\n    following 2 macros requires V1.2020.24Beta4 (can be already tested with <https://www.plantuml.com/plantuml/>)\n    - `Index($offset=1)`: returns current index and calculates next index (function which can be used as argument)\n    - `SetIndex($new_index)`: returns new set index and calculates next index (function which can be used as argument)\n\n  -  All relationship macros are extended with `?index= `:\n\n     > All `RelIndex...()` calls are obsolete and can be replaced with calls like Rel($index=..., ...) or Rel(..., $index=).\n     > A full sample see [samples/C4_Dynamic Diagram Sample - message bus.puml](samples/C4_Dynamic%20Diagram%20Sample%20-%20message%20bus.puml)\n\n### Deployment diagram\n\n  - Import: `!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml`\n  - Additional Macros (based on **container** diagram macros):\n    - `Deployment_Node(alias, label, ?type, ?descr, ?sprite, ?tags, ?link)`\n    - `Node(alias, label, ?type, ?descr, ?sprite, ?tags, ?link)`: short name of Deployment_Node()\n    - `Node_L(alias, label, ?type, ?descr, ?sprite, ?tags, ?link)`: left aligned Node()\n    - `Node_R(alias, label, ?type, ?descr, ?sprite, ?tags, ?link)`: right aligned Node()\n\n### (C4 styled) Sequence diagram\n\nC4-PlantUML **does not offer** a full sequence diagram support,\nbut existing elements and relationships can be reused as participants and calls in the corresponding styles.\n\n> **!!! Contrary to all other diagrams, please define boundaries without `{` and `}` and mark a boundary end with `Boundary_End()` !!!**\n\n  - Import: `!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Sequence.puml`\n  - Macros (based on **component** diagram macros):\n    - Basically all element specific macros (Person, System, Container...) can be reused with following differences:\n      - element descriptions are typically not displayed (can be activated via SHOW_ELEMENT_DESCRIPTIONS())\n      - **boundaries have to be defined without `{` and `}`** and instead of `}` the **`Boundary_End()`** macro has to be called\n    - Additional (element specific) Macros:\n      - `Boundary_End()`\n    - Additional Layout Options:\n      - `SHOW_ELEMENT_DESCRIPTIONS(?show)`\n      - `SHOW_FOOT_BOXES(?show)`\n      - `SHOW_INDEX(?show)`\n    - Only following (extended) relationship specific macros is supported:\n      - `Rel($from, $to, $label, $techn=\"\", $descr=\"\", $sprite=\"\", $tags=\"\", $link=\"\", $index=\"\", $rel=\"\")`  \n        `$index` enables the definition of active/next index with e.g. the related index macros below  \n        `$rel` enables the definition of all PlantUML specific arrow types, details see e.g.\n        [All arrow types](https://plantuml.com/sequence-diagram#4764f83f72ed032f) and\n        [Slanted or odd arrows](https://plantuml.com/sequence-diagram#5bd6712206960fab)\n    - The index related macros (like the dynamic diagram)\n      - `Index($offset=1)`: returns current index and calculates next index (function which can be used as argument)\n      - `SetIndex($new_index)`: returns new set index and calculates next index (function which can be used as argument)\n      - `LastIndex()`: return the last used index (function which can be used as argument)\n      - (lowercase) `increment($offset=1)`: increase current index (procedure which has no direct output)\n      - (lowercase) `setIndex($new_index)`: set the new index (procedure which has no direct output)\n\n  - (Typically additional used) PlantUML statements:\n    - [Grouping message](https://plantuml.com/sequence-diagram#425ba4350c02142c)\n    - [Divider or separator](https://plantuml.com/sequence-diagram#d4b2df53a72661cc)\n    - [Reference](https://plantuml.com/sequence-diagram#63d5049791d9d79d)\n    - [Delay](https://plantuml.com/sequence-diagram#8f497c1a3d15af9e)\n\n### Samples\n\nTake a look at each of the [C4 Model Diagram Samples](samples/C4CoreDiagrams.md).\n\n## Relationship Types\n\n- `Rel(from, to, label, ?techn, ?descr, ?sprite, ?tags, ?link)`\n- `BiRel` (bidirectional relationship)\n\nYou can force the direction of a relationship by using:\n\n- `Rel_U`, `Rel_Up`\n- `Rel_D`, `Rel_Down`\n- `Rel_L`, `Rel_Left`\n- `Rel_R`, `Rel_Right`\n\nIn following sample a person uses different systems, and a group of persons which have bidirectional relationships\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\nHIDE_STEREOTYPE()\n\nPerson(a, \"A\")\nPerson(b, \"B\")\nPerson(c, \"C\")\nPerson(d, \"D\")\nPerson(e, \"E\")\n\nBiRel_U(a, b, \"talk with\")\nBiRel_R(a, c, \"talk with\")\nBiRel_D(a, d, \"talk with\")\nBiRel_L(a, e, \"talk with\")\n\nPerson(x, \"X\")\nSystem(s1, \"S1\")\nSystem(s2, \"S2\")\nSystem(s3, \"S3\")\nSystem(s4, \"S4\")\n\nRel_U(x, s1, \"uses\")\nRel_R(x, s2, \"uses\")\nRel_D(x, s3, \"uses\")\nRel_L(x, s4, \"uses\")\n@enduml\n```\n\n[![(unidirectional) relationship versus bidirectional relationship - open link](https://www.plantuml.com/plantuml/svg/RP11QuD044Rl_eeq9mED4lNKKneLMh1KD87s9AiEZNHTPNSaxR_lZ59KoF6zntuCUpGeD0wjj1uQLScXXiqLiJTFhgl5pVbgy3gKWm5TTGf1eLDrhTjBeVZDtc0jcz8DWttAwlAMkAqm29fK4T8BqIZGJi_xBwzHNEJdE8lVpvzfREyiAmLjEcMBnytsURlxnvBmD6D56CvO4qOp0c5CQ9sQ36HnuJ4UG26_DpUwdjgKCaxLtHHngk-cX1Eiqdpu3_aFulpN8BIsEH3dXuNmM7WBuRFm5o9W4V3cT3vDZZE30KDsEfobjvRHAFsrJ4OPpF88ggQ__mC0 \"(unidirectional) relationship versus bidirectional relationship\")](https://www.plantuml.com/plantuml/uml/RP11QuD044Rl_eeq9mED4lNKKneLMh1KD87s9AiEZNHTPNSaxR_lZ59KoF6zntuCUpGeD0wjj1uQLScXXiqLiJTFhgl5pVbgy3gKWm5TTGf1eLDrhTjBeVZDtc0jcz8DWttAwlAMkAqm29fK4T8BqIZGJi_xBwzHNEJdE8lVpvzfREyiAmLjEcMBnytsURlxnvBmD6D56CvO4qOp0c5CQ9sQ36HnuJ4UG26_DpUwdjgKCaxLtHHngk-cX1Eiqdpu3_aFulpN8BIsEH3dXuNmM7WBuRFm5o9W4V3cT3vDZZE30KDsEfobjvRHAFsrJ4OPpF88ggQ__mC0)\n\n## Layout (arrange) elements (without relationships)\n\nIn rare cases, you can force the layout of elements which have no relationships by using:\n\n- `Lay_U(from, to)`, `Lay_Up(from, to)`\n- `Lay_D(from, to)`, `Lay_Down(from, to)`\n- `Lay_L(from, to)`, `Lay_Left(from, to)`\n- `Lay_R(from, to)`, `Lay_Right(from, to)`\n\nIn following sample a person uses different systems, and a group of persons which have no relationships\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\nHIDE_STEREOTYPE()\n\nPerson(a, \"A\")\nPerson(b, \"B\")\nPerson(c, \"C\")\nPerson(d, \"D\")\nPerson(e, \"E\")\n\nLay_U(a, b)\nLay_R(a, c)\nLay_D(a, d)\nLay_L(a, e)\n\nPerson(x, \"X\")\nSystem(s1, \"S1\")\nSystem(s2, \"S2\")\nSystem(s3, \"S3\")\nSystem(s4, \"S4\")\n\nRel_U(x, s1, \"uses\")\nRel_R(x, s2, \"uses\")\nRel_D(x, s3, \"uses\")\nRel_L(x, s4, \"uses\")\n@enduml\n```\n\n[![Relationship versus Layout - open link](https://www.plantuml.com/plantuml/svg/LSt1QeD04CRnkq-HvgJGA55FFQLLeGLBHIEq9rbrQ8HrbTrPshnzPmn5Svl_3_RRaq6XqOxIUHXK9sqFkmlYR9w2G8iV_tl0Yssj0TrD2a6XtqrZC4kX-Ct1O2-7DaZYGy5Kl-V1A0o29ceIUY461TgVUV_rBSsQwfoLsSVvgyXSpt4Aq6PIhdZSxP_ttd-sb2zhTfJ9cZrbkYPGPfHEBgvDpLEjjzmbtztjJldkRtVEDwoV_zB09mrKLuCmkkP8NHqt43A46uWOeWt43361Ku9iQfvSPgm1GyfOBXZUOxfWT8_vWl6A9r2z7UKV \"Relationship versus Layout\")](https://www.plantuml.com/plantuml/uml/LSt1QeD04CRnkq-HvgJGA55FFQLLeGLBHIEq9rbrQ8HrbTrPshnzPmn5Svl_3_RRaq6XqOxIUHXK9sqFkmlYR9w2G8iV_tl0Yssj0TrD2a6XtqrZC4kX-Ct1O2-7DaZYGy5Kl-V1A0o29ceIUY461TgVUV_rBSsQwfoLsSVvgyXSpt4Aq6PIhdZSxP_ttd-sb2zhTfJ9cZrbkYPGPfHEBgvDpLEjjzmbtztjJldkRtVEDwoV_zB09mrKLuCmkkP8NHqt43A46uWOeWt43361Ku9iQfvSPgm1GyfOBXZUOxfWT8_vWl6A9r2z7UKV)\n\n(In combination with [SHOW_FLOATING_LEGEND()](LayoutOptions.md#show_floating_legendalias-hidestereotype-details-and-legend)) a greater distance between an element and the\ne.g. floating legend could be required that all e.g. corners of the drawing area can be reached.\n\n- `Lay_Distance(from, to, ?distance)`: Sets the distance between `from` and `to` with down alignment (Lay_Distance(from,to,0) equals Lay_D(from, to)). The default alias of the floating legend is LEGEND().\n\nIn following sample the floating legend should be in the left bottom corner of the drawing are.\n(The normal SHOW_LEGEND() call requires no extra Lay_Distance() call and the legend is automatically drawn below the diagram on the right side)\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\n!define DEVICONS https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons\n!define FONTAWESOME https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/font-awesome-5\n!include DEVICONS/angular.puml\n!include DEVICONS/java.puml\n!include DEVICONS/msql_server.puml\n!include FONTAWESOME/users.puml\n\nPerson(user, \"Customer\", \"People that need products\", $sprite=\"users\")\nContainer(spa, \"SPA\", \"angular\", \"The main interface that the customer interacts with\", $sprite=\"angular\")\nContainer(api, \"API\", \"java\", \"Handles all business logic\", $sprite=\"java\")\nContainerDb(db, \"Database\", \"Microsoft SQL\", \"Holds product, order and invoice information\", $sprite=\"msql_server\")\n\nRel(user, spa, \"Uses\")\nRel(spa, api, \"Uses\")\nRel_R(api, db, \"Reads/Writes\")\n\nSHOW_FLOATING_LEGEND()\nLay_Distance(LEGEND(), db, 1)\n@enduml\n```\n\n[![db below legend, 1 unit distance - open link](https://www.plantuml.com/plantuml/svg/hL5DZzem4BtdLtXH3o0jH5NRIwLAYu3THUA30bkEqH0FuCgnKyy4r7_VCIIxKQjAFVGKvptFUtvl7eWXS5NOvCwut5OQrOcvfCzf6k0oE1e-LVkACEJUCJeUvBv8ImikplI9jJNxTFInluhGotoM5a2CGQ1i91DW78P16VMJEuq7-LNZoRVfQBdO_8CHLoNeyE7Dq0ZRFyYDFfN1C5BZf_4SENfrULmkjiFTPBESJ_whqHM32v8liF-fQUqjLGhkM5ceG_z9VuSp_8qhw8VD2CCPVnjlfqdZswdkT2L7xxeHkbUTKKNi2mmTEQ_GbnOLdu2LGzIg35vNEPEGxswPldIkKfrUyhggBfKWmvlLC6hKKU9nUq9Lo1Lb76CuG5vBi-1vRNlZG3pKHLfk6pLARIieZGWFLzEe7sk9tsTmsY8fi5R9bkGYaRB-QFAsNBpTrXhlktelqsDWs0DXL9gRF7Zo1rQRhxEhjBUQcXhkbGyQWn8xUVRPcnpbU_2X03RUjSrQMn7FP8ssxllMrGiX2HxXAn1ZjT5iVKjwVU0QGLEwYyAHJZRFortsE5iEjzF5KpQRF4qMusulcS7FR6o8mUNORT2RnFjUye1Eo_P_0G00 \"db below legend, 1 unit distance\")](https://www.plantuml.com/plantuml/uml/hL5DZzem4BtdLtXH3o0jH5NRIwLAYu3THUA30bkEqH0FuCgnKyy4r7_VCIIxKQjAFVGKvptFUtvl7eWXS5NOvCwut5OQrOcvfCzf6k0oE1e-LVkACEJUCJeUvBv8ImikplI9jJNxTFInluhGotoM5a2CGQ1i91DW78P16VMJEuq7-LNZoRVfQBdO_8CHLoNeyE7Dq0ZRFyYDFfN1C5BZf_4SENfrULmkjiFTPBESJ_whqHM32v8liF-fQUqjLGhkM5ceG_z9VuSp_8qhw8VD2CCPVnjlfqdZswdkT2L7xxeHkbUTKKNi2mmTEQ_GbnOLdu2LGzIg35vNEPEGxswPldIkKfrUyhggBfKWmvlLC6hKKU9nUq9Lo1Lb76CuG5vBi-1vRNlZG3pKHLfk6pLARIieZGWFLzEe7sk9tsTmsY8fi5R9bkGYaRB-QFAsNBpTrXhlktelqsDWs0DXL9gRF7Zo1rQRhxEhjBUQcXhkbGyQWn8xUVRPcnpbU_2X03RUjSrQMn7FP8ssxllMrGiX2HxXAn1ZjT5iVKjwVU0QGLEwYyAHJZRFortsE5iEjzF5KpQRF4qMusulcS7FR6o8mUNORT2RnFjUye1Eo_P_0G00)\n\n### Compatibility mode `NO_LAY_ROTATE=1`\n\nBased on the bugfix of [issue 376](https://github.com/plantuml-stdlib/C4-PlantUML/issues/376)\nthe layout of old diagrams could be changed if they contain a combination of\n`LAYOUT_LANDSCAPE()` and `Lay_*()` commands like below.\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\nLAYOUT_LANDSCAPE()\n\nPerson(a, \"A\")\nSystem(sUp, \"B up\\nbefore bugfix left\")\nSystem(sRight, \"C right\\nbefore bugfix down\")\nSystem(sDown, \"D down\\nbefore bugfix right\")\nSystem(sLeft, \"E left\\nbefore bugfix up\")\n\nLay_U(a, sUp)\nLay_R(a, sRight)\nLay_D(a, sDown)\nLay_L(a, sLeft)\n\nHIDE_STEREOTYPE()\n@enduml\n```\n\n[![bugfix changes old layout - open link](https://www.plantuml.com/plantuml/svg/NP3FQeGm6CJlFaMw9uMkNdhgQQqABQHTySzXeI1HemPY3CaNjllsJR8NyPOPVZFVa8i6ei2iF7XXOk1cf6W1aFezIHIvnpE3nVH6KpLi0gY0UDZMH78YNEQiOUIiJxAtS-cizXidAz50bRMwp2O84rJ5qlNZz7PjcmwdFtcTfMKHHa5GKgKt4P9NT4fFKL0_R7ODTIkjyO6C_1KzdJP5KM_cYVqXJYVOSHMR5x1eXfHx7UbnkuiTdLjfuTpxHzONx61C9zTS-9D7s4XB1fWykjPjjtiZhogl_AgdaJl37tvgxBJljldFhxpewgQeYcjpy_zneM8qA_y7 \"bugfix changes old layout\")](https://www.plantuml.com/plantuml/uml/NP3FQeGm6CJlFaMw9uMkNdhgQQqABQHTySzXeI1HemPY3CaNjllsJR8NyPOPVZFVa8i6ei2iF7XXOk1cf6W1aFezIHIvnpE3nVH6KpLi0gY0UDZMH78YNEQiOUIiJxAtS-cizXidAz50bRMwp2O84rJ5qlNZz7PjcmwdFtcTfMKHHa5GKgKt4P9NT4fFKL0_R7ODTIkjyO6C_1KzdJP5KM_cYVqXJYVOSHMR5x1eXfHx7UbnkuiTdLjfuTpxHzONx61C9zTS-9D7s4XB1fWykjPjjtiZhogl_AgdaJl37tvgxBJljldFhxpewgQeYcjpy_zneM8qA_y7)\n\nThe new repositioning of the elements could damage old diagrams.\nTherefore a compatibility mode NO_LAY_ROTATE is introduced.\nThis mode can be directly activated in the old diagrams with `!NO_LAY_ROTATE=1`\nor with the additional command line argument `-DNO_LAY_ROTATE=1` (like `java -jar plantuml.jar -DNO_LAY_ROTATE=1 ...`)\n\nIf this value is set then non of the Lay_*() calls itself has to be updated like below.\n\n```plantuml\n@startuml\n'  the bugfix is deactivated with following statement\n!NO_LAY_ROTATE = 1\n\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\nLAYOUT_LANDSCAPE()\n\nPerson(a, \"A\")\nSystem(sUp, \"B up\\nbefore bugfix left\")\nSystem(sRight, \"C right\\nbefore bugfix down\")\nSystem(sDown, \"D down\\nbefore bugfix right\")\nSystem(sLeft, \"E left\\nbefore bugfix up\")\n\nLay_U(a, sUp)\nLay_R(a, sRight)\nLay_D(a, sDown)\nLay_L(a, sLeft)\n\nHIDE_STEREOTYPE()\n@enduml\n```\n\n[![deactivated bugfix reproduces old layout - open link](https://www.plantuml.com/plantuml/svg/NP1HQxim5CNVyobk-_9luT_AO4-3GPqA6xXQh3uK1X8rQa2Z93Tp_VQxfZ1Att8EltFFpJqOv1hjqBD_0DW9A6tRo1-G1ch1AvJV74KDiyGEch7lnrcg5WoIEmY5R7LCYjY_56cI-La4h_34s4ggghUrW0vnCY-Uf_cyRsc2BQqHkXeLKdHVZOCtzLmjxJk3TIzBBtZUdHOh_uozWHiKcgmYe0INIkZzH2oZlYJFgFOOdWF_56ssZ9s4DgFQyF-mzjTRThvITjYOV2BZ3UpqfKhHZFhlVxrey8vBPTiXeG7evVL8r-EixkYG9C6XynzPD-0EZgc9uCXLFi9s8fB5_5hao-wqxzQfr2ctrSq8dR4KttIyQ3URykyVOLISioYDakpYxd4GggPJ_G80 \"deactivated bugfix reproduces old layout\")](https://www.plantuml.com/plantuml/uml/NP1HQxim5CNVyobk-_9luT_AO4-3GPqA6xXQh3uK1X8rQa2Z93Tp_VQxfZ1Att8EltFFpJqOv1hjqBD_0DW9A6tRo1-G1ch1AvJV74KDiyGEch7lnrcg5WoIEmY5R7LCYjY_56cI-La4h_34s4ggghUrW0vnCY-Uf_cyRsc2BQqHkXeLKdHVZOCtzLmjxJk3TIzBBtZUdHOh_uozWHiKcgmYe0INIkZzH2oZlYJFgFOOdWF_56ssZ9s4DgFQyF-mzjTRThvITjYOV2BZ3UpqfKhHZFhlVxrey8vBPTiXeG7evVL8r-EixkYG9C6XynzPD-0EZgc9uCXLFi9s8fB5_5hao-wqxzQfr2ctrSq8dR4KttIyQ3URykyVOLISioYDakpYxd4GggPJ_G80)\n\n## Global Layout Options\n\nC4-PlantUML also comes with some layout options to make it easy and reusable to create nice and useful diagrams:\n\n- [LAYOUT_TOP_DOWN() or LAYOUT_LEFT_RIGHT() or LAYOUT_LANDSCAPE()](LayoutOptions.md#layout_top_down-or-layout_left_right-or-layout_landscape)\n- [LAYOUT_WITH_LEGEND() or SHOW_LEGEND(?hideStereotype, ?details)](LayoutOptions.md#layout_with_legend-or-show_legend)\n- [SHOW_FLOATING_LEGEND(?alias, ?hideStereotype, ?details) and LEGEND()](LayoutOptions.md#show_floating_legendalias-hidestereotype-and-legend)\n- [LAYOUT_AS_SKETCH() and SET_SKETCH_STYLE(?bgColor, ?fontColor, ?warningColor, ?fontName, ?footerWarning, ?footerText)](LayoutOptions.md#layout_as_sketch)\n- [HIDE_STEREOTYPE()](LayoutOptions.md#hide_stereotype)\n\nC4-PlantUML also comes with some person sprite/portrait options:\n\n- [HIDE_PERSON_SPRITE()](LayoutOptions.md#hide_person_sprite)\n- [SHOW_PERSON_SPRITE(?sprite)](LayoutOptions.md#show_person_sprite)\n- [SHOW_PERSON_PORTRAIT()](LayoutOptions.md#show_person_portrait)\n- [SHOW_PERSON_OUTLINE()](LayoutOptions.md#show_person_outline) (requires PlantUML version >= 1.2021.4)\n\n## Sprites and other images\n\nC4-PlantUML offers predefined person and robot sprites which can be directly used:\n\n- `person`,`person2`\n- `robot`, `robot2`\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n\nPerson(pB, \"Sam\", $sprite=\"person2\")\nPerson_Ext(pA, \"Bob\", $sprite=\"person\")\n\nSystem_Ext(robB, \"Robot A\", $sprite=\"robot2\")\nSystem_Ext(robA, \"Robot B\", $sprite=\"robot\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![Predefined person and robot sprites - open link](https://www.plantuml.com/plantuml/svg/PSp1IiD04CRnUvuY1Wyfj5qGJuBGf0OzL2qMyHXsayKkxEuCCxEeRsysY2YvVlER_uv5awJWYmiN1vz6Mvv5a6-K8lsnVNToJYQnfG6Ys2ZR0O92hsF-sR2CtXcrlzuSy_JwU511irYQfduF0I7c7ypzucY98TROhilgf4ErBYyPoOczhN0-NLMh7zHtdr9ZCy4Mp19EhZXziTWmGmAJcozWGChcBwSyvUn_tVpgTg7dziFpMt_exhkdktfLx6mSK_3V \"Predefined person and robot sprites\")](https://www.plantuml.com/plantuml/uml/PSp1IiD04CRnUvuY1Wyfj5qGJuBGf0OzL2qMyHXsayKkxEuCCxEeRsysY2YvVlER_uv5awJWYmiN1vz6Mvv5a6-K8lsnVNToJYQnfG6Ys2ZR0O92hsF-sR2CtXcrlzuSy_JwU511irYQfduF0I7c7ypzucY98TROhilgf4ErBYyPoOczhN0-NLMh7zHtdr9ZCy4Mp19EhZXziTWmGmAJcozWGChcBwSyvUn_tVpgTg7dziFpMt_exhkdktfLx6mSK_3V)\n\nAdditional `$sprite` (images) can be defined with following PlantUML supported options:\n\n- included (standard library) sprites via their `{SpriteName}`; details see [sprites](https://plantuml.com/sprite)\n- images via `img:{File or Url}`\n- OpenIconic via `&{OpenIconicName}`; details see [openiconic](https://plantuml.com/openiconic)\n\nSize of the displayed images can be changed with `,scale={factor}`.\nColor of the displayed images can be changed with `,color={color}`.\n\n(If sprites are defined via $tags then the calculated legend is updated too)\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\n'stdlib users.puml defines sprite \"users\"\n!include <office/users/users.puml>\n\n\nAddRelTag(\"plantuml\", $textColor=\"$ARROW_FONT_COLOR\", $lineColor=\"$ARROW_COLOR\", $sprite=\"img:https://plantuml.com/logo3.png{scale=0.3}\", $legendSprite=\"img:https://plantuml.com/logo3.png{scale=0.1}\", $legendText=\"console triggered\")\n\nPerson(user, \"user group displayed with a sprite\", $sprite=\"users\")\n\n\nContainer(container, \"Container with scaled and colored OpenIconic\", $sprite=\"&folder,scale=5.0,color=gray\")\n\nSystem(system, \"System with an image\", $sprite=\"img:https://plantuml.com/logo3.png\")\n\nRel(user, system, \"Rel with image (via tags)\", $tags=\"plantuml\")\nRel(user, container, \"Rel with OpenIconinc\", $sprite=\"&folder\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![Sprite, image and OpenIconic - open link](https://www.plantuml.com/plantuml/svg/bP91RzGm48Nl_XL3L45MsYP5XKj5KAkb0gI5hT8YZfKRpxgM73ko7SeAyTyPso6R0nnwYZFsVFFUiozzu2wClMOlbEdqA10UGnZyHLqx_bH95Hx7Xz6Zwwm9Q4BLsRuUD3UnvzG7eTL3lNbpUXDBtxviwvxxW8vAznlguCgWguR8Pw_oQOWqdseWS4y7FFZ1gO1GfAtYAEMTtUzLXtMgryV6zuonAo5Qr7TSbiLVFSKQJWB-31khhMkAawkstNs_t-oskpPkQPhrdwqie2bKBoyc_xFBP5bRQS-hmSXVlkCQcxFg_7TYeaGZRf_V_dhHVaUQcu8IzbOZ1AUaH8UYM35sGvQjAQFrTSu7fBFZ049vcd100KzqHy2d39TcSfe4OVDLb5rU9TfSpOYaJ00t0hgO4grt0vhFrAAw9VVbtcf1X6pbRNMsJkSRwVWXZhiz-81zwTE7vkJ_IQS1rNE9pmizKblKKmmpc4gPcf1G_b0S0fT-5UbnqHoVnce1M8OmCsQlvbzcawzFz6Isrn-lltueL-mIZI3m7m00 \"Sprite, image and OpenIconic\")](https://www.plantuml.com/plantuml/uml/bP91RzGm48Nl_XL3L45MsYP5XKj5KAkb0gI5hT8YZfKRpxgM73ko7SeAyTyPso6R0nnwYZFsVFFUiozzu2wClMOlbEdqA10UGnZyHLqx_bH95Hx7Xz6Zwwm9Q4BLsRuUD3UnvzG7eTL3lNbpUXDBtxviwvxxW8vAznlguCgWguR8Pw_oQOWqdseWS4y7FFZ1gO1GfAtYAEMTtUzLXtMgryV6zuonAo5Qr7TSbiLVFSKQJWB-31khhMkAawkstNs_t-oskpPkQPhrdwqie2bKBoyc_xFBP5bRQS-hmSXVlkCQcxFg_7TYeaGZRf_V_dhHVaUQcu8IzbOZ1AUaH8UYM35sGvQjAQFrTSu7fBFZ049vcd100KzqHy2d39TcSfe4OVDLb5rU9TfSpOYaJ00t0hgO4grt0vhFrAAw9VVbtcf1X6pbRNMsJkSRwVWXZhiz-81zwTE7vkJ_IQS1rNE9pmizKblKKmmpc4gPcf1G_b0S0fT-5UbnqHoVnce1M8OmCsQlvbzcawzFz6Isrn-lltueL-mIZI3m7m00)\n\nRelationship specific sprites are typically smaller and therefore following options are possible:\n\n- use smaller icons (like the $triangle in the following sample)\n- use an additional scale factor (direct as part of the argument, or via a variable)\n- if sprite argument starts with `&` an OpenIconic name can be used too (details see <https://useiconic.com/open>)\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml\n\nPerson(user, \"User\")\nPerson(user1, \"User 1\")\nPerson(user2, \"User 2\")\nPerson(user3, \"User 3\")\n\nSystem(system, \"System\")\n\n' normal sprites are too big \nRel_L(user, user2, \"informs\", \"courier\", \"normal sprites are too big\", $sprite=\"person2\")\n\n' scaled sprites are ok\nRel_R(user, user3, \"informs\", \"courier\", \"scaled sprites are OK\", $sprite=\"person2,scale=0.5\")\n\n' combine sprite and scale to a new sprite\n!$combinedSprite=\"person2,scale=0.5\"\nRel_R(user, user3, \"informs\", \"courier\", \"combined sprites are OK\", $sprite=$combinedSprite)\n\n' special smaller sprites can be used\nsprite $triangle {\n    00000000000\n    00000F00000\n    0000FBF0000\n    0000FBF0000\n    000F999F000\n    000F999F000\n    00F66666F00\n    00F66666F00\n    0F3333333F0\n    0F3333333F0\n    0FFFFFFFFF0\n    00000000000\n}\nRel_R(user1, system, \"orders\", \"http\", \"small sprites, like the small triangle\", $sprite=\"triangle\")\n\n' if sprite starts with &, sprite defines a OpenIconic, details see https://useiconic.com/open/\nRel_D(user, user1, \"requests\", \"async message\", \"if sprite starts with &, it defines a OpenIconic like &envelope-closed\", $sprite = \"&envelope-closed\")\n@enduml\n```\n\n[![Relationship with sprite or OpenIconic - open link](https://www.plantuml.com/plantuml/svg/bLJVQnin37w_lq8DeMiXoQN9DiWWKDPnCDRHqjBdujXAOkgpRvPlMHdxt-SVSPEikK7rujCdIzyd8TybEMPTMwlYH6gkMe6mTgwXJsLfsMQqacxTBbf2oursgDs8cxfi5DCXPqXEABaehzuFRmFqyFswh1avj1vwl0ePlzoe2TMBMxHaz5aeDO3UWpzwv_lWnHQ5YqDyal798JxD-DJZnVspPwtFA1u-almGUGVQs9efeCPAXmJC8ZXZO25NKDoXUhpUYifiKYzz1lNy9pUjbMZ3PtSL7-qdUDvhei198YRE58g35FCKAU_sAAUTb4VoRxuTOHl4Y_Fnw4FYvQPUI8tRH61Q92bUC33GkDb6YfF-zgguxwpu1hsvMBVYV_YysZ2c1haCe_NpLMXViZdJiC30AOg4GTzPoVHA8VmkmDjuPpk_ElIhpzN__6escrNTVlKnMDNbLzDaLPUVRVnAxvyysRJyBwjhh40RHniUOZZZOF9O1g3a4u9R8oGyZsH_CJAMza4kyoh4nqwmaMuDfuEC2bnAZGGCRXhKNxdHaWyywfXK18IxNuBNAcCu_WQClrt6BhxizYC-P8i_MYGNks3qh3dKICHM681EET8TbP8QFaNz4vMd779b2CMkNPX3xrNqlBX4BTfQ_GK0 \"Relationship with sprite or OpenIconic\")](https://www.plantuml.com/plantuml/uml/bLJVQnin37w_lq8DeMiXoQN9DiWWKDPnCDRHqjBdujXAOkgpRvPlMHdxt-SVSPEikK7rujCdIzyd8TybEMPTMwlYH6gkMe6mTgwXJsLfsMQqacxTBbf2oursgDs8cxfi5DCXPqXEABaehzuFRmFqyFswh1avj1vwl0ePlzoe2TMBMxHaz5aeDO3UWpzwv_lWnHQ5YqDyal798JxD-DJZnVspPwtFA1u-almGUGVQs9efeCPAXmJC8ZXZO25NKDoXUhpUYifiKYzz1lNy9pUjbMZ3PtSL7-qdUDvhei198YRE58g35FCKAU_sAAUTb4VoRxuTOHl4Y_Fnw4FYvQPUI8tRH61Q92bUC33GkDb6YfF-zgguxwpu1hsvMBVYV_YysZ2c1haCe_NpLMXViZdJiC30AOg4GTzPoVHA8VmkmDjuPpk_ElIhpzN__6escrNTVlKnMDNbLzDaLPUVRVnAxvyysRJyBwjhh40RHniUOZZZOF9O1g3a4u9R8oGyZsH_CJAMza4kyoh4nqwmaMuDfuEC2bnAZGGCRXhKNxdHaWyywfXK18IxNuBNAcCu_WQClrt6BhxizYC-P8i_MYGNks3qh3dKICHM681EET8TbP8QFaNz4vMd779b2CMkNPX3xrNqlBX4BTfQ_GK0)\n\n## Custom tags/stereotypes support and skinparam updates\n\nAdditional tags/stereotypes can be added to the existing element stereotypes (component, ...) and highlight,... specific aspects:\n\n- `AddElementTag(tagStereo, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?techn, ?legendText, ?legendSprite, ?borderStyle, ?borderThickness)`:\n  Introduces a new element tag. The styles of the tagged elements are updated and the tag is displayed in the calculated legend.\n- `AddRelTag(tagStereo, ?textColor, ?lineColor, ?lineStyle, ?sprite, ?techn, ?legendText, ?legendSprite, ?lineThickness)`:\n  Introduces a new Relationship tag. The styles of the tagged relationships are updated and the tag is displayed in the calculated legend.\n- `AddBoundaryTag(tagStereo, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?type, ?legendText, ?borderStyle, ?borderThickness, ?borderStyle, ?borderThickness, ?sprite, ?legendSprite)`:\n  Introduces a new Boundary tag. The styles of the tagged boundaries are updated and the tag is displayed in the calculated legend.\n- `UpdateElementStyle(elementName, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?techn, ?legendText, ?legendSprite, ?borderStyle, ?borderThickness)`:\n  This call updates the default style of the elements (component, ...) and creates no additional legend entry.\n- `UpdateRelStyle(textColor, lineColor)`:\n  This call updates the default relationship colors and creates no additional legend entry.\n- `UpdateBoundaryStyle(?elementName, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?type, ?legendText, ?borderStyle, ?borderThickness, ?sprite, ?legendSprite)`:\n  This call updates the default style of the existing boundaries and creates no additional legend entry.\n  If the element name is \"\" then it updates generic, enterprise, system and container boundary style in on call.\n- `SharpCornerShape()`: This call returns the name of the sharp corner shape and can be used as ?shape argument (default).\n- `RoundedBoxShape()`: This call returns the name of the rounded box shape and can be used as ?shape argument.\n- `EightSidedShape()`: This call returns the name of the eight sided shape and can be used as ?shape argument.\n- `DashedLine()`: This call returns the name of the dashed line and can be used as ?lineStyle or ?borderStyle argument.\n- `DottedLine()`: This call returns the name of the dotted line and can be used as ?lineStyle or ?borderStyle argument.\n- `BoldLine()`: This call returns the name of the bold line and can be used as ?lineStyle or ?borderStyle argument.\n- `SolidLine()`: This call returns the name of the solid line and can be used as ?lineStyle or ?borderStyle argument (enables e.g. a reset of dashed boundaries).\n\nEach element can be extended with one or multiple custom tags via the keyword argument `$tags=\"...\"`, like `Container(spaAdmin, \"Admin SPA\", $tags=\"v1.1\")`.\nMultiple tags can be combined with `+`, like `Container(api, \"API\", $tags=\"v1.0+v1.1\")`.\n\n### Element specific tag definitions\n\nSometimes an added element tag is element specific and all element specific colors should be used, e.g. a specific user role should be defined as element tag with the specific colors `...PERSON_...` like\n\n```plantuml\nAddElementTag(\"admin\", $fontColor=$PERSON_FONT_COLOR, $bgColor=$PERSON_BG_COLOR, $borderColor=$PERSON_BORDER_COLOR, $sprite=\"osa_user_audit\", $legendText=\"administration user\")\n```\n\nTherefore element Add...Tag() shortcuts are added which use the specific colors as default values and the call can be simplified like\n\n```plantuml\nAddPersonTag(\"admin\", $sprite=\"osa_user_audit\", $legendText=\"administration user\")\n```\n\nFollowing calls introduces new element tags with element specific default colors:\n\n- `AddPersonTag(tagStereo, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?legendText, ?legendSprite, ?type, ?borderStyle, ?borderThickness)`\n- `AddExternalPersonTag(tagStereo, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?legendText, ?legendSprite, ?type, ?borderStyle, ?borderThickness)`\n- `AddSystemTag(tagStereo, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?legendText, ?legendSprite, ?type, ?borderStyle, ?borderThickness)`\n- `AddExternalSystemTag(tagStereo, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?legendText, ?legendSprite, ?type, ?borderStyle, ?borderThickness)`\n- `AddComponentTag(tagStereo, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?techn, ?legendText, ?legendSprite, ?borderStyle, ?borderThickness)`\n- `AddExternalComponentTag(tagStereo, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?techn, ?legendText, ?legendSprite, ?borderStyle, ?borderThickness)`\n- `AddContainerTag(tagStereo, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?techn, ?legendText, ?legendSprite, ?borderStyle, ?borderThickness)`\n- `AddExternalContainerTag(tagStereo, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?techn, ?sprite, ?legendText, ?legendSprite, ?borderStyle, ?borderThickness)`\n- `AddNodeTag(tagStereo, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?techn, ?legendText, ?legendSprite, ?borderStyle, ?borderThickness)`\n  (node specific: $type reuses $techn definition of $tags)\n\n### Boundary specific tag definitions\n\nLike the element specific tag definitions exist boundary specific calls with their default colors **and type**:\n\n- `UpdateContainerBoundaryStyle(?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?type, ?legendText, ?borderStyle, ?borderThickness, ?sprite, ?legendSprite)`\n- `UpdateSystemBoundaryStyle(?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?type, ?legendText, ?borderStyle, ?borderThickness, ?sprite, ?legendSprite)`\n- `UpdateEnterpriseBoundaryStyle(?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?type, ?legendText, ?borderStyle, ?borderThickness, ?sprite, ?legendSprite)`\n\n### Define a new legend title\n\nAll the above described `Update....(..., ?legendText, ...)` calls can define a new legend text.\nOnly the legend title cannot be changed. Therefore, the following call is added to allow it to be changed as well:\n\n- `UpdateLegendTitle(newTitle)`\n\n### Comments\n\n- `SHOW_LEGEND()` supports the customized stereotypes  \n  (`LAYOUT_WITH_LEGEND()` cannot be used, if the custom tags/stereotypes should be displayed in the legend).\n- `SHOW_LEGEND()` has to be last line in diagram.\n- Don't use space between `$tags` and `=` (PlantUML does not support it).\n- Don't use `,` as part of the tag names (PlantUML does not support it in combination with keyword arguments).\n- If 2 tags define the same skinparam, the first definition is used.\n- If specific skinparams have to be merged (e.g. 2 tags change the font color) an additional combined tag has to be defined. Use `&` as part of combined tag names.\n\n- Automatically merging colors of relationship tags is not supported in PlantUML before v.1.2022  \n  If an older version is used and one tag modifies the line color and the other the text color, an additional combined tag has to be defined and used.\n\n### Sample with different tag combinations\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nUpdateElementStyle(person, $fontColor=\"green\")\nAddElementTag(\"v1.0\", $fontColor=\"#d73027\", $borderColor=\"#d73027\")\nAddElementTag(\"v1.1\", $fontColor=\"#ffffbf\", $borderColor=\"#ffffbf\")\nAddElementTag(\"v1.0&v1.1\", $fontColor=\"#fdae61\", $borderColor=\"#fdae61\")\nAddElementTag(\"fallback\", $bgColor=\"#444444\")\n\n' If spaces are requested in the legend, legend text with space has to be defined (incl. all other additional details)\nAddElementTag(\"microService\", $shape=EightSidedShape(), $legendText=\"micro service (eight sided) (no text, no back color)\")\n' If no special tag names should be displayed in legend, no explicit legend text definition is required (all additional details are automatically calculated) \nAddElementTag(\"storage\", $shape=RoundedBoxShape())\n\nUpdateRelStyle(black, black)\nAddRelTag(\"service1\", $textColor=\"red\")\nAddRelTag(\"service2\", $lineColor=\"red\")\nAddRelTag(\"service1&service2\", $textColor=\"red\", $lineColor=\"red\")\n\nContainer(spa, \"SPA\", \"angular\", \"The main interface that the customer interacts with via v1.0\", $tags=\"v1.0\")\nContainer(spaAdmin, \"Admin SPA\", \"angular\", \"The administrator interface that the customer interacts with via new v1.1\", $tags=\"v1.1\")\nContainer(api, \"API\", \"java\", \"Handles all business logic (incl. new v1.1 extensions)\", $tags=\"v1.0&v1.1+v1.0+v1.1\")\nContainer(spa2, \"SPA2\", \"angular\", \"The main interface that the customer interacts with via v1.0\", $tags=\"v1.0+fallback\")\nContainer(spaAdmin2, \"Admin SPA2\", \"angular\", \"The administrator interface that the customer interacts with via new v1.1\", $tags=\"fallback+v1.1\")\n\nContainer(services, \"Services\", \"techn\", $tags=\"microService\")\nContainer(fileStorage, \"File storage\", \"techn\", $tags=\"storage\")\n\nRel(spa, api, \"Uses\", \"https\")\nRel(spaAdmin, api, \"Uses\", \"https\")\nRel_L(spa, spa2, \"Updates\", \"https\")\nRel_R(spaAdmin, spaAdmin2, \"Updates\", \"https\")\n\nRel_D(api, services, \"uses service1 via this call\", $tags=\"service1\")\nRel_D(api, services, \"uses service2 via this call\", $tags=\"service2\")\nRel_D(services, fileStorage, \"both services stores via this call\", $tags=\"service1&service2+service1+service2\")\n\nSHOW_LEGEND(false)\n@enduml\n```\n\n[![merged tags - open link](https://www.plantuml.com/plantuml/svg/jLLHRzis47xthxXvGsV1hbrxnGeC2D0ipTO2sHR42VOOdCIpn8qYDVBa9Fz-Hz4AvCfRq8Vw8PJ8xxxxxjCTypumUcvhC_b6syAqYg1YRi9FgvN7XsMfkMhpDf0ld6Mol2nSlMeCsXZpEh0oEbzTl7rz7RVkVhjQrHYOl6pTNqW4Qaj-sKJ-oLsZaEdIK2qyMtuoD6l81sSNyDrEi1VEE7ysBJsHdMQJSwKEs5iiPzFzUlbcUepyLhtxuStcNTpDdLVaZ_TFSgm_vzZ9Bz-DETB-QHslJX8ff1_NOwAqFoRQeJ4v5dzt4MMFVjlz13tv7Zxj83HOK03q19x-QIamAT0Mk28mL99LYyCAJ8yC3vgh50GL1c07EO6YdROIDujVU0cI5vmGU42bD6jdqGY6KPimKbdhmhij-RqkA2eD5JPqTgdBYhTQaTh6zrac9qd6hQWuIr4GKXZCAC8XH7m6C-iwhGkGXsW05B7sR9gbacKtD5HeDC1OWiMQ0eJAjKPrnUZG67nADlGMI0mzDaONceTsfCgx4a67pa7jen5YmRZuP3Esx6faNGZc2UHlqHhaAFnpQm8xZ-N0bHlNMYdnP_TuS2Nhc_w6J6hut4Z12-YMpcivIMJ9gwv_H7hVLQ9sUWgtYJYZBRs0Mx_g0yR49oacprCx2mqkOBgzFf_AWhOK7tnylAq8Qe60jan-5tkDA-Ik9uisY7taqnaM759BxZL2Fy6CPJXByvmTfpjNjRQIeLlXT6QCPpgmHx7_IoLOUe0qkmCPwoCPsEYeuFfJJFWNxZ6k7z4gGw4RdRmD0Wm1Z2jrqGzLpmnYCTcWdGtPKPPqQSpZqtoKL6hV9AytNytiUN_Xd7HzCxHzy_LzxyNqNWmbfOuDqP33OnJ1L5JscU3uOXfMjDE6jcaq9UeNUOD-KiSi_Oa8aCb9BPywu2wajDr_GpbFnyci_y7SNoMImnTDupy2tGoe-gV_W7Vu3waj1ywqahf_NtSUSwK3n5jhK5qwZ_w-pB9vWMNJimm-qB7NkUFgcRqpNPRJfEFxQTxlp0Vv9jkFV_nvVtNvw-Nl7sRICe6ooNkoggtDlm00 \"merged tags\")](https://www.plantuml.com/plantuml/uml/jLLHRzis47xthxXvGsV1hbrxnGeC2D0ipTO2sHR42VOOdCIpn8qYDVBa9Fz-Hz4AvCfRq8Vw8PJ8xxxxxjCTypumUcvhC_b6syAqYg1YRi9FgvN7XsMfkMhpDf0ld6Mol2nSlMeCsXZpEh0oEbzTl7rz7RVkVhjQrHYOl6pTNqW4Qaj-sKJ-oLsZaEdIK2qyMtuoD6l81sSNyDrEi1VEE7ysBJsHdMQJSwKEs5iiPzFzUlbcUepyLhtxuStcNTpDdLVaZ_TFSgm_vzZ9Bz-DETB-QHslJX8ff1_NOwAqFoRQeJ4v5dzt4MMFVjlz13tv7Zxj83HOK03q19x-QIamAT0Mk28mL99LYyCAJ8yC3vgh50GL1c07EO6YdROIDujVU0cI5vmGU42bD6jdqGY6KPimKbdhmhij-RqkA2eD5JPqTgdBYhTQaTh6zrac9qd6hQWuIr4GKXZCAC8XH7m6C-iwhGkGXsW05B7sR9gbacKtD5HeDC1OWiMQ0eJAjKPrnUZG67nADlGMI0mzDaONceTsfCgx4a67pa7jen5YmRZuP3Esx6faNGZc2UHlqHhaAFnpQm8xZ-N0bHlNMYdnP_TuS2Nhc_w6J6hut4Z12-YMpcivIMJ9gwv_H7hVLQ9sUWgtYJYZBRs0Mx_g0yR49oacprCx2mqkOBgzFf_AWhOK7tnylAq8Qe60jan-5tkDA-Ik9uisY7taqnaM759BxZL2Fy6CPJXByvmTfpjNjRQIeLlXT6QCPpgmHx7_IoLOUe0qkmCPwoCPsEYeuFfJJFWNxZ6k7z4gGw4RdRmD0Wm1Z2jrqGzLpmnYCTcWdGtPKPPqQSpZqtoKL6hV9AytNytiUN_Xd7HzCxHzy_LzxyNqNWmbfOuDqP33OnJ1L5JscU3uOXfMjDE6jcaq9UeNUOD-KiSi_Oa8aCb9BPywu2wajDr_GpbFnyci_y7SNoMImnTDupy2tGoe-gV_W7Vu3waj1ywqahf_NtSUSwK3n5jhK5qwZ_w-pB9vWMNJimm-qB7NkUFgcRqpNPRJfEFxQTxlp0Vv9jkFV_nvVtNvw-Nl7sRICe6ooNkoggtDlm00)\n\n### Sample with tag dependent sprites and custom legend text\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\n!define osaPuml https://raw.githubusercontent.com/Crashedmind/PlantUML-opensecurityarchitecture2-icons/master\n!include osaPuml/Common.puml\n!include osaPuml/User/all.puml\n\n!include <office/Servers/database_server>\n!include <office/Servers/file_server>\n!include <office/Servers/application_server>\n!include <office/Concepts/service_application>\n!include <office/Concepts/firewall>\n\nAddExternalPersonTag(\"anonymous_ext\", $sprite=\"osa_user_black_hat\", $legendText=\"anonymous user\")\nAddPersonTag(\"customer\", $sprite=\"osa_user_large_group\", $legendText=\"aggregated user\")\nAddPersonTag(\"admin\", $sprite=\"osa_user_audit,color=red\", $legendSprite=\"osa_user_audit,scale=0.25,color=red\", $legendText=\"administration user\")\n\nAddContainerTag(\"webApp\", $sprite=\"application_server\", $legendText=\"web app container\")\nAddContainerTag(\"db\", $sprite=\"database_server\", $legendText=\"database container\")\nAddContainerTag(\"files\", $sprite=\"file_server\", $legendText=\"file server container\")\nAddContainerTag(\"conApp\", $sprite=\"service_application\", $legendText=\"console app container\")\n\nAddRelTag(\"firewall\", $textColor=\"$ARROW_FONT_COLOR\", $lineColor=\"$ARROW_COLOR\", $sprite=\"firewall,scale=0.3,color=red\", $legendText=\"firewall\")\n\nPerson_Ext(anonymous_user, \"Bob\", $tags=\"anonymous_ext\")\nPerson(aggregated_user, \"Sam, Ivone\", $tags=\"customer\")\nPerson(administration_user, \"Bernd\", $tags=\"admin\")\n\nSystem_Boundary(c1, \"techtribes.js\"){\n    Container(web_app, \"Web Application\", \"Java, Spring MVC, Tomcat 7.x\", $tags=\"webApp\")\n    ContainerDb(rel_db, \"Relational Database\", \"MySQL 5.5.x\", $tags=\"db\")\n    Container(filesystem, \"File System\", \"FAT32\", $tags=\"files\")\n    ContainerDb(nosql, \"NoSQL Data Store\", \"MongoDB 2.2.x\", $tags=\"db\")\n    Container(updater, \"Updater\", \"Java 7 Console App\", $tags=\"conApp\")\n}\n\nRel(anonymous_user, web_app, \"Uses\", \"HTTPS\", $tags=\"firewall\")\nRel(aggregated_user, web_app, \"Uses\", \"HTTPS\", $tags=\"firewall\")\nRel(administration_user, web_app, \"Uses\", \"HTTPS\", $tags=\"firewall\")\n\nRel(web_app, rel_db, \"Reads from and writes to\", \"SQL/JDBC, port 3306\")\nRel(web_app, filesystem, \"Reads from\")\nRel(web_app, nosql, \"Reads from\", \"MongoDB wire protocol, port 27017\")\n\nRel_U(updater, rel_db, \"Reads from and writes data to\", \"SQL/JDBC, port 3306\")\nRel_U(updater, filesystem, \"Writes to\")\nRel_U(updater, nosql, \"Reads from and writes to\", \"MongoDB wire protocol, port 27017\")\n\nLay_R(rel_db, filesystem)\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![tags with sprites and custom legend - open link](https://www.plantuml.com/plantuml/svg/dLJTRkCs4xttKt2DlN00nyewNxu0HRDOnqwxNJYRr3_DfJ0Inx9QYbH9AevHzDqxf6tHiPMVDbSHvvmpXpE7_c8iQ5iLelKXbwceEBAbjQNv8Oeqh7fPRfTLKXdKgP8MfUsbgeXA0T9nJetb8a-YuVzExztH_7OS5M0iQZgAXyI0NABkbKw_zO7ZWZwPCd1F1-_eCzHWbiYBNF9er-1KbIWDffNExHfqkimjfhRIs3_DYMks1i9rjksYeIeA9RsNu-BSa6SGObCEzH_LOf6d64rHFw8s4GSB2HYCZJ_u_39oaOjteA0iHPw2pPLy6Ko3JB6q9d88EeZtMA_15xd65GZnkTKQS7xpP55B4FVKLyaPP9qsI2NNXQfCZ4-stMKVJKbJnQksCX2xPSI9WFIFU0c-AZ13oMU4lGfKvd3j4zTXJpcjZ5K5waPH0Jh3EDEgAezaiqnZ1XPviowuC3IAGiLpsqsLKFfA8m_2qsQaIK7WrLclVn58HsvSjznOxKUzS-GirTdshbQO3CfotzRnNW-rYSC8nTAT4YaV2VDaNpI4hq4nb5-NTBaq-whke5dHbzYczBee5Gy6q13LGtKY6INmQ0fEVeB22-yYxBYMM4E_glR7mMHozn0FxyPt4ozBrAPIC5GhrOi_Vsdl0UlCRC8Nq-lfr9dtEUgozhLAl378pDN1OphP4ZiXqJlM58ek--LHIGpa-hq4thFirHrHInve7kHSJjV6OX5VgqfoqEjE-ed05jEbrNc2flUxQP_yrMBqLo-kGmbqwo7W0sLny6nHxM_m25tctexCsErlmowRgOBAxBBt5FflWt_oN7cKT3IAc2UaGulqcY3OQ9jF9t-xdluwPXUzYtqrdXmgTNnQ_Ts8z9EBu-QcRVSvc9tt0zj36wn8PVuK1F-kN4jdWasjqXiRIcPgTCtwlVuRHggIW_Khc6_-sms9NJgK3x8RHTYeaflH_DrgqH2EmXEcFpTedDhNsUn-6WH223q_vEY_2Xm6wj-AU9MQiBTXu8Ojj2eOICvMxhaPPfKJeub7tqRNb9vIQSlEpy_-lt4JTCA6dsaTmdPR38Zz_Qt89IkriYfLOjkiVtdswN9hEvw71RvXd53mbliWT-3_eRxy4IvSe7bSxxxE6DRnf7vWeJsLfb_fbszyy_FDzr7dfFK59QyAyGy0 \"tags with sprites and custom legend\")](https://www.plantuml.com/plantuml/uml/dLJTRkCs4xttKt2DlN00nyewNxu0HRDOnqwxNJYRr3_DfJ0Inx9QYbH9AevHzDqxf6tHiPMVDbSHvvmpXpE7_c8iQ5iLelKXbwceEBAbjQNv8Oeqh7fPRfTLKXdKgP8MfUsbgeXA0T9nJetb8a-YuVzExztH_7OS5M0iQZgAXyI0NABkbKw_zO7ZWZwPCd1F1-_eCzHWbiYBNF9er-1KbIWDffNExHfqkimjfhRIs3_DYMks1i9rjksYeIeA9RsNu-BSa6SGObCEzH_LOf6d64rHFw8s4GSB2HYCZJ_u_39oaOjteA0iHPw2pPLy6Ko3JB6q9d88EeZtMA_15xd65GZnkTKQS7xpP55B4FVKLyaPP9qsI2NNXQfCZ4-stMKVJKbJnQksCX2xPSI9WFIFU0c-AZ13oMU4lGfKvd3j4zTXJpcjZ5K5waPH0Jh3EDEgAezaiqnZ1XPviowuC3IAGiLpsqsLKFfA8m_2qsQaIK7WrLclVn58HsvSjznOxKUzS-GirTdshbQO3CfotzRnNW-rYSC8nTAT4YaV2VDaNpI4hq4nb5-NTBaq-whke5dHbzYczBee5Gy6q13LGtKY6INmQ0fEVeB22-yYxBYMM4E_glR7mMHozn0FxyPt4ozBrAPIC5GhrOi_Vsdl0UlCRC8Nq-lfr9dtEUgozhLAl378pDN1OphP4ZiXqJlM58ek--LHIGpa-hq4thFirHrHInve7kHSJjV6OX5VgqfoqEjE-ed05jEbrNc2flUxQP_yrMBqLo-kGmbqwo7W0sLny6nHxM_m25tctexCsErlmowRgOBAxBBt5FflWt_oN7cKT3IAc2UaGulqcY3OQ9jF9t-xdluwPXUzYtqrdXmgTNnQ_Ts8z9EBu-QcRVSvc9tt0zj36wn8PVuK1F-kN4jdWasjqXiRIcPgTCtwlVuRHggIW_Khc6_-sms9NJgK3x8RHTYeaflH_DrgqH2EmXEcFpTedDhNsUn-6WH223q_vEY_2Xm6wj-AU9MQiBTXu8Ojj2eOICvMxhaPPfKJeub7tqRNb9vIQSlEpy_-lt4JTCA6dsaTmdPR38Zz_Qt89IkriYfLOjkiVtdswN9hEvw71RvXd53mbliWT-3_eRxy4IvSe7bSxxxE6DRnf7vWeJsLfb_fbszyy_FDzr7dfFK59QyAyGy0)\n\n### Sample with different boundary tag combinations\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n\n' Update the generic boundary style and the \"system\", \"enterprise\", \"container\" boundaries styles too\nUpdateBoundaryStyle($bgColor=\"gold\", $fontColor=\"brown\", $borderColor=\"brown\")\n' (Re-)Updates the system boundary styles; re-set $bgColor avoids '(no back color)' in legend too\nUpdateSystemBoundaryStyle($bgColor=\"gold\", $fontColor=\"white\", $borderColor=\"white\")\n\nBoundary(b, \"A Boundary\") {\n}\n\nContainer_Boundary(cb, \"A Container Boundary\") {\n}\n\nSystem_Boundary(sb, \"A System Boundary\") {\n}\n\n' defines a new border style incl. new border type\nAddBoundaryTag(\"repository\", $bgColor=\"green\", $fontColor=\"white\", $borderColor=\"white\", $shadowing=\"true\", $shape = RoundedBoxShape(), $type=\"GitHub repository\")\n\nBoundary(c4Respository, \"plantuml-stdlib/C4-PlantUML\", $tags=\"repository\") {\n  Component(readMe, \"README.md\", \"Markdown\")\n}\n\n' boundary tags are internally extended with '_boundary' that it uses a different name space\n' this enables different element and boundary styles for the same tag name\nAddBoundaryTag(\"v1\", $bgColor=\"lightgreen\", $fontColor=\"green\", $borderColor=\"green\")\nAddElementTag(\"v1\", $bgColor=\"lightred\", $fontColor=\"red\", $borderColor=\"red\")\n\nBoundary(anotherBoundary, \"Another Boundary\", $type=\"BOUNDARY TYPE\", $tags=\"v1\") {\n  Component(anotherComponent, \"Another Component\", $techn=\"COMPONENT TYPE\", $tags=\"v1\", $descr=\"Component and boundary use different tag name spaces that both v1 tags can use different styles\")\n}\n\nLay_R(b, cb)\nLay_R(cb, sb)\n\nLay_D(b, c4Respository)\n\nLay_R(c4Respository, anotherBoundary)\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![custom border tags - open link](https://www.plantuml.com/plantuml/svg/bLHHRzem47xFhxX5bKYa0ghKfqr8fO3QXm8Lj9hwX9puIAmcTcGxfMZQVvyF4vg6RTgUsllkxlEN--wuCPPfMvT5y4N8jAWvGcvjPRuEXvhj1fcmUPtK1dMgf4Lf1wagXrN19FNqZUM5I8QJw_uZGS_pXs79Z4NjeCr4bPMIr5CHVz23vuepYs1pX0mbQf52ech9cTw3iVi2WKb-I8TcxsZAy192Hu2wqi8WHII32TSRDgq2ZMysO9KA_1ktHzer9QAB99keGkbHcAc2EvgBhQCvGebMEqbOeZH7_GcDdUXeXVtOivg3DY-jezny0urzWnQQnu2zAS4Dz2Af867fAwG4npqG4WhCKFAMuFM1z3zaxt9XiIExGUCWQ9YYn0rj34qOnl0Z-1a4asQCcrDXwYjFcRCUB_6ZmVW63vzLzu3Zrl4OO21n1rxcqMPQjK4RjliAWp7d3SiJow9GOwMCiCgHNa9h61fH_liq23KvusedP3OAhQuRg48OmOfUHFVm-vgGA7OvKZCAxuIzhnDegMZFDRrUeMaoRX1_kOcGA5bcHkqleZ41d6uaqiZu71tHQZQUpcU3aWmFvqo_Sh-9DDEFfIC-O9f6QL5BLXHxm7UBz2sm4pQ7tgOfxe7DcGLXeJO7FxZORb6Zj21PYM0gbc90LS80IfOKQ5erM619VvdatQM7hTB-9eZ7QIB2SoFVhZuPM8WijxzpqMDT5pqQ4-lCI_aZgSRkcH3I9IIiRIMJokQecvYscf3s2PoMudRvl9YELo_mzF8uEnbBOZg6Dgmde4LxmWu4cEPo54wMyyVbOhPuEcEc_pcQr2dtZLqpoDQMNwwlvQlnvYVkPNYxydkJCjdfyNRwBNjW-ysAVZVI93u6gOkCYmxXz91hht_SD7MEeZDOLxQ-NtxVFCpkPejf50StABaxcLy0 \"custom border tags\")](https://www.plantuml.com/plantuml/uml/bLHHRzem47xFhxX5bKYa0ghKfqr8fO3QXm8Lj9hwX9puIAmcTcGxfMZQVvyF4vg6RTgUsllkxlEN--wuCPPfMvT5y4N8jAWvGcvjPRuEXvhj1fcmUPtK1dMgf4Lf1wagXrN19FNqZUM5I8QJw_uZGS_pXs79Z4NjeCr4bPMIr5CHVz23vuepYs1pX0mbQf52ech9cTw3iVi2WKb-I8TcxsZAy192Hu2wqi8WHII32TSRDgq2ZMysO9KA_1ktHzer9QAB99keGkbHcAc2EvgBhQCvGebMEqbOeZH7_GcDdUXeXVtOivg3DY-jezny0urzWnQQnu2zAS4Dz2Af867fAwG4npqG4WhCKFAMuFM1z3zaxt9XiIExGUCWQ9YYn0rj34qOnl0Z-1a4asQCcrDXwYjFcRCUB_6ZmVW63vzLzu3Zrl4OO21n1rxcqMPQjK4RjliAWp7d3SiJow9GOwMCiCgHNa9h61fH_liq23KvusedP3OAhQuRg48OmOfUHFVm-vgGA7OvKZCAxuIzhnDegMZFDRrUeMaoRX1_kOcGA5bcHkqleZ41d6uaqiZu71tHQZQUpcU3aWmFvqo_Sh-9DDEFfIC-O9f6QL5BLXHxm7UBz2sm4pQ7tgOfxe7DcGLXeJO7FxZORb6Zj21PYM0gbc90LS80IfOKQ5erM619VvdatQM7hTB-9eZ7QIB2SoFVhZuPM8WijxzpqMDT5pqQ4-lCI_aZgSRkcH3I9IIiRIMJokQecvYscf3s2PoMudRvl9YELo_mzF8uEnbBOZg6Dgmde4LxmWu4cEPo54wMyyVbOhPuEcEc_pcQr2dtZLqpoDQMNwwlvQlnvYVkPNYxydkJCjdfyNRwBNjW-ysAVZVI93u6gOkCYmxXz91hht_SD7MEeZDOLxQ-NtxVFCpkPejf50StABaxcLy0)\n\n### Custom schema definitions (via UpdateElementStyle())\n\nVia `UpdateElementStyle()` calls, it is possible to change the default colors, sprites, legend text, tags, ...\nIt automatically updates the legend too.  \nIf the corresponding section is stored in a separate file then it can be reused as default of all diagrams.\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml\n\n' <<<<< this section could be stored in a separate file and reused in all other diagrams too\n' it defines new default colors, different default sprites and legend \n!$COLOR_A_5 = \"#7f3b08\"\n!$COLOR_A_4 = \"#b35806\"\n!$COLOR_A_3 = \"#e08214\"\n!$COLOR_A_2 = \"#fdb863\"\n!$COLOR_A_1 = \"#fee0b6\"\n!$COLOR_NEUTRAL = \"#f7f7f7\"\n!$COLOR_B_1 = \"#d8daeb\"\n!$COLOR_B_2 = \"#b2abd2\"\n!$COLOR_B_3 = \"#8073ac\"\n!$COLOR_B_4 = \"#542788\"\n!$COLOR_B_5 = \"#2d004b\"\n!$COLOR_REL_LINE = \"#8073ac\"\n!$COLOR_REL_TEXT = \"#8073ac\"\n\nUpdateElementStyle(\"person\", $bgColor=$COLOR_A_5, $fontColor=$COLOR_NEUTRAL, $borderColor=$COLOR_A_1, $shadowing=\"true\", $legendText=\"Internal user\")\nUpdateElementStyle(\"external_person\", $bgColor=$COLOR_B_5, $fontColor=$COLOR_NEUTRAL, $borderColor=$COLOR_B_1, $legendText=\"External user\")\nUpdateElementStyle(\"system\", $bgColor=$COLOR_A_4, $fontColor=$COLOR_NEUTRAL, $borderColor=$COLOR_A_2, $sprite=\"robot\", $legendText=\"Our chatbot based system\")\nUpdateElementStyle(\"external_system\", $bgColor=$COLOR_B_4, $fontColor=$COLOR_NEUTRAL, $borderColor=$COLOR_B_2, $legendText=\"External system\")\nUpdateRelStyle($lineColor=$COLOR_REL_LINE, $textColor=$COLOR_REL_TEXT)\n' >>>>> end of section\n\nPerson(customer, \"Personal Banking Customer\")\nSystem(banking_system, \"Internet Banking System\")\n\nSystem_Ext(mail_system, \"E-mail system\")\nSystem_Ext(mainframe, \"Mainframe Banking System\")\n\nRel(customer, banking_system, \"Uses\")\nRel_Back(customer, mail_system, \"Sends e-mails to\")\nRel_Neighbor(banking_system, mail_system, \"Sends e-mails\")\nRel(banking_system, mainframe, \"Uses\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![custom schema - open link](https://www.plantuml.com/plantuml/svg/dLJlJ-904FtUlsBicHmcAbXGcijnKRZcpWJ1y2DttvfjTmgDsrsoEututz-MHIs8PsBvGFlUl9StivEzDiGqbONmZdAPYf8ZB8bMvbkpgTdZ-IAdPPcK1dMg9A6ayrGLpPLWijAS6U8YJvg3pjbz1StlXis26K9jeNXGATPqlghSlQ_mlNg0bha1WodbIaAgIi4XGJ2aD7B89J1BhfXcX93b0e593XfBisM504LBrC1pjj2iC41AMVESW6EMIpGWyR5wPwKWI9LGsfpQwYn3RVE_C6QbSqApyHUuGFld7HqFniFn9Bw9Bw47_fTkravQeL_3EniyQL-6hQiwtjxWs0g3YquT3pPunfFmgbt7BnoEs4fgFgDeFflS31tNhNwlN7-huI5dcDJnm6KAMCA3EkuoXQrkcwLrtFLmsGcwOLZ7NSy1RxKwDVz9D8o7jwFeW9aZPz7VsGxfpLUS4KO22vGqfIU13N-5sYZfdy9niXXKXz9xdRK5CoN9mRkZgEgLvgZtD1UMC4l6rMCk5psVT8cLjpl86QwfvzzAGYsPW6fx_PE3gN3jQk9tu_K_4SyUrLwMQFrn5lDa28k34-fyOaA19ToEztoj4aNxyncN6j8b8qj1mWnoS0a-6jMxEVkVo6ctzxrHxQMPe719ZaKkqPdihQXr8klXkBqDFR5tn8_g0PGSLFPy1NdU_URe6sbfI1MeJy5tY8tGP_B1xXSCjfmDCzsaQYIEsGx3Qjos8Rrefi_njvBODjOeM2vUDT6P_QurkbieCyqAj6Ltp-y7lErKQidVf9eRDBRCLiLzbZxKIdUJJ55o0xZ9Ou3KLZF2VB5CbDvhzxzg9tshg3MqJULDVu__nCFeLpJwsJZnhgrBMOX_ \"custom schema\")](https://www.plantuml.com/plantuml/uml/dLJlJ-904FtUlsBicHmcAbXGcijnKRZcpWJ1y2DttvfjTmgDsrsoEututz-MHIs8PsBvGFlUl9StivEzDiGqbONmZdAPYf8ZB8bMvbkpgTdZ-IAdPPcK1dMg9A6ayrGLpPLWijAS6U8YJvg3pjbz1StlXis26K9jeNXGATPqlghSlQ_mlNg0bha1WodbIaAgIi4XGJ2aD7B89J1BhfXcX93b0e593XfBisM504LBrC1pjj2iC41AMVESW6EMIpGWyR5wPwKWI9LGsfpQwYn3RVE_C6QbSqApyHUuGFld7HqFniFn9Bw9Bw47_fTkravQeL_3EniyQL-6hQiwtjxWs0g3YquT3pPunfFmgbt7BnoEs4fgFgDeFflS31tNhNwlN7-huI5dcDJnm6KAMCA3EkuoXQrkcwLrtFLmsGcwOLZ7NSy1RxKwDVz9D8o7jwFeW9aZPz7VsGxfpLUS4KO22vGqfIU13N-5sYZfdy9niXXKXz9xdRK5CoN9mRkZgEgLvgZtD1UMC4l6rMCk5psVT8cLjpl86QwfvzzAGYsPW6fx_PE3gN3jQk9tu_K_4SyUrLwMQFrn5lDa28k34-fyOaA19ToEztoj4aNxyncN6j8b8qj1mWnoS0a-6jMxEVkVo6ctzxrHxQMPe719ZaKkqPdihQXr8klXkBqDFR5tn8_g0PGSLFPy1NdU_URe6sbfI1MeJy5tY8tGP_B1xXSCjfmDCzsaQYIEsGx3Qjos8Rrefi_njvBODjOeM2vUDT6P_QurkbieCyqAj6Ltp-y7lErKQidVf9eRDBRCLiLzbZxKIdUJJ55o0xZ9Ou3KLZF2VB5CbDvhzxzg9tshg3MqJULDVu__nCFeLpJwsJZnhgrBMOX_)\n\n## Element and Relationship properties\n\nA model can be extended with (a table of) properties that concrete deployments or more detailed concepts can be documented:\n\n- `SetPropertyHeader(col1Name, ?col2Name, ?col3Name, ?col4Name)`\n  The properties table can have up to 4 columns. The default header uses the column names \"Name\", \"Description\".\n- `WithoutPropertyHeader()`\n  If no header is used, then the second column is bold.\n- `AddProperty(col1, ?col2, ?col3, ?col4)`\n  (All columns of) a property which will be added to the next element.\n\nFollowing sample uses all 3 different property definitions (and the aligned deployment node).\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n\n' default header Property, Value\nAddProperty(\"Name\", \"Flash\")\nAddProperty(\"Organization\", \"Zootopia\")\nAddProperty(\"Tool\", \"Internet Explorer 7.0\")\nPerson(personAlias, \"Label\", \"Optional Description (with default property header)\")\n\nSetPropertyHeader(\"Property\",\"Value\", \"Description\")\nAddProperty(\"Prop1\", \"Value1\", \"Details1\")\nAddProperty(\"Prop2\", \"Value2\", \"Details2\")\nDeployment_Node_L(nodeAlias, \"Label\", \"Optional Type\", \"Optional Description (with custom property header)\") {\n\n  WithoutPropertyHeader()\n  AddProperty(\"PropC1\", \"ValueC1\")\n  AddProperty(\"PropC2\", \"ValueC2\")\n  Container(containerAlias, \"Label\", \"Technology\", \"Optional Description (without property header)\")\n}\n\nSystem(systemAlias, \"Label\", \"Optional Description (without properties)\")\n\n' starting with v.2.5.0 relationships support properties too\nWithoutPropertyHeader()\nAddProperty(\"PropC1\", \"ValueC1\")\nAddProperty(\"PropC2\", \"ValueC2\")\nRel(personAlias, containerAlias, \"Label\", \"Optional Technology\", \"Optional Description\")\n@enduml\n```\n\n[![properties sample - open link](https://www.plantuml.com/plantuml/svg/XP9HRzCm4CVVyobCNfPANR9L82IUDdKWaCfMGG69b-gQ78qbnsVPPqP0V7TiQrsxBYLFFfz_T_R_Vxvo39Pzfx8NKjVADoXQPkFUL9M5-t8hkVKRxz3Mf1arbpLrbL6WOysvuqR9JJL_URwCgIyV5rK7Zj66rFe6ZQA-YqKcNf2TYGP_W5SiMeG6hLXQCcYvdugle3ncrqspInNvBNIOJqN-Je5hyydJmpkx1Ir_0qlI4VfEn6Ga77Ch8XNFFsX6gv75srz6aKKhNfSN0LwYTQGBavPh9S45U04RJ5Lt9lO79MxGrLQcdIZkWoUFIip3LG-I9g5dzXbvzuBtALlaktq-pQFK9EoWwV6pOtGPcGJ7AD0CKhdB8NJsYCuEq5b0zpDOtrA3wqMXmt9QwAetEAAyzewf6n0k_cIP4Dy2G_xOW4auUVRi-LvY28UHlRGGHcHEEgZJeMUzYvx9MM7TQbAqxV-lXVpW0F-64VQEiIjSMeRi6kyeqQNVS2OSGzZghKZ-_IndvQloGbXK40kTSDuOieU5WecoKqwE-ZZguYTKJx_yaPL3KiSz3OslK3U-K_y0 \"properties sample\")](https://www.plantuml.com/plantuml/uml/XP9HRzCm4CVVyobCNfPANR9L82IUDdKWaCfMGG69b-gQ78qbnsVPPqP0V7TiQrsxBYLFFfz_T_R_Vxvo39Pzfx8NKjVADoXQPkFUL9M5-t8hkVKRxz3Mf1arbpLrbL6WOysvuqR9JJL_URwCgIyV5rK7Zj66rFe6ZQA-YqKcNf2TYGP_W5SiMeG6hLXQCcYvdugle3ncrqspInNvBNIOJqN-Je5hyydJmpkx1Ir_0qlI4VfEn6Ga77Ch8XNFFsX6gv75srz6aKKhNfSN0LwYTQGBavPh9S45U04RJ5Lt9lO79MxGrLQcdIZkWoUFIip3LG-I9g5dzXbvzuBtALlaktq-pQFK9EoWwV6pOtGPcGJ7AD0CKhdB8NJsYCuEq5b0zpDOtrA3wqMXmt9QwAetEAAyzewf6n0k_cIP4Dy2G_xOW4auUVRi-LvY28UHlRGGHcHEEgZJeMUzYvx9MM7TQbAqxV-lXVpW0F-64VQEiIjSMeRi6kyeqQNVS2OSGzZghKZ-_IndvQloGbXK40kTSDuOieU5WecoKqwE-ZZguYTKJx_yaPL3KiSz3OslK3U-K_y0)\n\n## Version information\n\nC4-PlantUML offers version information like PlantUML with its `%version()` call.\n\n- `C4Version()`: Current C4-PlantUML version (e.g. `2.4.0beta1`).\n- `C4VersionDetails()`: (Floating) version details with the current PlantUML and C4-PlantUML version. (It can be referenced via the alias `C4VersionDetailsArea`.)\n\n```plantuml\n@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\n' existing plantuml version as text\n%version()\n\n' new C4-Plantuml version as text \nC4Version()\n\n' new C4-Plantuml version details (incl. PlantUML version) as table\nC4VersionDetails()\n\n' version functions used in e.g. footer\nfooter drawn with PlantUML v. %version() and C4-PlantUML v. C4Version()\n@enduml\n```\n\n[![version sample - open link](https://www.plantuml.com/plantuml/svg/ZOynJyCm48Nt_8fZGBH3dQKJKwKmWiG2Axh4r-GavnBvpgG_dvXWjGjIfqJltllytaaDewKnL0yiNKYUO32RzRck8owkPnjIcvHYDucHcEkciPu3IiuSr7pWjcwEX_SiVRozrYEgKLobhsPD80j5DsT-zGHqOJMM7We0lYagJmAeO7Inwl5FsEspNsY1pFx73LLp_Bp7xycGWy8kJtHGkfRx_XU8RQ0hy6MBRDp2EIVfRFrHI4eUM81Sx-0yJKQnsZxW8ou22zjmyv23wp90yQLckTuEEP7ujVqF \"version sample\")](https://www.plantuml.com/plantuml/uml/ZOynJyCm48Nt_8fZGBH3dQKJKwKmWiG2Axh4r-GavnBvpgG_dvXWjGjIfqJltllytaaDewKnL0yiNKYUO32RzRck8owkPnjIcvHYDucHcEkciPu3IiuSr7pWjcwEX_SiVRozrYEgKLobhsPD80j5DsT-zGHqOJMM7We0lYagJmAeO7Inwl5FsEspNsY1pFx73LLp_Bp7xycGWy8kJtHGkfRx_XU8RQ0hy6MBRDp2EIVfRFrHI4eUM81Sx-0yJKQnsZxW8ou22zjmyv23wp90yQLckTuEEP7ujVqF)\n\n## Snippets for Visual Studio Code\n\nBecause the PlantUML support inside of Visual Studio Code is excellent with the [PlantUML extension](https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml), you can also find VS Code snippets for C4-PlantUML at [.vscode/C4.code-snippets](.vscode/C4.code-snippets).\n\nProject level snippets are now supported in [VSCode 1.28](https://code.visualstudio.com/updates/v1_28#_project-level-snippets).\nJust include the `C4.code-snippets` file in the `.vscode` folder of your project.\n\nIt is possible to save them directly inside VS Code: [Creating your own snippets](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_creating-your-own-snippets).\n\n![C4-PlantUML Snippets Video](images/vscode_c4plantuml_snippets.gif)\n\n## Live Templates for IntelliJ\n\n### Prerequisites\n\nDownload and install [Graphviz](https://graphviz.gitlab.io/download/) plus the [PlantUML Integration for IntelliJ](https://plugins.jetbrains.com/plugin/7017-plantuml-integration).\n\nOR\n\nInstall the [AsciiDoc plugin for IntelliJ](https://plugins.jetbrains.com/plugin/7391-asciidoc) if you work with AsciiDoc files rather than `.puml` files.\n\n### Install\n\n1. Download [IntelliJ live template](intellij/c4_live_template.zip).  \n2. Select `File | Manage IDE Settings | Import Settings` from the IntelliJ IDEA menu.\n3. Specify the path to the downloaded ZIP file: `c4_live_template.zip`.\n4. In the Import Settings dialog, select the Live templates checkbox and click OK.\n5. Restart IntelliJ.\n\nAlternatively\n\n1. Download [IntelliJ live template](intellij/c4_live_template.zip) ZIP file.\n2. Unzip it and copy its `c4.xml` to the `/template` directory in the [IntelliJ settings directory](https://intellij-support.jetbrains.com/hc/en-us/articles/206544519-Directories-used-by-the-IDE-to-store-settings-caches-plugins-and-logs).\n3. Restart IntelliJ.\n\n### Usage\n\n- Create new PlantUML file (.puml).\n- Type `c4_` for displaying artifacts templates for C4-PlantUML\n- Live template create correct C4 model artifact with stubbed arguments.\n  - E.g. alias, label, type, technology, description\n- Replace stubbed arguments with desired values.\n\n![C4-PlantUML Snippets Video](images/intellij_c4plantum_live_template1.gif)\n![C4-PlantUML Snippets Video](images/intellij_c4plantum_live_template2.gif)\n\n## Advanced Samples\n\nThe following advanced samples are reproductions with C4-PlantUML from official [C4 model samples](https://c4model.com/#examples) created by [Simon Brown](https://simonbrown.je/).\n\nThe core diagram samples from [c4model.com](https://c4model.com/#coreDiagrams) are available [here](samples/C4CoreDiagrams.md).\n\n### techtribes.js\n\nSource: [C4_Container Diagram Sample - techtribesjs.puml](samples/C4_Container%20Diagram%20Sample%20-%20techtribesjs.puml)\n\n[![techtribesjs - open link](https://www.plantuml.com/plantuml/svg/ZLHDR-Cs4BthLqnzMGVGshj9jm5wMYTEazqw7uta1Zq9b3YMcLAaIb9nZAB_lKDAaQsuWEk39G_V3D-RUUElrZ7Zcah2o66nTaRaQ9_jAFf1g48s767jN6r_dauDsqnAuTPDtbWqXLOEbPiKkfhMaYbVugDrN8fyUldZnmSVMjukfXMp3Ws5ialAO4AXcTI4ZJv0eoYveYBWrWWhBQNU25M2910mnM5mB8obDmrqEKXTC2ctLADdUNX1j9ZzSRzCi_J-8PlVFzsDJw8FNMYMPCclL-db3SMwqDEtz2PRN5rVtSqf64KFQAnMsTMh6pEbrRRIZSsyy1X6ixS0B2amEkd0OrQM1alcaFV8Fl8UoYkXX7M6EQ5L3nz4trAYP6iTLjc5RXHdPZikFiVxqvhGk4x-Ze0-uQllmtY3USRgcj1FcCEihgKeGkaHXRwp5nP3KXlVyzlVBsD8TKN7S3vvzUSpFmyBdfhrZNyHk84QTIqnXlRc63eRn80lzA30iyxf6rqnWPNH5Ssk6nTumZ5mGHvYCiptMmeM2wUzo27pUJusA3EU4uz7b84p9SsPOpcpwEdTRfFV5l1bygLbcr0Pj0VymXCgh79IiHOrHPZyqxxdcpDUUlYrS3TD3WPhtQaue3PU2OasJ8Ik_OL-G3kVaVyvIyzEz-XOPAPOWr0SNz7-bqobxL-I4kuqoGa28UG6YLgLUdu1fvFJWSZGsCSacSuSlQmGkOLnBdK9HDlPaz1Sjq5qzf1-KtFcWjkMxTkR5-3SewoMw9qowW4MQgE3wBWhEknJkAtp0MW536onHjv8v4334fx3Fxs9_KAvZN0jXRHz8yJUSVidGwVjBSD3BzFIsGKzWxg8_76meZlZqmvPh-KcJHyImXDwkAV7uSDTFPeISlhZFHiptetEDsnZX6-jqpwLHZ_zFh-W5QorSN1szkadAZIeitFTeDPxMB3J4B5df8qmwAVfTA5bTzdf-QVFvntjRDdRunXnGh4Zx0Vb1loVUl47k23WIBl-hvnTrPtZhj7rXWQXLjfKOQoxdUdRrazqK6hdJe8EA-IwSL0tkHG559fZkn_2QIFmIDNErg5elqoD5QhqYnx8zSi-BEMrBjWsU-p_CNUjfgElg7XJoNy1 \"techtribesjs\")](https://www.plantuml.com/plantuml/uml/ZLHDR-Cs4BthLqnzMGVGshj9jm5wMYTEazqw7uta1Zq9b3YMcLAaIb9nZAB_lKDAaQsuWEk39G_V3D-RUUElrZ7Zcah2o66nTaRaQ9_jAFf1g48s767jN6r_dauDsqnAuTPDtbWqXLOEbPiKkfhMaYbVugDrN8fyUldZnmSVMjukfXMp3Ws5ialAO4AXcTI4ZJv0eoYveYBWrWWhBQNU25M2910mnM5mB8obDmrqEKXTC2ctLADdUNX1j9ZzSRzCi_J-8PlVFzsDJw8FNMYMPCclL-db3SMwqDEtz2PRN5rVtSqf64KFQAnMsTMh6pEbrRRIZSsyy1X6ixS0B2amEkd0OrQM1alcaFV8Fl8UoYkXX7M6EQ5L3nz4trAYP6iTLjc5RXHdPZikFiVxqvhGk4x-Ze0-uQllmtY3USRgcj1FcCEihgKeGkaHXRwp5nP3KXlVyzlVBsD8TKN7S3vvzUSpFmyBdfhrZNyHk84QTIqnXlRc63eRn80lzA30iyxf6rqnWPNH5Ssk6nTumZ5mGHvYCiptMmeM2wUzo27pUJusA3EU4uz7b84p9SsPOpcpwEdTRfFV5l1bygLbcr0Pj0VymXCgh79IiHOrHPZyqxxdcpDUUlYrS3TD3WPhtQaue3PU2OasJ8Ik_OL-G3kVaVyvIyzEz-XOPAPOWr0SNz7-bqobxL-I4kuqoGa28UG6YLgLUdu1fvFJWSZGsCSacSuSlQmGkOLnBdK9HDlPaz1Sjq5qzf1-KtFcWjkMxTkR5-3SewoMw9qowW4MQgE3wBWhEknJkAtp0MW536onHjv8v4334fx3Fxs9_KAvZN0jXRHz8yJUSVidGwVjBSD3BzFIsGKzWxg8_76meZlZqmvPh-KcJHyImXDwkAV7uSDTFPeISlhZFHiptetEDsnZX6-jqpwLHZ_zFh-W5QorSN1szkadAZIeitFTeDPxMB3J4B5df8qmwAVfTA5bTzdf-QVFvntjRDdRunXnGh4Zx0Vb1loVUl47k23WIBl-hvnTrPtZhj7rXWQXLjfKOQoxdUdRrazqK6hdJe8EA-IwSL0tkHG559fZkn_2QIFmIDNErg5elqoD5QhqYnx8zSi-BEMrBjWsU-p_CNUjfgElg7XJoNy1)\n\n### Message Bus and Microservices\n\nSource: [C4_Container Diagram Sample - message bus.puml](samples/C4_Container%20Diagram%20Sample%20-%20message%20bus.puml)\n\n[![messagebus - open link](https://www.plantuml.com/plantuml/svg/ZLLDR-Cs4BtxLqpT0dK09yOMFHK8iFumkhjm4gzbOoy5Z94qbeYbI8Aad7MB_lSE9LjX4WLD3Z4vd7dlpGUfZywZzNKb1py9bSaw9oYzD-wFoSJYuqqXV5cdjIERQUL9-PjCLnCZKOMOQ-TpATB9_FVhTJ3jxbQJ2fqdowRzd2DGAB8t9k3_2hNYu8f1m9S41osbVXIg0CbEW2g7PyV2EbvfO7AGEaCfJupHgNnDC9Zc-L9IGDXYCHfM8hCw8NiK6Gt7y8ihqT3jKXIbJqHEUHBseoi-IOkvbjhU3kVQgWEh8ZkJTHDqO8xpuMCfV6EJL93Aj_J3txOau5gMlnG5T701VdZrKf3psc8HQTdeMh7dJF_eqI8ReTzFRobX_47owU7RVhtS90_t-uVTTlNvVZbYyvgiqsgKrSnOaHt3l5iDft0nDm0dxbQrdmKXQ4-Zx0ExNBpXipfeMw4NMWslu9y1y5zNz14Q4pjFZP4YQvtP_WMFw38hZ1_3L1MrH1lCqz1qrsbmeSCLAYmeT5rOC5OVXEJiNh1T8lRdMiVKNPDRsZ4aneR1ccdjWt5R4XWjb0Tz0CmoSWuuiqu5Y2XHBhN7mi4jn1FqMb35A2nxdzQEAUxQ7Sng5nWtcAR2ttrjs2qgPxJr3IUx2nK4q96KTwzWBGLNLXybkhdOuamtTNeAltDBwCc12Xb8uIY773qsPBOBDBKrsf5xTtfOvy976gPX7_FFVvxSt2-tORcs-YXorg1jWKguff3NZso21YO8E60c92_VBs6HFZKzJ-D-Bz1ZYgwHyM0namGVVil2Bl7QallVnhOtiOSnAZzJnfMFEUzEoTTLH8UNulzDEHp9EgPhHatAhjzFJS4SIftrzAPNONzR-3HgIjW5EKiUgMxRgOjg09Zgsfz73to97aey4lypXXJb_Gh-7Gms9FUBw45fx_wk5JtyjDsk4tOykpM7FVTrPxW6RtG7GfcA08RkfB8nVE4tRV8CUDVp1hGw4bAvwxBI0UKRfOdElfFdwBU2enlSWNJQwaPi1DhWzA34CzhLl6csQ1_2nMn-Jk7vcz5tqzyd8ePfRzZx8IvIUjWxKsygBVKBjdWSkuYMguqPhF2qt_ImFTTz-PQjbdykxnVy3Vl8MTIL_0y0 \"messagebus\")](https://www.plantuml.com/plantuml/uml/ZLLDR-Cs4BtxLqpT0dK09yOMFHK8iFumkhjm4gzbOoy5Z94qbeYbI8Aad7MB_lSE9LjX4WLD3Z4vd7dlpGUfZywZzNKb1py9bSaw9oYzD-wFoSJYuqqXV5cdjIERQUL9-PjCLnCZKOMOQ-TpATB9_FVhTJ3jxbQJ2fqdowRzd2DGAB8t9k3_2hNYu8f1m9S41osbVXIg0CbEW2g7PyV2EbvfO7AGEaCfJupHgNnDC9Zc-L9IGDXYCHfM8hCw8NiK6Gt7y8ihqT3jKXIbJqHEUHBseoi-IOkvbjhU3kVQgWEh8ZkJTHDqO8xpuMCfV6EJL93Aj_J3txOau5gMlnG5T701VdZrKf3psc8HQTdeMh7dJF_eqI8ReTzFRobX_47owU7RVhtS90_t-uVTTlNvVZbYyvgiqsgKrSnOaHt3l5iDft0nDm0dxbQrdmKXQ4-Zx0ExNBpXipfeMw4NMWslu9y1y5zNz14Q4pjFZP4YQvtP_WMFw38hZ1_3L1MrH1lCqz1qrsbmeSCLAYmeT5rOC5OVXEJiNh1T8lRdMiVKNPDRsZ4aneR1ccdjWt5R4XWjb0Tz0CmoSWuuiqu5Y2XHBhN7mi4jn1FqMb35A2nxdzQEAUxQ7Sng5nWtcAR2ttrjs2qgPxJr3IUx2nK4q96KTwzWBGLNLXybkhdOuamtTNeAltDBwCc12Xb8uIY773qsPBOBDBKrsf5xTtfOvy976gPX7_FFVvxSt2-tORcs-YXorg1jWKguff3NZso21YO8E60c92_VBs6HFZKzJ-D-Bz1ZYgwHyM0namGVVil2Bl7QallVnhOtiOSnAZzJnfMFEUzEoTTLH8UNulzDEHp9EgPhHatAhjzFJS4SIftrzAPNONzR-3HgIjW5EKiUgMxRgOjg09Zgsfz73to97aey4lypXXJb_Gh-7Gms9FUBw45fx_wk5JtyjDsk4tOykpM7FVTrPxW6RtG7GfcA08RkfB8nVE4tRV8CUDVp1hGw4bAvwxBI0UKRfOdElfFdwBU2enlSWNJQwaPi1DhWzA34CzhLl6csQ1_2nMn-Jk7vcz5tqzyd8ePfRzZx8IvIUjWxKsygBVKBjdWSkuYMguqPhF2qt_ImFTTz-PQjbdykxnVy3Vl8MTIL_0y0)\n\n### (C4 styled) Sequence diagram sample\n\nTODO: better sample is missing ...\n\nSource: [C4_Sequence Diagram Sample - complex.puml](samples/C4_Sequence%20Diagram%20Sample%20-%20complex.puml)\n\n[![sequence - open link](https://www.plantuml.com/plantuml/svg/hP1FQzn03CNlyocKd19ex2saby12jabe2saQTbjw3BDZkHQHDQwbsK8_VMMd8OSD_GCPi8sUzNvlf7ErE5hfEHnOXpt2nUbT4J9ie1rp3vtPe6TrFSOVrJUohcoBufYo68fLAVVrm54cm8bQmxIjBqvFRYVfoyVhkezgEDOpMSC1IUBIuCj0_Q8R_5vG4bR3D42unL6p7AsO4hw2m_bxUFmelyrR5_tjKeZ9Q1SDmUiGriYFBgydQx4EnIX5eoomddBKPYCRQ4a9LTl2aA9Y03yJOlREd7t4oYs3OUCCP4NGt2FSapIGMsWZSHaVG9pp0AyNYmKOJKk3tsVlZfSt6rYPnNJlJF23qeJf2IEsa7SumbC_d049sJEZTiYSdV3aSjrvdpjII55WYv351KN_6HcO17KA0dU4i5p21oTJPFhvCEfo-JyR_TlYrgX35aLlzIml1pJwGuvajuyG_palxZdsSgkgWZVGanH31OxcxQuz4vyYiyAE8WnTbjcyUV_fwztrrRkhcykZut2EqfIUVm40 \"sequence\")](https://www.plantuml.com/plantuml/uml/hP1FQzn03CNlyocKd19ex2saby12jabe2saQTbjw3BDZkHQHDQwbsK8_VMMd8OSD_GCPi8sUzNvlf7ErE5hfEHnOXpt2nUbT4J9ie1rp3vtPe6TrFSOVrJUohcoBufYo68fLAVVrm54cm8bQmxIjBqvFRYVfoyVhkezgEDOpMSC1IUBIuCj0_Q8R_5vG4bR3D42unL6p7AsO4hw2m_bxUFmelyrR5_tjKeZ9Q1SDmUiGriYFBgydQx4EnIX5eoomddBKPYCRQ4a9LTl2aA9Y03yJOlREd7t4oYs3OUCCP4NGt2FSapIGMsWZSHaVG9pp0AyNYmKOJKk3tsVlZfSt6rYPnNJlJF23qeJf2IEsa7SumbC_d049sJEZTiYSdV3aSjrvdpjII55WYv351KN_6HcO17KA0dU4i5p21oTJPFhvCEfo-JyR_TlYrgX35aLlzIml1pJwGuvajuyG_palxZdsSgkgWZVGanH31OxcxQuz4vyYiyAE8WnTbjcyUV_fwztrrRkhcykZut2EqfIUVm40)\n\n## Background\n\n[PlantUML](https://plantuml.com/) is an open source project that allows you to create UML diagrams.\nDiagrams are defined using a simple and intuitive language.\nImages can be generated in PNG, in SVG or in LaTeX format.\n\nPlantUML was created to allow the drawing of UML diagrams, using a simple and human readable text description.\nBecause it does not prevent you from drawing inconsistent diagrams, it is a drawing tool and not a modeling tool.\nIt is the most used text-based diagram drawing tool with [extensive support into wikis and forums, text editors and IDEs, use by different programming languages and documentation generators](https://plantuml.com/running).\n\nThe [C4 model](https://c4model.com/) for software architecture is an \"abstraction-first\" approach to diagramming, based upon abstractions that reflect how software architects and developers think about and build software.\nThe small set of abstractions and diagram types makes the C4 model easy to learn and use.\nC4 stands for context, containers, components, and code — a set of hierarchical diagrams that you can use to describe your software architecture at different zoom levels, each useful for different audiences.\n\nThe C4 model was created as a way to help software development teams describe and communicate software architecture, both during up-front design sessions and when retrospectively documenting an existing codebase.\n\nMore information can be found here:\n\n- [The C4 model for software architecture](https://c4model.com/)\n- [REAL WORLD PlantUML - Sample Gallery](https://real-world-plantuml.com/)\n- [Visualising and documenting software architecture cheat sheets](https://www.codingthearchitecture.com/2017/04/27/visualising_and_documenting_software_architecture_cheat_sheets.html)\n- [PlantUML and Structurizr - Create models not diagrams](https://www.codingthearchitecture.com/2016/12/08/plantuml_and_structurizr.html)\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details\n"
  },
  {
    "path": "Themes.md",
    "content": "# Themes - different styles and languages\n\n[![Rounded (corner) style sample - open link](https://www.plantuml.com/plantuml/png/hLRHZzgu4txdhvZI_bJuYGLLRLzEMgaivAvRmS8HjhrxGfDaIAmwTivseEXq__kD4qB8RgK-z5uWdl5yt-VFOoSVh4FZobpsNWF6JXpGaGL5Hx3k96aCzmuojE0qH0IM7F_jjI50S1db1Dhmu-pTxl-m5v90M10gbcL2IU_5PlNuC0_ckt3xvoAuVTC3wBquPo5phh2_J2O6Z-DKkAoCIaicrigHSkDOvvD2elBARgnBf8WcitStQnzwN2ucELf7XaEx6LUWK6J6XLz5B_ou-h9R1vjmzR1RFMuNzm_1OCYBss9gmPP5eOq3fS4M69CNwzS12dE2GOIM4j1rg5G96IcKK2buCjBkL90TmJ4JSGQ9LgzT0zYWeJhbsj1m3Cnulx-43O6XlqfYdAIXb9IIIaRdVt3qpS6HZQYBhanFQ2yKspbDaa2ovShnMWRz2EElN7XPVty4h_Oyc6cfpUshO14iWuVjxjSL_ynMYzM6yr5QP_iltxvzFv--zpKsmu9k0v5cBXIyRQ4V3uQSgPLjMTXjmmPnGmS3yYLWVSsmF_JoDYGhQMXFAlROlAX6ptIpuOtfg96CSvtj94BVVhTpj1ab2w5OKOV2Cqp-GnxjNClJSy99Wekra0XC3URr_XZjMoE1GQmD9uVrIUdrrcIiLeEuj4xdP4Omkpprfz24GU-hxOzGVHtLW4LLYBAA0SOn4pZRPntXoJhATtUU4Srf4BzXh7lbY8aTtF5qxix-4Fxk0K2hTt2aQ8T5mPE_K0JJef0YHYUqwdFe4nvm165Xk1QMdsS-DYSf3YoZacOTputXV1O1LLA5BxnHpGlXUieYkyosG8OBEItfPeqfUVQ6DOoDADm8fYej9HeVNXjz48a_8r9-dsLVgjXBHodS2Po-E6dX8D3N20EyO8YCFbeopoJbEXAIpdui_U0YQlPo17zWZcn5Lmn8aGj_M6qPMNAWzpyXhXO02Hr4J4_bpQD1WWxzrUFtuVperOI_Bw0pTjgG1NzDWg5KM6VGSuDGUstowda4MNLY04kNGMme8UK4IZloVKNMWjGf3yZ5usT6dSyuEoLyowxllzyvSytJJ5lNSUu73dbJ6BWwivZQssUt68lwvzBtmJSte1o5tDagm4J1pPB7K4_mpDkCG5IaA64fOgEjtZi8liKPgfJ0rZE7rvXdRIqgOwgzmPoQCzKIDBQZb4qNn1nerdTjFc2aIzUsmEXobaVW32gBbHEj_RqDoQlxeZsrZvQiv_wutQv3djYTPmlyuPocwLkuccxtuA_jIBTtH0NNtW1df2hOROY6iBfrH_29tx2JYhpTpIfrHcWL_1pGxewBMzdjOUc2RWWJ2tkZy-h2EXhXo8BJdkZCCx-RCUG5yygj9qqMCgm5kl7H2gCLqkt7ZeQdTQNb_cZfm-LspK2TFUYKTxkozUdgNSUtrNBnrAispV3rzyyY-2ruc0-6lRtMZWma1e-gVjaqdr1m6CF__8OBhGR3oZF_WTLcUVYvIVS-iCeob_y2 \"Rounded (corner) style sample\")](https://www.plantuml.com/plantuml/uml/hLRHZzgu4txdhvZI_bJuYGLLRLzEMgaivAvRmS8HjhrxGfDaIAmwTivseEXq__kD4qB8RgK-z5uWdl5yt-VFOoSVh4FZobpsNWF6JXpGaGL5Hx3k96aCzmuojE0qH0IM7F_jjI50S1db1Dhmu-pTxl-m5v90M10gbcL2IU_5PlNuC0_ckt3xvoAuVTC3wBquPo5phh2_J2O6Z-DKkAoCIaicrigHSkDOvvD2elBARgnBf8WcitStQnzwN2ucELf7XaEx6LUWK6J6XLz5B_ou-h9R1vjmzR1RFMuNzm_1OCYBss9gmPP5eOq3fS4M69CNwzS12dE2GOIM4j1rg5G96IcKK2buCjBkL90TmJ4JSGQ9LgzT0zYWeJhbsj1m3Cnulx-43O6XlqfYdAIXb9IIIaRdVt3qpS6HZQYBhanFQ2yKspbDaa2ovShnMWRz2EElN7XPVty4h_Oyc6cfpUshO14iWuVjxjSL_ynMYzM6yr5QP_iltxvzFv--zpKsmu9k0v5cBXIyRQ4V3uQSgPLjMTXjmmPnGmS3yYLWVSsmF_JoDYGhQMXFAlROlAX6ptIpuOtfg96CSvtj94BVVhTpj1ab2w5OKOV2Cqp-GnxjNClJSy99Wekra0XC3URr_XZjMoE1GQmD9uVrIUdrrcIiLeEuj4xdP4Omkpprfz24GU-hxOzGVHtLW4LLYBAA0SOn4pZRPntXoJhATtUU4Srf4BzXh7lbY8aTtF5qxix-4Fxk0K2hTt2aQ8T5mPE_K0JJef0YHYUqwdFe4nvm165Xk1QMdsS-DYSf3YoZacOTputXV1O1LLA5BxnHpGlXUieYkyosG8OBEItfPeqfUVQ6DOoDADm8fYej9HeVNXjz48a_8r9-dsLVgjXBHodS2Po-E6dX8D3N20EyO8YCFbeopoJbEXAIpdui_U0YQlPo17zWZcn5Lmn8aGj_M6qPMNAWzpyXhXO02Hr4J4_bpQD1WWxzrUFtuVperOI_Bw0pTjgG1NzDWg5KM6VGSuDGUstowda4MNLY04kNGMme8UK4IZloVKNMWjGf3yZ5usT6dSyuEoLyowxllzyvSytJJ5lNSUu73dbJ6BWwivZQssUt68lwvzBtmJSte1o5tDagm4J1pPB7K4_mpDkCG5IaA64fOgEjtZi8liKPgfJ0rZE7rvXdRIqgOwgzmPoQCzKIDBQZb4qNn1nerdTjFc2aIzUsmEXobaVW32gBbHEj_RqDoQlxeZsrZvQiv_wutQv3djYTPmlyuPocwLkuccxtuA_jIBTtH0NNtW1df2hOROY6iBfrH_29tx2JYhpTpIfrHcWL_1pGxewBMzdjOUc2RWWJ2tkZy-h2EXhXo8BJdkZCCx-RCUG5yygj9qqMCgm5kl7H2gCLqkt7ZeQdTQNb_cZfm-LspK2TFUYKTxkozUdgNSUtrNBnrAispV3rzyyY-2ruc0-6lRtMZWma1e-gVjaqdr1m6CF__8OBhGR3oZF_WTLcUVYvIVS-iCeob_y2)\n\n[![Theme sample - open link](https://www.plantuml.com/plantuml/svg/hLRHRzks4txtNt5r-qCTG8dnGzkN0G7gsDwQmauyosttCC0uYMU9A4Lg91N76FQ_xqXRLknqw83r9J6FlE_x-F5uudldqVgcKhqNlgIAOFnstMZfIS36cWfAxsltqt1eSNjLI5ysMUF8vaPxqlugDzMmLgW3mANpGibiE7vxkGYXJ_FPi4BdoGuZikkza3fNZQ0V0yf2nvo1KfEzgiCEUkc7-o_hnNIPtj-jxp-jPhTtqy55xpMii73WchesreCsu6hCoO7KmCf0OqKmoD2H0BCFDLgGLL9BNK0W8-DtDRa4jgNCIn16l_OjO8k6UbSPInTNm8otcsFO4bZweo764IsbeeAqI0x_mTEZXoqRiK-24Xru0nc1e8tK97eZ8QQAAjAUzpBePvX_vSJZ_li9lDhmO6oKiTUlfhFfV7gtMlzypt_6zxFx9SzdnNws__BDctUJqRkGuqgiwNegYzAdKf18mtXmmJDxPIiMTjsoGTxI_Quff80BEVsBe6v9AYf3jzDvWEOzjN96ooMVIwj3CS8_JgH-f-XwWguaCPEQjPoW1_3XZw4mtdSKFI-z8ZZw2K9YOR62ZR5mgprPJHvkK7yD5P7kdAUgrrkGTKOFyiPvKv5DO7pyrHz16mQpYMUUSNQoF-Kw9gAACS0yDutshiywzj3h6mu8jBj1_d_6EXVGlu0_Um3GwHriALjZNVFYBvJ1gAwLpD5Be_iS-eWFc41Qso1-_daSOXDIye5bH6dEyzeS3XSGK8iOFl9cxSON8nPvokngPBYKfnLTBh2WmDwofhcLjKzWf8j6eGtXXJKFKf03LEhRB9j6vq4wAkbtu0qx6Orqy20nf4WBl5_8hDawiiyKLIQJYWvspEEWrJH-cS1lMA6L-bGBA5d5fkUQp947i_dNsjmpSNi18EX1vdGkRv8D17eCxIOSm-5dK9F-EeEJiJUM78JM29OAwRoDHmfISrbMyNS2PRmhW8ql8RSaI7k9oYMXhCWvKARW0VdywfbHXtlDJibGiOlRRnVEnF0os-MTEFSTXu8f31nlAnRk-bddOb5_7Sj--kW7LA5KQnS3J3IzdFFuSEK2yweaa94K5SnbReqp6m_Jnxn4NH3iCnds2UP1MuVAc7fZiQApEztP7igphOAS0-t-dfeFc9d6ToMG7Azo0jwYTXYTwEplBKazQHVTfVtao0Nk3wlL8kM5f-jSZTzTqnPz1xUdMz-5LfsPhaL4kAu1791YyBGWMiBORnFuo5_LOIJlJZDE7H0w1VyDQ7t3oPtixhASWYu9XOjlbDYljbPwSk1D83hmJ6x637d4VEBMMP6b3Ek0BaCqOdH2JklnJCDfNkEuFZhwTBvQx86wpPoadrLbvrFtbUDkDP-TUzLDC_p-pJER_ZAzc_1RPsEC9ml2ubRllpNjimaUhk1_uS2bqOEBw5buL7MpFFpSJlVUiygcKdy3 \"Theme sample\")](https://www.plantuml.com/plantuml/uml/hLRHRzks4txtNt5r-qCTG8dnGzkN0G7gsDwQmauyosttCC0uYMU9A4Lg91N76FQ_xqXRLknqw83r9J6FlE_x-F5uudldqVgcKhqNlgIAOFnstMZfIS36cWfAxsltqt1eSNjLI5ysMUF8vaPxqlugDzMmLgW3mANpGibiE7vxkGYXJ_FPi4BdoGuZikkza3fNZQ0V0yf2nvo1KfEzgiCEUkc7-o_hnNIPtj-jxp-jPhTtqy55xpMii73WchesreCsu6hCoO7KmCf0OqKmoD2H0BCFDLgGLL9BNK0W8-DtDRa4jgNCIn16l_OjO8k6UbSPInTNm8otcsFO4bZweo764IsbeeAqI0x_mTEZXoqRiK-24Xru0nc1e8tK97eZ8QQAAjAUzpBePvX_vSJZ_li9lDhmO6oKiTUlfhFfV7gtMlzypt_6zxFx9SzdnNws__BDctUJqRkGuqgiwNegYzAdKf18mtXmmJDxPIiMTjsoGTxI_Quff80BEVsBe6v9AYf3jzDvWEOzjN96ooMVIwj3CS8_JgH-f-XwWguaCPEQjPoW1_3XZw4mtdSKFI-z8ZZw2K9YOR62ZR5mgprPJHvkK7yD5P7kdAUgrrkGTKOFyiPvKv5DO7pyrHz16mQpYMUUSNQoF-Kw9gAACS0yDutshiywzj3h6mu8jBj1_d_6EXVGlu0_Um3GwHriALjZNVFYBvJ1gAwLpD5Be_iS-eWFc41Qso1-_daSOXDIye5bH6dEyzeS3XSGK8iOFl9cxSON8nPvokngPBYKfnLTBh2WmDwofhcLjKzWf8j6eGtXXJKFKf03LEhRB9j6vq4wAkbtu0qx6Orqy20nf4WBl5_8hDawiiyKLIQJYWvspEEWrJH-cS1lMA6L-bGBA5d5fkUQp947i_dNsjmpSNi18EX1vdGkRv8D17eCxIOSm-5dK9F-EeEJiJUM78JM29OAwRoDHmfISrbMyNS2PRmhW8ql8RSaI7k9oYMXhCWvKARW0VdywfbHXtlDJibGiOlRRnVEnF0os-MTEFSTXu8f31nlAnRk-bddOb5_7Sj--kW7LA5KQnS3J3IzdFFuSEK2yweaa94K5SnbReqp6m_Jnxn4NH3iCnds2UP1MuVAc7fZiQApEztP7igphOAS0-t-dfeFc9d6ToMG7Azo0jwYTXYTwEplBKazQHVTfVtao0Nk3wlL8kM5f-jSZTzTqnPz1xUdMz-5LfsPhaL4kAu1791YyBGWMiBORnFuo5_LOIJlJZDE7H0w1VyDQ7t3oPtixhASWYu9XOjlbDYljbPwSk1D83hmJ6x637d4VEBMMP6b3Ek0BaCqOdH2JklnJCDfNkEuFZhwTBvQx86wpPoadrLbvrFtbUDkDP-TUzLDC_p-pJER_ZAzc_1RPsEC9ml2ubRllpNjimaUhk1_uS2bqOEBw5buL7MpFFpSJlVUiygcKdy3)\n\n[![Language sample - open link](https://www.plantuml.com/plantuml/svg/hP5FQzH06CRlyoccww5Ps2PKUlBKDLti8Tq6aogUmknct8qaap2Pi1GHp8n_11L5QuitbMAhGbKMyRAs7-QrtVqOJjBQ7hoQKtZUv_szpvCivu9mKIGncXD3cb1iBpc43GeoeC4TaX56SuflypJ1Go6o_8fbSJ8o1v4O5hqYfxoVCa6PCFjfOcKnOHLg8HTX7FKiUsd1hQIDDSTAI2uej-eREPgBM3ykGlfVe5eARBr18aQvcLLTaDE-jRxX1qwxk-BPRRTZD15oASzJPf0mYLWBDwO7xwSl7ytkFsmqaRUfGKbmDIrOIFYcqLziuNcGFq2DGUs0-ZBVn7SHri_v8MD4Um79Caq2-H7a7gXja1zg-sUGtq5DGFu4fVLnGvliIotSzbops_4rX5DysLp4QpViQZRRVNpovXkK1_ue4heHo2EGkw3UWVfKlun1lZhvkZMRA2ZVWdmAvMiezw5y1kKUbC-XFDIwxd7lh8aXJa6QVORKGtITnd_RNuJ__UjekhL_YgsohFg-wsbtPJvtNU10FQWJJK0zqQ6ENsmV7-xykusyrVMRWTEvrkckw6-_J5ce_yiV \"Language sample\")](https://www.plantuml.com/plantuml/uml/hP5FQzH06CRlyoccww5Ps2PKUlBKDLti8Tq6aogUmknct8qaap2Pi1GHp8n_11L5QuitbMAhGbKMyRAs7-QrtVqOJjBQ7hoQKtZUv_szpvCivu9mKIGncXD3cb1iBpc43GeoeC4TaX56SuflypJ1Go6o_8fbSJ8o1v4O5hqYfxoVCa6PCFjfOcKnOHLg8HTX7FKiUsd1hQIDDSTAI2uej-eREPgBM3ykGlfVe5eARBr18aQvcLLTaDE-jRxX1qwxk-BPRRTZD15oASzJPf0mYLWBDwO7xwSl7ytkFsmqaRUfGKbmDIrOIFYcqLziuNcGFq2DGUs0-ZBVn7SHri_v8MD4Um79Caq2-H7a7gXja1zg-sUGtq5DGFu4fVLnGvliIotSzbops_4rX5DysLp4QpViQZRRVNpovXkK1_ue4heHo2EGkw3UWVfKlun1lZhvkZMRA2ZVWdmAvMiezw5y1kKUbC-XFDIwxd7lh8aXJa6QVORKGtITnd_RNuJ__UjekhL_YgsohFg-wsbtPJvtNU10FQWJJK0zqQ6ENsmV7-xykusyrVMRWTEvrkckw6-_J5ce_yiV)\n\n- [📄 C4-PlantUML](README.md#c4-plantuml)\n- [📄 Layout Options](LayoutOptions.md#layout-options)\n- [📄 Themes (different styles and languages)](#themes---different-styles-and-languages)\n  - [Additional styles](#additional-styles)\n    - [Rounded rectangle style (without color changes, `!ROUNDED_STYLE=1`)](#rounded-rectangle-style-without-color-changes-rounded_style1)\n    - [Update basic themes with a new, modernized style (`!NEW_C4_STYLE=1`)](#update-basic-themes-with-a-new-modernized-style-new_c4_style1)\n  - [Use theme](#use-theme)\n  - [List of available C4 style themes](#list-of-available-c4-style-themes)\n    - [C4_blue](#c4_blue)\n      - [C4_blue with `!NEW_C4_STYLE=1`](#c4_blue-with-new_c4_style1)\n      - [C4_blue_new (**without** `!NEW_C4_STYLE=1`)](#c4_blue_new-without-new_c4_style1)\n    - [C4_brown](#c4_brown)\n      - [C4_brown_new (**without** `!NEW_C4_STYLE=1`)](#c4_brown_new-without-new_c4_style1)\n    - [C4_green](#c4_green)\n      - [C4_green_new (**without** `!NEW_C4_STYLE=1`)](#c4_green_new-without-new_c4_style1)\n    - [C4_sandstone](#c4_sandstone)\n    - [C4_superhero](#c4_superhero)\n    - [C4_united](#c4_united)\n    - [C4_violet](#c4_violet)\n      - [C4_violet_new (**without** `!NEW_C4_STYLE=1`)](#c4_violet_new-without-new_c4_style1)\n  - [Matt Weagle themes](#matt-weagle-themes)\n  - [Write custom themes](#write-custom-themes)\n    - [Following variables could be set in a theme, additional to the skinparams and styles](#following-variables-could-be-set-in-a-theme-additional-to-the-skinparams-and-styles)\n    - [(C4 styled) Sequence diagram and themes](#c4-styled-sequence-diagram-and-themes)\n  - [List of available C4 language themes](#list-of-available-c4-language-themes)\n    - [C4Language_english](#c4language_english)\n    - [C4Language_chinese](#c4language_chinese)\n    - [C4Language_danish](#c4language_danish)\n    - [C4Language_dutch](#c4language_dutch)\n    - [C4Language_german](#c4language_german)\n    - [C4Language_italian](#c4language_italian)\n    - [C4Language_japanese](#c4language_japanese)\n    - [C4Language_korean](#c4language_korean)\n    - [C4Language_portuguese](#c4language_portuguese)\n    - [C4Language_russian](#c4language_russian)\n    - [C4Language_spanish](#c4language_spanish)\n    - [C4Language_ukrainian](#c4language_ukrainian)\n- samples\n  - [📄 C4 Model Diagrams](samples/C4CoreDiagrams.md#c4-model-diagrams)\n\n## Additional styles\n\n### Rounded rectangle style (without color changes, `!ROUNDED_STYLE=1`)\n\nTo enable rounded rectangles without changing any colors, use one of the following methods:\n\n- Add `!ROUNDED_STYLE=1` before including any C4_* files\n- Pass the command line argument `-DROUNDED_STYLE=1` to PlantUML\n\n> [!WARNING]\n> Place the `!ROUNDED_STYLE=1` statement BEFORE all C4_ `!include` statements.\n\n```plantuml\n@startuml\n' activates new style. It has to be set before a theme or a C4_* file is included\n!ROUNDED_STYLE=1\n \n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nLAYOUT_LANDSCAPE()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![Rounded style sample - open link](https://www.plantuml.com/plantuml/svg/JL1DRvj04BtlhvYu1-FA0RdAgLAbK8oIIiH60JVA2IqmhbVQ3xGx55bL_tk7ret3PTXvyzwyD_U1fAVHQB44sP7wAGa3M9mWq5bZ3Dy8JZ80EMWH0XANe_C84kY41i5v_itkcezmL1f11L2sqsEFlRXvtXzsstpRLFLhaN_P210t5n1EH4Fud2HUJl4FHQUn7GFwpbb2It7dJ39eQMTZju5whTeakxijvzRXgKYC38IUMqt63Aai-dYOGuWYVTqVwgP8TzigIyiyMWbHeW_EHh8togvXaSvL1VAId5-iH7LcCTDyTQFjfJz7tMODoqgQGUDo1Ry4yFUs9fgmRUGmiCuBjf0EWrQT9ENiWblPXpMaLHdlyfef7k5Jl86dxzcCfLgxAS0Sy-yvEUCWUSICcXJlWdfInAc0b47Dkm9x-trn5z4_a7KkOmoAPzJ_Krrj7G8pkJxMTLdnr3pqXbvb7f02Ft4kH-_CUuge7lSlJP4_vBij7_0URS_7_GC0 \"Rounded style sample\")](https://www.plantuml.com/plantuml/uml/JL1DRvj04BtlhvYu1-FA0RdAgLAbK8oIIiH60JVA2IqmhbVQ3xGx55bL_tk7ret3PTXvyzwyD_U1fAVHQB44sP7wAGa3M9mWq5bZ3Dy8JZ80EMWH0XANe_C84kY41i5v_itkcezmL1f11L2sqsEFlRXvtXzsstpRLFLhaN_P210t5n1EH4Fud2HUJl4FHQUn7GFwpbb2It7dJ39eQMTZju5whTeakxijvzRXgKYC38IUMqt63Aai-dYOGuWYVTqVwgP8TzigIyiyMWbHeW_EHh8togvXaSvL1VAId5-iH7LcCTDyTQFjfJz7tMODoqgQGUDo1Ry4yFUs9fgmRUGmiCuBjf0EWrQT9ENiWblPXpMaLHdlyfef7k5Jl86dxzcCfLgxAS0Sy-yvEUCWUSICcXJlWdfInAc0b47Dkm9x-trn5z4_a7KkOmoAPzJ_Krrj7G8pkJxMTLdnr3pqXbvb7f02Ft4kH-_CUuge7lSlJP4_vBij7_0URS_7_GC0)\n \n### Update basic themes with a new, modernized style (`!NEW_C4_STYLE=1`)\n\nIn July 2025, [c4model.com](https://c4model.com/) used a new visual style for C4 diagrams. The basic themes (C4_blue [default], C4_brown, C4_green and C4_violet) can now use this updated wireframe styling (internally it swaps background and text colors and uses rounded rectangles).\n\nThis new style should work with most existing tag definitions (tag colors are automatically swapped), but in some cases, tag definitions may need manual updates.\n\n> [!WARNING]\n> **This feature is only intended and tested for diagrams using the basic themes** (C4_blue [default], C4_brown, C4_green, and C4_violet). Other themes may have unintended side effects if background and font colors are swapped (`!ROUNDED_STYLE=1` could be a good alternative).  \n>\n> Another side effect is the **changed meaning of the color arguments**: when the new style is enabled, `$bgColor` sets the font color and `$fontColor` sets the background color. This allows automatic migration of existing diagrams.\n>\n> If you are creating new diagrams, use one of the newly added themes (C4_blue_new, C4_brown_new, C4_green_new, or C4_violet_new). These provide a similar wireframe look with rounded rectangles, but do not swap the colors.\n\nTo enable the new style, use one of the following methods:\n\n- Add `!NEW_C4_STYLE=1` before including any C4_* files\n- Pass the command line argument `-DNEW_C4_STYLE=1` to PlantUML\n\n> [!WARNING]\n> Place the `!NEW_C4_STYLE=1` statement BEFORE all C4_ `!include` statements.\n\n```plantuml\n@startuml\n' activates new style. It has to be set before a theme or a C4_* file is included\n!NEW_C4_STYLE=1\n \n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n\nLAYOUT_LANDSCAPE()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare\\nmultiple Twitter timelines\") {\n      ' init-colors of components/nodes are not swapped, avoids black background\n      Component(facade, \"Twitter Facade\")\n    }\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(facade, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![New C4 style sample - open link](https://www.plantuml.com/plantuml/svg/JL5DQzjC4BxlhvZuFLXviIrSSYeKeYfgKd0SKyarWO8OIUDuwMfNx8uYJCb_xoYrw-v1W-PZde-v3OoU-zQeAM3D-XMP0bWQ8F3Hq0A-CXmm03ke20AnXBtp10Xye9R0UK18Ryh_OQyDWGwWRMtwXXfrjSvsfPJoudcLVLegK5Ud6XoOk_0nZZqEYnVDXxxg0_dQMIRBYzgrSMVGZhpcWHkZgpYzcM_6rFPn5RSOcBoaojIrdRFZJ3TgKAla-MbRbAjaVPUdoIQBhfNQa0_EHjYqsivWaenH1_R8pa-kLNwKPMtvsVMsGN-CwkKCfZcsdQ7fDVnI82yLOgWj-MYWgiIkapqxgY3fEgDhPEtiH5BfVpD8yirYdHKouWa-B9Rm-3qTQuanRWWmodntinRcwEc7RNl3Mi2W63IBB63TaX6mC3d30qn1EFEyTiR9kDj3VHOUOkiQ2e2Um3g6C0WzQcQ0hqut0Ig3zK-evFFYHucdXN-DY_POOqF2y8p_vJqXpe2yD_LsSYZYF_LBfxIeRsJEpbwisGOXB_6XA3QvT8rDPvZBbdlY8ByqXhrtxRyJAdzusfMhx3vRtyaDRyasSj_V \"New C4 style sample\")]((https://www.plantuml.com/plantuml/uml/JL5DQzjC4BxlhvZuFLXviIrSSYeKeYfgKd0SKyarWO8OIUDuwMfNx8uYJCb_xoYrw-v1W-PZde-v3OoU-zQeAM3D-XMP0bWQ8F3Hq0A-CXmm03ke20AnXBtp10Xye9R0UK18Ryh_OQyDWGwWRMtwXXfrjSvsfPJoudcLVLegK5Ud6XoOk_0nZZqEYnVDXxxg0_dQMIRBYzgrSMVGZhpcWHkZgpYzcM_6rFPn5RSOcBoaojIrdRFZJ3TgKAla-MbRbAjaVPUdoIQBhfNQa0_EHjYqsivWaenH1_R8pa-kLNwKPMtvsVMsGN-CwkKCfZcsdQ7fDVnI82yLOgWj-MYWgiIkapqxgY3fEgDhPEtiH5BfVpD8yirYdHKouWa-B9Rm-3qTQuanRWWmodntinRcwEc7RNl3Mi2W63IBB63TaX6mC3d30qn1EFEyTiR9kDj3VHOUOkiQ2e2Um3g6C0WzQcQ0hqut0Ig3zK-evFFYHucdXN-DY_POOqF2y8p_vJqXpe2yD_LsSYZYF_LBfxIeRsJEpbwisGOXB_6XA3QvT8rDPvZBbdlY8ByqXhrtxRyJAdzusfMhx3vRtyaDRyasSj_V)\n\n## Use theme\n\nSimilar to PlantUML themes supports C4-PlantUML `C4_...` specific themes too (sometimes based on existing PlantUML themes).\n\nAdditional to the standard themes with skinparam and style definitions requires C4-PlantUML corresponding variable definitions.\nTherefore we started with the convention that all C4-PlantUML compatible themes start with `C4_...` in the name\n(e.g. theme [`C4_united`](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4_united.puml)\nbases on the [`united`](https://raw.githubusercontent.com/plantuml/plantuml/master/themes/puml-theme-united.puml) theme\nand contains all additional required C4-PlantUML settings that it can be directly used in all C4-PlantUML diagrams).\n\n> [!WARNING]\n> The !theme statement has to be BEFORE the !include statements.\n\nE.g. in order to invoke theme `C4_united` from a remote repository, you have to use the following directive:\n\n```plantuml\n!theme C4_united from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\nIn order to invoke a local theme `C4_foo`, you have to use the following directive:\n\n```plantuml\n!theme C4_foo from /path/to/themes/folder\n```\n\nStarting with PlantUML v1.2023.8 the C4 themes can be invoked via C4-Stdlib or calculated paths too:\n\n```plantuml\n' theme from C4-Stdlib\n!theme C4_united from <C4/themes>\n\n' another alternative: theme with calculated from\n!RELATIVE_INCLUDE = \"https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master\"\n!theme C4_united from %get_variable_value(\"RELATIVE_INCLUDE\")/themes\n```\n\nFollowing simple sample uses the C4_united theme from the official remote repository path.\n\n```plantuml\n@startuml\n\n!theme C4_united from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, \"Sample System\") {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSHOW_FLOATING_LEGEND()\n@enduml\n```\n\n[![Theme sample - open link](https://www.plantuml.com/plantuml/svg/hL5Dxz8m6B_lKzHv6ScVBHXEdfWJmOINnGqvBjtsA4twqhHFin3ZT_Sf8FW1tALPV-_foYDt69HCadTu0GMiMdP12uIH_N16iGkYzH-Bml4f_odm4lhWmGr68sZC1wCAAxcE3dEFenHzKItdTRmwxNU5uXx15JTdJn523pACy7zSgMb52YuqkDpUDjJWlD4P7vNGRomjuoayEex6fREakP9GTPzCq2DtrsnO4AdXoafWTooTiLy9e-_fd4tGTznQOfwXPwMrKWmSXT4fNLNltrZPrFbXtPB40VkGBzZ-UnMnKaepUHQNUOQ6qIpBYQA2H14ZsqaWWcCe54ZAybJnzwDaXdUGV1uq0fDl8F-EUzKwUV0nRzksTKEiI7gYBviDeATVY4TysdybIRCzdhilksFPVZrikjrwipvypcR92lGObFm3 \"Theme sample\")](https://www.plantuml.com/plantuml/uml/hL5Dxz8m6B_lKzHv6ScVBHXEdfWJmOINnGqvBjtsA4twqhHFin3ZT_Sf8FW1tALPV-_foYDt69HCadTu0GMiMdP12uIH_N16iGkYzH-Bml4f_odm4lhWmGr68sZC1wCAAxcE3dEFenHzKItdTRmwxNU5uXx15JTdJn523pACy7zSgMb52YuqkDpUDjJWlD4P7vNGRomjuoayEex6fREakP9GTPzCq2DtrsnO4AdXoafWTooTiLy9e-_fd4tGTznQOfwXPwMrKWmSXT4fNLNltrZPrFbXtPB40VkGBzZ-UnMnKaepUHQNUOQ6qIpBYQA2H14ZsqaWWcCe54ZAybJnzwDaXdUGV1uq0fDl8F-EUzKwUV0nRzksTKEiI7gYBviDeATVY4TysdybIRCzdhilksFPVZrikjrwipvypcR92lGObFm3)\n\n## List of available C4 style themes\n\n### C4_blue\n\nC4_blue theme is the original theme and need no activation.\n\nTheme [C4_blue](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4_blue.puml) can be activated with\n\n```plantuml\n!theme C4_blue from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![blue theme sample - open link](https://www.plantuml.com/plantuml/svg/hO-noeD048Hxdq8VGBUn-Yj_99s150afmwaR5VRMutQEaBVFcMT8DSF0zy5q1XUHl1GLLlPSzkrZbCJbC-w-N85WVqJHlPfbmvh6P1odNS6APjez1N5wuBLXbcsalgqlntGx3-ITWIDzlLPKcqwIPlwDD6JYJLSs_8kSX3qhx9vj0o-iSnEEIrrkEJy0 \"blue theme sample\")](https://www.plantuml.com/plantuml/uml/hO-noeD048Hxdq8VGBUn-Yj_99s150afmwaR5VRMutQEaBVFcMT8DSF0zy5q1XUHl1GLLlPSzkrZbCJbC-w-N85WVqJHlPfbmvh6P1odNS6APjez1N5wuBLXbcsalgqlntGx3-ITWIDzlLPKcqwIPlwDD6JYJLSs_8kSX3qhx9vj0o-iSnEEIrrkEJy0)\n\n#### C4_blue with `!NEW_C4_STYLE=1`\n\nC4_blue is one of the basic themes which can be combined with `!NEW_C4_STYLE=1` (the other basic themes C4_brown, C4_green and C4_violet have only a different base color)\n\n```plantuml\n!NEW_C4_STYLE=1\n!theme C4_blue from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![blue theme sample with NEW_C4_STYLE=1 - open link](https://www.plantuml.com/plantuml/png/hS_12eCm383Xkq-X3w1Xu6amS8WtDmPpo4vIDLCXhQL96NlxjNk6dH9-o0UfM9GJhod9haq_rELmxvvjSpeacQoeCGrb98_fo-qwNKKi7m6SUXVB9giVFQERTYDef9Xs3PQKYLpECjCsGbtcjvWUbnQqOa47FvUJR3CJ-Hd_WzfmyO4EMSv43Q568zm7hSK5pLpO-68LjZ2_)](https://www.plantuml.com/plantuml/uml/hS_12eCm383Xkq-X3w1Xu6amS8WtDmPpo4vIDLCXhQL96NlxjNk6dH9-o0UfM9GJhod9haq_rELmxvvjSpeacQoeCGrb98_fo-qwNKKi7m6SUXVB9giVFQERTYDef9Xs3PQKYLpECjCsGbtcjvWUbnQqOa47FvUJR3CJ-Hd_WzfmyO4EMSv43Q568zm7hSK5pLpO-68LjZ2_)\n\n#### C4_blue_new (**without** `!NEW_C4_STYLE=1`)\n\nC4_blue_new is a modernized version of C4_blue with rounded rectangles and all base elements are drawn with a with background (like a wireframe) only the external elements use a gray background.\n\n>[!WARNING]\n> C4_blue_new is a new theme and does not require `!NEW_C4_STYLE=1`. Using both together may lead to unexpected results.\n\n```plantuml\n!theme C4_blue_new from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![new blue theme sample - open link](https://www.plantuml.com/plantuml/png/hSyngeD04CRntbFe0NGQgrVva7G6KYIab5M_g32xBZkpI6wVtPmXrGm3_nzC9sg2Hij5fHiiohuT9uuO7Sxo5GvRRgfU_eY2EPjrrorEKH3cmocSDlDXoRDncQX55zudwjlwba-Fwq3MY2BGrvQYsjtCSS5lK9-ADzqX-izyOTZKoZDf0rQufV7vhIvjQNu0)](https://www.plantuml.com/plantuml/uml/hSyngeD04CRntbFe0NGQgrVva7G6KYIab5M_g32xBZkpI6wVtPmXrGm3_nzC9sg2Hij5fHiiohuT9uuO7Sxo5GvRRgfU_eY2EPjrrorEKH3cmocSDlDXoRDncQX55zudwjlwba-Fwq3MY2BGrvQYsjtCSS5lK9-ADzqX-izyOTZKoZDf0rQufV7vhIvjQNu0)\n\n### C4_brown\n\nTheme [C4_brown](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4_brown.puml) can be activated with\n\n```plantuml\n!theme C4_brown from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![brown theme sample - open link](https://www.plantuml.com/plantuml/svg/hOyn2eD044LxJw47q6ciKXaadO4K2Id3gXCLPcUNcLaajy-QCwJwdm_lmU_Kd5ZoL5IseiUoRr-ZX9tBjmHVhcPHJm3YzcRPR4rZKfGfi25RCmKFaHmVVAqsqpP2tzQtOtfS1_1E3GL-OYsgZITAC_v76ZFnWJkgdOakX3wp-ios0HVakOd7fowtd5y0 \"brown theme sample\")](https://www.plantuml.com/plantuml/uml/hOyn2eD044LxJw47q6ciKXaadO4K2Id3gXCLPcUNcLaajy-QCwJwdm_lmU_Kd5ZoL5IseiUoRr-ZX9tBjmHVhcPHJm3YzcRPR4rZKfGfi25RCmKFaHmVVAqsqpP2tzQtOtfS1_1E3GL-OYsgZITAC_v76ZFnWJkgdOakX3wp-ios0HVakOd7fowtd5y0)\n\n#### C4_brown_new (**without** `!NEW_C4_STYLE=1`)\n\nC4_brown_new is a modernized version of C4_brown with rounded rectangles and all base elements are drawn with a with background (like a wireframe) only the external elements use a gray background.\n\n>[!WARNING]\n> C4_brown_new is a new theme and does not require `!NEW_C4_STYLE=1`. Using both together may lead to unexpected results.\n\n```plantuml\n!theme C4_brown_new from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![new brown theme sample - open link](https://www.plantuml.com/plantuml/png/hS-noeD03C3ntQVG1z0iJj_aXtIpqA6bevoQgf3B7KaEwTltx3DqIWZyVv1EpOabJqLb6tei-tQS91myCXxbIu8lDxEeVm3YZcRTRKjJKfGvi25RCmSFaHoVHgssq3v1tzQty_Iu3k2T6WfySIsgdMTA2_u6ZRbumntL_eakX3wt-ipQW2loqiJphovlUNu0)](https://www.plantuml.com/plantuml/uml/hS-noeD03C3ntQVG1z0iJj_aXtIpqA6bevoQgf3B7KaEwTltx3DqIWZyVv1EpOabJqLb6tei-tQS91myCXxbIu8lDxEeVm3YZcRTRKjJKfGvi25RCmSFaHoVHgssq3v1tzQty_Iu3k2T6WfySIsgdMTA2_u6ZRbumntL_eakX3wt-ipQW2loqiJphovlUNu0)\n\n### C4_green\n\nTheme [C4_green](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4_green.puml) can be activated with\n\n```plantuml\n!theme C4_green from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![green theme sample - open link](https://www.plantuml.com/plantuml/svg/hO-noeD048Hxdq8VGBUn-Yj_99s150afmwaJ5VREOtUFaBVFcMT8DSF0zy5qQauiUIugM-5HzkrZ4I2KJzbzkPf5_ICIzsgMpTOq9eLCUp04QwRTKsGN3hvMctaRgM_hop7TpWDvfmQXhrYBQWiJfnc_aSPClEaAjN_c4yDdLk_PDc11c9juVEfoo_a1 \"green theme sample\")](https://www.plantuml.com/plantuml/uml/hO-noeD048Hxdq8VGBUn-Yj_99s150afmwaJ5VREOtUFaBVFcMT8DSF0zy5qQauiUIugM-5HzkrZ4I2KJzbzkPf5_ICIzsgMpTOq9eLCUp04QwRTKsGN3hvMctaRgM_hop7TpWDvfmQXhrYBQWiJfnc_aSPClEaAjN_c4yDdLk_PDc11c9juVEfoo_a1)\n\n#### C4_green_new (**without** `!NEW_C4_STYLE=1`)\n\nC4_green_new is a modernized version of C4_green with rounded rectangles and all base elements are drawn with a with background (like a wireframe) only the external elements use a gray background.\n\n>[!WARNING]\n> C4_green_new is a new theme and does not require `!NEW_C4_STYLE=1`. Using both together may lead to unexpected results.\n\n```plantuml\n!theme C4_green_new from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![new green theme sample - open link](https://www.plantuml.com/plantuml/png/hSynoeD040NWtbFe0NGRgx_oHz8PI96GKjRrHONTSPcPHNBxh3b3gXaUl0zU9sfPK_15fIi2ohuT5mPe91pbY_TGhgfH_enXUpJBfckQae3TJWhInkt1H6_fD6hHsM-JwTlwTaQFws225GMRBov5jP7pQSPlq0XsRtE7wB_t5u-Gk_BCse05D3VntDNbBzyF)](https://www.plantuml.com/plantuml/uml/hSynoeD040NWtbFe0NGRgx_oHz8PI96GKjRrHONTSPcPHNBxh3b3gXaUl0zU9sfPK_15fIi2ohuT5mPe91pbY_TGhgfH_enXUpJBfckQae3TJWhInkt1H6_fD6hHsM-JwTlwTaQFws225GMRBov5jP7pQSPlq0XsRtE7wB_t5u-Gk_BCse05D3VntDNbBzyF)\n\n### C4_sandstone\n\nTheme [C4_sandstone](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4_sandstone.puml) can be activated with\n\n```plantuml\n!theme C4_sandstone from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![sandstone theme sample - open link](https://www.plantuml.com/plantuml/svg/hS-noeD03C3ntQVG1z0iJj_aXtIpqA6bOpczL8KaTrnobBvzppv3fuJ0_mSPr5oop5GrjY5ZFVOFTUBLWc3zJ87hpIpg7q1ohsxTRSjpLanB44EnRWaCaPmSHglcQPzXxDlBSRgT9s2dXWc-k5RDBWjbZxz1OodUS4MrVw8J8PTMxqMRS4NnNJp-6ifMvWS0 \"sandstone theme sample\")](https://www.plantuml.com/plantuml/uml/hS-noeD03C3ntQVG1z0iJj_aXtIpqA6bOpczL8KaTrnobBvzppv3fuJ0_mSPr5oop5GrjY5ZFVOFTUBLWc3zJ87hpIpg7q1ohsxTRSjpLanB44EnRWaCaPmSHglcQPzXxDlBSRgT9s2dXWc-k5RDBWjbZxz1OodUS4MrVw8J8PTMxqMRS4NnNJp-6ifMvWS0)\n\n### C4_superhero\n\nTheme [C4_superhero](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4_superhero.puml) can be activated with\n\n```plantuml\n!theme C4_superhero from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![superhero theme sample - open link](https://www.plantuml.com/plantuml/svg/hS-noeD03C3ntQVG1z0iJj_aXtIpqA6bOparzOJaxaXobBvzppv3fuJ0_mSPr9nOPgeQyyXOZ_r3SqBnAB5-IkJQcoNz0n3twhRTV9wpeYmn60RhbiYGo8N3QDLMscSO-_Pod6xd2TYfeS0NrwhPmq9vnT-WgHHlkABQFz69a4khzw9Dk65OktJyDPIjp0y0 \"superhero theme sample\")](https://www.plantuml.com/plantuml/uml/hS-noeD03C3ntQVG1z0iJj_aXtIpqA6bOparzOJaxaXobBvzppv3fuJ0_mSPr9nOPgeQyyXOZ_r3SqBnAB5-IkJQcoNz0n3twhRTV9wpeYmn60RhbiYGo8N3QDLMscSO-_Pod6xd2TYfeS0NrwhPmq9vnT-WgHHlkABQFz69a4khzw9Dk65OktJyDPIjp0y0)\n\n### C4_united\n\nTheme [C4_united](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4_united.puml) can be activated with\n\n```plantuml\n!theme C4_united from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![united theme sample - open link](https://www.plantuml.com/plantuml/svg/hSyngiCm3CRnFQT83f1eoVIcF4At53gqT2nEh2O6sJ7MPqflNwTdw2GX-Fz0Wy8aP2zLWuqzrsF_oC61RVrCkwyt8EeVKJAlRdNOyfoLqx87S42tx9wYc700hSAAcsdisyjnkfqdyaR1YRwoLeqBYsJBlq5ZATvqPSM_o4dObrRlHPjuvM2xU3mrbAtC3m00 \"united theme sample\")](https://www.plantuml.com/plantuml/uml/hSyngiCm3CRnFQT83f1eoVIcF4At53gqT2nEh2O6sJ7MPqflNwTdw2GX-Fz0Wy8aP2zLWuqzrsF_oC61RVrCkwyt8EeVKJAlRdNOyfoLqx87S42tx9wYc700hSAAcsdisyjnkfqdyaR1YRwoLeqBYsJBlq5ZATvqPSM_o4dObrRlHPjuvM2xU3mrbAtC3m00)\n\n### C4_violet\n\nTheme [C4_violet](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4_violet.puml) can be activated with\n\n```plantuml\n!theme C4_violet from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![violet theme sample - open link](https://www.plantuml.com/plantuml/svg/hS_12i8m383X-vvYUu0jbvqyJOQt2HuKZz9jSIiaRMbInRUtzHay9GJ-3pA8cgY9gMfqHyPwx1ylwmcrVaRFzQuQv00GpRlRhEvfJe9nyKxHQRTuXa365Q0LNSdECFRjfPnkvmdOY6A4donLOzr2QSN_e24N7xYYw97eHCYvbNlM9jpGhLqeJmrvo_CB \"violet theme sample\")](https://www.plantuml.com/plantuml/uml/hS_12i8m383X-vvYUu0jbvqyJOQt2HuKZz9jSIiaRMbInRUtzHay9GJ-3pA8cgY9gMfqHyPwx1ylwmcrVaRFzQuQv00GpRlRhEvfJe9nyKxHQRTuXa365Q0LNSdECFRjfPnkvmdOY6A4donLOzr2QSN_e24N7xYYw97eHCYvbNlM9jpGhLqeJmrvo_CB)\n\n#### C4_violet_new (**without** `!NEW_C4_STYLE=1`)\n\nC4_violet_new is a modernized version of C4_violet with rounded rectangles and all base elements are drawn with a with background (like a wireframe) only the external elements use a gray background.\n\n>[!WARNING]\n> C4_violet_new is a new theme and does not require `!NEW_C4_STYLE=1`. Using both together may lead to unexpected results.\n\n```plantuml\n!theme C4_violet_new from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![new violet theme sample - open link](https://www.plantuml.com/plantuml/png/hS-n2eD0383XtQVG1z0iJfqiqir2XvQEScgg1xdSSSbL-lOz-moT4WB_1-b4JTJagAXqGuTbtuvlwmbrPDpBL_Ikt5I3d02YsPlLwfQc91XdpugipUmT139y8BNeGdQ2lgrln-bn7S0PKOpmqwMeBC-K5lmF6dBnWJkAdeakX2wtyipQW2loqeJZiIvlUNu1)](https://www.plantuml.com/plantuml/uml/hS-n2eD0383XtQVG1z0iJfqiqir2XvQEScgg1xdSSSbL-lOz-moT4WB_1-b4JTJagAXqGuTbtuvlwmbrPDpBL_Ikt5I3d02YsPlLwfQc91XdpugipUmT139y8BNeGdQ2lgrln-bn7S0PKOpmqwMeBC-K5lmF6dBnWJkAdeakX2wtyipQW2loqeJZiIvlUNu1)\n\n## Matt Weagle themes\n\nMatt Weagle published a set of impressive themes based on ColorBrewer and Seaborn palettes (thank you Matt).\n\n[https://github.com/mweagle/C4-PlantUML-Themes](https://github.com/mweagle/C4-PlantUML-Themes) contains an overview of all his themes.\n\nThey can be simply invoked like the `cb_seq_YlOrBr_9` theme\n\n```plantuml\n@startuml\n!theme cb_seq_YlOrBr_9 from https://raw.githubusercontent.com/mweagle/C4-PlantUML-Themes/main/palettes\n\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, \"Sample System\") {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSHOW_FLOATING_LEGEND()\n@enduml\n```\n\n[![Matt theme sample - cb_div_BrBG_11 - open link](https://www.plantuml.com/plantuml/svg/ZL5DRzD04BtlhzY6YoCrjegumAck2IbIcbZOfUAqMjj3izBi1pjZMHNYlxEhGDjZVHbvtflteRqcrf5dY-A2Js11ZeCY-AL-u37UHFLH_epUoXDpe4zL5VLIFXe-pSDC44Vl61oNexULNK0_8bJDXqsBsl7ztNxJPq6gh3Qk2Xg16KY82-D6d2TuWsX0xNAs3V64PdWjNbbD336jLECT9mk8PSWzH0kHl2lqP8sxbAiwJqCSDVkuMelkAHrQTUDdD-duL8nNYTHf6n3a6LkjvMyXq_UiN2mmA1r2OZx08EiGq8oQZNUhj6hUNSgwQyl3jayd4UJxyahUVMyoLYFwXMHkHfAz7BqDEb7iZ6ooPRyOPeYIZGLCNfGY_laNik0pc7JEj9nVV0FyN-ubrZq1PR_Rlc-xnCgaP_H5PWTCwHVoo2_x-aHqjyS7zML_hFklXvtQRtVRm-TYBQx1JRF5lm00 \"Matt theme sample - cb_div_BrBG_11\")](https://www.plantuml.com/plantuml/uml/ZL5DRzD04BtlhzY6YoCrjegumAck2IbIcbZOfUAqMjj3izBi1pjZMHNYlxEhGDjZVHbvtflteRqcrf5dY-A2Js11ZeCY-AL-u37UHFLH_epUoXDpe4zL5VLIFXe-pSDC44Vl61oNexULNK0_8bJDXqsBsl7ztNxJPq6gh3Qk2Xg16KY82-D6d2TuWsX0xNAs3V64PdWjNbbD336jLECT9mk8PSWzH0kHl2lqP8sxbAiwJqCSDVkuMelkAHrQTUDdD-duL8nNYTHf6n3a6LkjvMyXq_UiN2mmA1r2OZx08EiGq8oQZNUhj6hUNSgwQyl3jayd4UJxyahUVMyoLYFwXMHkHfAz7BqDEb7iZ6ooPRyOPeYIZGLCNfGY_laNik0pc7JEj9nVV0FyN-ubrZq1PR_Rlc-xnCgaP_H5PWTCwHVoo2_x-aHqjyS7zML_hFklXvtQRtVRm-TYBQx1JRF5lm00)\n\n## Write custom themes\n\nYou can create your own theme on your local file system. You can duplicate any existing theme to create your own one.\n\nBy default, a theme file is named `puml-theme-C4_foo.puml` where `C4_foo` is the name of the theme.\n\nIn contrast to the normal themes (with skinparams and/or styles) the corresponding color,... variables have to overwritten too (e.g. that the legend is updated... details see below).\n\nIf you have any interesting theme, you can also propose a pull request so that we integrate this theme into the C4-PlantUML standard library.\n\n### Following variables could be set in a theme, additional to the skinparams and styles\n\n- stereotype and technology font size\n\n```plantuml\n!$STEREOTYPE_FONT_SIZE ?= 12\n!$TECHN_FONT_SIZE ?= 12\n```\n\n- default text color of all elements\n\n```plantuml\n!$ELEMENT_FONT_COLOR ?= \"#FFFFFF\"\n```\n\n- arrow related colors and text size\n\n```plantuml\n!$ARROW_COLOR ?= \"#666666\"\n!$ARROW_FONT_COLOR ?= $ARROW_COLOR\n!$ARROW_FONT_SIZE ?= 12\n```\n\n- (default) boundary related colors and style\n\n```plantuml\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_BORDER_STYLE ?= \"dashed\"\n```\n\n- person related colors\n\n```plantuml\n!$PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR\n!$PERSON_BG_COLOR ?= \"#08427B\"\n!$PERSON_BORDER_COLOR ?= \"#073B6F\"\n```\n\n- external person related colors\n\n```plantuml\n!$EXTERNAL_PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR\n!$EXTERNAL_PERSON_BG_COLOR ?= \"#686868\"\n!$EXTERNAL_PERSON_BORDER_COLOR ?= \"#8A8A8A\"\n```\n\n- system related colors\n\n```plantuml\n!$SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR\n!$SYSTEM_BG_COLOR ?= \"#1168BD\"\n!$SYSTEM_BORDER_COLOR ?= \"#3C7FC0\"\n```\n\n- external system related colors\n\n```plantuml\n!$EXTERNAL_SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR\n!$EXTERNAL_SYSTEM_BG_COLOR ?= \"#999999\"\n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= \"#8A8A8A\"\n```\n\n- system boundary related colors and style\n\n```plantuml\n!$SYSTEM_BOUNDARY_COLOR ?= $BOUNDARY_COLOR\n!$SYSTEM_BOUNDARY_BG_COLOR ?= $BOUNDARY_BG_COLOR\n!$SYSTEM_BOUNDARY_BORDER_STYLE ?= $BOUNDARY_BORDER_STYLE\n```\n\n- enterprise boundary related colors and style\n\n```plantuml\n!$ENTERPRISE_BOUNDARY_COLOR ?= $BOUNDARY_COLOR\n!$ENTERPRISE_BOUNDARY_BG_COLOR ?= $BOUNDARY_BG_COLOR\n!$ENTERPRISE_BOUNDARY_BORDER_STYLE ?= $BOUNDARY_BORDER_STYLE\n```\n\n- container related colors\n\n```plantuml\n!$CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR\n!$CONTAINER_BG_COLOR ?= \"#438DD5\"\n!$CONTAINER_BORDER_COLOR ?= \"#3C7FC0\"\n```\n\n- external container related colors\n\n```plantuml\n!$EXTERNAL_CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR\n!$EXTERNAL_CONTAINER_BG_COLOR ?= \"#B3B3B3\"\n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= \"#A6A6A6\"\n```\n\n- container boundary related colors and style\n\n```plantuml\n!$CONTAINER_BOUNDARY_COLOR ?= $BOUNDARY_COLOR\n!$CONTAINER_BOUNDARY_BG_COLOR ?= $BOUNDARY_BG_COLOR\n!$CONTAINER_BOUNDARY_BORDER_STYLE ?= $BOUNDARY_BORDER_STYLE\n```\n\n- component related colors\n\n```plantuml\n!$COMPONENT_FONT_COLOR ?= \"#000000\"\n!$COMPONENT_BG_COLOR ?= \"#85BBF0\"\n!$COMPONENT_BORDER_COLOR ?= \"#78A8D8\"\n```\n\n- external component related colors\n\n```plantuml\n!$EXTERNAL_COMPONENT_FONT_COLOR ?= $COMPONENT_FONT_COLOR\n!$EXTERNAL_COMPONENT_BG_COLOR ?= \"#CCCCCC\"\n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= \"#BFBFBF\"\n```\n\n- node related colors\n\n```plantuml\n!$NODE_FONT_COLOR ?= \"#000000\"\n!$NODE_BG_COLOR ?= \"#FFFFFF\"\n!$NODE_BORDER_COLOR ?= \"#A2A2A2\"\n```\n\n- legend colors and sizes\n\n```plantuml\n!$LEGEND_TITLE_COLOR ?= \"#000000\"\n!$LEGEND_FONT_COLOR ?= \"#FFFFFF\"\n!$LEGEND_BG_COLOR ?= \"transparent\"\n!$LEGEND_BORDER_COLOR ?= \"transparent\"\n!$LEGEND_DARK_COLOR ?= \"#66622E\"\n!$LEGEND_LIGHT_COLOR ?= \"#khaki\"\n\n!$LEGEND_DETAILS_SMALL_SIZE ?= 10\n!$LEGEND_DETAILS_NORMAL_SIZE ?= 14\n```\n\n- legend related texts\n\n```plantuml\n!$LEGEND_SHADOW_TEXT ?= \"shadow\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"no shadow\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"last text and back color\"\n!$LEGEND_NO_FONT_TEXT ?= \"last text color\"\n!$LEGEND_NO_BG_TEXT ?= \"last back color\"\n!$LEGEND_NO_LINE_TEXT ?= \"last line color\"\n!$LEGEND_SHARP_CORNER ?= \"box\"\n!$LEGEND_ROUNDED_BOX ?= \"rounded box\"\n!$LEGEND_EIGHT_SIDED ?= \"eight sided\"\n!$LEGEND_DOTTED_LINE ?= \"dotted\"\n!$LEGEND_DASHED_LINE ?= \"dashed\"\n!$LEGEND_BOLD_LINE ?= \"bold\"\n!$LEGEND_BOUNDARY ?= \"boundary\"\n!$LEGEND_DASHED_BOUNDARY ?= \"dashed\"\n' transparent is ignored, produces smaller legends\n' !$LEGEND_DASHED_TRANSPARENT_BOUNDARY ?= \"dashed, transparent\"\n!$LEGEND_DASHED_TRANSPARENT_BOUNDARY ?= \"dashed\"\n```\n\n- sketch related colors, font and texts\n\n```plantuml\n!$SKETCH_BG_COLOR ?= \"#EEEBDC\"\n!$SKETCH_FONT_COLOR ?= \"\"\n!$SKETCH_WARNING_COLOR ?= \"red\"\n\n!$SKETCH_FONT_NAME ?= \"Comic Sans MS\"\n\n!$SKETCH_FOOTER_WARNING ?= \"Warning:\"\n!$SKETCH_FOOTER_TEXT ?= \"Created for discussion, needs to be validated\"\n```\n\n- size of rectangle shape corner markers\n\n```plantuml\n!$ROUNDED_BOX_SIZE ?= 25\n!$EIGHT_SIDED_SIZE ?= 18\n!ROUNDED_STYLE ?= 0\n```\n\n`ROUNDED_STYLE` is without a `$` because it can be set via command line too (`-DROUNDED_STYLE=1`). All predefined `*_new` themes use rounded corners by default (`!ROUNDED_STYLE ?= 1`).\n\n### (C4 styled) Sequence diagram and themes\n\nAll sequence diagram specific renderings (like sequence-lifeline-color...) can be directly defined via skinparams and styles.\nThe advantage is that no separate variable definitions are required anymore.\n(But the disadvantage is that all themes have to define there own skinparams and styles.)\n\nA theme could contain e.g. following definitions, skinparams and styles\n\n```plantuml\n' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,...\n' (no default values which are defined in C4.puml) \n' If skinparams and styles are defined with concrete values no variables are required \n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$ARROW_COLOR ?= \"#666666\"\n\n' replace transparent with concrete background that it can be used as font color too\n!if ($BOUNDARY_BG_COLOR == \"transparent\")\n  !$SEQUENCE_BG_COLOR = white\n!else\n  !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR\n!endif\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n' \"C4 styled\" default is that lifeline is arrow color\nskinparam SequenceLifelineBorderColor $ARROW_COLOR\n\nskinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupFontColor $BOUNDARY_COLOR\nskinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR\nskinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceReferenceFontColor $BOUNDARY_COLOR\nskinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR\n' VIA STYLE\n' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR\n<style>\nreferenceHeader {\n  fontcolor $SEQUENCE_BG_COLOR\n}\n</style>\nskinparam SequenceReferenceBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceDividerFontColor $BOUNDARY_COLOR\nskinparam SequenceDividerBorderColor $BOUNDARY_COLOR\n\n' VIA STYLE\n' skinparam SequenceDelayFontColor green\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $BOUNDARY_COLOR\n  }\n}\n</style>\n```\n\nFollowing sample could be used as starting point for custom themes with sequence diagram support:\n\n[![sequence diagram](https://www.plantuml.com/plantuml/svg/hLPjRzis4FxENt7sKYG16Zi3idqeagv-SLu0DyaSfqC_6RHqieZIf4UUd6P3__kEr2mxbPFKG0aabgXxdhjxxgZJ1q_IKJ7NGZJsxZsESvmZd46pTpAPEKJJ568V4ckMw0WKmOEY76IQAbBMICsFvdDfKj3A84WtA-Pe28xwey6mCxxwD9XSNVU6z_t1MRFLRhMQG1OAZw1j8hL-50sLmPkbT4fEDKxmg_Ba3vhVWvk70c0V6XIZuz3EbVCqHa-GEJk7DpEaISMobBh0RIJjYFS2LaphZ2DDY71bqq3jyLdBd6ZXtxNRJZwqPgn8CUMa7Cj4QAZ5chGNMfgWwv6dLAjfktToT1ksxZyEstFf2TtQaqbL5cG-hIsuxOp6S7CEuyl1nm44extkpVrrlpFwFEbUJ7etmvjHgzM2N2unQ3j5I35J1bDG1ihO5NdK6T_8MC54cc1M-DB6qwD6_vP9cFp0s82NXIQ8Cdfuo5MIWtIRn5o2reAJEmJ6N6NWloYpa4xEFOHUA2cVO6BRi3w9Gy8LDJihYxQoTlXteHoRYqOzJVY3svASD9vTeQ7cfj7QufUJkCBJpcXqyzVcez_ZYYtja2kK86mGVXVaL2PVPiuM9jqgdVIGMKDihwq3iZRsyi6MkC-UnXsRkR5tD_ZpVd3T6spO1Qq9gzRRRbDtiEwWS6nBzTDcLKSLXSwi9PZQh-X5hbACztpxF2Rch5M6yMIhK21d7yfqHLLmkEEIeKbm-BzbrxeKNI-Aiba0iGLpmUekkZPzx5PIby1wui-XpwsXY5dhyZ9WxMeds2LAJYjwsp72jI1rPrim8ypGXOjTDAcZTz6b0fL9lgRGFdowwi3T-FDmmDUlqhsesMbilFV2FSN0lmBYwKgU0tuJf-qI-wA6ksdVLql5zhihlyRkeFiAycAGhudTHoqVrqxZoAvKzPKZEMDGL3KDW7W5y7om0Dys9MRNxskhDfjscEKDPH9TfFZ3avjd_YhbE7cgbsJ5z3D6SirDzMgzHUUjEUXebU1RQCRVvk5gkskdlCd_UKl8XDHI4WBV2p52lKALLfs2SZIa4adA6XW5TvuYK1Fu8adG-wpGaCYO842WYDZ8KwVeC6H1c39740MydIDmfwHWCyYaqeKhYRIr2_Zr-FWOI9NVGUMgnTY_leCE4P-3M2q0La64lt1GmIxHmTeUte4oYhQacgFMbXagL9G4O9mhlvgbrl26HtueTVo8zC4HC4887fnNpAoaLl-KgPwTxQBeQyADq2-iyLp8w6k42oJrWXzZ6Uv0_h0_MKFK_8QFjzzWhan1w45BOdFUs-8-aLfxM2e9YzoQ21PtbpnVXuEBmNN_u51yOEMuQVy3)](https://www.plantuml.com/plantuml/uml/hLPjRzis4FxENt7sKYG16Zi3idqeagv-SLu0DyaSfqC_6RHqieZIf4UUd6P3__kEr2mxbPFKG0aabgXxdhjxxgZJ1q_IKJ7NGZJsxZsESvmZd46pTpAPEKJJ568V4ckMw0WKmOEY76IQAbBMICsFvdDfKj3A84WtA-Pe28xwey6mCxxwD9XSNVU6z_t1MRFLRhMQG1OAZw1j8hL-50sLmPkbT4fEDKxmg_Ba3vhVWvk70c0V6XIZuz3EbVCqHa-GEJk7DpEaISMobBh0RIJjYFS2LaphZ2DDY71bqq3jyLdBd6ZXtxNRJZwqPgn8CUMa7Cj4QAZ5chGNMfgWwv6dLAjfktToT1ksxZyEstFf2TtQaqbL5cG-hIsuxOp6S7CEuyl1nm44extkpVrrlpFwFEbUJ7etmvjHgzM2N2unQ3j5I35J1bDG1ihO5NdK6T_8MC54cc1M-DB6qwD6_vP9cFp0s82NXIQ8Cdfuo5MIWtIRn5o2reAJEmJ6N6NWloYpa4xEFOHUA2cVO6BRi3w9Gy8LDJihYxQoTlXteHoRYqOzJVY3svASD9vTeQ7cfj7QufUJkCBJpcXqyzVcez_ZYYtja2kK86mGVXVaL2PVPiuM9jqgdVIGMKDihwq3iZRsyi6MkC-UnXsRkR5tD_ZpVd3T6spO1Qq9gzRRRbDtiEwWS6nBzTDcLKSLXSwi9PZQh-X5hbACztpxF2Rch5M6yMIhK21d7yfqHLLmkEEIeKbm-BzbrxeKNI-Aiba0iGLpmUekkZPzx5PIby1wui-XpwsXY5dhyZ9WxMeds2LAJYjwsp72jI1rPrim8ypGXOjTDAcZTz6b0fL9lgRGFdowwi3T-FDmmDUlqhsesMbilFV2FSN0lmBYwKgU0tuJf-qI-wA6ksdVLql5zhihlyRkeFiAycAGhudTHoqVrqxZoAvKzPKZEMDGL3KDW7W5y7om0Dys9MRNxskhDfjscEKDPH9TfFZ3avjd_YhbE7cgbsJ5z3D6SirDzMgzHUUjEUXebU1RQCRVvk5gkskdlCd_UKl8XDHI4WBV2p52lKALLfs2SZIa4adA6XW5TvuYK1Fu8adG-wpGaCYO842WYDZ8KwVeC6H1c39740MydIDmfwHWCyYaqeKhYRIr2_Zr-FWOI9NVGUMgnTY_leCE4P-3M2q0La64lt1GmIxHmTeUte4oYhQacgFMbXagL9G4O9mhlvgbrl26HtueTVo8zC4HC4887fnNpAoaLl-KgPwTxQBeQyADq2-iyLp8w6k42oJrWXzZ6Uv0_h0_MKFK_8QFjzzWhan1w45BOdFUs-8-aLfxM2e9YzoQ21PtbpnVXuEBmNN_u51yOEMuQVy3)\n\n## List of available C4 language themes\n\n> All language themes are machine translated. If there are any errors, please let us know and create an issue with the expected fix.\n\nIf you want to create a diagram in a specific language, then you can defined ex. system labels, descriptions,... with names in the corresponding language.\nBut independent of these changes the standard (mostly legend) labels remain in English.\n\nEx. following Japanese sample still displays an English legend (you could change the label with `Update...()` calls, but this requires a high effort per diagram):\n\n```plantuml\n@startuml\n ' first diagram without the C4Language_japanese theme\n ' !theme C4Language_japanese from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nLAYOUT_LANDSCAPE()\n\nPerson(admin, \"管理者\")\nSystem_Boundary(c1, 'サンプル') {\n    Container(web_app, \"ウェブアプリケーション\", \"C#, ASP.NET Core 2.1 MVC\", \"複数のTwitterタイムラインを比較することができます\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"使用する\", \"HTTPS\")\nRel(web_app, twitter, \"ツイートを取得する\", \"HTTPS\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![Japanese sample without C4Language_japanese theme - open link](https://www.plantuml.com/plantuml/svg/hP7DRjD058NtynJJi4WYfR6AkcBLu4PqaQOHTa6ih4ayJOpiiJKUAweG4fxX1maG24ehTe0gMa0ge0Yn2Ut3NDhaCRXEIxk09LwDpfpvxZc-IwbYKcLHICfq8v2fedx0-f95T1YeGPmfgWQSseij9lePwtFlDakOu2alz8WJMgPpnUdVdWqPHtIWL99UiIp9XlK-GhDkbdBPYuNYGjLxSMGb8HD5XlbK-M7GjUp5-KuXhQ-sh8YbYajhDYCbT2uGlJ3p-N-XekJP-885WijwWbv2MerRQ-kkrsgqbnsxqMbMgeHqk4nZKM5-58WQBKqEtarUF9pUUr2g4cSJGP5tDSw4p-HcfRTGesNGty6CmEo0-LokqZk4udS-g3BaNOyb2P90Vm2z1sORzFkP_HFeRs36e7-0GNrKGfDzgKORJgVURhe8aPnUhY_GrHjsSJVTVNJo-Yla1owk2nk1FWAz2-Ojc8-pmmZqovClMzEnWVmDw2UGlu9y7_AdaEz1_WpoGzInnzsp9XLr2aBs6H8loNKU_cb_4VxNpwF9rlufjiYouheT1zs5-TnrWGDpVvPe3EOnXZf-ldrykFFtQ-AihDtqMirhpVOo_libBdpSosy0 \"Japanese sample without C4Language_japanese theme\")](https://www.plantuml.com/plantuml/uml/hP7DRjD058NtynJJi4WYfR6AkcBLu4PqaQOHTa6ih4ayJOpiiJKUAweG4fxX1maG24ehTe0gMa0ge0Yn2Ut3NDhaCRXEIxk09LwDpfpvxZc-IwbYKcLHICfq8v2fedx0-f95T1YeGPmfgWQSseij9lePwtFlDakOu2alz8WJMgPpnUdVdWqPHtIWL99UiIp9XlK-GhDkbdBPYuNYGjLxSMGb8HD5XlbK-M7GjUp5-KuXhQ-sh8YbYajhDYCbT2uGlJ3p-N-XekJP-885WijwWbv2MerRQ-kkrsgqbnsxqMbMgeHqk4nZKM5-58WQBKqEtarUF9pUUr2g4cSJGP5tDSw4p-HcfRTGesNGty6CmEo0-LokqZk4udS-g3BaNOyb2P90Vm2z1sORzFkP_HFeRs36e7-0GNrKGfDzgKORJgVURhe8aPnUhY_GrHjsSJVTVNJo-Yla1owk2nk1FWAz2-Ojc8-pmmZqovClMzEnWVmDw2UGlu9y7_AdaEz1_WpoGzInnzsp9XLr2aBs6H8loNKU_cb_4VxNpwF9rlufjiYouheT1zs5-TnrWGDpVvPe3EOnXZf-ldrykFFtQ-AihDtqMirhpVOo_libBdpSosy0)\n\nBut if you activate the `C4Language_japanese` theme, the legend is translated too:\n\n```plantuml\n@startuml\n' with the C4Language_japanese theme ex. the predefined legend labels are translated too\n!theme C4Language_japanese from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nLAYOUT_LANDSCAPE()\n\nPerson(admin, \"管理者\")\nSystem_Boundary(c1, 'サンプル') {\n    Container(web_app, \"ウェブアプリケーション\", \"C#, ASP.NET Core 2.1 MVC\", \"複数のTwitterタイムラインを比較することができます\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"使用する\", \"HTTPS\")\nRel(web_app, twitter, \"ツイートを取得する\", \"HTTPS\")\n\nSHOW_LEGEND()\n@enduml\n```\n\n[![Japanese sample with C4Language_japanese theme - open link](https://www.plantuml.com/plantuml/svg/hP5FRzD04CNl-ocsuP14IcqLzSIfmOte8KqZae8uMPjucWJPQskzLgWG4lRo1maG24ehRe0gMa0ge0XnAUs76ThaOp1EItk0OtsnzURDRz_pBiHQA9q4FYlouK3tkUu3T-RhGlOIqGFtjeY4X1XoFG0ETwof8rBWmTf0WiTzw86ab-Y07tEXoAg4Z7sXQQZ3aCtag_-7hgamu7sje_YARIinj7eK8UaaCQXkA3L8RNN3m8vy8VECix7s_477TkPdcxcqkbot0n5hKFRqZ9ZD36JNJpou42X9haCRWdegAo8lO_NghPNLjbklDXPRJhLPAvKPQuAAGraINZ2G5LuOxxqVltmqkV-mK6QjTG85xjKmaPvGwwNkN8KNCVk1PeHc2ysNOfdVPPoUiuDAG-Yu8eg8XDb7p7RGR6BsOMh_ZDbtDFkO_KH3-gX09kTIXLTRJQjHQnD40RzipV7b6qu-csm_Fdxp3TEzDjqjDSBi4BDjDE_GV9f-Z31xTVnrOx9lC7sBsLDCNsEwY-apJ7SmVOxf0UdKuzvfav8-0H7x54b3TXtyl-tFm__-TJZUs3t1vbcMskrcYzov-SnrZaFpW1BbvSmJ2dNqOlFeOElVRTPQMhdfrclNQer5-lSB83swbpy0 \"Japanese sample with C4Language_japanese theme\")](https://www.plantuml.com/plantuml/uml/hP5FRzD04CNl-ocsuP14IcqLzSIfmOte8KqZae8uMPjucWJPQskzLgWG4lRo1maG24ehRe0gMa0ge0XnAUs76ThaOp1EItk0OtsnzURDRz_pBiHQA9q4FYlouK3tkUu3T-RhGlOIqGFtjeY4X1XoFG0ETwof8rBWmTf0WiTzw86ab-Y07tEXoAg4Z7sXQQZ3aCtag_-7hgamu7sje_YARIinj7eK8UaaCQXkA3L8RNN3m8vy8VECix7s_477TkPdcxcqkbot0n5hKFRqZ9ZD36JNJpou42X9haCRWdegAo8lO_NghPNLjbklDXPRJhLPAvKPQuAAGraINZ2G5LuOxxqVltmqkV-mK6QjTG85xjKmaPvGwwNkN8KNCVk1PeHc2ysNOfdVPPoUiuDAG-Yu8eg8XDb7p7RGR6BsOMh_ZDbtDFkO_KH3-gX09kTIXLTRJQjHQnD40RzipV7b6qu-csm_Fdxp3TEzDjqjDSBi4BDjDE_GV9f-Z31xTVnrOx9lC7sBsLDCNsEwY-apJ7SmVOxf0UdKuzvfav8-0H7x54b3TXtyl-tFm__-TJZUs3t1vbcMskrcYzov-SnrZaFpW1BbvSmJ2dNqOlFeOElVRTPQMhdfrclNQer5-lSB83swbpy0)\n\nIn the following list you can find all available C4 language themes\n(the diagram contents themselves are not translated that you simpler see the differences):\n\n### C4Language_english\n\nC4Language_english theme is the original language theme and need no activation.\n\nTheme [C4Language_english](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4Language_english.puml) can be activated with\n\n```plantuml\n!theme C4Language_english from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![english sample - open link](https://www.plantuml.com/plantuml/svg/hL7DRfmm4BxxAIRRGrXf0qgLKq-XP9KSo0OLjb5FoC0KBFd7iWUXgEgxTzocIH-WN4RCV3_pZMyZoK2hqUA25ZG8rKqjxRpA6NkqirPnWU_16LY8VFnK545k-QneMOSrOXYT9RIKZyuKNakRbAuYJLeDHNLprQJM-R4kZ8o4eVXj4SM5igDU9_mlejpgAsP8PJ7aFaKHTVdjwTprTNcwQwkoEMPx8HeCqTbCJaRP0-pAL5Ma8Cc5tLwqBonc-izkjPCCBzbuVO3BLXglyN8FFmJmzsQJRJZqqdlMUSO1Ik-r6YKfPtVSgZuSe6oR_7Jic18GFkRNyFYrIhDIQxT5I34Za0FEw2L3pAf9iHTqco9E1QGCQlQAlDlFr-qo-ZDadLSO3yKNr7zJlQzrZipa-j1rJSke17gRlilS8qN-nLJIC_zB4Ut3qtDV7--Ffpi-u2tQYO_x2m00 \"english sample\")](https://www.plantuml.com/plantuml/uml/hL7DRfmm4BxxAIRRGrXf0qgLKq-XP9KSo0OLjb5FoC0KBFd7iWUXgEgxTzocIH-WN4RCV3_pZMyZoK2hqUA25ZG8rKqjxRpA6NkqirPnWU_16LY8VFnK545k-QneMOSrOXYT9RIKZyuKNakRbAuYJLeDHNLprQJM-R4kZ8o4eVXj4SM5igDU9_mlejpgAsP8PJ7aFaKHTVdjwTprTNcwQwkoEMPx8HeCqTbCJaRP0-pAL5Ma8Cc5tLwqBonc-izkjPCCBzbuVO3BLXglyN8FFmJmzsQJRJZqqdlMUSO1Ik-r6YKfPtVSgZuSe6oR_7Jic18GFkRNyFYrIhDIQxT5I34Za0FEw2L3pAf9iHTqco9E1QGCQlQAlDlFr-qo-ZDadLSO3yKNr7zJlQzrZipa-j1rJSke17gRlilS8qN-nLJIC_zB4Ut3qtDV7--Ffpi-u2tQYO_x2m00)\n\n### C4Language_chinese\n\nTheme [C4Language_chinese](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4Language_chinese.puml) can be activated with\n\n```plantuml\n!theme C4Language_chinese from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![chinese sample - open link](https://www.plantuml.com/plantuml/svg/hL7DRfmm4BxxAIRRGq3QW5Bbr5CeGSc1R51X6_M434mNI_wnxB5GLFNTQwlfRXyWN4RCzytt0_UUkAEW9BkY5HL2VTToVGhyXEEy2eqUuQSp2bOYwx-KfUDRSHAqXYbuTBFHX9gAsQZIIgwJqesdHOgfhEzkkhGwFhUbufxGbSa2FRiIUfPXmGyHZQknZXSyXdM5JLLOM_ruEGvZMnqU-hhgcYndh4FdZSxueeJUmwvAKtXod8pRvQn_yuHg_6g2NhXxo-RRFLptN5c9rpdyOX2ViqssuJHoQwFEAqvGMIl5p4aOlOkh-jCUghuh3iqGJnp2v-8Mdh_N2QkaD9k7LDC36OWTBOyK5II9w0N39eZG0Gc5Cdt_cEttUxgC_e9HvvqMGVODvRzMbrX7ZpxvFGr3rqTM8ftHYymZae-lc4RwpV-ViFxfvNLicyVcy93bx1xr4fJy0m00 \"chinese sample\")](https://www.plantuml.com/plantuml/uml/hL7DRfmm4BxxAIRRGq3QW5Bbr5CeGSc1R51X6_M434mNI_wnxB5GLFNTQwlfRXyWN4RCzytt0_UUkAEW9BkY5HL2VTToVGhyXEEy2eqUuQSp2bOYwx-KfUDRSHAqXYbuTBFHX9gAsQZIIgwJqesdHOgfhEzkkhGwFhUbufxGbSa2FRiIUfPXmGyHZQknZXSyXdM5JLLOM_ruEGvZMnqU-hhgcYndh4FdZSxueeJUmwvAKtXod8pRvQn_yuHg_6g2NhXxo-RRFLptN5c9rpdyOX2ViqssuJHoQwFEAqvGMIl5p4aOlOkh-jCUghuh3iqGJnp2v-8Mdh_N2QkaD9k7LDC36OWTBOyK5II9w0N39eZG0Gc5Cdt_cEttUxgC_e9HvvqMGVODvRzMbrX7ZpxvFGr3rqTM8ftHYymZae-lc4RwpV-ViFxfvNLicyVcy93bx1xr4fJy0m00)\n\n### C4Language_danish\n\nTheme [C4Language_danish](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4Language_danish.puml) can be activated with\n\n```plantuml\n!theme C4Language_danish from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![danish sample - open link](https://www.plantuml.com/plantuml/svg/hL7DRjim3BxhATZiK0T8RNJeQQTwRj0UtDIOdHKx6OhDnGBq8qWKZ6BOku_QkdOFC5y8azyFF-esaWoKZ1ONjA11Q6vQQSz9dd6S4qqBV0_Em4BauwUg2d8jpugMT4eHm-GieQLoSgRoMjgiSnLfrkfKDJTNNMuT7zlAo4WOgjy6KLmeE-aqutyHvTROC4CgYw7qEOXewszFns5iwyDTtzJTljWAqM68pXPoDihkO5FdgY85IIvijg9_OJ4pVdR9pZAy5DFr3YvxQRp6ooty4C3VcqsnuccKthFECvwWzbwhIP9oTiEjviCEwhuh3_k1AG7XOtaDZr-RFAkrTck473C2EU2CNZB494sAlM1O5N4g86LGirVatNw-RbVGdo7hlC9uABwW_flgVQrZP2RNXs7eUaPbqDlqNUOUAV8lvfAV-L-Aw1-UdiTsVxy_tF41Rz7EVDnV \"danish sample\")](https://www.plantuml.com/plantuml/uml/hL7DRjim3BxhATZiK0T8RNJeQQTwRj0UtDIOdHKx6OhDnGBq8qWKZ6BOku_QkdOFC5y8azyFF-esaWoKZ1ONjA11Q6vQQSz9dd6S4qqBV0_Em4BauwUg2d8jpugMT4eHm-GieQLoSgRoMjgiSnLfrkfKDJTNNMuT7zlAo4WOgjy6KLmeE-aqutyHvTROC4CgYw7qEOXewszFns5iwyDTtzJTljWAqM68pXPoDihkO5FdgY85IIvijg9_OJ4pVdR9pZAy5DFr3YvxQRp6ooty4C3VcqsnuccKthFECvwWzbwhIP9oTiEjviCEwhuh3_k1AG7XOtaDZr-RFAkrTck473C2EU2CNZB494sAlM1O5N4g86LGirVatNw-RbVGdo7hlC9uABwW_flgVQrZP2RNXs7eUaPbqDlqNUOUAV8lvfAV-L-Aw1-UdiTsVxy_tF41Rz7EVDnV)\n\n### C4Language_dutch\n\nTheme [C4Language_dutch](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4Language_dutch.puml) can be activated with\n\n```plantuml\n!theme C4Language_dutch from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![dutch sample - open link](https://www.plantuml.com/plantuml/svg/hL7DRfmm4BxxAIRRGrXf0qgLKq-X12K7ia65RTGJCZ1TBFd7iWUXgEgxTzocIH-WN4RCV3_pZMyZoK2hqUA25ZG8rKqZxNcLPnncQLLSu7jm1XOY7pyLHP1RVbQqhECQCKpE4bhA9sSAhwLDGbUHPgt6ehgvQbFhzDWKHaR2KFnsYE92sKclC_uNKMuD5JEaiXXodvA8flpsTEg7fZpUTLNPrjbUY1P3T3QJir7s0BioLHKfI79XjnVT2ukPuRDRxIp3IpPT7-2oayPhlDp33m7ylTba6uw3z9vrdd64qdkj9adAsHstgWy7ABisFzOzKmB2n_mQ7hzMQLPgxRO8AMO4Si0PlMI8MJKfze9-KyIfW9H1pLwHT_lvkbr6VuQiymhZeVY2-c-gzxLEaPbS7_g-xHYLG6_JTvbxfCY_c4fwvdyfedjuUXwQ-hu-tl41Rz7EVDnV \"dutch sample\")](https://www.plantuml.com/plantuml/uml/hL7DRfmm4BxxAIRRGrXf0qgLKq-X12K7ia65RTGJCZ1TBFd7iWUXgEgxTzocIH-WN4RCV3_pZMyZoK2hqUA25ZG8rKqZxNcLPnncQLLSu7jm1XOY7pyLHP1RVbQqhECQCKpE4bhA9sSAhwLDGbUHPgt6ehgvQbFhzDWKHaR2KFnsYE92sKclC_uNKMuD5JEaiXXodvA8flpsTEg7fZpUTLNPrjbUY1P3T3QJir7s0BioLHKfI79XjnVT2ukPuRDRxIp3IpPT7-2oayPhlDp33m7ylTba6uw3z9vrdd64qdkj9adAsHstgWy7ABisFzOzKmB2n_mQ7hzMQLPgxRO8AMO4Si0PlMI8MJKfze9-KyIfW9H1pLwHT_lvkbr6VuQiymhZeVY2-c-gzxLEaPbS7_g-xHYLG6_JTvbxfCY_c4fwvdyfedjuUXwQ-hu-tl41Rz7EVDnV)\n\n### C4Language_german\n\nTheme [C4Language_german](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4Language_german.puml) can be activated with\n\n```plantuml\n!theme C4Language_german from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![german sample - open link](https://www.plantuml.com/plantuml/svg/hL7DRfmm4BxxAIRRGrXf0qgLKq-X12K7ia65RTGJCZ1bBVd7iWUXgEgxTzocIH-WN4RCV3_pZMyZoK2hqUA2pcWGgfj6scML2muB1YCjV0_Em9d8nqz54UIMBuhEwxX639EpX9RooPd2QscJq5MaMQkng6wksjGwFJQ5aP4m5ByTehXGTjBhZFz5b5j3nGofB8RSfoIYARyzdVgXAOztNLMsTRONeiKGdStaR9GzmAvCLKKAabpOxKNtmc9c-EnMEylmaatN1xZifF4QB_VmGm1_RpRPXkCWlMUTPnoXz5whIP9oTiUjwiC1ogxDZtNFb83mCR-6nwzLcfLQkor2YXc17716BnbYLasAlQ3V574g86LGirVatNw-RfVHdo7hlC9uABwW_flgVQrJP2RNXxvlEqObqDlqNUOUAV8lffAU-L-Aw1wUdeUclg-FTtp0MxGp7_SN \"german sample\")](https://www.plantuml.com/plantuml/uml/hL7DRfmm4BxxAIRRGrXf0qgLKq-X12K7ia65RTGJCZ1bBVd7iWUXgEgxTzocIH-WN4RCV3_pZMyZoK2hqUA2pcWGgfj6scML2muB1YCjV0_Em9d8nqz54UIMBuhEwxX639EpX9RooPd2QscJq5MaMQkng6wksjGwFJQ5aP4m5ByTehXGTjBhZFz5b5j3nGofB8RSfoIYARyzdVgXAOztNLMsTRONeiKGdStaR9GzmAvCLKKAabpOxKNtmc9c-EnMEylmaatN1xZifF4QB_VmGm1_RpRPXkCWlMUTPnoXz5whIP9oTiUjwiC1ogxDZtNFb83mCR-6nwzLcfLQkor2YXc17716BnbYLasAlQ3V574g86LGirVatNw-RfVHdo7hlC9uABwW_flgVQrJP2RNXxvlEqObqDlqNUOUAV8lffAU-L-Aw1wUdeUclg-FTtp0MxGp7_SN)\n\n### C4Language_italian\n\nTheme [C4Language_italian](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4Language_italian.puml) can be activated with\n\n```plantuml\n!theme C4Language_italian from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![italian sample - open link](https://www.plantuml.com/plantuml/svg/hL7DRjim3BxhATZiK0T8RNJeQQTwRj0UtDIOdHKx6OpD9GBq8qWqWcBOku_QkdOFC5y8azyFF-esCKPUh54NV29BqDoqw8uB7cdKZ4QZW-_HMpWnX_IfgYAUowFcqt9O4iN9EoR7vUHj5Gowh7ILU3RwK3KtLrrkxH_Roc9YYjLlYwGkj9lCCjD_4PNMs0W3jQDOXXn5jVMtf_qmjlNkhc_gRbkibUee9kyAdArs6rZLkUh44Td7rLhrBo9cnyz-SJF6bsAwti1bZpOOkbp33mNolTaKPpgC68BeFDC1wX2Cdf2rTojfDHysKFTTkTiEGea47yjhUFpQv5bjZ3ydo34Ji0V9650WTZ6inGk6isP91Qmj6V5AijlFr-qA_ZCKdLUO3DKNCdzJlQ-rJyAK-Z0CNI-e37gRlilS4oVvfLpoC_zBKVt3q_FORk-tkpivu2svMOxx2m00 \"italian sample\")](https://www.plantuml.com/plantuml/uml/hL7DRjim3BxhATZiK0T8RNJeQQTwRj0UtDIOdHKx6OpD9GBq8qWqWcBOku_QkdOFC5y8azyFF-esCKPUh54NV29BqDoqw8uB7cdKZ4QZW-_HMpWnX_IfgYAUowFcqt9O4iN9EoR7vUHj5Gowh7ILU3RwK3KtLrrkxH_Roc9YYjLlYwGkj9lCCjD_4PNMs0W3jQDOXXn5jVMtf_qmjlNkhc_gRbkibUee9kyAdArs6rZLkUh44Td7rLhrBo9cnyz-SJF6bsAwti1bZpOOkbp33mNolTaKPpgC68BeFDC1wX2Cdf2rTojfDHysKFTTkTiEGea47yjhUFpQv5bjZ3ydo34Ji0V9650WTZ6inGk6isP91Qmj6V5AijlFr-qA_ZCKdLUO3DKNCdzJlQ-rJyAK-Z0CNI-e37gRlilS4oVvfLpoC_zBKVt3q_FORk-tkpivu2svMOxx2m00)\n\n### C4Language_japanese\n\nTheme [C4Language_japanese](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4Language_japanese.puml) can be activated with\n\n```plantuml\n!theme C4Language_japanese from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![japanese sample - open link](https://www.plantuml.com/plantuml/svg/hL7DRfmm4BxxAPpj8Qoq0QNAgQTGWf83sQ32Dke93J3TTUKVonw4eghltd6RPli0uJ9YvlkPRtmR2G8jHeiBEg51MTqqO8yB777u0HuiHfJVWpFoHEJZfw88iEP7HQTbN2A6oLb2I_daJE4rs2Hr5MdMQYogcwisjGwFJM4W4eRYZqSK5yfEUfdnNKIvDLJC06Knv3vb4KtvxUdG3qsvl-kgigsphH0jXkXi1hDHTYStPQegKW1oORCLtGkBcU6pM-mCuIMRhdVoiWFZDLvkvKyX-NkpoLOS1_2UTPvnbANtMar0ojaDjweFErbsRRwlUwO4b1_pQ_dujKgpKcktHfbYHabESaOF336B9iLUibyLSIf9og1chyYx_NhTBgE_GzPvXV5GV47zBzLvhKDa9jU7lcyxHYNGs_GiSuyK-HTJIS_yFqLq3q_FGrFVr_ixFk0jsfcF-ni0 \"japanese sample\")](https://www.plantuml.com/plantuml/uml/hL7DRfmm4BxxAPpj8Qoq0QNAgQTGWf83sQ32Dke93J3TTUKVonw4eghltd6RPli0uJ9YvlkPRtmR2G8jHeiBEg51MTqqO8yB777u0HuiHfJVWpFoHEJZfw88iEP7HQTbN2A6oLb2I_daJE4rs2Hr5MdMQYogcwisjGwFJM4W4eRYZqSK5yfEUfdnNKIvDLJC06Knv3vb4KtvxUdG3qsvl-kgigsphH0jXkXi1hDHTYStPQegKW1oORCLtGkBcU6pM-mCuIMRhdVoiWFZDLvkvKyX-NkpoLOS1_2UTPvnbANtMar0ojaDjweFErbsRRwlUwO4b1_pQ_dujKgpKcktHfbYHabESaOF336B9iLUibyLSIf9og1chyYx_NhTBgE_GzPvXV5GV47zBzLvhKDa9jU7lcyxHYNGs_GiSuyK-HTJIS_yFqLq3q_FGrFVr_ixFk0jsfcF-ni0)\n\n### C4Language_korean\n\nTheme [C4Language_korean](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4Language_korean.puml) can be activated with\n\n```plantuml\n!theme C4Language_korean from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![korean sample - open link](https://www.plantuml.com/plantuml/svg/hL7DRfmm4BxxAIRRGrXf0qgLKq-X12K7ia65RTGJCZ3TjUeVonw4eghltd6RPli0uJ9YvlkPRtmRIGPQZ1ONT4A3KDqqqXuNUSJXXmieBNmFpi29oCTFHH7acXyLdPPnYHWcPmajvPCpXTVI9g6hIBDMOr7TNBMfTNXi2YCZOIZ-E4HneUoabndVHPHRGyKCgIo6tASaeYc_FHtweIdtTrrLjdMs5QB549tDv6oKtS6cJ5L52f9Ss6n5zy9YPlZi5ZlBy99DrpkuxAJn6Y-ty5C0VsyssOhZ8BrddMSSeVHUgqcISdR3hUh33igkpVTrpvI0y36_XiUlLPgLMhirGeePWHnmHYyPOXPDYhsWNnLnAY1bKBDNvDr-lMwNqTyXwxp2U2Y-eFwNwhpM8JAJwqFVjnsZ4kXjUfQvHuhyYwcaP_wV8hg7f-UXgU_h_HqVy1RjpCVz3G00 \"korean sample\")](https://www.plantuml.com/plantuml/uml/hL7DRfmm4BxxAIRRGrXf0qgLKq-X12K7ia65RTGJCZ3TjUeVonw4eghltd6RPli0uJ9YvlkPRtmRIGPQZ1ONT4A3KDqqqXuNUSJXXmieBNmFpi29oCTFHH7acXyLdPPnYHWcPmajvPCpXTVI9g6hIBDMOr7TNBMfTNXi2YCZOIZ-E4HneUoabndVHPHRGyKCgIo6tASaeYc_FHtweIdtTrrLjdMs5QB549tDv6oKtS6cJ5L52f9Ss6n5zy9YPlZi5ZlBy99DrpkuxAJn6Y-ty5C0VsyssOhZ8BrddMSSeVHUgqcISdR3hUh33igkpVTrpvI0y36_XiUlLPgLMhirGeePWHnmHYyPOXPDYhsWNnLnAY1bKBDNvDr-lMwNqTyXwxp2U2Y-eFwNwhpM8JAJwqFVjnsZ4kXjUfQvHuhyYwcaP_wV8hg7f-UXgU_h_HqVy1RjpCVz3G00)\n\n### C4Language_portuguese\n\nTheme [C4Language_portuguese](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4Language_portuguese.puml) can be activated with\n\n```plantuml\n!theme C4Language_portuguese from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![portuguese sample - open link](https://www.plantuml.com/plantuml/svg/hL7BRjmm3BphAvZj8LvWOoD5JZt5THR9mTaOjRT1JuRMPhq2z10a2aPGzDzBjMdI3wWlX3cS6Gvr6qa6IaQB2pgZGMXkMccN91SSlMDaIHWHlWTdu4pauwUg2d8j5qNdT4eHm-GieQLoSgRoMjeiTXLfrkfKDJTNNMuT7zlAo4WOgjykKLmeE-aqutyHvTROC4CgYw7qEOrewszFns5iwyDTtzJTljWAqM68pXPoDihkO5FdgY85IIvijg9_OJ4pVdR9pZAy5DFr3YvxQRp6ooty4C3VcqsnuccKthFECvwWzbwhIP9oTiEjviCEwhuh3_k1AG7XOtaDZr-RZDLQkpL2ZXc17716Btd494sAlM1O5N4g86LGirVatNw-RbVG7v1rNiSO55zG_qtrljOnCfFhmp1qFK_beJVqNUOUAV8lvfAV-L-Aw1-UdiTsVxy_tF41Rz7EVDnV \"portuguese sample\")](https://www.plantuml.com/plantuml/uml/hL7BRjmm3BphAvZj8LvWOoD5JZt5THR9mTaOjRT1JuRMPhq2z10a2aPGzDzBjMdI3wWlX3cS6Gvr6qa6IaQB2pgZGMXkMccN91SSlMDaIHWHlWTdu4pauwUg2d8j5qNdT4eHm-GieQLoSgRoMjeiTXLfrkfKDJTNNMuT7zlAo4WOgjykKLmeE-aqutyHvTROC4CgYw7qEOrewszFns5iwyDTtzJTljWAqM68pXPoDihkO5FdgY85IIvijg9_OJ4pVdR9pZAy5DFr3YvxQRp6ooty4C3VcqsnuccKthFECvwWzbwhIP9oTiEjviCEwhuh3_k1AG7XOtaDZr-RZDLQkpL2ZXc17716Btd494sAlM1O5N4g86LGirVatNw-RbVG7v1rNiSO55zG_qtrljOnCfFhmp1qFK_beJVqNUOUAV8lvfAV-L-Aw1-UdiTsVxy_tF41Rz7EVDnV)\n\n### C4Language_russian\n\nTheme [C4Language_russian](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4Language_russian.puml) can be activated with\n\n```plantuml\n!theme C4Language_russian from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![russian sample - open link](https://www.plantuml.com/plantuml/svg/hL7DRjim3BxhATZiK0T8RNJeQQTwRj0UtDIOdHKx6RBD9GBq8qWKZ6BOku_QkdOFC5y8azyFF-esaWoKZ1ONT4Q3qDoqqfwIFE4OKenAMlWUd84paO-VgYh8jJmfEgSfHGopiuIMojcPocjfiz9Lf4MhgMfkhhhSEZwsbP6HC5I_BQAuK7RMQS7_8igjiM66L1P3wNCKqTRVdex3sDQ7kxwfktsn5QB349qjv6AKtS6cpbL52f9Ss6n5_y9YPlpiabraU2dcwnrSzj9uZPTR-260lpUROiLfbDwppZDEK7klrIn9ERlXLlDX1tNVbOVzm9I0yB6yXiUlJPxLMhirGeuPWHnmHYyPOf8cnLumh8eu5P0ogDahycu_NxShwC-GTLvXF1HVKFzDzRxMCJAJwyCmT3sZCkXj-YvpZnJv5tF9p_mlHVGFJyzZkx_V7-xuWBTe5pxkBm00 \"russian sample\")](https://www.plantuml.com/plantuml/uml/hL7DRjim3BxhATZiK0T8RNJeQQTwRj0UtDIOdHKx6RBD9GBq8qWKZ6BOku_QkdOFC5y8azyFF-esaWoKZ1ONT4Q3qDoqqfwIFE4OKenAMlWUd84paO-VgYh8jJmfEgSfHGopiuIMojcPocjfiz9Lf4MhgMfkhhhSEZwsbP6HC5I_BQAuK7RMQS7_8igjiM66L1P3wNCKqTRVdex3sDQ7kxwfktsn5QB349qjv6AKtS6cpbL52f9Ss6n5_y9YPlpiabraU2dcwnrSzj9uZPTR-260lpUROiLfbDwppZDEK7klrIn9ERlXLlDX1tNVbOVzm9I0yB6yXiUlJPxLMhirGeuPWHnmHYyPOf8cnLumh8eu5P0ogDahycu_NxShwC-GTLvXF1HVKFzDzRxMCJAJwyCmT3sZCkXj-YvpZnJv5tF9p_mlHVGFJyzZkx_V7-xuWBTe5pxkBm00)\n\n### C4Language_spanish\n\nTheme [C4Language_spanish](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4Language_spanish.puml) can be activated with\n\n```plantuml\n!theme C4Language_spanish from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![spanish sample - open link](https://www.plantuml.com/plantuml/svg/hL7DRfmm4BxxAIRRGrXf0qgLKq-X12K7ia65RTGJCZ1TBFd7iWUXgEgxTzocIH-WN4RCV3_pZMyZoK2hqUA25ZG8rKqZxNcLPnoYbrR51Ru7Ps0Xyl5JKGIvvMT5opgk4SFaBA6bV7Acy5hQf7GLQTPgBAgRgpQrJezDOMGa3CLlYoWkb9tqEkD_4UNMK353AeiXzocAQCflJwT-QChZNLULRPtjXMWnH6SpEHjb3x0hKrMHWYGNTdlHlR2O6JwxrSuol6JJzG4kEscyniiz_130tvjDjk4uIEzPvnb7ABtNQfAadDrng_fmWB9hysFTCoKWVColuV5hbMQbrcwBa69680USqKk6c5MJOY_eDqMS2aWPrEmLURUVhzjbz6V8Egym7eelgF-cUb_h59d9zQ7lsuvH2VGsVPUvHuhyYwcaP_wN8hg7f-UXgU_hunqVy1RjpCVz1G00 \"spanish sample\")](https://www.plantuml.com/plantuml/uml/hL7DRfmm4BxxAIRRGrXf0qgLKq-X12K7ia65RTGJCZ1TBFd7iWUXgEgxTzocIH-WN4RCV3_pZMyZoK2hqUA25ZG8rKqZxNcLPnoYbrR51Ru7Ps0Xyl5JKGIvvMT5opgk4SFaBA6bV7Acy5hQf7GLQTPgBAgRgpQrJezDOMGa3CLlYoWkb9tqEkD_4UNMK353AeiXzocAQCflJwT-QChZNLULRPtjXMWnH6SpEHjb3x0hKrMHWYGNTdlHlR2O6JwxrSuol6JJzG4kEscyniiz_130tvjDjk4uIEzPvnb7ABtNQfAadDrng_fmWB9hysFTCoKWVColuV5hbMQbrcwBa69680USqKk6c5MJOY_eDqMS2aWPrEmLURUVhzjbz6V8Egym7eelgF-cUb_h59d9zQ7lsuvH2VGsVPUvHuhyYwcaP_wN8hg7f-UXgU_hunqVy1RjpCVz1G00)\n\n### C4Language_ukrainian\n\nTheme [C4Language_ukrainian](https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes/puml-theme-C4Language_ukrainian.puml) can be activated with\n\n```plantuml\n!theme C4Language_ukrainian from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n```\n\n[![ukrainian sample - open link](https://www.plantuml.com/plantuml/svg/hL7DRfmm4BxxAIRRGrXf0qgLKq-XP9KSo0OLjb5FoC1qrwf_B7ii55LzzuxLDEa3bCk8cU_d--0saWoKZ1ONT4Q3qDoqqfwIFE6OVWIfh98MlWTdu4pauwUg2d8jJuhEQKeHm-mieQLoTgRoMjgiTHLfqMggcfkhBg-EZsrbP2GC5MMJA2wKdNLQyB-8ycficC5XCPG-bn5j_UtfE8njVRZhcxhR5riXEWpHsK8kHjaTREeyLQGWoONDLlGlB6R6poxPHOQNOhxUmMKlZTTukOMV0lXviobMd4RfFUiyumIrzrhDafIp6rur7tPGzrrvs0zC2GWVosju_DhaMwsrMoFacX780NVqaY4cQLBi1SEgY300AOEQlI9d-_MQhg0_HzPvXV5HV47zjzLxh6Da9i-7OUXwHcNGs_LTvXufyYlcaN_plnJHFpmzZ-t-Vd-uumzuYtP9Hly6 \"ukrainian sample\")](https://www.plantuml.com/plantuml/uml/hL7DRfmm4BxxAIRRGrXf0qgLKq-XP9KSo0OLjb5FoC1qrwf_B7ii55LzzuxLDEa3bCk8cU_d--0saWoKZ1ONT4Q3qDoqqfwIFE6OVWIfh98MlWTdu4pauwUg2d8jJuhEQKeHm-mieQLoTgRoMjgiTHLfqMggcfkhBg-EZsrbP2GC5MMJA2wKdNLQyB-8ycficC5XCPG-bn5j_UtfE8njVRZhcxhR5riXEWpHsK8kHjaTREeyLQGWoONDLlGlB6R6poxPHOQNOhxUmMKlZTTukOMV0lXviobMd4RfFUiyumIrzrhDafIp6rur7tPGzrrvs0zC2GWVosju_DhaMwsrMoFacX780NVqaY4cQLBi1SEgY300AOEQlI9d-_MQhg0_HzPvXV5HV47zjzLxh6Da9i-7OUXwHcNGs_LTvXufyYlcaN_plnJHFpmzZ-t-Vd-uumzuYtP9Hly6)\n"
  },
  {
    "path": "percy/C4_Component Diagram Sample - bigbankplc.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\nLAYOUT_WITH_LEGEND()\n\ntitle Component diagram for Internet Banking System - API Application\n\nContainer(spa, \"Single Page Application\", \"javascript and angular\", \"Provides all the internet banking functionality to customers via their web browser.\")\nContainer(ma, \"Mobile App\", \"Xamarin\", \"Provides a limited subset ot the internet banking functionality to customers via their mobile mobile device.\")\nContainerDb(db, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\")\nSystem_Ext(mbs, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nContainer_Boundary(api, \"API Application\") {\n    Component(sign, \"Sign In Controller\", \"MVC Rest Controlle\", \"Allows users to sign in to the internet banking system\")\n    Component(accounts, \"Accounts Summary Controller\", \"MVC Rest Controller\", \"Provides customers with a summary of their bank accounts\")\n    Component(security, \"Security Component\", \"Spring Bean\", \"Provides functionality related to singing in, changing passwords, etc.\")\n    Component(mbsfacade, \"Mainframe Banking System Facade\", \"Spring Bean\", \"A facade onto the mainframe banking system.\")\n\n    Rel(sign, security, \"Uses\")\n    Rel(accounts, mbsfacade, \"Uses\")\n    Rel(security, db, \"Read & write to\", \"JDBC\")\n    Rel(mbsfacade, mbs, \"Uses\", \"XML/HTTPS\")\n}\n\nRel(spa, sign, \"Uses\", \"JSON/HTTPS\")\nRel(spa, accounts, \"Uses\", \"JSON/HTTPS\")\n\nRel(ma, sign, \"Uses\", \"JSON/HTTPS\")\nRel(ma, accounts, \"Uses\", \"JSON/HTTPS\")\n@enduml\n"
  },
  {
    "path": "percy/C4_Container Diagram Sample - bigbankplc-icons.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\n!define DEVICONS https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons\n!define FONTAWESOME https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/font-awesome-5\n' uncomment the following line and comment the first to use locally\n' !include C4_Container.puml\n!include DEVICONS/angular.puml\n!include DEVICONS/dotnet.puml\n!include DEVICONS/java.puml\n!include DEVICONS/msql_server.puml\n!include FONTAWESOME/server.puml\n!include FONTAWESOME/envelope.puml\n\n' LAYOUT_TOP_DOWN()\n' LAYOUT_AS_SKETCH()\nLAYOUT_WITH_LEGEND()\n\ntitle Container diagram for Internet Banking System\n\nPerson(customer, Customer, \"A customer of the bank, with personal bank accounts\")\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(web_app, \"Web Application\", \"Java, Spring MVC\", \"Delivers the static content and the Internet banking SPA\", \"java\")\n    Container(spa, \"Single-Page App\", \"JavaScript, Angular\", \"Provides all the Internet banking functionality to customers via their web browser\", \"angular\")\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\", \"dotnet\")\n    ContainerDb(database, \"Database\", \"SQL Database\", \"Stores user registration information, hashed auth credentials, access logs, etc.\", \"mysql_server\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\", \"server\")\n}\n\nSystem_Ext(email_system, \"E-Mail System\", \"The internal Microsoft Exchange system\", \"envelope\")\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(customer, web_app, \"Uses\", \"HTTPS\")\nRel(customer, spa, \"Uses\", \"HTTPS\")\nRel(customer, mobile_app, \"Uses\")\n\nRel_Neighbor(web_app, spa, \"Delivers\")\nRel(spa, backend_api, \"Uses\", \"async, JSON/HTTPS\")\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\")\nRel_Back_Neighbor(database, backend_api, \"Reads from and writes to\", \"sync, JDBC\")\n\nRel_Back(customer, email_system, \"Sends e-mails to\")\nRel_Back(email_system, backend_api, \"Sends e-mails using\", \"sync, SMTP\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\")\n@enduml\n"
  },
  {
    "path": "percy/C4_Container Diagram Sample - bigbankplc-newStyle.puml",
    "content": "@startuml\n\n!NEW_C4_STYLE = 1\n\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\n!define DEVICONS https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons\n!define FONTAWESOME https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/font-awesome-5\n' uncomment the following line and comment the first to use locally\n' !include C4_Container.puml\n!include DEVICONS/angular.puml\n!include DEVICONS/dotnet.puml\n!include DEVICONS/java.puml\n!include DEVICONS/msql_server.puml\n!include FONTAWESOME/server.puml\n!include FONTAWESOME/envelope.puml\n\n' LAYOUT_TOP_DOWN()\n' LAYOUT_AS_SKETCH()\n\ntitle Container diagram for Internet Banking System\n\nPerson(customer, Customer, \"A customer of the bank, with personal bank accounts\")\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(web_app, \"Web Application\", \"Java, Spring MVC\", \"Delivers the static content and the Internet banking SPA\", \"java\")\n    Container(spa, \"Single-Page App\", \"JavaScript, Angular\", \"Provides all the Internet banking functionality to customers via their web browser\", \"angular\")\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\", \"dotnet\")\n    ContainerDb(database, \"Database\", \"SQL Database\", \"Stores user registration information, hashed auth credentials, access logs, etc.\", \"mysql_server\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\", \"server\")\n}\n\nSystem_Ext(email_system, \"E-Mail System\", \"The internal Microsoft Exchange system\", \"envelope\")\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(customer, web_app, \"Uses\", \"HTTPS\")\nRel(customer, spa, \"Uses\", \"HTTPS\")\nRel(customer, mobile_app, \"Uses\")\n\nRel_Neighbor(web_app, spa, \"Delivers\")\nRel(spa, backend_api, \"Uses\", \"async, JSON/HTTPS\")\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\")\nRel_Back_Neighbor(database, backend_api, \"Reads from and writes to\", \"sync, JDBC\")\n\nRel_Back(customer, email_system, \"Sends e-mails to\")\nRel_Back(email_system, backend_api, \"Sends e-mails using\", \"sync, SMTP\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\")\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/C4_Container Diagram Sample - bigbankplc-styles.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\nSHOW_PERSON_OUTLINE()\n' Tags support no spaces in the name (based on the underlining stereotypes, which don't support spaces anymore). \n' If spaces are requested in the legend, legend text with space has to be defined\nAddElementTag(\"backendContainer\", $fontColor=$ELEMENT_FONT_COLOR, $bgColor=\"#335DA5\", $shape=EightSidedShape(), $legendText=\"backend container (eight sided)\")\nAddRelTag(\"async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DashedLine())\nAddRelTag(\"sync/async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DottedLine())\n\ntitle Container diagram for Internet Banking System\n\nPerson(customer, Customer, \"A customer of the bank, with personal bank accounts\")\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(web_app, \"Web Application\", \"Java, Spring MVC\", \"Delivers the static content and the Internet banking SPA\")\n    Container(spa, \"Single-Page App\", \"JavaScript, Angular\", \"Provides all the Internet banking functionality to customers via their web browser\")\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\")\n    ContainerDb(database, \"Database\", \"SQL Database\", \"Stores user registration information, hashed auth credentials, access logs, etc.\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\", $tags=\"backendContainer\")\n}\n\nSystem_Ext(email_system, \"E-Mail System\", \"The internal Microsoft Exchange system\")\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(customer, web_app, \"Uses\", \"HTTPS\")\nRel(customer, spa, \"Uses\", \"HTTPS\")\nRel(customer, mobile_app, \"Uses\")\n\nRel_Neighbor(web_app, spa, \"Delivers\")\nRel(spa, backend_api, \"Uses\", \"async, JSON/HTTPS\", $tags=\"async\")\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\", $tags=\"async\")\nRel_Back_Neighbor(database, backend_api, \"Reads from and writes to\", \"sync, JDBC\")\n\nRel_Back(customer, email_system, \"Sends e-mails to\")\nRel_Back(email_system, backend_api, \"Sends e-mails using\", \"sync, SMTP\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\", $tags=\"sync/async\")\n\nSHOW_LEGEND()\nfooter drawn with PlantUML v. %version() and C4-PlantUML v. C4Version()\n@enduml\n"
  },
  {
    "path": "percy/C4_Container Diagram Sample - bigbankplc.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\n' LAYOUT_TOP_DOWN()\n' LAYOUT_AS_SKETCH()\nLAYOUT_WITH_LEGEND()\n\ntitle Container diagram for Internet Banking System\n\nPerson(customer, Customer, \"A customer of the bank, with personal bank accounts\")\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(web_app, \"Web Application\", \"Java, Spring MVC\", \"Delivers the static content and the Internet banking SPA\")\n    Container(spa, \"Single-Page App\", \"JavaScript, Angular\", \"Provides all the Internet banking functionality to customers via their web browser\")\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\")\n    ContainerDb(database, \"Database\", \"SQL Database\", \"Stores user registration information, hashed auth credentials, access logs, etc.\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\")\n}\n\nSystem_Ext(email_system, \"E-Mail System\", \"The internal Microsoft Exchange system\")\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(customer, web_app, \"Uses\", \"HTTPS\")\nRel(customer, spa, \"Uses\", \"HTTPS\")\nRel(customer, mobile_app, \"Uses\")\n\nRel_Neighbor(web_app, spa, \"Delivers\")\nRel(spa, backend_api, \"Uses\", \"async, JSON/HTTPS\")\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\")\nRel_Back_Neighbor(database, backend_api, \"Reads from and writes to\", \"sync, JDBC\")\n\nRel_Back(customer, email_system, \"Sends e-mails to\")\nRel_Back(email_system, backend_api, \"Sends e-mails using\", \"sync, SMTP\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\")\n@enduml\n"
  },
  {
    "path": "percy/C4_Container Diagram Sample - message bus.puml",
    "content": "@startuml \"messagebus\"\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\nskinparam wrapWidth 200\nskinparam maxMessageSize 200\n\nLAYOUT_TOP_DOWN()\n'LAYOUT_AS_SKETCH()\nLAYOUT_WITH_LEGEND()\n\n\nPerson(customer, Customer, \"A customer\")\n\nSystem_Boundary(c1, \"Customer Information\") {\n\n    Container(app, \"Customer Application\", \"Javascript, Angular\", \"Allows customers to manage their profile\")\n\n    Container(customer_service, \"Customer Service\", \"Java, Spring Boot\", \"The point of access for customer information\")\n\n    Container(message_bus, \"Message Bus\", \"RabbitMQ\", \"Transport for business events\")\n\n    Container(reporting_service, \"Reporting Service\", \"Ruby\", \"Creates normalised data for reporting purposes\")\n\n    Container(audit_service, \"Audit Service\", \"C#/.NET\", \"Provides organisation-wide auditing facilities\")\n\n    ContainerDb(customer_db, \"Customer Database\", \"Oracle 12c\", \"Stores customer information\")\n\n    ContainerDb(reporting_db, \"Reporting Database\", \"MySQL\", \"Stores a normalized version of all business data for ad hoc reporting purposes\")\n\n    Container(audit_store, \"Audit Store\", \"Event Store\", \"Stores information about events that have happened\")\n}\n\nRel(customer, app, \"Uses\", \"HTTPS\")\n\nRel_R(app, customer_service, \"Updates customer information using\", \"async, JSON/HTTPS\")\n\nRel_L(customer_service, app, \"Sends events to\", \"WebSocket\")\nRel_R(customer_service, message_bus, \"Sends customer update events to\")\nRel(customer_service, customer_db, \"Stores data in\", \"JDBC\")\n\nRel(message_bus, reporting_service, \"Sends customer update events to\")\nRel(message_bus, audit_service, \"Sends customer update events to\")\n\nRel(reporting_service, reporting_db, \"Stores data in\")\nRel(audit_service, audit_store, \"Stores events in\")\n\nLay_R(reporting_service, audit_service)\n\n@enduml\n"
  },
  {
    "path": "percy/C4_Container Diagram Sample - techtribesjs.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\nLAYOUT_TOP_DOWN()\n'LAYOUT_AS_SKETCH()\nLAYOUT_WITH_LEGEND()\n\nPerson_Ext(anonymous_user, \"Anonymous User\")\nPerson(aggregated_user, \"Aggregated User\")\nPerson(administration_user, \"Administration User\")\n\nSystem_Boundary(c1, \"techtribes.js\"){\n    \n    Container(web_app, \"Web Application\", \"Java, Spring MVC, Tomcat 7.x\", \"Allows users to view people, tribes, content, events, jobs, etc. from the local tech, digital and IT sector\")\n\n    ContainerDb(rel_db, \"Relational Database\", \"MySQL 5.5.x\", \"Stores people, tribes, tribe membership, talks, events, jobs, badges, GitHub repos, etc.\")\n\n    Container(filesystem, \"File System\", \"FAT32\", \"Stores search indexes\")\n\n    ContainerDb(nosql, \"NoSQL Data Store\", \"MongoDB 2.2.x\", \"Stores from RSS/Atom feeds (blog posts) and tweets\")\n\n    Container(updater, \"Updater\", \"Java 7 Console App\", \"Updates profiles, tweets, GitHub repos and content on a scheduled basis\")\n}\n\nSystem_Ext(twitter, \"Twitter\")\nSystem_Ext(github, \"GitHub\")\nSystem_Ext(blogs, \"Blogs\")\n\n\nRel(anonymous_user, web_app, \"Uses\", \"HTTPS\")\nRel(aggregated_user, web_app, \"Uses\", \"HTTPS\")\nRel(administration_user, web_app, \"Uses\", \"HTTPS\")\n\nRel(web_app, rel_db, \"Reads from and writes to\", \"SQL/JDBC, port 3306\")\nRel(web_app, filesystem, \"Reads from\")\nRel(web_app, nosql, \"Reads from\", \"MongoDB wire protocol, port 27017\")\n\nRel_U(updater, rel_db, \"Reads from and writes data to\", \"SQL/JDBC, port 3306\")\nRel_U(updater, filesystem, \"Writes to\")\nRel_U(updater, nosql, \"Reads from and writes to\", \"MongoDB wire protocol, port 27017\")\n\nRel(updater, twitter, \"Gets profile information and tweets from\", \"HTTPS\")\nRel(updater, github, \"Gets information about public code repositories from\", \"HTTPS\")\nRel(updater, blogs, \"Gets content using RSS and Atom feeds from\", \"HTTP\")\n\nLay_R(rel_db, filesystem)\n\n@enduml\n"
  },
  {
    "path": "percy/C4_Context Diagram Sample - bigbankplc-landscape.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Context.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml\n!endif\n\n'LAYOUT_TOP_DOWN()\n'LAYOUT_AS_SKETCH()\nLAYOUT_WITH_LEGEND()\n\ntitle System Landscape diagram for Big Bank plc\n\nPerson(customer, \"Personal Banking Customer\", \"A customer of the bank, with personal bank accounts.\")\n\nEnterprise_Boundary(c0, \"Big Bank plc\") {\n    System(banking_system, \"Internet Banking System\", \"Allows customers to view information about their bank accounts, and make payments.\")\n\n    System_Ext(atm, \"ATM\", \"Allows customers to withdraw cash.\")\n    System_Ext(mail_system, \"E-mail system\", \"The internal Microsoft Exchange e-mail system.\")\n\n    System_Ext(mainframe, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\n    Person_Ext(customer_service, \"Customer Service Staff\", \"Customer service staff within the bank.\")\n    Person_Ext(back_office, \"Back Office Staff\", \"Administration and support staff within the bank.\")\n}\n\nRel_Neighbor(customer, banking_system, \"Uses\")\nRel_R(customer, atm, \"Withdraws cash using\")\nRel_Back(customer, mail_system, \"Sends e-mails to\")\n\nRel_R(customer, customer_service, \"Asks questions to\", \"Telephone\")\n\nRel_D(banking_system, mail_system, \"Sends e-mail using\")\nRel_R(atm, mainframe, \"Uses\")\nRel_R(banking_system, mainframe, \"Uses\")\nRel_D(customer_service, mainframe, \"Uses\")\nRel_U(back_office, mainframe, \"Uses\")\n\nLay_D(atm, banking_system)\n\nLay_D(atm, customer)\nLay_U(mail_system, customer)\n@enduml\n"
  },
  {
    "path": "percy/C4_Context Diagram Sample - bigbankplc.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Context.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml\n!endif\n\nLAYOUT_WITH_LEGEND()\n\ntitle System Context diagram for Internet Banking System\n\nPerson(customer, \"Personal Banking Customer\", \"A customer of the bank, with personal bank accounts.\")\nSystem(banking_system, \"Internet Banking System\", \"Allows customers to view information about their bank accounts, and make payments.\")\n\nSystem_Ext(mail_system, \"E-mail system\", \"The internal Microsoft Exchange e-mail system.\")\nSystem_Ext(mainframe, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(customer, banking_system, \"Uses\")\nRel_Back(customer, mail_system, \"Sends e-mails to\")\nRel_Neighbor(banking_system, mail_system, \"Sends e-mails\", \"SMTP\")\nRel(banking_system, mainframe, \"Uses\")\n@enduml\n"
  },
  {
    "path": "percy/C4_Context Diagram Sample - enterprise.puml",
    "content": "@startuml \"enterprise\"\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Context.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml\n!endif\n\nLAYOUT_TOP_DOWN()\n'LAYOUT_AS_SKETCH()\nLAYOUT_WITH_LEGEND()\n\nPerson(customer, \"Customer\", \"A customer of Widgets Limited.\")\n\nEnterprise_Boundary(c0, \"Widgets Limited\") {\n    Person(csa, \"Customer Service Agent\", \"Deals with customer enquiries.\")\n\n    System(ecommerce, \"E-commerce System\", \"Allows customers to buy widgets online via the widgets.com website.\")\n\n    System(fulfillment, \"Fulfillment System\", \"Responsible for processing and shipping of customer orders.\")\n}\n\nSystem(taxamo, \"Taxamo\", \"Calculates local tax (for EU B2B customers) and acts as a front-end for Braintree Payments.\")\n\nSystem(braintree, \"Braintree Payments\", \"Processes credit card payments on behalf of Widgets Limited.\")\n\nSystem(post, \"Jersey Post\", \"Calculates worldwide shipping costs for packages.\")\n\nRel_R(customer, csa, \"Asks questions to\", \"Telephone\")\n\nRel_R(customer, ecommerce, \"Places orders for widgets using\")\n\nRel(csa, ecommerce, \"Looks up order information using\")\n\nRel_R(ecommerce, fulfillment, \"Sends order information to\")\n\nRel_D(fulfillment, post, \"Gets shipping charges from\")\n\nRel_D(ecommerce, taxamo, \"Delegates credit card processing to\")\n\nRel_L(taxamo, braintree, \"Uses for credit card processing\")\n\nLay_D(customer, braintree)\n\n@enduml\n"
  },
  {
    "path": "percy/C4_Deployment Diagram Sample - bigbankplc-details.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Deployment.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n!endif\n\nAddElementTag(\"fallback\", $bgColor=\"#c0c0c0\")\nAddRelTag(\"fallback\", $textColor=\"#c0c0c0\", $lineColor=\"#438DD5\")\n\nWithoutPropertyHeader()\n\n' calculated legend is used (activated in last line)\n' LAYOUT_WITH_LEGEND()\n\ntitle Deployment Diagram for Internet Banking System - Live\n\nDeployment_Node(plc, \"Live\", \"Big Bank plc\", \"Big Bank plc data center\"){\n    AddProperty(\"Location\", \"London and Reading\")\n    Deployment_Node_L(dn, \"bigbank-api***\\tx8\", \"Ubuntu 16.04 LTS\", \"A web server residing in the web server farm, accessed via F5 BIG-IP LTMs.\"){\n        AddProperty(\"Java Version\", \"8\")\n        AddProperty(\"Xmx\", \"512M\")\n        AddProperty(\"Xms\", \"1024M\")\n        Deployment_Node_L(apache, \"Apache Tomcat\", \"Apache Tomcat 8.x\", \"An open source Java EE web server.\"){\n            Container(api, \"API Application\", \"Java and Spring MVC\", \"Provides Internet Banking functionality via a JSON/HTTPS API.\")\n        }\n    }\n    AddProperty(\"Location\", \"London\")\n    Deployment_Node_L(bigbankdb01, \"bigbank-db01\", \"Ubuntu 16.04 LTS\", \"The primary database server.\"){\n        Deployment_Node_L(oracle, \"Oracle - Primary\", \"Oracle 12c\", \"The primary, live database server.\"){\n            ContainerDb(db, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\")\n        }\n    }\n    AddProperty(\"Location\", \"Reading\")\n    Deployment_Node_R(bigbankdb02, \"bigbank-db02\", \"Ubuntu 16.04 LTS\", \"The secondary database server.\", $tags=\"fallback\") {\n        Deployment_Node_R(oracle2, \"Oracle - Secondary\", \"Oracle 12c\", \"A secondary, standby database server, used for failover purposes only.\", $tags=\"fallback\") {\n            ContainerDb(db2, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\", $tags=\"fallback\")\n        }\n    }\n    AddProperty(\"Location\", \"London and Reading\")\n    Deployment_Node_R(bb2, \"bigbank-web***\\tx4\", \"Ubuntu 16.04 LTS\", \"A web server residing in the web server farm, accessed via F5 BIG-IP LTMs.\"){\n        AddProperty(\"Java Version\", \"8\")\n        AddProperty(\"Xmx\", \"512M\")\n        AddProperty(\"Xms\", \"1024M\")\n        Deployment_Node_R(apache2, \"Apache Tomcat\", \"Apache Tomcat 8.x\", \"An open source Java EE web server.\"){\n            Container(web, \"Web Application\", \"Java and Spring MVC\", \"Delivers the static content and the Internet Banking single page application.\")\n        }\n    }\n}\n\nDeployment_Node(mob, \"Customer's mobile device\", \"Apple IOS or Android\"){\n    Container(mobile, \"Mobile App\", \"Xamarin\", \"Provides a limited subset of the Internet Banking functionality to customers via their mobile device.\")\n}\n\nDeployment_Node(comp, \"Customer's computer\", \"Microsoft Windows of Apple macOS\"){\n    Deployment_Node(browser, \"Web Browser\", \"Google Chrome, Mozilla Firefox, Apple Safari or Microsoft Edge\"){\n        Container(spa, \"Single Page Application\", \"JavaScript and Angular\", \"Provides all of the Internet Banking functionality to customers via their web browser.\")\n    }\n}\n\nRel(mobile, api, \"Makes API calls to\", \"json/HTTPS\")\nRel(spa, api, \"Makes API calls to\", \"json/HTTPS\")\nRel_U(web, spa, \"Delivers to the customer's web browser\")\nRel(api, db, \"Reads from and writes to\", \"JDBC\")\nRel(api, db2, \"Reads from and writes to\", \"JDBC\", $tags=\"fallback\")\nRel_R(db, db2, \"Replicates data to\")\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/C4_Deployment Diagram Sample - bigbankplc.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Deployment.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n!endif\n\nAddElementTag(\"fallback\", $bgColor=\"#c0c0c0\")\nAddRelTag(\"fallback\", $textColor=\"#c0c0c0\", $lineColor=\"#438DD5\")\n\n' calculated legend is used (activated in last line)\n' LAYOUT_WITH_LEGEND()\n\ntitle Deployment Diagram for Internet Banking System - Live\n\nDeployment_Node(plc, \"Big Bank plc\", \"Big Bank plc data center\"){\n    Deployment_Node(dn, \"bigbank-api***\\tx8\", \"Ubuntu 16.04 LTS\"){\n        Deployment_Node(apache, \"Apache Tomcat\", \"Apache Tomcat 8.x\"){\n            Container(api, \"API Application\", \"Java and Spring MVC\", \"Provides Internet Banking functionality via a JSON/HTTPS API.\")\n        }\n    }\n    Deployment_Node(bigbankdb01, \"bigbank-db01\", \"Ubuntu 16.04 LTS\"){\n        Deployment_Node(oracle, \"Oracle - Primary\", \"Oracle 12c\"){\n            ContainerDb(db, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\")\n        }\n    }\n    Deployment_Node(bigbankdb02, \"bigbank-db02\", \"Ubuntu 16.04 LTS\", $tags=\"fallback\") {\n        Deployment_Node(oracle2, \"Oracle - Secondary\", \"Oracle 12c\", $tags=\"fallback\") {\n            ContainerDb(db2, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\", $tags=\"fallback\")\n        }\n    }\n    Deployment_Node(bb2, \"bigbank-web***\\tx4\", \"Ubuntu 16.04 LTS\"){\n        Deployment_Node(apache2, \"Apache Tomcat\", \"Apache Tomcat 8.x\"){\n            Container(web, \"Web Application\", \"Java and Spring MVC\", \"Delivers the static content and the Internet Banking single page application.\")\n        }\n    }\n}\n\nDeployment_Node(mob, \"Customer's mobile device\", \"Apple IOS or Android\"){\n    Container(mobile, \"Mobile App\", \"Xamarin\", \"Provides a limited subset of the Internet Banking functionality to customers via their mobile device.\")\n}\n\nDeployment_Node(comp, \"Customer's computer\", \"Microsoft Windows of Apple macOS\"){\n    Deployment_Node(browser, \"Web Browser\", \"Google Chrome, Mozilla Firefox, Apple Safari or Microsoft Edge\"){\n        Container(spa, \"Single Page Application\", \"JavaScript and Angular\", \"Provides all of the Internet Banking functionality to customers via their web browser.\")\n    }\n}\n\nRel(mobile, api, \"Makes API calls to\", \"json/HTTPS\")\nRel(spa, api, \"Makes API calls to\", \"json/HTTPS\")\nRel_U(web, spa, \"Delivers to the customer's web browser\")\nRel(api, db, \"Reads from and writes to\", \"JDBC\")\nRel(api, db2, \"Reads from and writes to\", \"JDBC\", $tags=\"fallback\")\nRel_R(db, db2, \"Replicates data to\")\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/C4_Dynamic Diagram Sample - bigbankplc.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Dynamic.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Dynamic.puml\n!endif\n\nLAYOUT_WITH_LEGEND()\n\nContainerDb(c4, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\")\nContainer(c1, \"Single-Page Application\", \"JavaScript and Angular\", \"Provides all of the Internet banking functionality to customers via their web browser.\")\nContainer_Boundary(b, \"API Application\") {\n  Component(c3, \"Security Component\", \"Spring Bean\", \"Provides functionality Related to signing in, changing passwords, etc.\")\n  Component(c2, \"Sign In Controller\", \"Spring MVC Rest Controller\", \"Allows users to sign in to the Internet Banking System.\")\n}\nRel_R(c1, c2, \"Submits credentials to\", \"JSON/HTTPS\")\nRel(c2, c3, \"Calls isAuthenticated() on\")\nRel_R(c3, c4, \"select * from users where username = ?\", \"JDBC\")\n@enduml\n"
  },
  {
    "path": "percy/C4_Sequence Diagram Sample - bigbankplc.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Sequence.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Sequence.puml\n!endif\n\nContainer(c1, \"Single-Page Application\", \"JavaScript and Angular\", \"Provides all of the Internet banking functionality to customers via their web browser.\")\nContainer_Boundary(b, \"API Application\")\n  Component(c2, \"Sign In Controller\", \"Spring MVC Rest Controller\", \"Allows users to sign in to the Internet Banking System.\")\n  Component(c3, \"Security Component\", \"Spring Bean\", \"Provides functionality Related to signing in, changing passwords, etc.\")\nBoundary_End()\n\nContainerDb(c4, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\")\n\nRel(c1, c2, \"Submits credentials to\", \"JSON/HTTPS\")\nRel(c2, c3, \"Calls isAuthenticated() on\")\nRel(c3, c4, \"select * from users where username = ?\", \"JDBC\")\n\nSHOW_LEGEND()\n@enduml"
  },
  {
    "path": "percy/TestAllAddTags.puml",
    "content": "@startuml \n\n' displays all elements, relationship and legend (can be included in the theme test)\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Deployment.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n!endif\n\nSetDefaultLegendEntries(\"person\\nsystem\\ncontainer\\ncomponent\\nexternal_person\\nexternal_system\\nexternal_container\\nexternal_component\\nnode\\nenterprise_boundary\\nsystem_boundary\\ncontainer_boundary\\nboundary\")\n\nAddElementTag(\"elementTag\", $bgColor=\"lightRed\", $fontColor=\"darkRed\", $borderColor=\"darkRed\", $shadowing=\"true\", $borderThickness=\"5\")\nAddRelTag(\"relTag\", $textColor=\"darkGreen\", $lineColor=\"darkGreen\", $lineThickness=\"5\")\nAddBoundaryTag(\"boundaryTag\", $borderColor=\"orange\", $borderThickness=\"3\")\nAddSystemTag(\"systemTag\", $borderColor=\"orange\", $borderThickness=\"3\")\nAddExternalSystemTag(\"exSystemTag\", $borderColor=\"brown\", $borderThickness=\"5\")\nAddPersonTag(\"personTag\", $borderColor=\"orange\", $borderThickness=\"3\")\nAddExternalPersonTag(\"exPersonTag\", $borderColor=\"brown\", $borderThickness=\"5\")\nAddContainerTag(\"containerTag\", $borderColor=\"orange\", $borderThickness=\"3\")\nAddExternalContainerTag(\"exContainerTag\", $borderColor=\"brown\", $borderThickness=\"5\")\nAddComponentTag(\"componentTag\", $borderColor=\"orange\", $borderThickness=\"3\")\nAddExternalComponentTag(\"exComponentTag\", $borderColor=\"brown\", $borderThickness=\"5\")\nAddNodeTag(\"nodeTag\", $borderColor=\"orange\", $borderThickness=\"3\")\n\nBoundary(b2, \"Boundary 2\", $tags=\"boundaryTag\") {\n  System(system, \"System\", \"Optional Description - elementTag\", $tags=\"elementTag\")\n  System_Ext(externalSystem, \"External System\", \"Optional Description\")\n  Rel_R(system, externalSystem, \"uses - relTag\", $tags=\"relTag\")\n\n  SystemDb(systemDb, \"SystemDb\", \"Optional Description - systemTag\", $tags=\"systemTag\")\n  SystemDb_Ext(externalSystemDb, \"External SystemDb\", \"Optional Description - exSystemTag\", $tags=\"exSystemTag\")\n}\n\nBoundary(b1, \"Boundary 1\") {\n  Person(person, \"Person\", \"Optional Description\")\n  Person(person2, \"Person 2\", \"Optional Description - personTag\", $tags=\"personTag\")\n  Person_Ext(externalPerson, \"External Person\", \"Optional Description\")\n  Person_Ext(externalPerson2, \"External Person 2\", \"Optional Description - exPersonTag\", $tags=\"exPersonTag\")\n  Rel_R(person, externalPerson, \"uses\")\n}\n\nBoundary(b3, \"Boundary 3\") {\n  Container(container, \"Container\", \"Technology\", \"Optional Description\",$tags=\"containerTag\")\n  Container_Ext(externalContainer, \"External Container\", \"Technology\", \"Optional Description\", $tags=\"exContainerTag\")\n  Rel_R(container, externalContainer, \"uses\")\n\n  ContainerDb(containerDb, \"ContainerDb\", \"Technology\", \"Optional Description\")\n  ContainerDb_Ext(externalContainerDb, \"External ContainerDb\", \"Technology\", \"Optional Description\")\n}\n\nBoundary(b4, \"Boundary 4\") {\n  Component(component, \"Component\", \"Technology\", \"Optional Description\", $tags=\"componentTag\")\n  Component_Ext(externalComponent, \"External Component\", \"Technology\", \"Optional Description\", $tags=\"exComponentTag\")\n  Rel_R(component, externalComponent, \"uses\")\n\n  ComponentDb(componentDb, \"ComponentDb\", \"Technology\", \"Optional Description\")\n  ComponentDb_Ext(externalComponentDb, \"External ComponentDb\", \"Technology\", \"Optional Description\")\n}\n\nBoundary(b5, \"Boundary 5\") {\n  Node(node, \"Node\", \"Type\", \"Optional Description\", $tags=\"nodeTag\")\n  Node(node2, \"Node2\", \"Type\", \"Optional Description\")\n}\n\nLay_D(b1,b2)\nLay_D(b2,b3)\nLay_D(b3,b4)\nLay_R(b4,b5)\n\nSHOW_FLOATING_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/TestAllElementsWithLegend.puml",
    "content": "@startuml \n\n' displays all elements, relationship and legend (can be included in the theme test)\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Deployment.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n!endif\n\nSetDefaultLegendEntries(\"person\\nsystem\\ncontainer\\ncomponent\\nexternal_person\\nexternal_system\\nexternal_container\\nexternal_component\\nnode\\nenterprise_boundary\\nsystem_boundary\\ncontainer_boundary\\nboundary\")\n\ntitle Overview of all elements, relationship and legend\n\nfooter theme $THEME drawn with PlantUML v. %version() and C4-PlantUML v. C4Version()\n\nBoundary(b2, \"Boundary 2\") {\n  System(system, \"System\", \"Optional Description\")\n  System_Ext(externalSystem, \"External System\", \"Optional Description\")\n  Rel_R(system, externalSystem, \"uses\")\n\n  SystemDb(systemDb, \"SystemDb\", \"Optional Description\")\n  SystemDb_Ext(externalSystemDb, \"External SystemDb\", \"Optional Description\")\n  SystemQueue(systemQueue, \"SystemQueue\", \"Optional Description\")\n  SystemQueue_Ext(externalSystemQueue, \"External SystemQueue\", \"Optional Description\")    \n}\n\nBoundary(b1, \"Boundary 1\") {\n  Person(person, \"Person\", \"Optional Description\")\n  Person_Ext(externalPerson, \"External Person\", \"Optional Description\")\n  Rel_R(person, externalPerson, \"uses\")\n}\n\nBoundary(b3, \"Boundary 3\") {\n  Container(container, \"Container\", \"Technology\", \"Optional Description\")\n  Container_Ext(externalContainer, \"External Container\", \"Technology\", \"Optional Description\")\n  Rel_R(container, externalContainer, \"uses\")\n\n  ContainerDb(containerDb, \"ContainerDb\", \"Technology\", \"Optional Description\")\n  ContainerDb_Ext(externalContainerDb, \"External ContainerDb\", \"Technology\", \"Optional Description\")\n  ContainerQueue(containerQueue, \"ContainerQueue\", \"Technology\", \"Optional Description\")\n  ContainerQueue_Ext(externalContainerQueue, \"External ContainerQueue\", \"Technology\", \"Optional Description\")\n}\n\nBoundary(b4, \"Boundary 4\") {\n  Component(component, \"Component\", \"Technology\", \"Optional Description\")\n  Component_Ext(externalComponent, \"External Component\", \"Technology\", \"Optional Description\")\n  Rel_R(component, externalComponent, \"uses\")\n\n  ComponentDb(componentDb, \"ComponentDb\", \"Technology\", \"Optional Description\")\n  ComponentDb_Ext(externalComponentDb, \"External ComponentDb\", \"Technology\", \"Optional Description\")\n  ComponentQueue(componentQueue, \"ComponentQueue\", \"Technology\", \"Optional Description\")\n  ComponentQueue_Ext(externalComponentQueue, \"External ComponentQueue\", \"Technology\", \"Optional Description\")\n}\n\nBoundary(b5, \"Boundary 5\") {\n  Node(node, \"Node\", \"Type\", \"Optional Description\")\n}\n\nBoundary(b6, \"Boundary 6\") {\n  Enterprise_Boundary(eb, \"Enterprise Boundary\") {\n  }\n\n  System_Boundary(sb, \"System Boundary\") {\n  }\n\n  Container_Boundary(cb, \"Container Boundary\") {\n  }\n\n  Lay_R(eb,sb)\n  Lay_R(sb,cb)\n}\n\nLay_D(b2,b3)\nLay_R(b2,b1)\nLay_D(b3,b4)\nLay_D(b4,b5)\nLay_R(b5,b6)\n\nSHOW_FLOATING_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/TestAllPlantUmlElements.puml",
    "content": "  @startuml\n\n' If ENABLE_ALL_PLANT_ELEMENTS is set BEFORE the first C4_* file is loaded,\n' nearly \"all\" PlantUML elements can be used like\n'   Component(StorageA, \"Storage A \", $baseShape=\"storage\")\n!ENABLE_ALL_PLANT_ELEMENTS = 1\n\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  ' percy runs (sometimes) with 1.2023.7\n  ' !theme C4_united from %get_variable_value(\"RELATIVE_INCLUDE\")/themes\n  !theme C4_united from ./../themes\n  ' !theme C4_green from ./../themes\n  !include ./../C4_Component.puml\n!else\n  !theme C4_united from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n  ' !theme C4_green from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\nLAYOUT_TOP_DOWN()\n\n' default is rectangle\nComponent(Component, \"Container\", \"\", \"A component\")\n' already supported: rectangle, database, queue\nComponent(rectangleComponent, \"Container rectangle\", \"rectangle\", \"A component with rectangle element\", $baseShape=\"rectangle\")\nComponent(databaseComponent, \"Container database\", \"database\", \"A component with database element\", $baseShape=\"database\")\nComponent(queueComponent, \"Container queue\", \"queue\", \"A component with queue element\", $baseShape=\"queue\")\n\n' already supported: rectangle, database, queue\n' already defined (via other):\n'   node has a different style (cannot changed automatically)\n' actor/ not working (font color not changed to $bkColor) - and/or conflict with existing?\n' label not working (font color not changed to $bkColor)\n\nComponent(actorComponent, \"Component actor\", \"actor\", \"A component with actor element\", $baseShape=\"actor\")\nComponent(actorBCComponent, \"Component actor/\", \"actor/\", \"A component with actor/ element\", $baseShape=\"actor/\")\nComponent(agentComponent, \"Component agent\", \"agent\", \"A component with agent element\", $baseShape=\"agent\")\nComponent(artifactComponent, \"Component artifact\", \"artifact\", \"A component with artifact element\", $baseShape=\"artifact\")\nComponent(boundaryComponent, \"Component boundary\", \"boundary\", \"A component with boundary element\", $baseShape=\"boundary\") \nComponent(cardComponent, \"Component card\", \"card\", \"A component with card element\", $baseShape=\"card\")\nComponent(circleComponent, \"Component circle\", \"circle\", \"A component with circle element\", $baseShape=\"circle\")\nComponent(cloudComponent, \"Component cloud\", \"cloud\", \"A component with cloud element\", $baseShape=\"cloud\")\nComponent(collectionsComponent, \"Component collections\", \"collections\", \"A component with collections element\", $baseShape=\"collections\")\nComponent(controlComponent, \"Component control\", \"control\", \"A component with control element\", $baseShape=\"control\")\nComponent(entityComponent, \"Component entity\", \"entity\", \"A component with entity element\", $baseShape=\"entity\")\nComponent(fileComponent, \"Component file\", \"file\", \"A component with file element\", $baseShape=\"file\")\nComponent(folderComponent, \"Component folder\", \"folder\", \"A component with folder element\", $baseShape=\"folder\")\nComponent(frameComponent, \"Component frame\", \"frame\", \"A component with frame element\", $baseShape=\"frame\")\nComponent(hexagonComponent, \"Component hexagon\", \"hexagon\", \"A component with hexagon element\", $baseShape=\"hexagon\")\nComponent(interfaceComponent, \"Component interface\", \"interface\", \"A component with interface element\", $baseShape=\"interface\")\nComponent(labelComponent, \"Component label\", \"label\", \"A component with label element\", $baseShape=\"label\")\nComponent(nodeComponent, \"Component node\", \"node\", \"A component with node element\", $baseShape=\"node\")\nComponent(packageComponent, \"Component package\", \"package\", \"A component with package element\", $baseShape=\"package\")\nComponent(personComponent, \"Component person\", \"person\", \"A component with person element\", $baseShape=\"person\")\nComponent(stackComponent, \"Component stack\", \"stack\", \"A component with stack element\", $baseShape=\"stack\")\nComponent(storageComponent, \"Component storage\", \"storage\", \"A component with storage element\", $baseShape=\"storage\")\nComponent(usecaseComponent, \"Component usecase\", \"usecase\", \"A component with usecase element\", $baseShape=\"usecase\")\nComponent(usecaseBCComponent, \"Component usecase/\", \"usecase/\", \"A component with usecase/ element\", $baseShape=\"usecase/\")\n\nContainer(actorContainer, \"Container actor\", \"actor\", \"A Container with actor element\", $baseShape=\"actor\")\nContainer(actorBCContainer, \"Container actor/\", \"actor/\", \"A Container with actor/ element\", $baseShape=\"actor/\")\nContainer(agentContainer, \"Container agent\", \"agent\", \"A Container with agent element\", $baseShape=\"agent\")\nContainer(artifactContainer, \"Container artifact\", \"artifact\", \"A Container with artifact element\", $baseShape=\"artifact\")\nContainer(boundaryContainer, \"Container boundary\", \"boundary\", \"A Container with boundary element\", $baseShape=\"boundary\")\nContainer(cardContainer, \"Container card\", \"card\", \"A Container with card element\", $baseShape=\"card\")\nContainer(circleContainer, \"Container circle\", \"circle\", \"A Container with circle element\", $baseShape=\"circle\")\nContainer(cloudContainer, \"Container cloud\", \"cloud\", \"A Container with cloud element\", $baseShape=\"cloud\")\nContainer(collectionsContainer, \"Container collections\", \"collections\", \"A Container with collections element\", $baseShape=\"collections\")\nContainer(controlContainer, \"Container control\", \"control\", \"A Container with control element\", $baseShape=\"control\")\nContainer(entityContainer, \"Container entity\", \"entity\", \"A Container with entity element\", $baseShape=\"entity\")\nContainer(fileContainer, \"Container file\", \"file\", \"A Container with file element\", $baseShape=\"file\")\nContainer(folderContainer, \"Container folder\", \"folder\", \"A Container with folder element\", $baseShape=\"folder\")\nContainer(frameContainer, \"Container frame\", \"frame\", \"A Container with frame element\", $baseShape=\"frame\")\nContainer(hexagonContainer, \"Container hexagon\", \"hexagon\", \"A Container with hexagon element\", $baseShape=\"hexagon\")\nContainer(interfaceContainer, \"Container interface\", \"interface\", \"A Container with interface element\", $baseShape=\"interface\")\nContainer(labelContainer, \"Container label\", \"label\", \"A Container with label element\", $baseShape=\"label\")\nContainer(nodeContainer, \"Container node\", \"node\", \"A Container with node element\", $baseShape=\"node\")\nContainer(packageContainer, \"Container package\", \"package\", \"A Container with package element\", $baseShape=\"package\")\nContainer(personContainer, \"Container person\", \"person\", \"A Container with person element\", $baseShape=\"person\")\nContainer(stackContainer, \"Container stack\", \"stack\", \"A Container with stack element\", $baseShape=\"stack\")\nContainer(storageContainer, \"Container storage\", \"storage\", \"A Container with storage element\", $baseShape=\"storage\")\nContainer(usecaseContainer, \"Container usecase\", \"usecase\", \"A Container with usecase element\", $baseShape=\"usecase\")\nContainer(usecaseBCContainer, \"Container usecase/\", \"usecase/\", \"A Container with usecase/ element\", $baseShape=\"usecase/\")\n\nSystem(actorSystem, \"System actor\", $type=\"actor\", \"A System with actor element\", $baseShape=\"actor\")\nSystem(actorBCSystem, \"System actor/\", $type=\"actor/\", \"A System with actor/ element\", $baseShape=\"actor/\")\nSystem(agentSystem, \"System agent\", $type=\"agent\", \"A System with agent element\", $baseShape=\"agent\")\nSystem(artifactSystem, \"System artifact\", $type=\"artifact\", \"A System with artifact element\", $baseShape=\"artifact\")\nSystem(boundarySystem, \"System boundary\", $type=\"boundary\", \"A System with boundary element\", $baseShape=\"boundary\")\nSystem(cardSystem, \"System card\", $type=\"card\", \"A System with card element\", $baseShape=\"card\")\nSystem(circleSystem, \"System circle\", $type=\"circle\", \"A System with circle element\", $baseShape=\"circle\")\nSystem(cloudSystem, \"System cloud\", $type=\"cloud\", \"A System with cloud element\", $baseShape=\"cloud\")\nSystem(collectionsSystem, \"System collections\", $type=\"collections\", \"A System with collections element\", $baseShape=\"collections\")\nSystem(controlSystem, \"System control\", $type=\"control\", \"A System with control element\", $baseShape=\"control\")\nSystem(entitySystem, \"System entity\", $type=\"entity\", \"A System with entity element\", $baseShape=\"entity\")\nSystem(fileSystem, \"System file\", $type=\"file\", \"A System with file element\", $baseShape=\"file\")\nSystem(folderSystem, \"System folder\", $type=\"folder\", \"A System with folder element\", $baseShape=\"folder\")\nSystem(frameSystem, \"System frame\", $type=\"frame\", \"A System with frame element\", $baseShape=\"frame\")\nSystem(hexagonSystem, \"System hexagon\", $type=\"hexagon\", \"A System with hexagon element\", $baseShape=\"hexagon\")\nSystem(interfaceSystem, \"System interface\", $type=\"interface\", \"A System with interface element\", $baseShape=\"interface\")\nSystem(labelSystem, \"System label\", $type=\"label\", \"A System with label element\", $baseShape=\"label\")\nSystem(nodeSystem, \"System node\", $type=\"node\", \"A System with node element\", $baseShape=\"node\")\nSystem(packageSystem, \"System package\", $type=\"package\", \"A System with package element\", $baseShape=\"package\")\nSystem(personSystem, \"System person\", $type=\"person\", \"A System with person element\", $baseShape=\"person\")\nSystem(stackSystem, \"System stack\", $type=\"stack\", \"A System with stack element\", $baseShape=\"stack\")\nSystem(storageSystem, \"System storage\", $type=\"storage\", \"A System with storage element\", $baseShape=\"storage\")\nSystem(usecaseSystem, \"System usecase\", $type=\"usecase\", \"A System with usecase element\", $baseShape=\"usecase\")\nSystem(usecaseBCSystem, \"System usecase/\", $type=\"usecase/\", \"A System with usecase/ element\", $baseShape=\"usecase/\")\n\nSHOW_LEGEND(false)\n@enduml"
  },
  {
    "path": "percy/TestBoundaryTagSupport.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\nUpdateBoundaryStyle($bgColor=\"gold\", $fontColor=\"brown\", $borderColor=\"brown\", $sprite=\"person\", $legendSprite=\"person2,scale=0.3\")\n' re-set $bgColor avoids '(no back color)' in legend\nUpdateSystemBoundaryStyle($bgColor=\"gold\", $fontColor=\"white\", $borderColor=\"white\", $sprite=robot, $legendSprite=\"robot2,scale=0.3\")\n\nAddElementTag(\"special\", $sprite=\"person\", $legendSprite=\"person,scale=0.3\")\n\nAddBoundaryTag(\"specialSystem\", $bgColor=\"green\", $fontColor=\"white\", $borderColor=\"blue\", $shadowing=\"true\", $shape = RoundedBoxShape(), $type=\"A SPECIAL SYSTEM BOUNDARY\", $sprite=\"robot,scale=0.5,color=black\", $legendSprite=\"robot2,scale=0.3,color=black\")\nAddBoundaryTag(\"existingContainersBoundary\", $bgColor=\"red\", $fontColor=\"white\", $borderColor=\"white\", $type=\"Existing CONTAINER BOUNDARY\", $legendText=\"container boundary with existing components\", $sprite=\"robot\")\n\nSystem_Boundary(sb, \"A System Boundary\") {\n}\n\nSystem_Boundary(sb1, \"Special System 1 Boundary\", $tags=\"specialSystem\", $descr=\"A long description ... A long description ... A long description ... A long description\") {\n  Container_Boundary(cb1, \"Container Boundary\\nwith tag\", $tags=\"existingContainersBoundary\", $descr=\"A long description ... A long description ... A long description ... A long description\") {\n    Component(e1, \"existing 1\", \"xyz\", $tags=\"special\")\n    Component(e2, \"existing 2\", \"xyz\")\n  }\n  Container_Boundary(cb2, \"A Container Boundary\") {\n    Component(c2, \"Component\", \"xyz\")\n  }\n}\n\nSystem_Boundary(sb2, \"Special System 2 Boundary\", $tags=\"specialSystem\") { \n}\n\n' boundary tags are internally extended with '_boundary' that it uses a different name space\n' this enables different element and boundary styles for the same tag name\nAddBoundaryTag(\"v1\", $bgColor=\"lightgreen\", $fontColor=\"green\", $borderColor=\"green\")\nAddElementTag(\"v1\", $bgColor=\"lightred\", $fontColor=\"red\", $borderColor=\"red\")\n\nBoundary(anotherBoundary, \"Another Boundary\", $type=\"BOUNDARY TYPE\", $tags=\"v1\") {\n  Component(anotherComponent, \"Another Component\", $techn=\"COMPONENT TYPE\", $tags=\"v1\", $descr=\"Component and boundary use different tag name spaces that both v1 tags can use different styles\")\n}\n\nBoundary(aBoundary, \"A Boundary\", $descr=\"A long description\\nwith concrete line breaks\\nNew line\\nNewLine\") {\n}\n\nLay_R(sb, sb1)\nLay_R(sb1, sb2)\nLay_R(sb2, anotherBoundary)\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/TestEmptyLabel.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\nLAYOUT_TOP_DOWN()\n\n!$img=\"img:https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Test-Logo.svg/80px-Test-Logo.svg.png\"\n!$imgSmall=\"img:https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Test-Logo.svg/20px-Test-Logo.svg.png\"\n\n' SHOW_PERSON_OUTLINE()\nSHOW_PERSON_PORTRAIT()\n\nBoundary(b, \"Persons\") {\n  Person(p, \"Label\", \"Optional Description\", $sprite=$img)\n  Person(p1, \"\", \"Optional Description\", $sprite=$img)\n  Person(p2, \"\", $sprite=$img)\n  Person(p3, \" \", $sprite=$img)\n  ' should not be used (alias is not automatically reused, only empty block is displayed)\n  Person(p4, \"\")\n\n  Lay_R(p,p1)\n  Lay_R(p1,p2)\n  Lay_R(p2,p3)\n  Lay_R(p3,p4)\n}\n\nBoundary(b1, \"Systems\") {\n  System(s, \"Label\", \"Optional Description\", $sprite=$img)\n  System(s1, \"\", \"Optional Description\", $sprite=$img)\n  System(s2, \"\", $sprite=$img)\n  System(s3, \" \", $sprite=$img)\n  ' should not be used (alias is not automatically reused, only empty block is displayed)\n  System(s4, \"\")\n\n  Lay_R(s,s1)\n  Lay_R(s1,s2)\n  Lay_R(s2,s3)\n  Lay_R(s3,s4)\n}\n\nBoundary(b2, \"Components\") {\n  Component(comp, \"Label\", \"Techn\", \"Optional Description\", $sprite=$img)\n  Component(comp1, \"\", \"Techn\", \"Optional Description\", $sprite=$img)\n  Component(comp2, \"\", $sprite=$img)\n  Component(comp3, \" \", $sprite=$img)\n  ' should not be used (alias is not automatically reused, only empty block is displayed)\n  Component(comp4, \"\")\n\n  Lay_R(comp,comp1)\n  Lay_R(comp1,comp2)\n  Lay_R(comp2,comp3)\n  Lay_R(comp3,comp4)\n}\n\nBoundary(b3, \"Containers\") {\n  Container(con, \"Label\", \"Techn\", \"Optional Description\", $sprite=$img)\n  Container(con1, \"\", \"Techn\", \"Optional Description\", $sprite=$img)\n  Container(con2, \"\", $sprite=$img)\n  Container(con3, \" \", $sprite=$img)\n  ' should not be used (alias is not automatically reused, only empty block is displayed)\n  Container(con4, \"\")\n\n  Lay_R(con,con1)\n  Lay_R(con1,con2)\n  Lay_R(con2,con3)\n  Lay_R(con3,con4)\n}\n\nBoundary(b4, \"Relationships\") {\n  System(A1,\"A1\")\n  System(B1,\"B1\")\n  System(C1,\"C1\")\n  System(D1,\"D1\")\n  System(E1,\"E1\")\n\n  System(A2,\"A2\")\n  System(B2,\"B2\")\n  System(C2,\"C2\")\n  System(D2,\"D2\")\n  System(E2,\"E2\")\n\n  Lay_D(A1,A2)\n\n  Rel_R(E1, A1, \"label\", $sprite=$imgSmall, $link=\"https://github.com/plantuml-stdlib/C4-PlantUML\")\n  Rel_R(A1, B1, \"\", $sprite=$imgSmall, $link=\"https://github.com/plantuml-stdlib/C4-PlantUML\")\n  Rel_R(B1, C1, \" \", $sprite=$imgSmall, $link=\"https://github.com/plantuml-stdlib/C4-PlantUML\")\n  Rel_R(C1, D1, \"\", $link=\"https://github.com/plantuml-stdlib/C4-PlantUML\")\n\n  Rel_R(E2, A2, \"label\", $sprite=$imgSmall)\n  Rel_R(A2, B2, \"\", $sprite=$imgSmall)\n  Rel_R(B2, C2, \" \", $sprite=$imgSmall)\n  Rel_R(C2, D2, \"\")\n}\n\nLay_D(b,b1)\nLay_D(b1,b2)\nLay_D(b2,b3)\nLay_D(b3,b4)\n\nSHOW_LEGEND()\n@enduml"
  },
  {
    "path": "percy/TestFloatingLegend.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\nPerson(a, \"Person A\")\nContainer(b, \"Container B\", \"techn\")\nSystem(c, \"System C\")\nContainer(d, \"Container D\", \"techn\")\nContainer_Ext(e, \"Ext. Container E\", \"techn\")\n\nRel_R(a, b, \"calls\")\nRel_D(b, c, \"uses\")\nRel_D(c, d, \"uses\")\nRel_R(d, e, \"updates\")\n\nSHOW_FLOATING_LEGEND()\nLay_Distance(LEGEND(), e, 1)\n@enduml\n"
  },
  {
    "path": "percy/TestLabelsWithLineBreak.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Deployment.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n!endif\n\nEnterprise_Boundary(eb, \"Enterprise\\nBoundary\") {\n  Person(p1, \"Normal\\nUser\\nLabel\", \"Description\\nLine\\nBreak\")\n  Container(c1, \"Container\\nLabel\", \"container techn\\nwith line break\", \"Description\\nLine\\nBreak\")\n  Component(c2, \"Component\\nLabel\", component techn\\nwith line break\", \"Description\\nLine\\nBreak\")\n}\n\nSystem_Ext(s1, \"System Label\\nWith\\nLineBreak\", \"Description\\nLine\\nBreak\")\n\nRel_(p1, c1, \"A relation\\nwith custom direction\", \"o-DOWN->>\")\nRel_(p1, c2, \"A relation\\nwith custom direction\", \"and technology\\nwith LBs\", \"o-RIGHT-o\")\n\nRel(c1, c2, \"A label\\nwith\\nline breaks\", \"and technology\\nwith LBs\")\nRel(c1, s1, \"A linked label\\nwith\\nline breaks\", \"and technology\\nwith LBs\", $link = \"https://www.plantuml.com\")\n\nNode(n1, \"A node label\\nwith\\nline breaks\", \"type with\\nline break\", \"description\\nwith line break\")\nNode(n2, \"A node label\", \"PlantUML packages have no automatic line breaks, type breaks added\", \"PlantUML packages have no automatic line breaks, description breaks added\") {\n  Container(cInNode, \"A container in node\")\n}\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Dynamic.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Dynamic.puml\n!endif\n\nComponent(from, \"From component\")\nComponent(to, \"To component\")\n\nRel_(\"pre1\", from, to, \"A custom dynamic relation\\nwith custom direction\", \"o-DOWN->>\")\nRel_(\"pre2\", from, to, \"A custom dynamic relation\\nwith custom direction\", \"and technology\\nwith LBs\", \"+--+\")\nRel(from, to, \"A dynamic relation\\nwith line break\")\n@enduml\n"
  },
  {
    "path": "percy/TestLayDirections.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\nHIDE_STEREOTYPE()\n\nPerson(a, \"A\")\nPerson(a1, \"P1\")\nPerson(a2, \"P2\")\nPerson(a3, \"P3\")\nPerson(a4, \"P4\")\n\nLay_U(a, a1)\nLay_R(a, a2)\nLay_D(a, a3)\nLay_L(a, a4)\n\nPerson(x, \"X\")\nSystem(s1, \"S1\")\nSystem(s2, \"S2\")\nSystem(s3, \"S3\")\nSystem(s4, \"S4\")\n\nLay_Up(x, s1)\nLay_Right(x, s2)\nLay_Down(x, s3)\nLay_Left(x, s4)\n@enduml\n"
  },
  {
    "path": "percy/TestLayoutLandscape.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\nLAYOUT_LANDSCAPE()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSystem(S,\"S\")\nSystem(SU,\"S Up\")\nSystem(SD,\"S Down\")\nSystem(SL,\"S Left\")\nSystem(SR,\"S Right\")\n\nRel_Up(S, SU, \"Up\")\nRel_Down(S, SD, \"Down\")\nRel_Left(S, SL, \"Left\")\nRel_Right(S, SR, \"Right\")\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/TestLayoutLandscapeDynamic.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Dynamic.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Dynamic.puml\n!endif\n\nLAYOUT_LANDSCAPE()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSystem(S,\"S\")\nSystem(SU,\"S Up\")\nSystem(SD,\"S Down\")\nSystem(SL,\"S Left\")\nSystem(SR,\"S Right\")\n\nRel_Up(S, SU, \"Up\")\nRel_Down(S, SD, \"Down\")\nRel_Left(S, SL, \"Left\")\nRel_Right(S, SR, \"Right\")\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/TestLayoutLandscapeWithLay.puml",
    "content": "@startuml\n\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  ' !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n  !include https://raw.githubusercontent.com/kirchsth/C4-PlantUML/extended/C4_Container.puml\n!endif\n\nLAYOUT_LANDSCAPE()\n\n' C4-PlantUML v2.12 fixed a missing rotation bug in Lay_* calls in combination with LAYOUT_LANDSCAPE call\n' (details see https://github.com/plantuml-stdlib/C4-PlantUML/issues/376)\n' If older diagrams should remain unchanged the bugfix can be deactivated with following statement\n'     !NO_LAY_ROTATE = 1\n' Or if the conversion is started via command line with following argument\n'     -NO_LAY_ROTATE=1\n' like\n'    java -jar plantuml.jar -NO_LAY_ROTATE=1 ...\n\n'!NO_LAY_ROTATE = 1\n\nPerson(x, \"X\")\nSystem(sUp, \"S up\")\nSystem(sRight, \"S right\")\nSystem(sDown, \"S down\")\nSystem(sLeft, \"S left\")\n\nRel_U(x, sUp, \"uses\")\nRel_R(x, sRight, \"uses\")\nRel_D(x, sDown, \"uses\")\nRel_L(x, sLeft, \"uses\")\n\nPerson(a, \"A\")\nPerson(bUp, \"B up\")\nPerson(cRight, \"C right\")\nPerson(dDown, \"D down\")\nPerson(eLeft, \"E left\")\n\nLay_U(a, bUp)\nLay_R(a, cRight)\nLay_D(a, dDown)\nLay_L(a, eLeft)\n\nHIDE_STEREOTYPE()\n@enduml\n"
  },
  {
    "path": "percy/TestLayoutLandscapeWithLayNoRotate.puml",
    "content": "@startuml\n\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  ' !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n  !include https://raw.githubusercontent.com/kirchsth/C4-PlantUML/extended/C4_Container.puml\n!endif\n\nLAYOUT_LANDSCAPE()\n\n' C4-PlantUML v2.12 fixed a missing rotation bug in Lay_* calls in combination with LAYOUT_LANDSCAPE call\n' (details see https://github.com/plantuml-stdlib/C4-PlantUML/issues/376)\n' If older diagrams should remain unchanged the bugfix can be deactivated with following statement\n'     !NO_LAY_ROTATE = 1\n' Or if the conversion is started via command line with following argument\n'     -NO_LAY_ROTATE=1\n' like\n'    java -jar plantuml.jar -NO_LAY_ROTATE=1 ...\n\n!NO_LAY_ROTATE = 1\n\nPerson(x, \"X\")\nSystem(sUp, \"S up\")\nSystem(sRight, \"S right\")\nSystem(sDown, \"S down\")\nSystem(sLeft, \"S left\")\n\nRel_U(x, sUp, \"uses\")\nRel_R(x, sRight, \"uses\")\nRel_D(x, sDown, \"uses\")\nRel_L(x, sLeft, \"uses\")\n\nPerson(a, \"A\")\nPerson(bUp, \"B up\")\nPerson(cRight, \"C right\")\nPerson(dDown, \"D down\")\nPerson(eLeft, \"E left\")\n\nLay_U(a, bUp)\nLay_R(a, cRight)\nLay_D(a, dDown)\nLay_L(a, eLeft)\n\nHIDE_STEREOTYPE()\n@enduml\n"
  },
  {
    "path": "percy/TestLegend.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\n' person legend displays the correct sprite\nSHOW_PERSON_SPRITE(person2)\nUpdateElementStyle(\"person\", $legendText=\"Person with correct legend\")\n' missing definitions are reused from last UpdateElementStyle() in legends too\nUpdateElementStyle(\"person\")\n\nUpdateElementStyle(\"system\", $bgColor=\"chocolate\", $fontColor=\"orange\", $borderColor=\"orange\", $shadowing=\"true\", $shape=RoundedBoxShape(), $sprite=\"person\", $techn=\"my tech\", $legendSprite=\"person2,scale=0.25\")\n' missing definitions are reused from last UpdateElementStyle() in legends too\nUpdateElementStyle(\"system\")\n\nUpdateRelStyle(black, black)\n\nAddElementTag(\"role1\", $bgColor=\"green\", $fontColor=\"white\", $borderColor=\"#d73027\", $shadowing=\"false\")\nAddElementTag(\"role2\", $fontColor=\"#d73027\", $shadowing=\"true\")\nAddElementTag(\"role3\", $bgColor=\"orange\")\nAddElementTag(\"role4\", $borderColor=\"blue\")\nAddElementTag(\"unusedRole\")\n\nAddSystemTag(\"micro_service\", $shape=EightSidedShape())\nAddElementTag(\"storage\", $shadowing=\"true\", $shape=RoundedBoxShape())\n\nAddRelTag(\"line1\", $lineColor=\"green\", $textColor=\"blue\")\nAddRelTag(\"line2\", $lineColor=\"blue\", $textColor=\"green\")\nAddRelTag(\"line3\", $textColor=\"orange\")\nAddRelTag(\"line4\", $lineColor=\"orange\")\n' outdated: PlantUML cannot combine line styles, a combination has to be added as workaround as first additional tag\n' fixed in meantime\nAddRelTag(\"line3&line4\", $lineColor=\"orange\", $textColor=\"orange\")\nAddRelTag(\"unusedLine\", $lineColor=\"red\", $textColor=\"red\")\n\nSystem(system, \"System\")\n\nPerson(person, \"Person\")\nPerson(person1, \"Person1\", $tags=\"role1\")\nPerson(person2, \"Person2\", $tags=\"role2\")\nPerson(person21, \"Person21\", $tags=\"role2+role1\")\nPerson(person321, \"Person321\", $tags=\"role3+role2+role1\")\nPerson(person4321, \"Person43\", $tags=\"role4+role3\")\nPerson(person31, \"Person31\", $tags=\"role3+role1\")\nPerson(person13, \"Person13\", $tags=\"role1+role3\")\n\nPerson(allInOne, \"AllInOne\", $tags=\"role4+role3+role2+role1\")\n\nComponent(component, \"Component 1\", \"PlantUML\")\nSystem(system1A, \"System 1A\", $tags=\"micro_service\")\nSystem(system2, \"System 2\", $tags = \"storage\")\n\nRel(allInOne, component, \"without a tag\")\nRel(allInOne, component, \"uses line 1\", $tags=\"line1\")\nRel(allInOne, component, \"uses line 2\", $tags=\"line2\")\nRel(allInOne, system1A, \"uses line 3\", $tags=\"line3\")\nRel(allInOne, system1A, \"uses line 4\", $tags=\"line4\")\nRel(allInOne, system2, \"line 3+4 (merge fixed in meantime)\", $tags=\"line3+line4\")\nRel(allInOne, system2, \"line 3+4 with workaround (obsolete in meantime)\", $tags=\"line3&line4+line3+line4\")\n\nSHOW_LEGEND(false)\n@enduml\n"
  },
  {
    "path": "percy/TestLegendDetailsNone.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n' $legendText with \\n defines the label and details of the legend entry (\"backend container\" is label, \"eight sided shape\" is details) \nAddElementTag(\"backendContainer\", $fontColor=$ELEMENT_FONT_COLOR, $bgColor=\"#335DA5\", $shape=EightSidedShape(), $legendText=\"backend container\\neight sided shape\")\n' $legendText without \\n defines only a label \nAddRelTag(\"async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DashedLine(), $legendText=\"async call\")\n' if no $legendText defined, $tag is automatically the label and all additional displayed properties are the details\nAddRelTag(\"sync/async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DottedLine())\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\", $tags=\"backendContainer\")\n}\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\", $tags=\"async\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\", $tags=\"sync/async\")\n\nSHOW_LEGEND($details=None())\n@enduml"
  },
  {
    "path": "percy/TestLegendDetailsNormal.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n' $legendText with \\n defines the label and details of the legend entry (\"backend container\" is label, \"eight sided shape\" is details) \nAddElementTag(\"backendContainer\", $fontColor=$ELEMENT_FONT_COLOR, $bgColor=\"#335DA5\", $shape=EightSidedShape(), $legendText=\"backend container\\neight sided shape\")\n' $legendText without \\n defines only a label \nAddRelTag(\"async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DashedLine(), $legendText=\"async call\")\n' if no $legendText defined, $tag is automatically the label and all additional displayed properties are the details\nAddRelTag(\"sync/async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DottedLine())\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\", $tags=\"backendContainer\")\n}\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\", $tags=\"async\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\", $tags=\"sync/async\")\n\nSHOW_LEGEND($details=Normal())\n@enduml"
  },
  {
    "path": "percy/TestLegendDetailsSmall.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n' $legendText with \\n defines the label and details of the legend entry (\"backend container\" is label, \"eight sided shape\" is details) \nAddElementTag(\"backendContainer\", $fontColor=$ELEMENT_FONT_COLOR, $bgColor=\"#335DA5\", $shape=EightSidedShape(), $legendText=\"backend container\\neight sided shape\")\n' $legendText without \\n defines only a label \nAddRelTag(\"async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DashedLine(), $legendText=\"async call\")\n' if no $legendText defined, $tag is automatically the label and all additional displayed properties are the details\nAddRelTag(\"sync/async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DottedLine())\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\", $tags=\"backendContainer\")\n}\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\", $tags=\"async\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\", $tags=\"sync/async\")\n\nSHOW_LEGEND($details=Small())\n@enduml"
  },
  {
    "path": "percy/TestLegendHidden.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\nAddElementTag(\"shapeRound\", $shape=$ROUNDED_BOX)\nAddElementTag(\"shapeOct\", $shape=$EIGHT_SIDED)\nAddElementTag(\"shadowed\", $shadowing=true)\nAddElementTag(\"shadowed2\", $shadowing=false)\nAddElementTag(\"yellowTagged\", $fontColor=yellow, $borderColor=yellow)\nAddElementTag(\"greenTagged\", $borderColor=green, $bgColor=green)\nAddElementTag(\"taggedContainer\", $fontColor=white, $bgColor=$CONTAINER_BG_COLOR, $borderColor=$CONTAINER_BORDER_COLOR)\nAddElementTag(\"taggedPerson\", $fontColor=white, $bgColor=$PERSON_BG_COLOR, $borderColor=$PERSON_BORDER_COLOR)\n\nContainer(c2, Container 2, tech, $tags=\"taggedContainer\", \"'taggedContainer' stereotype/tag overwrites all styles of container ($fontColor, $bgColor and $borderColor) the container is not important anymore and therefore not displayed in legend\")\nPerson(p2, p2, $tags=\"taggedPerson\", \"produces no person legend entry too\")\n\nPerson(p4, p4, $tags=\"yellowTagged\", \"'yellowTagged' stereotype/tag first and defines $fontColor and $borderColor (in legend), 'person' defines additional $bgColor (in legend too)\")\n\nComponent(comp3, comp3, \"techn\", $tags=\"yellowTagged+greenTagged+shapeRound+shapeOct+shadowed+shadowed2\", \"Complex sample with all styles\")\n\nSHOW_LEGEND(false)\n@enduml\n"
  },
  {
    "path": "percy/TestLegendSprite.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\n!define osaPuml https://raw.githubusercontent.com/Crashedmind/PlantUML-opensecurityarchitecture2-icons/master\n!include osaPuml/Common.puml\n!include osaPuml/User/all.puml\n!include osaPuml/Server/all.puml\n\n!include <office/Servers/database_server>\n!include <office/Servers/file_server>\n!include <office/Servers/application_server>\n!include <office/Concepts/service_application>\n!include <office/Concepts/firewall>\n\nAddExternalPersonTag(\"anonymous_ext\", $sprite=\"osa_user_black_hat\", $legendText=\"anonymous user\")\nAddPersonTag(\"customer\", $sprite=\"osa_user_large_group\", $legendText=\"aggregated user\")\nAddPersonTag(\"admin\", $sprite=\"osa_user_audit,color=red\", $legendSprite=\"osa_user_audit,scale=0.25,color=red\", $legendText=\"administration user\")\n\nAddContainerTag(\"webApp\", $sprite=\"application_server\", $legendText=\"web application\")\n\nAddContainerTag(\"mysql_db\", $sprite=\"database_server\", $techn=\"MySQL 5.5.x\", $legendText=\"MySQL database container\")\nAddContainerTag(\"mongo_db\", $sprite=\"database_server\", $techn=\"MongoDB 2.2.x\", $legendText=\"MongoDb database container\")\nAddContainerTag(\"files\", $sprite=\"file_server\", $legendText=\"file server container\")\n\nAddContainerTag(\"conApp\", $sprite=\"img:https://plantuml.com/logo3.png{scale=0.3}\", $legendSprite=\"img:https://plantuml.com/logo3.png{scale=0.1}\", $legendText=\"console application\")\n\nUpdateElementStyle(\"external_system\", $bgColor=$EXTERNAL_SYSTEM_BG_COLOR, $fontColor=$EXTERNAL_SYSTEM_FONT_COLOR, $borderColor=$EXTERNAL_SYSTEM_BORDER_COLOR, $sprite = \"osa_server\", , $legendText=\"external system\")\n\nAddRelTag(\"firewall\", $textColor=\"$ARROW_FONT_COLOR\", $lineColor=\"$ARROW_COLOR\", $sprite=\"&envelope-closed\", $techn=\"HTTPS\", $legendText=\"firewall\")\nAddRelTag(\"plantuml\", $textColor=\"$ARROW_FONT_COLOR\", $lineColor=\"$ARROW_COLOR\", $sprite=\"img:https://plantuml.com/logo3.png{scale=0.1}\", $legendText=\"console triggered\")\n\nPerson_Ext(anonymous_user, \"Bob\", $tags=\"anonymous_ext\")\nPerson(aggregated_user, \"Sam, Ivone\", $tags=\"customer\")\nPerson(administration_user, \"Bernd\", $tags=\"admin\")\n\nSystem_Boundary(c1, \"techtribes.js\"){\n    Container(web_app, \"Web Application\", \"Java, Spring MVC, Tomcat 7.x\", \"Allows users to view people, tribes, content, events, jobs, etc. from the local tech, digital and IT sector\", $tags=\"webApp\")\n    ContainerDb(rel_db, \"Relational Database\", \"\", \"Stores people, tribes, tribe membership, talks, events, jobs, badges, GitHub repos, etc.\", $tags=\"mysql_db\")\n    Container(filesystem, \"File System\", \"FAT32\", \"Stores search indexes\", $tags=\"files\")\n    ContainerDb(nosql, \"NoSQL Data Store\", $descr = \"Stores from RSS/Atom feeds (blog posts) and tweets\", $tags=\"mongo_db\")\n    Container(updater, \"Updater\", \"Java 7 Console App\", \"Updates profiles, tweets, GitHub repos and content on a scheduled basis\", $tags=\"conApp\")\n}\n\nSystem_Ext(twitter, \"Twitter\")\nSystem_Ext(github, \"GitHub\")\nSystem_Ext(blogs, \"Blogs\")\n\nRel(anonymous_user, web_app, \"Uses\", $descr=\"description\", $tags=\"firewall\")\nRel(aggregated_user, web_app, \"Uses\", \"techn\", \"description\", $tags=\"firewall\")\nRel(administration_user, web_app, \"Uses\", \"\", \"description\", $tags=\"firewall\")\n\nRel(web_app, rel_db, \"Reads from and writes to\", \"SQL/JDBC, port 3306\")\nRel(web_app, filesystem, \"Reads from\")\nRel(web_app, nosql, \"Reads from\", \"MongoDB wire protocol, port 27017\")\n\nRel_U(updater, rel_db, \"Reads from and writes data to\", \"SQL/JDBC, port 3306\")\nRel_U(updater, filesystem, \"Writes to\")\nRel_U(updater, nosql, \"Reads from and writes to\", \"MongoDB wire protocol, port 27017\")\n\nRel(updater, twitter, \"Gets profile information and tweets from\", \"HTTPS\", $tags=\"plantuml\")\nRel(updater, github, \"Gets information about public code repositories from\", \"HTTPS\", $tags=\"plantuml\")\nRel(updater, blogs, \"Gets content using RSS and Atom feeds from\", \"HTTP\", $tags=\"plantuml\")\n\nLay_R(rel_db, filesystem)\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/TestLegendTitle.puml",
    "content": "@startuml\n\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\nUpdateLegendTitle(\"Updated legend title\")\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSHOW_LEGEND()\n@enduml"
  },
  {
    "path": "percy/TestNewStyle.puml",
    "content": "@startuml\n' activates new style. It has to be set before a theme or a C4_* file is included\n!NEW_C4_STYLE=1\n\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\nLAYOUT_LANDSCAPE()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSHOW_LEGEND()\n@enduml"
  },
  {
    "path": "percy/TestPersonOutline.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Deployment.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n!endif\n\n!$COLOR_A_5 = \"#7f3b08\"\n!$COLOR_A_1 = \"#fee0b6\"\n!$COLOR_NEUTRAL = \"#f7f7f7\"\nUpdateElementStyle(\"person\", $bgColor=$COLOR_A_5, $fontColor=$COLOR_NEUTRAL, $borderColor=$COLOR_A_1, $shadowing=\"true\")\n\nSHOW_PERSON_OUTLINE()\n\n' default header Property, Value\nPerson(personAlias, \"Label\", \"Optional Description\")\nPerson(personAlias1, \"Simple\")\nPerson(personAlias2, \"Simple with sprite\", $sprite=\"person2\")\nAddProperty(\"Name\", \"Flash\")\nAddProperty(\"Organization\", \"Zootopia\")\nAddProperty(\"Tool\", \"Internet Explorer 7.0\")\nPerson_Ext(personAliasExt, \"Label Ext\", \"Optional Description (with default property header)\")\nPerson_Ext(personAliasExt1, \"Simple Ext\")\nPerson_Ext(personAliasExt2, \"Simple Ext with sprite\", $sprite=\"person2\")\n\nSHOW_LEGEND()\n@enduml"
  },
  {
    "path": "percy/TestPersonPortrait.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Deployment.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n!endif\n\n\n!$COLOR_A_5 = \"#7f3b08\"\n!$COLOR_A_1 = \"#fee0b6\"\n!$COLOR_NEUTRAL = \"#f7f7f7\"\nUpdateElementStyle(\"person\", $bgColor=$COLOR_A_5, $fontColor=$COLOR_NEUTRAL, $borderColor=$COLOR_A_1, $shadowing=\"true\")\n\nSHOW_PERSON_PORTRAIT()\n\n' default header Property, Value\nAddProperty(\"Name\", \"Flash\")\nAddProperty(\"Organization\", \"Zootopia\")\nAddProperty(\"Tool\", \"Internet Explorer 7.0\")\nPerson(personAlias, \"Label\", \"Optional Description (with default property header)\")\nPerson(personAlias1, \"Simple\")\nPerson(personAlias2, \"Simple with sprite\", $sprite=\"person2\")\nAddProperty(\"Name\", \"Flash\")\nAddProperty(\"Organization\", \"Zootopia\")\nAddProperty(\"Tool\", \"Internet Explorer 7.0\")\nPerson_Ext(personAliasExt, \"Label Ext\", \"Optional Description (with default property header)\")\nPerson_Ext(personAliasExt1, \"Simple Ext\")\nPerson_Ext(personAliasExt2, \"Simple Ext with sprite\", $sprite=\"person2\")\n\nSHOW_LEGEND()\n@enduml"
  },
  {
    "path": "percy/TestPredefinedSprites.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\nPerson(pB, \"Sam\", $sprite=\"person2\")\nPerson_Ext(pA, \"Bob\", $sprite=\"person\")\n\nSystem_Ext(robB, \"Robot A\", $sprite=\"robot2\")\nSystem_Ext(robA, \"Robot B\", $sprite=\"robot\")\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/TestProperty.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Deployment.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n!endif\n\n' default header Property, Value\nAddProperty(\"Name\", \"Flash\")\nAddProperty(\"Organization\", \"Zootopia\")\nAddProperty(\"Tool\", \"Internet Explorer 7.0\")\nPerson(personAlias, \"Label\", \"Optional Description (with default property header)\")\n\nSetPropertyHeader(\"Property\",\"Value\", \"Description\")\nAddProperty(\"Prop1\", \"Value1\", \"Details1\")\nAddProperty(\"Prop2\", \"Value2\", \"Details2\")\nDeployment_Node_L(nodeAlias, \"Label\", \"Optional Type\", \"Optional Description (with custom property header)\") {\n\n  WithoutPropertyHeader()\n  AddProperty(\"PropC1\", \"ValueC1\")\n  AddProperty(\"PropC2\", \"ValueC2\")\n  Container(containerAlias, \"Label\", \"Technology\", \"Optional Description (without property header)\")\n}\n\nSetPropertyHeader(\"Property\")\nAddProperty(\"Value1\")\nAddProperty(\"Value2\")\nSystem(systemAlias, \"Label\", \"Optional Description\\n(single column property)\")\n\n' starting with v.2.5.0 relationships support properties too\nWithoutPropertyHeader()\nAddProperty(\"PropC1\", \"ValueC1\")\nAddProperty(\"PropC2\", \"ValueC2\")\nRel(personAlias, containerAlias, \"Label\", \"Optional Technology\", \"Optional Description\")\n@enduml\n"
  },
  {
    "path": "percy/TestPropertyMissingColumns.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Deployment.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n!endif\n\n' missing columns 3 and 4 are added that all columns are displayed\nSetPropertyHeader(\"\", $col2Name=\"2\")\nAddProperty($col1=\"col1\")\nAddProperty(\"\", $col2=\"col2\")\nAddProperty(\" \", \" \", $col3=\"col3\")\n' missing columns 2 and 3 are inserted with empty values\nAddProperty(\"\", $col4=\"col4\")\n\nContainer(c, \"Container\")\n\n@enduml\n"
  },
  {
    "path": "percy/TestRelations.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\nSystem(RelFrom, RelFrom)\nSystem(BiRelFrom, BiRelFrom)\n\nSystem(RelShort, RelShort)\nSystem(BiRelShort, BiRelShort)\n\nSystem(RelLong, RelLong)\nSystem(BiRelLong, BiRelLong)\n\nRel_(RelFrom, To_Rel_UP, \"A label\", \"-UP->>\")\nRel_(RelFrom, To_Rel_DOWN, \"A label\", \"A techn\", \"-DOWN->>\")\n\nRel(RelFrom, \"To_Rel\", \"A label\")\nRel(RelFrom, \"To_Rel_Tech\", \"A label\", \"A techn\")\nRel_Back(RelFrom, \"To_Rel_Back\", \"A label\")\nRel_Back(RelFrom, \"To_Rel_Back_Tech\", \"A label\", \"A techn\")\nRel_Neighbor(RelFrom, \"To_Rel_Neighbor\", \"A label\")\nRel_Neighbor(RelFrom, \"To_Rel_Neighbor_Tech\", \"A label\", \"A techn\")\nRel_Back_Neighbor(RelFrom, \"To_Rel_Back_Neighbor\", \"A label\")\nRel_Back_Neighbor(RelFrom, \"To_Rel_Back_Neighbor_Tech\", \"A label\", \"A techn\")\n\nBiRel(BiRelFrom, \"To_BiRel\", \"A label\")\nBiRel(BiRelFrom, \"To_BiRel_Tech\", \"A label\", \"A techn\")\nBiRel_Neighbor(BiRelFrom, \"To_BiRel_Neighbor\", \"A label\")\nBiRel_Neighbor(BiRelFrom, \"To_BiRel_Neighbor_Tech\", \"A label\", \"A techn\")\n\nRel_D(RelShort, \"To_Rel_D\", \"A label\")\nRel_D(RelShort, \"To_Rel_D_Tech\", \"A label\", \"A techn\")\nRel_Down(RelLong, \"To_Rel_Down\", \"A label\")\nRel_Down(RelLong, \"To_Rel_Down_Tech\", \"A label\", \"A techn\")\nRel_L(RelShort, \"To_Rel_L\", \"A label\")\nRel_L(RelShort, \"To_Rel_L_Tech\", \"A label\", \"A techn\")\nRel_Left(RelLong, \"To_Rel_Left\", \"A label\")\nRel_Left(RelLong, \"To_Rel_Left_Tech\", \"A label\", \"A techn\")\nRel_R(RelShort, \"To_Rel_R\", \"A label\")\nRel_R(RelShort, \"To_Rel_R_Tech\", \"A label\", \"A techn\")\nRel_Right(RelLong, \"To_Rel_Right\", \"A label\")\nRel_Right(RelLong, \"To_Rel_Right_Tech\", \"A label\", \"A techn\")\nRel_U(RelShort, \"To_Rel_U\", \"A label\")\nRel_U(RelShort, \"To_Rel_U_Tech\", \"A label\", \"A techn\")\nRel_Up(RelLong, \"To_Rel_Up\", \"A label\")\nRel_Up(RelLong, \"To_Rel_Up_Tech\", \"A label\", \"A techn\")\n\nBiRel_D(BiRelShort, \"To_BiRel_D\", \"A label\")\nBiRel_D(BiRelShort, \"To_BiRel_D_Tech\", \"A label\", \"A techn\")\nBiRel_Down(BiRelLong, \"To_BiRel_Down\", \"A label\")\nBiRel_Down(BiRelLong, \"To_BiRel_Down_Tech\", \"A label\", \"A techn\")\nBiRel_L(BiRelShort, \"To_BiRel_L\", \"A label\")\nBiRel_L(BiRelShort, \"To_BiRel_L_Tech\", \"A label\", \"A techn\")\nBiRel_Left(BiRelLong, \"To_BiRel_Left\", \"A label\")\nBiRel_Left(BiRelLong, \"To_BiRel_Left_Tech\", \"A label\", \"A techn\")\nBiRel_R(BiRelShort, \"To_BiRel_R\", \"A label\")\nBiRel_R(BiRelShort, \"To_BiRel_R_Tech\", \"A label\", \"A techn\")\nBiRel_Right(BiRelLong, \"To_BiRel_Right\", \"A label\")\nBiRel_Right(BiRelLong, \"To_BiRel_Right_Tech\", \"A label\", \"A techn\")\nBiRel_U(BiRelShort, \"To_BiRel_U\", \"A label\")\nBiRel_U(BiRelShort, \"To_BiRel_U_Tech\", \"A label\", \"A techn\")\nBiRel_Up(BiRelLong, \"To_BiRel_Up\", \"A label\")\nBiRel_Up(BiRelLong, \"To_BiRel_Up_Tech\", \"A label\", \"A techn\")\n\nLay_U(RelFrom, BiRelFrom)\nLay_D(RelFrom, RelShort)\nLay_D(RelShort, RelLong)\nLay_R(RelLong, BiRelShort)\nLay_L(RelLong, BiRelLong)\n@enduml\n"
  },
  {
    "path": "percy/TestRelationsDynamic.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Dynamic.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Dynamic.puml\n!endif\n\nSystem(RelFrom, RelFrom)\nSystem(RelShort, RelShort)\nSystem(RelLong, RelLong)\n\nSystem(RelIndexFrom, RelIndexFrom)\nSystem(RelIndexShort, RelIndexShort)\nSystem(RelIndexLong, RelIndexLong)\n\nRel_(Index(), RelFrom, To_Rel_UP, \"A label\", \"-UP->>\")\nRel_(Index(), RelFrom, To_Rel_DOWN, \"A label\", \"A techn\", \"-DOWN->>\")\n\nRel(RelFrom, \"To_Rel\", \"A label\")\nRel(RelFrom, \"To_Rel_Tech\", \"A label\", \"A techn\")\nRel_Back(RelFrom, \"To_Rel_Back\", \"A label\")\nRel_Back(RelFrom, \"To_Rel_Back_Tech\", \"A label\", \"A techn\")\nRel_Neighbor(RelFrom, \"To_Rel_Neighbor\", \"A label\")\nRel_Neighbor(RelFrom, \"To_Rel_Neighbor_Tech\", \"A label\", \"A techn\")\nRel_Back_Neighbor(RelFrom, \"To_Rel_Back_Neighbor\", \"A label\")\nRel_Back_Neighbor(RelFrom, \"To_Rel_Back_Neighbor_Tech\", \"A label\", \"A techn\")\n\nRelIndex(Index(), RelIndexFrom, \"To_RelIndex\", \"A label\")\nRelIndex(Index(), RelIndexFrom, \"To_RelIndex_Tech\", \"A label\", \"A techn\")\n\nRel_D(RelShort, \"To_Rel_D\", \"A label\")\nRel_D(RelShort, \"To_Rel_D_Tech\", \"A label\", \"A techn\")\nRel_Down(RelLong, \"To_Rel_Down\", \"A label\")\nRel_Down(RelLong, \"To_Rel_Down_Tech\", \"A label\", \"A techn\")\nRel_L(RelShort, \"To_Rel_L\", \"A label\")\nRel_L(RelShort, \"To_Rel_L_Tech\", \"A label\", \"A techn\")\nRel_Left(RelLong, \"To_Rel_Left\", \"A label\")\nRel_Left(RelLong, \"To_Rel_Left_Tech\", \"A label\", \"A techn\")\nRel_R(RelShort, \"To_Rel_R\", \"A label\")\nRel_R(RelShort, \"To_Rel_R_Tech\", \"A label\", \"A techn\")\nRel_Right(RelLong, \"To_Rel_Right\", \"A label\")\nRel_Right(RelLong, \"To_Rel_Right_Tech\", \"A label\", \"A techn\")\nRel_U(RelShort, \"To_Rel_U\", \"A label\")\nRel_U(RelShort, \"To_Rel_U_Tech\", \"A label\", \"A techn\")\nRel_Up(RelLong, \"To_Rel_Up\", \"A label\")\nRel_Up(RelLong, \"To_Rel_Up_Tech\", \"A label\", \"A techn\")\n\nRelIndex_D(Index(), RelIndexShort, \"To_RelIndex_D\", \"A label\")\nRelIndex_D(Index(), RelIndexShort, \"To_RelIndex_D_Tech\", \"A label\", \"A techn\")\nRelIndex_Down(Index(), RelIndexLong, \"To_RelIndex_Down\", \"A label\")\nRelIndex_Down(Index(), RelIndexLong, \"To_RelIndex_Down_Tech\", \"A label\", \"A techn\")\nRelIndex_L(Index(), RelIndexShort, \"To_RelIndex_L\", \"A label\")\nRelIndex_L(Index(), RelIndexShort, \"To_RelIndex_L_Tech\", \"A label\", \"A techn\")\nRelIndex_Left(Index(), RelIndexLong, \"To_RelIndex_Left\", \"A label\")\nRelIndex_Left(Index(), RelIndexLong, \"To_RelIndex_Left_Tech\", \"A label\", \"A techn\")\nRelIndex_R(Index(), RelIndexShort, \"To_RelIndex_R\", \"A label\")\nRelIndex_R(Index(), RelIndexShort, \"To_RelIndex_R_Tech\", \"A label\", \"A techn\")\nRelIndex_Right(Index(), RelIndexLong, \"To_RelIndex_Right\", \"A label\")\nRelIndex_Right(Index(), RelIndexLong, \"To_RelIndex_Right_Tech\", \"A label\", \"A techn\")\nRelIndex_U(Index(), RelIndexShort, \"To_RelIndex_U\", \"A label\")\nRelIndex_U(Index(), RelIndexShort, \"To_RelIndex_U_Tech\", \"A label\", \"A techn\")\nRelIndex_Up(Index(), RelIndexLong, \"To_RelIndex_Up\", \"A label\")\nRelIndex_Up(Index(), RelIndexLong, \"To_RelIndex_Up_Tech\", \"A label\", \"A techn\")\n\nLay_U(RelFrom, RelIndexFrom)\nLay_D(RelFrom, RelShort)\nLay_D(RelShort, RelLong)\nLay_R(RelLong, RelIndexShort)\nLay_L(RelLong, RelIndexLong)\n@enduml\n"
  },
  {
    "path": "percy/TestRelationsTags.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\nUpdateRelStyle(gray, gray)\n\nAddRelTag(\"textColorBlue\", $textColor=blue)\nAddRelTag(\"textColorRed\", $textColor=\"red\")\nAddRelTag(\"lineColorBlue\", $lineColor=\"blue\")\nAddRelTag(\"lineStyleDashed\", $lineStyle=DashedLine())\nAddRelTag(\"lineStyleDotted\", $lineStyle=DottedLine())\nAddRelTag(\"lineStyleBold\", $lineStyle=BoldLine())\nAddRelTag(\"lineThickness\", $lineThickness=5)\nAddRelTag(\"bothSprites\", $sprite=\"person2\", $legendSprite=\"person2,scale=0.25\")\nAddRelTag(\"technAndLegendText\", $techn=\"HTTPS\", $legendText=\"Another text in legend (incl. techn. https)\")\n\nPerson(person, \"Person\")\n\nSystem(system1, \"System 1\")\nSystem(system2, \"System 2\")\nSystem(system3, \"System 3\")\nSystem(system4, \"System 3\")\n\nRel_U(person, system1, \"without a tag\")\nRel_U(person, system1, \"bothSprites\", $tags=\"bothSprites\")\nRel_U(person, system1, \"technAndLegendText\", $tags=\"technAndLegendText\")\nRel_R(person, system2, \"textColorBlue\", $tags=\"textColorBlue\")\nRel_R(person, system2, \"lineColorBlue\", $tags=\"lineColorBlue\")\nRel_R(person, system2, \"textColorRed+lineColorBlue\", $tags=\"textColorRed+lineColorBlue\")\nRel_R(person, system2, \"textColorRed+textColorBlue (first wins)\", $tags=\"textColorRed+textColorBlue\")\nRel_D(person, system3, \"lineStyleDashed\", $tags=\"lineStyleDashed\")\nRel_D(person, system3, \"lineStyleDotted\", $tags=\"lineStyleDotted\")\nRel_D(person, system3, \"lineStyleBold\", $tags=\"lineStyleBold\")\nRel_D(person, system3, \"lineStyleDotted+lineThickness\", $tags=\"lineStyleDotted+lineThickness\")\nRel_L(person, system4, \"textColorBlue+textColorRed+lineColorBlue+lineStyleDashed+lineThickness+bothSprites\", $tags=\"textColorBlue+textColorRed+lineColorBlue+lineStyleDashed+lineThickness+bothSprites\")\nRel_L(person, system4, \"textColorBlue+textColorRed+lineColorBlue+lineStyleDashed+lineThickness+bothSprites+technAndLegendText\", $tags=\"textColorBlue+textColorRed+lineColorBlue+lineStyleDashed+lineThickness+bothSprites+technAndLegendText\")\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/TestSequenceSkinparams.puml",
    "content": "@startuml\n\n!$UseTheme = \"C4_green\"\n\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  ' !theme C4_FirstTest from %get_variable_value(\"RELATIVE_INCLUDE\")/themes\n  !theme $UseTheme from ./../themes\n!else\n  !theme $UseTheme from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n!endif\n\n' <<<<<<<<<<<<<<<<<< PART OF THEME \n\n' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,...\n' (no default values which are defined in C4.puml) \n' If skinparams and styles are defined with concrete values no variables are required \n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$ARROW_COLOR ?= \"#666666\"\n\n' replace transparent with concrete background that it can be used as font color too\n!if ($BOUNDARY_BG_COLOR == \"transparent\")\n  !$SEQUENCE_BG_COLOR = white\n!else\n  !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR\n!endif\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n' \"C4 styled\" default is that lifeline is arrow color\nskinparam SequenceLifelineBorderColor $ARROW_COLOR\n\nskinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupFontColor $BOUNDARY_COLOR\nskinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR\nskinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceReferenceFontColor $BOUNDARY_COLOR\nskinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR\n' VIA STYLE\n' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR\n<style>\nreferenceHeader {\n  fontcolor $SEQUENCE_BG_COLOR\n}\n</style>\nskinparam SequenceReferenceBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceDividerFontColor $BOUNDARY_COLOR\nskinparam SequenceDividerBorderColor $BOUNDARY_COLOR\n\n' VIA STYLE\n' skinparam SequenceDelayFontColor green\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $BOUNDARY_COLOR\n  }\n}\n</style>\n\n' >>>>>>>>>>>>>>>>>> PART OF THEME \n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Sequence.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Sequence.puml\n!endif\n\nSHOW_ELEMENT_DESCRIPTIONS()\nSHOW_INDEX(true)\n\nAddPersonTag(\"chatBot\", $sprite=\"robot\")\nAddBoundaryTag(\"chatBotSystem\", $type=\"ChatGPT\", $bgColor=\"lightgreen\", $fontColor=$PERSON_BG_COLOR, $borderColor=$PERSON_BG_COLOR, $shadowing=\"true\", $sprite=\"robot2\")\n\nPerson(Alice, \"Alice\")\nSystem_Boundary(system, \"System\", $tags=\"chatBotSystem\", $descr=\"ChatGPT with model gpt-3.5-turbo. It has been updated to feature higher accuracy at responding in requested formats\")\nComponent(Bob, \"Bob\", $descr=\"This chatbot should act like a person\", $tags=\"chatBot\")\nBoundary_End()\n\nactivate Bob\n\nRel(Alice, Bob, \"Authentication Request\", $index = SetIndex(1), $rel= \"->(39)\")\n\nalt successful case\n    Rel(Bob, Alice, \"Authentication Accepted\")\nelse some kind of failure\n    loop 1000 times\n        Rel(Alice, Bob, \"DNS Attack\")\n    end\nend\n\nref over Alice, Bob : init\n\nRel(Alice, Bob, \"hello\")\n\nref over Bob\n  This can be on\n  several lines\nend ref\n\n== Initialization ==\n\nRel(Alice, Bob, \"Authentication Request\")\nRel(Bob, Alice, \"Authentication Response\")\n\n== Repetition ==\n\nRel(Alice, Bob, \"Another authentication Request\")\nRel(Bob, Alice, \"another authentication Response\")\n\n... 5 minutes later ...\n\nRel(Alice, Bob, \"calls via phone\")\n\n\nSHOW_LEGEND()\n@enduml"
  },
  {
    "path": "percy/TestSketchStyle.puml",
    "content": "@startuml LAYOUT_AS_SKETCH Sample\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\nSET_SKETCH_STYLE($bgColor=\"lightblue\", $fontColor=\"darkblue\", $warningColor=\"darkred\", $footerWarning=\"Sketch\", $footerText=\"Created for discussion\")\n\n' PNG with font jlm_cmmi10 (typically another font is used)\n' SET_SKETCH_STYLE($fontName=\"jlm_cmmi10\")\n\n' SVG with fallback fonts MS Gothic,Comic Sans MS, Comic Sans, Chalkboard SE, Comic Neue, cursive, sans-serif (typically without \"MS Gothic\")\nSET_SKETCH_STYLE($fontName=\"MS Gothic,Comic Sans MS,Comic Sans,Chalkboard SE,Comic Neue,cursive,sans-serif\")\n\nLAYOUT_AS_SKETCH()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, 'Sample') {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/TestSystemPersonSupportType.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\n' e.g. during first discussions no sprites are available but the categories should be displayed in the UI\nAddExternalPersonTag(\"anonymous_ext\", $type=\"anonymous user\")\nAddPersonTag(\"customer\", $type=\"aggregated user\")\nAddPersonTag(\"admin\", $legendText=\"administration user\", $type=\"administrator\")\nAddExternalSystemTag(\"git_repository\", $type=\"web-based Git repository\")\n\nPerson_Ext(anonymous_user_v1, \"Bob\", \"simplified version during first discussions ($type defines the role), after discussion the $type can be replaced with concrete $sprite\", $type=\"anonymous user\")\nPerson(aggregated_user_v1, \"Sam, Ivone\", $tags=\"customer\", $type=\"replaced with customer\")\nPerson(administration_user_v1, \"Bernd\", $tags=\"admin\")\n\nSystem(system1, \"System 1\", $type=\"new developed system\")\n\nSystem_Ext(github, \"GitHub\", $tags=\"git_repository\", $type=\"graphical web-based Git repository\")\nSystem_Ext(gitlab, \"GitLab\", $tags=\"git_repository\")\n\nPerson_Ext(anonymous_user_v2, \"Bob v2\", \"Update with sprites\", $sprite=\"robot2\")\n\nHIDE_STEREOTYPE()\n@enduml"
  },
  {
    "path": "percy/TestTagSupportsSprite.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\n!define osaPuml https://raw.githubusercontent.com/Crashedmind/PlantUML-opensecurityarchitecture2-icons/master\n!include osaPuml/Common.puml\n!include osaPuml/User/all.puml\n!include osaPuml/Server/all.puml\n\n!include <office/Servers/database_server>\n!include <office/Servers/file_server>\n!include <office/Servers/application_server>\n!include <office/Concepts/service_application>\n!include <office/Concepts/firewall>\n\n!define DEVICONS https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons\n!include DEVICONS/mysql.puml\n!include DEVICONS/mongodb.puml\n\nAddExternalPersonTag(\"anonymous_ext\", $sprite=\"osa_user_black_hat\", $legendText=\"anonymous user\")\nAddPersonTag(\"customer\", $sprite=\"osa_user_large_group\", $legendText=\"aggregated user\")\nAddPersonTag(\"admin\", $sprite=\"osa_user_audit,color=red\", $legendSprite=\"osa_user_audit,scale=0.25,color=red\", $legendText=\"administration user\")\n\nAddContainerTag(\"webApp\", $sprite=\"application_server\", $legendText=\"web application\")\n\nAddContainerTag(\"mongo_db\", $sprite=\"mongodb\", $legendText=\"MongoDB container\")\nAddContainerTag(\"mysql_db\", $sprite=\"mysql\", $legendText=\"MySQL container\")\nAddContainerTag(\"files\", $sprite=\"file_server\", $legendText=\"file server container\")\n\nAddContainerTag(\"conApp\", $sprite=\"img:https://plantuml.com/logo3.png{scale=0.3}\", $legendSprite=\"img:https://plantuml.com/logo3.png{scale=0.1}\", $legendText=\"console application\")\n\nUpdateElementStyle(\"external_system\", $bgColor=$EXTERNAL_SYSTEM_BG_COLOR, $fontColor=$EXTERNAL_SYSTEM_FONT_COLOR, $borderColor=$EXTERNAL_SYSTEM_BORDER_COLOR, $sprite = \"osa_server\", , $legendText=\"external system\")\n\nAddRelTag(\"firewall\", $textColor=\"$ARROW_FONT_COLOR\", $lineColor=\"$ARROW_COLOR\", $sprite=\"firewall,scale=0.3,color=red\", $legendText=\"firewall\")\nAddRelTag(\"plantuml\", $textColor=\"$ARROW_FONT_COLOR\", $lineColor=\"$ARROW_COLOR\", $sprite=\"img:https://plantuml.com/logo3.png{scale=0.1}\", $legendText=\"console triggered\")\n\nLAYOUT_LEFT_RIGHT()\n' LAYOUT_LANDSCAPE()\n\nPerson_Ext(anonymous_user, \"Bob\", $tags=\"anonymous_ext\")\nPerson(aggregated_user, \"Sam, Ivone\", $tags=\"customer\")\nPerson(administration_user, \"Bernd\", $tags=\"admin\")\n\nSystem_Boundary(c1, \"techtribes.js\"){\n    Container(web_app, \"Web Application\", \"Java, Spring MVC, Tomcat 7.x\", \"Allows users to view people, tribes, content, events, jobs, etc. from the local tech, digital and IT sector\", $tags=\"webApp\")\n    ContainerDb(rel_db, \"Relational Database\", \"MySQL 5.5.x\", \"Stores people, tribes, tribe membership, talks, events, jobs, badges, GitHub repos, etc.\", $tags=\"mysql_db\")\n    Container(filesystem, \"File System\", \"FAT32\", \"Stores search indexes\", $tags=\"files\")\n    ContainerDb(nosql, \"NoSQL Data Store\", \"MongoDB 2.2.x\", \"Stores from RSS/Atom feeds (blog posts) and tweets\", $tags=\"mongo_db\")\n    Container(updater, \"Updater\", \"Java 7 Console App\", \"Updates profiles, tweets, GitHub repos and content on a scheduled basis\", $tags=\"conApp\")\n}\n\nSystem_Ext(twitter, \"Twitter\")\nSystem_Ext(github, \"GitHub\")\nSystem_Ext(blogs, \"Blogs\")\n\nRel(anonymous_user, web_app, \"Uses\", \"HTTPS\", $tags=\"firewall\")\nRel(aggregated_user, web_app, \"Uses\", \"HTTPS\", $tags=\"firewall\")\nRel(administration_user, web_app, \"Uses\", \"HTTPS\", $tags=\"firewall\")\n\nRel(web_app, rel_db, \"Reads from and writes to\", \"SQL/JDBC, port 3306\")\nRel(web_app, filesystem, \"Reads from\")\nRel(web_app, nosql, \"Reads from\", \"MongoDB wire protocol, port 27017\")\n\nRel_U(updater, rel_db, \"Reads from and writes data to\", \"SQL/JDBC, port 3306\")\nRel_U(updater, filesystem, \"Writes to\")\nRel_U(updater, nosql, \"Reads from and writes to\", \"MongoDB wire protocol, port 27017\")\n\nRel(updater, twitter, \"Gets profile information and tweets from\", \"HTTPS\", $tags=\"plantuml\")\nRel(updater, github, \"Gets information about public code repositories from\", \"HTTPS\", $tags=\"plantuml\")\nRel(updater, blogs, \"Gets content using RSS and Atom feeds from\", \"HTTP\", $tags=\"plantuml\")\n\n' Lay_R(rel_db, filesystem)\n\n' HIDE_STEREOTYPE()\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/TestTagSupportsSpriteTechn.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Component.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n!endif\n\n!define osaPuml https://raw.githubusercontent.com/Crashedmind/PlantUML-opensecurityarchitecture2-icons/master\n!include osaPuml/Common.puml\n!include osaPuml/User/all.puml\n!include osaPuml/Server/all.puml\n\n!include <office/Servers/database_server>\n!include <office/Servers/file_server>\n!include <office/Servers/application_server>\n!include <office/Concepts/service_application>\n!include <office/Concepts/firewall>\n\n!define DEVICONS https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons\n!include DEVICONS/mysql.puml\n!include DEVICONS/mongodb.puml\n\nAddExternalPersonTag(\"anonymous_ext\", $sprite=\"osa_user_black_hat\", $legendText=\"anonymous user\")\nAddPersonTag(\"customer\", $sprite=\"osa_user_large_group\", $legendText=\"aggregated user\")\nAddPersonTag(\"admin\", $sprite=\"osa_user_audit,color=red\", $legendSprite=\"osa_user_audit,scale=0.25,color=red\", $legendText=\"administration user\")\n\nAddContainerTag(\"webApp\", $sprite=\"application_server\", $legendText=\"web application\")\n\nAddContainerTag(\"mongo_db\", $techn = \"MongoDB 2.2.x\", $sprite=\"mongodb\", $legendText=\"MongoDB container\")\nAddContainerTag(\"mysql_db\", $techn=\"MySQL 5.5.x\", $sprite=\"mysql\", $legendText=\"MySQL container\")\nAddContainerTag(\"files\", $sprite=\"file_server\", $legendText=\"file server container\")\n\nAddContainerTag(\"conApp\", $sprite=\"img:https://plantuml.com/logo3.png{scale=0.3}\", $legendSprite=\"img:https://plantuml.com/logo3.png{scale=0.1}\", $legendText=\"console application\")\n\nUpdateElementStyle(\"external_system\", $bgColor=$EXTERNAL_SYSTEM_BG_COLOR, $fontColor=$EXTERNAL_SYSTEM_FONT_COLOR, $borderColor=$EXTERNAL_SYSTEM_BORDER_COLOR, $sprite = \"osa_server\", , $legendText=\"external system\")\n\nAddRelTag(\"firewall\", $textColor=\"$ARROW_FONT_COLOR\", $lineColor=\"$ARROW_COLOR\", $techn=\"HTTPS\", $sprite=\"firewall,scale=0.3,color=red\", $legendText=\"firewall\")\nAddRelTag(\"plantuml\", $textColor=\"$ARROW_FONT_COLOR\", $lineColor=\"$ARROW_COLOR\", $techn=\"HTTPS\", $sprite=\"img:https://plantuml.com/logo3.png{scale=0.1}\", $legendText=\"console triggered\")\n\nLAYOUT_LEFT_RIGHT()\n' LAYOUT_LANDSCAPE()\n\nPerson_Ext(anonymous_user, \"Bob\", $tags=\"anonymous_ext\")\nPerson(aggregated_user, \"Sam, Ivone\", $tags=\"customer\")\nPerson(administration_user, \"Bernd\", $tags=\"admin\")\n\nSystem_Boundary(c1, \"techtribes.js\"){\n    Container(web_app, \"Web Application\", \"Java, Spring MVC, Tomcat 7.x\", \"Allows users to view people, tribes, content, events, jobs, etc. from the local tech, digital and IT sector\", $tags=\"webApp\")\n    ContainerDb(rel_db, \"Relational Database\", $tags=\"mysql_db\", $descr = \"Stores people, tribes, tribe membership, talks, events, jobs, badges, GitHub repos, etc.\")\n    Container(filesystem, \"File System\", \"FAT32\", \"Stores search indexes\", $tags=\"files\")\n    ContainerDb(nosql, \"NoSQL Data Store\", $tags=\"mongo_db\", $descr = \"Stores from RSS/Atom feeds (blog posts) and tweets\")\n    Container(updater, \"Updater\", \"Java 7 Console App\", \"Updates profiles, tweets, GitHub repos and content on a scheduled basis\", $tags=\"conApp\")\n}\n\nSystem_Ext(twitter, \"Twitter\")\nSystem_Ext(github, \"GitHub\")\nSystem_Ext(blogs, \"Blogs\")\n\nRel(anonymous_user, web_app, \"Uses\", $tags=\"firewall\")\nRel(aggregated_user, web_app, \"Uses\", $tags=\"firewall\")\nRel(administration_user, web_app, \"Uses\", $tags=\"firewall\")\n\nRel(web_app, rel_db, \"Reads from and writes to\", \"SQL/JDBC, port 3306\")\nRel(web_app, filesystem, \"Reads from\")\nRel(web_app, nosql, \"Reads from\", \"MongoDB wire protocol, port 27017\")\n\nRel_U(updater, rel_db, \"Reads from and writes data to\", \"SQL/JDBC, port 3306\")\nRel_U(updater, filesystem, \"Writes to\")\nRel_U(updater, nosql, \"Reads from and writes to\", \"MongoDB wire protocol, port 27017\")\n\nRel(updater, twitter, \"Gets profile information and tweets from\", $tags=\"plantuml\")\nRel(updater, github, \"Gets information about public code repositories from\", $tags=\"plantuml\")\n' don't use the default techn. \"HTTPS\" which is defined via tags, define techn \"HTTP\" too\nRel(updater, blogs, \"Gets content using RSS and Atom feeds from\", \"HTTP\", $tags=\"plantuml\")\n\n' Lay_R(rel_db, filesystem)\n\n' HIDE_STEREOTYPE()\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/TestThemeC4_All.puml",
    "content": "@startuml\n!$UseTheme=C4_blue\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_blue\n!NEW_C4_STYLE=1\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_blue_new\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_brown\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_brown\n!NEW_C4_STYLE=1\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_brown_new\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_FirstTest\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_green\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_green\n!NEW_C4_STYLE=1\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_green_new\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_sandstone\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_superhero\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_united\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_violet\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_violet\n!NEW_C4_STYLE=1\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n\n@startuml\n!$UseTheme=C4_violet_new\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n@enduml\n"
  },
  {
    "path": "percy/TestThemeC4_FirstTest.puml",
    "content": "@startuml\n\n!$UseTheme=C4_FirstTest\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestThemeTemplate.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n!endif\n\n@enduml\n"
  },
  {
    "path": "percy/TestThemeC4_united.puml",
    "content": "@startuml\n\n!$UseTheme = \"C4_united\"\n\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  ' !theme C4_FirstTest from %get_variable_value(\"RELATIVE_INCLUDE\")/themes\n  !theme $UseTheme from ./../themes\n!else\n  !theme $UseTheme from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n!endif\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Container.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!endif\n\n' LAYOUT_LEFT_RIGHT()\n\nPerson(admin, \"Administrator\")\nSystem_Boundary(c1, \"Sample System\") {\n    Container(web_app, \"Web Application\", \"C#, ASP.NET Core 2.1 MVC\", \"Allows users to compare multiple Twitter timelines\")\n}\nSystem(twitter, \"Twitter\")\n\nRel(admin, web_app, \"Uses\", \"HTTPS\")\nRel(web_app, twitter, \"Gets tweets from\", \"HTTPS\")\n\nSHOW_FLOATING_LEGEND()\n@enduml\n"
  },
  {
    "path": "percy/TestThemeSupport.puml",
    "content": "@startuml\n\n!$ThemeToBeCHecked=C4_FirstTest\n\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  ' !theme C4_FirstTest from %get_variable_value(\"RELATIVE_INCLUDE\")/themes\n  !theme $ThemeToBeCHecked from ./../themes\n!else\n  !theme $ThemeToBeCHecked from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n!endif\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestAllElementsWithLegend.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestAllElementsWithLegend.puml\n!endif\n\n@enduml\n"
  },
  {
    "path": "percy/TestThemeTemplate.puml",
    "content": "@startuml\n\n' please defined $ThemeToBeChecked before the file is included (sample see TestThemeC4_FirstTest.puml)\n' [At]startuml \n' !$UseTheme=C4_FirstTest\n' !if %variable_exists(\"RELATIVE_INCLUDE\")\n'   !include ./TestThemeTemplate.puml\n' !else\n'   !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestThemeTemplate.puml\n' !endif\n' [At]enduml\n\n!$UseTheme?=\"C4_FirstTest\"\n\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  ' !theme C4_FirstTest from %get_variable_value(\"RELATIVE_INCLUDE\")/themes\n  !theme $UseTheme from ./../themes\n!else\n  !theme $UseTheme from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n!endif\n\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include ./TestAllElementsWithLegend.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/percy/TestAllElementsWithLegend.puml\n!endif\n\n@enduml\n"
  },
  {
    "path": "percy/TestVersion.puml",
    "content": "@startuml\n' convert it with additional command line argument -DRELATIVE_INCLUDE=\"./..\" to use locally\n!if %variable_exists(\"RELATIVE_INCLUDE\")\n  !include %get_variable_value(\"RELATIVE_INCLUDE\")/C4_Deployment.puml\n!else\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n!endif\n\n' existing plantuml version as text\n%version()\n\n' new C4-Plantuml version as text \nC4Version()\n\n' new C4-Plantuml version details (incl. PlantUML version) as table\nC4VersionDetails()\n\n' version functions used in e.g. footer\nfooter drawn with PlantUML v. %version() and C4-PlantUML v. C4Version()\n\n@enduml"
  },
  {
    "path": "samples/C4CoreDiagrams.md",
    "content": "# C4 Model Diagrams\n\nThe following samples are reproductions with C4-PlantUML from [C4 model core diagrams](https://c4model.com/#coreDiagrams) created by [Simon Brown](https://simonbrown.je/).\n\n- [📄 C4-PlantUML](../README.md#c4-plantuml)\n- [📄 Layout Options](../LayoutOptions.md#layout-options)\n- [📄 Themes (different styles and languages)](../Themes.md#themes)\n- samples\n  - [📄 C4 Model Diagrams](#c4-model-diagrams)\n    - [Core Diagrams](#core-diagrams)\n      - [System Context Diagram](#system-context-diagram)\n      - [Container Diagram](#container-diagram)\n      - [Component Diagram](#component-diagram)\n    - [Supplementary Diagrams](#supplementary-diagrams)\n      - [System Landscape Diagram](#system-landscape-diagram)\n      - [Dynamic Diagram](#dynamic-diagram)\n      - [Sequence Diagram](#sequence-diagram)\n      - [Deployment Diagram](#deployment-diagram)\n    - [Styles](#styles)\n    - [Icons](#icons)\n    - [Themes](#themes)\n\n## Core Diagrams\n\n### System Context Diagram\n\nSource: [C4_Context Diagram Sample - bigbankplc.puml](C4_Context%20Diagram%20Sample%20-%20bigbankplc.puml)\n\n[![System Context diagram for Internet Banking System - open link](https://www.plantuml.com/plantuml/svg/VL7BRXf14BplLtIu14iyBZdbP9kWn18uA82Yd5QzGmCZve6cUmFyVNgNPGF1yMscfwgwgkQH1PEKtcKVR32kN15iHVRyUJXCU1Xih6pBecHA9WQX80CJ_N3lC5ISFilAsM8u-jIVLQFbT3Bqo499H_ceOXnbiA_KFq8PbEfL0cHBi8xEnOCD6t0s461OmSspJQod2BeQN3Jet4arMe__ocUJfr_VbulyvylYMpuPVns_Vka-P9bOSGJp4mjvQ0YmihX9wDL2WXSTfK02pnXswgR1PjcC4iVGDILBz9Hwq3bFqBNGKVFMqSSdk20Xhki4XQ9wSD3-ODymwncWCR4CmeFEGtRUrYtEYZdNLvNxZwrwKzKRj-kuAkctfGFOe84yYeq1i8XbNQHDjqjxTTCUTmHxF7bgV3H6yl5HkXwj--jatA_kmEt-XMQpjJrqCBKcHOvhWV7HR35i2EYQq6PifSDQgoVLcLxERsISIqp4WCvTsZGwWAQcDvAsRVIkaah2m6WgcDv8J9tq1xchNxrhVid42bDK_encTmMzxMLEOSLDM0Q93UULx6PRn7JtfU-mwyJJnUmiSSziIslTFIgzzEuF \"System Context diagram for Internet Banking System\")](https://www.plantuml.com/plantuml/uml/VL7BRXf14BplLtIu14iyBZdbP9kWn18uA82Yd5QzGmCZve6cUmFyVNgNPGF1yMscfwgwgkQH1PEKtcKVR32kN15iHVRyUJXCU1Xih6pBecHA9WQX80CJ_N3lC5ISFilAsM8u-jIVLQFbT3Bqo499H_ceOXnbiA_KFq8PbEfL0cHBi8xEnOCD6t0s461OmSspJQod2BeQN3Jet4arMe__ocUJfr_VbulyvylYMpuPVns_Vka-P9bOSGJp4mjvQ0YmihX9wDL2WXSTfK02pnXswgR1PjcC4iVGDILBz9Hwq3bFqBNGKVFMqSSdk20Xhki4XQ9wSD3-ODymwncWCR4CmeFEGtRUrYtEYZdNLvNxZwrwKzKRj-kuAkctfGFOe84yYeq1i8XbNQHDjqjxTTCUTmHxF7bgV3H6yl5HkXwj--jatA_kmEt-XMQpjJrqCBKcHOvhWV7HR35i2EYQq6PifSDQgoVLcLxERsISIqp4WCvTsZGwWAQcDvAsRVIkaah2m6WgcDv8J9tq1xchNxrhVid42bDK_encTmMzxMLEOSLDM0Q93UULx6PRn7JtfU-mwyJJnUmiSSziIslTFIgzzEuF)\n\n### Container Diagram\n\nSource: [C4_Container Diagram Sample - bigbankplc.puml](C4_Container%20Diagram%20Sample%20-%20bigbankplc.puml)\n\n[![Container diagram for Internet Banking System - open link](https://www.plantuml.com/plantuml/svg/fLN1RkCs4BtxAwRfeLv0Zb6WfvxMiOrkjdRYhfncUn96rDWcbY85ScIlKVJVErGKoN8MM1IzaKypRnxV3AdtWT5pNPhH3zegKnS41-Og_3gTUZpTxZKVwhmEv9MpJ9PlbIkdbK4RSoQ12wFpwVoNoIP2J-lLjCJ0v0NAvfA1sfA_hIB_Jr1RIIw51FX0i7F6k9EsUp0I16WB67pMFiZAWHG7unGQSnQEJkNR0l9rDVlhyMcRRHytsUBn-M7yhiTcQPR-ljpEFmZOGi_tsm_PQldRyc4Xu8Wr6uAE50gDUu-b2FLmRvcy9OOxj5-YvlGScChHQ4C-E3jMTM1NaazWtgrkPl0AWzirXyebEu6Jc0fLauYcmG2LShNbS2CwNgYpEm4AzEUn-bcuhWNSl8E_Hm3GwnsVAC-mgYJucNAOLPNH2baxUoFGHpnY0cdbe_Zrd_E8BSZeeyXef0MMM0LjcsCx6hYhcxyUV3CJaSFAeKAXI-MpeSa6znIhlrPDbTSL9p2p-zgWZ_36kwCkA00Qy-qgEvcLA1sDvZEmwvmCSDGOSxG7EJ3atfq2-JUIIfThGwqVwxZfHCr_JE0pbYXM3CM0qQLcAY3KUI2MflqFSIy2eA2ZLdGjRv6F2sJCCL3iGxkCQj8_LZ3Oi_EYBTv0yBJNWNtJKz1Mvh9irWaSC1n4DzPy0EMf8CiQJKZYN548ODnUDiJgzerHEQelP0jnIiUHtTn_Ut8MJi9ydpTmxZiEHLE4M4h_qqttyYkFgKHjij00GhUSh6NVtgp8lnNpTKED1jPQUHVSZc7vLHtGxWbUCeNsWhDLqBCAfzrvBEdgwlRcDbFOzbe9q9tYmcB0tDNSDphfRcm2xD46RCxRcppwHERYLUZlvbEW46j_s6utgGGEuqA5turfHxkdQyjb3wJtXzprBq53rz_pbga11stl2c8uMvN0n_JnONfPl2_v7pEpEudkXVL3FsJvH5W4s7bNDW_FoMkc0EmYSqkyk9iBPSTvuSVL6AL26u0c4MquUY5N4pVKCCohWqn0NpvTRpT2D71va3wSkzwO9d_QklDvlUhCUI-fyQ_rBm00 \"Container diagram for Internet Banking System\")](https://www.plantuml.com/plantuml/uml/fLN1RkCs4BtxAwRfeLv0Zb6WfvxMiOrkjdRYhfncUn96rDWcbY85ScIlKVJVErGKoN8MM1IzaKypRnxV3AdtWT5pNPhH3zegKnS41-Og_3gTUZpTxZKVwhmEv9MpJ9PlbIkdbK4RSoQ12wFpwVoNoIP2J-lLjCJ0v0NAvfA1sfA_hIB_Jr1RIIw51FX0i7F6k9EsUp0I16WB67pMFiZAWHG7unGQSnQEJkNR0l9rDVlhyMcRRHytsUBn-M7yhiTcQPR-ljpEFmZOGi_tsm_PQldRyc4Xu8Wr6uAE50gDUu-b2FLmRvcy9OOxj5-YvlGScChHQ4C-E3jMTM1NaazWtgrkPl0AWzirXyebEu6Jc0fLauYcmG2LShNbS2CwNgYpEm4AzEUn-bcuhWNSl8E_Hm3GwnsVAC-mgYJucNAOLPNH2baxUoFGHpnY0cdbe_Zrd_E8BSZeeyXef0MMM0LjcsCx6hYhcxyUV3CJaSFAeKAXI-MpeSa6znIhlrPDbTSL9p2p-zgWZ_36kwCkA00Qy-qgEvcLA1sDvZEmwvmCSDGOSxG7EJ3atfq2-JUIIfThGwqVwxZfHCr_JE0pbYXM3CM0qQLcAY3KUI2MflqFSIy2eA2ZLdGjRv6F2sJCCL3iGxkCQj8_LZ3Oi_EYBTv0yBJNWNtJKz1Mvh9irWaSC1n4DzPy0EMf8CiQJKZYN548ODnUDiJgzerHEQelP0jnIiUHtTn_Ut8MJi9ydpTmxZiEHLE4M4h_qqttyYkFgKHjij00GhUSh6NVtgp8lnNpTKED1jPQUHVSZc7vLHtGxWbUCeNsWhDLqBCAfzrvBEdgwlRcDbFOzbe9q9tYmcB0tDNSDphfRcm2xD46RCxRcppwHERYLUZlvbEW46j_s6utgGGEuqA5turfHxkdQyjb3wJtXzprBq53rz_pbga11stl2c8uMvN0n_JnONfPl2_v7pEpEudkXVL3FsJvH5W4s7bNDW_FoMkc0EmYSqkyk9iBPSTvuSVL6AL26u0c4MquUY5N4pVKCCohWqn0NpvTRpT2D71va3wSkzwO9d_QklDvlUhCUI-fyQ_rBm00)\n\n### Component Diagram\n\nSource: [C4_Component Diagram Sample - bigbankplc.puml](C4_Component%20Diagram%20Sample%20-%20bigbankplc.puml)\n\n[![Component diagram for Internet Banking System - API Application - open link](https://www.plantuml.com/plantuml/svg/fPHDR-Cs48Rl-XNJ75e7IE9BJpsjuwJTB9AD4JlzE1aZSYonvOT0KdQDel-zGyesRISe0kn953cSUUQTL_eK8lhO6rrzfwpGlIHeO-p2J-EnnyrDesBRrtqWBvoDPEEDS6RSQRJfpdM8KgjwFFtnUfQsNfyUnmP39CzRowapdRFfJfVo_m2zvSk6Do2s12kdjTiesu1MbW2jX9DZvGEl771nq4wWrblESQ1yMw1wdFpn_BfO_lQm-BnylF_b_klTwBAgeegQu10BKc7ZqN1z3m-MMIr5k4NxLqAPRvdUm3LCPWymwJgj14RbR5LDkNzaK3yA7Lx1nPp3EUyC6peElE2ZFt6DGNZLnTmLsgRNwDF9pBkraXG0jSvTgZr0lGDOiKWf3seLjwbzqOVe3Fa0QuNfZlAmeHfgxpQ1_Ct5vH6QIMHFhbOwGwMIlwD1h-nfTT3Ag4WIGby7hkxYDz2ON6__aBHMWawmxkgHhBd-7KQiCL1YUI6DGsRORyDSj6GmdSwZyyoPV0UU6XMYpz5Co6CpUNq5BOQM963F73Rk1W32aqolgCCLe10K0cZNy0j5aRY66I_l_uuZKuSa679QZuRER518yhpSAeiaUECWq14FOEtwM1JAnLrl8wyOtmRCKXQE8j3obkCa-kq8EyL5pyntSGd_L01GJ3mAgh69ZXziOaYPlDEQiikUVft22uLujZr9tziWQaYpJ3b0MLw-F_mmY71vLlhG5MVSBM7U6yFu7-8eDYncsgZO0aBOfHcKLZwZ76HyGn98z9wDcOJOBSjf7bxdKoEtX2V-FxErJrOacINXy66iLo1Q75uw367Zl2oJEyLW4wrGeAJ_iHByd2FUWPh0S1cStGt2x7ESJI9LpgLVIEyCSAJ0Qo1Mw71UfbJmtWILwxBEtoHA-1usl4KGNQBxSdSxBHUEM-NbFc7wo_2V__DYCPjpyBzLbMBpRp9Zbh0ly-Ul-xWIL5ZV3yoHvWFPp0UIVI8hUwF_0m00 \"Component diagram for Internet Banking System - API Application\")](https://www.plantuml.com/plantuml/uml/fPHDR-Cs48Rl-XNJ75e7IE9BJpsjuwJTB9AD4JlzE1aZSYonvOT0KdQDel-zGyesRISe0kn953cSUUQTL_eK8lhO6rrzfwpGlIHeO-p2J-EnnyrDesBRrtqWBvoDPEEDS6RSQRJfpdM8KgjwFFtnUfQsNfyUnmP39CzRowapdRFfJfVo_m2zvSk6Do2s12kdjTiesu1MbW2jX9DZvGEl771nq4wWrblESQ1yMw1wdFpn_BfO_lQm-BnylF_b_klTwBAgeegQu10BKc7ZqN1z3m-MMIr5k4NxLqAPRvdUm3LCPWymwJgj14RbR5LDkNzaK3yA7Lx1nPp3EUyC6peElE2ZFt6DGNZLnTmLsgRNwDF9pBkraXG0jSvTgZr0lGDOiKWf3seLjwbzqOVe3Fa0QuNfZlAmeHfgxpQ1_Ct5vH6QIMHFhbOwGwMIlwD1h-nfTT3Ag4WIGby7hkxYDz2ON6__aBHMWawmxkgHhBd-7KQiCL1YUI6DGsRORyDSj6GmdSwZyyoPV0UU6XMYpz5Co6CpUNq5BOQM963F73Rk1W32aqolgCCLe10K0cZNy0j5aRY66I_l_uuZKuSa679QZuRER518yhpSAeiaUECWq14FOEtwM1JAnLrl8wyOtmRCKXQE8j3obkCa-kq8EyL5pyntSGd_L01GJ3mAgh69ZXziOaYPlDEQiikUVft22uLujZr9tziWQaYpJ3b0MLw-F_mmY71vLlhG5MVSBM7U6yFu7-8eDYncsgZO0aBOfHcKLZwZ76HyGn98z9wDcOJOBSjf7bxdKoEtX2V-FxErJrOacINXy66iLo1Q75uw367Zl2oJEyLW4wrGeAJ_iHByd2FUWPh0S1cStGt2x7ESJI9LpgLVIEyCSAJ0Qo1Mw71UfbJmtWILwxBEtoHA-1usl4KGNQBxSdSxBHUEM-NbFc7wo_2V__DYCPjpyBzLbMBpRp9Zbh0ly-Ul-xWIL5ZV3yoHvWFPp0UIVI8hUwF_0m00)\n\n## Supplementary Diagrams\n\n### System Landscape Diagram\n\nSource: [C4_Context Diagram Sample - bigbankplc-landscape.puml](C4_Context%20Diagram%20Sample%20-%20bigbankplc-landscape.puml)\n\n[![System Landscape diagram for Big Bank plc - open link](https://www.plantuml.com/plantuml/svg/TLDDSy963BtxLwXSGcO8zD1JJ-63QJA5a0amcPuyorh6EwnttTKwXEdqlrThRDS4k7cbfwVt9FcPl72-p7NqYp9Ibmb2vdr1luz6JXo7U-MpSbSIEccDH-E7qkQZGWiJQfx89rhjHjFVdjv3QBjSZ7917Xs7ucce-FR38h0_G6cuD6SAy1b2QhMsHsNse9L142Q1YxHon5yMk3LeAuNM9-PeDVwaZnuMuxzMsqsyMRt7izNdM_-n3OtNyVhF-MRwmh4wzFcwUOaNyp_cRpCEHbvvZR0-iV8S5go5f2WG4YNsJkIirS54xM4Yp04ABQFe7HrPqvSbUPkZ6q3l716w0WLRqphNu-GO6YJOjFAtOzG0ZZnTA9hA40CXfIsDfs6FTStPeIkS8emd74s4E_NbhqpOLTDxX7yY0AZrztTd0J5LJmQ_1XQ3lf5M0ojXOGdKggCmyI-5Hr26JUV2Asj0x6nPRKMvIus3QcsvE20KufHZBRiZ9fv_-xxmUMYrMTxh6CQGyBM159Gnmq-2N2ZzlvtvKtW3jIOs6OAgF0eDIoMT9Pjwc7_BJ9Wz0dOBRWdaj4cTo979bittZMcjlNL88BHkrYWv0FN0RyoiTJdepCmxOKZ80ECNUjbAEjzG9QcfZ0dTbv91MNDGi3w7OEr5clQwcHeC53BLM9LfputR_Eoo4_8GspGzDvZm2rRywdAFarmPHTxLlam2L1Q5TVv-bt-Zw0Dr_8Pgd-siw_mcLxUv9IIk2F2F3kvyCf_rNL1r650IbzRWeBM3lxoGDPg4whM70-EQgmut1Zoc0y7V9L9m6kgguqADHMODDYIpgn_iVlEkPEvUkUeUMzVz9UrzuEpwDkv1j-s2xw6YXJWnOoNiilzbhcdv68BCsxNSIJwpzpBN_m40 \"System Landscape diagram for Big Bank plc\")](https://www.plantuml.com/plantuml/uml/TLDDSy963BtxLwXSGcO8zD1JJ-63QJA5a0amcPuyorh6EwnttTKwXEdqlrThRDS4k7cbfwVt9FcPl72-p7NqYp9Ibmb2vdr1luz6JXo7U-MpSbSIEccDH-E7qkQZGWiJQfx89rhjHjFVdjv3QBjSZ7917Xs7ucce-FR38h0_G6cuD6SAy1b2QhMsHsNse9L142Q1YxHon5yMk3LeAuNM9-PeDVwaZnuMuxzMsqsyMRt7izNdM_-n3OtNyVhF-MRwmh4wzFcwUOaNyp_cRpCEHbvvZR0-iV8S5go5f2WG4YNsJkIirS54xM4Yp04ABQFe7HrPqvSbUPkZ6q3l716w0WLRqphNu-GO6YJOjFAtOzG0ZZnTA9hA40CXfIsDfs6FTStPeIkS8emd74s4E_NbhqpOLTDxX7yY0AZrztTd0J5LJmQ_1XQ3lf5M0ojXOGdKggCmyI-5Hr26JUV2Asj0x6nPRKMvIus3QcsvE20KufHZBRiZ9fv_-xxmUMYrMTxh6CQGyBM159Gnmq-2N2ZzlvtvKtW3jIOs6OAgF0eDIoMT9Pjwc7_BJ9Wz0dOBRWdaj4cTo979bittZMcjlNL88BHkrYWv0FN0RyoiTJdepCmxOKZ80ECNUjbAEjzG9QcfZ0dTbv91MNDGi3w7OEr5clQwcHeC53BLM9LfputR_Eoo4_8GspGzDvZm2rRywdAFarmPHTxLlam2L1Q5TVv-bt-Zw0Dr_8Pgd-siw_mcLxUv9IIk2F2F3kvyCf_rNL1r650IbzRWeBM3lxoGDPg4whM70-EQgmut1Zoc0y7V9L9m6kgguqADHMODDYIpgn_iVlEkPEvUkUeUMzVz9UrzuEpwDkv1j-s2xw6YXJWnOoNiilzbhcdv68BCsxNSIJwpzpBN_m40)\n\n### Dynamic Diagram\n\nSource: [C4_Dynamic Diagram Sample - bigbankplc.puml](C4_Dynamic%20Diagram%20Sample%20-%20bigbankplc.puml)\n\n[![C4_Dynamic Diagram Sample - bigbankplc - open link](https://www.plantuml.com/plantuml/svg/NPDBRnD13CVl-HIcfmIrYO2Ua13Dew95VKHD2k8KUMUTtH7pMDdUHX7YkpEpIPKkDu_7zlytV-zUYI9hwztWdGt6jIL1hTh8vyc4SJUkhDPjqGgnYK4fwDX4FsaSXjnp8LewMqpcbnVBd7g-lvju52LEgSrY7z1RCsxozC7TzDVZythpytPzixcx_dRzi1YE1eDvcees42-AeRayXxC5AXOeT9RY9tAeDWPqy9g6bQd9OxvTQMGIo6p0L5bHxgh1XcratyNdKAFKL0AsMbDGQmubXgdCHtHo3cWCYO2BLJgGcl7PwCGrD1-obWsLeuibLWJJfd77EHdZExxWoh1j532KC0rLwv3ppPBZYor909s3k8L40BT1YGCf51X-fw6mROCvlD7g7ZI2QKMZ9nPuiPXxBCEE2YWuxeIu1xUPnJQKoFjXaVIcoziUt0Z-303cqJSnKD2X-PHVGgRb97NATrusd65cXA57tgVhza5bfXHRXTnXayMcnb3bGuCYkyZboSQU_CSibFgI2P2VmD4vuZVozp_cIKFqlzkfSt5tMBIyQYVX5FOjdHqjNUr5oMVvluE4l7dgTdYGRmjlLTxk7pHsQrmzFankrklbAlMbhWwtSsoEBbLPcPu-8Ig78yWE7-Vdkkxh5N9a5Dx3bgC_4kzgOkhYW9xW2tpjz1QpUUg_eb3ct-CV \"C4_Dynamic Diagram Sample - bigbankplc\")](https://www.plantuml.com/plantuml/uml/NPDBRnD13CVl-HIcfmIrYO2Ua13Dew95VKHD2k8KUMUTtH7pMDdUHX7YkpEpIPKkDu_7zlytV-zUYI9hwztWdGt6jIL1hTh8vyc4SJUkhDPjqGgnYK4fwDX4FsaSXjnp8LewMqpcbnVBd7g-lvju52LEgSrY7z1RCsxozC7TzDVZythpytPzixcx_dRzi1YE1eDvcees42-AeRayXxC5AXOeT9RY9tAeDWPqy9g6bQd9OxvTQMGIo6p0L5bHxgh1XcratyNdKAFKL0AsMbDGQmubXgdCHtHo3cWCYO2BLJgGcl7PwCGrD1-obWsLeuibLWJJfd77EHdZExxWoh1j532KC0rLwv3ppPBZYor909s3k8L40BT1YGCf51X-fw6mROCvlD7g7ZI2QKMZ9nPuiPXxBCEE2YWuxeIu1xUPnJQKoFjXaVIcoziUt0Z-303cqJSnKD2X-PHVGgRb97NATrusd65cXA57tgVhza5bfXHRXTnXayMcnb3bGuCYkyZboSQU_CSibFgI2P2VmD4vuZVozp_cIKFqlzkfSt5tMBIyQYVX5FOjdHqjNUr5oMVvluE4l7dgTdYGRmjlLTxk7pHsQrmzFankrklbAlMbhWwtSsoEBbLPcPu-8Ig78yWE7-Vdkkxh5N9a5Dx3bgC_4kzgOkhYW9xW2tpjz1QpUUg_eb3ct-CV)\n\n### Sequence Diagram\n\nSource: [C4_Sequence Diagram Sample - bigbankplc.puml](C4_Sequence%20Diagram%20Sample%20-%20bigbankplc.puml)\n\n[![C4_Sequence Diagram Sample - bigbankplc - open link](https://www.plantuml.com/plantuml/svg/NL9BRnCn4BxdLmmv1PGc0df2GZIFYXRr4NKB7ADPxsJNmXulzhXH_psURQE6tEnvV8_FlaY2KR9tetUMZSiDGIVIfo_pUSJzhBNIvJedYYQm4ClC13_l7RBkd2LfdAtdg_EpZPP-tjxCFIQXM4hRYlvcOaEpNk57gmA0bYbEpCSfZ2lBhQEp3RO4Yxvtrg3OmEFI-e5FM9beUm7a1XRSPeTHEviOdcn32T0v23kGZk2Q2n-JG8tyfu32BhDHA7HMda42c9maU8e9dYpgZesmfnhg6FR5sMpy_aZTTXaoDnYV9tKXN6okZzMLIO1Ly7rWOfcOJuEHbk6QGH5YS8xYMAjzL2stlrRmG4bEkWld2ZLehaaL9iMmN8x_Mrg-MggUIwX-Tah_MOd8v5YCljMFw9U4V9pRIJOFv52eEIZG3SjJC1rogvSUKzg7sAGfa1YbFuIplUHcSXpRkfwOyyAqHi4Q4ochmh-GmQ4CbUd8etOh2P5UCe18hKqITLfps8NeX_CKEamTDO1PEc9vVGOmaHgzeYlIq1XA2LnettIE2lVmprwUADVUIZfU0md3Lwlkx-PNZu-RgYpfZiuFkQxGbIcR5c_CL2n3uCDacHei9t9a13x0BWR_-gRxZY8DPqPFy1M-3MphvQfiZwgh-z_RcyllbtVh4k85SPEz-mS0 \"C4_Sequence Diagram Sample - bigbankplc\")](https://www.plantuml.com/plantuml/uml/NL9BRnCn4BxdLmmv1PGc0df2GZIFYXRr4NKB7ADPxsJNmXulzhXH_psURQE6tEnvV8_FlaY2KR9tetUMZSiDGIVIfo_pUSJzhBNIvJedYYQm4ClC13_l7RBkd2LfdAtdg_EpZPP-tjxCFIQXM4hRYlvcOaEpNk57gmA0bYbEpCSfZ2lBhQEp3RO4Yxvtrg3OmEFI-e5FM9beUm7a1XRSPeTHEviOdcn32T0v23kGZk2Q2n-JG8tyfu32BhDHA7HMda42c9maU8e9dYpgZesmfnhg6FR5sMpy_aZTTXaoDnYV9tKXN6okZzMLIO1Ly7rWOfcOJuEHbk6QGH5YS8xYMAjzL2stlrRmG4bEkWld2ZLehaaL9iMmN8x_Mrg-MggUIwX-Tah_MOd8v5YCljMFw9U4V9pRIJOFv52eEIZG3SjJC1rogvSUKzg7sAGfa1YbFuIplUHcSXpRkfwOyyAqHi4Q4ochmh-GmQ4CbUd8etOh2P5UCe18hKqITLfps8NeX_CKEamTDO1PEc9vVGOmaHgzeYlIq1XA2LnettIE2lVmprwUADVUIZfU0md3Lwlkx-PNZu-RgYpfZiuFkQxGbIcR5c_CL2n3uCDacHei9t9a13x0BWR_-gRxZY8DPqPFy1M-3MphvQfiZwgh-z_RcyllbtVh4k85SPEz-mS0)\n\n### Deployment Diagram\n\nSource: [C4_Deployment Diagram Sample - bigbankplc.puml](C4_Deployment%20Diagram%20Sample%20-%20bigbankplc.puml)\n\n[![Deployment Diagram for Internet Banking System - Live - open link](https://www.plantuml.com/plantuml/svg/pLP_J-D64Fq_dsAQLkA7W41AArJff0i9FK24H3YKLgg4nhiJPylQQ-sk0sbrtxqpSgW9ILle_LCZHTxnl9atRsTs-HWY-bZbjWNmbIcKhJJ1BCOo_D3fU7myo4oSLMaLo2jNH2hYWN9vfxHO26e_H6rDskaVxu_5T3kywkGO8dastG-ej6wH2wYK55jG5OmM0yGPmTHPwnvDaO4r1G4M6bO-6n_upG5d1-iKMhjeRJKqDsHezRG-ioI62MRRxIbZKbGFxJtu9itwpZh_eVsrEfI_zevutv1Tyupq55TznIeSdwt7tvuC1jzn1ER3l5HbCP86Inbn4IO8PGtRgAAPonSm1LZM1IJ83eEkUh-CRYVtTnUJy_khiqzdruDj3XPDj0HDKJ0mc7dCMIaF5oo_BoZ2AHOF8bgoOA5ps8ShCwTMgu7TNpjDswLLUz0-DHa807ZPVhK6ZH51aGHkx_pH0dvUHz45WrAJfOpPnzBixkx-6fzE9DHjMd4JmD7t1uV7S3L9daDi2eCbgXang2Sl11ENAupjrmOuENXgmjHFtnKHMJRFGOm0nXVGAqjhsD-uGc9SuXn1sYSflIWp_Aalvh5tSwCfh4itvKOKC5eJ5p0tZ8RBP7JTEPzCnWbmYWFUN5W-drlrxwR2bjBezF3eXL2oVAz4pgEo8j58NWZsOUnDZdxHRcn7NVMtyWpIRPsowm0ZfXX8ODpTMDS9psP8MEuSvMiIdIVfLVBWAJCXUXHlC0KtN8xolWSp33FIW5MSCTUbwg0yQLcY3Nk0Ib48O5t62uhg_U9rLyNhRXHFHXEpyA4PrXtuDpsxBmLDIBb2hqlwpu7NLUx-NsHU8_vMuTENWZzIMe_ryNyRw-uNpZNdPy0TfM-Swm5PCoSVWAM24DbTmV9s4cynhuzyu1zBK696W4sQJQtwUVqmpPrGx5SXkfpyLW0s60wdQMuKrVMMbjEE4d0UUeNspcWfURNK6iRkmnhFA07_Z3boXIk75e8rkP7B8rHfe0XkkbxP-c4M7QWbpI0dcs2CN-NBHMygKhcyNArIB9NS3iBOUEM2cqQuCuLsZq48rLNdg4RI9vjxpRCl-UKEdzOh2VZ9ETcH_ioxd2KPkj-DjGW_6azJzxItZ9tWbAKHKOT6-Ph0cSv8qgstKYXH9gxUwp5cjAcb4kLDMRTAhyWgYtvLU6k_J6lkPrXMpKetJNL3zgy6gE-o8JvmGhdH56SD752O_1PSKTz4Z1OGL_K-nFrjFLGCN9aN9mn1DHlyWcgDh2zPBTr-GwW3JBtBHIfuz2RISyBBmMb_5T1z0sBZUILqR_XGROBK6yP8ZH4Ppawjv7nqr_odz94ANUNsJm00 \"Deployment Diagram for Internet Banking System - Live\")](https://www.plantuml.com/plantuml/uml/pLP_J-D64Fq_dsAQLkA7W41AArJff0i9FK24H3YKLgg4nhiJPylQQ-sk0sbrtxqpSgW9ILle_LCZHTxnl9atRsTs-HWY-bZbjWNmbIcKhJJ1BCOo_D3fU7myo4oSLMaLo2jNH2hYWN9vfxHO26e_H6rDskaVxu_5T3kywkGO8dastG-ej6wH2wYK55jG5OmM0yGPmTHPwnvDaO4r1G4M6bO-6n_upG5d1-iKMhjeRJKqDsHezRG-ioI62MRRxIbZKbGFxJtu9itwpZh_eVsrEfI_zevutv1Tyupq55TznIeSdwt7tvuC1jzn1ER3l5HbCP86Inbn4IO8PGtRgAAPonSm1LZM1IJ83eEkUh-CRYVtTnUJy_khiqzdruDj3XPDj0HDKJ0mc7dCMIaF5oo_BoZ2AHOF8bgoOA5ps8ShCwTMgu7TNpjDswLLUz0-DHa807ZPVhK6ZH51aGHkx_pH0dvUHz45WrAJfOpPnzBixkx-6fzE9DHjMd4JmD7t1uV7S3L9daDi2eCbgXang2Sl11ENAupjrmOuENXgmjHFtnKHMJRFGOm0nXVGAqjhsD-uGc9SuXn1sYSflIWp_Aalvh5tSwCfh4itvKOKC5eJ5p0tZ8RBP7JTEPzCnWbmYWFUN5W-drlrxwR2bjBezF3eXL2oVAz4pgEo8j58NWZsOUnDZdxHRcn7NVMtyWpIRPsowm0ZfXX8ODpTMDS9psP8MEuSvMiIdIVfLVBWAJCXUXHlC0KtN8xolWSp33FIW5MSCTUbwg0yQLcY3Nk0Ib48O5t62uhg_U9rLyNhRXHFHXEpyA4PrXtuDpsxBmLDIBb2hqlwpu7NLUx-NsHU8_vMuTENWZzIMe_ryNyRw-uNpZNdPy0TfM-Swm5PCoSVWAM24DbTmV9s4cynhuzyu1zBK696W4sQJQtwUVqmpPrGx5SXkfpyLW0s60wdQMuKrVMMbjEE4d0UUeNspcWfURNK6iRkmnhFA07_Z3boXIk75e8rkP7B8rHfe0XkkbxP-c4M7QWbpI0dcs2CN-NBHMygKhcyNArIB9NS3iBOUEM2cqQuCuLsZq48rLNdg4RI9vjxpRCl-UKEdzOh2VZ9ETcH_ioxd2KPkj-DjGW_6azJzxItZ9tWbAKHKOT6-Ph0cSv8qgstKYXH9gxUwp5cjAcb4kLDMRTAhyWgYtvLU6k_J6lkPrXMpKetJNL3zgy6gE-o8JvmGhdH56SD752O_1PSKTz4Z1OGL_K-nFrjFLGCN9aN9mn1DHlyWcgDh2zPBTr-GwW3JBtBHIfuz2RISyBBmMb_5T1z0sBZUILqR_XGROBK6yP8ZH4Ppawjv7nqr_odz94ANUNsJm00)\n\n**with details**\n\nSource: [C4_Deployment Diagram Sample - bigbankplc-details.puml](C4_Deployment%20Diagram%20Sample%20-%20bigbankplc-details.puml)\n\n[![Deployment Diagram for Internet Banking System - Live with details - open link](https://www.plantuml.com/plantuml/svg/vLTxR-964F-VJp6bbOwSo2CqLqMLJZe2z98J70YJorMgXDRhmMnlxRLsroIqkk_U6TkS8P1xg5LLgKGYzdWUyvlVp7XvvRomFazq0-0xbKgTHmXBxpFty-cf5VSdiVBBFCmTMcbIZwa_aIOvpRH8sUhO-KYhyBHtSJnXqUreU9e8vz6IQDx7J9jrmaOPXtW6UKhMB02_H5WOhSszIcFGAaKGQGGxZvLrT6M0eeCsKcYz9X-VqZmGeT6Dee565in4t6eko2OKyaEp3J-4SSzeOryslvTd_DSyOkqfwZrDZmz-LvUbdED6Ul7ZPR__WZmqxgW-9lSJQpAqVdsD8aBReWVFW1AMkHOU8z0O8w5JZh54q1BIgrNnHAMWgM151Ox8QDZzTNmxcz_TpAxdmy7hmTi-E_FAQuGQBVILYAr8g8GMReWNcwA7Av5-u6e6Qs8WWMCOgXKs6hNP_As9i9LfsOOcFslI_oiL5uP0uiVt40alG287Q1xzsG3wKCqsO5lD8R7YbKd9aAxJoAG5YrEg0YL2zM6BH_7dmrQKadweuf3Y78jCFN_-_3V_SCbURiESEWlEVpevku3XB61P5-un18TsXHOiEiNEgNBS9TkF5i8cRH1IekCghvI0Nrx0rSthuvi9-Hgvams8FI1ln4h0ExIk0dD9kHzKV9yyyFCNvvtHqogELSxFEXUrpg4oY4p89JB0uW9c9g5oDXyBuFBaeH2cG25IS2Qt4g58UJ3OAi0EFFxqJEe5DPQbK8ezJ6wWcsLQrQonbuAp8BDSrT6x7ei9pKf5wFQRQq4ppCP2AxykQYpWJJ1-Utezcqq2e10dMw0_Dehlh-cS9xkbQfGeF3lVQXk-VQfXPbGxWfC8kovQE1GEzsfqC9QnGcgcP5nSq0nDIZ_DMdRUaO-2j47JDDMXlaH7Fsn58RdeLmRiRefQb7M5ZHW2Qe94yDF06ukyFOe9Y9Npjj06bIwCJOhhDYo5Ms848lTBmbIn3D9YnBT2kyrqW3OntQ2NtqpMvsTxkiLMPvUjpkVOSYYf2GxonGjPnEvblQAFu6aAfnM5dMqEWyBxGHQxTUWsE4-J4Exbq2wtDk_QXL3Qa0Yot6R6eGEJwlMNajmdl_DVONy_yVr--6VMFhL6kDqIjBVAlN_n_zhxqshlT_wLnKzAvE4EmwzS_7taLMPTKMFdILr2TV9ZRHRllnCSVMc4JCG8eWvpQBTyt3-F98PJxENEcmJjCmSaKEGkmfMInNHmwXHs782nq4qZQrJ4a7UXbcQaFYhjoOgDtuj44CATjve0hHB5vo-NXuwGc0KZ-zBRpXkGLPgEsunjbDtDbq0V0YbDaksYP4dE1olEM5bfd5buk5CqJlUE4ofH9qAEWmtOnrv3IxfeAuQl-Avq-DeOPgItj1Ij3IFpXzAQna9PN9Y7TkKx43GwYeiwKjAM2GoY63dSVYkvJF0kAhcU4DU7MYgGLcLbgtJJEDV2xXPUwxzNQsxw2ZLLkcwgAUfF3L0UTaRY0mNa8u-ag8uSSYQ_EvEMHnMoPYD2zMqMyzjogCXmPrvCWKhM16-bMiKgmaHXzHPri21sYbBTM-Ln4_1D_wgtQz3v6ej3cvpJdTBhfdPI4eQkFDfxGqgDu7fyL__OU8LfnB-b_W80 \"Deployment Diagram for Internet Banking System - Live with details\")](https://www.plantuml.com/plantuml/uml/vLTxR-964F-VJp6bbOwSo2CqLqMLJZe2z98J70YJorMgXDRhmMnlxRLsroIqkk_U6TkS8P1xg5LLgKGYzdWUyvlVp7XvvRomFazq0-0xbKgTHmXBxpFty-cf5VSdiVBBFCmTMcbIZwa_aIOvpRH8sUhO-KYhyBHtSJnXqUreU9e8vz6IQDx7J9jrmaOPXtW6UKhMB02_H5WOhSszIcFGAaKGQGGxZvLrT6M0eeCsKcYz9X-VqZmGeT6Dee565in4t6eko2OKyaEp3J-4SSzeOryslvTd_DSyOkqfwZrDZmz-LvUbdED6Ul7ZPR__WZmqxgW-9lSJQpAqVdsD8aBReWVFW1AMkHOU8z0O8w5JZh54q1BIgrNnHAMWgM151Ox8QDZzTNmxcz_TpAxdmy7hmTi-E_FAQuGQBVILYAr8g8GMReWNcwA7Av5-u6e6Qs8WWMCOgXKs6hNP_As9i9LfsOOcFslI_oiL5uP0uiVt40alG287Q1xzsG3wKCqsO5lD8R7YbKd9aAxJoAG5YrEg0YL2zM6BH_7dmrQKadweuf3Y78jCFN_-_3V_SCbURiESEWlEVpevku3XB61P5-un18TsXHOiEiNEgNBS9TkF5i8cRH1IekCghvI0Nrx0rSthuvi9-Hgvams8FI1ln4h0ExIk0dD9kHzKV9yyyFCNvvtHqogELSxFEXUrpg4oY4p89JB0uW9c9g5oDXyBuFBaeH2cG25IS2Qt4g58UJ3OAi0EFFxqJEe5DPQbK8ezJ6wWcsLQrQonbuAp8BDSrT6x7ei9pKf5wFQRQq4ppCP2AxykQYpWJJ1-Utezcqq2e10dMw0_Dehlh-cS9xkbQfGeF3lVQXk-VQfXPbGxWfC8kovQE1GEzsfqC9QnGcgcP5nSq0nDIZ_DMdRUaO-2j47JDDMXlaH7Fsn58RdeLmRiRefQb7M5ZHW2Qe94yDF06ukyFOe9Y9Npjj06bIwCJOhhDYo5Ms848lTBmbIn3D9YnBT2kyrqW3OntQ2NtqpMvsTxkiLMPvUjpkVOSYYf2GxonGjPnEvblQAFu6aAfnM5dMqEWyBxGHQxTUWsE4-J4Exbq2wtDk_QXL3Qa0Yot6R6eGEJwlMNajmdl_DVONy_yVr--6VMFhL6kDqIjBVAlN_n_zhxqshlT_wLnKzAvE4EmwzS_7taLMPTKMFdILr2TV9ZRHRllnCSVMc4JCG8eWvpQBTyt3-F98PJxENEcmJjCmSaKEGkmfMInNHmwXHs782nq4qZQrJ4a7UXbcQaFYhjoOgDtuj44CATjve0hHB5vo-NXuwGc0KZ-zBRpXkGLPgEsunjbDtDbq0V0YbDaksYP4dE1olEM5bfd5buk5CqJlUE4ofH9qAEWmtOnrv3IxfeAuQl-Avq-DeOPgItj1Ij3IFpXzAQna9PN9Y7TkKx43GwYeiwKjAM2GoY63dSVYkvJF0kAhcU4DU7MYgGLcLbgtJJEDV2xXPUwxzNQsxw2ZLLkcwgAUfF3L0UTaRY0mNa8u-ag8uSSYQ_EvEMHnMoPYD2zMqMyzjogCXmPrvCWKhM16-bMiKgmaHXzHPri21sYbBTM-Ln4_1D_wgtQz3v6ej3cvpJdTBhfdPI4eQkFDfxGqgDu7fyL__OU8LfnB-b_W80)\n\n## Styles\n\nSource: [C4_Container Diagram Sample - bigbankplc-styles.puml](C4_Container%20Diagram%20Sample%20-%20bigbankplc-styles.puml)\n\n[![Container diagram for Internet Banking System - open link](https://www.plantuml.com/plantuml/svg/hLPFRzl64xthKynFoK46Q0i_fBaKC11POXi7agMASjr30M58ZgX5bhl4xj1_KFIxTvQcILDEaKDwCRYpE-yzFxuTyPDdT5oNUlG_PJ9TvmH7vih_F9qwVBWe51_hjFRaCckO35zajfnM6ateEVUSQvLEvp-TRqBfThMSbkYPd9JsS-b0PSXTL05_b7nUt-qtyJPPt-pNjxlbzKqyEHlDyZpML0hq3el9ECNiAvcywnr7yFuWYxdLrbs-ZvVnAhxPxNzPov_vUhdUodvQFE-Etttuy74n-nXw_14hkenLSUH4vPGdOJqvanrDXH3iw94lNzWWUw7xqr1e0HzwneswBUb66VedamLebjPMpcoxNTzrEhGW_Ej6ma-QBXVeZvGlbH4j0_G0FlrlA2npJp5YnPgWynDoXON34WxMmRLXSeOOhj1yLQQ0vCapbQFHXfotPfBLdcr9Be9vzpIUmKiPx07uI91ATmGF4XMecaRKJGqmosnjs8z5npFq_aeAERgdIVP_mJeLC3w3lqO0qEkTF52wnwgImtUKmgogjCgGbJLZANt1UumWgLmGl_fz7ceBqkfUP3JIFClP3Dhm0fgyANUywSi_lfc9o26phr3W4jdMTBx1WWBx2skIELLn13DJr1fTA6-SlLSvUK2jlyrog4qMfADM_0HiEoSzt2iCFSg1_CEGEllWoRsHLDfKQMhzM8L59sh-Be8_i4InOYW6j2eLKmw-JZqnsCCFY7iM03dTgunEvItIIOwCANeAxw5z36gItvOmMBDrv27C5N1KACyE0pSe8xaic-S8Zirb0Qpv29cZd0mhr3uAkIBlGTj25iJPnHkZseijJgaGsStrjvEpi7BCzNq3vxxZK315W9lhYeM_V3EwHDJVNUxZHvvGYKhlVLCGelXy9UlspWNctP50DQIeOQKoPxqzCCIFsH5DGV3SAR2lC5jjFQfWceF3aaukTMzxayys1PaKeCLuRJvWQclk8n1rTpa2TcWyDaxqze-sf5_DY_xMtdhoWVlpRhT9vE3mdA_mksVQqFTmBTt-9ipgrFOpee7h9q2Br1G7WUW8cu4RmHVvIPesvFtRRBPQX5x1Zm7jhwIvbzrVbY7ebZ3tS72sR0RMWrDC7jW6efPdSJKNo0xpbLid8Ki4rWETXsg3qGiPvl54mx2lzfAFdZvPxJO2D7W7W_QJLFO-zJzpCgrMorEl-cs1V_vWMCQ_nZSB-L3u9EZXE-8V \"Container diagram for Internet Banking System\")](https://www.plantuml.com/plantuml/uml/hLPFRzl64xthKynFoK46Q0i_fBaKC11POXi7agMASjr30M58ZgX5bhl4xj1_KFIxTvQcILDEaKDwCRYpE-yzFxuTyPDdT5oNUlG_PJ9TvmH7vih_F9qwVBWe51_hjFRaCckO35zajfnM6ateEVUSQvLEvp-TRqBfThMSbkYPd9JsS-b0PSXTL05_b7nUt-qtyJPPt-pNjxlbzKqyEHlDyZpML0hq3el9ECNiAvcywnr7yFuWYxdLrbs-ZvVnAhxPxNzPov_vUhdUodvQFE-Etttuy74n-nXw_14hkenLSUH4vPGdOJqvanrDXH3iw94lNzWWUw7xqr1e0HzwneswBUb66VedamLebjPMpcoxNTzrEhGW_Ej6ma-QBXVeZvGlbH4j0_G0FlrlA2npJp5YnPgWynDoXON34WxMmRLXSeOOhj1yLQQ0vCapbQFHXfotPfBLdcr9Be9vzpIUmKiPx07uI91ATmGF4XMecaRKJGqmosnjs8z5npFq_aeAERgdIVP_mJeLC3w3lqO0qEkTF52wnwgImtUKmgogjCgGbJLZANt1UumWgLmGl_fz7ceBqkfUP3JIFClP3Dhm0fgyANUywSi_lfc9o26phr3W4jdMTBx1WWBx2skIELLn13DJr1fTA6-SlLSvUK2jlyrog4qMfADM_0HiEoSzt2iCFSg1_CEGEllWoRsHLDfKQMhzM8L59sh-Be8_i4InOYW6j2eLKmw-JZqnsCCFY7iM03dTgunEvItIIOwCANeAxw5z36gItvOmMBDrv27C5N1KACyE0pSe8xaic-S8Zirb0Qpv29cZd0mhr3uAkIBlGTj25iJPnHkZseijJgaGsStrjvEpi7BCzNq3vxxZK315W9lhYeM_V3EwHDJVNUxZHvvGYKhlVLCGelXy9UlspWNctP50DQIeOQKoPxqzCCIFsH5DGV3SAR2lC5jjFQfWceF3aaukTMzxayys1PaKeCLuRJvWQclk8n1rTpa2TcWyDaxqze-sf5_DY_xMtdhoWVlpRhT9vE3mdA_mksVQqFTmBTt-9ipgrFOpee7h9q2Br1G7WUW8cu4RmHVvIPesvFtRRBPQX5x1Zm7jhwIvbzrVbY7ebZ3tS72sR0RMWrDC7jW6efPdSJKNo0xpbLid8Ki4rWETXsg3qGiPvl54mx2lzfAFdZvPxJO2D7W7W_QJLFO-zJzpCgrMorEl-cs1V_vWMCQ_nZSB-L3u9EZXE-8V)\n\n## Icons\n\nSource: [C4_Container Diagram Sample - bigbankplc-icons.puml](C4_Container%20Diagram%20Sample%20-%20bigbankplc-icons.puml)\n\n[![Container diagram for Internet Banking System - open link](https://www.plantuml.com/plantuml/svg/hLLDS-D44BtxLpJXWBVAZei2BfpMiGt94d-mSZRBITMIslQmenanFRBNHV7VwL5aoN8s5IYuUNgwNp-zVZr-onwTBtFT-qgPL9SPmSxxWdySZHmUhhVAxygaP7AfDPwClqvjFYeqcb0pP9zfbOmctmzN8VGmln_bo9wSXEA9LA0ovAwB2Z-ZZPnWEljmDraked_GnvS5Pkwxjf-Is-56CePSEEM9J-qoseSxRhhyj5oinu-pQ3cV_Q-DgXWUY6rEmnzwtq1f120N8F0xWetLsXwKsO8EBD1aqBbMZkMN1I40sgQezL4m6kcVgrPVjRADq6nBZIzUPzORyY_T_evxVEakvpzqpEJs5xqxOevUJI2p9sqBUagHhxiV_xPyMCVhvIgUBXyN_JTjR1p5qI-pzUHMWdNeyMvz6z_FVfujfXBiUUKrGICAP0gt3dCHsi6TyUGCURX1yobe7XtPKzxhhSYnDVsqP6zpSWEODB-knd0AWzrKGqcaUW07CGOKLI7gAWQOfhOqdg-4nnDqV2E13DsndtuhM9S4hjx0dpq0QFds3vJ4M1II_4W9Z8j2gnIzikPAGkza6WE82XV8ppzCGcnAMed0N55ZBxafr5ODTgh2JT_azE6hSQWDqnMoNGPSe5n5agPfkC8j1HQdxb7gLE47C7uoLGYldDshZ1XGwoztsuZdlGewANy4Rnj56VOAGuro81yEYRC7fWgrTkqpThbDbAPQedauDFmcNm_W8-OewdHvWLQvyfG1bmcJbpd-1vvF1A1wG2ZqULgWIwBJf9-XnmIPmf3gdo4_-lKUEcTl7N7OS0UEjegzgmOEoeXfy-ht07R8Eye0It5TwYWZunLg7WJJ4JDekvK3-VGwOER7PZUVIvXW-ebC9XgguE_LtPTjDhMIvjgwZgQlQ1Va4k1Gqf3ugrcAsMVVfnoLCAm2aZKRpkLSBsGeMyk0LDK4DSnLwYpRZOVPvtGdrY3W9lFqVaYBC_oQLzj1yCt6OKuNsz-E81Zuv8rK0istdGq2CB6bRuqnQ9P-0DwXOQnKE8r27eBtfCyUbdQz7vWuzBvThrUH97RpkC1NSpgh45BhTl62r7QNsFOngU3Qfw96ge8TCpGDaOyc7S2xQBaOdJTlM_xBolX6ibjYxMfqKTuJPWmRP_FgxJfKVwNWRK2kWQSt4u5iCC_qkB1K9B0CD0pH2gCbqdLVXyDbNSdYWBPzD5-l1AYZSgUywxjMcAf-LAlpSNxVYFDMIijS_mq0 \"Container diagram for Internet Banking System\")](https://www.plantuml.com/plantuml/uml/hLLDS-D44BtxLpJXWBVAZei2BfpMiGt94d-mSZRBITMIslQmenanFRBNHV7VwL5aoN8s5IYuUNgwNp-zVZr-onwTBtFT-qgPL9SPmSxxWdySZHmUhhVAxygaP7AfDPwClqvjFYeqcb0pP9zfbOmctmzN8VGmln_bo9wSXEA9LA0ovAwB2Z-ZZPnWEljmDraked_GnvS5Pkwxjf-Is-56CePSEEM9J-qoseSxRhhyj5oinu-pQ3cV_Q-DgXWUY6rEmnzwtq1f120N8F0xWetLsXwKsO8EBD1aqBbMZkMN1I40sgQezL4m6kcVgrPVjRADq6nBZIzUPzORyY_T_evxVEakvpzqpEJs5xqxOevUJI2p9sqBUagHhxiV_xPyMCVhvIgUBXyN_JTjR1p5qI-pzUHMWdNeyMvz6z_FVfujfXBiUUKrGICAP0gt3dCHsi6TyUGCURX1yobe7XtPKzxhhSYnDVsqP6zpSWEODB-knd0AWzrKGqcaUW07CGOKLI7gAWQOfhOqdg-4nnDqV2E13DsndtuhM9S4hjx0dpq0QFds3vJ4M1II_4W9Z8j2gnIzikPAGkza6WE82XV8ppzCGcnAMed0N55ZBxafr5ODTgh2JT_azE6hSQWDqnMoNGPSe5n5agPfkC8j1HQdxb7gLE47C7uoLGYldDshZ1XGwoztsuZdlGewANy4Rnj56VOAGuro81yEYRC7fWgrTkqpThbDbAPQedauDFmcNm_W8-OewdHvWLQvyfG1bmcJbpd-1vvF1A1wG2ZqULgWIwBJf9-XnmIPmf3gdo4_-lKUEcTl7N7OS0UEjegzgmOEoeXfy-ht07R8Eye0It5TwYWZunLg7WJJ4JDekvK3-VGwOER7PZUVIvXW-ebC9XgguE_LtPTjDhMIvjgwZgQlQ1Va4k1Gqf3ugrcAsMVVfnoLCAm2aZKRpkLSBsGeMyk0LDK4DSnLwYpRZOVPvtGdrY3W9lFqVaYBC_oQLzj1yCt6OKuNsz-E81Zuv8rK0istdGq2CB6bRuqnQ9P-0DwXOQnKE8r27eBtfCyUbdQz7vWuzBvThrUH97RpkC1NSpgh45BhTl62r7QNsFOngU3Qfw96ge8TCpGDaOyc7S2xQBaOdJTlM_xBolX6ibjYxMfqKTuJPWmRP_FgxJfKVwNWRK2kWQSt4u5iCC_qkB1K9B0CD0pH2gCbqdLVXyDbNSdYWBPzD5-l1AYZSgUywxjMcAf-LAlpSNxVYFDMIijS_mq0)\n\n## Themes\n\nSource: [C4_Container Diagram Sample - bigbankplc-themes.puml](C4_Container%20Diagram%20Sample%20-%20bigbankplc-themes.puml)\n\n[![Container diagram for Internet Banking System - open link](https://www.plantuml.com/plantuml/svg/fLHDZzis4BthLqotXte1sKQ1d8gYoFgZJO9rrbrjcjoC4JMsYL2aG8xiB8h-zmvfhsGv0OAY9vjFCsyU7n_vEZ1wRckJ_GIyfvfWwrqDyrVZWYkZInWzxGb-E7sIMfPVox370EoW99WjVtzuN0B7AcsLQQkBkZ2vpKwzmhXfhMQgJWD-dR-QfW_Xjoph6lVCJVXbElLudEmqxzko3UILiona4-NgQMFGHhdZaEHDHUWwGXzMzzCQ0vCNQ3EN3jIM_AI9MyjOio7eKAWqxZpMi7KUtWgvjyGmG_jPsnqKpq7KPzcQV71sfDh0hYQVmxpxTtC7Bp2uRTfyATqv74KqDAaHJS80bNAjvN1pcsKdwirCW0hzyqZzB5pN0cvkuUyC07gzeoEL6smQAVv89TmrZT4AMJjx8z0xF60EHUEZ-DLVyuWjoEY3o4ZI0akjWhEDWBPAS3UtVDdu-av43YU71eMkaC-6nclSKPp-ChLGNZUSmvtTjGPzXDVU7NH50T2ORq_PjbP5wMWqFmExpia01usnHtkG3KFftJ6G_qfIxKfjwEp7AYuwKVCVS_Y4DOeLGp5WT9t25zeo4CkX_Gzn9m5GqK4hkfQtA4SLCfOOA9x3-MzKK_nv3uCrEqy1OiB1qqu7zkbCGLl9PPt-v_6cxKKtjhm7vQaYonfDo6EkA0GmRYSBOZNvogWIrMUobJYbOsJNRx-Td8MJCj_t3PpxZaFH526MqVzqwLv-uH7LgCqc943ebkELhE5K4FdZew8JDHfOQULTS5k6vHUrHxiZE7KAxGNdMK7FAfnswx6cgwlRcvjIU3vh9K2tYmkB0KlNSd_GUNTZSs2FDc3QRszozaZcubNex-Q7G27EVlFqj2waS5WN6lnkpI3QiVGyRlEUz6vVklubI7JzFJyp9N1mxDr03CzMvV2kU7W_lHpUZ_oFdPkPLFV2-j0FMHu9gv3U_FJm7Brc2i0kCf-95xEvK7QS5tvSnQWGsW0qZcZYw8KC4dUjOTZN1ab0FxvOFQs5QE3oe7sOkzwOr3yzk_DfTT-PanLl7ZvkxfT_BDylHhVPQs5gQ_Cl \"Container diagram for Internet Banking System\")](https://www.plantuml.com/plantuml/uml/fLHDZzis4BthLqotXte1sKQ1d8gYoFgZJO9rrbrjcjoC4JMsYL2aG8xiB8h-zmvfhsGv0OAY9vjFCsyU7n_vEZ1wRckJ_GIyfvfWwrqDyrVZWYkZInWzxGb-E7sIMfPVox370EoW99WjVtzuN0B7AcsLQQkBkZ2vpKwzmhXfhMQgJWD-dR-QfW_Xjoph6lVCJVXbElLudEmqxzko3UILiona4-NgQMFGHhdZaEHDHUWwGXzMzzCQ0vCNQ3EN3jIM_AI9MyjOio7eKAWqxZpMi7KUtWgvjyGmG_jPsnqKpq7KPzcQV71sfDh0hYQVmxpxTtC7Bp2uRTfyATqv74KqDAaHJS80bNAjvN1pcsKdwirCW0hzyqZzB5pN0cvkuUyC07gzeoEL6smQAVv89TmrZT4AMJjx8z0xF60EHUEZ-DLVyuWjoEY3o4ZI0akjWhEDWBPAS3UtVDdu-av43YU71eMkaC-6nclSKPp-ChLGNZUSmvtTjGPzXDVU7NH50T2ORq_PjbP5wMWqFmExpia01usnHtkG3KFftJ6G_qfIxKfjwEp7AYuwKVCVS_Y4DOeLGp5WT9t25zeo4CkX_Gzn9m5GqK4hkfQtA4SLCfOOA9x3-MzKK_nv3uCrEqy1OiB1qqu7zkbCGLl9PPt-v_6cxKKtjhm7vQaYonfDo6EkA0GmRYSBOZNvogWIrMUobJYbOsJNRx-Td8MJCj_t3PpxZaFH526MqVzqwLv-uH7LgCqc943ebkELhE5K4FdZew8JDHfOQULTS5k6vHUrHxiZE7KAxGNdMK7FAfnswx6cgwlRcvjIU3vh9K2tYmkB0KlNSd_GUNTZSs2FDc3QRszozaZcubNex-Q7G27EVlFqj2waS5WN6lnkpI3QiVGyRlEUz6vVklubI7JzFJyp9N1mxDr03CzMvV2kU7W_lHpUZ_oFdPkPLFV2-j0FMHu9gv3U_FJm7Brc2i0kCf-95xEvK7QS5tvSnQWGsW0qZcZYw8KC4dUjOTZN1ab0FxvOFQs5QE3oe7sOkzwOr3yzk_DfTT-PanLl7ZvkxfT_BDylHhVPQs5gQ_Cl)\n"
  },
  {
    "path": "samples/C4_Component Diagram Sample - bigbankplc.puml",
    "content": "@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n' uncomment the following line and comment the first to use locally\n' !include C4_Component.puml\n\nLAYOUT_WITH_LEGEND()\n\ntitle Component diagram for Internet Banking System - API Application\n\nContainer(spa, \"Single Page Application\", \"javascript and angular\", \"Provides all the internet banking functionality to customers via their web browser.\")\nContainer(ma, \"Mobile App\", \"Xamarin\", \"Provides a limited subset ot the internet banking functionality to customers via their mobile mobile device.\")\nContainerDb(db, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\")\nSystem_Ext(mbs, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nContainer_Boundary(api, \"API Application\") {\n    Component(sign, \"Sign In Controller\", \"MVC Rest Controller\", \"Allows users to sign in to the internet banking system\")\n    Component(accounts, \"Accounts Summary Controller\", \"MVC Rest Controller\", \"Provides customers with a summary of their bank accounts\")\n    Component(security, \"Security Component\", \"Spring Bean\", \"Provides functionality related to singing in, changing passwords, etc.\")\n    Component(mbsfacade, \"Mainframe Banking System Facade\", \"Spring Bean\", \"A facade onto the mainframe banking system.\")\n\n    Rel(sign, security, \"Uses\")\n    Rel(accounts, mbsfacade, \"Uses\")\n    Rel(security, db, \"Read & write to\", \"JDBC\")\n    Rel(mbsfacade, mbs, \"Uses\", \"XML/HTTPS\")\n}\n\nRel(spa, sign, \"Uses\", \"JSON/HTTPS\")\nRel(spa, accounts, \"Uses\", \"JSON/HTTPS\")\n\nRel(ma, sign, \"Uses\", \"JSON/HTTPS\")\nRel(ma, accounts, \"Uses\", \"JSON/HTTPS\")\n@enduml\n"
  },
  {
    "path": "samples/C4_Container Diagram Sample - bigbankplc-icons.puml",
    "content": "@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n!define DEVICONS https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons\n!define FONTAWESOME https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/font-awesome-5\n' uncomment the following line and comment the first to use locally\n' !include C4_Container.puml\n!include DEVICONS/angular.puml\n!include DEVICONS/dotnet.puml\n!include DEVICONS/java.puml\n!include DEVICONS/msql_server.puml\n!include FONTAWESOME/server.puml\n!include FONTAWESOME/envelope.puml\n\n' LAYOUT_TOP_DOWN()\n' LAYOUT_AS_SKETCH()\nLAYOUT_WITH_LEGEND()\n\ntitle Container diagram for Internet Banking System\n\nPerson(customer, Customer, \"A customer of the bank, with personal bank accounts\")\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(web_app, \"Web Application\", \"Java, Spring MVC\", \"Delivers the static content and the Internet banking SPA\", \"java\")\n    Container(spa, \"Single-Page App\", \"JavaScript, Angular\", \"Provides all the Internet banking functionality to customers via their web browser\", \"angular\")\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\", \"dotnet\")\n    ContainerDb(database, \"Database\", \"SQL Database\", \"Stores user registration information, hashed auth credentials, access logs, etc.\", \"mysql_server\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\", \"server\")\n}\n\nSystem_Ext(email_system, \"E-Mail System\", \"The internal Microsoft Exchange system\", \"envelope\")\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(customer, web_app, \"Uses\", \"HTTPS\")\nRel(customer, spa, \"Uses\", \"HTTPS\")\nRel(customer, mobile_app, \"Uses\")\n\nRel_Neighbor(web_app, spa, \"Delivers\")\nRel(spa, backend_api, \"Uses\", \"async, JSON/HTTPS\")\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\")\nRel_Back_Neighbor(database, backend_api, \"Reads from and writes to\", \"sync, JDBC\")\n\nRel_Back(customer, email_system, \"Sends e-mails to\")\nRel_Back(email_system, backend_api, \"Sends e-mails using\", \"sync, SMTP\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\")\n@enduml\n"
  },
  {
    "path": "samples/C4_Container Diagram Sample - bigbankplc-styles.puml",
    "content": "@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\nSHOW_PERSON_OUTLINE()\nAddElementTag(\"backendContainer\", $fontColor=$ELEMENT_FONT_COLOR, $bgColor=\"#335DA5\", $shape=EightSidedShape(), $legendText=\"backend container\\neight sided\")\nAddRelTag(\"async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DashedLine())\nAddRelTag(\"sync/async\", $textColor=$ARROW_FONT_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DottedLine())\n\ntitle Container diagram for Internet Banking System\n\nPerson(customer, Customer, \"A customer of the bank, with personal bank accounts\")\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(web_app, \"Web Application\", \"Java, Spring MVC\", \"Delivers the static content and the Internet banking SPA\")\n    Container(spa, \"Single-Page App\", \"JavaScript, Angular\", \"Provides all the Internet banking functionality to customers via their web browser\")\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\")\n    ContainerDb(database, \"Database\", \"SQL Database\", \"Stores user registration information, hashed auth credentials, access logs, etc.\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\", $tags=\"backendContainer\")\n}\n\nSystem_Ext(email_system, \"E-Mail System\", \"The internal Microsoft Exchange system\")\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(customer, web_app, \"Uses\", \"HTTPS\")\nRel(customer, spa, \"Uses\", \"HTTPS\")\nRel(customer, mobile_app, \"Uses\")\n\nRel_Neighbor(web_app, spa, \"Delivers\")\nRel(spa, backend_api, \"Uses\", \"async, JSON/HTTPS\", $tags=\"async\")\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\", $tags=\"async\")\nRel_Back_Neighbor(database, backend_api, \"Reads from and writes to\", \"sync, JDBC\")\n\nRel_Back(customer, email_system, \"Sends e-mails to\")\nRel_Back(email_system, backend_api, \"Sends e-mails using\", \"sync, SMTP\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\", $tags=\"sync/async\")\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "samples/C4_Container Diagram Sample - bigbankplc-themes.puml",
    "content": "@startuml\n' theme from C4-Stdlib (The !theme statement has to be BEFORE the !include statements.)\n!theme C4_united from <C4/themes>\n\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n\ntitle Container diagram for Internet Banking System\n\nPerson(customer, Customer, \"A customer of the bank, with personal bank accounts\")\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(web_app, \"Web Application\", \"Java, Spring MVC\", \"Delivers the static content and the Internet banking SPA\")\n    Container(spa, \"Single-Page App\", \"JavaScript, Angular\", \"Provides all the Internet banking functionality to customers via their web browser\")\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\")\n    ContainerDb(database, \"Database\", \"SQL Database\", \"Stores user registration information, hashed auth credentials, access logs, etc.\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\")\n}\n\nSystem_Ext(email_system, \"E-Mail System\", \"The internal Microsoft Exchange system\")\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(customer, web_app, \"Uses\", \"HTTPS\")\nRel(customer, spa, \"Uses\", \"HTTPS\")\nRel(customer, mobile_app, \"Uses\")\n\nRel_Neighbor(web_app, spa, \"Delivers\")\nRel(spa, backend_api, \"Uses\", \"async, JSON/HTTPS\")\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\")\nRel_Back_Neighbor(database, backend_api, \"Reads from and writes to\", \"sync, JDBC\")\n\nRel_Back(customer, email_system, \"Sends e-mails to\")\nRel_Back(email_system, backend_api, \"Sends e-mails using\", \"sync, SMTP\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\")\n\nSHOW_LEGEND()\n@enduml"
  },
  {
    "path": "samples/C4_Container Diagram Sample - bigbankplc.puml",
    "content": "@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n' uncomment the following line and comment the first to use locally\n' !include C4_Container.puml\n\n' LAYOUT_TOP_DOWN()\n' LAYOUT_AS_SKETCH()\nLAYOUT_WITH_LEGEND()\n\ntitle Container diagram for Internet Banking System\n\nPerson(customer, Customer, \"A customer of the bank, with personal bank accounts\")\n\nSystem_Boundary(c1, \"Internet Banking\") {\n    Container(web_app, \"Web Application\", \"Java, Spring MVC\", \"Delivers the static content and the Internet banking SPA\")\n    Container(spa, \"Single-Page App\", \"JavaScript, Angular\", \"Provides all the Internet banking functionality to customers via their web browser\")\n    Container(mobile_app, \"Mobile App\", \"C#, Xamarin\", \"Provides a limited subset of the Internet banking functionality to customers via their mobile device\")\n    ContainerDb(database, \"Database\", \"SQL Database\", \"Stores user registration information, hashed auth credentials, access logs, etc.\")\n    Container(backend_api, \"API Application\", \"Java, Docker Container\", \"Provides Internet banking functionality via API\")\n}\n\nSystem_Ext(email_system, \"E-Mail System\", \"The internal Microsoft Exchange system\")\nSystem_Ext(banking_system, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(customer, web_app, \"Uses\", \"HTTPS\")\nRel(customer, spa, \"Uses\", \"HTTPS\")\nRel(customer, mobile_app, \"Uses\")\n\nRel_Neighbor(web_app, spa, \"Delivers\")\nRel(spa, backend_api, \"Uses\", \"async, JSON/HTTPS\")\nRel(mobile_app, backend_api, \"Uses\", \"async, JSON/HTTPS\")\nRel_Back_Neighbor(database, backend_api, \"Reads from and writes to\", \"sync, JDBC\")\n\nRel_Back(customer, email_system, \"Sends e-mails to\")\nRel_Back(email_system, backend_api, \"Sends e-mails using\", \"sync, SMTP\")\nRel_Neighbor(backend_api, banking_system, \"Uses\", \"sync/async, XML/HTTPS\")\n@enduml\n"
  },
  {
    "path": "samples/C4_Container Diagram Sample - message bus.puml",
    "content": "@startuml \"messagebus\"\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n' uncomment the following line and comment the first to use locally\n' !include C4_Container.puml\n\nAddElementTag(\"microService\", $shape=EightSidedShape(), $bgColor=\"CornflowerBlue\", $fontColor=\"white\", $legendText=\"micro service\\neight sided\")\nAddElementTag(\"storage\", $shape=RoundedBoxShape(), $bgColor=\"lightSkyBlue\", $fontColor=\"white\")\n\nSHOW_PERSON_OUTLINE()\n\nPerson(customer, Customer, \"A customer\")\n\nSystem_Boundary(c1, \"Customer Information\") {\n    Container(app, \"Customer Application\", \"Javascript, Angular\", \"Allows customers to manage their profile\")\n    Container(customer_service, \"Customer Service\", \"Java, Spring Boot\", \"The point of access for customer information\", $tags = \"microService\")\n    Container(message_bus, \"Message Bus\", \"RabbitMQ\", \"Transport for business events\")\n    Container(reporting_service, \"Reporting Service\", \"Ruby\", \"Creates normalised data for reporting purposes\", $tags = \"microService\")\n    Container(audit_service, \"Audit Service\", \"C#/.NET\", \"Provides organisation-wide auditing facilities\", $tags = \"microService\")\n    ContainerDb(customer_db, \"Customer Database\", \"Oracle 12c\", \"Stores customer information\", $tags = \"storage\")\n    ContainerDb(reporting_db, \"Reporting Database\", \"MySQL\", \"Stores a normalized version of all business data for ad hoc reporting purposes\", $tags = \"storage\")\n    Container(audit_store, \"Audit Store\", \"Event Store\", \"Stores information about events that have happened\", $tags = \"storage\")\n}\n\nRel_D(customer, app, \"Uses\", \"HTTPS\")\n\nRel_D(app, customer_service, \"Updates customer information using\", \"async, JSON/HTTPS\")\n\nRel_U(customer_service, app, \"Sends events to\", \"WebSocket\")\nRel_U(customer_service, message_bus, \"Sends customer update events to\")\nRel(customer_service, customer_db, \"Stores data in\", \"JDBC\")\n\nRel(message_bus, reporting_service, \"Sends customer update events to\")\nRel(message_bus, audit_service, \"Sends customer update events to\")\n\nRel(reporting_service, reporting_db, \"Stores data in\")\nRel(audit_service, audit_store, \"Stores events in\")\n\nLay_R(reporting_service, audit_service)\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "samples/C4_Container Diagram Sample - techtribesjs.puml",
    "content": "@startuml \"techtribesjs\"\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n' uncomment the following line and comment the first to use locally\n' !include C4_Container.puml\n\nLAYOUT_TOP_DOWN()\n'LAYOUT_AS_SKETCH()\nLAYOUT_WITH_LEGEND()\n\n\nPerson_Ext(anonymous_user, \"Anonymous User\")\nPerson(aggregated_user, \"Aggregated User\")\nPerson(administration_user, \"Administration User\")\n\nSystem_Boundary(c1, \"techtribes.js\"){\n    \n    Container(web_app, \"Web Application\", \"Java, Spring MVC, Tomcat 7.x\", \"Allows users to view people, tribes, content, events, jobs, etc. from the local tech, digital and IT sector\")\n\n    ContainerDb(rel_db, \"Relational Database\", \"MySQL 5.5.x\", \"Stores people, tribes, tribe membership, talks, events, jobs, badges, GitHub repos, etc.\")\n\n    Container(filesystem, \"File System\", \"FAT32\", \"Stores search indexes\")\n\n    ContainerDb(nosql, \"NoSQL Data Store\", \"MongoDB 2.2.x\", \"Stores from RSS/Atom feeds (blog posts) and tweets\")\n\n    Container(updater, \"Updater\", \"Java 7 Console App\", \"Updates profiles, tweets, GitHub repos and content on a scheduled basis\")\n}\n\nSystem_Ext(twitter, \"Twitter\")\nSystem_Ext(github, \"GitHub\")\nSystem_Ext(blogs, \"Blogs\")\n\n\nRel(anonymous_user, web_app, \"Uses\", \"HTTPS\")\nRel(aggregated_user, web_app, \"Uses\", \"HTTPS\")\nRel(administration_user, web_app, \"Uses\", \"HTTPS\")\n\nRel(web_app, rel_db, \"Reads from and writes to\", \"SQL/JDBC, port 3306\")\nRel(web_app, filesystem, \"Reads from\")\nRel(web_app, nosql, \"Reads from\", \"MongoDB wire protocol, port 27017\")\n\nRel_U(updater, rel_db, \"Reads from and writes data to\", \"SQL/JDBC, port 3306\")\nRel_U(updater, filesystem, \"Writes to\")\nRel_U(updater, nosql, \"Reads from and writes to\", \"MongoDB wire protocol, port 27017\")\n\nRel(updater, twitter, \"Gets profile information and tweets from\", \"HTTPS\")\nRel(updater, github, \"Gets information about public code repositories from\", \"HTTPS\")\nRel(updater, blogs, \"Gets content using RSS and Atom feeds from\", \"HTTP\")\n\nLay_R(rel_db, filesystem)\n\n@enduml\n"
  },
  {
    "path": "samples/C4_Context Diagram Sample - bigbankplc-landscape.puml",
    "content": "@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml\n' uncomment the following line and comment the first to use locally\n' !include C4_Context.puml\n\n'LAYOUT_TOP_DOWN()\n'LAYOUT_AS_SKETCH()\nLAYOUT_WITH_LEGEND()\n\ntitle System Landscape diagram for Big Bank plc\n\nPerson(customer, \"Personal Banking Customer\", \"A customer of the bank, with personal bank accounts.\")\n\nEnterprise_Boundary(c0, \"Big Bank plc\") {\n    System(banking_system, \"Internet Banking System\", \"Allows customers to view information about their bank accounts, and make payments.\")\n\n    System_Ext(atm, \"ATM\", \"Allows customers to withdraw cash.\")\n    System_Ext(mail_system, \"E-mail system\", \"The internal Microsoft Exchange e-mail system.\")\n\n    System_Ext(mainframe, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\n    Person_Ext(customer_service, \"Customer Service Staff\", \"Customer service staff within the bank.\")\n    Person_Ext(back_office, \"Back Office Staff\", \"Administration and support staff within the bank.\")\n}\n\nRel_Neighbor(customer, banking_system, \"Uses\")\nRel_R(customer, atm, \"Withdraws cash using\")\nRel_Back(customer, mail_system, \"Sends e-mails to\")\n\nRel_R(customer, customer_service, \"Asks questions to\", \"Telephone\")\n\nRel_D(banking_system, mail_system, \"Sends e-mail using\")\nRel_R(atm, mainframe, \"Uses\")\nRel_R(banking_system, mainframe, \"Uses\")\nRel_D(customer_service, mainframe, \"Uses\")\nRel_U(back_office, mainframe, \"Uses\")\n\nLay_D(atm, banking_system)\n\nLay_D(atm, customer)\nLay_U(mail_system, customer)\n@enduml\n"
  },
  {
    "path": "samples/C4_Context Diagram Sample - bigbankplc.puml",
    "content": "@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml\n' uncomment the following line and comment the first to use locally\n' !include C4_Context.puml\n\nLAYOUT_WITH_LEGEND()\n\ntitle System Context diagram for Internet Banking System\n\nPerson(customer, \"Personal Banking Customer\", \"A customer of the bank, with personal bank accounts.\")\nSystem(banking_system, \"Internet Banking System\", \"Allows customers to view information about their bank accounts, and make payments.\")\n\nSystem_Ext(mail_system, \"E-mail system\", \"The internal Microsoft Exchange e-mail system.\")\nSystem_Ext(mainframe, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\nRel(customer, banking_system, \"Uses\")\nRel_Back(customer, mail_system, \"Sends e-mails to\")\nRel_Neighbor(banking_system, mail_system, \"Sends e-mails\", \"SMTP\")\nRel(banking_system, mainframe, \"Uses\")\n@enduml\n"
  },
  {
    "path": "samples/C4_Context Diagram Sample - enterprise.puml",
    "content": "@startuml \"enterprise\"\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml\n' uncomment the following line and comment the first to use locally\n' !include C4_Context.puml\n\nLAYOUT_TOP_DOWN()\n'LAYOUT_AS_SKETCH()\nLAYOUT_WITH_LEGEND()\n\nPerson(customer, \"Customer\", \"A customer of Widgets Limited.\")\n\nEnterprise_Boundary(c0, \"Widgets Limited\") {\n    Person(csa, \"Customer Service Agent\", \"Deals with customer enquiries.\")\n\n    System(ecommerce, \"E-commerce System\", \"Allows customers to buy widgets online via the widgets.com website.\")\n\n    System(fulfillment, \"Fulfillment System\", \"Responsible for processing and shipping of customer orders.\")\n}\n\nSystem(taxamo, \"Taxamo\", \"Calculates local tax (for EU B2B customers) and acts as a front-end for Braintree Payments.\")\n\nSystem(braintree, \"Braintree Payments\", \"Processes credit card payments on behalf of Widgets Limited.\")\n\nSystem(post, \"Jersey Post\", \"Calculates worldwide shipping costs for packages.\")\n\nRel_R(customer, csa, \"Asks questions to\", \"Telephone\")\n\nRel_R(customer, ecommerce, \"Places orders for widgets using\")\n\nRel(csa, ecommerce, \"Looks up order information using\")\n\nRel_R(ecommerce, fulfillment, \"Sends order information to\")\n\nRel_D(fulfillment, post, \"Gets shipping charges from\")\n\nRel_D(ecommerce, taxamo, \"Delegates credit card processing to\")\n\nRel_L(taxamo, braintree, \"Uses for credit card processing\")\n\nLay_D(customer, braintree)\n\n@enduml\n"
  },
  {
    "path": "samples/C4_Deployment Diagram Sample - bigbankplc-details.puml",
    "content": "@startuml\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n' uncomment the following line and comment the first to use locally\n' !include C4_Deployment.puml\n\nAddElementTag(\"fallback\", $bgColor=\"#c0c0c0\")\nAddRelTag(\"fallback\", $textColor=\"#c0c0c0\", $lineColor=\"#438DD5\")\n\nWithoutPropertyHeader()\n\n' calculated legend is used (activated in last line)\n' LAYOUT_WITH_LEGEND()\n\ntitle Deployment Diagram for Internet Banking System - Live\n\nDeployment_Node(plc, \"Live\", \"Big Bank plc\", \"Big Bank plc data center\"){\n    AddProperty(\"Location\", \"London and Reading\")\n    Deployment_Node_L(dn, \"bigbank-api***\\tx8\", \"Ubuntu 16.04 LTS\", \"A web server residing in the web server farm, accessed via F5 BIG-IP LTMs.\"){\n        AddProperty(\"Java Version\", \"8\")\n        AddProperty(\"Xmx\", \"512M\")\n        AddProperty(\"Xms\", \"1024M\")\n        Deployment_Node_L(apache, \"Apache Tomcat\", \"Apache Tomcat 8.x\", \"An open source Java EE web server.\"){\n            Container(api, \"API Application\", \"Java and Spring MVC\", \"Provides Internet Banking functionality via a JSON/HTTPS API.\")\n        }\n    }\n    AddProperty(\"Location\", \"London\")\n    Deployment_Node_L(bigbankdb01, \"bigbank-db01\", \"Ubuntu 16.04 LTS\", \"The primary database server.\"){\n        Deployment_Node_L(oracle, \"Oracle - Primary\", \"Oracle 12c\", \"The primary, live database server.\"){\n            ContainerDb(db, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\")\n        }\n    }\n    AddProperty(\"Location\", \"Reading\")\n    Deployment_Node_R(bigbankdb02, \"bigbank-db02\", \"Ubuntu 16.04 LTS\", \"The secondary database server.\", $tags=\"fallback\") {\n        Deployment_Node_R(oracle2, \"Oracle - Secondary\", \"Oracle 12c\", \"A secondary, standby database server, used for failover purposes only.\", $tags=\"fallback\") {\n            ContainerDb(db2, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\", $tags=\"fallback\")\n        }\n    }\n    AddProperty(\"Location\", \"London and Reading\")\n    Deployment_Node_R(bb2, \"bigbank-web***\\tx4\", \"Ubuntu 16.04 LTS\", \"A web server residing in the web server farm, accessed via F5 BIG-IP LTMs.\"){\n        AddProperty(\"Java Version\", \"8\")\n        AddProperty(\"Xmx\", \"512M\")\n        AddProperty(\"Xms\", \"1024M\")\n        Deployment_Node_R(apache2, \"Apache Tomcat\", \"Apache Tomcat 8.x\", \"An open source Java EE web server.\"){\n            Container(web, \"Web Application\", \"Java and Spring MVC\", \"Delivers the static content and the Internet Banking single page application.\")\n        }\n    }\n}\n\nDeployment_Node(mob, \"Customer's mobile device\", \"Apple IOS or Android\"){\n    Container(mobile, \"Mobile App\", \"Xamarin\", \"Provides a limited subset of the Internet Banking functionality to customers via their mobile device.\")\n}\n\nDeployment_Node(comp, \"Customer's computer\", \"Microsoft Windows of Apple macOS\"){\n    Deployment_Node(browser, \"Web Browser\", \"Google Chrome, Mozilla Firefox, Apple Safari or Microsoft Edge\"){\n        Container(spa, \"Single Page Application\", \"JavaScript and Angular\", \"Provides all of the Internet Banking functionality to customers via their web browser.\")\n    }\n}\n\nRel(mobile, api, \"Makes API calls to\", \"json/HTTPS\")\nRel(spa, api, \"Makes API calls to\", \"json/HTTPS\")\nRel_U(web, spa, \"Delivers to the customer's web browser\")\nRel(api, db, \"Reads from and writes to\", \"JDBC\")\nRel(api, db2, \"Reads from and writes to\", \"JDBC\", $tags=\"fallback\")\nRel_R(db, db2, \"Replicates data to\")\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "samples/C4_Deployment Diagram Sample - bigbankplc.puml",
    "content": "@startuml\n  !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml\n' uncomment the following line and comment the first to use locally\n' !include C4_Deployment.puml\n\nAddElementTag(\"fallback\", $bgColor=\"#c0c0c0\")\nAddRelTag(\"fallback\", $textColor=\"#c0c0c0\", $lineColor=\"#438DD5\")\n\n' calculated legend is used (activated in last line)\n' LAYOUT_WITH_LEGEND()\n\ntitle Deployment Diagram for Internet Banking System - Live\n\nDeployment_Node(plc, \"Big Bank plc\", \"Big Bank plc data center\"){\n    Deployment_Node(dn, \"bigbank-api***\\tx8\", \"Ubuntu 16.04 LTS\"){\n        Deployment_Node(apache, \"Apache Tomcat\", \"Apache Tomcat 8.x\"){\n            Container(api, \"API Application\", \"Java and Spring MVC\", \"Provides Internet Banking functionality via a JSON/HTTPS API.\")\n        }\n    }\n    Deployment_Node(bigbankdb01, \"bigbank-db01\", \"Ubuntu 16.04 LTS\"){\n        Deployment_Node(oracle, \"Oracle - Primary\", \"Oracle 12c\"){\n            ContainerDb(db, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\")\n        }\n    }\n    Deployment_Node(bigbankdb02, \"bigbank-db02\", \"Ubuntu 16.04 LTS\", $tags=\"fallback\") {\n        Deployment_Node(oracle2, \"Oracle - Secondary\", \"Oracle 12c\", $tags=\"fallback\") {\n            ContainerDb(db2, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\", $tags=\"fallback\")\n        }\n    }\n    Deployment_Node(bb2, \"bigbank-web***\\tx4\", \"Ubuntu 16.04 LTS\"){\n        Deployment_Node(apache2, \"Apache Tomcat\", \"Apache Tomcat 8.x\"){\n            Container(web, \"Web Application\", \"Java and Spring MVC\", \"Delivers the static content and the Internet Banking single page application.\")\n        }\n    }\n}\n\nDeployment_Node(mob, \"Customer's mobile device\", \"Apple IOS or Android\"){\n    Container(mobile, \"Mobile App\", \"Xamarin\", \"Provides a limited subset of the Internet Banking functionality to customers via their mobile device.\")\n}\n\nDeployment_Node(comp, \"Customer's computer\", \"Microsoft Windows or Apple macOS\"){\n    Deployment_Node(browser, \"Web Browser\", \"Google Chrome, Mozilla Firefox, Apple Safari or Microsoft Edge\"){\n        Container(spa, \"Single Page Application\", \"JavaScript and Angular\", \"Provides all of the Internet Banking functionality to customers via their web browser.\")\n    }\n}\n\nRel(mobile, api, \"Makes API calls to\", \"json/HTTPS\")\nRel(spa, api, \"Makes API calls to\", \"json/HTTPS\")\nRel_U(web, spa, \"Delivers to the customer's web browser\")\nRel(api, db, \"Reads from and writes to\", \"JDBC\")\nRel(api, db2, \"Reads from and writes to\", \"JDBC\", $tags=\"fallback\")\nRel_R(db, db2, \"Replicates data to\")\n\nSHOW_LEGEND()\n@enduml\n"
  },
  {
    "path": "samples/C4_Dynamic Diagram Sample - bigbankplc.puml",
    "content": "@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Dynamic.puml\n\nLAYOUT_WITH_LEGEND()\n\nContainerDb(c4, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\")\nContainer(c1, \"Single-Page Application\", \"JavaScript and Angular\", \"Provides all of the Internet banking functionality to customers via their web browser.\")\nContainer_Boundary(b, \"API Application\") {\n  Component(c3, \"Security Component\", \"Spring Bean\", \"Provides functionality Related to signing in, changing passwords, etc.\")\n  Component(c2, \"Sign In Controller\", \"Spring MVC Rest Controller\", \"Allows users to sign in to the Internet Banking System.\")\n}\nRel_R(c1, c2, \"Submits credentials to\", \"JSON/HTTPS\")\nRel(c2, c3, \"Calls isAuthenticated() on\")\nRel_R(c3, c4, \"select * from users where username = ?\", \"JDBC\")\n@enduml\n"
  },
  {
    "path": "samples/C4_Dynamic Diagram Sample - message bus - old format.puml",
    "content": "@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Dynamic.puml\n\nLAYOUT_TOP_DOWN()\nLAYOUT_WITH_LEGEND()\n\nPerson(customer, Customer, \"A customer\")\nSystem_Boundary(c1, \"Customer Information\") {\n    Container(app, \"Customer Application\", \"Javascript, Angular\", \"Allows customers to manage their profile\")\n    Container(customer_service, \"Customer Service\", \"Java, Spring Boot\", \"The point of access for customer information\")\n    Container(message_bus, \"Message Bus\", \"RabbitMQ\", \"Transport for business events\")\n    Container(reporting_service, \"Reporting Service\", \"Ruby\", \"Creates normalised data for reporting purposes\")\n    Container(audit_service, \"Audit Service\", \"C#/.NET\", \"Provides organisation-wide auditing facilities\")\n    ContainerDb(customer_db, \"Customer Database\", \"Oracle 12c\", \"Stores customer information\")\n    ContainerDb(reporting_db, \"Reporting Database\", \"MySQL\", \"Stores a normalized version of all business data for ad hoc reporting purposes\")\n    Container(audit_store, \"Audit Store\", \"Event Store\", \"Stores information about events that have happened\")\n}\n\nRel_D(customer, app, \"Updates his profile using\", \"HTTPS\")\nRel(app, customer_service, \"Updates customer information using\", \"JSON/HTTPS\")\nRel_R(customer_service, customer_db, \"Stores data in\", \"JDBC\")\n\nRelIndex_D($index-1, customer_service, message_bus, \"Sends customer update events to\", \"async\")\nRelIndex_U($index-2, customer_service, app, \"Confirm update to\", \"async\")\nincrement()\n\nRelIndex_L($index-1, message_bus, reporting_service, \"Sends customer update events to\", \"async\")\nincrement()\nRelIndex($index-1, reporting_service, reporting_db, \"Stores data in\")\n\nsetIndex(5)\nRelIndex_R($index-2, message_bus, audit_service, \"Sends customer update events to\", \"async\")\nincrement()\nRelIndex($index-2, audit_service, audit_store, \"Stores events in\")\n@enduml\n"
  },
  {
    "path": "samples/C4_Dynamic Diagram Sample - message bus.puml",
    "content": "@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Dynamic.puml\n\nLAYOUT_TOP_DOWN()\nLAYOUT_WITH_LEGEND()\n\nPerson(customer, Customer, \"A customer\")\nSystem_Boundary(c1, \"Customer Information\") {\n    Container(app, \"Customer Application\", \"Javascript, Angular\", \"Allows customers to manage their profile\")\n    Container(customer_service, \"Customer Service\", \"Java, Spring Boot\", \"The point of access for customer information\")\n    Container(message_bus, \"Message Bus\", \"RabbitMQ\", \"Transport for business events\")\n    Container(reporting_service, \"Reporting Service\", \"Ruby\", \"Creates normalised data for reporting purposes\")\n    Container(audit_service, \"Audit Service\", \"C#/.NET\", \"Provides organisation-wide auditing facilities\")\n    ContainerDb(customer_db, \"Customer Database\", \"Oracle 12c\", \"Stores customer information\")\n    ContainerDb(reporting_db, \"Reporting Database\", \"MySQL\", \"Stores a normalized version of all business data for ad hoc reporting purposes\")\n    Container(audit_store, \"Audit Store\", \"Event Store\", \"Stores information about events that have happened\")\n}\n\nRel_D(customer, app, \"Updates his profile using\", \"HTTPS\")\nRel(app, customer_service, \"Updates customer information using\", \"JSON/HTTPS\")\nRel_R(customer_service, customer_db, \"Stores data in\", \"JDBC\")\n\nRel_D(customer_service, message_bus, \"Sends customer update events to\", \"async\", $index=Index()-1)\nRel_U(customer_service, app, \"Confirm update to\", \"async\", $index=LastIndex()-2)\n\nRel_L(message_bus, reporting_service, \"Sends customer update events to\", \"async\", $index=Index()-1)\nRel(reporting_service, reporting_db, \"Stores data in\", $index=Index()-1)\n\n' $index cab be first arg too (like the old RelIndex... calls), as long it is written with $index=.... \nRel_R($index=SetIndex(5)-2, message_bus, audit_service, \"Sends customer update events to\", \"async\")\nRel($index=Index()-2, audit_service, audit_store, \"Stores events in\")\n\nSHOW_LEGEND()\n@enduml"
  },
  {
    "path": "samples/C4_Sequence Diagram Sample - bigbankplc.puml",
    "content": "@startuml\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Sequence.puml\n\nContainer(c1, \"Single-Page Application\", \"JavaScript and Angular\", \"Provides all of the Internet banking functionality to customers via their web browser.\")\n\nContainer_Boundary(b, \"API Application\")\n  Component(c2, \"Sign In Controller\", \"Spring MVC Rest Controller\", \"Allows users to sign in to the Internet Banking System.\")\n  Component(c3, \"Security Component\", \"Spring Bean\", \"Provides functionality Related to signing in, changing passwords, etc.\")\nBoundary_End()\n\nContainerDb(c4, \"Database\", \"Relational Database Schema\", \"Stores user registration information, hashed authentication credentials, access logs, etc.\")\n\nRel(c1, c2, \"Submits credentials to\", \"JSON/HTTPS\")\nRel(c2, c3, \"Calls isAuthenticated() on\")\nRel(c3, c4, \"select * from users where username = ?\", \"JDBC\")\n\nSHOW_LEGEND()\n@enduml"
  },
  {
    "path": "samples/C4_Sequence Diagram Sample - complex.puml",
    "content": "@startuml\n!theme C4_united from https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/themes\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Sequence.puml\n\nPerson(Alice, \"Alice\")\nPerson(Bob, \"Bob\")\n\nactivate Bob\n\nRel(Alice, Bob, \"Authentication Request\")\n\nalt successful case\n    Rel(Bob, Alice, \"Authentication Accepted\")\nelse some kind of failure\n    loop 1000 times\n        Rel(Alice, Bob, \"DNS Attack\")\n    end\nend\n\nref over Alice, Bob : init\n\nRel(Alice, Bob, \"hello\")\n\nref over Bob\n  This can be on\n  several lines\nend ref\n\n== Initialization ==\n\nRel(Alice, Bob, \"Authentication Request\")\nRel(Bob, Alice, \"Authentication Response\")\n\n== Repetition ==\n\nRel(Alice, Bob, \"Another authentication Request\")\nRel(Bob, Alice, \"another authentication Response\")\n\n... 5 minutes later ...\n\nRel(Alice, Bob, \"calls via phone\")\n\nSHOW_LEGEND()\n@enduml"
  },
  {
    "path": "themes/puml-theme-C4Language_chinese.puml",
    "content": "﻿!$THEME = \"C4Language_chinese\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"边界\"\n\n!$LEGEND_TITLE_TEXT ?= \"图例\"\n\n!$LEGEND_BOUNDARY ?= \"边界\"\n' !$LEGEND_BOUNDARY_PRE_PART ?= \"\"\n!$LEGEND_BOUNDARY_POST_PART ?= $LEGEND_BOUNDARY\n\n!$LEGEND_SHADOW_TEXT ?= \"阴影\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"无阴影\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"最后的文字和背景颜色\"\n!$LEGEND_NO_FONT_TEXT ?= \"最后的文字颜色\"\n!$LEGEND_NO_BG_TEXT ?= \"最后的背景颜色\"\n!$LEGEND_NO_LINE_TEXT ?= \"最后的线条颜色\"\n!$LEGEND_SHARP_CORNER ?= \"角框\"\n!$LEGEND_ROUNDED_BOX ?= \"圆角框\"\n!$LEGEND_EIGHT_SIDED ?= \"八边形\"\n!$LEGEND_DOTTED_LINE ?= \"点线\"\n!$LEGEND_DASHED_LINE ?= \"虚线\"\n!$LEGEND_BOLD_LINE ?= \"粗线\"\n!$LEGEND_SOLID_LINE ?= \"实线\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"虚线, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"厚度\"\n\n!$SKETCH_FOOTER_WARNING ?= \"警告:\"\n!$SKETCH_FOOTER_TEXT ?= \"创建用于讨论，需要验证\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"组件\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"外部组件\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"容器\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"容器\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"容器边界\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"外部容器\"\n\n!$PERSON_LEGEND_TEXT ?= \"人\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"外部人\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"系统\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"系统\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"系统边界\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"外部系统\"\n\n!ENTERPRISE_BOUNDARY_TYPE ?= \"企业\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"企业边界\"\n\n!$NODE_LEGEND_TEXT ?= \"节点\"\n"
  },
  {
    "path": "themes/puml-theme-C4Language_danish.puml",
    "content": "﻿' all available language specific text labels (orig. English)\n!$THEME = \"C4Language_danish\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"skillelinje\"\n\n!$LEGEND_TITLE_TEXT ?= \"Signaturforklaring\"\n\n!$LEGEND_BOUNDARY ?= \"skillelinje\"\n' !$LEGEND_BOUNDARY_PRE_PART ?= \"\"\n' !$LEGEND_BOUNDARY_POST_PART ?= \" \" + $LEGEND_BOUNDARY\n\n!$LEGEND_SHADOW_TEXT ?= \"skygge\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"ingen skygge\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"sidste tekst og sidste farve\"\n!$LEGEND_NO_FONT_TEXT ?= \"sidste tekstfarve\"\n!$LEGEND_NO_BG_TEXT ?= \"sidste baggrundsfarve\"\n!$LEGEND_NO_LINE_TEXT ?= \"sidste linjefarve\"\n!$LEGEND_SHARP_CORNER ?= \"boks\"\n!$LEGEND_ROUNDED_BOX ?= \"rundet boks\"\n!$LEGEND_EIGHT_SIDED ?= \"ottesidet\"\n!$LEGEND_DOTTED_LINE ?= \"prikket\"\n!$LEGEND_DASHED_LINE ?= \"stiplet\"\n!$LEGEND_BOLD_LINE ?= \"fed\"\n!$LEGEND_SOLID_LINE ?= \"solid\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"stiplet, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"tykkelse\"\n!$SKETCH_FOOTER_WARNING ?= \"Advarsel:\"\n!$SKETCH_FOOTER_TEXT ?= \"Oprettet til diskussion, skal valideres\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"komponent\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"ekstern komponent\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"container\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"container\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"container skillelinje\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"ekstern container\"\n\n!$PERSON_LEGEND_TEXT ?= \"person\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"ekstern person\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"system\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"system\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"system skillelinje\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"eksternt system\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"enterprise\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"enterprise skillelinje\"\n\n!$NODE_LEGEND_TEXT ?= \"node\"\n"
  },
  {
    "path": "themes/puml-theme-C4Language_dutch.puml",
    "content": "﻿!$THEME = \"C4Language_dutch\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"grens\"\n\n!$LEGEND_TITLE_TEXT ?= \"Legenda\"\n\n!$LEGEND_BOUNDARY ?= \"grens\"\n' !$LEGEND_BOUNDARY_PRE_PART ?= \"\"\n!$LEGEND_BOUNDARY_POST_PART ?= $LEGEND_BOUNDARY\n\n!$LEGEND_SHADOW_TEXT ?= \"schaduw\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"geen schaduw\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"laatste tekst- en achtergrondkleur\"\n!$LEGEND_NO_FONT_TEXT ?= \"laatste tekstkleur\"\n!$LEGEND_NO_BG_TEXT ?= \"laatste achtergrondkleur\"\n!$LEGEND_NO_LINE_TEXT ?= \"laatste lijnkleur\"\n!$LEGEND_SHARP_CORNER ?= \"doos\"\n!$LEGEND_ROUNDED_BOX ?= \"afgeronde doos\"\n!$LEGEND_EIGHT_SIDED ?= \"achtzijdig\"\n!$LEGEND_DOTTED_LINE ?= \"gestippeld\"\n!$LEGEND_DASHED_LINE ?= \"gestreept\"\n!$LEGEND_BOLD_LINE ?= \"vet\"\n!$LEGEND_SOLID_LINE ?= \"solide\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"gestreept, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"dikte\"\n\n!$SKETCH_FOOTER_WARNING ?= \"Waarschuwing:\"\n!$SKETCH_FOOTER_TEXT ?= \"Gemaakt voor discussie, moet worden gevalideerd\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"component\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"extern component\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"container\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"container\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"containergrens\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"externe container\"\n\n!$PERSON_LEGEND_TEXT ?= \"persoon\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"externe persoon\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"systeem\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"systeem\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"systeemgrens\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"extern systeem\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"bedrijfs\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"bedrijfsgrens\"\n\n!$NODE_LEGEND_TEXT ?= \"knooppunt\"\n"
  },
  {
    "path": "themes/puml-theme-C4Language_english.puml",
    "content": "﻿' all available language specific text labels (orig. English)\n!$THEME = \"C4Language_english\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"boundary\"\n\n!$LEGEND_TITLE_TEXT ?= \"Legend\"\n\n!$LEGEND_BOUNDARY ?= \"boundary\"\n' !$LEGEND_BOUNDARY_PRE_PART ?= \"\"\n' !$LEGEND_BOUNDARY_POST_PART ?= \" \" + $LEGEND_BOUNDARY\n\n!$LEGEND_SHADOW_TEXT ?= \"shadow\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"no shadow\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"last text and back color\"\n!$LEGEND_NO_FONT_TEXT ?= \"last text color\"\n!$LEGEND_NO_BG_TEXT ?= \"last back color\"\n!$LEGEND_NO_LINE_TEXT ?= \"last line color\"\n!$LEGEND_SHARP_CORNER ?= \"box\"\n!$LEGEND_ROUNDED_BOX ?= \"rounded box\"\n!$LEGEND_EIGHT_SIDED ?= \"eight sided\"\n!$LEGEND_DOTTED_LINE ?= \"dotted\"\n!$LEGEND_DASHED_LINE ?= \"dashed\"\n!$LEGEND_BOLD_LINE ?= \"bold\"\n!$LEGEND_SOLID_LINE ?= \"solid\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"dashed, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"thickness\"\n!$SKETCH_FOOTER_WARNING ?= \"Warning:\"\n!$SKETCH_FOOTER_TEXT ?= \"Created for discussion, needs to be validated\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"component\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"external component\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"container\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"container\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"container boundary\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"external container\"\n\n!$PERSON_LEGEND_TEXT ?= \"person\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"external person\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"system\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"system\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"system boundary\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"external system\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"enterprise\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"enterprise boundary\"\n\n!$NODE_LEGEND_TEXT ?= \"node\"\n"
  },
  {
    "path": "themes/puml-theme-C4Language_french.puml",
    "content": "﻿!$THEME = \"C4Language_french\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"frontière\"\n\n!$LEGEND_TITLE_TEXT ?= \"Légende\"\n\n!$LEGEND_BOUNDARY ?= \"frontière\"\n!$LEGEND_BOUNDARY_PRE_PART ?= \"frontière du \"\n!$LEGEND_BOUNDARY_POST_PART ?= \"\"\n\n!$LEGEND_SHADOW_TEXT ?= \"ombre\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"pas d'ombre\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"dernière couleur de texte et de fond\"\n!$LEGEND_NO_FONT_TEXT ?= \"dernière couleur de texte\"\n!$LEGEND_NO_BG_TEXT ?= \"dernière couleur de fond\"\n!$LEGEND_NO_LINE_TEXT ?= \"dernière couleur de ligne\"\n!$LEGEND_SHARP_CORNER ?= \"boîte\"\n!$LEGEND_ROUNDED_BOX ?= \"boîte arrondie\"\n!$LEGEND_EIGHT_SIDED ?= \"octogonal\"\n!$LEGEND_DOTTED_LINE ?= \"pointillé\"\n!$LEGEND_DASHED_LINE ?= \"tiret\"\n!$LEGEND_BOLD_LINE ?= \"gras\"\n!$LEGEND_SOLID_LINE ?= \"solide\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"tiret, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"épaisseur\"\n\n!$SKETCH_FOOTER_WARNING ?= \"Attention:\"\n!$SKETCH_FOOTER_TEXT ?= \"Créé pour discussion, doit être validé\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"composant\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"composant externe\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"conteneur\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"conteneur\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"frontière du conteneur\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"conteneur externe\"\n\n!$PERSON_LEGEND_TEXT ?= \"personne\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"personne externe\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"système\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"système\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"frontière du système\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"système externe\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"entreprise\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"frontière de l'entreprise\"\n\n!$NODE_LEGEND_TEXT ?= \"nœud\"\n"
  },
  {
    "path": "themes/puml-theme-C4Language_german.puml",
    "content": "﻿!$THEME = \"C4Language_deutsch\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"Grenze\"\n\n!$LEGEND_TITLE_TEXT ?= \"Legende\"\n\n!$LEGEND_BOUNDARY ?= \"Grenze\"\n' !$LEGEND_BOUNDARY_PRE_PART ?= \"\"\n' !$LEGEND_BOUNDARY_POST_PART ?= \" \" + $LEGEND_BOUNDARY\n!$LEGEND_BOUNDARY_POST_PART ?= \"grenze\"\n\n!$LEGEND_SHADOW_TEXT ?= \"Schatten\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"kein Schatten\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"letzte Text- und Hintergrundfarbe\"\n!$LEGEND_NO_FONT_TEXT ?= \"letzte Textfarbe\"\n!$LEGEND_NO_BG_TEXT ?= \"letzte Hintergrundfarbe\"\n!$LEGEND_NO_LINE_TEXT ?= \"letzte Linienfarbe\"\n!$LEGEND_SHARP_CORNER ?= \"Kästchen\"\n!$LEGEND_ROUNDED_BOX ?= \"abgerundetes Kästchen\"\n!$LEGEND_EIGHT_SIDED ?= \"achtseitig\"\n!$LEGEND_DOTTED_LINE ?= \"gepunktet\"\n!$LEGEND_DASHED_LINE ?= \"gestrichelt\"\n!$LEGEND_BOLD_LINE ?= \"fett\"\n!$LEGEND_SOLID_LINE ?= \"durchgezogen\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"gestrichelt, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"Dicke\"\n!$SKETCH_FOOTER_WARNING ?= \"Warnung:\"\n!$SKETCH_FOOTER_TEXT ?= \"Zur Diskussion gestellt, muss überprüft werden\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"Komponente\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"externe Komponente\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"Container\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"Container\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"Containergrenze\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"externer Container\"\n\n!$PERSON_LEGEND_TEXT ?= \"Person\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"externe Person\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"System\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"System\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"Systemgrenze\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"externes System\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"Unternehmen\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"Unternehmensgrenze\"\n\n!$NODE_LEGEND_TEXT ?= \"Knoten\"\n"
  },
  {
    "path": "themes/puml-theme-C4Language_italian.puml",
    "content": "﻿!$THEME = \"C4Language_italian\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"confine\"\n\n!$LEGEND_TITLE_TEXT ?= \"Legenda\"\n\n!$LEGEND_BOUNDARY ?= \"confine\"\n!$LEGEND_BOUNDARY_PRE_PART ?= \"confine del \"\n!$LEGEND_BOUNDARY_POST_PART ?= \"\"\n\n!$LEGEND_SHADOW_TEXT ?= \"ombra\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"nessuna ombra\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"ultimo colore del testo e dello sfondo\"\n!$LEGEND_NO_FONT_TEXT ?= \"ultimo colore del testo\"\n!$LEGEND_NO_BG_TEXT ?= \"ultimo colore dello sfondo\"\n!$LEGEND_NO_LINE_TEXT ?= \"ultimo colore della linea\"\n!$LEGEND_SHARP_CORNER ?= \"scatola\"\n!$LEGEND_ROUNDED_BOX ?= \"scatola arrotondata\"\n!$LEGEND_EIGHT_SIDED ?= \"otto lati\"\n!$LEGEND_DOTTED_LINE ?= \"punteggiato\"\n!$LEGEND_DASHED_LINE ?= \"tratteggiato\"\n!$LEGEND_BOLD_LINE ?= \"grassetto\"\n!$LEGEND_SOLID_LINE ?= \"solido\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"tratteggiato, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"spessore\"\n!$SKETCH_FOOTER_WARNING ?= \"Avvertimento:\"\n!$SKETCH_FOOTER_TEXT ?= \"Creato per discussione, deve essere convalidato\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"componente\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"componente esterno\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"contenitore\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"contenitore\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"confine del contenitore\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"contenitore esterno\"\n\n!$PERSON_LEGEND_TEXT ?= \"persona\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"persona esterna\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"sistema\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"sistema\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"confine del sistema\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"sistema esterno\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"impresa\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"confine dell'impresa\"\n\n!$NODE_LEGEND_TEXT ?= \"nodo\"\n"
  },
  {
    "path": "themes/puml-theme-C4Language_japanese.puml",
    "content": "﻿!$THEME = \"C4Language_japanese\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"境界\"\n\n!$LEGEND_TITLE_TEXT ?= \"凡例\"\n\n!$LEGEND_BOUNDARY ?= \"境界\"\n' !$LEGEND_BOUNDARY_PRE_PART ?= \"\"\n!$LEGEND_BOUNDARY_POST_PART ?= $LEGEND_BOUNDARY\n\n!$LEGEND_SHADOW_TEXT ?= \"影\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"影なし\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"最後のテキストと背景色\"\n!$LEGEND_NO_FONT_TEXT ?= \"最後のテキスト色\"\n!$LEGEND_NO_BG_TEXT ?= \"最後の背景色\"\n!$LEGEND_NO_LINE_TEXT ?= \"最後の線色\"\n!$LEGEND_SHARP_CORNER ?= \"ボックス\"\n!$LEGEND_ROUNDED_BOX ?= \"丸いボックス\"\n!$LEGEND_EIGHT_SIDED ?= \"八角形\"\n!$LEGEND_DOTTED_LINE ?= \"点線\"\n!$LEGEND_DASHED_LINE ?= \"破線\"\n!$LEGEND_BOLD_LINE ?= \"太線\"\n!$LEGEND_SOLID_LINE ?= \"実線\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"破線, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"厚さ\"\n\n!$SKETCH_FOOTER_WARNING ?= \"警告:\"\n!$SKETCH_FOOTER_TEXT ?= \"議論用に作成されたもので、検証が必要です\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"コンポーネント\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"外部コンポーネント\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"コンテナ\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"コンテナ\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"コンテナ境界\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"外部コンテナ\"\n\n!$PERSON_LEGEND_TEXT ?= \"人\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"外部の人\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"システム\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"システム\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"システム境界\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"外部システム\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"企業\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"企業境界\"\n\n!$NODE_LEGEND_TEXT ?= \"ノード\"\n"
  },
  {
    "path": "themes/puml-theme-C4Language_korean.puml",
    "content": "﻿!$THEME = \"C4Language_korean\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"경계\"\n\n!$LEGEND_TITLE_TEXT ?= \"범례\"\n\n!$LEGEND_BOUNDARY ?= \"경계\"\n' !$LEGEND_BOUNDARY_PRE_PART ?= \"\"\n' !$LEGEND_BOUNDARY_POST_PART ?= \" \" + $LEGEND_BOUNDARY\n\n!$LEGEND_SHADOW_TEXT ?= \"그림자\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"그림자 없음\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"마지막 텍스트 및 배경 색상\"\n!$LEGEND_NO_FONT_TEXT ?= \"마지막 텍스트 색상\"\n!$LEGEND_NO_BG_TEXT ?= \"마지막 배경 색상\"\n!$LEGEND_NO_LINE_TEXT ?= \"마지막 선 색상\"\n!$LEGEND_SHARP_CORNER ?= \"상자\"\n!$LEGEND_ROUNDED_BOX ?= \"둥근 상자\"\n!$LEGEND_EIGHT_SIDED ?= \"팔각형\"\n!$LEGEND_DOTTED_LINE ?= \"점선\"\n!$LEGEND_DASHED_LINE ?= \"대시선\"\n!$LEGEND_BOLD_LINE ?= \"굵은 선\"\n!$LEGEND_SOLID_LINE ?= \"실선\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"대시선, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"두께\"\n\n!$SKETCH_FOOTER_WARNING ?= \"경고:\"\n!$SKETCH_FOOTER_TEXT ?= \"토론을 위해 작성되었으며 검증이 필요합니다\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"구성 요소\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"외부 구성 요소\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"컨테이너\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"컨테이너\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"컨테이너 경계\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"외부 컨테이너\"\n\n!$PERSON_LEGEND_TEXT ?= \"사람\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"외부 사람\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"시스템\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"시스템\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"시스템 경계\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"외부 시스템\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"기업\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"기업 경계\"\n\n!$NODE_LEGEND_TEXT ?= \"노드\"\n"
  },
  {
    "path": "themes/puml-theme-C4Language_portuguese.puml",
    "content": "﻿!$THEME = \"C4Language_portuguese\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"limite\"\n\n!$LEGEND_TITLE_TEXT ?= \"Legenda\"\n\n!$LEGEND_BOUNDARY ?= \"limite\"\n!$LEGEND_BOUNDARY_PRE_PART ?= \"limite do \"\n!$LEGEND_BOUNDARY_POST_PART ?= \"\"\n\n!$LEGEND_SHADOW_TEXT ?= \"sombra\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"sem sombra\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"última cor do texto e do fundo\"\n!$LEGEND_NO_FONT_TEXT ?= \"última cor do texto\"\n!$LEGEND_NO_BG_TEXT ?= \"última cor do fundo\"\n!$LEGEND_NO_LINE_TEXT ?= \"última cor da linha\"\n!$LEGEND_SHARP_CORNER ?= \"caixa\"\n!$LEGEND_ROUNDED_BOX ?= \"caixa arredondada\"\n!$LEGEND_EIGHT_SIDED ?= \"oito lados\"\n!$LEGEND_DOTTED_LINE ?= \"pontilhado\"\n!$LEGEND_DASHED_LINE ?= \"tracejado\"\n!$LEGEND_BOLD_LINE ?= \"negrito\"\n!$LEGEND_SOLID_LINE ?= \"sólido\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"tracejado, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"espessura\"\n\n!$SKETCH_FOOTER_WARNING ?= \"Aviso:\"\n!$SKETCH_FOOTER_TEXT ?= \"Criado para discussão, precisa ser validado\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"componente\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"componente externo\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"contêiner\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"contêiner\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"limite do contêiner\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"contêiner externo\"\n\n!$PERSON_LEGEND_TEXT ?= \"pessoa\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"pessoa externa\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"sistema\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"sistema\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"limite do sistema\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"sistema externo\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"empresa\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"limite da empresa\"\n\n!$NODE_LEGEND_TEXT ?= \"nó\"\n"
  },
  {
    "path": "themes/puml-theme-C4Language_russian.puml",
    "content": "﻿!$THEME = \"C4Language_russian\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"граница\"\n\n!$LEGEND_TITLE_TEXT ?= \"Легенда\"\n\n!$LEGEND_BOUNDARY ?= \"граница\"\n!$LEGEND_BOUNDARY_PRE_PART ?= $LEGEND_BOUNDARY + \" \"\n!$LEGEND_BOUNDARY_POST_PART ?= \"\"\n\n!$LEGEND_SHADOW_TEXT ?= \"тень\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"без тени\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"последний цвет текста и фона\"\n!$LEGEND_NO_FONT_TEXT ?= \"последний цвет текста\"\n!$LEGEND_NO_BG_TEXT ?= \"последний цвет фона\"\n!$LEGEND_NO_LINE_TEXT ?= \"последний цвет линии\"\n!$LEGEND_SHARP_CORNER ?= \"коробка\"\n!$LEGEND_ROUNDED_BOX ?= \"округлая коробка\"\n!$LEGEND_EIGHT_SIDED ?= \"восьмиугольный\"\n!$LEGEND_DOTTED_LINE ?= \"пунктирная линия\"\n!$LEGEND_DASHED_LINE ?= \"штриховая линия\"\n!$LEGEND_BOLD_LINE ?= \"жирная линия\"\n!$LEGEND_SOLID_LINE ?= \"сплошная линия\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"штриховая линия, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"толщина\"\n\n!$SKETCH_FOOTER_WARNING ?= \"Предупреждение:\"\n!$SKETCH_FOOTER_TEXT ?= \"Создано для обсуждения, требует проверки\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"компонент\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"внешний компонент\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"контейнер\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"контейнер\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"граница контейнера\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"внешний контейнер\"\n\n!$PERSON_LEGEND_TEXT ?= \"человек\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"внешний человек\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"система\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"система\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"граница системы\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"внешняя система\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"предприятия\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"граница предприятия\"\n\n!$NODE_LEGEND_TEXT ?= \"узел\"\n"
  },
  {
    "path": "themes/puml-theme-C4Language_spanish.puml",
    "content": "﻿!$THEME = \"C4Language_spanish\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"límite\"\n\n!$LEGEND_TITLE_TEXT ?= \"Leyenda\"\n\n!$LEGEND_BOUNDARY ?= \"límite\"\n!$LEGEND_BOUNDARY_PRE_PART ?= \"límite del \"\n!$LEGEND_BOUNDARY_POST_PART ?= \"\"\n\n!$LEGEND_SHADOW_TEXT ?= \"sombra\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"sin sombra\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"último color de texto y fondo\"\n!$LEGEND_NO_FONT_TEXT ?= \"último color de texto\"\n!$LEGEND_NO_BG_TEXT ?= \"último color de fondo\"\n!$LEGEND_NO_LINE_TEXT ?= \"último color de línea\"\n!$LEGEND_SHARP_CORNER ?= \"caja\"\n!$LEGEND_ROUNDED_BOX ?= \"caja redondeada\"\n!$LEGEND_EIGHT_SIDED ?= \"octogonal\"\n!$LEGEND_DOTTED_LINE ?= \"punteado\"\n!$LEGEND_DASHED_LINE ?= \"discontinuo\"\n!$LEGEND_BOLD_LINE ?= \"negrita\"\n!$LEGEND_SOLID_LINE ?= \"sólido\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"discontinuo, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"grosor\"\n!$SKETCH_FOOTER_WARNING ?= \"Advertencia:\"\n!$SKETCH_FOOTER_TEXT ?= \"Creado para discusión, necesita ser validado\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"componente\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"componente externo\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"contenedor\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"contenedor\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"límite del contenedor\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"contenedor externo\"\n\n!$PERSON_LEGEND_TEXT ?= \"persona\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"persona externa\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"sistema\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"sistema\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"límite del sistema\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"sistema externo\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"empresa\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"límite de la empresa\"\n\n!$NODE_LEGEND_TEXT ?= \"nodo\"\n"
  },
  {
    "path": "themes/puml-theme-C4Language_ukrainian.puml",
    "content": "﻿!$THEME = \"C4Language_ukrainian\"\n\n!$BOUNDARY_LEGEND_TEXT ?= \"межа\"\n\n!$LEGEND_TITLE_TEXT ?= \"Легенда\"\n\n!$LEGEND_BOUNDARY ?= \"межа\"\n!$LEGEND_BOUNDARY_PRE_PART ?= $LEGEND_BOUNDARY + \"\"\n' !$LEGEND_BOUNDARY_POST_PART ?= \" \" + $LEGEND_BOUNDARY\n\n!$LEGEND_SHADOW_TEXT ?= \"тінь\"\n!$LEGEND_NO_SHADOW_TEXT ?= \"без тіні\"\n!$LEGEND_NO_FONT_BG_TEXT ?= \"останній колір тексту та фону\"\n\n!$LEGEND_NO_FONT_TEXT ?= \"останній колір тексту\"\n!$LEGEND_NO_BG_TEXT ?= \"останній колір фону\"\n!$LEGEND_NO_LINE_TEXT ?= \"останній колір лінії\"\n!$LEGEND_SHARP_CORNER ?= \"блок\"\n!$LEGEND_ROUNDED_BOX ?= \"округлий блок\"\n!$LEGEND_EIGHT_SIDED ?= \"восьмикутний\"\n!$LEGEND_DOTTED_LINE ?= \"пунктирна лінія\"\n!$LEGEND_DASHED_LINE ?= \"штрихова лінія\"\n!$LEGEND_BOLD_LINE ?= \"жирна лінія\"\n!$LEGEND_SOLID_LINE ?= \"суцільна лінія\"\n' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"transparent, \"\n!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= \"\"\n!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"штрихова, \"\n' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= \"\"\n!$LEGEND_THICKNESS ?= \"товщина\"\n\n!$SKETCH_FOOTER_WARNING ?= \"Попередження:\"\n!$SKETCH_FOOTER_TEXT ?= \"Створено для обговорення, потребує перевірки\"\n\n!$COMPONENT_LEGEND_TEXT ?= \"компонент\"\n!$EXTERNAL_COMPONENT_LEGEND_TEXT ?= \"зовнішній компонент\"\n\n!$CONTAINER_LEGEND_TEXT ?= \"контейнер\"\n!$CONTAINER_BOUNDARY_TYPE ?= \"контейнер\"\n!$CONTAINER_BOUNDARY_LEGEND_TEXT ?= \"межа контейнера\"\n!$EXTERNAL_CONTAINER_LEGEND_TEXT ?= \"зовнішній контейнер\"\n\n!$PERSON_LEGEND_TEXT ?= \"особа\"\n!$EXTERNAL_PERSON_LEGEND_TEXT ?= \"зовнішня особа\"\n\n!$SYSTEM_LEGEND_TEXT ?= \"система\"\n!$SYSTEM_BOUNDARY_TYPE ?= \"система\"\n!$SYSTEM_BOUNDARY_LEGEND_TEXT ?= \"межа системи\"\n!$EXTERNAL_SYSTEM_LEGEND_TEXT ?= \"зовнішня система\"\n\n!$ENTERPRISE_BOUNDARY_TYPE ?= \"підприємства\"\n!$ENTERPRISE_BOUNDARY_LEGEND_TEXT ?= \"межа підприємства\"\n\n!$NODE_LEGEND_TEXT ?= \"вузол\"\n"
  },
  {
    "path": "themes/puml-theme-C4_FirstTest.puml",
    "content": "' First test with themes (it depends on a original theme, changes colors and set $TECHN_FONT_SIZE)\n\n!theme cyborg\n\n!$THEME = \"C4_FirstTest\"\n\n!$ELEMENT_FONT_COLOR ?= $PRIMARY_TEXT\n\n!$ARROW_COLOR ?= $PRIMARY_LIGHT\n!$ARROW_FONT_COLOR ?= $ARROW_COLOR\n\n!$BOUNDARY_COLOR ?= $PRIMARY_DARK\n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n\n!$LEGEND_FONT_COLOR ?= \"#FFFFFF\"\n!$LEGEND_TITLE_COLOR ?= \"#000000\"\n' %darken(darkkhaki,50), #khaki\n!$LEGEND_DARK_COLOR ?= \"#66622E\"\n!$LEGEND_LIGHT_COLOR ?= \"#khaki\"\n\n!$PERSON_FONT_COLOR ?= $INFO_TEXT\n!$PERSON_BG_COLOR ?= $INFO_LIGHT\n!$PERSON_BORDER_COLOR ?= $INFO_DARK\n\n!$EXTERNAL_PERSON_FONT_COLOR ?= $INFO_TEXT\n!$EXTERNAL_PERSON_BG_COLOR ?= $INFO_DARK\n!$EXTERNAL_PERSON_BORDER_COLOR ?= $INFO_LIGHT\n\n!$SYSTEM_FONT_COLOR ?= $SUCCESS_TEXT\n!$SYSTEM_BG_COLOR ?= $SUCCESS_LIGHT\n!$SYSTEM_BORDER_COLOR ?= $SUCCESS_DARK\n\n!$EXTERNAL_SYSTEM_FONT_COLOR ?= $SUCCESS_TEXT\n!$EXTERNAL_SYSTEM_BG_COLOR ?= $SUCCESS_DARK\n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= $SUCCESS_LIGHT\n\n!$CONTAINER_FONT_COLOR ?= $WARNING_TEXT\n!$CONTAINER_BG_COLOR ?= $DANGER_LIGHT\n!$CONTAINER_BORDER_COLOR ?= $DANGER_DARK\n\n!$EXTERNAL_CONTAINER_FONT_COLOR ?= $WARNING_TEXT\n!$EXTERNAL_CONTAINER_BG_COLOR ?= $DANGER_DARK\n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= $DANGER_LIGHT\n\n!$COMPONENT_FONT_COLOR ?= $PRIMARY_TEXT \n!$COMPONENT_BG_COLOR ?= $PRIMARY_LIGHT\n!$COMPONENT_BORDER_COLOR ?= $PRIMARY_DARK\n\n!$EXTERNAL_COMPONENT_FONT_COLOR ?= $PRIMARY_TEXT \n!$EXTERNAL_COMPONENT_BG_COLOR ?= $PRIMARY_DARK\n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= $PRIMARY_LIGHT\n\n!$NODE_FONT_COLOR ?= $SECONDARY_TEXT\n!$NODE_BG_COLOR ?= $SECONDARY_LIGHT\n!$NODE_BORDER_COLOR ?= $SECONDARY_DARK\n\n!$TECHN_FONT_SIZE ?= 18\n\n' <<<<<<<<<<<<< sequence diagram is styled via skinparam and style\n\n' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,...\n' (no default values which are defined in C4.puml) \n' If skinparams and styles are defined with concrete values no variables are required \n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$ARROW_COLOR ?= \"#666666\"\n\n' replace transparent with concrete background that it can be used as font color too\n!if ($BOUNDARY_BG_COLOR == \"transparent\")\n  !$SEQUENCE_BG_COLOR = white\n!else\n  !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR\n!endif\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n' \"C4 styled\" default is that lifeline is arrow color\nskinparam SequenceLifelineBorderColor $ARROW_COLOR\n\nskinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupFontColor $BOUNDARY_COLOR\nskinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR\nskinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceReferenceFontColor $BOUNDARY_COLOR\nskinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR\n' VIA STYLE\n' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR\n<style>\nreferenceHeader {\n  fontcolor $SEQUENCE_BG_COLOR\n}\n</style>\nskinparam SequenceReferenceBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceDividerFontColor $BOUNDARY_COLOR\nskinparam SequenceDividerBorderColor $BOUNDARY_COLOR\n\n' VIA STYLE\n' skinparam SequenceDelayFontColor green\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $BOUNDARY_COLOR\n  }\n}\n</style>\n\n' <<<<<<<<<<<<< end sequence diagram\n"
  },
  {
    "path": "themes/puml-theme-C4_blue.puml",
    "content": "!$THEME = \"C4_blue\"\n\n!$ELEMENT_FONT_COLOR ?= \"#FFFFFF\"\n\n!$PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$PERSON_BG_COLOR ?= \"#08427B\" \n!$PERSON_BORDER_COLOR ?= \"#073B6F\" \n!$EXTERNAL_PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$EXTERNAL_PERSON_BG_COLOR ?= \"#686868\" \n!$EXTERNAL_PERSON_BORDER_COLOR ?= \"#8A8A8A\" \n\n!$SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$SYSTEM_BG_COLOR ?= \"#1168BD\" \n!$SYSTEM_BORDER_COLOR ?= \"#3C7FC0\" \n!$EXTERNAL_SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$EXTERNAL_SYSTEM_BG_COLOR ?= \"#999999\" \n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= \"#8A8A8A\" \n\n!$CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$CONTAINER_BG_COLOR ?= \"#438DD5\" \n!$CONTAINER_BORDER_COLOR ?= \"#3C7FC0\" \n!$EXTERNAL_CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$EXTERNAL_CONTAINER_BG_COLOR ?= \"#B3B3B3\" \n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= \"#A6A6A6\" \n\n!$COMPONENT_FONT_COLOR ?= \"#000000\" \n!$COMPONENT_BG_COLOR ?= \"#85BBF0\" \n!$COMPONENT_BORDER_COLOR ?= \"#78A8D8\" \n!$EXTERNAL_COMPONENT_FONT_COLOR ?= $COMPONENT_FONT_COLOR \n!$EXTERNAL_COMPONENT_BG_COLOR ?= \"#CCCCCC\" \n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= \"#BFBFBF\" \n\n!$NODE_FONT_COLOR ?= \"#000000\"\n!$NODE_BG_COLOR ?= \"#FFFFFF\"\n!$NODE_BORDER_COLOR ?= \"#A2A2A2\"\n\n' <<<<<<<<<<<<< sequence diagram is styled via skinparam and style\n\n' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,...\n' (no default values which are defined in C4.puml) \n' If skinparams and styles are defined with concrete values no variables are required \n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$ARROW_COLOR ?= \"#666666\"\n\n' replace transparent with concrete background that it can be used as font color too\n!if ($BOUNDARY_BG_COLOR == \"transparent\")\n  !$SEQUENCE_BG_COLOR = white\n!else\n  !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR\n!endif\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n' \"C4 styled\" default is that lifeline is arrow color\nskinparam SequenceLifelineBorderColor $ARROW_COLOR\n\nskinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupFontColor $BOUNDARY_COLOR\nskinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR\nskinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceReferenceFontColor $BOUNDARY_COLOR\nskinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR\n' VIA STYLE\n' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR\n<style>\nreferenceHeader {\n  fontcolor $SEQUENCE_BG_COLOR\n}\n</style>\nskinparam SequenceReferenceBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceDividerFontColor $BOUNDARY_COLOR\nskinparam SequenceDividerBorderColor $BOUNDARY_COLOR\n\n' VIA STYLE\n' skinparam SequenceDelayFontColor green\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $BOUNDARY_COLOR\n  }\n}\n</style>\n\n' <<<<<<<<<<<<< end sequence diagram\n"
  },
  {
    "path": "themes/puml-theme-C4_blue_new.puml",
    "content": "!$THEME = \"C4_blue_new\"\n\n' new style uses rounded rectangles by default, and wireframe style is defined via swapped colors in theme itself\n!ROUNDED_STYLE ?= 1\n!NEW_C4_STYLE ?= 0\n\n!$ELEMENT_FONT_COLOR ?= \"#002147\"\n!$ELEMENT_BG_COLOR ?= \"#FFFFFF\"\n!$ELEMENT_BORDER_COLOR ?= \"#002147\"\n!$EXTERNAL_ELEMENT_BG_COLOR ?= \"#F4F4F4\"\n!$EXTERNAL_ELEMENT_BORDER_COLOR ?= \"#080808\"\n\n!$PERSON_FONT_COLOR ?= \"#002147\"\n!$PERSON_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$PERSON_BORDER_COLOR ?= \"#002147\"\n!$EXTERNAL_PERSON_FONT_COLOR ?= \"#002147\"\n!$EXTERNAL_PERSON_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_PERSON_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$SYSTEM_FONT_COLOR ?= \"#0057B8\"\n!$SYSTEM_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$SYSTEM_BORDER_COLOR ?= \"#0057B8\"\n!$EXTERNAL_SYSTEM_FONT_COLOR ?= \"#0057B8\"\n!$EXTERNAL_SYSTEM_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$CONTAINER_FONT_COLOR ?= \"#0074D9\"\n!$CONTAINER_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$CONTAINER_BORDER_COLOR ?= \"#0074D9\"\n!$EXTERNAL_CONTAINER_FONT_COLOR ?= \"#0074D9\"\n!$EXTERNAL_CONTAINER_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$COMPONENT_FONT_COLOR ?= \"#002147\"\n!$COMPONENT_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$COMPONENT_BORDER_COLOR ?= \"#002147\"\n!$EXTERNAL_COMPONENT_FONT_COLOR ?= \"#002147\"\n!$EXTERNAL_COMPONENT_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$NODE_FONT_COLOR ?= \"#000000\"\n!$NODE_BG_COLOR ?= \"#FFFFFF\"\n!$NODE_BORDER_COLOR ?= \"#A2A2A2\"\n\n' <<<<<<<<<<<<< sequence diagram is styled via skinparam and style\n\n' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,...\n' (no default values which are defined in C4.puml)\n' If skinparams and styles are defined with concrete values no variables are required\n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$ARROW_COLOR ?= \"#666666\"\n\n' replace transparent with concrete background that it can be used as font color too\n!if ($BOUNDARY_BG_COLOR == \"transparent\")\n  !$SEQUENCE_BG_COLOR = white\n!else\n  !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR\n!endif\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n' \"C4 styled\" default is that lifeline is arrow color\nskinparam SequenceLifelineBorderColor $ARROW_COLOR\n\nskinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupFontColor $BOUNDARY_COLOR\nskinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR\nskinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceReferenceFontColor $BOUNDARY_COLOR\nskinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR\n' VIA STYLE\n' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR\n<style>\nreferenceHeader {\n  fontcolor $SEQUENCE_BG_COLOR\n}\n</style>\nskinparam SequenceReferenceBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceDividerFontColor $BOUNDARY_COLOR\nskinparam SequenceDividerBorderColor $BOUNDARY_COLOR\n\n' VIA STYLE\n' skinparam SequenceDelayFontColor green\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $BOUNDARY_COLOR\n  }\n}\n</style>\n\n' <<<<<<<<<<<<< end sequence diagram\n"
  },
  {
    "path": "themes/puml-theme-C4_brown.puml",
    "content": "!$THEME = \"C4_brown\"\n\n!$ELEMENT_FONT_COLOR ?= \"#FFFFFF\"\n\n!$PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$PERSON_BG_COLOR ?= \"#7B4208\" \n!$PERSON_BORDER_COLOR ?= \"#6F3B07\" \n!$EXTERNAL_PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$EXTERNAL_PERSON_BG_COLOR ?= \"#686868\" \n!$EXTERNAL_PERSON_BORDER_COLOR ?= \"#8A8A8A\" \n\n!$SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$SYSTEM_BG_COLOR ?= \"#BD6811\" \n!$SYSTEM_BORDER_COLOR ?= \"#C07F3C\" \n!$EXTERNAL_SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$EXTERNAL_SYSTEM_BG_COLOR ?= \"#999999\" \n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= \"#8A8A8A\" \n\n!$CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$CONTAINER_BG_COLOR ?= \"#D58D43\" \n!$CONTAINER_BORDER_COLOR ?= \"#C07F3C\" \n!$EXTERNAL_CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$EXTERNAL_CONTAINER_BG_COLOR ?= \"#B3B3B3\" \n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= \"#A6A6A6\" \n\n!$COMPONENT_FONT_COLOR ?= \"#000000\" \n!$COMPONENT_BG_COLOR ?= \"#F0BB85\" \n!$COMPONENT_BORDER_COLOR ?= \"#D8A878\" \n!$EXTERNAL_COMPONENT_FONT_COLOR ?= $COMPONENT_FONT_COLOR \n!$EXTERNAL_COMPONENT_BG_COLOR ?= \"#CCCCCC\" \n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= \"#BFBFBF\" \n\n!$NODE_FONT_COLOR ?= \"#000000\"\n!$NODE_BG_COLOR ?= \"#FFFFFF\"\n!$NODE_BORDER_COLOR ?= \"#A2A2A2\"\n\n' <<<<<<<<<<<<< sequence diagram is styled via skinparam and style\n\n' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,...\n' (no default values which are defined in C4.puml) \n' If skinparams and styles are defined with concrete values no variables are required \n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$ARROW_COLOR ?= \"#666666\"\n\n' replace transparent with concrete background that it can be used as font color too\n!if ($BOUNDARY_BG_COLOR == \"transparent\")\n  !$SEQUENCE_BG_COLOR = white\n!else\n  !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR\n!endif\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n' \"C4 styled\" default is that lifeline is arrow color\nskinparam SequenceLifelineBorderColor $ARROW_COLOR\n\nskinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupFontColor $BOUNDARY_COLOR\nskinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR\nskinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceReferenceFontColor $BOUNDARY_COLOR\nskinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR\n' VIA STYLE\n' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR\n<style>\nreferenceHeader {\n  fontcolor $SEQUENCE_BG_COLOR\n}\n</style>\nskinparam SequenceReferenceBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceDividerFontColor $BOUNDARY_COLOR\nskinparam SequenceDividerBorderColor $BOUNDARY_COLOR\n\n' VIA STYLE\n' skinparam SequenceDelayFontColor green\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $BOUNDARY_COLOR\n  }\n}\n</style>\n\n' <<<<<<<<<<<<< end sequence diagram\n\n"
  },
  {
    "path": "themes/puml-theme-C4_brown_new.puml",
    "content": "!$THEME = \"C4_brown_new\"\n\n' new style uses rounded rectangles by default, and wireframe style is defined via swapped colors in theme itself\n!ROUNDED_STYLE ?= 1\n!NEW_C4_STYLE ?= 0\n\n!$ELEMENT_FONT_COLOR ?= \"#472100\"\n!$ELEMENT_BG_COLOR ?= \"#FFFFFF\"\n!$ELEMENT_BORDER_COLOR ?= \"#472100\"\n!$EXTERNAL_ELEMENT_BG_COLOR ?= \"#F4F4F4\"\n!$EXTERNAL_ELEMENT_BORDER_COLOR ?= \"#080808\"\n\n!$PERSON_FONT_COLOR ?= \"#472100\"\n!$PERSON_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$PERSON_BORDER_COLOR ?= \"#472100\"\n!$EXTERNAL_PERSON_FONT_COLOR ?= \"#472100\"\n!$EXTERNAL_PERSON_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_PERSON_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$SYSTEM_FONT_COLOR ?= \"#B85700\"\n!$SYSTEM_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$SYSTEM_BORDER_COLOR ?= \"#B85700\"\n!$EXTERNAL_SYSTEM_FONT_COLOR ?= \"#B85700\"\n!$EXTERNAL_SYSTEM_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$CONTAINER_FONT_COLOR ?= \"#D97400\"\n!$CONTAINER_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$CONTAINER_BORDER_COLOR ?= \"#D97400\"\n!$EXTERNAL_CONTAINER_FONT_COLOR ?= \"#D97400\"\n!$EXTERNAL_CONTAINER_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$COMPONENT_FONT_COLOR ?= \"#472100\"\n!$COMPONENT_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$COMPONENT_BORDER_COLOR ?= \"#472100\"\n!$EXTERNAL_COMPONENT_FONT_COLOR ?= \"#472100\"\n!$EXTERNAL_COMPONENT_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$NODE_FONT_COLOR ?= \"#000000\"\n!$NODE_BG_COLOR ?= \"#FFFFFF\"\n!$NODE_BORDER_COLOR ?= \"#A2A2A2\"\n\n' <<<<<<<<<<<<< sequence diagram is styled via skinparam and style\n\n' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,...\n' (no default values which are defined in C4.puml)\n' If skinparams and styles are defined with concrete values no variables are required\n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$ARROW_COLOR ?= \"#666666\"\n\n' replace transparent with concrete background that it can be used as font color too\n!if ($BOUNDARY_BG_COLOR == \"transparent\")\n  !$SEQUENCE_BG_COLOR = white\n!else\n  !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR\n!endif\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n' \"C4 styled\" default is that lifeline is arrow color\nskinparam SequenceLifelineBorderColor $ARROW_COLOR\n\nskinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupFontColor $BOUNDARY_COLOR\nskinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR\nskinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceReferenceFontColor $BOUNDARY_COLOR\nskinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR\n' VIA STYLE\n' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR\n<style>\nreferenceHeader {\n  fontcolor $SEQUENCE_BG_COLOR\n}\n</style>\nskinparam SequenceReferenceBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceDividerFontColor $BOUNDARY_COLOR\nskinparam SequenceDividerBorderColor $BOUNDARY_COLOR\n\n' VIA STYLE\n' skinparam SequenceDelayFontColor green\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $BOUNDARY_COLOR\n  }\n}\n</style>\n\n' <<<<<<<<<<<<< end sequence diagram\n\n"
  },
  {
    "path": "themes/puml-theme-C4_green.puml",
    "content": "!$THEME = \"C4_green\"\n\n!$ELEMENT_FONT_COLOR ?= \"#FFFFFF\"\n\n!$PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$PERSON_BG_COLOR ?= \"#427B08\" \n!$PERSON_BORDER_COLOR ?= \"#3B6F07\" \n!$EXTERNAL_PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$EXTERNAL_PERSON_BG_COLOR ?= \"#686868\" \n!$EXTERNAL_PERSON_BORDER_COLOR ?= \"#8A8A8A\" \n\n!$SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$SYSTEM_BG_COLOR ?= \"#68BD11\" \n!$SYSTEM_BORDER_COLOR ?= \"#7FC03C\" \n!$EXTERNAL_SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$EXTERNAL_SYSTEM_BG_COLOR ?= \"#999999\" \n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= \"#8A8A8A\" \n\n!$CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$CONTAINER_BG_COLOR ?= \"#8DD543\" \n!$CONTAINER_BORDER_COLOR ?= \"#7FC03C\" \n!$EXTERNAL_CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$EXTERNAL_CONTAINER_BG_COLOR ?= \"#B3B3B3\" \n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= \"#A6A6A6\" \n\n!$COMPONENT_FONT_COLOR ?= \"#000000\" \n!$COMPONENT_BG_COLOR ?= \"#BBF085\" \n!$COMPONENT_BORDER_COLOR ?= \"#A8D878\" \n!$EXTERNAL_COMPONENT_FONT_COLOR ?= $COMPONENT_FONT_COLOR \n!$EXTERNAL_COMPONENT_BG_COLOR ?= \"#CCCCCC\" \n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= \"#BFBFBF\" \n\n!$NODE_FONT_COLOR ?= \"#000000\"\n!$NODE_BG_COLOR ?= \"#FFFFFF\"\n!$NODE_BORDER_COLOR ?= \"#A2A2A2\"\n\n' <<<<<<<<<<<<< sequence diagram is styled via skinparam and style\n\n' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,...\n' (no default values which are defined in C4.puml) \n' If skinparams and styles are defined with concrete values no variables are required \n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$ARROW_COLOR ?= \"#666666\"\n\n' replace transparent with concrete background that it can be used as font color too\n!if ($BOUNDARY_BG_COLOR == \"transparent\")\n  !$SEQUENCE_BG_COLOR = white\n!else\n  !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR\n!endif\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n' \"C4 styled\" default is that lifeline is arrow color\nskinparam SequenceLifelineBorderColor $ARROW_COLOR\n\nskinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupFontColor $BOUNDARY_COLOR\nskinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR\nskinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceReferenceFontColor $BOUNDARY_COLOR\nskinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR\n' VIA STYLE\n' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR\n<style>\nreferenceHeader {\n  fontcolor $SEQUENCE_BG_COLOR\n}\n</style>\nskinparam SequenceReferenceBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceDividerFontColor $BOUNDARY_COLOR\nskinparam SequenceDividerBorderColor $BOUNDARY_COLOR\n\n' VIA STYLE\n' skinparam SequenceDelayFontColor green\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $BOUNDARY_COLOR\n  }\n}\n</style>\n\n' <<<<<<<<<<<<< end sequence diagram\n\n"
  },
  {
    "path": "themes/puml-theme-C4_green_new.puml",
    "content": "!$THEME = \"C4_green_new\"\n\n' new style uses rounded rectangles by default, and wireframe style is defined via swapped colors in theme itself\n!ROUNDED_STYLE ?= 1\n!NEW_C4_STYLE ?= 0\n\n!$ELEMENT_FONT_COLOR ?= \"#004721\"\n!$ELEMENT_BG_COLOR ?= \"#FFFFFF\"\n!$ELEMENT_BORDER_COLOR ?= \"#004721\"\n!$EXTERNAL_ELEMENT_BG_COLOR ?= \"#F4F4F4\"\n!$EXTERNAL_ELEMENT_BORDER_COLOR ?= \"#080808\"\n\n!$PERSON_FONT_COLOR ?= \"#004721\"\n!$PERSON_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$PERSON_BORDER_COLOR ?= \"#004721\"\n!$EXTERNAL_PERSON_FONT_COLOR ?= \"#004721\"\n!$EXTERNAL_PERSON_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_PERSON_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$SYSTEM_FONT_COLOR ?= \"#00B857\"\n!$SYSTEM_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$SYSTEM_BORDER_COLOR ?= \"#00B857\"\n!$EXTERNAL_SYSTEM_FONT_COLOR ?= \"#00B857\"\n!$EXTERNAL_SYSTEM_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$CONTAINER_FONT_COLOR ?= \"#00D974\"\n!$CONTAINER_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$CONTAINER_BORDER_COLOR ?= \"#00D974\"\n!$EXTERNAL_CONTAINER_FONT_COLOR ?= \"#00D974\"\n!$EXTERNAL_CONTAINER_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$COMPONENT_FONT_COLOR ?= \"#004721\"\n!$COMPONENT_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$COMPONENT_BORDER_COLOR ?= \"#004721\"\n!$EXTERNAL_COMPONENT_FONT_COLOR ?= \"#004721\"\n!$EXTERNAL_COMPONENT_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$NODE_FONT_COLOR ?= \"#000000\"\n!$NODE_BG_COLOR ?= \"#FFFFFF\"\n!$NODE_BORDER_COLOR ?= \"#A2A2A2\"\n\n' <<<<<<<<<<<<< sequence diagram is styled via skinparam and style\n\n' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,...\n' (no default values which are defined in C4.puml)\n' If skinparams and styles are defined with concrete values no variables are required\n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$ARROW_COLOR ?= \"#666666\"\n\n' replace transparent with concrete background that it can be used as font color too\n!if ($BOUNDARY_BG_COLOR == \"transparent\")\n  !$SEQUENCE_BG_COLOR = white\n!else\n  !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR\n!endif\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n' \"C4 styled\" default is that lifeline is arrow color\nskinparam SequenceLifelineBorderColor $ARROW_COLOR\n\nskinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupFontColor $BOUNDARY_COLOR\nskinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR\nskinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceReferenceFontColor $BOUNDARY_COLOR\nskinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR\n' VIA STYLE\n' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR\n<style>\nreferenceHeader {\n  fontcolor $SEQUENCE_BG_COLOR\n}\n</style>\nskinparam SequenceReferenceBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceDividerFontColor $BOUNDARY_COLOR\nskinparam SequenceDividerBorderColor $BOUNDARY_COLOR\n\n' VIA STYLE\n' skinparam SequenceDelayFontColor green\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $BOUNDARY_COLOR\n  }\n}\n</style>\n\n' <<<<<<<<<<<<< end sequence diagram\n\n"
  },
  {
    "path": "themes/puml-theme-C4_sandstone.puml",
    "content": "!theme sandstone\n\n!$THEME = \"C4_sandstone\"\n\n!$ELEMENT_FONT_COLOR ?= $PRIMARY_TEXT\n\n!$ARROW_COLOR ?= $PRIMARY_LIGHT\n!$ARROW_FONT_COLOR ?= $ARROW_COLOR\n\n!$PERSON_FONT_COLOR ?= $INFO_TEXT\n!$PERSON_BG_COLOR ?= $INFO\n!$PERSON_BORDER_COLOR ?= $INFO_DARK\n\n!$EXTERNAL_PERSON_FONT_COLOR ?= $INFO_DARK\n!$EXTERNAL_PERSON_BG_COLOR ?= $LIGHT\n!$EXTERNAL_PERSON_BORDER_COLOR ?= $INFO_DARK\n\n!$SYSTEM_FONT_COLOR ?= $WHITE\n!$SYSTEM_BG_COLOR ?= $DARK\n!$SYSTEM_BORDER_COLOR ?= $DARK_DARK\n\n!$EXTERNAL_SYSTEM_FONT_COLOR ?= $DARK_DARK\n!$EXTERNAL_SYSTEM_BG_COLOR ?= $LIGHT\n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= $DARK_DARK\n\n!$CONTAINER_FONT_COLOR ?= $WARNING_TEXT\n!$CONTAINER_BG_COLOR ?= $WARNING\n!$CONTAINER_BORDER_COLOR ?= $WARNING_DARK\n\n!$EXTERNAL_CONTAINER_FONT_COLOR ?= $WARNING_DARK\n!$EXTERNAL_CONTAINER_BG_COLOR ?= $LIGHT\n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= $WARNING_DARK\n\n!$COMPONENT_FONT_COLOR ?= $PRIMARY_TEXT\n!$COMPONENT_BG_COLOR ?= $PRIMARY\n!$COMPONENT_BORDER_COLOR ?= $PRIMARY_DARK\n\n!$EXTERNAL_COMPONENT_FONT_COLOR ?= $PRIMARY_DARK\n!$EXTERNAL_COMPONENT_BG_COLOR ?= $LIGHT\n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= $PRIMARY_DARK\n\n!$NODE_FONT_COLOR ?= $LIGHT\n!$NODE_BG_COLOR ?= $SECONDARY\n!$NODE_BORDER_COLOR ?= $SECONDARY_DARK\n\n!$BOUNDARY_COLOR ?= $PRIMARY_DARK\n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_BORDER_STYLE ?= \"solid\"\n' border is not dashed in theme \"united\", remove dashed from legend text too\n!$LEGEND_DASHED_BOUNDARY ?= \"\"\n!$LEGEND_DASHED_TRANSPARENT_BOUNDARY ?= \"\"\n!$ENTERPRISE_BOUNDARY_COLOR ?= $SYSTEM_BORDER_COLOR\n!$SYSTEM_BOUNDARY_COLOR ?= $SYSTEM_BORDER_COLOR\n!$CONTAINER_BOUNDARY_COLOR ?= $CONTAINER_BORDER_COLOR\n\n!$LEGEND_TITLE_COLOR ?= $LIGHT\n!$LEGEND_FONT_COLOR ?= $LIGHT\n!$LEGEND_BG_COLOR ?= $SECONDARY\n!$LEGEND_BORDER_COLOR ?= $SECONDARY_DARK\n\n' <<<<<<<<<<<<< sequence diagram is styled via skinparam and style\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n\n' fix wrong ReferenceHeaderFontColor\n<style>\nreferenceHeader {\n  fontcolor $INFO\n}\n</style>\n\n' fix invisible SequenceDelayFontColor\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $DARK\n  }\n}\n</style>\n\n' <<<<<<<<<<<<< end sequence diagram\n"
  },
  {
    "path": "themes/puml-theme-C4_superhero.puml",
    "content": "!$BGCOLOR ?= black\n\n!theme superhero\n\n!$THEME = \"C4_superhero\"\n\n!$ELEMENT_FONT_COLOR ?= $PRIMARY_TEXT\n\n!$ARROW_COLOR ?= $PRIMARY_LIGHT\n!$ARROW_FONT_COLOR ?= $ARROW_COLOR\n\n!$PERSON_FONT_COLOR ?= $INFO_TEXT\n!$PERSON_BG_COLOR ?= $INFO\n!$PERSON_BORDER_COLOR ?= $INFO_DARK\n\n!$EXTERNAL_PERSON_FONT_COLOR ?= $INFO_DARK\n!$EXTERNAL_PERSON_BG_COLOR ?= $SECONDARY_DARK\n!$EXTERNAL_PERSON_BORDER_COLOR ?= $INFO_DARK\n\n!$SYSTEM_FONT_COLOR ?= $WHITE\n!$SYSTEM_BG_COLOR ?= $DARK\n!$SYSTEM_BORDER_COLOR ?= $DARK_DARK\n\n!$EXTERNAL_SYSTEM_FONT_COLOR ?= 000000\n!$EXTERNAL_SYSTEM_BG_COLOR ?= $SECONDARY_DARK\n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= $DARK_LIGHT\n\n!$CONTAINER_FONT_COLOR ?= $WARNING_TEXT\n!$CONTAINER_BG_COLOR ?= $WARNING\n!$CONTAINER_BORDER_COLOR ?= $WARNING_DARK\n\n!$EXTERNAL_CONTAINER_FONT_COLOR ?= $WARNING_DARK\n!$EXTERNAL_CONTAINER_BG_COLOR ?= $SECONDARY_DARK\n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= $WARNING_DARK\n\n!$COMPONENT_FONT_COLOR ?= $PRIMARY_TEXT\n!$COMPONENT_BG_COLOR ?= $PRIMARY\n!$COMPONENT_BORDER_COLOR ?= $PRIMARY_DARK\n\n!$EXTERNAL_COMPONENT_FONT_COLOR ?= $PRIMARY_DARK\n!$EXTERNAL_COMPONENT_BG_COLOR ?= $SECONDARY_DARK\n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= $PRIMARY_DARK\n\n!$NODE_FONT_COLOR ?= $LIGHT\n!$NODE_BG_COLOR ?= $SECONDARY\n!$NODE_BORDER_COLOR ?= $SECONDARY_DARK\n\n!$BOUNDARY_COLOR ?= $PRIMARY_DARK\n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_BORDER_STYLE ?= \"solid\"\n' border is not dashed in theme \"united\", remove dashed from legend text too\n!$LEGEND_DASHED_BOUNDARY ?= \"\"\n!$LEGEND_DASHED_TRANSPARENT_BOUNDARY ?= \"\"\n!$ENTERPRISE_BOUNDARY_COLOR ?= $SYSTEM_BORDER_COLOR\n!$SYSTEM_BOUNDARY_COLOR ?= $SYSTEM_BORDER_COLOR\n!$CONTAINER_BOUNDARY_COLOR ?= $CONTAINER_BORDER_COLOR\n\n!$LEGEND_TITLE_COLOR ?= $LIGHT\n!$LEGEND_FONT_COLOR ?= $LIGHT\n!$LEGEND_BG_COLOR ?= $SECONDARY\n!$LEGEND_BORDER_COLOR ?= $SECONDARY_DARK\n\n' <<<<<<<<<<<<< sequence diagram is styled via skinparam and style\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n\n' fix wrong ReferenceHeaderFontColor\n<style>\nreferenceHeader {\n  fontcolor $INFO\n}\n</style>\n\n' fix invisible SequenceDelayFontColor\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $DARK\n  }\n}\n</style>\n\n' <<<<<<<<<<<<< end sequence diagram\n"
  },
  {
    "path": "themes/puml-theme-C4_united.puml",
    "content": "!theme united\n\n!$THEME = \"C4_united\"\n\n!$ELEMENT_FONT_COLOR ?= $PRIMARY_TEXT\n\n!$ARROW_COLOR ?= $PRIMARY_LIGHT\n!$ARROW_FONT_COLOR ?= $ARROW_COLOR\n\n!$PERSON_FONT_COLOR ?= $INFO_TEXT\n!$PERSON_BG_COLOR ?= $INFO\n!$PERSON_BORDER_COLOR ?= $INFO_DARK\n\n!$EXTERNAL_PERSON_FONT_COLOR ?= $INFO_DARK\n!$EXTERNAL_PERSON_BG_COLOR ?= $LIGHT\n!$EXTERNAL_PERSON_BORDER_COLOR ?= $INFO_DARK\n\n!$SYSTEM_FONT_COLOR ?= $WHITE\n!$SYSTEM_BG_COLOR ?= $DARK\n!$SYSTEM_BORDER_COLOR ?= $DARK_DARK\n\n!$EXTERNAL_SYSTEM_FONT_COLOR ?= $DARK_DARK\n!$EXTERNAL_SYSTEM_BG_COLOR ?= $LIGHT\n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= $DARK_DARK\n\n!$CONTAINER_FONT_COLOR ?= $WARNING_TEXT\n!$CONTAINER_BG_COLOR ?= $WARNING\n!$CONTAINER_BORDER_COLOR ?= $WARNING_DARK\n\n!$EXTERNAL_CONTAINER_FONT_COLOR ?= $WARNING_DARK\n!$EXTERNAL_CONTAINER_BG_COLOR ?= $LIGHT\n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= $WARNING_DARK\n\n!$COMPONENT_FONT_COLOR ?= $PRIMARY_TEXT\n!$COMPONENT_BG_COLOR ?= $PRIMARY\n!$COMPONENT_BORDER_COLOR ?= $PRIMARY_DARK\n\n!$EXTERNAL_COMPONENT_FONT_COLOR ?= $PRIMARY_DARK\n!$EXTERNAL_COMPONENT_BG_COLOR ?= $LIGHT\n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= $PRIMARY_DARK\n\n!$NODE_FONT_COLOR ?= $LIGHT\n!$NODE_BG_COLOR ?= $SECONDARY\n!$NODE_BORDER_COLOR ?= $SECONDARY_DARK\n\n!$BOUNDARY_COLOR ?= $PRIMARY_DARK\n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_BORDER_STYLE ?= \"solid\"\n' border is not dashed in theme \"united\", remove dashed from legend text too\n!$LEGEND_DASHED_BOUNDARY ?= \"\"\n!$LEGEND_DASHED_TRANSPARENT_BOUNDARY ?= \"\"\n!$ENTERPRISE_BOUNDARY_COLOR ?= $SYSTEM_BORDER_COLOR\n!$SYSTEM_BOUNDARY_COLOR ?= $SYSTEM_BORDER_COLOR\n!$CONTAINER_BOUNDARY_COLOR ?= $CONTAINER_BORDER_COLOR\n\n!$LEGEND_TITLE_COLOR ?= $LIGHT\n!$LEGEND_FONT_COLOR ?= $LIGHT\n!$LEGEND_BG_COLOR ?= $SECONDARY\n!$LEGEND_BORDER_COLOR ?= $SECONDARY_DARK\n\n' <<<<<<<<<<<<< sequence diagram is styled via skinparam and style\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n\n' fix wrong ReferenceHeaderFontColor\n<style>\nreferenceHeader {\n  fontcolor $INFO\n}\n</style>\n\n' fix invisible SequenceDelayFontColor\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $DARK\n  }\n}\n</style>\n\n' <<<<<<<<<<<<< end sequence diagram\n"
  },
  {
    "path": "themes/puml-theme-C4_violet.puml",
    "content": "!$THEME = \"C4_violet\"\n\n!$ELEMENT_FONT_COLOR ?= \"#FFFFFF\"\n\n!$PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$PERSON_BG_COLOR ?= \"#42087B\" \n!$PERSON_BORDER_COLOR ?= \"#3B076F\" \n!$EXTERNAL_PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$EXTERNAL_PERSON_BG_COLOR ?= \"#686868\" \n!$EXTERNAL_PERSON_BORDER_COLOR ?= \"#8A8A8A\" \n\n!$SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$SYSTEM_BG_COLOR ?= \"#6811BD\" \n!$SYSTEM_BORDER_COLOR ?= \"#7F3CC0\" \n!$EXTERNAL_SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$EXTERNAL_SYSTEM_BG_COLOR ?= \"#999999\" \n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= \"#8A8A8A\" \n\n!$CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$CONTAINER_BG_COLOR ?= \"#8D43D5\" \n!$CONTAINER_BORDER_COLOR ?= \"#7F3CC0\" \n!$EXTERNAL_CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR \n!$EXTERNAL_CONTAINER_BG_COLOR ?= \"#B3B3B3\" \n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= \"#A6A6A6\" \n\n!$COMPONENT_FONT_COLOR ?= \"#000000\" \n!$COMPONENT_BG_COLOR ?= \"#BB85F0\" \n!$COMPONENT_BORDER_COLOR ?= \"#A878D8\" \n!$EXTERNAL_COMPONENT_FONT_COLOR ?= $COMPONENT_FONT_COLOR \n!$EXTERNAL_COMPONENT_BG_COLOR ?= \"#CCCCCC\" \n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= \"#BFBFBF\" \n\n!$NODE_FONT_COLOR ?= \"#000000\"\n!$NODE_BG_COLOR ?= \"#FFFFFF\"\n!$NODE_BORDER_COLOR ?= \"#A2A2A2\"\n\n' <<<<<<<<<<<<< sequence diagram is styled via skinparam and style\n\n' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,...\n' (no default values which are defined in C4.puml) \n' If skinparams and styles are defined with concrete values no variables are required \n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$ARROW_COLOR ?= \"#666666\"\n\n' replace transparent with concrete background that it can be used as font color too\n!if ($BOUNDARY_BG_COLOR == \"transparent\")\n  !$SEQUENCE_BG_COLOR = white\n!else\n  !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR\n!endif\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n' \"C4 styled\" default is that lifeline is arrow color\nskinparam SequenceLifelineBorderColor $ARROW_COLOR\n\nskinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupFontColor $BOUNDARY_COLOR\nskinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR\nskinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceReferenceFontColor $BOUNDARY_COLOR\nskinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR\n' VIA STYLE\n' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR\n<style>\nreferenceHeader {\n  fontcolor $SEQUENCE_BG_COLOR\n}\n</style>\nskinparam SequenceReferenceBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceDividerFontColor $BOUNDARY_COLOR\nskinparam SequenceDividerBorderColor $BOUNDARY_COLOR\n\n' VIA STYLE\n' skinparam SequenceDelayFontColor green\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $BOUNDARY_COLOR\n  }\n}\n</style>\n\n' <<<<<<<<<<<<< end sequence diagram\n\n"
  },
  {
    "path": "themes/puml-theme-C4_violet_new.puml",
    "content": "!$THEME = \"C4_violet_new\"\n\n' new style uses rounded rectangles by default, and wireframe style is defined via swapped colors in theme itself\n!ROUNDED_STYLE ?= 1\n!NEW_C4_STYLE ?= 0\n\n!$ELEMENT_FONT_COLOR ?= \"#4B006E\"\n!$ELEMENT_BG_COLOR ?= \"#FFFFFF\"\n!$ELEMENT_BORDER_COLOR ?= \"#4B006E\"\n!$EXTERNAL_ELEMENT_BG_COLOR ?= \"#F4F4F4\"\n!$EXTERNAL_ELEMENT_BORDER_COLOR ?= \"#080808\"\n\n!$PERSON_FONT_COLOR ?= \"#4B006E\"\n!$PERSON_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$PERSON_BORDER_COLOR ?= \"#4B006E\"\n!$EXTERNAL_PERSON_FONT_COLOR ?= \"#4B006E\"\n!$EXTERNAL_PERSON_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_PERSON_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$SYSTEM_FONT_COLOR ?= \"#7C2AE8\"\n!$SYSTEM_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$SYSTEM_BORDER_COLOR ?= \"#7C2AE8\"\n!$EXTERNAL_SYSTEM_FONT_COLOR ?= \"#7C2AE8\"\n!$EXTERNAL_SYSTEM_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_SYSTEM_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$CONTAINER_FONT_COLOR ?= \"#A259E6\"\n!$CONTAINER_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$CONTAINER_BORDER_COLOR ?= \"#A259E6\"\n!$EXTERNAL_CONTAINER_FONT_COLOR ?= \"#A259E6\"\n!$EXTERNAL_CONTAINER_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_CONTAINER_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$COMPONENT_FONT_COLOR ?= \"#4B006E\"\n!$COMPONENT_BG_COLOR ?= $ELEMENT_BG_COLOR\n!$COMPONENT_BORDER_COLOR ?= \"#4B006E\"\n!$EXTERNAL_COMPONENT_FONT_COLOR ?= \"#4B006E\"\n!$EXTERNAL_COMPONENT_BG_COLOR ?= $EXTERNAL_ELEMENT_BG_COLOR\n!$EXTERNAL_COMPONENT_BORDER_COLOR ?= $EXTERNAL_ELEMENT_BORDER_COLOR\n\n!$NODE_FONT_COLOR ?= \"#000000\"\n!$NODE_BG_COLOR ?= \"#FFFFFF\"\n!$NODE_BORDER_COLOR ?= \"#A2A2A2\"\n\n' <<<<<<<<<<<<< sequence diagram is styled via skinparam and style\n\n' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,...\n' (no default values which are defined in C4.puml)\n' If skinparams and styles are defined with concrete values no variables are required\n!$BOUNDARY_BG_COLOR ?= \"transparent\"\n!$BOUNDARY_COLOR ?= \"#444444\"\n!$ARROW_COLOR ?= \"#666666\"\n\n' replace transparent with concrete background that it can be used as font color too\n!if ($BOUNDARY_BG_COLOR == \"transparent\")\n  !$SEQUENCE_BG_COLOR = white\n!else\n  !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR\n!endif\n\n' \"C4 styled\" default is no foot boxes\nhide footbox\n' \"C4 styled\" default is that lifeline is arrow color\nskinparam SequenceLifelineBorderColor $ARROW_COLOR\n\nskinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupFontColor $BOUNDARY_COLOR\nskinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR\nskinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR\nskinparam SequenceGroupBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceReferenceFontColor $BOUNDARY_COLOR\nskinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR\n' VIA STYLE\n' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR\n<style>\nreferenceHeader {\n  fontcolor $SEQUENCE_BG_COLOR\n}\n</style>\nskinparam SequenceReferenceBorderColor $BOUNDARY_COLOR\n\nskinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR\nskinparam SequenceDividerFontColor $BOUNDARY_COLOR\nskinparam SequenceDividerBorderColor $BOUNDARY_COLOR\n\n' VIA STYLE\n' skinparam SequenceDelayFontColor green\n<style>\nsequenceDiagram {\n  delay {\n    FontColor $BOUNDARY_COLOR\n  }\n}\n</style>\n\n' <<<<<<<<<<<<< end sequence diagram\n\n"
  }
]