diff --git a/.ci/terraform-init-all.sh b/.ci/terraform-init-all.sh new file mode 100755 index 0000000000..aff4845679 --- /dev/null +++ b/.ci/terraform-init-all.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +# This script will run terraform init in all subdirectories of the examples directory +# required to run tflint via pre-commit + +# only run the script if a uniique pid file exits if not creat it or --force flag is passed +pid="/tmp/philips-labs-terraform-aws-github-runner.pid" +if [ "$1" == "--force" ]; then + rm -f /tmp/philips-labs-terraform-aws-github-runner.pid +fi + +if [ ! -f $pid ]; then + echo $$ > $pid +else + echo "Init all terraform directories will be skipped. To run the script remove the file $pid or run with --force" + exit 0 +fi + +# Change to the examples directory +example_dirs=$(find examples -mindepth 1 -maxdepth 2 -type d | grep -v "templates") +module_dirs=$(find modules -mindepth 1 -maxdepth 2 -type d | grep -v "templates") + +# merge example_dirs and module_dirs in terraform_dirs +terraform_dirs=$(echo $example_dirs $module_dirs "modules/runners/pool" | tr " " "\n" | sort -u | tr "\n" " ") + +for dir in $terraform_dirs; do + # Check if the subdirectory exists in Git + if git rev-parse --is-inside-work-tree &>/dev/null && git ls-files --error-unmatch "$dir" &>/dev/null; then + echo "Running terraform init in ${dir} - supressing output" + pushd "$dir" >/dev/null + terraform init -lockfile=readonly -backend=false &>/dev/null || true + popd >/dev/null + fi +done diff --git a/.github/workflows/update-docs.yml b/.github/workflows/update-docs.yml index 261ed47e26..6d1289c9b9 100644 --- a/.github/workflows/update-docs.yml +++ b/.github/workflows/update-docs.yml @@ -32,9 +32,32 @@ jobs: uses: peter-evans/create-pull-request@153407881ec5c347639a548ade7d8ad1d6740e38 # ratchet:peter-evans/create-pull-request@v5.0.2 with: token: ${{ secrets.GITHUB_TOKEN }} - commit-message: "Update Terraform docs" + commit-message: "docs: auto update terraform docs" title: "docs: Update Terraform docs" branch: update-docs branch-suffix: random base: ${{ github.event.pull_request.base.ref }} delete-branch: true + + deploy-pages: + needs: [docs] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # ratchet:actions/checkout@v4 + - name: Configure Git Credentials + run: | + git config user.name github-actions[bot] + git config --global user.email "github-actions[bot]@users.noreply.github.com" + - uses: actions/setup-python@v4 + with: + python-version: 3.x + - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV + - uses: actions/cache@v3 + with: + key: mkdocs-material-${{ env.cache_id }} + path: .cache + restore-keys: | + mkdocs-material- + - run: pip install mkdocs-material + - run: pip install mkdocs-material-extensions + - run: mkdocs gh-deploy --force -c -b gh-pages diff --git a/.gitignore b/.gitignore index b3de97c9e3..bd9e5760f1 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ secrets.auto.tfvars **/coverage/* node_modules/ +site/ diff --git a/README.md b/README.md index f44198dc61..a2be66338b 100644 --- a/README.md +++ b/README.md @@ -1,461 +1,81 @@ -# Terraform module for scalable self hosted GitHub action runners +# Terraform module Self-Hosted Scalable GitHub Actions runners on AWS. -[![awesome-runners](https://img.shields.io/badge/listed%20on-awesome--runners-blue.svg)](https://github.com/jonico/awesome-runners)[![Terraform registry](https://img.shields.io/github/v/release/philips-labs/terraform-aws-github-runner?label=Terraform%20Registry)](https://registry.terraform.io/modules/philips-labs/github-runner/aws/) [![Terraform checks](https://github.com/philips-labs/terraform-aws-github-runner/actions/workflows/terraform.yml/badge.svg)](https://github.com/philips-labs/terraform-aws-github-runner/actions/workflows/terraform.yml) [![Lambdas](https://github.com/philips-labs/terraform-aws-github-runner/actions/workflows/lambda.yml/badge.svg)](https://github.com/philips-labs/terraform-aws-github-runner/actions/workflows/lambda.yml) +[![docs](https://img.shields.io/badge/docs-runners-blue.svg)](https://philips-labs.github.io/terraform-aws-github-runner) [![awesome-runners](https://img.shields.io/badge/listed%20on-awesome--runners-blue.svg)](https://github.com/jonico/awesome-runners) [![Terraform registry](https://img.shields.io/github/v/release/philips-labs/terraform-aws-github-runner?label=Terraform%20Registry)](https://registry.terraform.io/modules/philips-labs/github-runner/aws/) [![Terraform checks](https://github.com/philips-labs/terraform-aws-github-runner/actions/workflows/terraform.yml/badge.svg)](https://github.com/philips-labs/terraform-aws-github-runner/actions/workflows/terraform.yml) [![Lambdas](https://github.com/philips-labs/terraform-aws-github-runner/actions/workflows/lambda.yml/badge.svg)](https://github.com/philips-labs/terraform-aws-github-runner/actions/workflows/lambda.yml) -This [Terraform](https://www.terraform.io/) module creates the required infrastructure needed to host [GitHub Actions](https://github.com/features/actions) self-hosted, auto-scaling runners on [AWS spot instances](https://aws.amazon.com/ec2/spot/). It provides the required logic to handle the life cycle for scaling up and down using a set of AWS Lambda functions. Runners are scaled down to zero to avoid costs when no workflows are active. +> 📄 Extensive documentation is available via our [GitHub Pages Docs site](https://philips-labs.github.io/terraform-aws-github-runner/). > 📢 We maintain the project as a truly open-source project. We maintain the project on a best effort basis. We welcome contributions from the community. Feel free to help us answering issues, reviewing PRs, or maintaining and improving the project. > 📢 [`v5`](https://github.com/philips-labs/terraform-aws-github-runner/pull/3552) replaces Amazon Linux 2 with Amazon Linux 2023 as default OS. Check the PR for more details and other changes. -> 📢 For contibutions to older versions you can make a PR to the related branch, e.g. `v4`. We have no release process in place for older versions. - -> 📢 HELP WANTED: We have been running the AWS self-hosted GitHub runners OS project in Philips Labs for over two years! And we are incredibly happy with all the feedback and contributions of the open-source community. In the next months we will speak at some conferences to share the solution and story of running this open-source project. Via [this questionnaire](https://forms.office.com/r/j03CUzdLFp) we would like to gather feedback from the community to use in our talks. - -- [Motivation](#motivation) -- [Overview](#overview) - - [Major configuration options](#major-configuration-options) - - [AWS SSM Parameters](#aws-ssm-parameters) -- [Usages](#usages) - - [Setup GitHub App (part 1)](#setup-github-app-part-1) - - [Setup terraform module](#setup-terraform-module) - - [Setup the webhook / GitHub App (part 2)](#setup-the-webhook--github-app-part-2) - - [Option 1: Webhook](#option-1-webhook) - - [Option 2: App](#option-2-app) - - [Install app](#install-app) - - [Encryption](#encryption) - - [Pool](#pool) - - [Idle runners](#idle-runners) - - [Ephemeral runners](#ephemeral-runners) - - [Prebuilt Images](#prebuilt-images) - - [Experimental - Optional queue to publish GitHub workflow job events](#experimental---optional-queue-to-publish-github-workflow-job-events) -- [Examples](#examples) -- [Sub modules](#sub-modules) -- [Logging](#logging) -- [Tracing](#tracing) -- [Debugging](#debugging) -- [Security Considerations](#security-considerations) -- [Requirements](#requirements) -- [Providers](#providers) -- [Modules](#modules) -- [Resources](#resources) -- [Inputs](#inputs) -- [Outputs](#outputs) -- [Contributing](#contributing) -- [Philips Forest](#philips-forest) - -## Motivation - -GitHub Actions `self-hosted` runners provide a flexible option to run CI workloads on the infrastructure of your choice. However, currently GitHub does not provide tooling to automate the creation and scaling of action runners. This module creates the AWS infrastructure to host action runners on spot instances. It also provides lambda modules to orchestrate the life cycle of the action runners. - -Lambda was selected as the preferred runtime for two primary reasons. Firstly, it enables the development of compact components with limited access to AWS and GitHub. Secondly, it offers a scalable configuration with minimal expenses, applicable at both the repository and organizational levels. The Lambda functions will be responsible for provisioning Linux-based EC2 instances equipped with Docker to handle CI workloads compatible with Linux and/or Docker. The primary objective is to facilitate Docker-based workloads. - -A pertinent question may arise: why not opt for Kubernetes? The current strategy aligns closely with the implementation of GitHub's action runners. The chosen approach involves installing the runner on a host where the necessary software is readily available, maintaining proximity to GitHub's existing practices. Another viable option could be AWS Auto Scaling groups. However, this alternative usually demands broader permissions at the instance level from GitHub. Additionally, managing the scaling process, both up and down, becomes a non-trivial task in this scenario. - -## Overview - -The moment a GitHub action workflow requiring a `self-hosted` runner is triggered, GitHub will try to find a runner which can execute the workload. See [additional notes](docs/additional_notes.md) for how the selection is made. This module reacts to GitHub's [`workflow_job` event](https://docs.github.com/en/free-pro-team@latest/developers/webhooks-and-events/webhook-events-and-payloads#workflow_job) for the triggered workflow and creates a new runner if necessary. - -For receiving the `workflow_job` event by the webhook (lambda), a webhook needs to be created in GitHub. The `check_run` option was dropped from version 2.x. The following options to send the event are supported. - -- Create a GitHub app, define a webhook and subscribe the app to the `workflow_job` event. -- Create a webhook on enterprise, org or repo level, define a webhook and subscribe the app to the `workflow_job` event. - -In AWS an [API gateway](https://docs.aws.amazon.com/apigateway/index.html) endpoint is created that is able to receive the GitHub webhook events via HTTP post. The gateway triggers the webhook lambda which will verify the signature of the event. This check guarantees the event is sent by the GitHub App. The lambda only handles `workflow_job` events with status `queued` and matching the runner labels. The accepted events are posted on a SQS queue. Messages on this queue will be delayed for a configurable amount of seconds (default 30 seconds) to give the available runners time to pick up this build. - -The "Scale Up Runner" Lambda actively monitors the SQS queue, processing incoming events. The Lambda conducts a series of checks to determine the necessity of creating a new EC2 spot instance. For instance, it refrains from creating an instance if a build is already initiated by an existing runner or if the maximum allowable number of runners has been reached. - -The Lambda first requests a JIT configuration or registration token from GitHub, which is needed later by the runner to register itself. This avoids the case that the EC2 instance, which later in the process will install the agent, needs administration permissions to register the runner. Next, the EC2 spot instance is created via the launch template. The launch template defines the specifications of the required instance and contains a [`user_data`](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html) script. This script will install the required software and configure it. The registration token for the action runner is stored in the parameter store (SSM), from which the user data script will fetch it and delete it once it has been retrieved. Once the user data script is finished, the action runner should be online, and the workflow will start in seconds. - -The current method for scaling down runners employs a straightforward approach: at predefined intervals, the Lambda conducts a thorough examination of each runner (instance) to assess its activity. If a runner is found to be idle, it is deregistered from GitHub, and the associated AWS instance is terminated. Presently, no alternative method appears available for achieving a more gradual scaling down process. - -To address potential delays in downloading the GitHub Action Runner distribution, a lambda function has been implemented to synchronize the action runner binary from GitHub to an S3 bucket. This ensures that the EC2 instance can retrieve the distribution from the S3 bucket, mitigating the need to rely on internet downloads, which can occasionally take more than 10 minutes. - -Sensitive information such as secrets and private keys is stored securely in the SSM Parameter Store. These values undergo encryption using either the default KMS key for SSM or a custom KMS key, depending on the specified configuration. - -![Architecture](docs/component-overview.svg) - -Permission are managed in several places. Below are the most important ones. For details check the Terraform sources. - -- The GitHub App requires access to actions and to publish `workflow_job` events to the AWS webhook (API gateway). -- The scale up lambda should have access to EC2 for creating and tagging instances. -- The scale down lambda should have access to EC2 to terminate instances. - -Besides these permissions, the lambdas also need permission to CloudWatch (for logging and scheduling), SSM and S3. For more details about the required permissions see the [documentation](./modules/setup-iam-permissions/README.md) of the IAM module which uses permission boundaries. - -### Major configuration options - -To be able to support a number of use-cases, the module has quite a lot of configuration options. We tried to choose reasonable defaults. Several examples also show the main cases of how to configure the runners. - -- Org vs Repo level. You can configure the module to connect the runners in GitHub on an org level and share the runners in your org, or set the runners on repo level and the module will install the runner to the repo. There can be multiple repos but runners are not shared between repos. -- Multi-Runner module. This modules allows you to create multiple runner configurations with a single webhook and single GitHub App to simplify deployment of different types of runners. Refer to the [ReadMe](.modules/../modules/multi-runner/README.md) for more information to understand the functionality. -- Workflow job event. You can configure the webhook in GitHub to send workflow job events to the webhook. Workflow job events were introduced by GitHub in September 2021 and are designed to support scalable runners. We advise using the workflow job event when possible. -- Linux vs Windows. You can configure the OS types linux and win. Linux will be used by default. -- Re-use vs Ephemeral. By default runners are re-used, until detected idle. Once idle they will be removed from the pool. To improve security we are introducing ephemeral runners. Those runners are only used for one job. Ephemeral runners only work in combination with the workflow job event. For ephemeral runners the lambda requests a JIT (just in time) configuration via the GitHub API to register the runner. [JIT configuration](https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-just-in-time-runners) is limited to ephemeral runners (and currently not supported by GHES). For non-ephemeral runners, a registration token is always requested. In both cases the configuration is made available to the instance via the same SSM parameter. To disable JIT configuration for ephemeral runners set `enable_jit_config` to `false`. We also suggest using a pre-build AMI to improve the start time of jobs for ephemeral runners. -- GitHub Cloud vs GitHub Enterprise Server (GHES). The runners support GitHub Cloud as well GitHub Enterprise Server. For GHES, we rely on our community for support and testing. We at Philips have no capability to test GHES ourselves. -- Spot vs on-demand. The runners use either the EC2 spot or on-demand life cycle. Runners will be created via the AWS [CreateFleet API](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet.html). The module (scale up lambda) will request via the CreateFleet API to create instances in one of the subnets and of the specified instance types. -- ARM64 support via Graviton/Graviton2 instance-types. When using the default example or top-level module, specifying `instance_types` that match a Graviton/Graviton 2 (ARM64) architecture (e.g. a1, t4g or any 6th-gen `g` or `gd` type), you must also specify `runner_architecture = "arm64"` and the sub-modules will be automatically configured to provision with ARM64 AMIs and leverage GitHub's ARM64 action runner. See below for more details. - -### AWS SSM Parameters - -The module uses the AWS System Manager Parameter Store to store configuration for the runners, as well as registration tokens and secrets for the Lambdas. Paths for the parameters can be configured via the variable `ssm_paths`. The location of the configuration parameters is retrieved by the runners via the instance tag `ghr:ssm_config_path`. The following default paths will be used. Tokens or JIT config stored in the token path will be deleted after retrieval by instance, data not deleted after a day will be deleted by a SSM housekeeper lambda. - -| Path | Description | -| ----------- | ----------- | -| `ssm_paths.root/var.prefix?/app/` | App secrets used by Lambda's | -| `ssm_paths.root/var.prefix?/runners/config/` | Configuration parameters used by runner start script | -| `ssm_paths.root/var.prefix?/runners/tokens/` | Either JIT configuration (ephemeral runners) or registration tokens (non ephemeral runners) generated by the control plane (scale-up lambda), and consumed by the start script on the runner to activate / register the runner. - -Available configuration parameters: - -| Parameter name | Description | -| ----------- | ----------- | -| `agent_mode` | Indicates if the agent is running in ephemeral mode or not. | -| `enable_cloudwatch` | Configuration for the cloudwatch agent to stream logging. | -| `run_as` | The user used for running the GitHub action runner agent. | -| `token_path` | The path where tokens are stored. | - - -## Usages - -Examples are provided in [the example directory](examples/). Please ensure you have installed the following tools. - -- Terraform, or [tfenv](https://github.com/tfutils/tfenv). -- Bash shell or compatible -- Docker (optional, to build lambdas without node). -- AWS cli (optional) -- Node and yarn (for lambda development). - -The module supports two main scenarios for creating runners. Repository level runners will be dedicated to only one repository, so no other repository can use the runner. At the organization level, you can use the runner(s) for all repositories within the organization. See [GitHub self-hosted runner instructions](https://help.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners) for more information. Before starting the deployment you have to choose one option. - -The setup consists of running Terraform to create all AWS resources and manually configuring the GitHub App. The Terraform module requires configuration from the GitHub App and the GitHub app requires output from Terraform. Therefore you first create the GitHub App and configure the basics, then run Terraform, and afterwards finalize the configuration of the GitHub App. - -### Setup GitHub App (part 1) - -Go to GitHub and [create a new app](https://docs.github.com/en/developers/apps/creating-a-github-app). Be aware you can create apps for your organization or for a user. For now we only support organization level apps. - -1. Create an app in Github -2. Choose a name -3. Choose a website (mandatory, not required for the module). -4. Disable the webhook for now (we will configure this later or create an alternative webhook). -5. Permissions for all runners: - - Repository: - - `Actions`: Read-only (check for queued jobs) - - `Checks`: Read-only (receive events for new builds) - - `Metadata`: Read-only (default/required) -6. _Permissions for repo level runners only_: - - Repository: - - `Administration`: Read & write (to register runner) -7. _Permissions for organization level runners only_: - - Organization - - `Self-hosted runners`: Read & write (to register runner) -8. Save the new app. -9. On the General page, make a note of the "App ID" and "Client ID" parameters. -10. Generate a new private key and save the `app.private-key.pem` file. - -### Setup terraform module - -#### Download lambdas - -To apply the terraform module, the compiled lambdas (.zip files) need to be available either locally or in an S3 bucket. They can either be downloaded from the GitHub release page or built locally. - -To read the files from S3, set the `lambda_s3_bucket` variable and the specific object key for each lambda. - -The lambdas can be downloaded manually from the [release page](https://github.com/philips-labs/terraform-aws-github-runner/releases) or using the [download-lambda](./modules/download-lambda) terraform module (requires `curl` to be installed on your machine). In the `download-lambda` directory, run `terraform init && terraform apply`. The lambdas will be saved to the same directory. - -For local development you can build all the lambdas at once using `.ci/build.sh` or individually using `yarn dist`. - -#### Service-linked role - -To create spot instances the `AWSServiceRoleForEC2Spot` role needs to be added to your account. You can do that manually by following the [AWS docs](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-requests.html#service-linked-roles-spot-instance-requests). To use terraform for creating the role, either add the following resource or let the module manage the service linked role by setting `create_service_linked_role_spot` to `true`. Be aware this is an account global role, so maybe you don't want to manage it via a specific deployment. - -```hcl -resource "aws_iam_service_linked_role" "spot" { - aws_service_name = "spot.amazonaws.com" -} -``` - -#### Terraform module - -Next create a second terraform workspace and initiate the module, or adapt one of the [examples](./examples). - -Note that `github_app.key_base64` needs to be a base64-encoded string of the `.pem` file i.e. the output of `base64 app.private-key.pem`. The decoded string can either be a multiline value or a single line value with new lines represented with literal `\n` characters. - -```hcl -module "github-runner" { - source = "philips-labs/github-runner/aws" - version = "REPLACE_WITH_VERSION" - - aws_region = "eu-west-1" - vpc_id = "vpc-123" - subnet_ids = ["subnet-123", "subnet-456"] - - prefix = "gh-ci" - - github_app = { - key_base64 = "base64string" - id = "1" - webhook_secret = "webhook_secret" - } - - webhook_lambda_zip = "lambdas-download/webhook.zip" - runner_binaries_syncer_lambda_zip = "lambdas-download/runner-binaries-syncer.zip" - runners_lambda_zip = "lambdas-download/runners.zip" - enable_organization_runners = true -} -``` - -Run terraform by using the following commands - -```bash -terraform init -terraform apply -``` - -The terraform output displays the API gateway url (endpoint) and secret, which you need in the next step. - -The lambda for syncing the GitHub distribution to S3 is triggered via CloudWatch (by default once per hour). After deployment the function is triggered via S3 to ensure the distribution is cached. - -### Setup the webhook / GitHub App (part 2) - -At this point you have two options. Either create a separate webhook (enterprise, -org, or repo), or create a webhook in the App. - -#### Option 1: Webhook - -1. Create a new webhook at the repo level for repo level runners, or org (or enterprise level) for org level runners. -2. Provide the webhook url, which should be part of the output of terraform. -3. Provide the webhook secret (`terraform output -raw `). -4. Ensure the content type is `application/json`. -5. In the "Permissions & Events" section and then "Subscribe to Events" subsection, check either "Workflow Job" or "Check Run" (choose only one option!!!). -6. In the "Install App" section, install the App in your organization, either in all or in selected repositories. - -#### Option 2: App - -Go back to the GitHub App and update the following settings. - -1. Enable the webhook. -2. Provide the webhook url, should be part of the output of terraform. -3. Provide the webhook secret (`terraform output -raw `). -4. In the "Permissions & Events" section and then "Subscribe to Events" subsection, check either "Workflow Job" or "Check Run" (choose only one option!!!). - -#### Install app - -Finally you need to ensure the app is installed to all or selected repositories. - -Go back to the GitHub App and update the following settings. - -1. In the "Install App" section, install the App in your organization, either in all or in selected repositories. - -### Encryption - -The module supports two scenarios to manage environment secrets and private keys of the Lambda functions. - -#### Encrypted via a module managed KMS key (default) - -This is the default, no additional configuration is required. +> 📢 For contributions to older versions you can make a PR to the related branch, e.g. `v4`. We have no release process in place for older versions. -#### Encrypted via a provided KMS key - -You have to create and configure you KMS key. The module will use the context with key: `Environment` and value `var.environment` as encryption context. - -```hcl -resource "aws_kms_key" "github" { - is_enabled = true -} - -module "runners" { - - ... - kms_key_arn = aws_kms_key.github.arn - ... -``` - -### Pool - -The module supports two options for keeping a pool of runners. One is via a pool which only supports org-level runners, the second option is [keeping runners idle](#idle-runners). - -The pool is introduced in combination with the ephemeral runners and is primarily meant to ensure if any event is unexpectedly dropped and no runner was created, the pool can pick up the job. The pool is maintained by a lambda. Each time the lambda is triggered a check is performed to ensure the number of idle runners managed by the module matches the expected pool size. If not, the pool will be adjusted. Keep in mind that the scale down function is still active and will terminate instances that are detected as idle. - -```hcl -pool_runner_owner = "my-org" # Org to which the runners are added -pool_config = [{ - size = 20 # size of the pool - schedule_expression = "cron(* * * * ? *)" # cron expression to trigger the adjustment of the pool -}] -``` - -The pool is NOT enabled by default and can be enabled by setting at least one object of the pool config list. The [ephemeral example](./examples/ephemeral/README.md) contains configuration options (commented out). - -### Idle runners - -The module will scale down to zero runners by default. By specifying a `idle_config` config, idle runners can be kept active. The scale down lambda checks if any of the cron expressions matches the current time with a margin of 5 seconds. When there is a match, the number of runners specified in the idle config will be kept active. In case multiple cron expressions match, the first one will be used. Below is an idle configuration for keeping runners active from 9:00am to 5:59pm on working days. The [cron expression generator by Cronhub](https://crontab.cronhub.io/) is a great resource to set up your idle config. - -By default, the oldest instances are evicted. This helps keep your environment up-to-date and reduce problems like running out of disk space or RAM. Alternatively, if your older instances have a long-living cache, you can override the `evictionStrategy` to `newest_first` to evict the newest instances first instead. - -```hcl -idle_config = [{ - cron = "* * 9-17 * * 1-5" - timeZone = "Europe/Amsterdam" - idleCount = 2 - # Defaults to 'oldest_first' - evictionStrategy = "oldest_first" -}] -``` - -_**Note**_: When using Windows runners, we recommend keeping a few runners warmed up due to the minutes-long cold start time. - -#### Supported config - -Cron expressions are parsed by [cron-parser](https://github.com/harrisiirak/cron-parser#readme). The supported syntax. - -```bash -* * * * * * -┬ ┬ ┬ ┬ ┬ ┬ -│ │ │ │ │ | -│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun) -│ │ │ │ └───── month (1 - 12) -│ │ │ └────────── day of month (1 - 31) -│ │ └─────────────── hour (0 - 23) -│ └──────────────────── minute (0 - 59) -└───────────────────────── second (0 - 59, optional) -``` - -For time zones please check [TZ database name column](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) for the supported values. - -### Ephemeral runners - -You can configure runners to be ephemeral, in which case runners will be used only for one job. The feature should be used in conjunction with listening for the workflow job event. Please consider the following: - -- The scale down lambda is still active, and should only remove orphan instances. But there is no strict check in place. So ensure you configure the `minimum_running_time_in_minutes` to a value that is high enough to get your runner booted and connected to avoid it being terminated before executing a job. -- The messages sent from the webhook lambda to the scale-up lambda are by default delayed by SQS, to give available runners a chance to start the job before the decision is made to scale more runners. For ephemeral runners there is no need to wait. Set `delay_webhook_event` to `0`. -- All events in the queue will lead to a new runner created by the lambda. By setting `enable_job_queued_check` to `true` you can enforce a rule of only creating a runner if the event has a correlated queued job. Setting this can avoid creating useless runners. For example, a job getting cancelled before a runner was created or if the job was already picked up by another runner. We suggest using this in combination with a pool. -- To ensure runners are created in the same order GitHub sends the events, by default we use a FIFO queue. This is mainly relevant for repo level runners. For ephemeral runners you can set `enable_fifo_build_queue` to `false`. -- Errors related to scaling should be retried via SQS. You can configure `job_queue_retention_in_seconds` and `redrive_build_queue` to tune the behavior. We have no mechanism to avoid events never being processed, which means potentially no runner gets created and the job in GitHub times out in 6 hours. - -The example for [ephemeral runners](./examples/ephemeral) is based on the [default example](./examples/default). Have look at the diff to see the major configuration differences. - -### Prebuilt Images - -This module also allows you to run agents from a prebuilt AMI to gain faster startup times. The module provides several examples to build your own custom AMI. To remove old images, an [AMI housekeeper module](./modules/ami-housekeeper/README.md) can be used. You can find more information in [the image README.md](/images/README.md) for building custom images. - -### Experimental - Optional queue to publish GitHub workflow job events - -This queue is an experimental feature to allow you to receive a copy of the wokflow_jobs events sent by the GitHub App. This can be used to calculate a matrix or monitor the system. - -To enable the feature set `enable_workflow_job_events_queue = true`. Be aware though, this feature is experimental! - -Messages received on the queue are using the same format as published by GitHub wrapped in a property `workflowJobEvent`. - -``` -export interface GithubWorkflowEvent { - workflowJobEvent: WorkflowJobEvent; -} -``` -This extensible format allows more fields to be added if needed. -You can configure the queue by setting properties to `workflow_job_events_queue_config` - -NOTE: By default, a runner AMI update requires a re-apply of this terraform config (the runner AMI ID is looked up by a terraform data source). To avoid this, you can use `ami_id_ssm_parameter_name` to have the scale-up lambda dynamically lookup the runner AMI ID from an SSM parameter at instance launch time. Said SSM parameter is managed outside of this module (e.g. by a runner AMI build workflow). +This [Terraform](https://www.terraform.io/) module creates the required infrastructure needed to host [GitHub Actions](https://github.com/features/actions) self-hosted, auto-scaling runners on [AWS spot instances](https://aws.amazon.com/ec2/spot/). It provides the required logic to handle the life cycle for scaling up and down using a set of AWS Lambda functions. Runners are scaled down to zero to avoid costs when no workflows are active. -## Examples + + + + Runners overview + -Examples are located in the [examples](./examples) directory. The following examples are provided: +## Features -- _[Default](examples/default/README.md)_: The default example of the module -- _[ARM64](examples/arm64/README.md)_: Example usage with ARM64 architecture -- _[Ephemeral](examples/ephemeral/README.md)_: Example usages of ephemeral runners based on the default example. -- _[Multi Runner](examples/multi-runner/README.md)_ : Example usage of creating a multi runner which creates multiple runners/ configurations with a single deployment -- _[Permissions boundary](examples/permissions-boundary/README.md)_: Example usages of permissions boundaries. -- _[Prebuilt Images](examples/prebuilt/README.md)_: Example usages of deploying runners with a custom prebuilt image. -- _[Ubuntu](examples/ubuntu/README.md)_: Example usage of creating a runner using Ubuntu AMIs. -- _[Windows](examples/windows/README.md)_: Example usage of creating a runner using Windows as the OS. +- Scaling: Scale up and down based on GitHub events +- Sustainability: Scale down to zero when no jobs are running +- Security: Runners are created on-demand and terminated after use (ephemeral runners) +- Cost optimization: Runners are created on spot instances +- Tailored software, hardware and network configuration: Bring your own AMI, define the instance types and subnets to use. +- OS support: Linux (x64/arm64) and Windows +- Multi-Runner: Create multiple runner configurations with a single deployment +- GitHub cloud and GitHub Enterprise Server (GHES) support. +- Org and repo level runners. enterprise level runners are not supported (yet). -## Sub modules +## Getting started -The module contains several submodules, you can use the module via the main module or assemble your own setup by initializing the submodules yourself. +Cechkout the detailed istruction in the [Getting Started](https://philips-labs.github.io/terraform-aws-github-runner/getting-started/) section of the docs. On a high level, the following steps are required to get started: +- Setup your AWS account +- Create and configure a GitHub App +- Download or build the required lambdas +- Deploy the module using Terraform +- Install the GitHub App to your organization or repositories and add your repositories to the runner group(s). -The following submodules are the core of the module and are mandatory: +Checkout the provided Terraform examples in the [examples](./examples) directory for different scenarios. -- _[runner-binaries-syncer](./modules/runner-binaries-syncer/README.md)_ - Syncs the action runner distribution. -- _[runners](./modules/runners/README.md)_ - Scales the action runners up and down -- _[webhook](./modules/webhook/README.md)_ - Handles GitHub webhooks -- _[multi-runner](./modules/multi-runner/README.md)_ - Creates multiple runner configurations in a single deployment +## Configuration -The following sub modules are optional and are provided as examples or utilities: +Please check the [configuration](https://philips-labs.github.io/terraform-aws-github-runner/configuration/) section of the docs for major configuration options. See the Terraform module documentation for all available options. -- _[download-lambda](./modules/download-lambda/README.md)_ - Utility module to download lambda artifacts from GitHub Release -- _[setup-iam-permissions](./modules/setup-iam-permissions/README.md)_ - Example module to setup permission boundaries +## License -ARM64 configuration for submodules. When using the top level module configure `runner_architecture = "arm64"` and ensure the list of `instance_types` matches. When not using the top-level, ensure these properties are set on the submodules. +This project is licensed under the MIT License - see the [LICENSE](LICENSE.md) file for details. -## Logging +## Contributing -The module uses [AWS Lambda Powertools](https://awslabs.github.io/aws-lambda-powertools-typescript/latest/) for logging. By default the log level is set to `info`, by setting the log level to `debug` the incoming events of the Lambda are logged as well. +We welcome contributions, please check out the [contribution guide](CONTRIBUTING.md). Be aware we use [pre commit hooks](https://pre-commit.com/) to update the docs. -Log messages contains at least the following keys: +## Philips Forest -- `messages`: The logged messages -- `environment`: The environment prefix provided via Terraform -- `service`: The lambda -- `module`: The TypeScript module writing the log message -- `function-name`: The name of the lambda function (prefix + function name) -- `github`: Depending on the lambda, contains GitHub context -- `runner`: Depending on the lambda, specific context related to the runner +This module is part of the Philips Forest. -An example log message of the scale-up function: +```plain + ___ _ + / __\__ _ __ ___ ___| |_ + / _\/ _ \| '__/ _ \/ __| __| + / / | (_) | | | __/\__ \ |_ + \/ \___/|_| \___||___/\__| -```json -{ - "level": "INFO", - "message": "Received event", - "service": "runners-scale-up", - "timestamp": "2023-03-20T08:15:27.448Z", - "xray_trace_id": "1-6418161e-08825c2f575213ef760531bf", - "module": "scale-up", - "region": "eu-west-1", - "environment": "my-linux-x64", - "aws-request-id": "eef1efb7-4c07-555f-9a67-b3255448ee60", - "function-name": "my-linux-x64-scale-up", - "runner": { - "type": "Repo", - "owner": "test-runners/multi-runner" - }, - "github": { - "event": "workflow_job", - "workflow_job_id": "1234" - } -} + Infrastructure ``` -## Tracing -The distributed architecture of this application can make it difficult to troubleshoot. We support the option to enable tracing for all the lambda functions created by this application. To enable tracing, you can provide the `tracing_config` option inside the root module or inner modules. - -This tracing config generates timelines for following events: -- Basic lifecycle of lambda function -- Traces for Github API calls (can be configured by capture_http_requests). -- Traces for all AWS SDK calls -This feature has been disabled by default. - -## Debugging - -In case the setup does not work as intended, trace the events through this sequence: - -- In the GitHub App configuration, the Advanced page displays all webhook events that were sent. -- In AWS CloudWatch, every lambda has a log group. Look at the logs of the `webhook` and `scale-up` lambdas. -- In AWS SQS you can see messages available or in flight. -- Once an EC2 instance is running, you can connect to it in the EC2 user interface using Session Manager (use `enable_ssm_on_runners = true`). Check the user data script using `cat /var/log/user-data.log`. By default several log files of the instances are streamed to AWS CloudWatch, look for a log group named `/runners`. In the log group you should see at least the log streams for the user data installation and runner agent. -- Registered instances should show up in the Settings - Actions page of the repository or organization (depending on the installation mode). - -## Security Considerations - -This module creates resources in your AWS infrastructure, and EC2 instances for hosting the self-hosted runners on-demand. IAM permissions are set to a minimal level, and could be further limited by using permission boundaries. Instances permissions are limited to retrieve and delete the registration token, access the instance's own tags, and terminate the instance itself. By nature, instances are short-lived, and we strongly suggest using ephemeral runners to ensure a safe build environment for each workflow job execution. +Talk to the forestkeepers in the `runners-channel` on Slack. -Ephemeral runners use the JIT configuration, which can be used only once to activate a runner. For non-ephemeral runners this option is not provided by GitHub, so instead a registration token is passed via SSM. After using the token, the token is deleted. But the token remains valid and is potential available in memory on the runner. For ephemeral runners this problem is avoid by using just-in-time tokens. +[![Slack](https://img.shields.io/badge/Slack-4A154B?style=for-the-badge&logo=slack&logoColor=white)](https://join.slack.com/t/philips-software/shared_invite/zt-xecw65v5-i1531hGP~mdVwgxLFx7ckg) -The examples are using standard AMI's for different operation systems. Instances are not hardened, and sudo operation are not blocked. To provide an out of the box working experience by default the module installs and configures the runner. However secrets are not hard coded, they finally end up in the memory of the instances. You can harden the instance by providing your own AMI and overwriting the cloud-init script. -We welcome any improvement to the standard module to make the default as secure as possible. But in the end it remains your responsibility to keep your environment secure. +
+Terraform root module documention + ## Requirements @@ -625,25 +245,6 @@ We welcome any improvement to the standard module to make the default as secure | [ssm\_parameters](#output\_ssm\_parameters) | n/a | | [webhook](#output\_webhook) | n/a | + -## Contributing - -We welcome contributions, please check out the [contribution guide](CONTRIBUTING.md). Be aware we use [pre commit hooks](https://pre-commit.com/) to update the docs. - -## Philips Forest - -This module is part of the Philips Forest. - -```plain - ___ _ - / __\__ _ __ ___ ___| |_ - / _\/ _ \| '__/ _ \/ __| __| - / / | (_) | | | __/\__ \ |_ - \/ \___/|_| \___||___/\__| - - Infrastructure -``` - -Talk to the forestkeepers in the `runners-channel` on Slack. - -[![Slack](https://img.shields.io/badge/Slack-4A154B?style=for-the-badge&logo=slack&logoColor=white)](https://join.slack.com/t/philips-software/shared_invite/zt-xecw65v5-i1531hGP~mdVwgxLFx7ckg) +
diff --git a/docs/ami-examples/index.md b/docs/ami-examples/index.md new file mode 100644 index 0000000000..23e5033161 --- /dev/null +++ b/docs/ami-examples/index.md @@ -0,0 +1 @@ +--8<-- "images/README.md" diff --git a/docs/assets/aws-architecture.dark.png b/docs/assets/aws-architecture.dark.png new file mode 100644 index 0000000000..d0d631bb9e Binary files /dev/null and b/docs/assets/aws-architecture.dark.png differ diff --git a/docs/assets/aws-architecture.light.png b/docs/assets/aws-architecture.light.png new file mode 100644 index 0000000000..e51bb4fb30 Binary files /dev/null and b/docs/assets/aws-architecture.light.png differ diff --git a/docs/assets/diagrams.excalidraw b/docs/assets/diagrams.excalidraw new file mode 100644 index 0000000000..a3b403217a --- /dev/null +++ b/docs/assets/diagrams.excalidraw @@ -0,0 +1,15028 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 2095, + "versionNonce": 1830578344, + "isDeleted": false, + "id": "ivE8803kNip-QGmVRPTJT", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 479.34950271953767, + "y": 238.1655044143024, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 426.74758746801734, + "height": 605.0866885921572, + "seed": 222552536, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "ZCy2IWtwus0Ua0-ZWtxiI", + "type": "arrow" + }, + { + "id": "CY9kqXcqCclWzV_SdZgnZ", + "type": "arrow" + } + ], + "updated": 1702808240664, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1694, + "versionNonce": 1337578968, + "isDeleted": false, + "id": "7RImS0Uks5cHJnYnzfxxf", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 813.0768506226378, + "y": 88.44567040205354, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 65.08084106445301, + "height": 65.08084106445301, + "seed": 811559336, + "groupIds": [ + "y_nGoWXohv8-A0TmaqNv0", + "dC9F6UPDq95Gltle-mjNS", + "SA0uVnvbWnTy65JNmzMwW", + "IuygfmAxGBF9tpJQyWhQe", + "nP2Zt3NVVdQnN_JSLLuUk", + "NyIjKGlqaz-duyOsmBgyJ", + "_L4xJGQed9txa-M7PZZxl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240664, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1396, + "versionNonce": 31003560, + "isDeleted": false, + "id": "R0smI5sVq2H9Cbtg0AVI7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 821.2605020906659, + "y": 117.55234490545897, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.117920455804926, + "height": 8.117920455804926, + "seed": 1192490152, + "groupIds": [ + "7FtbSz3Gv4I98y_835D1f", + "NyIjKGlqaz-duyOsmBgyJ", + "_L4xJGQed9txa-M7PZZxl" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "id": "3CctNqXoAGgfLtMVAW8GE", + "type": "arrow" + } + ], + "updated": 1702808240664, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1450, + "versionNonce": 1924225752, + "isDeleted": false, + "id": "fdgsnzLT1Q418ylxn_Drx", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 862.3182691402855, + "y": 117.47890981199313, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.117920455804926, + "height": 8.117920455804926, + "seed": 1291788200, + "groupIds": [ + "7FtbSz3Gv4I98y_835D1f", + "NyIjKGlqaz-duyOsmBgyJ", + "_L4xJGQed9txa-M7PZZxl" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240664, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2067, + "versionNonce": 1338531496, + "isDeleted": false, + "id": "1DAdqcBbGoUPPpD4RezW2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 838.2417234367086, + "y": 113.87194965096475, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 1649207976, + "groupIds": [ + "7FtbSz3Gv4I98y_835D1f", + "NyIjKGlqaz-duyOsmBgyJ", + "_L4xJGQed9txa-M7PZZxl" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240664, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2140, + "versionNonce": 913326040, + "isDeleted": false, + "id": "qQ_beEajJKiQLGEQMQORO", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 844.8032191554468, + "y": 107.94479061787658, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 1101616552, + "groupIds": [ + "7FtbSz3Gv4I98y_835D1f", + "NyIjKGlqaz-duyOsmBgyJ", + "_L4xJGQed9txa-M7PZZxl" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240664, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2171, + "versionNonce": 1469467048, + "isDeleted": false, + "id": "ncQAr_lvHxK24aKaktGCM", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 850.7376230536948, + "y": 114.46363571690014, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 1883267240, + "groupIds": [ + "7FtbSz3Gv4I98y_835D1f", + "NyIjKGlqaz-duyOsmBgyJ", + "_L4xJGQed9txa-M7PZZxl" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2257, + "versionNonce": 1258980568, + "isDeleted": false, + "id": "bsfJ6nkZK4F_miZs121yM", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 4.71238898038469, + "x": 844.1852216277263, + "y": 120.41164963611024, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 1841171368, + "groupIds": [ + "7FtbSz3Gv4I98y_835D1f", + "NyIjKGlqaz-duyOsmBgyJ", + "_L4xJGQed9txa-M7PZZxl" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 1669, + "versionNonce": 611243176, + "isDeleted": false, + "id": "RsdpurV-PMn8EWbhqD0tZ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 831.4051777696315, + "y": 121.62606969522673, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.842473884372846, + "height": 5.167099126652263, + "seed": 1682855592, + "groupIds": [ + "7FtbSz3Gv4I98y_835D1f", + "NyIjKGlqaz-duyOsmBgyJ", + "_L4xJGQed9txa-M7PZZxl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.816503304871627, + -0.053670945826642225 + ], + [ + 3.254730628247874, + -2.532485186304994 + ], + [ + 5.842473884372846, + -0.04842214250790278 + ], + [ + 3.0350803951419567, + 2.6346139403472693 + ] + ] + }, + { + "type": "line", + "version": 1685, + "versionNonce": 1041508824, + "isDeleted": false, + "id": "-kK8Wv8kCNYfG_mDCSz5S", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 853.9990263965693, + "y": 121.74894015686365, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.842473884372846, + "height": 5.167099126652263, + "seed": 1486700968, + "groupIds": [ + "7FtbSz3Gv4I98y_835D1f", + "NyIjKGlqaz-duyOsmBgyJ", + "_L4xJGQed9txa-M7PZZxl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.816503304871627, + -0.053670945826642225 + ], + [ + 3.254730628247874, + -2.532485186304994 + ], + [ + 5.842473884372846, + -0.04842214250790278 + ], + [ + 3.0350803951419567, + 2.6346139403472693 + ] + ] + }, + { + "type": "line", + "version": 1660, + "versionNonce": 2080243624, + "isDeleted": false, + "id": "5JEikMJ6-ymQ1So1DuAWk", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 825.2838960738615, + "y": 117.59616428797833, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 41.34963281275164, + "height": 17.109057844836915, + "seed": 1507249320, + "groupIds": [ + "7FtbSz3Gv4I98y_835D1f", + "NyIjKGlqaz-duyOsmBgyJ", + "_L4xJGQed9txa-M7PZZxl" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.559970698127005, + -7.66093059073715 + ], + [ + 8.271070731353255, + -13.100012337621466 + ], + [ + 15.09486779216366, + -16.193976031908193 + ], + [ + 21.94229008411606, + -16.944786876248074 + ], + [ + 29.75087123626803, + -15.033447184450166 + ], + [ + 35.47649450941106, + -11.065217973307726 + ], + [ + 39.57403120169017, + -5.297544356691949 + ], + [ + 41.34963281275164, + 0.16427096858884305 + ] + ] + }, + { + "type": "line", + "version": 1764, + "versionNonce": 1252077272, + "isDeleted": false, + "id": "eLclIL4fqvQJytgWaiS6y", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 825.0302387008497, + "y": 142.28374796012938, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 41.34963281275164, + "height": 17.109057844836915, + "seed": 833025960, + "groupIds": [ + "7FtbSz3Gv4I98y_835D1f", + "NyIjKGlqaz-duyOsmBgyJ", + "_L4xJGQed9txa-M7PZZxl" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.559970698127005, + -7.66093059073715 + ], + [ + 8.271070731353255, + -13.100012337621466 + ], + [ + 15.09486779216366, + -16.193976031908193 + ], + [ + 21.94229008411606, + -16.944786876248074 + ], + [ + 29.75087123626803, + -15.033447184450166 + ], + [ + 35.47649450941106, + -11.065217973307726 + ], + [ + 39.57403120169017, + -5.297544356691949 + ], + [ + 41.34963281275164, + 0.16427096858884305 + ] + ] + }, + { + "type": "text", + "version": 1824, + "versionNonce": 242207400, + "isDeleted": false, + "id": "9y31e3vEHEVxUCCei9ZTk", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 826.1172711548639, + "y": 157.68143796459114, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 38.41996765136719, + "height": 24, + "seed": 339329704, + "groupIds": [ + "_L4xJGQed9txa-M7PZZxl" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "B9LuEtI5fz0cIw_reMJMU", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "SQS", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "SQS", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 1581, + "versionNonce": 692425688, + "isDeleted": false, + "id": "2MGNA2z3GcTn0mTa2zdNs", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 539.2716510748435, + "y": 88.49848357063391, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 64.65338134765624, + "height": 64.65338134765624, + "seed": 1107504296, + "groupIds": [ + "6vxts7OvGjaW-ZZxrnkat", + "QFqEmW0o-xXhIcScO4wsP" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "_pz_3_mcUDfEsFbLSG4mL", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2052, + "versionNonce": 644887976, + "isDeleted": false, + "id": "ftymM88T8ot4qojgFra_c", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 564.1681514203262, + "y": 108.59457909366009, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 15.16932105348633, + "height": 0, + "seed": 356997032, + "groupIds": [ + "6vxts7OvGjaW-ZZxrnkat", + "QFqEmW0o-xXhIcScO4wsP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 15.16932105348633, + 0 + ] + ] + }, + { + "type": "line", + "version": 2103, + "versionNonce": 1612011736, + "isDeleted": false, + "id": "YihJWICk_tAZZydVfmfrG", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 562.6962570668845, + "y": 133.37347361215623, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 17.13783740126311, + "height": 0, + "seed": 1691230888, + "groupIds": [ + "6vxts7OvGjaW-ZZxrnkat", + "QFqEmW0o-xXhIcScO4wsP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 17.13783740126311, + 0 + ] + ] + }, + { + "type": "line", + "version": 1949, + "versionNonce": 1496006824, + "isDeleted": false, + "id": "mwGTBXpM8hX3SfQAZ5o_V", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 545.8957074585726, + "y": 104.42391852712106, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 16.95504631353927, + "height": 48.41270068259871, + "seed": 1329827240, + "groupIds": [ + "6vxts7OvGjaW-ZZxrnkat", + "QFqEmW0o-xXhIcScO4wsP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 16.95504631353927, + -7.400560664373661 + ], + [ + 16.871549804500688, + 41.01214001822505 + ], + [ + 0.08056087780811456, + 33.450908214315675 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1897, + "versionNonce": 312770008, + "isDeleted": false, + "id": "vUWAgl7oe9ujJ0Af8Hz5w", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 580.3567511378724, + "y": 96.83830706791403, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 16.976775286010504, + "height": 48.27905988118746, + "seed": 1037277352, + "groupIds": [ + "6vxts7OvGjaW-ZZxrnkat", + "QFqEmW0o-xXhIcScO4wsP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.1970252545028261, + 48.27905988118746 + ], + [ + 16.961573619999825, + 40.954321999069336 + ], + [ + 16.976775286010504, + 7.507893438730637 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1622, + "versionNonce": 911010728, + "isDeleted": false, + "id": "BWlVTvVsGqHkre1N0ex-D", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 567.0377193513871, + "y": 126.9739466306103, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 9.101119485207235, + "height": 12.203935908273408, + "seed": 338314152, + "groupIds": [ + "6vxts7OvGjaW-ZZxrnkat", + "QFqEmW0o-xXhIcScO4wsP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 9.101119485207235, + -12.203935908273408 + ] + ] + }, + { + "type": "line", + "version": 1740, + "versionNonce": 1376191192, + "isDeleted": false, + "id": "h1r_y0iCPm5fypCnxFJR6", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 574.846233356194, + "y": 117.10519271216688, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.016669064250991, + "height": 8.41385706862771, + "seed": 1618185896, + "groupIds": [ + "6vxts7OvGjaW-ZZxrnkat", + "QFqEmW0o-xXhIcScO4wsP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.00572174417704, + 4.3706612125143 + ], + [ + -0.010947320073949565, + 8.41385706862771 + ] + ] + }, + { + "type": "line", + "version": 1880, + "versionNonce": 2013345448, + "isDeleted": false, + "id": "-bWj2kIQPE-LPB0Fq9iyq", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 563.0404167550616, + "y": 116.56180935941646, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.016669064250991, + "height": 8.41385706862771, + "seed": 190544296, + "groupIds": [ + "6vxts7OvGjaW-ZZxrnkat", + "QFqEmW0o-xXhIcScO4wsP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.00572174417704, + 4.3706612125143 + ], + [ + -0.010947320073949565, + 8.41385706862771 + ] + ] + }, + { + "type": "text", + "version": 1566, + "versionNonce": 1825630168, + "isDeleted": false, + "id": "nouaLqy30cmJma63t5jm9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 504.84837989564426, + "y": 156.55959873252849, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 133.4999237060547, + "height": 24, + "seed": 135136424, + "groupIds": [ + "QFqEmW0o-xXhIcScO4wsP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "API Gateway", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "API Gateway", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 2144, + "versionNonce": 854860200, + "isDeleted": false, + "id": "VprgBUfB4-wBA0Fq7V3Z1", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 684.1322650755469, + "y": 87.11727977715546, + "strokeColor": "#1971c2", + "backgroundColor": "#fd7e1488", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 425350360, + "groupIds": [ + "ShLIPTUfjYrkmKHQqx7yP", + "yDpZlRcqQCVvE0h4RUJ7y", + "5QLX2RWefkTec-C2zuawB" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "3CctNqXoAGgfLtMVAW8GE", + "type": "arrow" + }, + { + "id": "_pz_3_mcUDfEsFbLSG4mL", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1308, + "versionNonce": 1058417880, + "isDeleted": false, + "id": "-MEaP4XIB7AILlZcnppYG", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 709.123472625994, + "y": 113.85474556225418, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 19.307143399999998, + "height": 26.897, + "seed": 1374288344, + "groupIds": [ + "PQtQjvNQqhfBJ0jVLJQ5o", + "yDpZlRcqQCVvE0h4RUJ7y", + "5QLX2RWefkTec-C2zuawB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -12.730345799999998, + 25.466 + ], + [ + -0.5178580999999962, + 26.897 + ], + [ + 6.576797599999999, + 13.180999999999997 + ], + [ + 0.8992804999999997, + 0.5640000000000001 + ] + ] + }, + { + "type": "line", + "version": 1308, + "versionNonce": 106015912, + "isDeleted": false, + "id": "mkqF2UjARON9QMM065x5D", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 733.6101928259941, + "y": 129.75174556225411, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 34.863799400000005, + "height": 44, + "seed": 54329048, + "groupIds": [ + "PQtQjvNQqhfBJ0jVLJQ5o", + "yDpZlRcqQCVvE0h4RUJ7y", + "5QLX2RWefkTec-C2zuawB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -14.960123300000012, + -32.42 + ], + [ + -29.1743317, + -33 + ], + [ + -30.178179700000005, + -23.001 + ], + [ + -22.897294200000005, + -22 + ], + [ + -7.866463500000002, + 10.421999999999997 + ], + [ + 3.689738799999993, + 11 + ], + [ + 4.685619699999997, + 1.0000000000000002 + ], + [ + 3.6897387999999935, + 0 + ] + ] + }, + { + "type": "text", + "version": 1643, + "versionNonce": 40554968, + "isDeleted": false, + "id": "XBJwc2PiBdYUxANHdIDyr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 678.8328806257011, + "y": 156.48010936193842, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 75.05992126464844, + "height": 24, + "seed": 2112316376, + "groupIds": [ + "5QLX2RWefkTec-C2zuawB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "webhook", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "webhook", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 2315, + "versionNonce": 1271257000, + "isDeleted": false, + "id": "n9qmPQ5oyMHvQSgbGrMne", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 732.9139550675216, + "y": 690.1506164576085, + "strokeColor": "#1971c2", + "backgroundColor": "#fd7e1488", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 2108843688, + "groupIds": [ + "8JP3DmWqQLEowGhF21mHF", + "NGCM2IzejF0oKKTKd2cxh", + "CLpHEk8i4ByssjrljWQcV" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "9ABOs5-WXUCCZ-D8t85bL", + "type": "arrow" + }, + { + "id": "h_B89cGbWb6iNZ006NPoL", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1480, + "versionNonce": 501405400, + "isDeleted": false, + "id": "Jr8uzD-U6dl_v26Xh5uV7", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 757.9051626179687, + "y": 716.8880822427072, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 19.428237149999962, + "height": 26.897, + "seed": 1258246568, + "groupIds": [ + "yLPPZ-sRI2Yo4BPCXrJew", + "NGCM2IzejF0oKKTKd2cxh", + "CLpHEk8i4ByssjrljWQcV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -12.730345799999998, + 25.466 + ], + [ + -0.5178580999999962, + 26.897 + ], + [ + 6.6978913499999635, + 13.18100000000004 + ], + [ + 0.8992804999999997, + 0.5640000000000001 + ] + ] + }, + { + "type": "line", + "version": 1479, + "versionNonce": 1199350440, + "isDeleted": false, + "id": "clZMA_DffzhG1siO0jPPx", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 782.3918828179687, + "y": 732.7850822427072, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 34.863799400000005, + "height": 44, + "seed": 1433853096, + "groupIds": [ + "yLPPZ-sRI2Yo4BPCXrJew", + "NGCM2IzejF0oKKTKd2cxh", + "CLpHEk8i4ByssjrljWQcV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -14.960123300000012, + -32.42 + ], + [ + -29.1743317, + -33 + ], + [ + -30.178179700000005, + -23.001 + ], + [ + -22.897294200000005, + -22 + ], + [ + -7.866463500000002, + 10.421999999999997 + ], + [ + 3.689738799999993, + 11 + ], + [ + 4.685619699999997, + 1.0000000000000002 + ], + [ + 3.6897387999999935, + 0 + ] + ] + }, + { + "type": "text", + "version": 1811, + "versionNonce": 1980906456, + "isDeleted": false, + "id": "7QzxA6f4rmUNTwy2wEsQO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 746.5045547485352, + "y": 759.5134460423915, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 37.27995300292969, + "height": 24, + "seed": 1589970856, + "groupIds": [ + "CLpHEk8i4ByssjrljWQcV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "pool", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "pool", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 3581, + "versionNonce": 1478626728, + "isDeleted": false, + "id": "3_YliClQBodWJoWEXxaHg", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 756.627866822027, + "y": 337.46828419801307, + "strokeColor": "#1971c2", + "backgroundColor": "#fd7e1488", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 1845818840, + "groupIds": [ + "0LI0NMCbkiF2e8fLaJbzw", + "OF0bfROP1LbzhR5BchF_F", + "3oCrT4kx6KXdMsjsqHj-u" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "B9LuEtI5fz0cIw_reMJMU", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2746, + "versionNonce": 1024262360, + "isDeleted": false, + "id": "9gHdU3snTfv9-xDkVYTyu", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 781.6190743724742, + "y": 364.2057499831118, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 19.307143399999998, + "height": 26.897, + "seed": 1519942360, + "groupIds": [ + "OGG2IV_GHyav7_G1corrw", + "OF0bfROP1LbzhR5BchF_F", + "3oCrT4kx6KXdMsjsqHj-u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -12.730345799999998, + 25.466 + ], + [ + -0.5178580999999962, + 26.897 + ], + [ + 6.576797599999999, + 13.180999999999997 + ], + [ + 0.8992804999999997, + 0.5640000000000001 + ] + ] + }, + { + "type": "line", + "version": 2746, + "versionNonce": 652351656, + "isDeleted": false, + "id": "g6oBcd0Zy0KhEPqIj_ret", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 806.1057945724742, + "y": 380.1027499831117, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 34.863799400000005, + "height": 44, + "seed": 1416847320, + "groupIds": [ + "OGG2IV_GHyav7_G1corrw", + "OF0bfROP1LbzhR5BchF_F", + "3oCrT4kx6KXdMsjsqHj-u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -14.960123300000012, + -32.42 + ], + [ + -29.1743317, + -33 + ], + [ + -30.178179700000005, + -23.001 + ], + [ + -22.897294200000005, + -22 + ], + [ + -7.866463500000002, + 10.421999999999997 + ], + [ + 3.689738799999993, + 11 + ], + [ + 4.685619699999997, + 1.0000000000000002 + ], + [ + 3.6897387999999935, + 0 + ] + ] + }, + { + "type": "text", + "version": 3090, + "versionNonce": 1114056152, + "isDeleted": false, + "id": "W6naSg5WGUxkEWtp9fIKN", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 748.9184863394664, + "y": 406.831113782796, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 79.87991333007812, + "height": 24, + "seed": 2074715352, + "groupIds": [ + "3oCrT4kx6KXdMsjsqHj-u" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "CY9kqXcqCclWzV_SdZgnZ", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "scale-up", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "scale-up", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 698, + "versionNonce": 1466483624, + "isDeleted": false, + "id": "XSH1imzmjT188KHXjPreK", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 510.1640625, + "y": 625.1640625, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 340.17578124999994, + "height": 183.87890625000006, + "seed": 149225176, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 195, + "versionNonce": 1127525080, + "isDeleted": false, + "id": "yJsb_vIWVuMD4e55A00Wu", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 655.5703125, + "y": 633, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 52.19197082519531, + "height": 35, + "seed": 1573070504, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "pool", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "pool", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "rectangle", + "version": 3112, + "versionNonce": 937561768, + "isDeleted": false, + "id": "ckHQnZo6y_sITM7X4uOh2", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 744.8633553545482, + "y": 947.6493909707428, + "strokeColor": "#1971c2", + "backgroundColor": "#fd7e1488", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 1242110424, + "groupIds": [ + "OAISmfJnEgFN2TFauQpF9", + "zkJxFQAxZED0le33uPVEk", + "hZNhZtFgv4U09ZQ_Ka3wZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "6iO3ZeCIQ2iX8l7aF1W0f", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2278, + "versionNonce": 973705176, + "isDeleted": false, + "id": "Wnt6UoYYk2dKuDxmY7AiQ", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 769.8545629049953, + "y": 974.3868567558416, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 19.428237149999962, + "height": 26.897, + "seed": 1786257112, + "groupIds": [ + "XZ7bK7ud2pNq3P1Hw9cv9", + "zkJxFQAxZED0le33uPVEk", + "hZNhZtFgv4U09ZQ_Ka3wZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -12.730345799999998, + 25.466 + ], + [ + -0.5178580999999962, + 26.897 + ], + [ + 6.6978913499999635, + 13.18100000000004 + ], + [ + 0.8992804999999997, + 0.5640000000000001 + ] + ] + }, + { + "type": "line", + "version": 2277, + "versionNonce": 1895430568, + "isDeleted": false, + "id": "BqPGAOBhODnVDFI1LAiL6", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 794.3412831049953, + "y": 990.2838567558415, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 34.863799400000005, + "height": 44, + "seed": 280921048, + "groupIds": [ + "XZ7bK7ud2pNq3P1Hw9cv9", + "zkJxFQAxZED0le33uPVEk", + "hZNhZtFgv4U09ZQ_Ka3wZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -14.960123300000012, + -32.42 + ], + [ + -29.1743317, + -33 + ], + [ + -30.178179700000005, + -23.001 + ], + [ + -22.897294200000005, + -22 + ], + [ + -7.866463500000002, + 10.421999999999997 + ], + [ + 3.689738799999993, + 11 + ], + [ + 4.685619699999997, + 1.0000000000000002 + ], + [ + 3.6897387999999935, + 0 + ] + ] + }, + { + "type": "text", + "version": 2616, + "versionNonce": 788124888, + "isDeleted": false, + "id": "_8Uwk3GYyo6czR-IQVJe0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 719.5240005067532, + "y": 1017.0122205555258, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 115.13986206054688, + "height": 24, + "seed": 1257261272, + "groupIds": [ + "hZNhZtFgv4U09ZQ_Ka3wZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "housekeeper", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "housekeeper", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 1602, + "versionNonce": 903644328, + "isDeleted": false, + "id": "AHmYgg_6BXpinuCIEB5W8", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 484.932737397741, + "y": 881.1619868362941, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 421.3225882902522, + "height": 183.87890625000006, + "seed": 1928556248, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1011, + "versionNonce": 127498712, + "isDeleted": false, + "id": "WfmHYbTmQnd-jav83Am-I", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 589.6097472718899, + "y": 890.4987745131343, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 208.01190185546875, + "height": 35, + "seed": 223335384, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ssm housekeepr", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ssm housekeepr", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "rectangle", + "version": 3067, + "versionNonce": 1949675432, + "isDeleted": false, + "id": "vv1ewWvR1lmII3MPO4kSQ", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 748.5951349836073, + "y": 464.98116784121976, + "strokeColor": "#1971c2", + "backgroundColor": "#fd7e1488", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 1898061528, + "groupIds": [ + "cMCNiKWRS1X0mk8MezbiY", + "yZtURJpNXBjW0I4EYrkiQ", + "HLTphb7UExmVC-JmKmNBz" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "A0Q4ehpvRidAU5HGJoEUB", + "type": "arrow" + }, + { + "id": "ztTiOSNqcEkLEIthcdd1V", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2231, + "versionNonce": 1459388120, + "isDeleted": false, + "id": "StjAXQX5l0qEpDjPFlkEq", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 773.5863425340544, + "y": 491.7186336263185, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 19.307143399999998, + "height": 26.897, + "seed": 841515992, + "groupIds": [ + "Uq3jIqdCYS_P2GxIELiF9", + "yZtURJpNXBjW0I4EYrkiQ", + "HLTphb7UExmVC-JmKmNBz" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -12.730345799999998, + 25.466 + ], + [ + -0.5178580999999962, + 26.897 + ], + [ + 6.576797599999999, + 13.180999999999997 + ], + [ + 0.8992804999999997, + 0.5640000000000001 + ] + ] + }, + { + "type": "line", + "version": 2231, + "versionNonce": 70351528, + "isDeleted": false, + "id": "npQTgc_zxibgOMM2u1d5U", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 798.0730627340545, + "y": 507.6156336263184, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 34.863799400000005, + "height": 44, + "seed": 790251736, + "groupIds": [ + "Uq3jIqdCYS_P2GxIELiF9", + "yZtURJpNXBjW0I4EYrkiQ", + "HLTphb7UExmVC-JmKmNBz" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -14.960123300000012, + -32.42 + ], + [ + -29.1743317, + -33 + ], + [ + -30.178179700000005, + -23.001 + ], + [ + -22.897294200000005, + -22 + ], + [ + -7.866463500000002, + 10.421999999999997 + ], + [ + 3.689738799999993, + 11 + ], + [ + 4.685619699999997, + 1.0000000000000002 + ], + [ + 3.6897387999999935, + 0 + ] + ] + }, + { + "type": "text", + "version": 2569, + "versionNonce": 766960600, + "isDeleted": false, + "id": "P_pix3ualaD7uv4Uoaiea", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 729.5057572476287, + "y": 534.3439974260027, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 102.63990783691406, + "height": 24, + "seed": 327904728, + "groupIds": [ + "HLTphb7UExmVC-JmKmNBz" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "scale-down", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "scale-down", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 3667, + "versionNonce": 1484514728, + "isDeleted": false, + "id": "bseMzya9y50b8CCr1bgn-", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1169.620160005523, + "y": 945.2974839301178, + "strokeColor": "#1971c2", + "backgroundColor": "#fd7e1488", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 794661288, + "groupIds": [ + "r937UJfKgHIGjQMNSNxDq", + "rSGB1Elg5w56vBfSOPLly", + "vvSrZiUkleGLnEO9hx_pp" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "sB1bSldBW6W9Ael4sGSCI", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2833, + "versionNonce": 1776068824, + "isDeleted": false, + "id": "STWG8p8UfJQXblR4zR4M5", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1194.6113675559702, + "y": 972.0349497152165, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 19.428237149999962, + "height": 26.897, + "seed": 336403624, + "groupIds": [ + "8Im7CNDUrx9vmSAaMe07R", + "rSGB1Elg5w56vBfSOPLly", + "vvSrZiUkleGLnEO9hx_pp" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -12.730345799999998, + 25.466 + ], + [ + -0.5178580999999962, + 26.897 + ], + [ + 6.6978913499999635, + 13.18100000000004 + ], + [ + 0.8992804999999997, + 0.5640000000000001 + ] + ] + }, + { + "type": "line", + "version": 2832, + "versionNonce": 776007848, + "isDeleted": false, + "id": "bpcq-rDpAWC9ZyKWBVJ7C", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1219.0980877559703, + "y": 987.9319497152164, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 34.863799400000005, + "height": 44, + "seed": 1888700328, + "groupIds": [ + "8Im7CNDUrx9vmSAaMe07R", + "rSGB1Elg5w56vBfSOPLly", + "vvSrZiUkleGLnEO9hx_pp" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -14.960123300000012, + -32.42 + ], + [ + -29.1743317, + -33 + ], + [ + -30.178179700000005, + -23.001 + ], + [ + -22.897294200000005, + -22 + ], + [ + -7.866463500000002, + 10.421999999999997 + ], + [ + 3.689738799999993, + 11 + ], + [ + 4.685619699999997, + 1.0000000000000002 + ], + [ + 3.6897387999999935, + 0 + ] + ] + }, + { + "type": "text", + "version": 3171, + "versionNonce": 117558744, + "isDeleted": false, + "id": "94azACXceq5CjwbljpM5P", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1147.4307761660289, + "y": 1014.6603135149007, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 108.83992004394531, + "height": 24, + "seed": 1360794280, + "groupIds": [ + "vvSrZiUkleGLnEO9hx_pp" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ami cleaner", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ami cleaner", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 2468, + "versionNonce": 1026333608, + "isDeleted": false, + "id": "rD9x8htS8yDcdXCoDaVZP", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 946.4162287290414, + "y": 882.8081428717896, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 359.3273862376628, + "height": 183.87890625000006, + "seed": 2078985384, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1491, + "versionNonce": 1849316056, + "isDeleted": false, + "id": "7G9Uz4JY0ei-UtRbK-s6v", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1039.010104708704, + "y": 892.82598861207, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 152.37594604492188, + "height": 35, + "seed": 1899689896, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ami cleaner", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ami cleaner", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "text", + "version": 418, + "versionNonce": 1735059112, + "isDeleted": false, + "id": "aBarJtrJNvnZRZVCZBw85", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 602.3927193330521, + "y": 252.90200709571934, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 175.6159210205078, + "height": 35, + "seed": 661564376, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "control plane", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "control plane", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "rectangle", + "version": 1713, + "versionNonce": 1176123352, + "isDeleted": false, + "id": "JPqW94G_1U4n_Rtp1AVB3", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 546.4665031650303, + "y": 464.7469773742682, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 64.70089111328099, + "height": 64.70089111328099, + "seed": 219969240, + "groupIds": [ + "Va5cqnU2p1j9RSVB50IW4", + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "ztTiOSNqcEkLEIthcdd1V", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1924, + "versionNonce": 1772605864, + "isDeleted": false, + "id": "VGF8bIi6xAFr0yK8zfGi8", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 564.6166234707044, + "y": 497.3290115403506, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.0965264804551, + "height": 25.394020168765657, + "seed": 219667416, + "groupIds": [ + "wPMijb20ufUzYgfg9uyo-", + "Va5cqnU2p1j9RSVB50IW4", + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.263070773388013, + -12.655407976268592 + ], + [ + 21.749092160923496, + -12.570519846452996 + ], + [ + 29.0965264804551, + 0.07090797495479251 + ], + [ + 21.970571387274813, + 12.415835859067506 + ], + [ + 7.3574223926479565, + 12.738612192497058 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 1708, + "versionNonce": 1119190232, + "isDeleted": false, + "id": "-y3H6G5z3EhPYnz4S6jJg", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 564.3499933276972, + "y": 474.14193324044527, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 576626904, + "groupIds": [ + "wPMijb20ufUzYgfg9uyo-", + "Va5cqnU2p1j9RSVB50IW4", + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1769, + "versionNonce": 185556136, + "isDeleted": false, + "id": "X5Ts167GXBARvQ5P5C50E", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 569.4351448238818, + "y": 480.3007422695173, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.4300394358401154, + "height": 4.165241568829386, + "seed": 1283769816, + "groupIds": [ + "wPMijb20ufUzYgfg9uyo-", + "Va5cqnU2p1j9RSVB50IW4", + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.4300394358401154, + 4.165241568829386 + ] + ] + }, + { + "type": "ellipse", + "version": 1830, + "versionNonce": 1973428696, + "isDeleted": false, + "id": "jKpZGn7XbcQEk1Tv330No", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 587.4277903570356, + "y": 513.5258642149297, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 2023639768, + "groupIds": [ + "wPMijb20ufUzYgfg9uyo-", + "Va5cqnU2p1j9RSVB50IW4", + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1898, + "versionNonce": 1296926632, + "isDeleted": false, + "id": "bmTeP5TMWRhXtxFY6ts2T", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 586.4396478314517, + "y": 509.7288620234708, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.4300394358401154, + "height": 4.165241568829386, + "seed": 1363095512, + "groupIds": [ + "wPMijb20ufUzYgfg9uyo-", + "Va5cqnU2p1j9RSVB50IW4", + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.4300394358401154, + 4.165241568829386 + ] + ] + }, + { + "type": "ellipse", + "version": 1841, + "versionNonce": 502146776, + "isDeleted": false, + "id": "NFdV9DtKYMrmTggIGQ7sY", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 593.055757430821, + "y": 483.7042306422859, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 242971864, + "groupIds": [ + "wPMijb20ufUzYgfg9uyo-", + "Va5cqnU2p1j9RSVB50IW4", + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1929, + "versionNonce": 479089320, + "isDeleted": false, + "id": "Fx5LhCJoCs_p1pSdS18uG", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 558.2801563123268, + "y": 504.1071624131064, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 1172773336, + "groupIds": [ + "wPMijb20ufUzYgfg9uyo-", + "Va5cqnU2p1j9RSVB50IW4", + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1735, + "versionNonce": 2016644056, + "isDeleted": false, + "id": "6f_9q-1sNX6NIY_Kaxl0O", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 579.2372005701274, + "y": 478.5387653859052, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 14.881064367630502, + "height": 5.819316836931806, + "seed": 982916824, + "groupIds": [ + "wPMijb20ufUzYgfg9uyo-", + "Va5cqnU2p1j9RSVB50IW4", + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 10.971069476124091, + -0.03892935430490446 + ], + [ + 14.881064367630502, + 5.780387482626902 + ] + ] + }, + { + "type": "line", + "version": 1723, + "versionNonce": 2138946984, + "isDeleted": false, + "id": "SCbt1w8c8z-2EQByKimj9", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 596.0332051743109, + "y": 507.132982016999, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.359881211089217, + "height": 17.609098804231238, + "seed": 756843480, + "groupIds": [ + "wPMijb20ufUzYgfg9uyo-", + "Va5cqnU2p1j9RSVB50IW4", + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.359881211089217, + -9.699887830271365 + ], + [ + 1.5123117765600742, + -17.609098804231238 + ] + ] + }, + { + "type": "line", + "version": 1908, + "versionNonce": 243552472, + "isDeleted": false, + "id": "NJPaEp7vDCTJZClqPCB8K", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 563.5156325055833, + "y": 510.0226170767014, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 14.881064367630502, + "height": 5.819316836931806, + "seed": 730745048, + "groupIds": [ + "wPMijb20ufUzYgfg9uyo-", + "Va5cqnU2p1j9RSVB50IW4", + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 10.971069476124091, + -0.03892935430490446 + ], + [ + 14.881064367630502, + 5.780387482626902 + ] + ] + }, + { + "type": "line", + "version": 1893, + "versionNonce": 1195886760, + "isDeleted": false, + "id": "gQPcjuUXysUIrJnd7MLgN", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 556.2408110579414, + "y": 504.77895737816107, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.359881211089217, + "height": 17.609098804231238, + "seed": 1635741144, + "groupIds": [ + "wPMijb20ufUzYgfg9uyo-", + "Va5cqnU2p1j9RSVB50IW4", + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.359881211089217, + -9.699887830271365 + ], + [ + 1.5123117765600742, + -17.609098804231238 + ] + ] + }, + { + "type": "text", + "version": 2707, + "versionNonce": 141850072, + "isDeleted": false, + "id": "yBnwnAw_zdatclUTGwtJS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 544.5927520798421, + "y": 532.4705649303639, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 68.63992309570312, + "height": 24, + "seed": 1745089240, + "groupIds": [ + "4UrRL00pHnWCa-3sPTfEd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Trigger", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Trigger", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 2175, + "versionNonce": 1066955688, + "isDeleted": false, + "id": "kQEs74aFmFnjuSm-p72OE", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 485.24070390118686, + "y": 23.986293115700533, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 417.08299473498556, + "height": 187.37463292503452, + "seed": 851295960, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "5n_B9CJuQSbh_9oqVzuI6", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2692, + "versionNonce": 1962781096, + "isDeleted": false, + "id": "QCFLMT1NgywylWWTmkOYg", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1161.4685373436992, + "y": 399.406761456999, + "strokeColor": "#000000", + "backgroundColor": "#fd7e1488", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 1887237848, + "groupIds": [ + "UAfKw75GG1Xu4d3Q7cb2d", + "3U-JAbx9zmcDVF8p_rOfu", + "Q0YkJqpRrrtUEVbrYYeMR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2057, + "versionNonce": 575218904, + "isDeleted": false, + "id": "hgeszLpLEdL2TpjTTB5ir", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1183.2546665715317, + "y": 420.612963523125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 21.136985907710482, + "height": 21.58982944276917, + "seed": 812145624, + "groupIds": [ + "-iYqz0gDkCHC_wRKJ3o4w", + "3U-JAbx9zmcDVF8p_rOfu", + "Q0YkJqpRrrtUEVbrYYeMR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2382, + "versionNonce": 1575629992, + "isDeleted": false, + "id": "7T9SJIO0wAojoTiuird4D", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 4.726840450960482, + "x": 1194.3345514815724, + "y": 438.61511180723073, + "strokeColor": "#000", + "backgroundColor": "#ff00", + "width": 21.298113442520282, + "height": 21.325685740313624, + "seed": 127869144, + "groupIds": [ + "Cq10T91BOr1Jade3-93zF", + "-iYqz0gDkCHC_wRKJ3o4w", + "3U-JAbx9zmcDVF8p_rOfu", + "Q0YkJqpRrrtUEVbrYYeMR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.05533508667380005, + -8.330350296057105 + ], + [ + -21.16993868276674, + -8.49388689455444 + ], + [ + -21.242778355846482, + 12.60784310791851 + ], + [ + -12.973972126229569, + 12.831798845759185 + ] + ] + }, + { + "type": "line", + "version": 2395, + "versionNonce": 1954466264, + "isDeleted": false, + "id": "kS-XSu9H2C3sQECgj8Xvo", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 1.5503909961083693, + "x": 1212.8639938539063, + "y": 419.8449657513188, + "strokeColor": "#000", + "backgroundColor": "#ff00", + "width": 21.298113442520286, + "height": 21.325685740313624, + "seed": 901072344, + "groupIds": [ + "Pcfeve8dRlj9ZyIhcOSTI", + "-iYqz0gDkCHC_wRKJ3o4w", + "3U-JAbx9zmcDVF8p_rOfu", + "Q0YkJqpRrrtUEVbrYYeMR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.05533508667380005, + -8.330350296057105 + ], + [ + -21.16993868276674, + -8.49388689455444 + ], + [ + -21.242778355846482, + 12.60784310791851 + ], + [ + -12.973972126229569, + 12.831798845759185 + ] + ] + }, + { + "type": "text", + "version": 2481, + "versionNonce": 789405608, + "isDeleted": false, + "id": "H1JUqEpOsA-BXGqT8J5ou", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1155.868150828755, + "y": 469.7377525538675, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 73.99993896484375, + "height": 24, + "seed": 1740557016, + "groupIds": [ + "Q0YkJqpRrrtUEVbrYYeMR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Runners", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Runners", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 3550, + "versionNonce": 448253656, + "isDeleted": false, + "id": "nV1Lv6Z9RwU1kyPtg_KkZ", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1100.151062696964, + "y": 85.32476544310845, + "strokeColor": "#1971c2", + "backgroundColor": "#fd7e1488", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 1243977688, + "groupIds": [ + "HrOK9xnIrqpZDjNY15sJV", + "VhBZf9TgEtPMXXjE_Cf00", + "D2cxMaMN_iRlzzPzzRYUj" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "vEz4-_ilsOBuVZj_DPvkJ", + "type": "arrow" + }, + { + "id": "dySicUMsQbgCIoOX-MYqw", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2715, + "versionNonce": 1754475176, + "isDeleted": false, + "id": "hbRcIE6hV2WuZL1kpH7to", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1125.142270247411, + "y": 112.06223122820717, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 19.428237149999962, + "height": 26.897, + "seed": 1851055320, + "groupIds": [ + "Y85PBWpbrBkDNy3q3Leuv", + "VhBZf9TgEtPMXXjE_Cf00", + "D2cxMaMN_iRlzzPzzRYUj" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -12.730345799999998, + 25.466 + ], + [ + -0.5178580999999962, + 26.897 + ], + [ + 6.6978913499999635, + 13.18100000000004 + ], + [ + 0.8992804999999997, + 0.5640000000000001 + ] + ] + }, + { + "type": "line", + "version": 2714, + "versionNonce": 2106078168, + "isDeleted": false, + "id": "H8gEOn5JgV8AN9i2Klf4E", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1149.628990447411, + "y": 127.9592312282071, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 34.863799400000005, + "height": 44, + "seed": 911442392, + "groupIds": [ + "Y85PBWpbrBkDNy3q3Leuv", + "VhBZf9TgEtPMXXjE_Cf00", + "D2cxMaMN_iRlzzPzzRYUj" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -14.960123300000012, + -32.42 + ], + [ + -29.1743317, + -33 + ], + [ + -30.178179700000005, + -23.001 + ], + [ + -22.897294200000005, + -22 + ], + [ + -7.866463500000002, + 10.421999999999997 + ], + [ + 3.689738799999993, + 11 + ], + [ + 4.685619699999997, + 1.0000000000000002 + ], + [ + 3.6897387999999935, + 0 + ] + ] + }, + { + "type": "text", + "version": 3042, + "versionNonce": 623351208, + "isDeleted": false, + "id": "luOJrqF-VEM16PFV6uUdw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1095.9516614624501, + "y": 154.6875950278914, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 72.85995483398438, + "height": 24, + "seed": 825591512, + "groupIds": [ + "D2cxMaMN_iRlzzPzzRYUj" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Lambda", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Lambda", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 2269, + "versionNonce": 1392769240, + "isDeleted": false, + "id": "RRaBTf5MmJItGav7KoKS3", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 936.2349679689937, + "y": 28.711660708506486, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 392.07386041675875, + "height": 180.2379867547818, + "seed": 1184115928, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1425, + "versionNonce": 1240899752, + "isDeleted": false, + "id": "9UGnBJP6xfGlrJBqepXGl", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1034.152519119069, + "y": 32.906678713288215, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 146.38394165039062, + "height": 35, + "seed": 1781060056, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "agent sync", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "agent sync", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "text", + "version": 1729, + "versionNonce": 1858018776, + "isDeleted": false, + "id": "8QyXjCc6fidxs71LCPSST", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 648.4473726935557, + "y": 32.495975914416476, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 105.08393859863281, + "height": 35, + "seed": 2001795752, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "webhook", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "webhook", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "rectangle", + "version": 1400, + "versionNonce": 917261224, + "isDeleted": false, + "id": "U2pwmC5ui2QgIyOhovNXp", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1220.5108281030691, + "y": 84.23660394291932, + "strokeColor": "#000000", + "backgroundColor": "#40c05788", + "width": 65.08084106445301, + "height": 65.08084106445301, + "seed": 457922472, + "groupIds": [ + "mg07ugnqgkBXJlWPzZ0VR", + "8o4pTqp1y0qDkDDpxrId8", + "LbdWIkAUaDfIkGbV2qtSl", + "4P1hbLOVsiiEENh-TqOKq" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "dySicUMsQbgCIoOX-MYqw", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1187, + "versionNonce": 298689240, + "isDeleted": false, + "id": "S2fRHltGa41rWJQlVHhQo", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1234.123683280728, + "y": 95.30369996843496, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 39.10563151041674, + "height": 10.753995455228363, + "seed": 173154984, + "groupIds": [ + "LbdWIkAUaDfIkGbV2qtSl", + "4P1hbLOVsiiEENh-TqOKq" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1805, + "versionNonce": 1970575016, + "isDeleted": false, + "id": "Y1HZpABlGLQA_pf7sRtlf", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1234.4815996969944, + "y": 101.18216801731381, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 38.295773237179446, + "height": 40.48662140675077, + "seed": 608669096, + "groupIds": [ + "LbdWIkAUaDfIkGbV2qtSl", + "4P1hbLOVsiiEENh-TqOKq" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 3.8452774439103905, + 32.14685684595355 + ], + [ + 6.768312737880933, + 37.98883103590748 + ], + [ + 20.34867663261207, + 40.48662140675077 + ], + [ + 32.537268066406114, + 38.400380608974274 + ], + [ + 35.36686823918285, + 31.944173177083314 + ], + [ + 38.295773237179446, + 0.09767190004004078 + ] + ] + }, + { + "type": "ellipse", + "version": 1197, + "versionNonce": 985892824, + "isDeleted": false, + "id": "MUtN_U_-mu6CxKPWRmoCX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1251.251887782932, + "y": 111.44466719568612, + "strokeColor": "#000000", + "backgroundColor": "#000", + "width": 4.69818115234375, + "height": 4.69818115234375, + "seed": 1381472424, + "groupIds": [ + "LbdWIkAUaDfIkGbV2qtSl", + "4P1hbLOVsiiEENh-TqOKq" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1883, + "versionNonce": 1794867624, + "isDeleted": false, + "id": "S2lL80cWoxZX1EMQULVUP", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1253.742006191135, + "y": 114.01765761316659, + "strokeColor": "#000000", + "backgroundColor": "#000", + "width": 23.24691772460949, + "height": 11.53113708496096, + "seed": 2016297896, + "groupIds": [ + "LbdWIkAUaDfIkGbV2qtSl", + "4P1hbLOVsiiEENh-TqOKq" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.0229309082030795, + 7.4353179931640625 + ], + [ + 17.00493774414076, + 11.53113708496096 + ], + [ + 22.923687744140693, + 10.143841552734386 + ], + [ + 23.24691772460949, + 5.890612792968767 + ], + [ + 17.962628173828193, + 1.7561248779296932 + ] + ] + }, + { + "type": "text", + "version": 1647, + "versionNonce": 270593527, + "isDeleted": false, + "id": "Ld5s9wIHR4OgCg_sIod_y", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1201.2012883081472, + "y": 153.40684854564222, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 103.69992065429688, + "height": 24, + "seed": 603426472, + "groupIds": [ + "4P1hbLOVsiiEENh-TqOKq" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702932324882, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "S3 Bucket", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "S3 Bucket", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 3478, + "versionNonce": 107809960, + "isDeleted": false, + "id": "0-WIPIwbxU5oirOXK2PXz", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 1053.0718064627845, + "y": 240.16684651719345, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 265.7672270276938, + "height": 342.04923291144314, + "seed": 301402840, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "CY9kqXcqCclWzV_SdZgnZ", + "type": "arrow" + }, + { + "id": "A0Q4ehpvRidAU5HGJoEUB", + "type": "arrow" + }, + { + "id": "9ABOs5-WXUCCZ-D8t85bL", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1003, + "versionNonce": 741700056, + "isDeleted": false, + "id": "2PR1c1kEdJvHW4dUttDgb", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1096.3899056611824, + "y": 266.52623911901105, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 189.25193786621094, + "height": 35, + "seed": 369971928, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "vpc / subnets", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "vpc / subnets", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "text", + "version": 3448, + "versionNonce": 1903507368, + "isDeleted": false, + "id": "OW-7NkHXdp3-DKfEoW3Ob", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 970.8908038758286, + "y": 754.1240411048966, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 160.07986450195312, + "height": 24, + "seed": 664832984, + "groupIds": [ + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "SSM parameters", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "SSM parameters", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 3615, + "versionNonce": 1968797400, + "isDeleted": false, + "id": "iZ02Q8fytYseReUFnZdfQ", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1018.7001599443267, + "y": 684.5878035737188, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 1213288664, + "groupIds": [ + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 7672, + "versionNonce": 1077936808, + "isDeleted": false, + "id": "GMjdZwJb62aEmvt-ZWbJG", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1061.143301256325, + "y": 744.4791645723145, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 27.08452429530482, + "height": 28.76032398582327, + "seed": 10581464, + "groupIds": [ + "q91gJ4GdKDIfI-Za0nlt6", + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.8178346989934635, + 0.15014468903849598 + ], + [ + 5.689722111063916, + -2.930541448733268 + ], + [ + 9.123193867826467, + -4.861206308869573 + ], + [ + 11.875030496454142, + -2.8135809119822635 + ], + [ + 15.822856613672839, + -7.579858785209758 + ], + [ + 13.153164362019155, + -9.512971656580397 + ], + [ + 13.91068783841809, + -12.619497912936685 + ], + [ + 17.155662730137735, + -12.608073860509842 + ], + [ + 17.162462761344187, + -18.169683383644127 + ], + [ + 14.062464534946132, + -18.1634273549342 + ], + [ + 12.764202577009984, + -20.367725470818193 + ], + [ + 14.830868061275366, + -23.210682517612337 + ], + [ + 10.917586102585439, + -26.76601083359455 + ], + [ + 8.72852005660387, + -24.373759855164163 + ], + [ + 6.257388716178699, + -25.45904483571416 + ], + [ + 6.430925512567352, + -28.50246680247455 + ], + [ + 1.1361492139742917, + -28.61017929678477 + ], + [ + 1.0417647808286912, + -25.70656597162907 + ], + [ + -1.1162931228514479, + -24.532336582898658 + ], + [ + -3.7307691211086893, + -26.93981963123151 + ], + [ + -7.741699527923323, + -22.9223611944587 + ], + [ + -5.518633325909507, + -21.06948869132421 + ], + [ + -6.807919242653169, + -18.442500635647054 + ], + [ + -9.692220479182536, + -18.27630787296132 + ], + [ + -9.922061533960633, + -12.81343480294472 + ], + [ + -7.2194571312677125, + -12.869739061334164 + ], + [ + -6.187212394128019, + -9.746348727585874 + ], + [ + -8.752184165202326, + -8.174997516398578 + ], + [ + -5.233304016486706, + -3.2479669054505185 + ], + [ + -2.5516437099096714, + -4.8565822876491955 + ], + [ + 0.06500829833369015, + -3.287679087696215 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 3639, + "versionNonce": 1706351576, + "isDeleted": false, + "id": "Ttx3BS8Zm8u6mkgoYxVyM", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1060.7706005074222, + "y": 723.514433019078, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 10.460082855905723, + "height": 5.397560826503627, + "seed": 1705310936, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Q8RH9f9ZETUTnqeD9cupi", + "focus": 2.3761205074924336, + "gap": 13.507291055437861 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.9602269710062705, + 0.12178820829017356 + ], + [ + 7.235999589219723, + 0.7079851658694465 + ], + [ + 10.460082855905723, + 5.397560826503627 + ] + ] + }, + { + "type": "arrow", + "version": 1907, + "versionNonce": 561606056, + "isDeleted": false, + "id": "FZpOHAiKm4czwU_PV5FAg", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1058.4808995359788, + "y": 734.9048109543447, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 12.60323458795436, + "height": 5.275772618213453, + "seed": 1240457176, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 4.103378703054907, + -3.5171817454756353 + ], + [ + 9.37915132126836, + -2.9309847878963624 + ], + [ + 12.60323458795436, + 1.7585908727378177 + ] + ] + }, + { + "type": "line", + "version": 1973, + "versionNonce": 1599840472, + "isDeleted": false, + "id": "ZGQtou6iTsBJe3NVqFhyM", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1044.8518202722607, + "y": 733.0153725486517, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 48.947445957869256, + "height": 44.25787029723508, + "seed": 227943640, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -21.68928743043308, + 0 + ], + [ + -21.68928743043308, + -44.25787029723508 + ], + [ + 27.25815852743617, + -44.25787029723508 + ], + [ + 27.25815852743617, + -21.396188951643445 + ] + ] + }, + { + "type": "rectangle", + "version": 1841, + "versionNonce": 239958184, + "isDeleted": false, + "id": "-J5RVDxne57e5irCj-vNZ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1027.559010023672, + "y": 702.533130754504, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 9.086052842478724, + "height": 4.68957566063418, + "seed": 1848363480, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1846, + "versionNonce": 1642186200, + "isDeleted": false, + "id": "xSl_YomczaJWd2whZonT5", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1042.946680160128, + "y": 710.153691203037, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 9.086052842478724, + "height": 4.68957566063418, + "seed": 1455738584, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "Ttx3BS8Zm8u6mkgoYxVyM", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1843, + "versionNonce": 2053645224, + "isDeleted": false, + "id": "-HewxDUsxcXIlP9-f0RGU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1058.187801057189, + "y": 699.0159490090292, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 9.086052842478724, + "height": 4.68957566063418, + "seed": 804598744, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1848, + "versionNonce": 1515932376, + "isDeleted": false, + "id": "XsUQtpWkoH-O57chtw8tX", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1029.6106993751996, + "y": 707.2227064151376, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 4.982674139423816, + "height": 20.2237950364849, + "seed": 802224344, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1891, + "versionNonce": 66416296, + "isDeleted": false, + "id": "Q8RH9f9ZETUTnqeD9cupi", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1044.9983695116555, + "y": 692.1281347574724, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.275772618213453, + "height": 17.87900720616781, + "seed": 703339992, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "Ttx3BS8Zm8u6mkgoYxVyM", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1974, + "versionNonce": 1935421400, + "isDeleted": false, + "id": "YEmT8Pd4LMD7qs8OReOvA", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1029.6106993751996, + "y": 692.1281347574724, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 4.982674139423816, + "height": 10.258446757637268, + "seed": 1599775448, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2035, + "versionNonce": 597776808, + "isDeleted": false, + "id": "Q-qxAGIIgzVDHWfiQW40M", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1060.2394904087166, + "y": 692.1281347574724, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 4.396477181844544, + "height": 7.034363490951271, + "seed": 1320191960, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1846, + "versionNonce": 1694004440, + "isDeleted": false, + "id": "VP6uK6lCZTnFceGN14s1M", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1044.8518202722607, + "y": 727.4465014516337, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 12.017037630375086, + "seed": 67226840, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -12.017037630375086 + ] + ] + }, + { + "type": "line", + "version": 1850, + "versionNonce": 1553458344, + "isDeleted": false, + "id": "P_-TNFDtfpwH8ICKJ6ulo", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1060.2394904087166, + "y": 711.6191835969859, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 7.913658927320179, + "seed": 1759670744, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -7.913658927320179 + ] + ] + }, + { + "type": "line", + "version": 1850, + "versionNonce": 1153702360, + "isDeleted": false, + "id": "kXQTwuoPNsxt9U_7cLrA_", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1064.635967590561, + "y": 711.7657328363822, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 7.913658927320179, + "seed": 342259416, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -7.913658927320179 + ] + ] + }, + { + "type": "line", + "version": 1850, + "versionNonce": 1820659624, + "isDeleted": false, + "id": "0yApPNkAThs6bxoN_FdLb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1050.2741421298688, + "y": 715.576013060646, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 2.6378863091067264, + "seed": 455203800, + "groupIds": [ + "3qJkYfwHH5q9gNLljz2X0", + "nHfOBTulMkt990-5QCCxo", + "o7NdDidZa2m1kmBOu8jRw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 2.6378863091067264 + ] + ] + }, + { + "type": "rectangle", + "version": 1867, + "versionNonce": 1439899352, + "isDeleted": false, + "id": "uUv0KoFONcaKfwZdcWlGA", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 560.7333087440102, + "y": 687.535437004839, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 64.70089111328099, + "height": 64.70089111328099, + "seed": 1288439208, + "groupIds": [ + "giaWLKAMEYOmky1lVDht1", + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "h_B89cGbWb6iNZ006NPoL", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2078, + "versionNonce": 2073352872, + "isDeleted": false, + "id": "pW97iRg031X16GdDoVXdt", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 578.8834290496843, + "y": 720.1174711709214, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.0965264804551, + "height": 25.394020168765657, + "seed": 1670189224, + "groupIds": [ + "Oqn85bUs0EawXZuHfBx9j", + "giaWLKAMEYOmky1lVDht1", + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.263070773388013, + -12.655407976268592 + ], + [ + 21.749092160923496, + -12.570519846452996 + ], + [ + 29.0965264804551, + 0.07090797495479251 + ], + [ + 21.970571387274813, + 12.415835859067506 + ], + [ + 7.3574223926479565, + 12.738612192497058 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 1862, + "versionNonce": 1488552920, + "isDeleted": false, + "id": "XoTLH8b60EmKzFLv3DiMS", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 578.6167989066771, + "y": 696.930392871016, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 871676840, + "groupIds": [ + "Oqn85bUs0EawXZuHfBx9j", + "giaWLKAMEYOmky1lVDht1", + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1923, + "versionNonce": 1282622888, + "isDeleted": false, + "id": "2aXXoYOdC8dSWnJBd4Rer", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 583.7019504028617, + "y": 703.089201900088, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.4300394358401154, + "height": 4.165241568829386, + "seed": 271517352, + "groupIds": [ + "Oqn85bUs0EawXZuHfBx9j", + "giaWLKAMEYOmky1lVDht1", + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.4300394358401154, + 4.165241568829386 + ] + ] + }, + { + "type": "ellipse", + "version": 1984, + "versionNonce": 1535854808, + "isDeleted": false, + "id": "1bDHlynlCftez5sj7-xDD", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 601.6945959360155, + "y": 736.3143238455004, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 619180456, + "groupIds": [ + "Oqn85bUs0EawXZuHfBx9j", + "giaWLKAMEYOmky1lVDht1", + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2052, + "versionNonce": 1816940712, + "isDeleted": false, + "id": "NfWCo_lvlsl3RB914mRlm", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 600.7064534104315, + "y": 732.5173216540416, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.4300394358401154, + "height": 4.165241568829386, + "seed": 692812968, + "groupIds": [ + "Oqn85bUs0EawXZuHfBx9j", + "giaWLKAMEYOmky1lVDht1", + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.4300394358401154, + 4.165241568829386 + ] + ] + }, + { + "type": "ellipse", + "version": 1995, + "versionNonce": 165440984, + "isDeleted": false, + "id": "xGRW1ujzzh7l7i2TYRjWl", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 607.3225630098009, + "y": 706.4926902728566, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 252028840, + "groupIds": [ + "Oqn85bUs0EawXZuHfBx9j", + "giaWLKAMEYOmky1lVDht1", + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 2083, + "versionNonce": 1657535400, + "isDeleted": false, + "id": "LjSED6ByURVFQwgBGTMyK", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 572.5469618913066, + "y": 726.8956220436771, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 843215528, + "groupIds": [ + "Oqn85bUs0EawXZuHfBx9j", + "giaWLKAMEYOmky1lVDht1", + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1889, + "versionNonce": 2093019864, + "isDeleted": false, + "id": "DJlSJwOi7XFyzos4-YH98", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 593.5040061491072, + "y": 701.327225016476, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 14.881064367630502, + "height": 5.819316836931806, + "seed": 162389416, + "groupIds": [ + "Oqn85bUs0EawXZuHfBx9j", + "giaWLKAMEYOmky1lVDht1", + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 10.971069476124091, + -0.03892935430490446 + ], + [ + 14.881064367630502, + 5.780387482626902 + ] + ] + }, + { + "type": "line", + "version": 1877, + "versionNonce": 1646151336, + "isDeleted": false, + "id": "1tHUSVNSKXzCjsD5E3rUV", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 610.3000107532907, + "y": 729.9214416475697, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.359881211089217, + "height": 17.609098804231238, + "seed": 1450436776, + "groupIds": [ + "Oqn85bUs0EawXZuHfBx9j", + "giaWLKAMEYOmky1lVDht1", + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.359881211089217, + -9.699887830271365 + ], + [ + 1.5123117765600742, + -17.609098804231238 + ] + ] + }, + { + "type": "line", + "version": 2062, + "versionNonce": 181196760, + "isDeleted": false, + "id": "cwoOqvIF_xZ_CT9QkD4vc", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 577.7824380845632, + "y": 732.8110767072722, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 14.881064367630502, + "height": 5.819316836931806, + "seed": 1413518248, + "groupIds": [ + "Oqn85bUs0EawXZuHfBx9j", + "giaWLKAMEYOmky1lVDht1", + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 10.971069476124091, + -0.03892935430490446 + ], + [ + 14.881064367630502, + 5.780387482626902 + ] + ] + }, + { + "type": "line", + "version": 2047, + "versionNonce": 1995387304, + "isDeleted": false, + "id": "Tq1-C0m7_K5AhRXFretPu", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 570.5076166369213, + "y": 727.5674170087318, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.359881211089217, + "height": 17.609098804231238, + "seed": 1765793448, + "groupIds": [ + "Oqn85bUs0EawXZuHfBx9j", + "giaWLKAMEYOmky1lVDht1", + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.359881211089217, + -9.699887830271365 + ], + [ + 1.5123117765600742, + -17.609098804231238 + ] + ] + }, + { + "type": "text", + "version": 2861, + "versionNonce": 403971288, + "isDeleted": false, + "id": "QABa7PO_kOVOrplOwkPDK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 558.8595576588218, + "y": 755.2590245609347, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 68.63992309570312, + "height": 24, + "seed": 1444792744, + "groupIds": [ + "vJ8ImlZHJTcBom-bLhP5T" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Trigger", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Trigger", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 1741, + "versionNonce": 946519208, + "isDeleted": false, + "id": "9A9ymB7KBKZlxIU_b8X-p", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 576.6542592379991, + "y": 946.1504339116468, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 64.70089111328099, + "height": 64.70089111328099, + "seed": 1601291224, + "groupIds": [ + "r0mdCdiL6QJu-lo7K716H", + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "6iO3ZeCIQ2iX8l7aF1W0f", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1952, + "versionNonce": 1714078168, + "isDeleted": false, + "id": "-UNyGkl55A9Y9gOC-0DTc", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 594.8043795436732, + "y": 978.7324680777292, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.0965264804551, + "height": 25.394020168765657, + "seed": 1631291608, + "groupIds": [ + "lpJV6Z0a2KnPK2saEFAbT", + "r0mdCdiL6QJu-lo7K716H", + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.263070773388013, + -12.655407976268592 + ], + [ + 21.749092160923496, + -12.570519846452996 + ], + [ + 29.0965264804551, + 0.07090797495479251 + ], + [ + 21.970571387274813, + 12.415835859067506 + ], + [ + 7.3574223926479565, + 12.738612192497058 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 1736, + "versionNonce": 2017257384, + "isDeleted": false, + "id": "bh-ZNcT6Xl0n8np-7J8Fc", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 594.537749400666, + "y": 955.5453897778239, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 1870966232, + "groupIds": [ + "lpJV6Z0a2KnPK2saEFAbT", + "r0mdCdiL6QJu-lo7K716H", + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1797, + "versionNonce": 1680131800, + "isDeleted": false, + "id": "l3m9wzvWp8BKVDCpG0sJa", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 599.6229008968506, + "y": 961.7041988068959, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.4300394358401154, + "height": 4.165241568829386, + "seed": 56701656, + "groupIds": [ + "lpJV6Z0a2KnPK2saEFAbT", + "r0mdCdiL6QJu-lo7K716H", + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.4300394358401154, + 4.165241568829386 + ] + ] + }, + { + "type": "ellipse", + "version": 1858, + "versionNonce": 1922151080, + "isDeleted": false, + "id": "MFOMBTnY9cF9GnqX1uzIS", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 617.6155464300044, + "y": 994.9293207523083, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 1399134168, + "groupIds": [ + "lpJV6Z0a2KnPK2saEFAbT", + "r0mdCdiL6QJu-lo7K716H", + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1926, + "versionNonce": 2123770840, + "isDeleted": false, + "id": "W-fxa1IPkScZhf0Vg175k", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 616.6274039044205, + "y": 991.1323185608494, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.4300394358401154, + "height": 4.165241568829386, + "seed": 597974232, + "groupIds": [ + "lpJV6Z0a2KnPK2saEFAbT", + "r0mdCdiL6QJu-lo7K716H", + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.4300394358401154, + 4.165241568829386 + ] + ] + }, + { + "type": "ellipse", + "version": 1869, + "versionNonce": 2115313064, + "isDeleted": false, + "id": "-MVyqy1XOdnMy4v6kzqlb", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 623.2435135037898, + "y": 965.1076871796645, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 364052952, + "groupIds": [ + "lpJV6Z0a2KnPK2saEFAbT", + "r0mdCdiL6QJu-lo7K716H", + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1957, + "versionNonce": 1871900888, + "isDeleted": false, + "id": "RufA5AIuS42ixHd_8TxfU", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 588.4679123852956, + "y": 985.510618950485, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 2024081112, + "groupIds": [ + "lpJV6Z0a2KnPK2saEFAbT", + "r0mdCdiL6QJu-lo7K716H", + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1763, + "versionNonce": 1005791400, + "isDeleted": false, + "id": "Ez3CEvRYmawaI2nrKHlyf", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 609.4249566430962, + "y": 959.9422219232838, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 14.881064367630502, + "height": 5.819316836931806, + "seed": 420375512, + "groupIds": [ + "lpJV6Z0a2KnPK2saEFAbT", + "r0mdCdiL6QJu-lo7K716H", + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 10.971069476124091, + -0.03892935430490446 + ], + [ + 14.881064367630502, + 5.780387482626902 + ] + ] + }, + { + "type": "line", + "version": 1751, + "versionNonce": 246355416, + "isDeleted": false, + "id": "qoyiPJyFORLGD3_NK2URs", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 626.2209612472797, + "y": 988.5364385543776, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.359881211089217, + "height": 17.609098804231238, + "seed": 285421784, + "groupIds": [ + "lpJV6Z0a2KnPK2saEFAbT", + "r0mdCdiL6QJu-lo7K716H", + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.359881211089217, + -9.699887830271365 + ], + [ + 1.5123117765600742, + -17.609098804231238 + ] + ] + }, + { + "type": "line", + "version": 1936, + "versionNonce": 1205326760, + "isDeleted": false, + "id": "XryKjMTjt4YmYo4JpTfbs", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 593.7033885785521, + "y": 991.42607361408, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 14.881064367630502, + "height": 5.819316836931806, + "seed": 404182488, + "groupIds": [ + "lpJV6Z0a2KnPK2saEFAbT", + "r0mdCdiL6QJu-lo7K716H", + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 10.971069476124091, + -0.03892935430490446 + ], + [ + 14.881064367630502, + 5.780387482626902 + ] + ] + }, + { + "type": "line", + "version": 1921, + "versionNonce": 553556696, + "isDeleted": false, + "id": "xiN5r4BFKn3rJd1i3Mib8", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 586.4285671309102, + "y": 986.1824139155397, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.359881211089217, + "height": 17.609098804231238, + "seed": 1398725336, + "groupIds": [ + "lpJV6Z0a2KnPK2saEFAbT", + "r0mdCdiL6QJu-lo7K716H", + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.359881211089217, + -9.699887830271365 + ], + [ + 1.5123117765600742, + -17.609098804231238 + ] + ] + }, + { + "type": "text", + "version": 2735, + "versionNonce": 1743724200, + "isDeleted": false, + "id": "MVoyuSrpKDJYJAXdNBoHj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 574.7805081528107, + "y": 1013.8740214677428, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 68.63992309570312, + "height": 24, + "seed": 627949528, + "groupIds": [ + "wpgu0JeD90ZuyECu9WhZJ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Trigger", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Trigger", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 2012, + "versionNonce": 689274840, + "isDeleted": false, + "id": "XDRmZYk2bUUh_OuCE_imI", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1013.9401410888256, + "y": 945.6829740206363, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 64.70089111328099, + "height": 64.70089111328099, + "seed": 1036816040, + "groupIds": [ + "Mgaeo1MxZ2b3jOGLKmHsQ", + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "sB1bSldBW6W9Ael4sGSCI", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2223, + "versionNonce": 1021643176, + "isDeleted": false, + "id": "nQFZcVpSwjxV0MOrb0fHN", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1032.0902613944997, + "y": 978.2650081867187, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.0965264804551, + "height": 25.394020168765657, + "seed": 1435793832, + "groupIds": [ + "9rficefRt2BpacKOlaAYo", + "Mgaeo1MxZ2b3jOGLKmHsQ", + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.263070773388013, + -12.655407976268592 + ], + [ + 21.749092160923496, + -12.570519846452996 + ], + [ + 29.0965264804551, + 0.07090797495479251 + ], + [ + 21.970571387274813, + 12.415835859067506 + ], + [ + 7.3574223926479565, + 12.738612192497058 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 2007, + "versionNonce": 923256024, + "isDeleted": false, + "id": "sPcrna6E_s5P5u_RIezYS", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1031.8236312514925, + "y": 955.0779298868133, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 589759656, + "groupIds": [ + "9rficefRt2BpacKOlaAYo", + "Mgaeo1MxZ2b3jOGLKmHsQ", + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2068, + "versionNonce": 1910871208, + "isDeleted": false, + "id": "CznBse1bWLO5pCgiA79v6", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1036.9087827476772, + "y": 961.2367389158853, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.4300394358401154, + "height": 4.165241568829386, + "seed": 1412444072, + "groupIds": [ + "9rficefRt2BpacKOlaAYo", + "Mgaeo1MxZ2b3jOGLKmHsQ", + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.4300394358401154, + 4.165241568829386 + ] + ] + }, + { + "type": "ellipse", + "version": 2129, + "versionNonce": 946432472, + "isDeleted": false, + "id": "BYrZ712eY_xaUoZlQ1i7Z", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1054.901428280831, + "y": 994.4618608612977, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 14416552, + "groupIds": [ + "9rficefRt2BpacKOlaAYo", + "Mgaeo1MxZ2b3jOGLKmHsQ", + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2197, + "versionNonce": 1822212008, + "isDeleted": false, + "id": "vRUP_A0Nd519FjYra1xhj", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1053.913285755247, + "y": 990.6648586698388, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.4300394358401154, + "height": 4.165241568829386, + "seed": 1540777384, + "groupIds": [ + "9rficefRt2BpacKOlaAYo", + "Mgaeo1MxZ2b3jOGLKmHsQ", + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.4300394358401154, + 4.165241568829386 + ] + ] + }, + { + "type": "ellipse", + "version": 2140, + "versionNonce": 1213099736, + "isDeleted": false, + "id": "KE775NJ3Vh5xIOosfBmuj", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1060.5293953546163, + "y": 964.6402272886539, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 1649111208, + "groupIds": [ + "9rficefRt2BpacKOlaAYo", + "Mgaeo1MxZ2b3jOGLKmHsQ", + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 2228, + "versionNonce": 2100726440, + "isDeleted": false, + "id": "DSk6gXgTJsuRZl3Yq_gFB", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1025.753794236122, + "y": 985.0431590594744, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 199695272, + "groupIds": [ + "9rficefRt2BpacKOlaAYo", + "Mgaeo1MxZ2b3jOGLKmHsQ", + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2034, + "versionNonce": 2135610328, + "isDeleted": false, + "id": "7-1AoPipAIW2gSZdhf27P", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1046.7108384939227, + "y": 959.4747620322732, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 14.881064367630502, + "height": 5.819316836931806, + "seed": 2060805800, + "groupIds": [ + "9rficefRt2BpacKOlaAYo", + "Mgaeo1MxZ2b3jOGLKmHsQ", + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 10.971069476124091, + -0.03892935430490446 + ], + [ + 14.881064367630502, + 5.780387482626902 + ] + ] + }, + { + "type": "line", + "version": 2022, + "versionNonce": 241104296, + "isDeleted": false, + "id": "HJoYxMk3Bh-rRCABmhUQh", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1063.5068430981062, + "y": 988.068978663367, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.359881211089217, + "height": 17.609098804231238, + "seed": 734155176, + "groupIds": [ + "9rficefRt2BpacKOlaAYo", + "Mgaeo1MxZ2b3jOGLKmHsQ", + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.359881211089217, + -9.699887830271365 + ], + [ + 1.5123117765600742, + -17.609098804231238 + ] + ] + }, + { + "type": "line", + "version": 2207, + "versionNonce": 1131583704, + "isDeleted": false, + "id": "E1kCXrip5WHS6223vh69g", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1030.9892704293786, + "y": 990.9586137230694, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 14.881064367630502, + "height": 5.819316836931806, + "seed": 635034792, + "groupIds": [ + "9rficefRt2BpacKOlaAYo", + "Mgaeo1MxZ2b3jOGLKmHsQ", + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 10.971069476124091, + -0.03892935430490446 + ], + [ + 14.881064367630502, + 5.780387482626902 + ] + ] + }, + { + "type": "line", + "version": 2192, + "versionNonce": 1430388904, + "isDeleted": false, + "id": "rBPHwiwHIJhg0z-oSljsB", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1023.7144489817367, + "y": 985.7149540245291, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.359881211089217, + "height": 17.609098804231238, + "seed": 717752232, + "groupIds": [ + "9rficefRt2BpacKOlaAYo", + "Mgaeo1MxZ2b3jOGLKmHsQ", + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.359881211089217, + -9.699887830271365 + ], + [ + 1.5123117765600742, + -17.609098804231238 + ] + ] + }, + { + "type": "text", + "version": 3006, + "versionNonce": 408534488, + "isDeleted": false, + "id": "PcSfvJ50qMCUrd3vSo38-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1012.0663900036375, + "y": 1013.4065615767322, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 68.63992309570312, + "height": 24, + "seed": 1723388584, + "groupIds": [ + "LYxusaRPIoibUN9WqI81C" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Trigger", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Trigger", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 1802, + "versionNonce": 25930664, + "isDeleted": false, + "id": "t6kcifZDQhbV_nWUqOl38", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 983.0200647497404, + "y": 86.50416157572238, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 64.70089111328099, + "height": 64.70089111328099, + "seed": 1472657112, + "groupIds": [ + "J1L7NaF-KAKPeyL2x_fdK", + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "vEz4-_ilsOBuVZj_DPvkJ", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2013, + "versionNonce": 1863598808, + "isDeleted": false, + "id": "DFZjXOYckaEEaXsyKuFyE", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1001.1701850554145, + "y": 119.08619574180477, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.0965264804551, + "height": 25.394020168765657, + "seed": 510811096, + "groupIds": [ + "UiYc3P4Sz4f2klJYSV7dR", + "J1L7NaF-KAKPeyL2x_fdK", + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.263070773388013, + -12.655407976268592 + ], + [ + 21.749092160923496, + -12.570519846452996 + ], + [ + 29.0965264804551, + 0.07090797495479251 + ], + [ + 21.970571387274813, + 12.415835859067506 + ], + [ + 7.3574223926479565, + 12.738612192497058 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 1797, + "versionNonce": 1835529896, + "isDeleted": false, + "id": "kSle35CinQ1sA-sAST9fg", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1000.9035549124073, + "y": 95.89911744189942, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 610869464, + "groupIds": [ + "UiYc3P4Sz4f2klJYSV7dR", + "J1L7NaF-KAKPeyL2x_fdK", + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1858, + "versionNonce": 1983260632, + "isDeleted": false, + "id": "nCkcaJi-Gj6y-UXxHFq4R", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1005.988706408592, + "y": 102.05792647097144, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.4300394358401154, + "height": 4.165241568829386, + "seed": 692012504, + "groupIds": [ + "UiYc3P4Sz4f2klJYSV7dR", + "J1L7NaF-KAKPeyL2x_fdK", + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.4300394358401154, + 4.165241568829386 + ] + ] + }, + { + "type": "ellipse", + "version": 1919, + "versionNonce": 1300423080, + "isDeleted": false, + "id": "tq-vHrMslqGBEPZUr9cT-", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1023.9813519417457, + "y": 135.28304841638385, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 1510525656, + "groupIds": [ + "UiYc3P4Sz4f2klJYSV7dR", + "J1L7NaF-KAKPeyL2x_fdK", + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1987, + "versionNonce": 1775463640, + "isDeleted": false, + "id": "_-qjlYrFZMzp6WigV3Z42", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1022.9932094161618, + "y": 131.48604622492496, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.4300394358401154, + "height": 4.165241568829386, + "seed": 559525848, + "groupIds": [ + "UiYc3P4Sz4f2klJYSV7dR", + "J1L7NaF-KAKPeyL2x_fdK", + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.4300394358401154, + 4.165241568829386 + ] + ] + }, + { + "type": "ellipse", + "version": 1930, + "versionNonce": 1627942056, + "isDeleted": false, + "id": "BFv-mYDBgemf7btmHv84E", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1029.6093190155311, + "y": 105.46141484374004, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 2001073368, + "groupIds": [ + "UiYc3P4Sz4f2klJYSV7dR", + "J1L7NaF-KAKPeyL2x_fdK", + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 2018, + "versionNonce": 1669337560, + "isDeleted": false, + "id": "IvExXLyv1TNrEB9_TCLJb", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 994.8337178970369, + "y": 125.86434661456053, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.527048406442323, + "height": 6.527048406442323, + "seed": 828479960, + "groupIds": [ + "UiYc3P4Sz4f2klJYSV7dR", + "J1L7NaF-KAKPeyL2x_fdK", + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1824, + "versionNonce": 564434856, + "isDeleted": false, + "id": "3-flS9_Dj1Dzx16JB31Ya", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1015.7907621548375, + "y": 100.29594958735936, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 14.881064367630502, + "height": 5.819316836931806, + "seed": 1388355288, + "groupIds": [ + "UiYc3P4Sz4f2klJYSV7dR", + "J1L7NaF-KAKPeyL2x_fdK", + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 10.971069476124091, + -0.03892935430490446 + ], + [ + 14.881064367630502, + 5.780387482626902 + ] + ] + }, + { + "type": "line", + "version": 1812, + "versionNonce": 709891800, + "isDeleted": false, + "id": "nkjlSKQnH-y7d2oCu3uVj", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1032.586766759021, + "y": 128.89016621845315, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.359881211089217, + "height": 17.609098804231238, + "seed": 1542915032, + "groupIds": [ + "UiYc3P4Sz4f2klJYSV7dR", + "J1L7NaF-KAKPeyL2x_fdK", + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.359881211089217, + -9.699887830271365 + ], + [ + 1.5123117765600742, + -17.609098804231238 + ] + ] + }, + { + "type": "line", + "version": 1997, + "versionNonce": 1937990312, + "isDeleted": false, + "id": "pw9G7hyNSDw_nEoI6AmxB", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1000.0691940902934, + "y": 131.77980127815556, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 14.881064367630502, + "height": 5.819316836931806, + "seed": 454609112, + "groupIds": [ + "UiYc3P4Sz4f2klJYSV7dR", + "J1L7NaF-KAKPeyL2x_fdK", + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 10.971069476124091, + -0.03892935430490446 + ], + [ + 14.881064367630502, + 5.780387482626902 + ] + ] + }, + { + "type": "line", + "version": 1982, + "versionNonce": 47676376, + "isDeleted": false, + "id": "aR_rzj4KLztdvjax1gGpQ", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 992.7943726426515, + "y": 126.53614157961522, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.359881211089217, + "height": 17.609098804231238, + "seed": 2075782616, + "groupIds": [ + "UiYc3P4Sz4f2klJYSV7dR", + "J1L7NaF-KAKPeyL2x_fdK", + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.359881211089217, + -9.699887830271365 + ], + [ + 1.5123117765600742, + -17.609098804231238 + ] + ] + }, + { + "type": "text", + "version": 2796, + "versionNonce": 1431358888, + "isDeleted": false, + "id": "dFzpfPQIKSw4AWDzU8HVv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 981.146313664552, + "y": 154.2277491318181, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 68.63992309570312, + "height": 24, + "seed": 1458467544, + "groupIds": [ + "BCaPcKNNCXAauw4HeNuzo" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Trigger", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Trigger", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 3621, + "versionNonce": 2133475544, + "isDeleted": false, + "id": "-LhaEMrYv6CeKP6Y-Xj2R", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 173.95314709825846, + "y": 444.1192521427794, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 723526616, + "groupIds": [ + "eealDpUnuW39r_l6_aeyG", + "LWzQzJqG5tRL2J5yjpR0k", + "Um-Yeh9JqyAXu3ehdPPDy", + "PbUEi35G3YOyRBZQByKgf", + "EpFMqCfRgbyGV8R2hUwMn" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1577, + "versionNonce": 272160936, + "isDeleted": false, + "id": "OjLHq6b5pr-RJLnhmhb9K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 180.24247189657683, + "y": 450.4914805060845, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 51.88250276832002, + "height": 51.88250276832002, + "seed": 1746790616, + "groupIds": [ + "4p6r9UvdODle89IROy91k", + "EpFMqCfRgbyGV8R2hUwMn" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "5n_B9CJuQSbh_9oqVzuI6", + "type": "arrow" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 5122, + "versionNonce": 1323066840, + "isDeleted": false, + "id": "WxXQkBws6TARgF1xzTRht", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 195.99023582726306, + "y": 460.89953111564284, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 28.10264153823924, + "height": 32.45750960039449, + "seed": 723193304, + "groupIds": [ + "4p6r9UvdODle89IROy91k", + "EpFMqCfRgbyGV8R2hUwMn" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.522383435627326, + 0.8876695614221044 + ], + [ + 4.222250533550099, + 2.710891079770457 + ], + [ + 6.53876438289814, + 1.9494891881139838 + ], + [ + 13.00273268947289, + 2.0374391115495714 + ], + [ + 15.018859724261578, + 2.2364052653721083 + ], + [ + 16.578273739956423, + 0.9941438562971401 + ], + [ + 18.744233429245106, + -0.5092823311506232 + ], + [ + 19.3382730064762, + 1.5588921397895759 + ], + [ + 19.283438583962543, + 3.566556278350808 + ], + [ + 21.26661686487244, + 5.46749782452002 + ], + [ + 22.153106695509578, + 10.909367329014938 + ], + [ + 21.45853734367018, + 16.608727547781946 + ], + [ + 19.438802781084537, + 18.8230883820351 + ], + [ + 16.687942584983702, + 20.009258415382803 + ], + [ + 13.71774469882833, + 20.664602961087855 + ], + [ + 14.50370475485716, + 21.40308436092641 + ], + [ + 15.390194585494283, + 23.040424434305827 + ], + [ + 15.572975993873055, + 28.176226896819482 + ], + [ + 15.536419712197318, + 31.28569415677526 + ], + [ + 14.567678247789736, + 31.823854903738514 + ], + [ + 7.240428539404906, + 31.948227269243866 + ], + [ + 6.324236729906197, + 31.05132655929166 + ], + [ + 6.068342758175913, + 27.392989048505843 + ], + [ + 4.377614730672068, + 27.862931757494 + ], + [ + 1.5810591824765403, + 28.041957551394276 + ], + [ + -1.0327149573401755, + 26.542616527479623 + ], + [ + -2.659469491911409, + 23.92436429168835 + ], + [ + -4.240528674387946, + 22.313132146586064 + ], + [ + -5.949534842729662, + 21.179302118551103 + ], + [ + -3.628210956319009, + 21.40308436092641 + ], + [ + -1.9831782809098755, + 22.671183734386556 + ], + [ + -0.11880791544621871, + 24.43906344915162 + ], + [ + 2.147681548450816, + 25.543055844869823 + ], + [ + 4.660925913659192, + 25.22976070554441 + ], + [ + 5.9038394906349865, + 24.252578247172192 + ], + [ + 6.022647406081191, + 22.71594018286161 + ], + [ + 6.689799546663803, + 21.380706136688904 + ], + [ + 7.558011236463052, + 20.776494082275484 + ], + [ + 4.277084956063728, + 19.93358096932851 + ], + [ + 1.1423838023674477, + 18.89984919335192 + ], + [ + -0.4569535209469784, + 16.571430507386058 + ], + [ + -1.6541717458280658, + 10.963038997107194 + ], + [ + -0.7037084222583516, + 5.6861115380996985 + ], + [ + 0.6671521405825978, + 4.240069736001822 + ], + [ + -0.11880791544621871, + 2.2772861946741387 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "text", + "version": 2459, + "versionNonce": 1743225768, + "isDeleted": false, + "id": "hitiVDIgOP98amDOep0aJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 173.68372328073758, + "y": 514.1185010342941, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 63.99993896484375, + "height": 50, + "seed": 1026265816, + "groupIds": [ + "EpFMqCfRgbyGV8R2hUwMn" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "GitHub\nApp", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "GitHub\nApp", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "arrow", + "version": 416, + "versionNonce": 251783896, + "isDeleted": false, + "id": "ZCy2IWtwus0Ua0-ZWtxiI", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 464.7289444009635, + "y": 484.4696558316466, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 207.47916194780538, + "height": 5.231236758842954, + "seed": 1324070824, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "W4Y-NK4ifgtz8tLpebNmP" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ivE8803kNip-QGmVRPTJT", + "gap": 14.62055831857424, + "focus": 0.16397172913155103 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -207.47916194780538, + -5.231236758842954 + ] + ] + }, + { + "type": "text", + "version": 20, + "versionNonce": 1250479784, + "isDeleted": false, + "id": "W4Y-NK4ifgtz8tLpebNmP", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 289.2253863762795, + "y": 464.35403745222516, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 143.5279541015625, + "height": 35, + "seed": 217584296, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240665, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "REST API", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ZCy2IWtwus0Ua0-ZWtxiI", + "originalText": "REST API", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "arrow", + "version": 559, + "versionNonce": 439275480, + "isDeleted": false, + "id": "5n_B9CJuQSbh_9oqVzuI6", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 202.52949146560832, + "y": 440.31985181770045, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 272.8426527029128, + "height": 314.68993033808175, + "seed": 183894184, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "_OEHTl2PZTnuWn-1mAEiT" + } + ], + "updated": 1702808240665, + "link": null, + "locked": false, + "startBinding": { + "elementId": "OjLHq6b5pr-RJLnhmhb9K", + "focus": -0.13753799019063503, + "gap": 10.35604214156509 + }, + "endBinding": { + "elementId": "kQEs74aFmFnjuSm-p72OE", + "focus": -0.08628183567880451, + "gap": 10.620705807546301 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.7521460748805566, + -314.68993033808175 + ], + [ + 272.09050662803224, + -314.6167125785801 + ] + ] + }, + { + "type": "text", + "version": 11, + "versionNonce": 13154728, + "isDeleted": false, + "id": "_OEHTl2PZTnuWn-1mAEiT", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 149.23537609141135, + "y": 108.1299214796187, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 105.08393859863281, + "height": 35, + "seed": 282316200, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "webhook", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "5n_B9CJuQSbh_9oqVzuI6", + "originalText": "webhook", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "arrow", + "version": 76, + "versionNonce": 1484199128, + "isDeleted": false, + "id": "3CctNqXoAGgfLtMVAW8GE", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 50, + "angle": 0, + "x": 751.8692015743843, + "y": 120.68221795976856, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 57.941872405622235, + "height": 0.32615183778005985, + "seed": 961931432, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "VprgBUfB4-wBA0Fq7V3Z1", + "focus": 0.03598892594670091, + "gap": 3.2757841338804496 + }, + "endBinding": { + "elementId": "R0smI5sVq2H9Cbtg0AVI7", + "focus": 0.12703530284919762, + "gap": 11.461144149285666 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 57.941872405622235, + 0.32615183778005985 + ] + ] + }, + { + "type": "arrow", + "version": 69, + "versionNonce": 1574126760, + "isDeleted": false, + "id": "vEz4-_ilsOBuVZj_DPvkJ", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 1056.8825301019726, + "y": 117.2470877763239, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 38.64800871774992, + "height": 0.02555897409504837, + "seed": 773374168, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "t6kcifZDQhbV_nWUqOl38", + "focus": -0.048809902203905846, + "gap": 9.161574238951289 + }, + "endBinding": { + "elementId": "nV1Lv6Z9RwU1kyPtg_KkZ", + "focus": 0.010158572367500326, + "gap": 4.6205238772413395 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 38.64800871774992, + -0.02555897409504837 + ] + ] + }, + { + "type": "arrow", + "version": 72, + "versionNonce": 258914776, + "isDeleted": false, + "id": "dySicUMsQbgCIoOX-MYqw", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 1174.9138724729864, + "y": 118.20696924789414, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 41.74916424128469, + "height": 0, + "seed": 1458113960, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "nV1Lv6Z9RwU1kyPtg_KkZ", + "focus": 0.021195575596268702, + "gap": 10.301657411065662 + }, + "endBinding": { + "elementId": "U2pwmC5ui2QgIyOhovNXp", + "focus": -0.04394364760382134, + "gap": 3.847791388797873 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 41.74916424128469, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 128, + "versionNonce": 1867804584, + "isDeleted": false, + "id": "_pz_3_mcUDfEsFbLSG4mL", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 614.7406771174399, + "y": 123.46927802546713, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 62.62800619094287, + "height": 0.5083395958907317, + "seed": 706689704, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "2MGNA2z3GcTn0mTa2zdNs", + "focus": 0.09187991420798045, + "gap": 10.815644694940147 + }, + "endBinding": { + "elementId": "VprgBUfB4-wBA0Fq7V3Z1", + "focus": -0.10250470244167695, + "gap": 6.763581767164112 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 62.62800619094287, + -0.5083395958907317 + ] + ] + }, + { + "type": "rectangle", + "version": 2278, + "versionNonce": 841596632, + "isDeleted": false, + "id": "KqWZSlwJgeKzNny0t4qUD", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1194.7514152558729, + "y": 686.0049911651249, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 1783918296, + "groupIds": [ + "HYQcTB0OWr_NEwBKtm5Tk", + "uOZ6hlv_NPeAeKJg2zhWj", + "8FmkxyonSTe_DjOlJamzM", + "PDhSp71YzDH5c2joqdU4n" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1259, + "versionNonce": 762854056, + "isDeleted": false, + "id": "WUsz_PI3dfbenaihAB_0o", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1227.6406201017357, + "y": 712.4366267884079, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 21.841043343648586, + "height": 21.841043343648586, + "seed": 1888539608, + "groupIds": [ + "9Q6YIkMcBoWOAJWpu29ei", + "8FmkxyonSTe_DjOlJamzM", + "PDhSp71YzDH5c2joqdU4n" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1358, + "versionNonce": 826024920, + "isDeleted": false, + "id": "2TEQ2j6zp5yVPKfbXd8TC", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1230.6126579806532, + "y": 715.4209926302692, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 15.995025530159795, + "height": 15.995025530159795, + "seed": 469276888, + "groupIds": [ + "9Q6YIkMcBoWOAJWpu29ei", + "8FmkxyonSTe_DjOlJamzM", + "PDhSp71YzDH5c2joqdU4n" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1454, + "versionNonce": 720020904, + "isDeleted": false, + "id": "vSRc_g7C4ffbUoehc2YVE", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1243.1151541471345, + "y": 733.2771913308634, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 9.151218017876092, + "height": 10.091076767857256, + "seed": 1881128408, + "groupIds": [ + "9Q6YIkMcBoWOAJWpu29ei", + "8FmkxyonSTe_DjOlJamzM", + "PDhSp71YzDH5c2joqdU4n" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 6.168060525924741, + 7.91444045501081 + ], + [ + 8.989033712179662, + 8.010284255302183 + ], + [ + 9.151218017876092, + 5.512226866678265 + ], + [ + 3.2231092420771543, + -2.080792512555073 + ] + ] + }, + { + "type": "line", + "version": 3427, + "versionNonce": 1253697752, + "isDeleted": false, + "id": "NTWwJHNmrg3KWEr4qfdP_", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1251.9872447704706, + "y": 717.6261890503365, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 51.20925119386821, + "height": 31.346195428564556, + "seed": 1578779352, + "groupIds": [ + "9Q6YIkMcBoWOAJWpu29ei", + "8FmkxyonSTe_DjOlJamzM", + "PDhSp71YzDH5c2joqdU4n" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.7019871718007114, + -4.829355828674696 + ], + [ + -1.6224572311732235, + -8.49331278461991 + ], + [ + -6.126805998801945, + -9.755950990552602 + ], + [ + -6.636812422697123, + -10.606384505992917 + ], + [ + -7.557495501631415, + -14.327812919294981 + ], + [ + -11.807523972968628, + -16.07173954496999 + ], + [ + -15.685983674796862, + -13.618555037195279 + ], + [ + -16.10752432751427, + -14.007414596177838 + ], + [ + -22.066170177703448, + -20.331419411454842 + ], + [ + -30.802290387121715, + -23.13419750802699 + ], + [ + -39.029469270454406, + -19.57959569240311 + ], + [ + -42.9254717597682, + -10.684831709042832 + ], + [ + -43.53966981076644, + -9.209356170530938 + ], + [ + -49.482289071530886, + -5.437655712898088 + ], + [ + -50.507264022067496, + 2.3029843499115477 + ], + [ + -45.59746384395778, + 7.662372111781902 + ], + [ + -39.77364684615847, + 8.138198233547083 + ], + [ + -32.60818252258176, + 8.211997920537568 + ], + [ + -27.80227478104559, + 8.104207523821323 + ] + ] + }, + { + "type": "text", + "version": 2604, + "versionNonce": 1154986152, + "isDeleted": false, + "id": "hetmGuecDNyTMkW_9cvUv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1170.9819914383518, + "y": 754.9502816922204, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 111.43991088867188, + "height": 24, + "seed": 343680984, + "groupIds": [ + "PDhSp71YzDH5c2joqdU4n" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "CloudWatch", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "CloudWatch", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "line", + "version": 1308, + "versionNonce": 1513557464, + "isDeleted": false, + "id": "QrT7n6lWdJ4eS-ANxEQ-B", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.4783633783245, + "y": 418.73981610422874, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 68.65265455930219, + "height": 47.990271018315184, + "seed": 1025758168, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.105427357601002e-15, + 23.995135509157592 + ], + [ + 41.1915927355813, + 23.995135509157585 + ], + [ + 41.19159273558131, + 35.99270326373639 + ], + [ + 68.65265455930219, + 11.997567754578782 + ], + [ + 41.19159273558131, + -11.997567754578792 + ], + [ + 41.19159273558131, + 3.552713678800501e-15 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1820, + "versionNonce": 1391156136, + "isDeleted": false, + "id": "tq1zS2x2Ef1SqMhpqBRrA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.144564265631301, + "x": 1076.8320877062424, + "y": 418.1407372521284, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 68.65265455930219, + "height": 47.990271018315184, + "seed": 98967976, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.105427357601002e-15, + 23.995135509157592 + ], + [ + 41.1915927355813, + 23.995135509157585 + ], + [ + 41.19159273558131, + 35.99270326373639 + ], + [ + 68.65265455930219, + 11.997567754578782 + ], + [ + 41.19159273558131, + -11.997567754578792 + ], + [ + 41.19159273558131, + 3.552713678800501e-15 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 102, + "versionNonce": 684167896, + "isDeleted": false, + "id": "6iO3ZeCIQ2iX8l7aF1W0f", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 651.9268236746884, + "y": 982.3944152452901, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 89.2249124038334, + "height": 1.4693197109402263, + "seed": 603624872, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "9A9ymB7KBKZlxIU_b8X-p", + "focus": 0.13990009177428286, + "gap": 10.571673323408334 + }, + "endBinding": { + "elementId": "ckHQnZo6y_sITM7X4uOh2", + "focus": -0.014790824769439796, + "gap": 3.711619276026397 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 89.2249124038334, + -1.4693197109402263 + ] + ] + }, + { + "type": "arrow", + "version": 77, + "versionNonce": 1464968872, + "isDeleted": false, + "id": "sB1bSldBW6W9Ael4sGSCI", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 1089.777791441694, + "y": 982.9745758178502, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 76.48029808705132, + "height": 0.9963627224401534, + "seed": 1676520664, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "XDRmZYk2bUUh_OuCE_imI", + "focus": 0.13348686245776895, + "gap": 11.136759239587377 + }, + "endBinding": { + "elementId": "bseMzya9y50b8CCr1bgn-", + "focus": -0.21267679960554894, + "gap": 3.362070476777717 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 76.48029808705132, + 0.9963627224401534 + ] + ] + }, + { + "type": "arrow", + "version": 730, + "versionNonce": 1023375320, + "isDeleted": false, + "id": "CY9kqXcqCclWzV_SdZgnZ", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 838.3727746345963, + "y": 412.40991473084773, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 195.64654090952888, + "height": 3.7671178470273503, + "seed": 1092851928, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "69FR0y28xceWbpfvy30cc" + } + ], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "W6naSg5WGUxkEWtp9fIKN", + "focus": -0.5775365778920502, + "gap": 9.574374965051788 + }, + "endBinding": { + "elementId": "0-WIPIwbxU5oirOXK2PXz", + "focus": -0.04557499341333021, + "gap": 19.05249091865926 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 195.64654090952888, + 3.7671178470273503 + ] + ] + }, + { + "type": "text", + "version": 17, + "versionNonce": 783716776, + "isDeleted": false, + "id": "69FR0y28xceWbpfvy30cc", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 868.7208357813679, + "y": 397.2199071816049, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 91.22396850585938, + "height": 35, + "seed": 1536535768, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "create", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "CY9kqXcqCclWzV_SdZgnZ", + "originalText": "create", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "arrow", + "version": 470, + "versionNonce": 720551128, + "isDeleted": false, + "id": "B9LuEtI5fz0cIw_reMJMU", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 846.5770018617776, + "y": 154.31609540664607, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 22.519058745783468, + "height": 218.6007200847328, + "seed": 496305112, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "9y31e3vEHEVxUCCei9ZTk", + "focus": -0.07528363258071558, + "gap": 3.3653425579450698 + }, + "endBinding": { + "elementId": "3_YliClQBodWJoWEXxaHg", + "focus": 0.14150865836763216, + "gap": 5.926481630430601 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 2.9575577014204555, + 217.72417313271268 + ], + [ + -19.561501044363013, + 218.6007200847328 + ] + ] + }, + { + "type": "arrow", + "version": 484, + "versionNonce": 1078336680, + "isDeleted": false, + "id": "A0Q4ehpvRidAU5HGJoEUB", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 825.6470785973545, + "y": 497.43230391159267, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 197.7212455657492, + "height": 3.1512646421606405, + "seed": 1762161320, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "wXOhaoZwO0Ma2PDsEHxue" + } + ], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "vv1ewWvR1lmII3MPO4kSQ", + "gap": 12.59079124879014, + "focus": 0.029529635933343828 + }, + "endBinding": { + "elementId": "0-WIPIwbxU5oirOXK2PXz", + "gap": 29.703482299680786, + "focus": -0.4649249881772308 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 197.7212455657492, + -3.1512646421606405 + ] + ] + }, + { + "type": "text", + "version": 13, + "versionNonce": 1681220056, + "isDeleted": false, + "id": "wXOhaoZwO0Ma2PDsEHxue", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 859.5477328133345, + "y": 478.35667159051235, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 129.91993713378906, + "height": 35, + "seed": 1983913688, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "terminate", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "A0Q4ehpvRidAU5HGJoEUB", + "originalText": "terminate", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "arrow", + "version": 563, + "versionNonce": 766265256, + "isDeleted": false, + "id": "9ABOs5-WXUCCZ-D8t85bL", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 807.8323653638516, + "y": 717.1122326794728, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 233.50832436225494, + "height": 205.10887874930518, + "seed": 862970328, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "RJW7-L_4OhaxKIoboEq8z" + } + ], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "n9qmPQ5oyMHvQSgbGrMne", + "gap": 10.457257931373135, + "focus": 0.5331845279876658 + }, + "endBinding": { + "elementId": "0-WIPIwbxU5oirOXK2PXz", + "gap": 11.731116736678018, + "focus": 0.09110333045867611 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 233.50832436225494, + -205.10887874930518 + ] + ] + }, + { + "type": "text", + "version": 10, + "versionNonce": 131819224, + "isDeleted": false, + "id": "RJW7-L_4OhaxKIoboEq8z", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 878.9745432920495, + "y": 597.0577933048202, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 91.22396850585938, + "height": 35, + "seed": 615826648, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "create", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "9ABOs5-WXUCCZ-D8t85bL", + "originalText": "create", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "arrow", + "version": 105, + "versionNonce": 51712680, + "isDeleted": false, + "id": "ztTiOSNqcEkLEIthcdd1V", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 620.1693384202035, + "y": 495.6712253332772, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 117.94916683873771, + "height": 2.1188473084802126, + "seed": 1607364568, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "JPqW94G_1U4n_Rtp1AVB3", + "focus": -0.020750296933416363, + "gap": 9.001944141892238 + }, + "endBinding": { + "elementId": "vv1ewWvR1lmII3MPO4kSQ", + "focus": 0.13410223290661427, + "gap": 10.476629724665997 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 117.94916683873771, + -2.1188473084802126 + ] + ] + }, + { + "type": "arrow", + "version": 66, + "versionNonce": 846777304, + "isDeleted": false, + "id": "h_B89cGbWb6iNZ006NPoL", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 634.9129842750458, + "y": 720.004184118631, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 87.64208301565316, + "height": 0.5170996407600796, + "seed": 1977029032, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "uUv0KoFONcaKfwZdcWlGA", + "focus": 0.011219565185519488, + "gap": 9.478784417754696 + }, + "endBinding": { + "elementId": "n9qmPQ5oyMHvQSgbGrMne", + "focus": 0.0961574415945354, + "gap": 10.358887776822542 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 87.64208301565316, + -0.5170996407600796 + ] + ] + }, + { + "type": "rectangle", + "version": 1039, + "versionNonce": 1730969000, + "isDeleted": false, + "id": "LyeVp7KMhpgKr0URszD88", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1464.4036723266968, + "y": 14.381353682960707, + "strokeColor": "#d94576", + "backgroundColor": "transparent", + "width": 1157.2084417081958, + "height": 443.6494596044594, + "seed": 776971944, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "cUPaaf9O5p9ArRVfoz6gA", + "type": "arrow" + } + ], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2436, + "versionNonce": 824594681, + "isDeleted": false, + "id": "mxcHW5eh9iYvoHOZYqgWO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1414.5881719269546, + "y": 23.83265849601935, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 40.199981689453125, + "height": 25, + "seed": 1978962344, + "groupIds": [ + "3fjhGOH4fjrNDUT8euuwu" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702932324883, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "AWS", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "AWS", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 774, + "versionNonce": 1260292264, + "isDeleted": false, + "id": "zUYX9sScR_1l8bEgwhODs", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1463.303310971538, + "y": 15.07081663501117, + "strokeColor": "#d94576", + "backgroundColor": "transparent", + "width": 39.6243416500605, + "height": 42.52368372201621, + "seed": 1875123368, + "groupIds": [ + "3F0yWccZYcDQ3NTQaIESP", + "2M0FvfGH08bleIVbmkCHQ", + "3fjhGOH4fjrNDUT8euuwu" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 376, + "versionNonce": 1651095000, + "isDeleted": false, + "id": "M1eDHAgmbLaL6hEPrqac1", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1457.5536401465076, + "y": 22.27015849601935, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 28.125, + "height": 28.125, + "seed": 1030375336, + "groupIds": [ + "9XFbTG1ULbiVY5JvQMAnk", + "2M0FvfGH08bleIVbmkCHQ", + "3fjhGOH4fjrNDUT8euuwu" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 371, + "versionNonce": 446116776, + "isDeleted": false, + "id": "o6G5meIX95a1t1o2XCOSD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1453.8036401465076, + "y": 32.02015849601935, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.125, + "height": 8.125, + "seed": 1796412072, + "groupIds": [ + "9XFbTG1ULbiVY5JvQMAnk", + "2M0FvfGH08bleIVbmkCHQ", + "3fjhGOH4fjrNDUT8euuwu" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 365, + "versionNonce": 1684355800, + "isDeleted": false, + "id": "V7hFMeuURQ3IZRGY8gAjB", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1443.1786401465076, + "y": 38.52015849601935, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.125, + "height": 8.125, + "seed": 527072680, + "groupIds": [ + "9XFbTG1ULbiVY5JvQMAnk", + "2M0FvfGH08bleIVbmkCHQ", + "3fjhGOH4fjrNDUT8euuwu" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 651, + "versionNonce": 1807908520, + "isDeleted": false, + "id": "RZR8QMW6YQa_hGs2u1lXr", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1441.6786401465076, + "y": 33.89515849601935, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.874999999999981, + "height": 7.874999999999979, + "seed": 1268549800, + "groupIds": [ + "9XFbTG1ULbiVY5JvQMAnk", + "2M0FvfGH08bleIVbmkCHQ", + "3fjhGOH4fjrNDUT8euuwu" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 3.374999999999991, + -7.874999999999979 + ], + [ + 6.874999999999981, + 0 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 1947, + "versionNonce": 111681496, + "isDeleted": false, + "id": "lM-MbggFi2bltfg5ZKqu9", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -623.8471206672966, + "y": 223.53567996800217, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 1532310440, + "groupIds": [ + "li31b0JAlGEOMweU5ureD", + "y7LI2rJI8Rj5-uisga4jS", + "P-wHA79fIrW66omvQ2vSa" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1310, + "versionNonce": 793536936, + "isDeleted": false, + "id": "Ux0100oEgMVNINMOZZFH-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -602.060991439464, + "y": 244.74188203412797, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 21.136985907710482, + "height": 21.58982944276917, + "seed": 1690336936, + "groupIds": [ + "hRcTEX7n-FVKqfuCVFoHm", + "y7LI2rJI8Rj5-uisga4jS", + "P-wHA79fIrW66omvQ2vSa" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1635, + "versionNonce": 155608280, + "isDeleted": false, + "id": "Je3NkXdbc3vCtJgNX5aSp", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 4.726840450960482, + "x": -590.9811065294234, + "y": 262.74403031823414, + "strokeColor": "#000", + "backgroundColor": "transparent", + "width": 21.298113442520286, + "height": 21.325685740313624, + "seed": 1485466024, + "groupIds": [ + "kRZSEdQ-ADKp1ZkBMwTLA", + "hRcTEX7n-FVKqfuCVFoHm", + "y7LI2rJI8Rj5-uisga4jS", + "P-wHA79fIrW66omvQ2vSa" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.05533508667380005, + -8.330350296057105 + ], + [ + -21.16993868276674, + -8.49388689455444 + ], + [ + -21.242778355846482, + 12.60784310791851 + ], + [ + -12.973972126229569, + 12.831798845759185 + ] + ] + }, + { + "type": "line", + "version": 1649, + "versionNonce": 1616966824, + "isDeleted": false, + "id": "D6bobR_SJx_tW02DaIVLT", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 1.5503909961083693, + "x": -572.4516641570892, + "y": 243.97388426232243, + "strokeColor": "#000", + "backgroundColor": "transparent", + "width": 21.298113442520286, + "height": 21.325685740313624, + "seed": 836695208, + "groupIds": [ + "-XY4wKjJs3c1JL2e1a8EO", + "hRcTEX7n-FVKqfuCVFoHm", + "y7LI2rJI8Rj5-uisga4jS", + "P-wHA79fIrW66omvQ2vSa" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.05533508667380005, + -8.330350296057105 + ], + [ + -21.16993868276674, + -8.49388689455444 + ], + [ + -21.242778355846482, + 12.60784310791851 + ], + [ + -12.973972126229569, + 12.831798845759185 + ] + ] + }, + { + "type": "rectangle", + "version": 3574, + "versionNonce": 164891096, + "isDeleted": false, + "id": "60lIX2wtAAtAipl_RV8hj", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1199.2279715472614, + "y": -105.29958058829868, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 644489128, + "groupIds": [ + "d5hlmhYc20DqpG6_uEzyp", + "P1oNr3qlDbERExGVlID3Q", + "atXtxoNG4YchyoIHLwo2f", + "OFUM2i6lmQgH_RPibbYrr", + "rhYTT2ZdeqfKkBHQW-il8" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "MebWehEWzdFtf6cajcDfZ", + "type": "arrow" + } + ], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1469, + "versionNonce": 883695528, + "isDeleted": false, + "id": "PO-rP7U2f18IlVGlCI2rM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1192.938646748943, + "y": -98.97280092452579, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 51.88250276832002, + "height": 51.88250276832002, + "seed": 1448602280, + "groupIds": [ + "9oWNpJydM8FOHuFwpaSQw", + "rhYTT2ZdeqfKkBHQW-il8" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "MebWehEWzdFtf6cajcDfZ", + "type": "arrow" + } + ], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 5087, + "versionNonce": 1399131864, + "isDeleted": false, + "id": "H4hDSTal3M904VyBeBiRl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1177.1908828182568, + "y": -88.56475031496743, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 28.10264153823924, + "height": 32.45750960039449, + "seed": 2085901736, + "groupIds": [ + "9oWNpJydM8FOHuFwpaSQw", + "rhYTT2ZdeqfKkBHQW-il8" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.522383435627326, + 0.8876695614221044 + ], + [ + 4.222250533550099, + 2.710891079770457 + ], + [ + 6.53876438289814, + 1.9494891881139838 + ], + [ + 13.00273268947289, + 2.0374391115495714 + ], + [ + 15.018859724261578, + 2.2364052653721083 + ], + [ + 16.578273739956423, + 0.9941438562971401 + ], + [ + 18.744233429245106, + -0.5092823311506232 + ], + [ + 19.3382730064762, + 1.5588921397895759 + ], + [ + 19.283438583962543, + 3.566556278350808 + ], + [ + 21.26661686487244, + 5.46749782452002 + ], + [ + 22.153106695509578, + 10.909367329014938 + ], + [ + 21.45853734367018, + 16.608727547781946 + ], + [ + 19.438802781084537, + 18.8230883820351 + ], + [ + 16.687942584983702, + 20.009258415382803 + ], + [ + 13.71774469882833, + 20.664602961087855 + ], + [ + 14.50370475485716, + 21.40308436092641 + ], + [ + 15.390194585494283, + 23.040424434305827 + ], + [ + 15.572975993873055, + 28.176226896819482 + ], + [ + 15.536419712197318, + 31.28569415677526 + ], + [ + 14.567678247789736, + 31.823854903738514 + ], + [ + 7.240428539404906, + 31.948227269243866 + ], + [ + 6.324236729906197, + 31.05132655929166 + ], + [ + 6.068342758175913, + 27.392989048505843 + ], + [ + 4.377614730672068, + 27.862931757494 + ], + [ + 1.5810591824765403, + 28.041957551394276 + ], + [ + -1.0327149573401755, + 26.542616527479623 + ], + [ + -2.659469491911409, + 23.92436429168835 + ], + [ + -4.240528674387946, + 22.313132146586064 + ], + [ + -5.949534842729662, + 21.179302118551103 + ], + [ + -3.628210956319009, + 21.40308436092641 + ], + [ + -1.9831782809098755, + 22.671183734386556 + ], + [ + -0.11880791544621871, + 24.43906344915162 + ], + [ + 2.147681548450816, + 25.543055844869823 + ], + [ + 4.660925913659192, + 25.22976070554441 + ], + [ + 5.9038394906349865, + 24.252578247172192 + ], + [ + 6.022647406081191, + 22.71594018286161 + ], + [ + 6.689799546663803, + 21.380706136688904 + ], + [ + 7.558011236463052, + 20.776494082275484 + ], + [ + 4.277084956063728, + 19.93358096932851 + ], + [ + 1.1423838023674477, + 18.89984919335192 + ], + [ + -0.4569535209469784, + 16.571430507386058 + ], + [ + -1.6541717458280658, + 10.963038997107194 + ], + [ + -0.7037084222583516, + 5.6861115380996985 + ], + [ + 0.6671521405825978, + 4.240069736001822 + ], + [ + -0.11880791544621871, + 2.2772861946741387 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 1336, + "versionNonce": 1280961192, + "isDeleted": false, + "id": "CghUVjBmEFxGr179I3n5J", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -758.07861552822, + "y": 119.88692960021291, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "width": 340.4929295645432, + "height": 284.90360380716174, + "seed": 495673512, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "cUPaaf9O5p9ArRVfoz6gA", + "type": "arrow" + } + ], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2516, + "versionNonce": 400430871, + "isDeleted": false, + "id": "OCZ8RKQ44a26RZW6ydFiH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -708.7037727682573, + "y": 128.61748915149502, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 36.439971923828125, + "height": 25, + "seed": 967379880, + "groupIds": [ + "kKAhDTQ-Z_1aXHBDfDa9b" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702932324883, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "VPC", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "VPC", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 865, + "versionNonce": 1645630888, + "isDeleted": false, + "id": "Wu7sSnSXSiWpf3l0bE1jn", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -757.4189118128406, + "y": 119.85564729048684, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "width": 39.6243416500605, + "height": 42.52368372201621, + "seed": 2061063848, + "groupIds": [ + "CoUwUkb_jUYUbQn5QV4WC", + "kKAhDTQ-Z_1aXHBDfDa9b" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3970, + "versionNonce": 828455128, + "isDeleted": false, + "id": "K7LNLxiwAM1IRD8n17x3s", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -724.5112568262261, + "y": 149.514635211197, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 32.27574323253867, + "height": 18.361713520282862, + "seed": 1707622824, + "groupIds": [ + "hfgzfaVDIGY9rs2unObdG", + "CoUwUkb_jUYUbQn5QV4WC", + "kKAhDTQ-Z_1aXHBDfDa9b" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 3.549984432244912, + -3.8949537333214295 + ], + [ + 2.3636841312957984, + -8.495303540186455 + ], + [ + -2.7289433979513547, + -10.111388238124647 + ], + [ + -3.027690717076837, + -10.609548106174614 + ], + [ + -3.567000789869894, + -12.789455475380407 + ], + [ + -6.056547102486405, + -13.810998302611608 + ], + [ + -8.328438953196809, + -12.373992295078466 + ], + [ + -8.57536552902286, + -12.601775211762344 + ], + [ + -12.065771512081795, + -16.306198129166546 + ], + [ + -17.183143313379162, + -17.9479861601084 + ], + [ + -22.002391699683074, + -15.86580108709353 + ], + [ + -24.284559618469785, + -10.65550025600254 + ], + [ + -24.644339441920692, + -9.79120847277541 + ], + [ + -28.1253575027867, + -7.581853163765089 + ], + [ + -28.72575880029376, + -3.0476054391618987 + ], + [ + -25.849736907374307, + 0.09177212746608632 + ], + [ + -22.43830984753089, + 0.3704975936309154 + ], + [ + -18.24098378130509, + 0.41372736017446243 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 959, + "versionNonce": 2064474280, + "isDeleted": false, + "id": "tRk__hU6Y5IHHm-Hft678", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -741.9936653301397, + "y": 140.7764682343771, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 6.723014307274803, + "height": 6.1627631150019475, + "seed": 161598632, + "groupIds": [ + "-9SB6OVu5YlVrmR6nQWD5", + "hfgzfaVDIGY9rs2unObdG", + "CoUwUkb_jUYUbQn5QV4WC", + "kKAhDTQ-Z_1aXHBDfDa9b" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1103, + "versionNonce": 259284440, + "isDeleted": false, + "id": "Fj6EY783vdHKqJngY2JK-", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -741.7961157359264, + "y": 140.69346805773517, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 3.735007948486001, + "height": 3.735007948486001, + "seed": 806483880, + "groupIds": [ + "-9SB6OVu5YlVrmR6nQWD5", + "hfgzfaVDIGY9rs2unObdG", + "CoUwUkb_jUYUbQn5QV4WC", + "kKAhDTQ-Z_1aXHBDfDa9b" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.1660003532660483, + -0.8300017663302128 + ], + [ + 0.5810012364311606, + -2.0750044158255605 + ], + [ + 1.4940031793944009, + -2.9880063587888444 + ], + [ + 2.407005122357648, + -3.652007771852979 + ], + [ + 3.735007948486001, + -3.7350079484860075 + ] + ] + }, + { + "type": "line", + "version": 1182, + "versionNonce": 384502696, + "isDeleted": false, + "id": "Ohe4w4CUkJLo_fzmVsNgd", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -735.4781514644478, + "y": 140.71919352557603, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 3.735007948486001, + "height": 3.735007948486001, + "seed": 222610088, + "groupIds": [ + "-9SB6OVu5YlVrmR6nQWD5", + "hfgzfaVDIGY9rs2unObdG", + "CoUwUkb_jUYUbQn5QV4WC", + "kKAhDTQ-Z_1aXHBDfDa9b" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.16600035326605678, + -0.8300017663301986 + ], + [ + -0.5810012364311561, + -2.0750044158255605 + ], + [ + -1.494003179394383, + -2.9880063587888444 + ], + [ + -2.407005122357667, + -3.652007771852979 + ], + [ + -3.7350079484860075, + -3.7350079484860075 + ] + ] + }, + { + "type": "arrow", + "version": 3361, + "versionNonce": 1775952600, + "isDeleted": false, + "id": "cUPaaf9O5p9ArRVfoz6gA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -990.1156922138289, + "y": 277.01133076025866, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 225.51440740660746, + "height": 1.307271401920616, + "seed": 1877355944, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "O_IqjSYNMnRbz7El-umgW", + "focus": 0.11807151745670481, + "gap": 1.16494150791425 + }, + "endBinding": { + "elementId": "CghUVjBmEFxGr179I3n5J", + "focus": -0.08603414308172914, + "gap": 6.522669279001406 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 225.51440740660746, + -1.307271401920616 + ] + ] + }, + { + "type": "rectangle", + "version": 1384, + "versionNonce": 1608210088, + "isDeleted": false, + "id": "O_IqjSYNMnRbz7El-umgW", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1375.1306210844218, + "y": 119.04657996627105, + "strokeColor": "#d94576", + "backgroundColor": "transparent", + "width": 383.8499873626786, + "height": 284.3336918168821, + "seed": 1898068136, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "cUPaaf9O5p9ArRVfoz6gA", + "type": "arrow" + }, + { + "id": "MebWehEWzdFtf6cajcDfZ", + "type": "arrow" + } + ], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 507, + "versionNonce": 1845742041, + "isDeleted": false, + "id": "NtUuRgisoTTVqG2HfRVWH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1355.9150135297377, + "y": 358.3631133688736, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 337.7638854980469, + "height": 36, + "seed": 614785960, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702932324883, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Serverless Control Plane", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Serverless Control Plane", + "lineHeight": 1.2857142857142858, + "baseline": 25 + }, + { + "type": "rectangle", + "version": 1801, + "versionNonce": 1519010216, + "isDeleted": false, + "id": "T8iumlJy-owHD_ZBNxGl3", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1263.33868482198, + "y": 256.46777895589133, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 64.46115236495699, + "height": 64.39942473426015, + "seed": 1218064040, + "groupIds": [ + "aNeWbtsNmj9Shi3Wrk3oq", + "SGuABbxfVYSCRYlTZnBSJ", + "zxGjTX0gm2tUqkORRbFUd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 964, + "versionNonce": 460459224, + "isDeleted": false, + "id": "bcjHfWN2HxaZFKyIvKxNn", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1238.3474772715329, + "y": 283.2052447409905, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 19.307143399999998, + "height": 26.897, + "seed": 1974344104, + "groupIds": [ + "Bg-nWP6JU2OXACNwU7Rg2", + "SGuABbxfVYSCRYlTZnBSJ", + "zxGjTX0gm2tUqkORRbFUd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -12.730345799999998, + 25.466 + ], + [ + -0.5178580999999962, + 26.897 + ], + [ + 6.576797599999999, + 13.180999999999997 + ], + [ + 0.8992804999999997, + 0.5640000000000001 + ] + ] + }, + { + "type": "line", + "version": 964, + "versionNonce": 371444904, + "isDeleted": false, + "id": "fCbLW61Jg2a4PVVbk2cIc", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1213.8607570715328, + "y": 299.10224474099044, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 34.863799400000005, + "height": 44, + "seed": 1326228648, + "groupIds": [ + "Bg-nWP6JU2OXACNwU7Rg2", + "SGuABbxfVYSCRYlTZnBSJ", + "zxGjTX0gm2tUqkORRbFUd" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -14.960123300000012, + -32.42 + ], + [ + -29.1743317, + -33 + ], + [ + -30.178179700000005, + -23.001 + ], + [ + -22.897294200000005, + -22 + ], + [ + -7.866463500000002, + 10.421999999999997 + ], + [ + 3.689738799999993, + 11 + ], + [ + 4.685619699999997, + 1.0000000000000002 + ], + [ + 3.6897387999999935, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 1289, + "versionNonce": 675983832, + "isDeleted": false, + "id": "u9dctUub-9xoUE-4i2mBW", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1149.0340908197434, + "y": 150.93672713051973, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 65.08084106445301, + "height": 65.08084106445301, + "seed": 845270952, + "groupIds": [ + "0Flc726FbxzCwcZbm_RHk", + "pZtmi77xaFG7WtcLOTrMO", + "zMAKusZNbVCZxvIWyZVCV", + "SLbk-WQ4OPj6Nk63Zk3xR" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "u9dctUub-9xoUE-4i2mBW", + "type": "arrow" + } + ], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1074, + "versionNonce": 1549006760, + "isDeleted": false, + "id": "4snnvDA89f_34tGZbYxNE", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1135.4212356420844, + "y": 162.0038231560356, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 39.10563151041674, + "height": 10.753995455228363, + "seed": 1742314152, + "groupIds": [ + "zMAKusZNbVCZxvIWyZVCV", + "SLbk-WQ4OPj6Nk63Zk3xR" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1692, + "versionNonce": 1019655896, + "isDeleted": false, + "id": "IE3pCRSR-oSv3lWMnhwCw", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1135.063319225818, + "y": 167.88229120491354, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 38.295773237179446, + "height": 40.48662140675077, + "seed": 1377830312, + "groupIds": [ + "zMAKusZNbVCZxvIWyZVCV", + "SLbk-WQ4OPj6Nk63Zk3xR" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 3.8452774439103905, + 32.14685684595355 + ], + [ + 6.768312737880933, + 37.98883103590748 + ], + [ + 20.34867663261207, + 40.48662140675077 + ], + [ + 32.537268066406114, + 38.400380608974274 + ], + [ + 35.36686823918285, + 31.944173177083314 + ], + [ + 38.295773237179446, + 0.09767190004004078 + ] + ] + }, + { + "type": "ellipse", + "version": 1084, + "versionNonce": 1632027304, + "isDeleted": false, + "id": "b_HHLmW_mL0QAHeIHKzcF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1118.2930311398804, + "y": 178.14479038328653, + "strokeColor": "#000000", + "backgroundColor": "#000", + "width": 4.69818115234375, + "height": 4.69818115234375, + "seed": 509677736, + "groupIds": [ + "zMAKusZNbVCZxvIWyZVCV", + "SLbk-WQ4OPj6Nk63Zk3xR" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1770, + "versionNonce": 1299848152, + "isDeleted": false, + "id": "VyCWCQPha0ZkSpTMmk2ET", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1115.8029127316775, + "y": 180.717780800767, + "strokeColor": "#000000", + "backgroundColor": "#000", + "width": 23.24691772460949, + "height": 11.53113708496096, + "seed": 1950923688, + "groupIds": [ + "zMAKusZNbVCZxvIWyZVCV", + "SLbk-WQ4OPj6Nk63Zk3xR" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.0229309082030795, + 7.4353179931640625 + ], + [ + 17.00493774414076, + 11.53113708496096 + ], + [ + 22.923687744140693, + 10.143841552734386 + ], + [ + 23.24691772460949, + 5.890612792968767 + ], + [ + 17.962628173828193, + 1.7561248779296932 + ] + ] + }, + { + "type": "rectangle", + "version": 1187, + "versionNonce": 1940401576, + "isDeleted": false, + "id": "b8No1K7Tz6j1dEf3xHoSN", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1149.0340908197434, + "y": 256.3335961583786, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 65.08084106445301, + "height": 65.08084106445301, + "seed": 637732520, + "groupIds": [ + "KlQ6wfD_t5xKDrbumP4uP", + "BcYKfi8G_EDc3T8OgfWfX", + "VR6fKG4kyOuwmS-hltkIo", + "Ilf0IQvcb06WmBPEO1pGu", + "IWRosNEj55VmJ-HuL243g", + "PpbOWmPGPg5SqAuXnBoTz", + "SwpKBe7uSpesdP6MQ_4MW" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "b8No1K7Tz6j1dEf3xHoSN", + "type": "arrow" + } + ], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 885, + "versionNonce": 477683928, + "isDeleted": false, + "id": "BvbUdH1-fly-4AgYezrkr", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1140.8504393517153, + "y": 285.44027066178404, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.117920455804926, + "height": 8.117920455804926, + "seed": 1614541224, + "groupIds": [ + "HDGwDCv02_iYnJntw129N", + "PpbOWmPGPg5SqAuXnBoTz", + "SwpKBe7uSpesdP6MQ_4MW" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 940, + "versionNonce": 748959912, + "isDeleted": false, + "id": "0nVIfaybDj6OcdNmpYyS3", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1099.7926723020958, + "y": 285.3668355683182, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.117920455804926, + "height": 8.117920455804926, + "seed": 1512012968, + "groupIds": [ + "HDGwDCv02_iYnJntw129N", + "PpbOWmPGPg5SqAuXnBoTz", + "SwpKBe7uSpesdP6MQ_4MW" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1557, + "versionNonce": 156698072, + "isDeleted": false, + "id": "rBvk8SsOHDzPGIkWUUn4S", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1123.8692180056726, + "y": 281.7598754072898, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 89761704, + "groupIds": [ + "HDGwDCv02_iYnJntw129N", + "PpbOWmPGPg5SqAuXnBoTz", + "SwpKBe7uSpesdP6MQ_4MW" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 1631, + "versionNonce": 535225256, + "isDeleted": false, + "id": "ElOhoMg9fbKZoXYFhDdNV", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 1.5707963267948957, + "x": -1117.3077222869344, + "y": 275.83271637420165, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.6587160660160247, + "height": 14.901485256991352, + "seed": 1041658536, + "groupIds": [ + "HDGwDCv02_iYnJntw129N", + "PpbOWmPGPg5SqAuXnBoTz", + "SwpKBe7uSpesdP6MQ_4MW" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 1661, + "versionNonce": 1630046936, + "isDeleted": false, + "id": "AnXMaOP3ttfHmjInqVKxN", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": -1111.3733183886864, + "y": 282.3515614732252, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 2063719848, + "groupIds": [ + "HDGwDCv02_iYnJntw129N", + "PpbOWmPGPg5SqAuXnBoTz", + "SwpKBe7uSpesdP6MQ_4MW" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 1748, + "versionNonce": 194784936, + "isDeleted": false, + "id": "-oswUBiFFQE-i7jsmiIDX", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 4.71238898038469, + "x": -1117.925719814655, + "y": 288.2995753924353, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.6587160660160247, + "height": 14.901485256991352, + "seed": 2101864616, + "groupIds": [ + "HDGwDCv02_iYnJntw129N", + "PpbOWmPGPg5SqAuXnBoTz", + "SwpKBe7uSpesdP6MQ_4MW" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 1159, + "versionNonce": 780234712, + "isDeleted": false, + "id": "yFTMxNCJ09phr8gMBzxph", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1130.7057636727498, + "y": 289.5139954515518, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.842473884372846, + "height": 5.167099126652263, + "seed": 9737128, + "groupIds": [ + "HDGwDCv02_iYnJntw129N", + "PpbOWmPGPg5SqAuXnBoTz", + "SwpKBe7uSpesdP6MQ_4MW" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.816503304871627, + -0.053670945826642225 + ], + [ + 3.254730628247874, + -2.532485186304994 + ], + [ + 5.842473884372846, + -0.04842214250790278 + ], + [ + 3.0350803951419567, + 2.6346139403472693 + ] + ] + }, + { + "type": "line", + "version": 1175, + "versionNonce": 141564328, + "isDeleted": false, + "id": "Oi6xdDvg6I0c6x-RykZiB", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1108.1119150458119, + "y": 289.6368659131892, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.842473884372846, + "height": 5.167099126652263, + "seed": 1796464296, + "groupIds": [ + "HDGwDCv02_iYnJntw129N", + "PpbOWmPGPg5SqAuXnBoTz", + "SwpKBe7uSpesdP6MQ_4MW" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.816503304871627, + -0.053670945826642225 + ], + [ + 3.254730628247874, + -2.532485186304994 + ], + [ + 5.842473884372846, + -0.04842214250790278 + ], + [ + 3.0350803951419567, + 2.6346139403472693 + ] + ] + }, + { + "type": "line", + "version": 1151, + "versionNonce": 158708952, + "isDeleted": false, + "id": "v4as2DOOewlA8tq2v57cS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1136.8270453685197, + "y": 285.4840900443034, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 41.34963281275164, + "height": 17.10905784483692, + "seed": 2104609192, + "groupIds": [ + "HDGwDCv02_iYnJntw129N", + "PpbOWmPGPg5SqAuXnBoTz", + "SwpKBe7uSpesdP6MQ_4MW" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.559970698127005, + -7.66093059073715 + ], + [ + 8.271070731353255, + -13.100012337621466 + ], + [ + 15.09486779216366, + -16.193976031908193 + ], + [ + 21.94229008411606, + -16.944786876248074 + ], + [ + 29.75087123626803, + -15.033447184450166 + ], + [ + 35.47649450941106, + -11.065217973307726 + ], + [ + 39.57403120169017, + -5.297544356691949 + ], + [ + 41.34963281275164, + 0.16427096858884305 + ] + ] + }, + { + "type": "line", + "version": 1255, + "versionNonce": 965649576, + "isDeleted": false, + "id": "imREQhwV8y4f_EYTFkocc", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": -1137.0807027415315, + "y": 310.17167371645445, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 41.34963281275164, + "height": 17.10905784483692, + "seed": 47862952, + "groupIds": [ + "HDGwDCv02_iYnJntw129N", + "PpbOWmPGPg5SqAuXnBoTz", + "SwpKBe7uSpesdP6MQ_4MW" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.559970698127005, + -7.66093059073715 + ], + [ + 8.271070731353255, + -13.100012337621466 + ], + [ + 15.09486779216366, + -16.193976031908193 + ], + [ + 21.94229008411606, + -16.944786876248074 + ], + [ + 29.75087123626803, + -15.033447184450166 + ], + [ + 35.47649450941106, + -11.065217973307726 + ], + [ + 39.57403120169017, + -5.297544356691949 + ], + [ + 41.34963281275164, + 0.16427096858884305 + ] + ] + }, + { + "type": "rectangle", + "version": 1465, + "versionNonce": 1738103256, + "isDeleted": false, + "id": "ZLqsR14BwFGafeDu1AfXW", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1263.2737854481868, + "y": 150.5121058527505, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 64.65338134765624, + "height": 64.65338134765624, + "seed": 16351144, + "groupIds": [ + "CUC3YS9NLs07pOx5Lb6Az", + "3RoQ7jvIXGvmP-x527MGc" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1938, + "versionNonce": 2091110312, + "isDeleted": false, + "id": "n6yMb70HlDMBeM_z4uiJm", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1238.377285102704, + "y": 170.60820137577667, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 15.16932105348633, + "height": 0, + "seed": 1744521896, + "groupIds": [ + "CUC3YS9NLs07pOx5Lb6Az", + "3RoQ7jvIXGvmP-x527MGc" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 15.16932105348633, + 0 + ] + ] + }, + { + "type": "line", + "version": 1989, + "versionNonce": 1811963608, + "isDeleted": false, + "id": "Jf2bYWhzZYyIbz_95cBzM", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1239.8491794561457, + "y": 195.38709589427282, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 17.13783740126311, + "height": 0, + "seed": 1116452264, + "groupIds": [ + "CUC3YS9NLs07pOx5Lb6Az", + "3RoQ7jvIXGvmP-x527MGc" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 17.13783740126311, + 0 + ] + ] + }, + { + "type": "line", + "version": 1835, + "versionNonce": 433822376, + "isDeleted": false, + "id": "RxBtiNJaACMT1pWekyIpS", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1256.6497290644577, + "y": 166.43754080923765, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 16.95504631353927, + "height": 48.41270068259871, + "seed": 1708572840, + "groupIds": [ + "CUC3YS9NLs07pOx5Lb6Az", + "3RoQ7jvIXGvmP-x527MGc" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 16.95504631353927, + -7.400560664373661 + ], + [ + 16.871549804500688, + 41.01214001822505 + ], + [ + 0.08056087780811456, + 33.450908214315675 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1783, + "versionNonce": 926860248, + "isDeleted": false, + "id": "PyqqZqXU8mtQl6KnFnt75", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1222.188685385158, + "y": 158.85192935003062, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 16.976775286010504, + "height": 48.27905988118746, + "seed": 562588584, + "groupIds": [ + "CUC3YS9NLs07pOx5Lb6Az", + "3RoQ7jvIXGvmP-x527MGc" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.1970252545028261, + 48.27905988118746 + ], + [ + 16.961573619999825, + 40.954321999069336 + ], + [ + 16.976775286010504, + 7.507893438730637 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1508, + "versionNonce": 1944192424, + "isDeleted": false, + "id": "MB-aaOAYYl9_gy-givo3s", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1235.5077171716432, + "y": 188.98756891272689, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 9.101119485207235, + "height": 12.203935908273408, + "seed": 1875687080, + "groupIds": [ + "CUC3YS9NLs07pOx5Lb6Az", + "3RoQ7jvIXGvmP-x527MGc" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 9.101119485207235, + -12.203935908273408 + ] + ] + }, + { + "type": "line", + "version": 1626, + "versionNonce": 929597656, + "isDeleted": false, + "id": "zaS1yhgbqdqijMYmTyovu", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1227.6992031668362, + "y": 179.11881499428347, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.016669064250991, + "height": 8.41385706862771, + "seed": 625975720, + "groupIds": [ + "CUC3YS9NLs07pOx5Lb6Az", + "3RoQ7jvIXGvmP-x527MGc" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.00572174417704, + 4.3706612125143 + ], + [ + -0.010947320073949565, + 8.41385706862771 + ] + ] + }, + { + "type": "line", + "version": 1766, + "versionNonce": 937627816, + "isDeleted": false, + "id": "c-4P1i2jYR8iecf6K1k2X", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": -1239.5050197679686, + "y": 178.57543164153304, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.016669064250991, + "height": 8.41385706862771, + "seed": 557657256, + "groupIds": [ + "CUC3YS9NLs07pOx5Lb6Az", + "3RoQ7jvIXGvmP-x527MGc" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.00572174417704, + 4.3706612125143 + ], + [ + -0.010947320073949565, + 8.41385706862771 + ] + ] + }, + { + "type": "text", + "version": 775, + "versionNonce": 1012472887, + "isDeleted": false, + "id": "Yx9G6iCcJXY-TrOu4TInH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -734.022458081497, + "y": 354.32177576530097, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 275.6318664550781, + "height": 36, + "seed": 2101434280, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702932324883, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Self-Hosted Runners", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Self-Hosted Runners", + "lineHeight": 1.2857142857142858, + "baseline": 25 + }, + { + "type": "text", + "version": 707, + "versionNonce": 645867193, + "isDeleted": false, + "id": "ebcZo0xmb4rEWvjcjP48G", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -967.8455249796618, + "y": 222.09935500648697, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 182.64393615722656, + "height": 36, + "seed": 1032331944, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702932324883, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Manage fleet", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Manage fleet", + "lineHeight": 1.2857142857142858, + "baseline": 25 + }, + { + "type": "line", + "version": 1903, + "versionNonce": 1917727448, + "isDeleted": false, + "id": "h2IAOc1HvjAHCpDvnTlwI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0.008516750252503869, + "x": -519.8907544855886, + "y": 246.3007655965817, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 38.357532662810776, + "height": 39.98584595309403, + "seed": 12422568, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 19.2864793354476, + 0.09105909911537124 + ], + [ + 19.304684350215307, + -10.634676758657868 + ], + [ + 38.357532662810776, + 10.473720182052507 + ], + [ + 19.043745805211625, + 29.35116919443616 + ], + [ + 19.325490081378387, + 19.65273387738712 + ], + [ + 0.1378379689554482, + 19.668124147660137 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 2198, + "versionNonce": 1191511720, + "isDeleted": false, + "id": "DOJhL9EiM_2mcFVoihiDf", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.1127035944426, + "x": -699.1267173946699, + "y": 246.88980093109257, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 38.357532662810776, + "height": 39.98584595309403, + "seed": 806197416, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 19.2864793354476, + 0.09105909911537124 + ], + [ + 19.304684350215307, + -10.634676758657868 + ], + [ + 38.357532662810776, + 10.473720182052507 + ], + [ + 19.043745805211625, + 29.35116919443616 + ], + [ + 19.325490081378387, + 19.65273387738712 + ], + [ + 0.1378379689554482, + 19.668124147660137 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "text", + "version": 229, + "versionNonce": 1635155287, + "isDeleted": false, + "id": "dk1B6Alh-6U8kpyJ1mrUC", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1242.0397134561595, + "y": -146.13031506282698, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 149.575927734375, + "height": 36, + "seed": 790905768, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702932324883, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "GitHub App", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "GitHub App", + "lineHeight": 1.2857142857142858, + "baseline": 25 + }, + { + "type": "arrow", + "version": 307, + "versionNonce": 285077928, + "isDeleted": false, + "id": "MebWehEWzdFtf6cajcDfZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 80, + "angle": 0, + "x": -1167.4746941284593, + "y": -33.604472073508475, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 1.2088993528525407, + "height": 143.15727165779538, + "seed": 204312232, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808240666, + "link": null, + "locked": false, + "startBinding": { + "elementId": "gvlTdhY9vF1T5sAGvlM-K", + "focus": 1.1270691811193383, + "gap": 14.567551363868802 + }, + "endBinding": { + "elementId": "O_IqjSYNMnRbz7El-umgW", + "focus": 0.06856332031803856, + "gap": 9.49378038198418 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.6044496764262703, + 71.57863582889769 + ], + [ + -1.2088993528525407, + 143.15727165779538 + ] + ] + }, + { + "type": "text", + "version": 263, + "versionNonce": 1966860185, + "isDeleted": false, + "id": "gvlTdhY9vF1T5sAGvlM-K", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 80, + "angle": 0, + "x": -1153.410182145272, + "y": -19.036920709639674, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 220.75192260742188, + "height": 36, + "seed": 802519464, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "MebWehEWzdFtf6cajcDfZ", + "type": "arrow" + } + ], + "updated": 1702932324883, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Events and API", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Events and API", + "lineHeight": 1.2857142857142858, + "baseline": 25 + }, + { + "type": "rectangle", + "version": 2962, + "versionNonce": 597813464, + "isDeleted": false, + "id": "a7I9fYj_NHVQ6NvYC85LC", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 2077.3076693814237, + "y": 285.5563618760185, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 304.9401622196817, + "height": 211.2826095052431, + "seed": 1642834344, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1982, + "versionNonce": 1444875736, + "isDeleted": false, + "id": "H8YPKw7mPFmtmqzrqS9qi", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2199.314563327034, + "y": 141.222419225495, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 65.08084106445301, + "height": 65.08084106445301, + "seed": 2098738344, + "groupIds": [ + "a-OoX4tbuao37tGEZ6Lwj", + "tdwBBrKvmXgF_1ro0o3Sm", + "4imvljK9nry_75LXP2EAI", + "i8aArLByfy71rMbFbY04l", + "7GWro_0OoUdlRW2zTtlU-", + "J05o3-ECyGRpXiJYxD9Qh", + "27xLQQdgsbXi6_fPmq-X5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1685, + "versionNonce": 1739559640, + "isDeleted": false, + "id": "LNnF3_x13sd_iOHPIsG6E", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2207.4982147950623, + "y": 170.32909372890043, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.117920455804926, + "height": 8.117920455804926, + "seed": 947609512, + "groupIds": [ + "To2UFwNACH5N9A3Kgcreu", + "J05o3-ECyGRpXiJYxD9Qh", + "27xLQQdgsbXi6_fPmq-X5" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1738, + "versionNonce": 1592227800, + "isDeleted": false, + "id": "h16nl5KNH4DwyXLZQcMqb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2248.555981844682, + "y": 170.2556586354346, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.117920455804926, + "height": 8.117920455804926, + "seed": 339815080, + "groupIds": [ + "To2UFwNACH5N9A3Kgcreu", + "J05o3-ECyGRpXiJYxD9Qh", + "27xLQQdgsbXi6_fPmq-X5" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2355, + "versionNonce": 1339735256, + "isDeleted": false, + "id": "zldsqxwlQQ_X3l23el4Nf", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2224.479436141105, + "y": 166.64869847440622, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 722834856, + "groupIds": [ + "To2UFwNACH5N9A3Kgcreu", + "J05o3-ECyGRpXiJYxD9Qh", + "27xLQQdgsbXi6_fPmq-X5" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2428, + "versionNonce": 740123096, + "isDeleted": false, + "id": "eanF7c632oqEeoWmLe1_w", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 2231.040931859843, + "y": 160.72153944131804, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 1646567592, + "groupIds": [ + "To2UFwNACH5N9A3Kgcreu", + "J05o3-ECyGRpXiJYxD9Qh", + "27xLQQdgsbXi6_fPmq-X5" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2459, + "versionNonce": 314795736, + "isDeleted": false, + "id": "8JLW024XxlRxov2kg1U2D", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 2236.975335758091, + "y": 167.2403845403416, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 421153704, + "groupIds": [ + "To2UFwNACH5N9A3Kgcreu", + "J05o3-ECyGRpXiJYxD9Qh", + "27xLQQdgsbXi6_fPmq-X5" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2545, + "versionNonce": 543214552, + "isDeleted": false, + "id": "aiICg-V0cgCtGj8VnS28b", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 4.71238898038469, + "x": 2230.4229343321226, + "y": 173.1883984595517, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 1512216232, + "groupIds": [ + "To2UFwNACH5N9A3Kgcreu", + "J05o3-ECyGRpXiJYxD9Qh", + "27xLQQdgsbXi6_fPmq-X5" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 1957, + "versionNonce": 1057591512, + "isDeleted": false, + "id": "UEpB6EvTVXgXZ-F541oY8", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2217.642890474028, + "y": 174.4028185186682, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.842473884372846, + "height": 5.167099126652263, + "seed": 166298024, + "groupIds": [ + "To2UFwNACH5N9A3Kgcreu", + "J05o3-ECyGRpXiJYxD9Qh", + "27xLQQdgsbXi6_fPmq-X5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.816503304871627, + -0.053670945826642225 + ], + [ + 3.254730628247874, + -2.532485186304994 + ], + [ + 5.842473884372846, + -0.04842214250790278 + ], + [ + 3.0350803951419567, + 2.6346139403472693 + ] + ] + }, + { + "type": "line", + "version": 1973, + "versionNonce": 1985066456, + "isDeleted": false, + "id": "MJeBFZqzcHEFrU1Tp3A0N", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2240.2367391009657, + "y": 174.52568898030512, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.842473884372846, + "height": 5.167099126652263, + "seed": 396037288, + "groupIds": [ + "To2UFwNACH5N9A3Kgcreu", + "J05o3-ECyGRpXiJYxD9Qh", + "27xLQQdgsbXi6_fPmq-X5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.816503304871627, + -0.053670945826642225 + ], + [ + 3.254730628247874, + -2.532485186304994 + ], + [ + 5.842473884372846, + -0.04842214250790278 + ], + [ + 3.0350803951419567, + 2.6346139403472693 + ] + ] + }, + { + "type": "line", + "version": 1948, + "versionNonce": 994917080, + "isDeleted": false, + "id": "dKreSTxB-wsP5FmheG5t0", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2211.521608778258, + "y": 170.3729131114198, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 41.34963281275164, + "height": 17.109057844836915, + "seed": 753088424, + "groupIds": [ + "To2UFwNACH5N9A3Kgcreu", + "J05o3-ECyGRpXiJYxD9Qh", + "27xLQQdgsbXi6_fPmq-X5" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.559970698127005, + -7.66093059073715 + ], + [ + 8.271070731353255, + -13.100012337621466 + ], + [ + 15.09486779216366, + -16.193976031908193 + ], + [ + 21.94229008411606, + -16.944786876248074 + ], + [ + 29.75087123626803, + -15.033447184450166 + ], + [ + 35.47649450941106, + -11.065217973307726 + ], + [ + 39.57403120169017, + -5.297544356691949 + ], + [ + 41.34963281275164, + 0.16427096858884305 + ] + ] + }, + { + "type": "line", + "version": 2052, + "versionNonce": 1083187160, + "isDeleted": false, + "id": "98UZ6tmVlV0yTybeGQcOT", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 2211.267951405246, + "y": 195.06049678357084, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 41.34963281275164, + "height": 17.109057844836915, + "seed": 1575879336, + "groupIds": [ + "To2UFwNACH5N9A3Kgcreu", + "J05o3-ECyGRpXiJYxD9Qh", + "27xLQQdgsbXi6_fPmq-X5" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.559970698127005, + -7.66093059073715 + ], + [ + 8.271070731353255, + -13.100012337621466 + ], + [ + 15.09486779216366, + -16.193976031908193 + ], + [ + 21.94229008411606, + -16.944786876248074 + ], + [ + 29.75087123626803, + -15.033447184450166 + ], + [ + 35.47649450941106, + -11.065217973307726 + ], + [ + 39.57403120169017, + -5.297544356691949 + ], + [ + 41.34963281275164, + 0.16427096858884305 + ] + ] + }, + { + "type": "text", + "version": 2270, + "versionNonce": 1177445592, + "isDeleted": false, + "id": "r-oPExycvLoMmY6fPKJ-7", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2112.347609559329, + "y": 211.3144430565913, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "width": 242.49977111816406, + "height": 24, + "seed": 1499950504, + "groupIds": [ + "27xLQQdgsbXi6_fPmq-X5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "self-hosted, arm64, linux", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "self-hosted, arm64, linux", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 1430, + "versionNonce": 1773930968, + "isDeleted": false, + "id": "1UVkqKOAuZZEJGdO6Eq1S", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 2409.0573770885326, + "y": 521.7731821432103, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 637.2010586456353, + "height": 178.3817905555521, + "seed": 1040891816, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 827, + "versionNonce": 1984761560, + "isDeleted": false, + "id": "4hIhA2GDJ9qOzasQNct9N", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2142.973658949792, + "y": 306.66377310389464, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 175.6159210205078, + "height": 35, + "seed": 879813032, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "control plane", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "control plane", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "rectangle", + "version": 2991, + "versionNonce": 880112600, + "isDeleted": false, + "id": "YD8Xu4DtHwTL3aNhygMcA", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 2080.9727531924877, + "y": 64.73249635499621, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 1299.3620992093972, + "height": 187.37463292503452, + "seed": 1633246120, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1998, + "versionNonce": 977877208, + "isDeleted": false, + "id": "0VROusyBicI2qEHJlu5va", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2668.9682470939106, + "y": 78.31636479054404, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 105.08393859863281, + "height": 35, + "seed": 1744807592, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "webhook", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "webhook", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "text", + "version": 1209, + "versionNonce": 995909080, + "isDeleted": false, + "id": "q63H__6pRM29Ifxqmx2ii", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2104.2404119872176, + "y": 398.7163000937936, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 260.59588623046875, + "height": 35, + "seed": 166131928, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Amzon Linux arm64", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Amzon Linux arm64", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "rectangle", + "version": 3129, + "versionNonce": 1489167064, + "isDeleted": false, + "id": "QA_pszmRQCI0zl2zCOPeQ", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 2408.457294598145, + "y": 285.4866218521914, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 304.9401622196817, + "height": 211.2826095052431, + "seed": 598155432, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 993, + "versionNonce": 1896925144, + "isDeleted": false, + "id": "KPGeRzNQxC4DRgcdkuQoy", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2473.9898590282983, + "y": 306.59403308006756, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 175.6159210205078, + "height": 35, + "seed": 105696168, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "control plane", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "control plane", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "text", + "version": 1380, + "versionNonce": 1884949720, + "isDeleted": false, + "id": "ZC_7edpc8ocx-_aFsTKaA", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2452.0533522725336, + "y": 398.6465600699665, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 227.89190673828125, + "height": 35, + "seed": 2097485480, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Amzon Linux x64", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Amzon Linux x64", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "rectangle", + "version": 3240, + "versionNonce": 540193240, + "isDeleted": false, + "id": "FCwQtUQCCcweqggt6BlzX", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 2742.122432740991, + "y": 284.8417336841534, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 304.9401622196817, + "height": 211.2826095052431, + "seed": 480137640, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1105, + "versionNonce": 2007938776, + "isDeleted": false, + "id": "I7kOw_cJcgxbo7dsdwdk9", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2807.788422309359, + "y": 305.9491449120295, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 175.6159210205078, + "height": 35, + "seed": 456514728, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "control plane", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "control plane", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "text", + "version": 1487, + "versionNonce": 1801591768, + "isDeleted": false, + "id": "VcJQjHTsHevdXxUZlFfSq", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2777.9334955552476, + "y": 398.0016719019285, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 243.12388610839844, + "height": 35, + "seed": 346294184, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Ubuntu Linux X64", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Ubuntu Linux X64", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "rectangle", + "version": 3298, + "versionNonce": 1029759192, + "isDeleted": false, + "id": "yDahuMQksHhZ2JuMdnhdb", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 3072.932272926041, + "y": 283.2183945025405, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 304.9401622196817, + "height": 211.2826095052431, + "seed": 784056744, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1163, + "versionNonce": 1295975896, + "isDeleted": false, + "id": "HbInIRtFZuyxk5DQqLqVp", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3138.598262494409, + "y": 304.32580573041673, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 175.6159210205078, + "height": 35, + "seed": 1747274920, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "control plane", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "control plane", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "text", + "version": 1559, + "versionNonce": 1745914584, + "isDeleted": false, + "id": "WnwKzOVBgEMqo71YEjarc", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3145.752737441013, + "y": 396.3783327203156, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 169.37193298339844, + "height": 35, + "seed": 1915058088, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Windows x64", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Windows x64", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "rectangle", + "version": 3310, + "versionNonce": 409563096, + "isDeleted": false, + "id": "wzq-CAGNoeOgm9-NprFmX", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 2076.8958261344915, + "y": 526.1055161086757, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 304.9401622196817, + "height": 174.6885415975437, + "seed": 350393768, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3457, + "versionNonce": 1985852632, + "isDeleted": false, + "id": "LZKkU61_7nFmVg-WdGrmw", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 20, + "angle": 0, + "x": 3077.8423180123546, + "y": 523.8217224928991, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 304.9401622196817, + "height": 176.54315101872874, + "seed": 1496343768, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1500, + "versionNonce": 2004965848, + "isDeleted": false, + "id": "5vA8V-jT5GNjQTiojE7PS", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2614.979607968624, + "y": 573.1919058326173, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 223.8039093017578, + "height": 70, + "seed": 1870925528, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Sync\nLinux x64 Agent", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Sync\nLinux x64 Agent", + "lineHeight": 1.25, + "baseline": 60 + }, + { + "type": "text", + "version": 1671, + "versionNonce": 1055416024, + "isDeleted": false, + "id": "e7vyxd7KqBh-_UICVg1cB", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2105.3860071454455, + "y": 572.7169534688196, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 256.5079040527344, + "height": 70, + "seed": 569424856, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Sync\nLinux arm64 Agent", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Sync\nLinux arm64 Agent", + "lineHeight": 1.25, + "baseline": 60 + }, + { + "type": "text", + "version": 1576, + "versionNonce": 1831257048, + "isDeleted": false, + "id": "iMl7DnNSzlaUw_Vmx1DRX", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3099.237248281248, + "y": 573.819934611395, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 259.97991943359375, + "height": 70, + "seed": 1336141736, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Sync\nWindows x64 Agent", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Sync\nWindows x64 Agent", + "lineHeight": 1.25, + "baseline": 60 + }, + { + "type": "line", + "version": 139, + "versionNonce": 1884326104, + "isDeleted": false, + "id": "7nmbhmY3vnNtz3VecNKvF", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 60, + "angle": 0, + "x": 2228.3993217422717, + "y": 232.46040573965126, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "width": 0, + "height": 0, + "seed": 1562794968, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 2219, + "versionNonce": 1408871896, + "isDeleted": false, + "id": "rX5UzvzVzgeqhJPXswCVk", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2538.7276383024155, + "y": 138.6426543544813, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 65.08084106445301, + "height": 65.08084106445301, + "seed": 674731992, + "groupIds": [ + "2uwztYv-hSP3dwaBB3H5E", + "kURWS4BiYGaV3Kra8psT4", + "cGeTlXPQJstXLdqdpxSeX", + "3IuRHfmfm-RxgJ_qV6EyF", + "hnJu7iuz97UlIFYQs4CYb", + "Q4OZF3xLH7nDpPXsuCVB3", + "hPvS_vuxcCV2U7PYfqoRq" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1922, + "versionNonce": 288764632, + "isDeleted": false, + "id": "TyYOCYIhml4UXM_883iA-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2546.9112897704445, + "y": 167.74932885788672, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.117920455804926, + "height": 8.117920455804926, + "seed": 975625432, + "groupIds": [ + "INJgsu7FlK3du6IX8SiAF", + "Q4OZF3xLH7nDpPXsuCVB3", + "hPvS_vuxcCV2U7PYfqoRq" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1975, + "versionNonce": 1587156952, + "isDeleted": false, + "id": "_tUxCrCnG_Zkj_AbAGKh4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2587.969056820063, + "y": 167.6758937644209, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.117920455804926, + "height": 8.117920455804926, + "seed": 937787864, + "groupIds": [ + "INJgsu7FlK3du6IX8SiAF", + "Q4OZF3xLH7nDpPXsuCVB3", + "hPvS_vuxcCV2U7PYfqoRq" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2592, + "versionNonce": 3759320, + "isDeleted": false, + "id": "uFk2sAoSBitBlSWr9KO24", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2563.892511116487, + "y": 164.0689336033925, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 814188248, + "groupIds": [ + "INJgsu7FlK3du6IX8SiAF", + "Q4OZF3xLH7nDpPXsuCVB3", + "hPvS_vuxcCV2U7PYfqoRq" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2665, + "versionNonce": 396886488, + "isDeleted": false, + "id": "UOQVqQHi7vjAVvbyEA7gR", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 2570.4540068352244, + "y": 158.14177457030434, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 815852504, + "groupIds": [ + "INJgsu7FlK3du6IX8SiAF", + "Q4OZF3xLH7nDpPXsuCVB3", + "hPvS_vuxcCV2U7PYfqoRq" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2696, + "versionNonce": 1945765592, + "isDeleted": false, + "id": "mPqXxQQa2q3f-pnSnOjpy", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 2576.3884107334734, + "y": 164.6606196693279, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 306557144, + "groupIds": [ + "INJgsu7FlK3du6IX8SiAF", + "Q4OZF3xLH7nDpPXsuCVB3", + "hPvS_vuxcCV2U7PYfqoRq" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2782, + "versionNonce": 1640197080, + "isDeleted": false, + "id": "n52st9D_MvIumSIdxAabN", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 4.71238898038469, + "x": 2569.8360093075044, + "y": 170.608633588538, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 1292490200, + "groupIds": [ + "INJgsu7FlK3du6IX8SiAF", + "Q4OZF3xLH7nDpPXsuCVB3", + "hPvS_vuxcCV2U7PYfqoRq" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2194, + "versionNonce": 2065182936, + "isDeleted": false, + "id": "QHfnPQknfuvW4h_xOMoQK", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2557.055965449409, + "y": 171.8230536476545, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.842473884372846, + "height": 5.167099126652263, + "seed": 1174493912, + "groupIds": [ + "INJgsu7FlK3du6IX8SiAF", + "Q4OZF3xLH7nDpPXsuCVB3", + "hPvS_vuxcCV2U7PYfqoRq" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.816503304871627, + -0.053670945826642225 + ], + [ + 3.254730628247874, + -2.532485186304994 + ], + [ + 5.842473884372846, + -0.04842214250790278 + ], + [ + 3.0350803951419567, + 2.6346139403472693 + ] + ] + }, + { + "type": "line", + "version": 2210, + "versionNonce": 2005685720, + "isDeleted": false, + "id": "P772mV-coJgPvaA5QiKVU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2579.649814076348, + "y": 171.9459241092914, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.842473884372846, + "height": 5.167099126652263, + "seed": 532692952, + "groupIds": [ + "INJgsu7FlK3du6IX8SiAF", + "Q4OZF3xLH7nDpPXsuCVB3", + "hPvS_vuxcCV2U7PYfqoRq" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.816503304871627, + -0.053670945826642225 + ], + [ + 3.254730628247874, + -2.532485186304994 + ], + [ + 5.842473884372846, + -0.04842214250790278 + ], + [ + 3.0350803951419567, + 2.6346139403472693 + ] + ] + }, + { + "type": "line", + "version": 2185, + "versionNonce": 2083773144, + "isDeleted": false, + "id": "bxpGS4ucA71rQjov8aIzh", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2550.9346837536395, + "y": 167.79314824040608, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 41.34963281275164, + "height": 17.109057844836915, + "seed": 173704408, + "groupIds": [ + "INJgsu7FlK3du6IX8SiAF", + "Q4OZF3xLH7nDpPXsuCVB3", + "hPvS_vuxcCV2U7PYfqoRq" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.559970698127005, + -7.66093059073715 + ], + [ + 8.271070731353255, + -13.100012337621466 + ], + [ + 15.09486779216366, + -16.193976031908193 + ], + [ + 21.94229008411606, + -16.944786876248074 + ], + [ + 29.75087123626803, + -15.033447184450166 + ], + [ + 35.47649450941106, + -11.065217973307726 + ], + [ + 39.57403120169017, + -5.297544356691949 + ], + [ + 41.34963281275164, + 0.16427096858884305 + ] + ] + }, + { + "type": "line", + "version": 2289, + "versionNonce": 1805828056, + "isDeleted": false, + "id": "eogYKze5EHii9H0CESWpp", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 2550.6810263806283, + "y": 192.48073191255713, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 41.34963281275164, + "height": 17.109057844836915, + "seed": 325331416, + "groupIds": [ + "INJgsu7FlK3du6IX8SiAF", + "Q4OZF3xLH7nDpPXsuCVB3", + "hPvS_vuxcCV2U7PYfqoRq" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.559970698127005, + -7.66093059073715 + ], + [ + 8.271070731353255, + -13.100012337621466 + ], + [ + 15.09486779216366, + -16.193976031908193 + ], + [ + 21.94229008411606, + -16.944786876248074 + ], + [ + 29.75087123626803, + -15.033447184450166 + ], + [ + 35.47649450941106, + -11.065217973307726 + ], + [ + 39.57403120169017, + -5.297544356691949 + ], + [ + 41.34963281275164, + 0.16427096858884305 + ] + ] + }, + { + "type": "text", + "version": 2575, + "versionNonce": 904725720, + "isDeleted": false, + "id": "Mom_qv3SwJHxrX1owXyVA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2417.5977383530803, + "y": 211.26651044633536, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "width": 305.479736328125, + "height": 24, + "seed": 1978740440, + "groupIds": [ + "hPvS_vuxcCV2U7PYfqoRq" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "self-hosted, x64, linux, amazon", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "self-hosted, x64, linux, amazon", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 2334, + "versionNonce": 682011096, + "isDeleted": false, + "id": "nyIlyzqyWtTP0v2Nd_KWw", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2871.754026544461, + "y": 136.70738014261195, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 65.08084106445301, + "height": 65.08084106445301, + "seed": 347617496, + "groupIds": [ + "QwbZ0FXngaiCg7UbdVaHL", + "GP7CROYp4gYEpLlncQ4-0", + "fu-5vBGVZTu3mKDrHEPP7", + "Zr_weMG_LaCZ1Ro_Ajp_g", + "7Abb4Ki8akxfkVkZwLwKd", + "eas54ckXzB4yRHEEXAu0N", + "uiH9OcenUBTI5XW4cBY1b" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 2037, + "versionNonce": 1055108824, + "isDeleted": false, + "id": "ThNlicrTnuud9tXNMqs7z", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2879.93767801249, + "y": 165.81405464601738, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.117920455804926, + "height": 8.117920455804926, + "seed": 1877695960, + "groupIds": [ + "rLw1c3jXUeLKMpTnImXl5", + "eas54ckXzB4yRHEEXAu0N", + "uiH9OcenUBTI5XW4cBY1b" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 2090, + "versionNonce": 1899500504, + "isDeleted": false, + "id": "3WBL3HN7Kp3IkesmFT7KY", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2920.9954450621085, + "y": 165.74061955255155, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.117920455804926, + "height": 8.117920455804926, + "seed": 594666200, + "groupIds": [ + "rLw1c3jXUeLKMpTnImXl5", + "eas54ckXzB4yRHEEXAu0N", + "uiH9OcenUBTI5XW4cBY1b" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2707, + "versionNonce": 95934680, + "isDeleted": false, + "id": "jSi0l1PAexRBIdYxiTWtB", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2896.9188993585326, + "y": 162.13365939152317, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 232769496, + "groupIds": [ + "rLw1c3jXUeLKMpTnImXl5", + "eas54ckXzB4yRHEEXAu0N", + "uiH9OcenUBTI5XW4cBY1b" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2780, + "versionNonce": 1610022360, + "isDeleted": false, + "id": "xEEGxyBs2FdQ_9idVq77D", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 2903.48039507727, + "y": 156.206500358435, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 457772248, + "groupIds": [ + "rLw1c3jXUeLKMpTnImXl5", + "eas54ckXzB4yRHEEXAu0N", + "uiH9OcenUBTI5XW4cBY1b" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2811, + "versionNonce": 1359577816, + "isDeleted": false, + "id": "7cjH7ka9BpIfdUc_QYW0v", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 2909.414798975519, + "y": 162.72534545745856, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 356626904, + "groupIds": [ + "rLw1c3jXUeLKMpTnImXl5", + "eas54ckXzB4yRHEEXAu0N", + "uiH9OcenUBTI5XW4cBY1b" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2897, + "versionNonce": 1736665048, + "isDeleted": false, + "id": "28IJN6yiCcLpYHJuqu9O-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 4.71238898038469, + "x": 2902.862397549549, + "y": 168.67335937666866, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 1927132888, + "groupIds": [ + "rLw1c3jXUeLKMpTnImXl5", + "eas54ckXzB4yRHEEXAu0N", + "uiH9OcenUBTI5XW4cBY1b" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2309, + "versionNonce": 1064873176, + "isDeleted": false, + "id": "kHCd_g4PbU7Qm1lOq2nVS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2890.0823536914545, + "y": 169.88777943578515, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.842473884372846, + "height": 5.167099126652263, + "seed": 682695640, + "groupIds": [ + "rLw1c3jXUeLKMpTnImXl5", + "eas54ckXzB4yRHEEXAu0N", + "uiH9OcenUBTI5XW4cBY1b" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.816503304871627, + -0.053670945826642225 + ], + [ + 3.254730628247874, + -2.532485186304994 + ], + [ + 5.842473884372846, + -0.04842214250790278 + ], + [ + 3.0350803951419567, + 2.6346139403472693 + ] + ] + }, + { + "type": "line", + "version": 2325, + "versionNonce": 1383944664, + "isDeleted": false, + "id": "gMvgD5C07HqdT15pvCgBU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2912.6762023183933, + "y": 170.01064989742207, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.842473884372846, + "height": 5.167099126652263, + "seed": 2026889432, + "groupIds": [ + "rLw1c3jXUeLKMpTnImXl5", + "eas54ckXzB4yRHEEXAu0N", + "uiH9OcenUBTI5XW4cBY1b" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.816503304871627, + -0.053670945826642225 + ], + [ + 3.254730628247874, + -2.532485186304994 + ], + [ + 5.842473884372846, + -0.04842214250790278 + ], + [ + 3.0350803951419567, + 2.6346139403472693 + ] + ] + }, + { + "type": "line", + "version": 2300, + "versionNonce": 1202018008, + "isDeleted": false, + "id": "nUv3gRCXJUG1jnmZdP8CG", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 2883.961071995684, + "y": 165.85787402853674, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 41.34963281275164, + "height": 17.109057844836915, + "seed": 1120798168, + "groupIds": [ + "rLw1c3jXUeLKMpTnImXl5", + "eas54ckXzB4yRHEEXAu0N", + "uiH9OcenUBTI5XW4cBY1b" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.559970698127005, + -7.66093059073715 + ], + [ + 8.271070731353255, + -13.100012337621466 + ], + [ + 15.09486779216366, + -16.193976031908193 + ], + [ + 21.94229008411606, + -16.944786876248074 + ], + [ + 29.75087123626803, + -15.033447184450166 + ], + [ + 35.47649450941106, + -11.065217973307726 + ], + [ + 39.57403120169017, + -5.297544356691949 + ], + [ + 41.34963281275164, + 0.16427096858884305 + ] + ] + }, + { + "type": "line", + "version": 2404, + "versionNonce": 1132772312, + "isDeleted": false, + "id": "dtKIR9-_qPfC-enSOidF0", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 2883.7074146226737, + "y": 190.5454577006878, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 41.34963281275164, + "height": 17.109057844836915, + "seed": 1405061848, + "groupIds": [ + "rLw1c3jXUeLKMpTnImXl5", + "eas54ckXzB4yRHEEXAu0N", + "uiH9OcenUBTI5XW4cBY1b" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.559970698127005, + -7.66093059073715 + ], + [ + 8.271070731353255, + -13.100012337621466 + ], + [ + 15.09486779216366, + -16.193976031908193 + ], + [ + 21.94229008411606, + -16.944786876248074 + ], + [ + 29.75087123626803, + -15.033447184450166 + ], + [ + 35.47649450941106, + -11.065217973307726 + ], + [ + 39.57403120169017, + -5.297544356691949 + ], + [ + 41.34963281275164, + 0.16427096858884305 + ] + ] + }, + { + "type": "text", + "version": 2697, + "versionNonce": 942637272, + "isDeleted": false, + "id": "hK5x69MOt3fN1OZ9AuIsA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2750.754230167319, + "y": 209.33123623446602, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "width": 299.15972900390625, + "height": 24, + "seed": 909668312, + "groupIds": [ + "uiH9OcenUBTI5XW4cBY1b" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "self-hosted, x64, linux, ubuntu", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "self-hosted, x64, linux, ubuntu", + "lineHeight": 1.2, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 2384, + "versionNonce": 892970456, + "isDeleted": false, + "id": "SJ6YGl8WU9LXCi96az3e3", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 3197.151734172458, + "y": 133.43744369480973, + "strokeColor": "#000000", + "backgroundColor": "#e6498088", + "width": 65.08084106445301, + "height": 65.08084106445301, + "seed": 20336296, + "groupIds": [ + "CPHL9_zU9yzik4bFUHxeH", + "Ao_9nuroMzEfXWBeITQhk", + "lJZqBlnRXf-_RJIIlR8Mx", + "fyuOJtKE4Whsiz2yO_gHN", + "bl5vqY5jDq34xEAwDwnx6", + "t7GyXVuBRnvOy0CjEIogJ", + "sOfXfPibm0MKTyCgcsh0y" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 2087, + "versionNonce": 934750936, + "isDeleted": false, + "id": "RQWSMluNjW3XsQ8A_879p", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 3205.335385640487, + "y": 162.54411819821516, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.117920455804926, + "height": 8.117920455804926, + "seed": 96876968, + "groupIds": [ + "nAd9UKBvXPEUgYW-uF3-H", + "t7GyXVuBRnvOy0CjEIogJ", + "sOfXfPibm0MKTyCgcsh0y" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 2140, + "versionNonce": 2050756568, + "isDeleted": false, + "id": "SqcAi-D1Lxy1afp1bfcV1", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 3246.3931526901056, + "y": 162.47068310474933, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 8.117920455804926, + "height": 8.117920455804926, + "seed": 1730200744, + "groupIds": [ + "nAd9UKBvXPEUgYW-uF3-H", + "t7GyXVuBRnvOy0CjEIogJ", + "sOfXfPibm0MKTyCgcsh0y" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2757, + "versionNonce": 1155290328, + "isDeleted": false, + "id": "5_DNOq5hrlj00ETEKDkNE", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 3222.3166069865297, + "y": 158.86372294372094, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 1928458152, + "groupIds": [ + "nAd9UKBvXPEUgYW-uF3-H", + "t7GyXVuBRnvOy0CjEIogJ", + "sOfXfPibm0MKTyCgcsh0y" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2830, + "versionNonce": 1026292184, + "isDeleted": false, + "id": "Y4oDOXBLBWS__HMGcvJr_", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 3228.878102705267, + "y": 152.93656391063277, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 1634056872, + "groupIds": [ + "nAd9UKBvXPEUgYW-uF3-H", + "t7GyXVuBRnvOy0CjEIogJ", + "sOfXfPibm0MKTyCgcsh0y" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2861, + "versionNonce": 910098136, + "isDeleted": false, + "id": "eA7Xb1do1QOEWFyyaxual", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 3234.812506603516, + "y": 159.45540900965634, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 86517160, + "groupIds": [ + "nAd9UKBvXPEUgYW-uF3-H", + "t7GyXVuBRnvOy0CjEIogJ", + "sOfXfPibm0MKTyCgcsh0y" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2947, + "versionNonce": 11101144, + "isDeleted": false, + "id": "SPxrTLcx03WQt3Uz4WGa2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 4.71238898038469, + "x": 3228.260105177546, + "y": 165.40342292886643, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.658716066016024, + "height": 14.901485256991352, + "seed": 2070229160, + "groupIds": [ + "nAd9UKBvXPEUgYW-uF3-H", + "t7GyXVuBRnvOy0CjEIogJ", + "sOfXfPibm0MKTyCgcsh0y" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.534250496037679, + 3.516089644932923 + ], + [ + 2.0434697529165025, + 7.61467595931855 + ], + [ + 1.302129499685611, + 11.595258942488735 + ], + [ + -0.615246313099522, + 14.901485256991352 + ] + ] + }, + { + "type": "line", + "version": 2359, + "versionNonce": 981412056, + "isDeleted": false, + "id": "o2DU2hTpAYaFfTo46CS1Y", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 3215.4800613194516, + "y": 166.61784298798293, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.842473884372846, + "height": 5.167099126652263, + "seed": 1539890088, + "groupIds": [ + "nAd9UKBvXPEUgYW-uF3-H", + "t7GyXVuBRnvOy0CjEIogJ", + "sOfXfPibm0MKTyCgcsh0y" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.816503304871627, + -0.053670945826642225 + ], + [ + 3.254730628247874, + -2.532485186304994 + ], + [ + 5.842473884372846, + -0.04842214250790278 + ], + [ + 3.0350803951419567, + 2.6346139403472693 + ] + ] + }, + { + "type": "line", + "version": 2375, + "versionNonce": 525618648, + "isDeleted": false, + "id": "NW4g0zWkmcrYOgKf3UbnH", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 3238.0739099463904, + "y": 166.74071344961985, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 5.842473884372846, + "height": 5.167099126652263, + "seed": 1753163432, + "groupIds": [ + "nAd9UKBvXPEUgYW-uF3-H", + "t7GyXVuBRnvOy0CjEIogJ", + "sOfXfPibm0MKTyCgcsh0y" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.816503304871627, + -0.053670945826642225 + ], + [ + 3.254730628247874, + -2.532485186304994 + ], + [ + 5.842473884372846, + -0.04842214250790278 + ], + [ + 3.0350803951419567, + 2.6346139403472693 + ] + ] + }, + { + "type": "line", + "version": 2350, + "versionNonce": 1480381144, + "isDeleted": false, + "id": "yNQC44-a97cdfbU_NUeIx", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 3209.358779623681, + "y": 162.58793758073452, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 41.34963281275164, + "height": 17.109057844836915, + "seed": 1043599784, + "groupIds": [ + "nAd9UKBvXPEUgYW-uF3-H", + "t7GyXVuBRnvOy0CjEIogJ", + "sOfXfPibm0MKTyCgcsh0y" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.559970698127005, + -7.66093059073715 + ], + [ + 8.271070731353255, + -13.100012337621466 + ], + [ + 15.09486779216366, + -16.193976031908193 + ], + [ + 21.94229008411606, + -16.944786876248074 + ], + [ + 29.75087123626803, + -15.033447184450166 + ], + [ + 35.47649450941106, + -11.065217973307726 + ], + [ + 39.57403120169017, + -5.297544356691949 + ], + [ + 41.34963281275164, + 0.16427096858884305 + ] + ] + }, + { + "type": "line", + "version": 2454, + "versionNonce": 1271707608, + "isDeleted": false, + "id": "h-TDoyC2tSbWZIhTBG86c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 3.141592653589793, + "x": 3209.105122250671, + "y": 187.27552125288557, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 41.34963281275164, + "height": 17.109057844836915, + "seed": 68394152, + "groupIds": [ + "nAd9UKBvXPEUgYW-uF3-H", + "t7GyXVuBRnvOy0CjEIogJ", + "sOfXfPibm0MKTyCgcsh0y" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 2.559970698127005, + -7.66093059073715 + ], + [ + 8.271070731353255, + -13.100012337621466 + ], + [ + 15.09486779216366, + -16.193976031908193 + ], + [ + 21.94229008411606, + -16.944786876248074 + ], + [ + 29.75087123626803, + -15.033447184450166 + ], + [ + 35.47649450941106, + -11.065217973307726 + ], + [ + 39.57403120169017, + -5.297544356691949 + ], + [ + 41.34963281275164, + 0.16427096858884305 + ] + ] + }, + { + "type": "text", + "version": 2824, + "versionNonce": 1847065816, + "isDeleted": false, + "id": "GfmRCkWhO-vCdwsoIYAGH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3102.9706208101834, + "y": 204.1357669181966, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "width": 248.9597625732422, + "height": 24, + "seed": 466208680, + "groupIds": [ + "sOfXfPibm0MKTyCgcsh0y" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1702808552010, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "self-hosted, x64, windows", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "self-hosted, x64, windows", + "lineHeight": 1.2, + "baseline": 17 + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/assets/multi-runner.dark.png b/docs/assets/multi-runner.dark.png new file mode 100644 index 0000000000..d11e0acfef Binary files /dev/null and b/docs/assets/multi-runner.dark.png differ diff --git a/docs/assets/multi-runner.light.png b/docs/assets/multi-runner.light.png new file mode 100644 index 0000000000..e85ce1d6f5 Binary files /dev/null and b/docs/assets/multi-runner.light.png differ diff --git a/docs/assets/runners.dark.png b/docs/assets/runners.dark.png new file mode 100644 index 0000000000..9379536233 Binary files /dev/null and b/docs/assets/runners.dark.png differ diff --git a/docs/assets/runners.light.png b/docs/assets/runners.light.png new file mode 100644 index 0000000000..2e3431105a Binary files /dev/null and b/docs/assets/runners.light.png differ diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000000..44ac5ef394 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,207 @@ +# Configuration + +## Configuration considerations + +To be able to support a number of use-cases, the module has quite a lot of configuration options. We tried to choose reasonable defaults. Several examples also show the main cases of how to configure the runners. + +- Org vs Repo level. You can configure the module to connect the runners in GitHub on an org level and share the runners in your org, or set the runners on repo level and the module will install the runner to the repo. There can be multiple repos but runners are not shared between repos. +- Multi-Runner module. This modules allows you to create multiple runner configurations with a single webhook and single GitHub App to simplify deployment of different types of runners. Check the detailed module [documentation](modules/public/multi-runner.md) for more information or checkout the [multi-runner example](examples/multi-runner.md). +- Workflow job event. You can configure the webhook in GitHub to send workflow job events to the webhook. Workflow job events were introduced by GitHub in September 2021 and are designed to support scalable runners. We advise using the workflow job event when possible. +- Linux vs Windows. You can configure the OS types linux and win. Linux will be used by default. +- Re-use vs Ephemeral. By default runners are re-used, until detected idle. Once idle they will be removed from the pool. To improve security we are introducing ephemeral runners. Those runners are only used for one job. Ephemeral runners only work in combination with the workflow job event. For ephemeral runners the lambda requests a JIT (just in time) configuration via the GitHub API to register the runner. [JIT configuration](https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-just-in-time-runners) is limited to ephemeral runners (and currently not supported by GHES). For non-ephemeral runners, a registration token is always requested. In both cases the configuration is made available to the instance via the same SSM parameter. To disable JIT configuration for ephemeral runners set `enable_jit_config` to `false`. We also suggest using a pre-build AMI to improve the start time of jobs for ephemeral runners. +- GitHub Cloud vs GitHub Enterprise Server (GHES). The runners support GitHub Cloud as well GitHub Enterprise Server. For GHES, we rely on our community for support and testing. We at Philips have no capability to test GHES ourselves. +- Spot vs on-demand. The runners use either the EC2 spot or on-demand life cycle. Runners will be created via the AWS [CreateFleet API](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet.html). The module (scale up lambda) will request via the CreateFleet API to create instances in one of the subnets and of the specified instance types. +- ARM64 support via Graviton/Graviton2 instance-types. When using the default example or top-level module, specifying `instance_types` that match a Graviton/Graviton 2 (ARM64) architecture (e.g. a1, t4g or any 6th-gen `g` or `gd` type), you must also specify `runner_architecture = "arm64"` and the sub-modules will be automatically configured to provision with ARM64 AMIs and leverage GitHub's ARM64 action runner. See below for more details. + +## AWS SSM Parameters + +The module uses the AWS System Manager Parameter Store to store configuration for the runners, as well as registration tokens and secrets for the Lambdas. Paths for the parameters can be configured via the variable `ssm_paths`. The location of the configuration parameters is retrieved by the runners via the instance tag `ghr:ssm_config_path`. The following default paths will be used. Tokens or JIT config stored in the token path will be deleted after retrieval by instance, data not deleted after a day will be deleted by a SSM housekeeper lambda. + +| Path | Description | +| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ssm_paths.root/var.prefix?/app/` | App secrets used by Lambda's | +| `ssm_paths.root/var.prefix?/runners/config/` | Configuration parameters used by runner start script | +| `ssm_paths.root/var.prefix?/runners/tokens/` | Either JIT configuration (ephemeral runners) or registration tokens (non ephemeral runners) generated by the control plane (scale-up lambda), and consumed by the start script on the runner to activate / register the runner. | + +Available configuration parameters: + +| Parameter name | Description | +| ------------------- | ----------------------------------------------------------- | +| `agent_mode` | Indicates if the agent is running in ephemeral mode or not. | +| `enable_cloudwatch` | Configuration for the cloudwatch agent to stream logging. | +| `run_as` | The user used for running the GitHub action runner agent. | +| `token_path` | The path where tokens are stored. | + +## Encryption + +The module supports two scenarios to manage environment secrets and private keys of the Lambda functions. + +### Managed KMS key (default) + +This is the default, no additional configuration is required. + +### Provided KMS key + +You have to create and configure you KMS key. The module will use the context with key: `Environment` and value `var.environment` as encryption context. + +```hcl +resource "aws_kms_key" "github" { + is_enabled = true +} + +module "runners" { + + ... + kms_key_arn = aws_kms_key.github.arn + ... +``` + +## Pool + +The module supports two options for keeping a pool of runners. One is via a pool which only supports org-level runners, the second option is [keeping runners idle](#idle-runners). + +The pool is introduced in combination with the ephemeral runners and is primarily meant to ensure if any event is unexpectedly dropped and no runner was created, the pool can pick up the job. The pool is maintained by a lambda. Each time the lambda is triggered a check is performed to ensure the number of idle runners managed by the module matches the expected pool size. If not, the pool will be adjusted. Keep in mind that the scale down function is still active and will terminate instances that are detected as idle. + +```hcl +pool_runner_owner = "my-org" # Org to which the runners are added +pool_config = [{ + size = 20 # size of the pool + schedule_expression = "cron(* * * * ? *)" # cron expression to trigger the adjustment of the pool +}] +``` + +The pool is NOT enabled by default and can be enabled by setting at least one object of the pool config list. The [ephemeral example](examples/ephemeral.md) contains configuration options (commented out). + +## Idle runners + +The module will scale down to zero runners by default. By specifying a `idle_config` config, idle runners can be kept active. The scale down lambda checks if any of the cron expressions matches the current time with a margin of 5 seconds. When there is a match, the number of runners specified in the idle config will be kept active. In case multiple cron expressions match, the first one will be used. Below is an idle configuration for keeping runners active from 9:00am to 5:59pm on working days. The [cron expression generator by Cronhub](https://crontab.cronhub.io/) is a great resource to set up your idle config. + +By default, the oldest instances are evicted. This helps keep your environment up-to-date and reduce problems like running out of disk space or RAM. Alternatively, if your older instances have a long-living cache, you can override the `evictionStrategy` to `newest_first` to evict the newest instances first instead. + +```hcl +idle_config = [{ + cron = "* * 9-17 * * 1-5" + timeZone = "Europe/Amsterdam" + idleCount = 2 + # Defaults to 'oldest_first' + evictionStrategy = "oldest_first" +}] +``` + +_**Note**_: When using Windows runners, we recommend keeping a few runners warmed up due to the minutes-long cold start time. + +#### Supported config + +Cron expressions are parsed by [cron-parser](https://github.com/harrisiirak/cron-parser#readme). The supported syntax. + +```bash +* * * * * * +┬ ┬ ┬ ┬ ┬ ┬ +│ │ │ │ │ | +│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun) +│ │ │ │ └───── month (1 - 12) +│ │ │ └────────── day of month (1 - 31) +│ │ └─────────────── hour (0 - 23) +│ └──────────────────── minute (0 - 59) +└───────────────────────── second (0 - 59, optional) +``` + +For time zones please check [TZ database name column](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) for the supported values. + +## Ephemeral runners + +You can configure runners to be ephemeral, in which case runners will be used only for one job. The feature should be used in conjunction with listening for the workflow job event. Please consider the following: + +- The scale down lambda is still active, and should only remove orphan instances. But there is no strict check in place. So ensure you configure the `minimum_running_time_in_minutes` to a value that is high enough to get your runner booted and connected to avoid it being terminated before executing a job. +- The messages sent from the webhook lambda to the scale-up lambda are by default delayed by SQS, to give available runners a chance to start the job before the decision is made to scale more runners. For ephemeral runners there is no need to wait. Set `delay_webhook_event` to `0`. +- All events in the queue will lead to a new runner created by the lambda. By setting `enable_job_queued_check` to `true` you can enforce a rule of only creating a runner if the event has a correlated queued job. Setting this can avoid creating useless runners. For example, a job getting cancelled before a runner was created or if the job was already picked up by another runner. We suggest using this in combination with a pool. +- To ensure runners are created in the same order GitHub sends the events, by default we use a FIFO queue. This is mainly relevant for repo level runners. For ephemeral runners you can set `enable_fifo_build_queue` to `false`. +- Errors related to scaling should be retried via SQS. You can configure `job_queue_retention_in_seconds` and `redrive_build_queue` to tune the behavior. We have no mechanism to avoid events never being processed, which means potentially no runner gets created and the job in GitHub times out in 6 hours. + +The example for [ephemeral runners](examples/ephemeral.md) is based on the [default example](examples/default.md). Have look at the diff to see the major configuration differences. + +## Prebuilt Images + +This module also allows you to run agents from a prebuilt AMI to gain faster startup times. The module provides several examples to build your own custom AMI. To remove old images, an [AMI housekeeper module](modules/public/ami-housekeeper.md) can be used. See the [AMI examples](ami-examples/index.md) for more details. + +## Logging + +The module uses [AWS Lambda Powertools](https://awslabs.github.io/aws-lambda-powertools-typescript/latest/) for logging. By default the log level is set to `info`, by setting the log level to `debug` the incoming events of the Lambda are logged as well. + +Log messages contains at least the following keys: + +- `messages`: The logged messages +- `environment`: The environment prefix provided via Terraform +- `service`: The lambda +- `module`: The TypeScript module writing the log message +- `function-name`: The name of the lambda function (prefix + function name) +- `github`: Depending on the lambda, contains GitHub context +- `runner`: Depending on the lambda, specific context related to the runner + +An example log message of the scale-up function: + +```json +{ + "level": "INFO", + "message": "Received event", + "service": "runners-scale-up", + "timestamp": "2023-03-20T08:15:27.448Z", + "xray_trace_id": "1-6418161e-08825c2f575213ef760531bf", + "module": "scale-up", + "region": "eu-west-1", + "environment": "my-linux-x64", + "aws-request-id": "eef1efb7-4c07-555f-9a67-b3255448ee60", + "function-name": "my-linux-x64-scale-up", + "runner": { + "type": "Repo", + "owner": "test-runners/multi-runner" + }, + "github": { + "event": "workflow_job", + "workflow_job_id": "1234" + } +} +``` + +## Tracing + +The distributed architecture of this application can make it difficult to troubleshoot. We support the option to enable tracing for all the lambda functions created by this application. To enable tracing, you can provide the `tracing_config` option inside the root module or inner modules. + +This tracing config generates timelines for following events: + +- Basic lifecycle of lambda function +- Traces for Github API calls (can be configured by capture_http_requests). +- Traces for all AWS SDK calls + +This feature has been disabled by default. + +## Debugging + +In case the setup does not work as intended, trace the events through this sequence: + +- In the GitHub App configuration, the Advanced page displays all webhook events that were sent. +- In AWS CloudWatch, every lambda has a log group. Look at the logs of the `webhook` and `scale-up` lambdas. +- In AWS SQS you can see messages available or in flight. +- Once an EC2 instance is running, you can connect to it in the EC2 user interface using Session Manager (use `enable_ssm_on_runners = true`). Check the user data script using `cat /var/log/user-data.log`. By default several log files of the instances are streamed to AWS CloudWatch, look for a log group named `/runners`. In the log group you should see at least the log streams for the user data installation and runner agent. +- Registered instances should show up in the Settings - Actions page of the repository or organization (depending on the installation mode). + +## Experimental features + +### Queue to publish workflow job events + +This queue is an experimental feature to allow you to receive a copy of the wokflow_jobs events sent by the GitHub App. This can be used to calculate a matrix or monitor the system. + +To enable the feature set `enable_workflow_job_events_queue = true`. Be aware though, this feature is experimental! + +Messages received on the queue are using the same format as published by GitHub wrapped in a property `workflowJobEvent`. + +``` +export interface GithubWorkflowEvent { + workflowJobEvent: WorkflowJobEvent; +} +``` + +This extensible format allows more fields to be added if needed. +You can configure the queue by setting properties to `workflow_job_events_queue_config` + +NOTE: By default, a runner AMI update requires a re-apply of this terraform config (the runner AMI ID is looked up by a terraform data source). To avoid this, you can use `ami_id_ssm_parameter_name` to have the scale-up lambda dynamically lookup the runner AMI ID from an SSM parameter at instance launch time. Said SSM parameter is managed outside of this module (e.g. by a runner AMI build workflow). diff --git a/docs/examples/arm64.md b/docs/examples/arm64.md new file mode 100644 index 0000000000..7b281e4a07 --- /dev/null +++ b/docs/examples/arm64.md @@ -0,0 +1 @@ +--8<-- "examples/arm64/README.md" diff --git a/docs/examples/default.md b/docs/examples/default.md new file mode 100644 index 0000000000..7d549b1176 --- /dev/null +++ b/docs/examples/default.md @@ -0,0 +1 @@ +--8<-- "examples/default/README.md" diff --git a/docs/examples/ephemeral.md b/docs/examples/ephemeral.md new file mode 100644 index 0000000000..2037f0769e --- /dev/null +++ b/docs/examples/ephemeral.md @@ -0,0 +1 @@ +--8<-- "examples/ephemeral/README.md" diff --git a/docs/examples/index.md b/docs/examples/index.md new file mode 100644 index 0000000000..6cf3bb15a5 --- /dev/null +++ b/docs/examples/index.md @@ -0,0 +1,11 @@ +# Examples + +Examples are located in the [examples](https://github.com/philips-labs/terraform-aws-github-runner/tree/main/examples) directory. The following examples are provided: + +- _[Default](default.md)_: The default example of the module +- _[ARM64](arm64.md)_: Example usage with ARM64 architecture +- _[Ephemeral](ephemeral.md)_: Example usages of ephemeral runners based on the default example. +- _[Multi Runner](multi-runner.md)_ : Example usage of creating a multi runner which creates multiple runners/ configurations with a single deployment +- _[Permissions boundary](permissions-boundary.md)_: Example usages of permissions boundaries. +- _[Prebuilt Images](prebuilt.md)_: Example usages of deploying runners with a custom prebuilt image. +- _[Windows](windows.md)_: Example usage of creating a runner using Windows as the OS. diff --git a/docs/examples/lambda-download.md b/docs/examples/lambda-download.md new file mode 100644 index 0000000000..b8d6bea9d9 --- /dev/null +++ b/docs/examples/lambda-download.md @@ -0,0 +1 @@ +--8<-- "examples/lambdas-download/README.md" diff --git a/docs/examples/multi-runner.md b/docs/examples/multi-runner.md new file mode 100644 index 0000000000..c77d453a20 --- /dev/null +++ b/docs/examples/multi-runner.md @@ -0,0 +1 @@ +--8<-- "examples/multi-runner/README.md" diff --git a/docs/examples/permissions-boundary.md b/docs/examples/permissions-boundary.md new file mode 100644 index 0000000000..094ad59475 --- /dev/null +++ b/docs/examples/permissions-boundary.md @@ -0,0 +1 @@ +--8<-- "examples/permissions-boundary/README.md" diff --git a/docs/examples/prebuilt.md b/docs/examples/prebuilt.md new file mode 100644 index 0000000000..aee7d64bb7 --- /dev/null +++ b/docs/examples/prebuilt.md @@ -0,0 +1 @@ +--8<-- "examples/prebuilt/README.md" diff --git a/docs/examples/windows.md b/docs/examples/windows.md new file mode 100644 index 0000000000..967dd7ed69 --- /dev/null +++ b/docs/examples/windows.md @@ -0,0 +1 @@ +--8<-- "examples/windows/README.md" diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 0000000000..f13c84764f --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,149 @@ +# Getting started + +Terraform examples are available for different use-cases for example multiple runners, ephemeral runners, and windows. For more details see the [examples](examples/index.md). + +The module supports two main scenarios for creating runners. Repository level runners will be dedicated to only one repository, no other repository can use the runner. At the organization level you can use the runner(s) for all repositories within the organization. See [GitHub self-hosted runner instructions](https://help.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners) for more information. Before starting the deployment you have to choose one option. + +The setup guide below is a generic direction. There are many choices you can make, and there is no right way. For example we deploy ephemeral runners for both Linux and WIndows with packer pre-built AMI's that are automatically updated. Deployment is done with GitHub actions, Terragrunt and terraform. The lambda's we sync to AWS S3. For the major fleet we have a tiny pool to let start jobs quickly. + +## Required tools + +The following tools are a minimum requirement. We advise to deploy the stack via a CI/CD pipeline. + +- Terraform +- Bash shell or compatible +- Docker (optional, to build lambdas without node). +- AWS cli (optional) +- Node and yarn to build the Lambda's (or download via Release). + +## Setup guide + +The setup consists of running Terraform to create all AWS resources and manually configuring the GitHub App. The Terraform module requires configuration from the GitHub App and the GitHub app requires output from Terraform. Therefore you first create the GitHub App and configure the basics, then run Terraform, and afterwards finalize the configuration of the GitHub App. + +### Setup GitHub App (part 1) + +Go to GitHub and [create a new app](https://docs.github.com/en/developers/apps/creating-a-github-app). Be aware you can create apps for your organization or for a user. For now we only support organization level apps. + +1. Create an app in Github +2. Choose a name +3. Choose a website (mandatory, not required for the module). +4. Disable the webhook for now (we will configure this later or create an alternative webhook). +5. Permissions for all runners: + - Repository: + - `Actions`: Read-only (check for queued jobs) + - `Checks`: Read-only (receive events for new builds) + - `Metadata`: Read-only (default/required) +6. _Permissions for repo level runners only_: + - Repository: + - `Administration`: Read & write (to register runner) +7. _Permissions for organization level runners only_: + - Organization + - `Self-hosted runners`: Read & write (to register runner) +8. Save the new app. +9. On the General page, make a note of the "App ID" and "Client ID" parameters. +10. Generate a new private key and save the `app.private-key.pem` file. + +### Setup terraform module + +#### Download lambdas + +To apply the terraform module, the compiled lambdas (.zip files) need to be available either locally or in an S3 bucket. They can either be downloaded from the GitHub release page or built locally. + +To read the files from S3, set the `lambda_s3_bucket` variable and the specific object key for each lambda. + +The lambdas can be downloaded manually from the [release page](https://github.com/philips-labs/terraform-aws-github-runner/releases) or using the [download-lambda](modules/public/download-lambda.md) terraform module (requires `curl` to be installed on your machine). In the `download-lambda` directory, run `terraform init && terraform apply`. The lambdas will be saved to the same directory. + +For local development you can build all the lambdas at once using `.ci/build.sh` or individually using `yarn dist`. + +#### Service-linked role + +To create spot instances the `AWSServiceRoleForEC2Spot` role needs to be added to your account. You can do that manually by following the [AWS docs](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-requests.html#service-linked-roles-spot-instance-requests). To use terraform for creating the role, either add the following resource or let the module manage the service linked role by setting `create_service_linked_role_spot` to `true`. Be aware this is an account global role, so maybe you don't want to manage it via a specific deployment. + +```hcl +resource "aws_iam_service_linked_role" "spot" { + aws_service_name = "spot.amazonaws.com" +} +``` + +#### Terraform module + +Next create a second terraform workspace and initiate the module, or adapt one of the [examples](examples/index.md). + +Note that `github_app.key_base64` needs to be a base64-encoded string of the `.pem` file i.e. the output of `base64 app.private-key.pem`. The decoded string can either be a multiline value or a single line value with new lines represented with literal `\n` characters. + +```hcl +module "github-runner" { + source = "philips-labs/github-runner/aws" + version = "REPLACE_WITH_VERSION" + + aws_region = "eu-west-1" + vpc_id = "vpc-123" + subnet_ids = ["subnet-123", "subnet-456"] + + prefix = "gh-ci" + + github_app = { + key_base64 = "base64string" + id = "1" + webhook_secret = "webhook_secret" + } + + webhook_lambda_zip = "lambdas-download/webhook.zip" + runner_binaries_syncer_lambda_zip = "lambdas-download/runner-binaries-syncer.zip" + runners_lambda_zip = "lambdas-download/runners.zip" + enable_organization_runners = true +} +``` + +Run terraform by using the following commands + +```bash +terraform init +terraform apply +``` + +The terraform output displays the API gateway url (endpoint) and secret, which you need in the next step. + +The lambda for syncing the GitHub distribution to S3 is triggered via CloudWatch (by default once per hour). After deployment the function is triggered via S3 to ensure the distribution is cached. + +### Setup the webhook / GitHub App (part 2) + +At this point you have two options. Either create a separate webhook (enterprise, +org, or repo), or create a webhook in the App. + +#### Option 1: Webhook + +1. Create a new webhook at the repo level for repo level runners, or org (or enterprise level) for org level runners. +2. Provide the webhook url, which should be part of the output of terraform. +3. Provide the webhook secret (`terraform output -raw `). +4. Ensure the content type is `application/json`. +5. In the "Permissions & Events" section and then "Subscribe to Events" subsection, check either "Workflow Job" or "Check Run" (choose only one option!!!). +6. In the "Install App" section, install the App in your organization, either in all or in selected repositories. + +#### Option 2: App + +Go back to the GitHub App and update the following settings. + +1. Enable the webhook. +2. Provide the webhook url, should be part of the output of terraform. +3. Provide the webhook secret (`terraform output -raw `). +4. In the "Permissions & Events" section and then "Subscribe to Events" subsection, check either "Workflow Job" or "Check Run" (choose only one option!!!). + +#### Install GitHub app + +Finally you need to ensure the app is installed to all or selected repositories. + +Go back to the GitHub App and update the following settings. + +1. In the "Install App" section, install the App in your organization, either in all or in selected repositories. + + +## Debugging + +In case the setup does not work as intended follow the trace of events: + +- In the GitHub App configuration, the Advanced page displays all webhook events that were sent. +- In AWS CloudWatch, every lambda has a log group. Look at the logs of the `webhook` and `scale-up` lambdas. +- In AWS SQS you can see messages available or in flight. +- Once an EC2 instance is running, you can connect to it in the EC2 user interface using Session Manager (use `enable_ssm_on_runners = true`). Check the user data script using `cat /var/log/user-data.log`. By default several log files of the instances are streamed to AWS CloudWatch, look for a log group named `/runners`. In the log group you should see at least the log streams for the user data installation and runner agent. +- Registered instances should show up in the Settings - Actions page of the repository or organization (depending on the installation mode). diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000000..dda973f691 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,95 @@ +# GitHub Self-Hosted on AWS on Spot Instances + +This [Terraform](https://www.terraform.io/) module creates the required infrastructure needed to host [GitHub Actions](https://github.com/features/actions) self-hosted, auto-scaling runners on [AWS spot instances](https://aws.amazon.com/ec2/spot/). It provides the required logic to handle the life cycle for scaling up and down using a set of AWS Lambda functions. Runners are scaled down to zero to avoid costs when no workflows are active. + +![Architecture](assets/runners.light.png#only-light) +![Architecture](assets/runners.dark.png#only-dark) + +## Motivation + +GitHub Actions `self-hosted` runners provide a flexible option to run CI workloads on the infrastructure of your choice. However, currently GitHub does not provide tooling to automate the creation and scaling of action runners. This module creates the AWS infrastructure to host action runners on spot instances. It also provides lambda modules to orchestrate the life cycle of the action runners. + +Lambda was selected as the preferred runtime for two primary reasons. Firstly, it enables the development of compact components with limited access to AWS and GitHub. Secondly, it offers a scalable configuration with minimal expenses, applicable at both the repository and organizational levels. The Lambda functions will be responsible for provisioning Linux-based EC2 instances equipped with Docker to handle CI workloads compatible with Linux and/or Docker. The primary objective is to facilitate Docker-based workloads. + +A pertinent question may arise: why not opt for Kubernetes? The current strategy aligns closely with the implementation of GitHub's action runners. The chosen approach involves installing the runner on a host where the necessary software is readily available, maintaining proximity to GitHub's existing practices. Another viable option could be AWS Auto Scaling groups. However, this alternative usually demands broader permissions at the instance level from GitHub. Additionally, managing the scaling process, both up and down, becomes a non-trivial task in this scenario. + +## Overview + +The module is designed to be used in a GitHub organization. It can also be used in a GitHub repository, but this not supports all features. The module is receiving GitHub webhook events for the `workflow_job` event. The module will create a new runner if the event is for a workflow that requires a runner, and no runner is available. Alteratively the module can be configured as ephemeral runners. In this case the module will create a new runner for each workflow job event. + +For ephemeral runners a pool is can be configured. The pool maintains a minimum number of runners based on a schedule. The pool works only for org level runners. + +For non ephemeral runners with the idle config the module will avoid scaling down back to zero. Instead it will maintain a minimum number of runners based on a schedule. This avoids the need to scale up when a new workflow is triggered. + + +## Detailed design + +The diagram below shows the architecture of the module, groups are indicating the different components. Ww will go through the components in the following sections. + +![Architecture](assets/aws-architecture.light.png#only-light) +![Architecture](assets/aws-architecture.dark.png#only-dark) + +### Webhook + +The moment a GitHub action workflow requiring a `self-hosted` runner is triggered, GitHub will try to find a runner which can execute the workload. See [additional notes](additional_notes.md) for how the selection is made. This module reacts to GitHub's [`workflow_job` event](https://docs.github.com/en/free-pro-team@latest/developers/webhooks-and-events/webhook-events-and-payloads#workflow_job) for the triggered workflow and creates a new runner if necessary. + +For receiving the `workflow_job` event by the webhook (lambda), a webhook needs to be created in GitHub. The same app as for API calls can be used to create the webhook. Or a dedicated webhook can be defined. + +- Create a GitHub app, define a webhook and subscribe the app to the `workflow_job` event. +- Create a webhook on enterprise, org or repo level, define a webhook and subscribe the app to the `workflow_job` event. + +In AWS an [API gateway](https://docs.aws.amazon.com/apigateway/index.html) endpoint is created that is able to receive the GitHub webhook events via HTTP post. The gateway triggers the webhook lambda which will verify the signature of the event. This check guarantees the event is sent by the GitHub App. The lambda only handles `workflow_job` events with status `queued` and matching the runner labels. The accepted events are posted on a SQS queue. Messages on this queue will be delayed for a configurable amount of seconds (default 30 seconds) to give the available runners time to pick up this build. + +### Control plane + +The "Scale Up Runner" Lambda actively monitors the SQS queue, processing incoming events. The Lambda conducts a series of checks to determine the necessity of creating a new EC2 spot instance. For instance, it refrains from creating an instance if a build is already initiated by an existing runner or if the maximum allowable number of runners has been reached. + +The Lambda first requests a JIT configuration or registration token from GitHub, which is needed later by the runner to register itself. This avoids the case that the EC2 instance, which later in the process will install the agent, needs administration permissions to register the runner. Next, the EC2 spot instance is created via the launch template. The launch template defines the specifications of the required instance and contains a [`user_data`](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html) script. This script will install the required software and configure it. The configuration for the runner is shared via EC2 tags and the parameter store (SSM), from which the user data script will fetch it and delete it once it has been retrieved. Once the user data script is finished, the action runner should be online, and the workflow will start in seconds. + +The current method for scaling down runners employs a straightforward approach: at predefined intervals, the Lambda conducts a thorough examination of each runner (instance) to assess its activity. If a runner is found to be idle, it is deregistered from GitHub, and the associated AWS instance is terminated. For ephemeral runners the the instance is terminated immediately after the workflow is finished. To avoid orphaned runners the scale down lambda is active in this cae as well. + +### Pool + +The pool is only designed for org level runners in ephemeral mode. The pool will maintain a minimum number of runners based on a schedule. Keeping a small pool can help to start jobs faster and avoid missed events are causing long hanging jobs. The pool is opt in, it will not be created by default. + +### Agent sync + +To address potential delays in downloading the GitHub Action Runner distribution, a lambda function has been implemented to synchronize the action runner binary from GitHub to an S3 bucket. This ensures that the EC2 instance can retrieve the distribution from the S3 bucket, mitigating the need to rely on internet downloads, which can occasionally take more than 10 minutes. The best way to speed up instance startup is to use a pre-built AMI with the runner binary already installed. See the [examples](examples/index.md) for more details. + +### SSM housekeeping + +The control plane (scale up lambda) will store the runner registration configuration in the SSM parameter store. The token is stored in a secure string parameter. The token is deleted after the runner has registered itself. The token is also deleted after a configurable amount of time (default 24 hours). This house keeping ensures that your SSM parameter store does not fill up with old configuration. + +### AMI cleaner + +The AMI cleaner is a lambda that will clean up AMIs that are older than a configurable amount of days. This is useful when using the AMI builder to create AMIs. The cleaner will also check which AMIs are used the latest version of the launch template. And you can provide SSM config paths pointing to AMI IDs. The cleaner will not delete these AMIs. The AMI cleaner is opt in, it will not be created by default. + + +### Security + +Sensitive information such as secrets and private keys is stored securely in the SSM Parameter Store. These values undergo encryption using either the default KMS key for SSM or a custom KMS key, depending on the specified configuration. + +Permission are managed in several places. Below are the most important ones. For details check the Terraform sources. + +- The GitHub App requires access to actions and to publish `workflow_job` events to the AWS webhook (API gateway). +- The scale up lambda should have access to EC2 for creating and tagging instances. +- The scale down lambda should have access to EC2 to terminate instances. + +Besides these permissions, the lambdas also need permission to CloudWatch (for logging and scheduling), SSM and S3. For more details about the required permissions see the [documentation](modules/public/setup-iam-permissions.md) of the IAM module which uses permission boundaries. + +## Terraform main modules + +Currently we support two main modules. The `runners` module is the main module for creating runners. And the 'multi-runner' module is a wrapper around the `runners` module to create multiple runners in one go. The `multi-runner` module is useful for creating runners for multiple repositories or organizations. + +Both modules are built on top of the same base modules. When using the multi-runner module you can deploy different runners with only one deployment. + +![multi-runner](assets/multi-runner.light.png#only-light) +![multi-runner](assets/multi-runner.dark.png#only-dark) + +## Recommendations + +The module contains a lot of configuration options. The default values are a good starting point. But you may want to tweak some of the values. Below are some recommendations. We suggest the following configuration for the runners: + +- Use the multi-runner module to create multiple runners in one go. +- Use the ephemeral runners for org level runners. To improve the security of your runners. +- Use pre-built AMIs to speed up the startup of your runners. diff --git a/docs/modules/internal/runner-binaries-syncer.md b/docs/modules/internal/runner-binaries-syncer.md new file mode 100644 index 0000000000..8eacd88f7b --- /dev/null +++ b/docs/modules/internal/runner-binaries-syncer.md @@ -0,0 +1 @@ +--8<-- "modules/runner-binaries-syncer/README.md" diff --git a/docs/modules/internal/runners.md b/docs/modules/internal/runners.md new file mode 100644 index 0000000000..fe5dfc518f --- /dev/null +++ b/docs/modules/internal/runners.md @@ -0,0 +1 @@ +--8<-- "modules/runners/README.md" diff --git a/docs/modules/internal/ssm.md b/docs/modules/internal/ssm.md new file mode 100644 index 0000000000..b652faa68c --- /dev/null +++ b/docs/modules/internal/ssm.md @@ -0,0 +1 @@ +--8<-- "modules/ssm/README.md" diff --git a/docs/modules/internal/webhook-github-app.md b/docs/modules/internal/webhook-github-app.md new file mode 100644 index 0000000000..138a539e8c --- /dev/null +++ b/docs/modules/internal/webhook-github-app.md @@ -0,0 +1 @@ +--8<-- "modules/webhook-github-app/README.md" diff --git a/docs/modules/internal/webhook.md b/docs/modules/internal/webhook.md new file mode 100644 index 0000000000..98e6f71e54 --- /dev/null +++ b/docs/modules/internal/webhook.md @@ -0,0 +1 @@ +--8<-- "modules/webhook/README.md" diff --git a/docs/modules/public/ami-housekeeper.md b/docs/modules/public/ami-housekeeper.md new file mode 100644 index 0000000000..dddbd35484 --- /dev/null +++ b/docs/modules/public/ami-housekeeper.md @@ -0,0 +1 @@ +--8<-- "modules/ami-housekeeper/README.md" diff --git a/docs/modules/public/download-lambda.md b/docs/modules/public/download-lambda.md new file mode 100644 index 0000000000..9b85bad769 --- /dev/null +++ b/docs/modules/public/download-lambda.md @@ -0,0 +1 @@ +--8<-- "modules/download-lambda/README.md" diff --git a/docs/modules/public/multi-runner.md b/docs/modules/public/multi-runner.md new file mode 100644 index 0000000000..ebe0e1f309 --- /dev/null +++ b/docs/modules/public/multi-runner.md @@ -0,0 +1 @@ +--8<-- "modules/multi-runner/README.md" diff --git a/docs/modules/public/setup-iam-permissions.md b/docs/modules/public/setup-iam-permissions.md new file mode 100644 index 0000000000..a1e4990fb1 --- /dev/null +++ b/docs/modules/public/setup-iam-permissions.md @@ -0,0 +1 @@ +--8<-- "modules/setup-iam-permissions/README.md" diff --git a/docs/modules/runners.md b/docs/modules/runners.md new file mode 100644 index 0000000000..4059305859 --- /dev/null +++ b/docs/modules/runners.md @@ -0,0 +1,5 @@ +# Runner module (root) + +This module creates resources in your AWS infrastructure, and EC2 instances for hosting the self-hosted runners on-demand. IAM permissions are set to a minimal level, and could be further limited by using permission boundaries. Instances permissions are limited to retrieve and delete the registration token, access the instance's own tags, and terminate the instance itself. By nature instances are short-lived, we strongly suggest to use ephemeral runners to ensure a safe build environment for each workflow job execution. + +--8<-- "README.md:mkdocsrunners" diff --git a/docs/security.md b/docs/security.md new file mode 100644 index 0000000000..4d60bc4431 --- /dev/null +++ b/docs/security.md @@ -0,0 +1,10 @@ + +# Security + +This module creates resources in your AWS infrastructure, and EC2 instances for hosting the self-hosted runners on-demand. IAM permissions are set to a minimal level, and could be further limited by using permission boundaries. Instances permissions are limited to retrieve and delete the registration token, access the instance's own tags, and terminate the instance itself. By nature instances are short-lived, we strongly suggest to use ephemeral runners to ensure a safe build environment for each workflow job execution. + +Ephemeral runners are using the JIT configuration, confguration that only can be used once to activate a runner. For non-ephemeral runners this option is not provided by GitHub. For non-ephemeeral runners a registration token is passed via SSM. After using the token, the token is deleted. But the token remains valid and is potential available in memory on the runner. For ephemeral runners this problem is avoid by using just in time tokens. + +The examples are using standard AMI's for different operation systems. Instances are not hardened, and sudo operation are not blocked. To provide an out of the box working experience by default the module installs and configures the runner. However secrets are not hard coded, they finally end up in the memory of the instances. You can harden the instance by providing your own AMI and overwriting the cloud-init script. + +We welcome any improvement to the standard module to make the default as secure as possible, in the end it remains your responsibility to keep your environment secure. diff --git a/docs/test-lambda-local.md b/docs/test-lambda-local.md deleted file mode 100644 index 86a8a84da4..0000000000 --- a/docs/test-lambda-local.md +++ /dev/null @@ -1,88 +0,0 @@ -# Lambda - Test locally - -This README provides guidance for testing the lambda locally / and or in AWS. This guide assumes you are familiar with AWS, lambda and Node. If not mentioned explicitly, comments provided should be executed from the root of the lambda package. - -## Testing in AWS - -Just navigate to the Lambda in the AWS Console and trigger a test event. Provide an event that matches the required input. For lambdas that does not require a specific event, just send any event. - - -## Testing locally - -Testing locally can be done in two ways; using AWS SAM framework or run via a wrapper to simulate the event to invoke the lambda. Both setups require that the mandatory input environment variables be set, and AWS resources on which the lambda depends are available. We advise for testing the lambda locally to first create your own deployment of the whole module to AWS, this will simplify the setup of dependent AWS resources. For example, based on the de [default example](../../../../examples/default/). - -Local test setup instructions are available for the following lambda's: - -- [runner-binary-syncer](./moduele/../../modules/runner-binaries-syncer/lambdas/runner-binaries-syncer) - This lambda does not need any input, no event is required. Supported via SAM and local Node. - -### Extend deployment configuration - -Add the code below to your Terraform deployment to allow your principal to use the Lambda role and retrieve the lambda configuration. Update your Terraform deployment and apply the changes. - -```hcl -data "aws_caller_identity" "current" {} - -module "runners" { - - ... - - # Assume you have a profile with Admin privileges, allow you to switch to the Lambda role - lambda_principals = [{ - type = "AWS" - identifiers = ["arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"] - }] - -} - -output "development" { - value = { - lambda_syncer = module.runners.binaries_syncer.lambda - } -} -``` - -Once you have updated your Terraform deployment you need to read the lambda configuration into your environment. Run the commands below in your Terraform workspace folder. - -```bash -LAMBDA_ENV=$(terraform output -json development | jq -r '.lambda_syncer.environment[].variables' | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]") -for x in $LAMBDA_ENV ; do echo setting $x; export $x; done -``` - -### Testing with SAM - -This setup requires AWS SAM CLI and Docker is installed locally. First update the AWS config (`~/.aws/config`) so you can use easily switch to the role used by the lambda. - -```properties -[profile gh-development] -source_profile= -region= -role_arn= -``` - -Now you can set the profile and region as environment variables or pass as argument to SAM. - -```bash -export AWS_REGION= -export AWS_PROFILE=gh-development -``` - -For SAM a `template.yml` defines the lambda for running locally. Thats all, now build your lambda with `yarn run dist` and then invoke the lambda with `sam local invoke`. - - -### With Node - -Instead of using SAM you can use Node with `ts-node-dev` to test the code locally. The drawback is that you have to setup AWS credentials in your shell. Also, you are dependent on a tiny wrapper (`local.ts`), and your local Node version. - -The AWS SDK does not seem to handle environment variables for profiles, the only option to pass the role is via credentials. You can get credentials via STS for the role. - -```bash -role=$(aws sts assume-role \ - --role-arn "" \ - --duration-seconds 3600 --role-session-name "dev") - -export AWS_ACCESS_KEY_ID=$(echo $role | jq -r .Credentials.AccessKeyId) -export AWS_SECRET_ACCESS_KEY=$(echo $role | jq -r .Credentials.SecretAccessKey) -export AWS_SESSION_TOKEN=$(echo $role | jq -r .Credentials.SessionToken) -``` - -Next set the region `export AWS_REGION=`. Now you can run the lambda locally via `yarn run watch`. \ No newline at end of file diff --git a/examples/arm64/README.md b/examples/arm64/README.md index e8a0e1bb0f..7d7159fcbc 100644 --- a/examples/arm64/README.md +++ b/examples/arm64/README.md @@ -1,4 +1,4 @@ -# Action runners deployment with ARM64 architecture +# Amazon Linux ARM64 This module shows how to create GitHub action runners using AWS Graviton instances which have ARM64 architecture. Lambda release will be downloaded from GitHub. @@ -22,14 +22,12 @@ terraform init terraform apply ``` -You can receive the webhook details by running: +The example will try to update the webhook of your GitHub. In case the update fails the apply will not fail. You can receive the webhook details by running: ```bash terraform output -raw webhook_secret ``` -Be aware some shells will print some end of line character `%`. - ## Requirements diff --git a/examples/default/README.md b/examples/default/README.md index e0e274faff..21eb1e2be8 100644 --- a/examples/default/README.md +++ b/examples/default/README.md @@ -1,12 +1,12 @@ -# Action runners deployment default example +# Amazon Linux X64 (default) This module shows how to create GitHub action runners. Lambda release will be downloaded from GitHub. ## Usages -Steps for the full setup, such as creating a GitHub app can be found in the root module's [README](../../README.md). First download the Lambda releases from GitHub. Alternatively you can build the lambdas locally with Node or Docker, there is a simple build script in `/.ci/build.sh`. In the `main.tf` you can simply remove the location of the lambda zip files, the default location will work in this case. +Steps for the full setup, such as creating a GitHub app can be found in the root module's [README](https://github.com/philips-labs/terraform-aws-github-runner). First download the Lambda releases from GitHub. Alternatively you can build the lambdas locally with Node or Docker, there is a simple build script in `/.ci/build.sh`. In the `main.tf` you can simply remove the location of the lambda zip files, the default location will work in this case. -> Ensure you have set the version in `lambdas-download/main.tf` for running the example. The version needs to be set to a GitHub release version, see https://github.com/philips-labs/terraform-aws-github-runner/releases +> The default example assumes local built lambda's available. Ensure you have built the lambda's. Alternativly you can downlowd the lambda's. The version needs to be set to a GitHub release version, see https://github.com/philips-labs/terraform-aws-github-runner/releases ```bash cd ../lambdas-download @@ -15,17 +15,17 @@ terraform apply -var=module_version= cd - ``` -Before running Terraform, ensure the GitHub app is configured. See the [configuration details](../../README.md#usages) for more details. +Before running Terraform, ensure the GitHub app is configured. See the [configuration details](https://github.com/philips-labs/terraform-aws-github-runner#usages) for more details. ```bash terraform init terraform apply ``` -The module will try to update the GitHub App webhook and secret (only linux/mac). You can receive the webhook details by running: +The example will try to update the webhook of your GitHub. In case the update fails the apply will not fail. You can receive the webhook details by running: ```bash -terraform output webhook_secret +terraform output -raw webhook_secret ``` diff --git a/examples/ephemeral/README.md b/examples/ephemeral/README.md index e26224b5c6..f821a86730 100644 --- a/examples/ephemeral/README.md +++ b/examples/ephemeral/README.md @@ -1,9 +1,9 @@ -# Action runners deployment ephemeral example +# Ephemeral Amazon Linux xX64 This example is based on the default setup, but shows how runners can be used with the ephemeral flag enabled. Once enabled, ephemeral runners will be used for one job only. Each job requires a fresh instance. This feature should be used in combination with the `workflow_job` event. See GitHub webhook endpoint configuration(link needed here). It is also suggested to use a pre-build AMI to minimize runner launch times. ## Usages -Steps for the full setup, such as creating a GitHub app can be found in the root module's [README](../../README.md). First download the Lambda releases from GitHub. Alternatively you can build the lambdas locally with Node or Docker, there is a simple build script in `/.ci/build.sh`. In the `main.tf` you can simply remove the location of the lambda zip files, the default location will work in this case. +Steps for the full setup, such as creating a GitHub app can be found the [docs](https://philips-labs.github.io/terraform-aws-github-runner/getting-started/). First download the Lambda releases from GitHub. Alternatively you can build the lambdas locally with Node or Docker, there is a simple build script in `/.ci/build.sh`. In the `main.tf` you can simply remove the location of the lambda zip files, the default location will work in this case. > Ensure you have set the version in `lambdas-download/main.tf` for running the example. The version needs to be set to a GitHub release version, see https://github.com/philips-labs/terraform-aws-github-runner/releases @@ -14,7 +14,7 @@ terraform apply cd .. ``` -Before running Terraform, ensure the GitHub app is configured. See the [configuration details](../../README.md#usages) for more details. +Before running Terraform, ensure the GitHub app is configured. See the [configuration details](https://philips-labs.github.io/terraform-aws-github-runner/configuration/#ephemeral-runners) for more details. ```bash terraform init diff --git a/examples/ephemeral/main.tf b/examples/ephemeral/main.tf index 6aa9e2cda4..d7d0dacc14 100644 --- a/examples/ephemeral/main.tf +++ b/examples/ephemeral/main.tf @@ -60,9 +60,9 @@ module "runners" { enable_ephemeral_runners = true # # Example of simple pool usages - # pool_runner_owner = "my-org" + # pool_runner_owner = "philips-test-runners" # pool_config = [{ - # size = 20 + # size = 3 # schedule_expression = "cron(* * * * ? *)" # }] # diff --git a/examples/multi-runner/.terraform.lock.hcl b/examples/multi-runner/.terraform.lock.hcl index 433917f00d..ff504e2436 100644 --- a/examples/multi-runner/.terraform.lock.hcl +++ b/examples/multi-runner/.terraform.lock.hcl @@ -2,85 +2,84 @@ # Manual edits may be lost in future updates. provider "registry.terraform.io/hashicorp/aws" { - version = "5.13.1" - constraints = ">= 5.0.0, ~> 5.2" + version = "5.27.0" + constraints = ">= 5.0.0, ~> 5.2, ~> 5.27.0" hashes = [ - "h1:T/p3Gp8uAvRk3BmBZI/B7JIUpxF+2DygvBsv2UvJK4w=", - "zh:0d107e410ecfbd5d2fb5ff9793f88e2ce03ae5b3bda4e3b772b5d146cdd859d8", - "zh:1080cf6a402939ec4ad393380f2ab2dfdc0e175903e08ed796aa22eb95868847", - "zh:300420d642c3ada48cfe633444eafa7bcd410cd6a8503de2384f14ac54dc3ce3", - "zh:4e0121014a8d6ef0b1ab4634877545737bb54e951340f1b67ffea8cd22b2d252", - "zh:59b401bbf95dc8c6bea58085ff286543380f176271251193eac09cb7fcf619b7", - "zh:5dfaf51e979131710ce8e1572e6012564e68c7c842e3d9caaaeb0fe6af15c351", - "zh:84bb75dafca056d7c3783be5185187fdd3294f902e9d72f7655f2efb5e066650", + "h1:t67hg2gITLxCfO3sewnrqwExFEnM5VVBhnANKLMWy/w=", + "zh:096b4f356a8518d601334cb1765c1d317494aefbdd6de089420fc68a3facedf0", + "zh:0c46222baa052b72f077dfed4f9d06b4c71b8d9fdf0b6c4ab2a8b46a41baeb7a", + "zh:1339deb2384dfef8b7252fbd76784c512cd74f83bb8337cba96776107a1d904c", + "zh:18c47662a6d9c8f96b6d7cbf6fca739526123fc83f4b2bcee68e7f8774d4078c", + "zh:2a323401ca7c752749c9b8dbc2a3f587eebfa49344fde704ae9e692bfdd3b9ee", + "zh:36f6f9b94bc04dcba5e16038cfbedae24fcb035e5a546cf81c8f7632d9dbc3ca", + "zh:411d884b8f71be03fedcfcb82ead85871647e3dbf38f7264ce3b3aa84be6ead5", + "zh:47b185810dec758ca7cdeb5d30baaf8119c346753378e72285d152962ec43855", + "zh:48b896c8c1aa46f536f398d1b87ec6b5141aa569924ee17f5ee5a928effcd554", + "zh:6560e1ae0f6a3bf55b2d1d8267d766611c38387a17da19bde66f89412dbf6261", "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", - "zh:aa4e2b9f699d497041679bc05ca34ac21a5184298eb1813f35455b1883977910", - "zh:b51a4f08d84b071128df68a95cfa5114301a50bf8ab8e655dcf7e384e5bc6458", - "zh:bce284ac6ebb65053d9b703048e3157bf4175782ea9dbaec9f64dc2b6fcefb0c", - "zh:c748f78b79b354794098b06b18a02aefdb49be144dff8876c9204083980f7de0", - "zh:ee69d9aef5ca532392cdc26499096f3fa6e55f8622387f78194ebfaadb796aef", - "zh:ef561bee58e4976474bc056649095737fa3b2bcb74602032415d770bfc620c1f", - "zh:f696d8416c57c31f144d432779ba34764560a95937db3bb3dd2892a791a6d5a7", + "zh:aa518bd94f94a2e38f2d6ffc25da08fc4fd2b2f38d77becd3c1503720c304584", + "zh:d8d90bb74c87c8e368ec66f3d214828ab4c24bb70e764bc888207a4ed5783550", + "zh:da3c76e28342e1af7e06ea3d31a8e76cc6bf0070877beaf58c088008f61c48f9", + "zh:f403fa79a3d612be7ed4fca9d3df6fb30bc7de890ecbafe7881f38bf9b07c382", ] } provider "registry.terraform.io/hashicorp/local" { - version = "2.4.0" + version = "2.4.1" constraints = "~> 2.0" hashes = [ - "h1:7RnIbO3CFakblTJs7o0mUiY44dc9xGYsLhSNFSNS1Ds=", - "h1:ZUEYUmm2t4vxwzxy1BvN1wL6SDWrDxfH7pxtzX8c6d0=", - "zh:53604cd29cb92538668fe09565c739358dc53ca56f9f11312b9d7de81e48fab9", - "zh:66a46e9c508716a1c98efbf793092f03d50049fa4a83cd6b2251e9a06aca2acf", - "zh:70a6f6a852dd83768d0778ce9817d81d4b3f073fab8fa570bff92dcb0824f732", + "h1:gpp25uNkYJYzJVnkyRr7RIBVfwLs9GSq2HNnFpTRBg0=", + "zh:244b445bf34ddbd167731cc6c6b95bbed231dc4493f8cc34bd6850cfe1f78528", + "zh:3c330bdb626123228a0d1b1daa6c741b4d5d484ab1c7ae5d2f48d4c9885cc5e9", + "zh:5ff5f9b791ddd7557e815449173f2db38d338e674d2d91800ac6e6d808de1d1d", + "zh:70206147104f4bf26ae67d730c995772f85bf23e28c2c2e7612c74f4dae3c46f", + "zh:75029676993accd6bef933c196b2fad51a9ec8a69a847dbbe96ec8ebf7926cdc", "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", - "zh:82a803f2f484c8b766e2e9c32343e9c89b91997b9f8d2697f9f3837f62926b35", - "zh:9708a4e40d6cc4b8afd1352e5186e6e1502f6ae599867c120967aebe9d90ed04", - "zh:973f65ce0d67c585f4ec250c1e634c9b22d9c4288b484ee2a871d7fa1e317406", - "zh:c8fa0f98f9316e4cfef082aa9b785ba16e36ff754d6aba8b456dab9500e671c6", - "zh:cfa5342a5f5188b20db246c73ac823918c189468e1382cb3c48a9c0c08fc5bf7", - "zh:e0e2b477c7e899c63b06b38cd8684a893d834d6d0b5e9b033cedc06dd7ffe9e2", - "zh:f62d7d05ea1ee566f732505200ab38d94315a4add27947a60afa29860822d3fc", - "zh:fa7ce69dde358e172bd719014ad637634bbdabc49363104f4fca759b4b73f2ce", + "zh:7d48d5999fe1fcdae9295a7c3448ac1541f5a24c474bd82df6d4fa3732483f2b", + "zh:b766b38b027f0f84028244d1c2f990431a37d4fc3ac645962924554016507e77", + "zh:bfc7ad301dada204cf51c59d8bd6a9a87de5fddb42190b4d6ba157d6e08a1f10", + "zh:c902b527702a8c5e2c25a6637d07bbb1690cb6c1e63917a5f6dc460efd18d43f", + "zh:d68ae0e1070cf429c46586bc87580c3ed113f76241da2b6e4f1a8348126b3c46", + "zh:f4903fd89f7c92a346ae9e666c2d0b6884c4474ae109e9b4bd15e7efaa4bfc29", ] } provider "registry.terraform.io/hashicorp/null" { - version = "3.2.1" + version = "3.2.2" + constraints = "~> 3.0" hashes = [ - "h1:ydA0/SNRVB1o95btfshvYsmxA+jZFRZcvKzZSB+4S1M=", - "zh:58ed64389620cc7b82f01332e27723856422820cfd302e304b5f6c3436fb9840", - "zh:62a5cc82c3b2ddef7ef3a6f2fedb7b9b3deff4ab7b414938b08e51d6e8be87cb", - "zh:63cff4de03af983175a7e37e52d4bd89d990be256b16b5c7f919aff5ad485aa5", - "zh:74cb22c6700e48486b7cabefa10b33b801dfcab56f1a6ac9b6624531f3d36ea3", + "h1:IMVAUHKoydFrlPrl9OzasDnw/8ntZFerCC9iXw1rXQY=", + "zh:3248aae6a2198f3ec8394218d05bd5e42be59f43a3a7c0b71c66ec0df08b69e7", + "zh:32b1aaa1c3013d33c245493f4a65465eab9436b454d250102729321a44c8ab9a", + "zh:38eff7e470acb48f66380a73a5c7cdd76cc9b9c9ba9a7249c7991488abe22fe3", + "zh:4c2f1faee67af104f5f9e711c4574ff4d298afaa8a420680b0cb55d7bbc65606", + "zh:544b33b757c0b954dbb87db83a5ad921edd61f02f1dc86c6186a5ea86465b546", + "zh:696cf785090e1e8cf1587499516b0494f47413b43cb99877ad97f5d0de3dc539", + "zh:6e301f34757b5d265ae44467d95306d61bef5e41930be1365f5a8dcf80f59452", "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", - "zh:79e553aff77f1cfa9012a2218b8238dd672ea5e1b2924775ac9ac24d2a75c238", - "zh:a1e06ddda0b5ac48f7e7c7d59e1ab5a4073bbcf876c73c0299e4610ed53859dc", - "zh:c37a97090f1a82222925d45d84483b2aa702ef7ab66532af6cbcfb567818b970", - "zh:e4453fbebf90c53ca3323a92e7ca0f9961427d2f0ce0d2b65523cc04d5d999c2", - "zh:e80a746921946d8b6761e77305b752ad188da60688cfd2059322875d363be5f5", - "zh:fbdb892d9822ed0e4cb60f2fedbdbb556e4da0d88d3b942ae963ed6ff091e48f", - "zh:fca01a623d90d0cad0843102f9b8b9fe0d3ff8244593bd817f126582b52dd694", + "zh:913a929070c819e59e94bb37a2a253c228f83921136ff4a7aa1a178c7cce5422", + "zh:aa9015926cd152425dbf86d1abdbc74bfe0e1ba3d26b3db35051d7b9ca9f72ae", + "zh:bb04798b016e1e1d49bcc76d62c53b56c88c63d6f2dfe38821afef17c416a0e1", + "zh:c23084e1b23577de22603cff752e59128d83cfecc2e6819edadd8cf7a10af11e", ] } provider "registry.terraform.io/hashicorp/random" { - version = "3.5.1" + version = "3.6.0" constraints = "~> 3.0" hashes = [ - "h1:3hjTP5tQBspPcFAJlfafnWrNrKnr7J4Cp0qB9jbqf30=", - "h1:IL9mSatmwov+e0+++YX2V6uel+dV6bn+fC/cnGDK3Ck=", - "zh:04e3fbd610cb52c1017d282531364b9c53ef72b6bc533acb2a90671957324a64", - "zh:119197103301ebaf7efb91df8f0b6e0dd31e6ff943d231af35ee1831c599188d", - "zh:4d2b219d09abf3b1bb4df93d399ed156cadd61f44ad3baf5cf2954df2fba0831", - "zh:6130bdde527587bbe2dcaa7150363e96dbc5250ea20154176d82bc69df5d4ce3", - "zh:6cc326cd4000f724d3086ee05587e7710f032f94fc9af35e96a386a1c6f2214f", + "h1:I8MBeauYA8J8yheLJ8oSMWqB0kovn16dF/wKZ1QTdkk=", + "zh:03360ed3ecd31e8c5dac9c95fe0858be50f3e9a0d0c654b5e504109c2159287d", + "zh:1c67ac51254ba2a2bb53a25e8ae7e4d076103483f55f39b426ec55e47d1fe211", + "zh:24a17bba7f6d679538ff51b3a2f378cedadede97af8a1db7dad4fd8d6d50f829", + "zh:30ffb297ffd1633175d6545d37c2217e2cef9545a6e03946e514c59c0859b77d", + "zh:454ce4b3dbc73e6775f2f6605d45cee6e16c3872a2e66a2c97993d6e5cbd7055", "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", - "zh:b6d88e1d28cf2dfa24e9fdcc3efc77adcdc1c3c3b5c7ce503a423efbdd6de57b", - "zh:ba74c592622ecbcef9dc2a4d81ed321c4e44cddf7da799faa324da9bf52a22b2", - "zh:c7c5cde98fe4ef1143bd1b3ec5dc04baf0d4cc3ca2c5c7d40d17c0e9b2076865", - "zh:dac4bad52c940cd0dfc27893507c1e92393846b024c5a9db159a93c534a3da03", - "zh:de8febe2a2acd9ac454b844a4106ed295ae9520ef54dc8ed2faf29f12716b602", - "zh:eab0d0495e7e711cca367f7d4df6e322e6c562fc52151ec931176115b83ed014", + "zh:91df0a9fab329aff2ff4cf26797592eb7a3a90b4a0c04d64ce186654e0cc6e17", + "zh:aa57384b85622a9f7bfb5d4512ca88e61f22a9cea9f30febaa4c98c68ff0dc21", + "zh:c4a3e329ba786ffb6f2b694e1fd41d413a7010f3a53c20b432325a94fa71e839", + "zh:e2699bc9116447f96c53d55f2a00570f982e6f9935038c3810603572693712d0", + "zh:e747c0fd5d7684e5bfad8aa0ca441903f15ae7a98a737ff6aca24ba223207e2c", + "zh:f1ca75f417ce490368f047b63ec09fd003711ae48487fba90b4aba2ccf71920e", ] } diff --git a/examples/multi-runner/README.md b/examples/multi-runner/README.md index d78d8fb4bb..6c7134aef3 100644 --- a/examples/multi-runner/README.md +++ b/examples/multi-runner/README.md @@ -21,9 +21,9 @@ Per combination of OS and architecture a lambda distribution syncer will be crea ## Usages -Steps for the full setup, such as creating a GitHub app can be found in the root module's [README](../../README.md). First download the Lambda releases from GitHub. Alternatively you can build the lambdas locally with Node or Docker, there is a simple build script in `/.ci/build.sh`. In the `main.tf` you can simply remove the location of the lambda zip files, the default location will work in this case. +Steps for the full setup, such as creating a GitHub app can be found the [docs](https://philips-labs.github.io/terraform-aws-github-runner/). First download the Lambda releases from GitHub. Alternatively you can build the lambdas locally with Node or Docker, there is a simple build script in `/.ci/build.sh`. In the `main.tf` you can simply remove the location of the lambda zip files, the default location will work in this case. -> Ensure you have set the version in `lambdas-download/main.tf` for running the example. The version needs to be set to a GitHub release version, see https://github.com/philips-labs/terraform-aws-github-runner/releases +> The default example assumes local built lambda's available. Ensure you have built the lambda's. Alternativly you can downlowd the lambda's. The version needs to be set to a GitHub release version, see https://github.com/philips-labs/terraform-aws-github-runner/releases ```bash cd ../lambdas-download @@ -32,17 +32,18 @@ terraform apply -var=module_version= cd - ``` -Before running Terraform, ensure the GitHub app is configured. See the [configuration details](../../README.md#usages) for more details. + +Before running Terraform, ensure the GitHub app is configured. See the [configuration details](https://philips-labs.github.io/terraform-aws-github-runner/configuration/) for more details. ```bash terraform init terraform apply ``` -The module will try to update the GitHub App webhook and secret (only linux/mac). You can receive the webhook details by running: +The example will try to update the webhook of your GitHub. In case the update fails the apply will not fail. You can receive the webhook details by running: ```bash -terraform output webhook_secret +terraform output -raw webhook_secret ``` @@ -59,7 +60,7 @@ terraform output webhook_secret | Name | Version | |------|---------| -| [random](#provider\_random) | 3.5.1 | +| [random](#provider\_random) | 3.6.0 | ## Modules diff --git a/examples/permissions-boundary/README.md b/examples/permissions-boundary/README.md index 34f4b7a3ca..57e5cf0028 100644 --- a/examples/permissions-boundary/README.md +++ b/examples/permissions-boundary/README.md @@ -4,11 +4,6 @@ This module shows how to create GitHub action runners with permissions boundarie ## Usages -Steps for the full setup, such as creating a GitHub app can be find the module [README](../../README.md). First create the deploy role and boundary policies. These steps require an admin user. - -> Ensure you have set the version in `lambdas-download/main.tf` for running the example. The version needs to be set to a GitHub release version, see https://github.com/philips-labs/terraform-aws-github-runner/releases - - ```bash cd setup terraform init @@ -80,4 +75,4 @@ terraform apply |------|-------------| | [runners](#output\_runners) | n/a | | [webhook](#output\_webhook) | n/a | - \ No newline at end of file + diff --git a/examples/prebuilt/README.md b/examples/prebuilt/README.md index 611c7ddd03..149fe38518 100644 --- a/examples/prebuilt/README.md +++ b/examples/prebuilt/README.md @@ -1,48 +1,11 @@ -# Action runners deployment with prebuilt image +# Ubuntu custom AMI example This module shows how to create GitHub action runners using a prebuilt AMI for the runners. - Configured to run with org level runners. - GitHub runner binary syncer is not deployed. -## Usages - -Steps for the full setup, such as creating a GitHub app can be found in the root module's [README](../../README.md). - -## Variables - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| [ami\_filter](#input\_ami\_filter) | The amis to search. Use the default for the provided amazon linux image, `github-runner-windows-core-2019-*` for the provided Windows image | `string` | `github-runner-al2023-x86_64-2023*` | no | -| [github\_app\_key\_base64](#input\_github\_app\_key\_base64) | The base64 encoded private key you downloaded from GitHub when creating the app | `string` | | yes | -| [github\_app\_id](#input\_github\_app\_id) | The id of the app you created on GitHub | `string` | | yes | -| [region](#input\_region) | The target aws region | `string` | `eu-west-1` | no | -| [runner\_os](#input\_runner\_os) | The os of the image, either `linux` or `windows` | `string` | `linux` | no | - -### Lambdas - -You can either download the released lambda code or build them locally yourself. - -First download the Lambda releases from GitHub. Ensure you have set the version in `lambdas-download/main.tf` for running the example. The version needs to be set to a GitHub release version, see https://github.com/philips-labs/terraform-aws-github-runner/releases - -```bash -cd lambdas-download -terraform init -terraform apply -cd .. -``` - -Alternatively you can build the lambdas locally with Node or Docker, there is a simple build script in `/.ci/build.sh`. In the `main.tf` you need to specify the build location for all of the zip files. - -```hcl - webhook_lambda_zip = "../../lambda_output/webhook.zip" - runner_binaries_syncer_lambda_zip = "../../lambda_output/runner-binaries-syncer.zip" - runners_lambda_zip = "../../lambda_output/runners.zip" -``` - -### GitHub App Configuration - -Before running Terraform, ensure the GitHub app is configured. See the [configuration details](../../README.md#usages) for more details. +@@ Usages ### Packer Image diff --git a/examples/ubuntu/README.md b/examples/ubuntu/README.md index 46c253f24d..cca2b00039 100644 --- a/examples/ubuntu/README.md +++ b/examples/ubuntu/README.md @@ -1,10 +1,12 @@ -# Action runners deployment ubuntu example +# Ubuntu example + +> This example will be removed soon. Please check the example for epehemeral runners to see how to setup ubuntu based runner. This module shows how to create GitHub action runners using an Ubuntu AMI. Lambda release will be downloaded from GitHub. ## Usages -Steps for the full setup, such as creating a GitHub app can be found in the root module's [README](../../README.md). First download the Lambda releases from GitHub. Alternatively you can build the lambdas locally with Node or Docker, there is a simple build script in `/.ci/build.sh`. In the `main.tf` you can simply remove the location of the lambda zip files, the default location will work in this case. +Steps for the full setup, such as creating a GitHub app can be found in the [docs](https://philips-labs.github.io/terraform-aws-github-runner/getting-started/). First download the Lambda releases from GitHub. Alternatively you can build the lambdas locally with Node or Docker, there is a simple build script in `/.ci/build.sh`. In the `main.tf` you can simply remove the location of the lambda zip files, the default location will work in this case. > Ensure you have set the version in `lambdas-download/main.tf` for running the example. The version needs to be set to a GitHub release version, see https://github.com/philips-labs/terraform-aws-github-runner/releases diff --git a/examples/windows/README.md b/examples/windows/README.md index 28eee47d4b..aa76771918 100644 --- a/examples/windows/README.md +++ b/examples/windows/README.md @@ -1,10 +1,13 @@ -# Action runners deployment windows example +# Windows runners + + +> This example will be removed soon. Please check the example for epehemeral runners to see how to setup Windows based runner. This module shows how to create GitHub action runners using an Windows Runners. Lambda release will be downloaded from GitHub. ## Usages -Steps for the full setup, such as creating a GitHub app can be found in the root module's [README](../../README.md). First, download the Lambda releases from GitHub. Alternatively you can build the lambdas locally with Node or Docker, for which there is a build script available at `/.ci/build.sh`. In the `main.tf` you can remove the location of the lambda zip files, the default location will work in this case. +Steps for the full setup, such as creating a GitHub app can be found in the [docs](https://philips-labs.github.io/terraform-aws-github-runner/getting-started/). First, download the Lambda releases from GitHub. Alternatively you can build the lambdas locally with Node or Docker, for which there is a build script available at `/.ci/build.sh`. In the `main.tf` you can remove the location of the lambda zip files, the default location will work in this case. > Ensure you have set the version in `lambdas-download/main.tf` for running the example. The version needs to be set to a GitHub release version, see diff --git a/images/README.md b/images/README.md index 9e6909e274..d3599710ae 100644 --- a/images/README.md +++ b/images/README.md @@ -1,12 +1,14 @@ # Prebuilt Images +> :warning: These images are provided as an example/ + The images inside this folder are pre-built images designed to shorten the boot time of your runners and make using ephemeral runners a faster experience. These images share the same scripting as used in the user-data mechanism in `/modules/runners/templates/`. We use a `templatefile` mechanism to insert the relevant script fragments into the scripts used for provisioning the images. The examples in `linux-al2023` and `windows-core-2019` also upload a `start-runner` script that uses the exact same startup process as used in the user-data mechanism. This means that the image created here does not need any extra scripts injected or changes to boot up and connect to GH. -To remove old images the [AMI house keeper module](./modules/ami-housekeeper/README.md) can be used. +To remove old images the [AMI house keeper module](https://philips-labs.github.io/terraform-aws-github-runner/modules/public/ami-housekeeper/) can be used. ## Building your own diff --git a/mkdocs.yaml b/mkdocs.yaml new file mode 100644 index 0000000000..75aa49a1f6 --- /dev/null +++ b/mkdocs.yaml @@ -0,0 +1,74 @@ +site_name: GitHub Runners on AWS + +repo_name: philips-labs/terraform-aws-github-runner +repo_url: https://github.com/philips-labs/terraform-aws-github-runner +edit_uri: edit/main/docs/ +use_directory_urls: true + + + +theme: + name: material + icon: + logo: material/rocket-launch-outline + palette: + - media: "(prefers-color-scheme: dark)" + scheme: slate + toggle: + icon: material/weather-night + name: Switch to system preference + - scheme: default + toggle: + icon: material/weather-sunny + name: Switch to dark mode + features: + - content.code.copy + - content.action.edit + - navigation.instant + - navigation.instant.progress + - navigation.tracking + - pymdownx.snippets + - navigation.footer + +extra: + status: + new: Recently added + deprecated: Deprecated + social: + - icon: fontawesome/brands/github + link: https://github.com/philips-labs/terraform-aws-github-runner + + +markdown_extensions: + - pymdownx.snippets: + check_paths: true + - pymdownx.emoji: + +nav: + - Introduction: index.md + - Configuration: configuration.md + - Getting started: getting-started.md + - Security: security.md + - Modules: + - Runners (root): modules/runners.md + - Multi Runners: modules/public/multi-runner.md + - AMI Housekeeper: modules/public/ami-housekeeper.md + - Lambda Downloader: modules/public/download-lambda.md + - Setup IAM permissions: modules/public/setup-iam-permissions.md + - Internal: + - Runners: modules/internal/runners.md + - Syncer: modules/internal/runner-binaries-syncer.md + - SSM: modules/internal/ssm.md + - Webhook: modules/internal/webhook.md + - Update Webhook: modules/internal/webhook-github-app.md + - Examples: + - Overview: examples/index.md + - Default: examples/default.md + - Multi Runner: examples/multi-runner.md + - Ephemeral: examples/ephemeral.md + - ARM64: examples/arm64.md + - Windows: examples/windows.md + - Custom AMI: examples/prebuilt.md + - Lambda download: examples/lambda-download.md + - Permissions boundary: examples/permissions-boundary.md + - AMI examples: ami-examples/index.md diff --git a/modules/ami-housekeeper/README.md b/modules/ami-housekeeper/README.md index 55e9bae2c9..36e42274ab 100644 --- a/modules/ami-housekeeper/README.md +++ b/modules/ami-housekeeper/README.md @@ -36,7 +36,7 @@ module "ami_housekeeper" { ## Lambda Function -The Lambda function is written in [TypeScript](https://www.typescriptlang.org/) and requires Node and yarn. Sources are located in [./lamdas]. +The Lambda function is written in [TypeScript](https://www.typescriptlang.org/) and requires Node and yarn. Sources are located in [https://github.com/philips-labs/terraform-aws-github-runner/tree/main/lambdas]. ### Install diff --git a/modules/multi-runner/README.md b/modules/multi-runner/README.md index e551d4313f..2528a20db0 100644 --- a/modules/multi-runner/README.md +++ b/modules/multi-runner/README.md @@ -4,12 +4,12 @@ This module creates many runners with a single GitHub app. The module utilizes the internal modules and deploys parts of the stack for each runner defined. -The module takes a configuration as input containing a matcher for the labels. The [webhook](../webhook/README.md) lambda is using the configuration to delegate events based on the labels in the workflow job and sent them to a dedicated queue based on the configuration. Events on each queue are processed by a dedicated lambda per configuration to scale runners. +The module takes a configuration as input containing a matcher for the labels. The [webhook](https://philips-labs.github.io/terraform-aws-github-runner/modules/internal/webhook/) lambda is using the configuration to delegate events based on the labels in the workflow job and sent them to a dedicated queue based on the configuration. Events on each queue are processed by a dedicated lambda per configuration to scale runners. For each configuration: -- When enabled, the [distribution syncer](../runner-binaries-syncer/README.md) is deployed for each unique combination of OS and architecture. -- For each configuration a queue is created and [runner module](../runners/README.md) is deployed +- When enabled, the [distribution syncer](https://philips-labs.github.io/terraform-aws-github-runner/modules/internal/runner-binaries-syncer/) is deployed for each unique combination of OS and architecture. +- For each configuration a queue is created and [runner module](https://philips-labs.github.io/terraform-aws-github-runner/modules/internal/runners/) is deployed ## Matching @@ -28,7 +28,7 @@ Jobs not defining all all labels but for example only `[self-hosted, linux]` cou ## Usages -A complete example is available in the examples, see the [multi-runner example](../../examples/multi-runner/) for actual implementation. +A complete example is available in the examples, see the [multi-runner example](https://philips-labs.github.io/terraform-aws-github-runner/examples/) for actual implementation. ```hcl diff --git a/modules/runner-binaries-syncer/README.md b/modules/runner-binaries-syncer/README.md index 6871487e27..973eb4e0d2 100644 --- a/modules/runner-binaries-syncer/README.md +++ b/modules/runner-binaries-syncer/README.md @@ -4,10 +4,6 @@ This module creates a lambda that will sync GitHub action binary to a S3 bucket, the lambda will be triggered via a CloudWatch event. The distribution is cached to avoid the latency of downloading the distribution during the setup. After deployment the lambda will be triggered via an S3 object created at deployment time. -## Usages - -Usage examples are available in the root module. By default the root module will assume local zip files containing the lambda distribution are available. See the [download lambda module](../download-lambda/README.md) for more information. - ## Lambda Function The Lambda function is written in [TypeScript](https://www.typescriptlang.org/) and requires Node 12.x and yarn. Sources are located in [./lambdas/runners-binaries-syncer]. diff --git a/modules/runners/README.md b/modules/runners/README.md index 2e042f2589..afac420ab9 100644 --- a/modules/runners/README.md +++ b/modules/runners/README.md @@ -18,10 +18,6 @@ The scale up lambda is triggered by events on a SQS queue. Events on this queue The scale down lambda is triggered via a CloudWatch event. The event is triggered by a cron expression defined in the variable `scale_down_schedule_expression` (https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html). For scaling down GitHub does not provide a good API yet, therefore we run the scaling down based on this event every x minutes. Each time the lambda is triggered it tries to remove all runners older than x minutes (configurable) managed in this deployment. In case the runner can be removed from GitHub, which means it is not executing a workflow, the lambda will terminate the EC2 instance. -## Usages - -Usage examples are available in the root module. By default the root module will assume local zip files containing the lambda distribution are available. See the [download lambda module](../download-lambda/README.md) for more information. - ## Lambda Function The Lambda function is written in [TypeScript](https://www.typescriptlang.org/) and requires Node 12.x and yarn. Sources are located in [./lambdas/runners]. Two lambda functions share the same sources, there is one entry point for `scaleDown` and another one for `scaleUp`. diff --git a/modules/setup-iam-permissions/README.md b/modules/setup-iam-permissions/README.md index 75e6ece527..e4806732cd 100644 --- a/modules/setup-iam-permissions/README.md +++ b/modules/setup-iam-permissions/README.md @@ -6,7 +6,7 @@ This module will create an AWS IAM role that is required to use permission bound ## Usages -See below or check out [this example](../../examples/permissions-boundary/README.md) +See below or check out [this example](https://philips-labs.github.io/terraform-aws-github-runner/examples/permissions-boundary/) Create a workspace and add the following terraform code. ```hcl diff --git a/modules/ssm/README.md b/modules/ssm/README.md index 3a2c16b858..234c367a6e 100644 --- a/modules/ssm/README.md +++ b/modules/ssm/README.md @@ -1,5 +1,7 @@ # Module - AWS System Manager Parameter store +> This module is treated as internal module, breaking changes will not trigger a major release bump. + This module is used for storing configuration of runners, registration tokens and secrets for the Lambda's in AWS System Manager Parameter store. @@ -42,4 +44,4 @@ No modules. | Name | Description | |------|-------------| | [parameters](#output\_parameters) | n/a | - \ No newline at end of file + diff --git a/modules/webhook-github-app/README.md b/modules/webhook-github-app/README.md index ba0ca7190d..b326a79b11 100644 --- a/modules/webhook-github-app/README.md +++ b/modules/webhook-github-app/README.md @@ -1,8 +1,10 @@ # Module - Update GitHub App Webhook +> This module is treated as internal module, breaking changes will not trigger a major release bump. + > This module is using the local executor to run a bash script. -This module updates the GitHub App webhook with the endpoint and secret and can be changed with the root module. See the examples for usages. +This module updates the GitHub App webhook with the endpoint and secret and can be changed with the root module. The module is used to update the webhook after applying the examples. ## Requirements diff --git a/modules/webhook/README.md b/modules/webhook/README.md index b70210dc12..1fd617b26b 100644 --- a/modules/webhook/README.md +++ b/modules/webhook/README.md @@ -4,10 +4,6 @@ This module creates an API gateway endpoint and lambda function to handle GitHub App webhook events. -## Usages - -Usage examples are available in the root module. By default the root module will assume local zip files containing the lambda distribution are available. See the [download lambda module](../download-lambda/README.md) for more information. - ## Lambda Function The Lambda function is written in [TypeScript](https://www.typescriptlang.org/) and requires Node 12.x and yarn. Sources are located in [./lambdas/webhook].