diff --git a/_data/members.yml b/_data/members.yml index 027326ac..afd0deb6 100644 --- a/_data/members.yml +++ b/_data/members.yml @@ -949,6 +949,14 @@ piotr.klimiec: github: klimiec twitter: piotr_twit +radoslaw.panuszewski: + name: Radosław Panuszewski + bio: Software engineer at Developer Experience Team. Gradle enthusiast and Kotlin fan who shares his knowledge internally and with the open source community. + +aleksandr.serbin: + name: Aleksandr Serbin + bio: Software engineer at Developer Experience Team. Allegro-rewrite founder. + tomasz.richert: name: Tomasz Richert bio: Engineering Manager in Allegro Advertising division @@ -969,3 +977,4 @@ kacper.koza: bio: Senior Software Engineer at Allegro. github: kacperkoza linkedin: kacper-koza-352a5913b + diff --git a/_posts/2024-09-10-automating-code-migrations-at-scale.md b/_posts/2024-09-10-automating-code-migrations-at-scale.md new file mode 100644 index 00000000..3d99dc53 --- /dev/null +++ b/_posts/2024-09-10-automating-code-migrations-at-scale.md @@ -0,0 +1,217 @@ +--- +layout: post +title: Automating Code Migrations at Scale +author: [ bartosz.galek, radoslaw.panuszewski, aleksandr.serbin ] +tags: [ migrations, rewrite, breaking changes, dependabot ] +--- + +At Allegro, we continuously improve our development processes to maintain high +code quality and efficiency standards. One of the significant challenges we +encounter is managing code migrations at scale, especially with breaking changes +in our internal libraries or workflows. Manual code migration is a severe burden, with over +2000 services (and their repositories). We need to introduce some kind +of code migration management. + +## The challenge + + + + +Migrating code across numerous repositories is incredibly painful when new +versions of a company-wide library introduce breaking changes. +Traditionally, developers must follow migration guides in release notes, +identify the required changes, and manually update their code. + +This process is not only time-consuming but also prone to human error, which can +lead to inconsistencies and potential issues in production. It also raises many +questions on Slack support channels. To address this, we are proud to +share the solution we developed at Allegro - a unique and automated solution +based on [GitHub's Dependabot](https://github.com/dependabot) and +[OpenRewrite](https://docs.openrewrite.org), creating a seamless process for +upgrading codebases with minimal manual intervention. This solution reduces the +tedious manual labor, allowing you to focus on more strategic tasks. + +We wanted to use as many existing tools as possible, +so we decided to go with Dependabot together with our custom +GitHub application called `@allegro-rewrite` that leverages OpenRewrite. + +With developer experience in mind, we set ourselves a few goals: + +- reduce the manual effort required to update code across thousands of repositories +- not overwhelm developers with new tools and processes +- make sure every migration is auditable and easily reversible +- create a deadline process for merging important migrations +- provide an easy way to rerun the migration if needed +- do our best to migrate as much as possible automatically, but not strive for perfection; + it's still better to have 90% of the codebase migrated than to start from scratch + +Other tools such as: [Atomist](https://atomist.github.io/sdm/index.html) or [SourceGraph’s Batch Changes](https://about.sourcegraph.com/batch-changes) are also +worth mentioning. +They're cool, and some will also participate in this story. + +Let's dive into the details of our solution. + +## How it works + +### Allegro spring-boot-starter upgrade process + +Here is a diagram that shows the process of upgrading our internal +Spring Boot starter library, across multiple repositories. + +
+sequenceDiagram
+    Dependabot->>GitHub: Pull Request with a version bump
+    GitHub->>allegro-rewrite: Pull Request event
+    allegro-rewrite->>GitHub: Add Pull Request comment
+    Note right of allegro-rewrite: Runs OpenRewrite recipes
+    allegro-rewrite->>GitHub: Add commit with changes
+    allegro-rewrite->>GitHub: Approve the Pull Request
+
+
+ +**Step 1: Version Bump Detection** + +Dependabot continuously monitors our GitHub organization for outdated dependencies. When +a new major version of our internal Spring Boot starter library is +released, Dependabot creates a pull request to update the version in Dependabot enabled +repositories. + +![Dependabot pull request created](/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-from-dependabot.png) + +**Step 2: Take the wheel!** + +Our custom GitHub application, `@allegro-rewrite` is subscribed to the +[dependents pull request creation events webhook](https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads). Upon +detecting a supported Dependabot Pull Request, @allegro-rewrite triggers a +GitHub workflow designed to automate the migration process for the given case. + +![Dependabot pull request taken over](/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-takedown.png) + +**Step 3: Automated Code Transformations** + +Breaking changes are inevitable when we want to innovate more and provide new +features faster. Thus, more than a simple version bump is required. At the same time, +we don't want our developers to spend lots of time just addressing the +incompatibilities that we have introduced, so we delegate this routine to the +automation. + +The workflow begins by commenting on the PR to notify the maintainers that an +automated migration is underway. It then clones the repository in GitHub runner +workspace and applies a series of OpenRewrite recipes tailored +to address the breaking change update. + +![Necessary comments](/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-migration-start-comment.png) + +After applying the necessary changes, the workflow commits the modifications +(with a GitHub app-signed commit) and pushes them to the relevant Dependabot +branch. This ensures the PR is updated with the required code transformations +and ready for review and merge. + +![Migration finished](/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-migration-finished.png) + +Voilà - build passed! We can add some encouraging comments! + +![Build successful](/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-build-green.png) + +## Extending the Solution + +### Pull request commands + +We've introduced comment commands to our `@allegro-rewrite` app that are similar in use to +`@dependabot` comments that Dependabot handles, enabling further interactions and +customizations through PR and issue comments. + +![Pull requests commands](/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-commands.png) + +### CLI tool + +We also distributed our allegro-rewrite app as a regular binary via our internal [brew tap](https://docs.brew.sh/Taps). + +
+ +In the end, the architecture of our automated migration solution is highly extensible. +We can create and apply custom recipes for various scenarios, not +limited to dependabot version updates or GitHub-related workflows. + +### Time-framed migrations + +Imagine a situation where a security vulnerability is discovered in a library +used across all services. We can set a deadline for the migration to ensure +that all services are updated within a specific timeframe. + +We don't want to step in the responsibility of the maintainers, but we also +know that sometimes it's hard to prioritize the migration over other tasks. + +That's why, when the time is up, we can trigger a force-merge procedure, so +migrations that build successfully will be merged when a specified deadline arrives. + +## Flies in the Ointment + +Nothing is perfect, so let's talk about problems we have already identified. + +### Trust Issues + +During the initial testing phase, one of our employees expressed concerns about +these "automatic" migrations. Although his fears were not directly connected to +our case, previous experiences with migrations using simple replacements made +him skeptical. I attempted to globally remove explicit G1GC JVM settings, which +have been the [default since JDK 9](https://openjdk.org/jeps/248), but it proved difficult due to the numerous ways they +could be declared in Allegro's deployment YAMLs. Multiple stacking Pull Requests +cause anxiety - especially when not well explained/documented and when there's +always more lots of other work in the backlog. So, one can learn to mistrust automated +processes. + +### Edge Cases + +Despite extensive preparation and testing of robust OpenRewrite recipes, we +encountered unforeseen issues post-deployment. Examples include Groovy +annotations being ignored, Kotlin parsing inconsistencies, and YAML formatting +issues. These edge cases required additional attention and adjustments to our +recipes to ensure comprehensive coverage. + +### Simple Stuff Being Hard + +Removing a property from a YAML file seems easy, right? A powerful tool like +OpenRewrite should handle it effortlessly. Surprisingly, performing this simple change without breaking the files' formatting +required creative solutions and workarounds, which tackled +this challenge. + +### Challenges + +Such approach provokes an additional effort for library maintainers, as it is required +to get on board with OpenRewrite, analyze migration requirements and test the recipe. +OpenRewrite's learning curve is pretty smooth, but for a couple of times we found +ourselves in the situation when the whole recipe has to be reimplemented +due to the issues detected during testing. + +Even though at the beginning for library maintainers, who are new to OpenRewrite, +it meant that their library release should be postponed for some time, we still consider +it being a great time-saver at scale. Library maintainers are fully aware of changes +that have to be done and getting an additional chance to explore usages of their library +and study which uses cases do Allegro developers have when working with this library. +This approach is also aligned with Allegro's responsibility and ownership model. + +## Future Plans + +While our current implementation already delivers substantial benefits, we are +committed to further improving and open-sourcing this solution. By sharing our +approach with the broader community, we hope to help other organizations facing +similar challenges in managing large-scale code migrations. + +## Summary + +Allegro's integration of Dependabot and OpenRewrite works pretty awesome! +Our solution simplifies handling breaking changes and skyrockets +Allegro software development scalability. + +- OpenRewrite project: it's a solid piece of code that shows great promise + but still needs more time to mature. +- GitHub Apps are fantastic! +- Watch out for YAML format - [NoYAML.com](https://noyaml.com/) + +Stay tuned for more updates as we work towards open-sourcing this powerful tool! + + + diff --git a/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/allegro-rewrite-cli.cast b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/allegro-rewrite-cli.cast new file mode 100644 index 00000000..fa84a15b --- /dev/null +++ b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/allegro-rewrite-cli.cast @@ -0,0 +1,241 @@ +{"version": 2, "width": 129, "height": 50, "timestamp": 1725956383, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}} +[0.561545, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[0.562459, "o", "\u001b]2;aleksandr.serbin@polpc13015:~/ws/opbox-core\u0007\u001b]1;~/ws/opbox-core\u0007"] +[0.564436, "o", "\u001b]7;file://polpc13015/Users/aleksandr.serbin/ws/opbox-core\u001b\\"] +[0.565282, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mopbox-core\u001b[00m \u001b[K\u001b[103C[10:19:44] \u001b[114D"] +[0.565441, "o", "\u001b[?1h\u001b="] +[0.565509, "o", "\u001b[?2004h"] +[0.658407, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mopbox-core\u001b[00m \u001b[01;34mgit:(\u001b[31mmaster\u001b[34m) \u001b[33m✗\u001b[00m \u001b[K\u001b[88C[10:19:44] \u001b[99D"] +[1.000812, "o", "g"] +[1.081744, "o", "\bgi"] +[1.157906, "o", "t"] +[1.277454, "o", " "] +[1.44949, "o", "s"] +[1.552435, "o", "t"] +[1.677611, "o", "a"] +[1.753271, "o", "t"] +[1.859669, "o", "u"] +[1.95938, "o", "s"] +[2.158345, "o", "\u001b[?1l\u001b>"] +[2.158541, "o", "\u001b[?2004l"] +[2.158661, "o", "\r\r\n"] +[2.160304, "o", "\u001b]2;git status\u0007\u001b]1;git\u0007"] +[2.202705, "o", "On branch master\r\n"] +[2.202882, "o", "Untracked files:\r\n (use \"git add ...\" to include in what will be committed)\r\n\t\u001b[31mdemo.cast\u001b[m\r\n\r\nnothing added to commit but untracked files present (use \"git add\" to track)\r\n"] +[2.203274, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[2.204153, "o", "\u001b]2;aleksandr.serbin@polpc13015:~/ws/opbox-core\u0007"] +[2.204199, "o", "\u001b]1;~/ws/opbox-core\u0007"] +[2.206628, "o", "\u001b]7;file://polpc13015/Users/aleksandr.serbin/ws/opbox-core\u001b\\"] +[2.210949, "o", "\u001b[1A\u001b[123C /0,0s\r\n"] +[2.211906, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mopbox-core\u001b[00m \u001b[01;34mgit:(\u001b[31mmaster\u001b[34m) \u001b[33m✗\u001b[00m "] +[2.211988, "o", "\u001b[K\u001b[88C[10:19:46] \u001b[99D"] +[2.212042, "o", "\u001b[?1h\u001b="] +[2.21211, "o", "\u001b[?2004h"] +[2.946124, "o", "a"] +[3.133028, "o", "\bal"] +[3.247923, "o", "l"] +[3.365376, "o", "e"] +[3.539964, "o", "g"] +[3.629261, "o", "r"] +[3.750309, "o", "o"] +[3.97084, "o", "-"] +[4.141417, "o", "r"] +[4.332647, "o", "e"] +[4.710449, "o", "w"] +[4.939495, "o", "r"] +[5.162089, "o", "i"] +[5.229509, "o", "t"] +[5.304947, "o", "e"] +[5.531541, "o", " "] +[5.927749, "o", "--log-level=INFO run --recipe pl.allegro.tech.autoupgrades.recipes.AndamioUpgrade8\u001b[K\r\r\n\u001b[K\u001b[A\u001b[127C"] +[5.938039, "o", "\u001b[82D\u001b[K\u001b[72C[10:19:46] \u001b[1B\r\u001b[K\u001b[A\u001b[45C"] +[6.41695, "o", "--log-level=INFO run --recipe pl.allegro.tech.autoupgrades.recipes.AndamioUpgrade8\u001b[K\u001b[1B\r\u001b[K\u001b[A\u001b[127C"] +[7.316549, "o", "\u001b[1B\r\u001b[K\u001b[A\u001b[127C"] +[7.317013, "o", "\u001b[?1l\u001b>"] +[7.317088, "o", "\u001b[?2004l"] +[7.317303, "o", "\u001b[1B\r\r\n"] +[7.319493, "o", "\u001b]2;allegro-rewrite --log-level=INFO run --recipe \u0007\u001b]1;allegro-rewrite\u0007"] +[8.319493, "o", "10:19:53.065 [main] INFO pl.allegro.tech.autoupgrades.runner.cli.GitManagedInputFilesProvider -- Found 1147 input files\r\n"] +[8.319702000000001, "o", "10:19:53.067 [main] INFO pl.allegro.tech.autoupgrades.runner.cli.ClasspathScanningRecipeInstantiator -- Activating recipe pl.allegro.tech.autoupgrades.recipes.AndamioUpgrade8\r\n"] +[9.319702000000001, "o", "10:19:54.815 [main] INFO pl.allegro.tech.autoupgrades.runner.cli.DelegatingSourceFilesParser -- Parsing 290 files with KotlinParser: [kts, kt]\r\n"] +[10.319702000000001, "o", "10:20:00.839 [main] INFO pl.allegro.tech.autoupgrades.runner.cli.DelegatingSourceFilesParser -- Parsing 328 files with GroovyParser: [groovy]\r\n"] +[12.319702000000001, "o", "10:20:25.098 [main] INFO pl.allegro.tech.autoupgrades.runner.cli.DelegatingSourceFilesParser -- Parsing 415 files with Java21Parser: [java]\r\n"] +[13.319702000000001, "o", "10:20:27.609 [main] INFO pl.allegro.tech.autoupgrades.runner.cli.DelegatingSourceFilesParser -- Parsing 33 files with YamlParser: [yml, yaml]\r\n"] +[13.439675000000003, "o", "10:20:27.729 [main] INFO pl.allegro.tech.autoupgrades.runner.cli.DelegatingSourceFilesParser -- Parsing 2 files with PropertiesParser: [properties]\r\n"] +[13.462358000000004, "o", "10:20:27.751 [main] INFO pl.allegro.tech.autoupgrades.runner.cli.DelegatingSourceFilesParser -- Parsing 10 files with PlainTextParser: [, md, gitignore, factories, txt, toml, bat]\r\n"] +[13.467355, "o", "10:20:27.756 [main] INFO pl.allegro.tech.autoupgrades.runner.cli.DelegatingSourceFilesParser -- Parsing 69 files with QuarkParser: [editorconfig, gitkeep, json, xml, deprecated, jar]\r\n"] +[13.470495000000001, "o", "10:20:27.759 [main] INFO pl.allegro.tech.autoupgrades.runner.cli.CommandLineAutoUpgradeRunner -- Running recipe\r\n"] +[15.470495000000001, "o", "10:20:49.617 [main] INFO pl.allegro.tech.autoupgrades.runner.cli.CommandLineAutoUpgradeRunner -- Run finished with 25 files modified and 1 files deleted\r\n"] +[15.504501000000007, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[15.505330000000002, "o", "\u001b]2;aleksandr.serbin@polpc13015:~/ws/opbox-core\u0007\u001b]1;~/ws/opbox-core\u0007"] +[15.507362000000002, "o", "\u001b]7;file://polpc13015/Users/aleksandr.serbin/ws/opbox-core\u001b\\"] +[15.510756000000002, "o", "\u001b[1A\u001b[120C /1m-1,6s\r\n"] +[15.511613999999996, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mopbox-core\u001b[00m \u001b[01;34mgit:(\u001b[31mmaster\u001b[34m) \u001b[33m✗\u001b[00m "] +[15.511635, "o", "\u001b[K\u001b[88C[10:20:49] \u001b[99D"] +[15.511702999999999, "o", "\u001b[?1h\u001b="] +[15.511740000000005, "o", "\u001b[?2004h"] +[16.511740000000003, "o", "g"] +[16.593968000000004, "o", "\bgi"] +[16.762578000000005, "o", "t"] +[16.948059, "o", " "] +[17.101740000000007, "o", "s"] +[17.193920000000006, "o", "t"] +[17.304972000000006, "o", "a"] +[17.40600400000001, "o", "t"] +[17.54660600000001, "o", "u"] +[17.67178600000001, "o", "s"] +[17.956990000000005, "o", "\u001b[?1l\u001b>"] +[17.957243000000005, "o", "\u001b[?2004l\r\r\n"] +[17.96112500000001, "o", "\u001b]2;git status\u0007\u001b]1;git\u0007"] +[18.003375000000005, "o", "On branch master\r\n"] +[18.003476000000006, "o", "Changes not staged for commit:\r\n (use \"git add/rm ...\" to update what will be committed)\r\n (use \"git restore ...\" to discard changes in working directory)\r\n\t\u001b[31mmodified: core/src/integration/groovy/pl/allegro/opbox/core/domain/parameter/expression/UserTraitFunctionIntegrationSpec.groovy\u001b[m\r\n\t\u001b[31mmodified: core/src/integration/groovy/pl/allegro/opbox/core/domain/render/UserContextIntegrationSpec.groovy\u001b[m\r\n\t\u001b[31mmodified: core/src/integration/groovy/pl/allegro/opbox/core/infrastructure/scoring/RestScoringProviderIntegrationSpec.groovy\u001b[m\r\n\t\u001b[31mmodified: core/src/main/java/pl/allegro/opbox/core/domain/render/RequestContextFactory.java\u001b[m\r\n"] +[18.003569, "o", "\t\u001b[31mmodified: core/src/main/java/pl/allegro/opbox/core/domain/render/UserContextFactory.kt\u001b[m\r\n\t\u001b[31mmodified: core/src/main/java/pl/allegro/opbox/core/util/context/CmuIdContextItemValidator.kt\u001b[m\r\n\t\u001b[31mmodified: core/src/main/java/pl/allegro/opbox/core/util/context/DeviceClassContextItemValidator.kt\u001b[m\r\n\t\u001b[31mmodified: core/src/main/java/pl/allegro/opbox/core/util/context/RequestContextContainer.kt\u001b[m\r\n\t\u001b[31mmodified: core/src/main/java/pl/allegro/opbox/core/util/context/UserInternalContextItemValidator.kt\u001b[m\r\n"] +[18.003640000000004, "o", "\t\u001b[31mmodified: core/src/main/resources/application-canary.yml\u001b[m\r\n\t\u001b[31mmodified: core/src/main/resources/application-canary0.yml\u001b[m\r\n\t\u001b[31mmodified: core/src/main/resources/application-integration.yml\u001b[m\r\n\t\u001b[31mmodified: core/src/main/resources/application-local.yml\u001b[m\r\n\t\u001b[31mmodified: core/src/main/resources/application-prod.yml\u001b[m\r\n\t\u001b[31mmodified: core/src/main/resources/application-test.yml\u001b[m\r\n\t\u001b[31mmodified: core/src/main/resources/application.yml\u001b[m\r\n\t\u001b[31mmodified: core/src/main/resources/bootstrap.yml\u001b[m\r\n\t\u001b[31mmodified: core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/DeviceFunctionSpec.groovy\u001b[m\r\n\t\u001b[31mmodified: core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/IsInternalFunctionSpec.groovy\u001b[m\r\n\t\u001b[31mmodified: core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/IsRwdFunctionSpec.groovy\u001b[m\r\n"] +[18.003718000000006, "o", "\t\u001b[31mmodified: core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/UserCmIdFunctionSpec.groovy\u001b[m\r\n\t\u001b[31mmodified: core/src/test/groovy/pl/allegro/opbox/core/domain/render/RenderingTestUtils.groovy\u001b[m\r\n\t\u001b[31mmodified: core/src/test/groovy/pl/allegro/opbox/core/util/context/CmuIdContextItemValidatorSpec.groovy\u001b[m\r\n\t\u001b[31mmodified: core/src/test/groovy/pl/allegro/opbox/core/util/context/DeviceClassContextItemValidatorSpec.groovy\u001b[m\r\n\t\u001b[31mmodified: core/src/test/groovy/pl/allegro/opbox/core/util/context/UserInternalContextItemValidatorSpec.groovy\u001b[m\r\n\t\u001b[31mdeleted: project.properties\u001b[m\r\n\r\nUntracked files:\r\n (use \"git add ...\" to include in what will be committed)\r\n\t\u001b[31mdemo.cast\u001b[m\r\n\r\n"] +[18.003768000000008, "o", "no changes added to commit (use \"git add\" and/or \"git commit -a\")\r\n"] +[18.004259000000005, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[18.005194000000003, "o", "\u001b]2;aleksandr.serbin@polpc13015:~/ws/opbox-core\u0007"] +[18.005249000000006, "o", "\u001b]1;~/ws/opbox-core\u0007"] +[18.007846, "o", "\u001b]7;file://polpc13015/Users/aleksandr.serbin/ws/opbox-core\u001b\\"] +[18.011792, "o", "\u001b[1A\u001b[123C /0,0s\r\n"] +[18.01283500000001, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mopbox-core\u001b[00m \u001b[01;34mgit:(\u001b[31mmaster\u001b[34m) \u001b[33m✗\u001b[00m "] +[18.012884, "o", "\u001b[K\u001b[88C[10:20:53] \u001b[99D"] +[18.012990000000002, "o", "\u001b[?1h\u001b="] +[18.013034000000005, "o", "\u001b[?2004h"] +[19.013034000000005, "o", "g"] +[19.128605000000007, "o", "\bgi"] +[19.489040000000003, "o", "t"] +[19.715276000000003, "o", " "] +[19.817479000000006, "o", "d"] +[19.966732000000007, "o", "i"] +[20.047174, "o", "f"] +[20.187926000000004, "o", "f"] +[20.418937, "o", "\u001b[?1l\u001b>"] +[20.41900600000001, "o", "\u001b[?2004l\r\r\n"] +[20.422993000000005, "o", "\u001b]2;git diff\u0007\u001b]1;git\u0007"] +[20.472054999999997, "o", "\u001b[?1049h\u001b[?1h\u001b=\r"] +[20.486542999999998, "o", "\u001b[1mdiff --git a/core/src/integration/groovy/pl/allegro/opbox/core/domain/parameter/expression/UserTraitFunctionIntegrationSpec.groov\u001b[m \b\u001b[1my b/core/src/integration/groovy/pl/allegro/opbox/core/domain/parameter/expression/UserTraitFunctionIntegrationSpec.groovy\u001b[m\u001b[m\r\n\u001b[1mindex 1f6b03980..16b5b94dd 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/integration/groovy/pl/allegro/opbox/core/domain/parameter/expression/UserTraitFunctionIntegrationSpec.groovy\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/integration/groovy/pl/allegro/opbox/core/domain/parameter/expression/UserTraitFunctionIntegrationSpec.groovy\u001b[m\u001b[m\r\n\u001b[36m@@ -6,7 +6,7 @@\u001b[m \u001b[mimport org.springframework.beans.factory.annotation.Autowired\u001b[m\u001b[m\r\n import pl.allegro.opbox.core.BaseRenderIntegrationSpec\u001b[m\u001b[m\r\n import pl.allegro.opbox.core.infrastructure.user.TraitsService\u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextCmuIdContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.alleg"] +[20.486717, "o", "ro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n import static java.util.concurrent.CompletableFuture.completedFuture\u001b[m\u001b[m\r\n import static pl.allegro.opbox.core.util.test.ContextsTestUtils.emptyUserContext\u001b[m\u001b[m\r\n\u001b[36m@@ -43,7 +43,7 @@\u001b[m \u001b[mclass UserTraitFunctionIntegrationSpec extends BaseRenderIntegrationSpec {\u001b[m\u001b[m\r\n def traitName = 'age'\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n when:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextCmuIdContextItem.NAME, new ChiContextCmuIdContextItem.Factory().create(userCmId))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextCmuIdContextItem(userCmId))\u001b[m\u001b[m\r\n def userContext = emptyUserContext(traitsService)\u001b[m\u001b[m\r\n def function = new UserTraitFunction(renderingContext(requestContext(userContext)))\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[36m@@ -56,7 +56,7 @@\u001b[m \u001b[mclass UserTraitFunctionIntegrationSpec extends BaseRenderIntegrationSpec {\u001b[m\u001b[m\r\n def userCmId = '112'\u001b[m\u001b[m"] +[20.486783000000003, "o", "\r\n def traitName = 'age'\u001b[m\u001b[m\r\n def traitValue = '18-25'\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextCmuIdContextItem.NAME, new ChiContextCmuIdContextItem.Factory().create(userCmId))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextCmuIdContextItem(userCmId))\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n teachWireMockJson(\"/collections/user-profiles-gcp/${userCmId}\", \"\"\"\u001b[m\u001b[m\r\n {\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/integration/groovy/pl/allegro/opbox/core/domain/render/UserContextIntegrationSpec.groovy b/core/src/integra\u001b[m \b\u001b[1mtion/groovy/pl/allegro/opbox/core/domain/render/UserContextIntegrationSpec.groovy\u001b[m\u001b[m\r\n\u001b[1mindex 396c92077..57152cb9f 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/integration/groovy/pl/allegro/opbox/core/domain/render/UserContextIntegrationSpec.groovy\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/integration/groovy/pl/allegro/opbox/core/domain/render/UserContextIntegrationSpec.groovy\u001b[m\u001b[m\r\n\u001b[36m@@ -16,7 +16,7 @@\u001b[m \u001b[mimport pl.allegro.o"] +[20.486841, "o", "pbox.core.infrastructure.user.au"] +[20.486884000000003, "o", "thentication.session.SessionR\u001b[m\u001b[m\r\n import pl.allegro.opbox.core.infrastructure.user.authentication.session.SessionService\u001b[m\u001b[m\r\n import pl.allegro.opbox.core.infrastructure.user.authentication.token.UserTokenDecoder\u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextCmuIdContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n import java.time.Clock\u001b[m\u001b[m\r\n import java.time.Duration\u001b[m\u001b[m\r\n\u001b[36m@@ -182,6 +182,6 @@\u001b[m \u001b[mclass UserContextIntegrationSpec extends BaseRenderIntegrationSpec {\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n:\u001b[K"] +[21.486884000000003, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6"] +[21.487132000000003, "o", "\u001b[K~\b~\r\u001b[K"] +[21.487343999999993, "o", " static void putUserInContext(String userCmId) {\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextCmuIdContextItem.NAME, new ChiContextCmuIdContextItem.Factory().create(userCmId))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextCmuIdContextItem(userCmId))\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/integration/groovy/pl/allegro/opbox/core/infrastructure/scoring/RestScoringProviderIntegrationSpec.groovy b\u001b[m \b\u001b[1m/core/src/integration/groovy/pl/allegro/opbox/core/infrastructure/scoring/RestScoringProviderIntegrationSpec.groovy\u001b[m\u001b[m\r\n\u001b[1mindex 60c330f0b..9d85df15f 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/integration/groovy/pl/allegro/opbox/core/infrastructure/scoring/RestScoringProviderIntegrationSpec.groovy\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/integration/groovy/pl/allegro/opbox/core/infrastructure/scoring/RestScoringProviderIntegrationSpec.groovy\u001b[m\u001b[m\r\n\u001b[36m@@ -20,9 +20,7 @@\u001b[m \u001b[mimport pl.allegro.opbox.core.domain.scoring.ScoringProvider\u001b[m\u001b[m\r\n"] +[21.487550999999996, "o", " import pl.allegro.opbox.core.domain.scoring.ScoringRequest\u001b[m\u001b[m\r\n import pl.allegro.opbox.core.infrastructure.httpclient.RestClientProvider\u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextCmuIdContextItem\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextDeviceClassContextItem\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextOverrideContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n import spock.lang.Unroll\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n import java.time.Duration\u001b[m\u001b[m\r\n\u001b[36m@@ -80,8 +78,8 @@\u001b[m \u001b[mclass RestScoringProviderIntegrationSpec extends BaseRenderIntegrationSpec {\u001b[m\u001b[m\r\n }, 'container', randomNodeId())\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n and:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextDeviceClassContextItem.NAME, new ChiContextDeviceClassConte"] +[21.48769, "o", "xtItem.Factory().creat"] +[21.487957999999992, "o", "e\u001b[m \b\u001b[31m('Desktop'))\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextCmuIdContextItem.NAME, new ChiContextCmuIdContextItem.Factory().create('00000000-0\u001b[m \b\u001b[31m000-0000-0000-000000000000'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextDeviceClassContextItem('Desktop'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextCmuIdContextItem('00000000-0000-0000-0000-000000\u001b[m \b\u001b[32m\u001b[m\u001b[32m000000'))\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n and:\u001b[m\u001b[m\r\n def boxesToScore = [\"firstBox\", \"secondBox\", \"thirdBox\"].stream().map({ it -> new BoxToScore(it, it + \"Node\") }).collect\u001b[m \b(Collectors.toList())\u001b[m\u001b[m\r\n\u001b[36m@@ -109,8 +107,8 @@\u001b[m \u001b[mclass RestScoringProviderIntegrationSpec extends BaseRenderIntegrationSpec {\u001b[m\u001b[m\r\n }, 'container', randomNodeId())\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n and:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextDeviceClassContextItem.NAME, new ChiContextDeviceClassContext"] +[21.488158999999996, "o", "Item.Facto"] +[21.488242, "o", "ry().create\u001b[m \b\u001b[31m('Desktop'))\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextCmuIdContextItem.NAME, new ChiContextCmuIdContextItem.Factory().create('00000000-0\u001b[m \b\u001b[31m000-0000-0000-000000000000'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextDeviceClassContextItem('Desktop'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextCmuIdContextItem('00000000-0000-0000-0000-000000\u001b[m \b\u001b[32m\u001b[m\u001b[32m000000'))\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n and:\u001b[m\u001b[m\r\n:\u001b[K"] +[22.006445, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6"] +[22.006472000000002, "o", "\u001b[K~\b~\r\u001b[K"] +[22.00669599999999, "o", " def boxesToScore = [\"firstBox\", \"secondBox\", \"thirdBox\"].stream().map({ it -> new BoxToScore(it, it + \"Node\") }).collect\u001b[m \b(Collectors.toList())\u001b[m\u001b[m\r\n\u001b[36m@@ -156,8 +154,8 @@\u001b[m \u001b[mclass RestScoringProviderIntegrationSpec extends BaseRenderIntegrationSpec {\u001b[m\u001b[m\r\n }, 'container', randomNodeId())\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n and:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextDeviceClassContextItem.NAME, new ChiContextDeviceClassContextItem.Factory().create\u001b[m \b\u001b[31m('Desktop'))\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextCmuIdContextItem.NAME, new ChiContextCmuIdContextItem.Factory().create('00000000-0\u001b[m \b\u001b[31m000-0000-0000-000000000000'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextDeviceClassContextItem('Desktop'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextCmuIdContextItem('00000000-0000-0000-0000-000000\u001b[m \b\u001b[32m\u001b[m\u001b[32m000000'))\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n "] +[22.006754, "o", " and:\u001b[m\u001b[m\r\n def boxesToScore = [\"firstBox\", \"secondBox\", \"thirdBox\"].stream().map({ it -> new BoxToScore(it, it + \"Node\") }).collect\u001b[m \b(Collectors.toList())\u001b[m\u001b[m\r\n"] +[22.006804000000002, "o", "\u001b[36m@@ -179,8 +177,8 @@\u001b[m \u001b[mclass RestScoringProviderIntegrationSpec extends BaseRenderIntegrationSpec {\u001b[m\u001b[m\r\n }, objectName, nodeId)\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n and:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextDeviceClassContextItem.NAME, new ChiContextDeviceClassContextItem.Factory().create\u001b[m \b\u001b[31m('Desktop'))\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextCmuIdContextItem.NAME, new ChiContextCmuIdContextItem.Factory().create('00000000-0\u001b[m \b\u001b[31m000-0000-0000-000000000000'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextDeviceClassContextItem('Desktop'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextCmuIdContextItem('00000000-0000-0000-0000-000000\u001b[m \b\u001b[32m\u001b[m\u001b[32m000000'))\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n and:\u001b[m\u001b[m\r\n def boxesToScore = [\"firstBox\", \"secondBox\", \"thirdBox\"].stream().map({ it -> new BoxToScore(it, it + \"Node\") }).collect\u001b[m \b(Collectors.toList"] +[22.006845, "o", "())\u001b[m\u001b[m"] +[22.006906999999998, "o", "\r\n\u001b[36m@@ -216,9 +214,9 @@\u001b[m \u001b[mclass RestScoringProviderIntegrationSpec extends BaseRenderIntegrationSpec {\u001b[m\u001b[m\r\n }, \"container\", \"nodeId\")\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n and:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextDeviceClassContextItem.NAME, new ChiContextDeviceClassContextItem.Factory().create\u001b[m \b\u001b[31m('Phone'))\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextCmuIdContextItem.NAME, new ChiContextCmuIdContextItem.Factory().create('00000000-0\u001b[m \b\u001b[31m000-0000-0000-000000000000'))\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextOverrideContextItem.NAME, new ChiContextOverrideContextItem.Factory().create(\"k:v\"\u001b[m \b\u001b[31m))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextDeviceClassContextItem('Phone'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME, new ChiContextCmuIdContextItem('00000000-0000-0000-0000-000000\u001b[m \b\u001b[32m\u001b[m\u001b[32m000000'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m Reque"] +[22.006958999999995, "o", "stContext"] +[22.006981999999994, "o", "Container.put(SimpleHeaderContextItem.NAME, new ChiContextOverrideContextItem(\"k:v\"))\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n and:\u001b[m\u001b[m\r\n def boxesToScore = [\"firstBox\", \"secondBox\", \"thirdBox\"].stream().map({ it -> new BoxToScore(it, it + \"Node\") }).collect\u001b[m \b:\u001b[K"] +[22.64759099999999, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6"] +[22.647781999999992, "o", "\u001b[K~\b~\r\u001b[K"] +[22.647969000000003, "o", "(Collectors.toList())\u001b[m\u001b[m\r\n\u001b[36m@@ -229,9 +227,9 @@\u001b[m \u001b[mclass RestScoringProviderIntegrationSpec extends BaseRenderIntegrationSpec {\u001b[m\u001b[m\r\n then:\u001b[m\u001b[m\r\n WireMock.verify(WireMock.postRequestedFor(WireMock.urlEqualTo(\"/api/v2/scores\"))\u001b[m\u001b[m\r\n .withHeader(\"Content-Type\", equalTo(\"application/json\"))\u001b[m\u001b[m\r\n\u001b[31m- .withHeader(ChiContextDeviceClassContextItem.HEADER, equalTo(\"Phone\"))\u001b[m\u001b[m\r\n\u001b[31m- .withHeader(ChiContextCmuIdContextItem.HEADER, equalTo(\"00000000-0000-0000-0000-000000000000\"))\u001b[m\u001b[m\r\n\u001b[31m- .withHeader(ChiContextOverrideContextItem.HEADER, equalTo(\"k:v\"))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m .withHeader(SimpleHeaderContextItem.HEADER, equalTo(\"Phone\"))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m .withHeader(SimpleHeaderContextItem.HEADER, equalTo(\"00000000-0000-0000-0000-000000000000\"))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m .withHeader(SimpleHeaderContextItem.HEADER, equalTo(\"k:v\"))\u001b[m\u001b[m\r\n .withRequestBody("] +[22.648085999999992, "o", "equalTo(Js"] +[22.648178, "o", "onOutput.toJson([pageRoute : \"allegro.pl/dzial/moda\",\u001b[m\u001b[m\r\n objectIds : [\"firstBoxNode\", \"secondBoxNode\", \"thirdBoxNode\"],\u001b[m\u001b[m\r\n objectNames : [\"firstBox\", \"secondBox\", \"thirdBox\"],\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/main/java/pl/allegro/opbox/core/domain/render/RequestContextFactory.java b/core/src/main/java/pl/allegro/op\u001b[m \b\u001b[1mbox/core/domain/render/RequestContextFactory.java\u001b[m\u001b[m\r\n\u001b[1mindex 7773d432f..2e82c7a7a 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/java/pl/allegro/opbox/core/domain/render/RequestContextFactory.java\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/java/pl/allegro/opbox/core/domain/render/RequestContextFactory.java\u001b[m\u001b[m\r\n\u001b[36m@@ -16,8 +16,8 @@\u001b[m \u001b[mimport pl.allegro.opbox.core.infrastructure.config.AnonymisationConfiguration;\u001b[m\u001b[m\r\n import pl.allegro.opbox.core.infrastructure.config.CachedPagesConfiguration;\u001b[m\u001b[m\r\n import pl.allegro.opbox.core.infrastructure.dto.Page"] +[22.64822699999999, "o", "PreviewD"] +[22.648421, "o", "to;\u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer;\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextInternalIpContextItem;\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextOverrideContextItem;\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.HeaderNames;\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem;\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n import java.time.Clock;\u001b[m\u001b[m\r\n import java.util.ArrayList;\u001b[m\u001b[m\r\n\u001b[36m@@ -209,14 +209,14 @@\u001b[m \u001b[mpublic class RequestContextFactory {\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n private static void fillAndamioContext(boolean userInternal, String chi) {\u001b[m\u001b[m\r\n RequestContextContainer.put(\u001b[m\u001b[m\r\n\u001b[31m- ChiContextInternalIpContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- new ChiContextInternalIpContextItem.Factory().create(userInternal ? \"1\" : \"0\")\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m HeaderNames.INTERN"] +[22.648571000000004, "o", "AL_IP_HEADER,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m new SimpleHeaderContextItem(userInternal ? \"1\" : \"0\")\u001b[m\u001b[m\r\n );\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n if (!Strings.isNullOrEmpty(chi)) {\u001b[m\u001b[m\r\n RequestContextContainer.put(\u001b[m\u001b[m\r\n\u001b[31m- ChiContextOverrideContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- new ChiContextOverrideContextItem.Factory().create(chi)\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m HeaderNames.CHI_OVERRIDE_HEADER,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m new SimpleHeaderContextItem(chi)\u001b[m\u001b[m\r\n );\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n:\u001b[K"] +[23.275352999999996, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6"] +[23.275600999999995, "o", "\u001b[K~\b~\r\u001b[K"] +[23.275730999999993, "o", "\u001b[1mdiff --git a/core/src/main/java/pl/allegro/opbox/core/domain/render/UserContextFactory.kt b/core/src/main/java/pl/allegro/opbox/c\u001b[m \b\u001b[1more/domain/render/UserContextFactory.kt\u001b[m\u001b[m\r\n\u001b[1mindex c8e927435..81f4b7151 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/java/pl/allegro/opbox/core/domain/render/UserContextFactory.kt\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/java/pl/allegro/opbox/core/domain/render/UserContextFactory.kt\u001b[m\u001b[m\r\n\u001b[36m@@ -7,9 +7,7 @@\u001b[m \u001b[mimport pl.allegro.opbox.core.infrastructure.user.PreferencesRetrieverWithOverrid\u001b[m\u001b[m\r\n import pl.allegro.opbox.core.infrastructure.user.TraitsProvider\u001b[m\u001b[m\r\n import pl.allegro.opbox.core.infrastructure.user.authentication.AuthenticationProviderFactory\u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextCmuIdContextItem\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextInternalIpContextItem\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech"] +[23.275820999999993, "o", ".common.a"] +[23.276021999999998, "o", "ndamio.spring.core.chicontext.ChiContextOverrideContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.HeaderNames\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n class UserContextFactory(\u001b[m\u001b[m\r\n private val experimentVariantProvider: ExperimentVariantProvider,\u001b[m\u001b[m\r\n\u001b[36m@@ -62,9 +60,9 @@\u001b[m \u001b[mclass UserContextFactory(\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n fun createForAnonymousUser(): UserContext {\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.remove(ChiContextCmuIdContextItem.NAME)\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.remove(ChiContextOverrideContextItem.NAME)\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.remove(ChiContextInternalIpContextItem.NAME)\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.remove(HeaderNames.CMUID_HEADER)\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.remove(HeaderNames.CHI_OVERRIDE_HEADER)\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.remove(HeaderNames.INTERNAL_IP_HEADER)\u001b[m\u001b[m\r\n return AnonymousUserContext(\u001b[m\u001b[m\r\n experime"] +[23.276124999999993, "o", "ntVariantProvider,\u001b[m\u001b[m\r\n preferencesRetriever\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/main/java/pl/allegro/opbox/core/util/context/CmuIdContextItemValidator.kt b/core/src/main/java/pl/allegro/o\u001b[m \b\u001b[1mpbox/core/util/context/CmuIdContextItemValidator.kt\u001b[m\u001b[m\r\n\u001b[1mindex 9b094fad2..3b0b40c1f 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/java/pl/allegro/opbox/core/util/context/CmuIdContextItemValidator.kt\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/java/pl/allegro/opbox/core/util/context/CmuIdContextItemValidator.kt\u001b[m\u001b[m\r\n\u001b[36m@@ -1,17 +1,18 @@\u001b[m\u001b[m\r\n package pl.allegro.opbox.core.util.context\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n import io.micrometer.core.instrument.MeterRegistry\u001b[m\u001b[m\r\n"] +[23.276252, "o", "\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextCmuIdContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.HeaderNames\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n class CmuIdContextItemValidator(meterRegistry: MeterRegistry) :\u001b[m\u001b[m\r\n\u001b[31m- HeaderWithQueryFallbackContextItemValidator(meterRegistry) {\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m HeaderWithQueryFallbackContextItemValidator(meterRegistry) {\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n override fun getQueryParameterName() = \"userCmId\"\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n override fun getHeaderName() = \"X-Cmuid\"\u001b[m\u001b[m\r\n:\u001b[K"] +[23.916904000000002, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6"] +[23.917039000000003, "o", "\u001b[K~\b~\r\u001b[K"] +[23.917286000000004, "o", " \u001b[m\u001b[m\r\n override fun getMetricName() = \"cmuid\"\u001b[m\u001b[m\r\n\u001b[31m- override fun getContextItemName() = ChiContextCmuIdContextItem.NAME\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m override fun getContextItemName() = HeaderNames.CMUID_HEADER\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[31m- override fun getContextItemClass() = ChiContextCmuIdContextItem::class.java\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m override fun getContextItemClass() = SimpleHeaderContextItem::class.java\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/main/java/pl/allegro/opbox/core/util/context/DeviceClassContextItemValidator.kt b/core/src/main/java/pl/all\u001b[m \b\u001b[1megro/opbox/core/util/context/DeviceClassContextItemValidator.kt\u001b[m\u001b[m\r\n\u001b[1mindex fea45ae79..956f3928d 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/java/pl/allegro/opbox/core/util/context/DeviceClassContextItemValidator.kt\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/java/pl/allegro/opbox/core/util/context/DeviceClassContextItemValidator.kt\u001b[m\u001b[m\r\n\u001b[36m@@ -6,7 +6,9 @@\u001b[m \u001b[mimport org.springframework.http.HttpHeaders\u001b[m\u001b[m\r\n import pl.allegro.experiments.chi."] +[23.917424999999994, "o", "core.DeviceClassFactory\u001b[m\u001b[m\r\n import pl.allegro.opbox.core.util.MetricUtil\u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextDeviceClassContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.HeaderNames\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[m\r\n import java.lang.invoke.MethodHandles\u001b[m\u001b[m\r\n import javax.servlet.http.HttpServletRequest\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[36m@@ -25,7 +27,7 @@\u001b[m \u001b[mclass DeviceClassContextItemValidator(\u001b[m\u001b[m\r\n .orElse(null)\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n val contextItem = RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m- .get(ChiContextDeviceClassContextItem.NAME, ChiContextDeviceClassContextItem::class.java)\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m .get(HeaderNames.DEVICE_CLASS_HEADER, SimpleHeaderContextItem::class.java)\u001b[m\u001b[m\r\n .map { it.value"] +[23.917575, "o", "() }\u001b[m\u001b[m\r\n .or"] +[23.917768999999993, "o", "Else(null)\u001b[m\u001b[m\r\n if (!deviceClassFromRequest.equals(contextItem, ignoreCase = true)) {\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/main/java/pl/allegro/opbox/core/util/context/RequestContextContainer.kt b/core/src/main/java/pl/allegro/opb\u001b[m \b\u001b[1mox/core/util/context/RequestContextContainer.kt\u001b[m\u001b[m\r\n\u001b[1mindex 0cbc6a451..4e7600d91 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/java/pl/allegro/opbox/core/util/context/RequestContextContainer.kt\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/java/pl/allegro/opbox/core/util/context/RequestContextContainer.kt\u001b[m\u001b[m\r\n\u001b[36m@@ -1,9 +1,9 @@\u001b[m\u001b[m\r\n package pl.allegro.opbox.core.util.context\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextCmuIdContextItem\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextDeviceClassContextItem\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextInternalIpContextItem\u001b[m\u001b[m\r\n\u001b["] +[23.917801999999995, "o", "32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.HeaderNames\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[m\r\n import java.util.*\u001b[m\u001b[m\r\n:\u001b[K"] +[24.562309999999997, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6"] +[24.562629, "o", "\u001b[K~\b~\r\u001b[K"] +[24.562945, "o", " \u001b[m\u001b[m\r\n class RequestContextContainerUtils {\u001b[m\u001b[m\r\n\u001b[36m@@ -11,27 +11,27 @@\u001b[m \u001b[mclass RequestContextContainerUtils {\u001b[m\u001b[m\r\n companion object {\u001b[m\u001b[m\r\n @JvmStatic\u001b[m\u001b[m\r\n fun isInternalIp(): Boolean = RequestContextContainer.get(\u001b[m\u001b[m\r\n\u001b[31m- ChiContextInternalIpContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- ChiContextInternalIpContextItem::class.java\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m HeaderNames.INTERNAL_IP_HEADER,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m SimpleHeaderContextItem::class.java\u001b[m\u001b[m\r\n )\u001b[m\u001b[m\r\n\u001b[31m- .map { internal: ChiContextInternalIpContextItem -> \"1\" == internal.value() }\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m .map { internal: SimpleHeaderContextItem -> \"1\" == internal.value() }\u001b[m\u001b[m\r\n .orElse(false)\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n @JvmStatic\u001b[m\u001b[m\r\n fun getDevice() = RequestContextContainer.get(\u001b[m\u001b[m\r\n\u001b[31m- ChiContextDeviceClassContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- ChiContextDeviceClassContextItem::class.java\u001b[m\u001b[m\r\n\u001b[32"] +[24.563140000000004, "o", "m+\u001b[m\u001b[32m HeaderNames.DEVICE_CLASS_HEADER,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m SimpleHeaderContextItem::class.java\u001b[m\u001b[m\r\n )\u001b[m\u001b[m\r\n\u001b[31m- .map { obj: ChiContextDeviceClassContextItem -> obj.value() }\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m .map { obj: SimpleHeaderContextItem -> obj.value() }\u001b[m\u001b[m\r\n .orElse(\"desktop\")\u001b[m\u001b[m\r\n .lowercase(Locale.getDefault())\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n @JvmStatic\u001b[m\u001b[m\r\n fun getCmuId(): String? = RequestContextContainer.get(\u001b[m\u001b[m\r\n\u001b[31m- ChiContextCmuIdContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- ChiContextCmuIdContextItem::class.java\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m HeaderNames.CMUID_HEADER,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m SimpleHeaderContextItem::class.java\u001b[m\u001b[m\r\n )\u001b[m\u001b[m\r\n\u001b[31m- .map { obj: ChiContextCmuIdContextItem -> obj.value() }\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m .map { obj: SimpleHeaderContextItem -> obj.value() }\u001b[m\u001b[m\r\n .orElse(null)\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n\u001b[1mdiff --"] +[24.563394000000002, "o", "git a/core/src/main/java/pl/allegro/o"] +[24.563560999999993, "o", "pbox/core/util/context/UserInternalContextItemValidator.kt b/core/src/main/java/pl/al\u001b[m \b\u001b[1mlegro/opbox/core/util/context/UserInternalContextItemValidator.kt\u001b[m\u001b[m\r\n\u001b[1mindex 3f331932d..b37f853cc 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/java/pl/allegro/opbox/core/util/context/UserInternalContextItemValidator.kt\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/java/pl/allegro/opbox/core/util/context/UserInternalContextItemValidator.kt\u001b[m\u001b[m\r\n\u001b[36m@@ -1,10 +1,11 @@\u001b[m\u001b[m\r\n package pl.allegro.opbox.core.util.context\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n import io.micrometer.core.instrument.MeterRegistry\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextInternalIpContextItem\u001b[m\u001b[m\r\n:\u001b[K"] +[25.230671, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6"] +[25.230867000000003, "o", "\u001b[K~\b~\r\u001b[K\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.HeaderNames\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n class UserInternalContextItemValidator(meterRegistry: MeterRegistry) :\u001b[m\u001b[m\r\n\u001b[31m- HeaderWithQueryFallbackContextItemValidator(meterRegistry) {\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m HeaderWithQueryFallbackContextItemValidator(meterRegistry) {\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n override fun getQueryParameterName() = \"userInternal\"\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[36m@@ -12,7 +13,7 @@\u001b[m \u001b[mclass UserInternalContextItemValidator(meterRegistry: MeterRegistry) :\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n override fun getMetricName() = \"user-internal\"\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[31m- override fun getContextItemName() = ChiContextInternalIpContextItem.NAME\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m override fun getContextItemName() = HeaderNames.INTERNAL_IP_HEADER\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[31m- override fun getContextItemClass("] +[25.231039999999993, "o", ") = ChiContextInternalIpC"] +[25.231228, "o", "ontextItem::class.java\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m override fun getContextItemClass() = SimpleHeaderContextItem::class.java\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/main/resources/application-canary.yml b/core/src/main/resources/application-canary.yml\u001b[m\u001b[m\r\n\u001b[1mindex 02968497c..df6a2edcd 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/resources/application-canary.yml\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/resources/application-canary.yml\u001b[m\u001b[m\r\n\u001b[36m@@ -1,2 +1,3 @@\u001b[m\u001b[m\r\n\u001b[31m-metrics:\u001b[m\u001b[m\r\n\u001b[31m- serviceNameSuffix: \"canary\"\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mandamio:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m metrics:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m service-name-suffix: \"canary\"\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/main/resources/application-canary0.yml b/core/src/main/resources/application-canary0.yml\u001b[m\u001b[m\r\n\u001b[1mindex aedab2d5f..f02734901 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/resources/application-canary0.yml\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/resources/application-canary0.yml\u001b[m\u001b[m\r\n"] +[25.231374000000002, "o", "\u001b[36m@@ -1,5 +1,6 @@\u001b[m\u001b[m\r\n\u001b[31m-metrics:\u001b[m\u001b[m\r\n\u001b[31m- serviceNameSuffix: \"canary0\"\u001b[m\u001b[m\r\n\u001b[31m-logging:\u001b[m\u001b[m\r\n\u001b[31m- http:\u001b[m\u001b[m\r\n\u001b[31m- enabled: true\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mandamio:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m logging:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m http:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m enabled: true\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m metrics:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m service-name-suffix: \"canary0\"\u001b[m\u001b[m\r\n\\ No newline at end of file\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/main/resources/application-integration.yml b/core/src/main/resources/application-integration.yml\u001b[m\u001b[m\r\n\u001b[1mindex d67ae73b4..e5006bde7 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/resources/application-integration.yml\u001b[m\u001b[m\r\n:\u001b[K"] +[25.942819999999998, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6"] +[25.943021, "o", "\u001b[K~\b~\r\u001b[K"] +[25.943204999999992, "o", "\u001b[1m+++ b/core/src/main/resources/application-integration.yml\u001b[m\u001b[m\r\n\u001b[36m@@ -1,7 +1,3 @@\u001b[m\u001b[m\r\n\u001b[31m-metadata:\u001b[m\u001b[m\r\n\u001b[31m- cloud:\u001b[m\u001b[m\r\n\u001b[31m- reading: skip\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n prototypes:\u001b[m\u001b[m\r\n liveReloadingEnabled: false\u001b[m\u001b[m\r\n numberOfRepositories: 1\u001b[m\u001b[m\r\n\u001b[36m@@ -46,12 +42,6 @@\u001b[m \u001b[manonymisation:\u001b[m\u001b[m\r\n - allegro.pl/withUserData\u001b[m\u001b[m\r\n cacheTime: 99s\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[31m-discovery:\u001b[m\u001b[m\r\n\u001b[31m- enabled: false\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n\u001b[31m-proxy:\u001b[m\u001b[m\r\n\u001b[31m- enabled: false\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n warmup:\u001b[m\u001b[m\r\n enabled: false\u001b[m\u001b[m\r\n cache:\u001b[m\u001b[m\r\n\u001b[36m@@ -94,3 +84,9 @@\u001b[m \u001b[mplugins:\u001b[m\u001b[m\r\n env: dev\u001b[m\u001b[m\r\n gdpr:\u001b[m\u001b[m\r\n url: http://localhost:${wiremock.server.port}/varnish/opbox-gdpr-consents-version/version.json?service-tag=cluster:fivestore\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mandamio:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m discovery:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m enabled: false\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m proxy:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m enabled: false\u001b[m\u001b[m\r\n\\ No newline at end of f"] +[25.943331, "o", "ile\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/main/resources/application-local.yml b/core/src/main/resources/application-local.yml\u001b[m\u001b[m\r\n\u001b[1mindex dcb716733..ffd2aa094 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/resources/application-local.yml\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/resources/application-local.yml\u001b[m\u001b[m\r\n\u001b[36m@@ -18,22 +18,6 @@\u001b[m \u001b[mcache:\u001b[m\u001b[m\r\n warmup:\u001b[m\u001b[m\r\n enabled: false\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[31m-metadata:\u001b[m\u001b[m\r\n\u001b[31m- cloud:\u001b[m\u001b[m\r\n\u001b[31m- reading: skip\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n\u001b[31m-discovery:\u001b[m\u001b[m\r\n\u001b[31m- consul:\u001b[m\u001b[m\r\n\u001b[31m- host: consul-dev.qxlint\u001b[m\u001b[m\r\n\u001b[31m- port: 80\u001b[m\u001b[m\r\n:\u001b[K"] +[26.614991000000003, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6"] +[26.615326999999994, "o", "\u001b[K~\b~\r\u001b[K\u001b[31m- service-cache-refresh-seconds: 10\u001b[m\u001b[m\r\n\u001b[31m- enabled: false\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n\u001b[31m-proxy:\u001b[m\u001b[m\r\n\u001b[31m- enabled: true\u001b[m\u001b[m\r\n\u001b[31m- host: local-development-proxy-dev.allegrogroup.com\u001b[m\u001b[m\r\n\u001b[31m- port: 6002\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n bdl:\u001b[m\u001b[m\r\n versions:\u001b[m\u001b[m\r\n imagePins: \"1.0\"\u001b[m\u001b[m\r\n\u001b[36m@@ -58,7 +42,6 @@\u001b[m \u001b[mrender-response-cache:\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n #pageManager:\u001b[m\u001b[m\r\n # address: http://localhost:8080\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n #for local development only\u001b[m\u001b[m\r\n refresher:\u001b[m\u001b[m\r\n filterRoutes:\u001b[m\u001b[m\r\n\u001b[36m@@ -87,3 +70,15 @@\u001b[m \u001b[mplugins:\u001b[m\u001b[m\r\n kibanaUrl: https://web.logger-dev.qxlint/app/kibana#/dashboard/fecce050-d13d-11e8-ae84-cf7601c766b2\u001b[m\u001b[m\r\n sergeServiceHost: https://serge-service-dev.allegrogroup.com\u001b[m\u001b[m\r\n ventoHost: https://vento.allegrogroup.com\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mandamio:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m discovery:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m consul:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m host: consul-dev.qxlint\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m port: 80\u001b["] +[26.615470000000002, "o", "m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m service-cache-refresh-seconds: 10\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m enabled: false\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m proxy:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m enabled: true\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m host: local-development-proxy-dev.allegrogroup.com\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m port: 6002\u001b[m\u001b[m\r\n\\ No newline at end of file\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/main/resources/application-prod.yml b/core/src/main/resources/application-prod.yml\u001b[m\u001b[m\r\n\u001b[1mindex 2d1d54683..347f971b7 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/resources/application-prod.yml\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/resources/application-prod.yml\u001b[m\u001b[m\r\n\u001b[36m@@ -3,12 +3,6 @@\u001b[m \u001b[mserver:\u001b[m\u001b[m\r\n whitelabel:\u001b[m\u001b[m\r\n enabled: false\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[31m-trace:\u001b[m\u001b[m\r\n\u001b[31m- generate: true\u001b[m\u001b[m\r\n\u001b[31m- reporter:\u001b[m\u001b[m\r\n\u001b[31m- logging:\u001b[m\u001b[m\r\n\u001b[31m- enabled: true\u001b[m\u001b[m\r\n:\u001b[K"] +[27.27942399999999, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6\u001b[K~\b~\r\u001b[K"] +[27.279556, "o", "\u001b[31m-\u001b[m\u001b[m\r\n http-client:\u001b[m\u001b[m\r\n connection-request-timeout: 100ms\u001b[m\u001b[m\r\n connect-timeout: 100ms\u001b[m\u001b[m\r\n\u001b[36m@@ -27,3 +21,10 @@\u001b[m \u001b[mplugins:\u001b[m\u001b[m\r\n kibanaUrl: https://web.logger.qxlint/app/kibana#/dashboard/fecce050-d13d-11e8-ae84-cf7601c766b2\u001b[m\u001b[m\r\n sergeServiceHost: https://serge-service.allegrogroup.com\u001b[m\u001b[m\r\n ventoHost: https://vento.allegrogroup.com\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mandamio:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m trace:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m generate: true\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m reporter:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m logging:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m enabled: true\u001b[m\u001b[m\r\n\\ No newline at end of file\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/main/resources/application-test.yml b/core/src/main/resources/application-test.yml\u001b[m\u001b[m\r\n\u001b[1mindex d958827f4..8b5a95b59 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/resources/application-test.yml\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/resources/application-test.yml\u001b[m\u001b[m\r\n\u001b[36m@@ -1,9 +1,3 @@\u001b[m\u001b[m\r\n\u001b[31m-trace:\u001b[m\u001b[m\r\n\u001b[31m- generate: true\u001b[m\u001b[m\r\n\u001b[31m- r"] +[27.279617000000002, "o", "eporter:\u001b[m\u001b[m\r\n\u001b[31m- "] +[27.279719999999998, "o", " logging:\u001b[m\u001b[m\r\n\u001b[31m- enabled: true\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n session:\u001b[m\u001b[m\r\n serviceUrl: \"service://session-service/sessions/{sessionId}/auth\"\u001b[m\u001b[m\r\n serviceTimeout: 200ms\u001b[m\u001b[m\r\n\u001b[36m@@ -20,3 +14,10 @@\u001b[m \u001b[mplugins:\u001b[m\u001b[m\r\n kibanaUrl: https://web.logger-test.qxlint/app/kibana#/dashboard/fecce050-d13d-11e8-ae84-cf7601c766b2\u001b[m\u001b[m\r\n sergeServiceHost: https://serge-service-test.allegrogroup.com\u001b[m\u001b[m\r\n ventoHost: https://vento.allegrogroup.com\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mandamio:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m trace:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m generate: true\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m reporter:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m logging:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m enabled: true\u001b[m\u001b[m\r\n\\ No newline at end of file\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/main/resources/application.yml b/core/src/main/resources/application.yml\u001b[m\u001b[m\r\n\u001b[1mindex 76e242aa7..ae5939b1b 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/resources/application.yml\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/resources/application.yml\u001b[m\u001b[m\r\n\u001b[36m@@ -1,12 +1,6"] +[27.279759999999996, "o", " @@\u001b[m\u001b[m\r\n db:\u001b[m\u001b[m\r\n schemaVersion: 47\u001b[m\u001b[m\r\n:\u001b[K"] +[27.926220999999998, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6"] +[27.926282999999998, "o", "\u001b[K~\b~\r\u001b[K"] +[27.926536, "o", " \u001b[m\u001b[m\r\n\u001b[31m-discovery:\u001b[m\u001b[m\r\n\u001b[31m- enabled: true\u001b[m\u001b[m\r\n\u001b[31m- type: consul\u001b[m\u001b[m\r\n\u001b[31m- consul:\u001b[m\u001b[m\r\n\u001b[31m- clientType: JACKSON_STREAMING\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n http-client:\u001b[m\u001b[m\r\n connection-request-timeout: 1s\u001b[m\u001b[m\r\n connect-timeout: 1s\u001b[m\u001b[m\r\n\u001b[36m@@ -21,7 +15,6 @@\u001b[m \u001b[mserver:\u001b[m\u001b[m\r\n threads:\u001b[m\u001b[m\r\n worker: 16\u001b[m\u001b[m\r\n io: 4\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n opbox:\u001b[m\u001b[m\r\n worker-threads: 4\u001b[m\u001b[m\r\n worker-threads-max-queue-size: 2000\u001b[m\u001b[m\r\n\u001b[36m@@ -97,10 +90,6 @@\u001b[m \u001b[mcache:\u001b[m\u001b[m\r\n popular-routes:\u001b[m\u001b[m\r\n ttl: 3m\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[31m-i18n:\u001b[m\u001b[m\r\n\u001b[31m- enabled: false\u001b[m\u001b[m\r\n\u001b[31m- cascade: false\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n warmup:\u001b[m\u001b[m\r\n totalTimeout: 20s\u001b[m\u001b[m\r\n iterationTimeout: 5s\u001b[m\u001b[m\r\n\u001b[36m@@ -129,10 +118,6 @@\u001b[m \u001b[mopel:\u001b[m\u001b[m\r\n cache:\u001b[m\u001b[m\r\n size: 1500\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[31m-metrics:\u001b[m\u001b[m\r\n\u001b[31m- prometheus:\u001b[m\u001b[m\r\n\u001b[31m- enabled: true\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n environment:\u001b[m\u001b[m\r\n latencyFactorMultiplier: 1\u001b[m\u001b[m\r\n isDebugEnabled: fal"] +[27.926772, "o", "se\u001b[m\u001b[m\r\n\u001b[36m@@ -166,3 +151,16 @@\u001b[m "] +[27.926858999999993, "o", "\u001b[msubtree-with-parameters-propagation:\u001b[m\u001b[m\r\n seo:\u001b[m\u001b[m\r\n serviceUrl: http://seo-metaverse/api/page-metadata\u001b[m\u001b[m\r\n timeout: 20ms\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mandamio:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m discovery:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m consul:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m client-type: JACKSON_STREAMING\u001b[m\u001b[m\r\n:\u001b[K"] +[28.394385, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6\u001b[K~\b~\r\u001b[K"] +[28.394679999999994, "o", "\u001b[32m+\u001b[m\u001b[32m enabled: true\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m type: consul\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m i18n:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m cascade: false\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m enabled: false\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m metrics:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m prometheus:\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m enabled: true\u001b[m\u001b[m\r\n\\ No newline at end of file\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/main/resources/bootstrap.yml b/core/src/main/resources/bootstrap.yml\u001b[m\u001b[m\r\n\u001b[1mindex fea028e0b..53b4c4999 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/main/resources/bootstrap.yml\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/main/resources/bootstrap.yml\u001b[m\u001b[m\r\n\u001b[36m@@ -2,11 +2,6 @@\u001b[m \u001b[mapplication:\u001b[m\u001b[m\r\n name: opbox-core\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n metadata:\u001b[m\u001b[m\r\n\u001b[31m- implementation:\u001b[m\u001b[m\r\n\u001b[31m- reading: skip\u001b[m\u001b[m\r\n\u001b[31m- cloud:\u001b[m\u001b[m\r\n\u001b[31m- reading: skip\u001b[m\u001b[m\r\n\u001b[31m-\u001b[m\u001b[m\r\n spring:\u001b[m\u001b[m\r\n cloud:\u001b[m\u001b[m\r\n config:\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/DeviceFunctionSpec.groovy b/core/src/test/gro\u001b[m \b\u001b[1movy/"] +[28.394773999999998, "o", "pl/allegro/opbox/core/domain/parameter/expression/DeviceFunctionSpec.groovy\u001b[m\u001b[m\r\n\u001b[1mindex 82a5d0c08..5970d9dc7 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/DeviceFunctionSpec.groovy\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/DeviceFunctionSpec.groovy\u001b[m\u001b[m\r\n\u001b[36m@@ -1,15 +1,15 @@\u001b[m\u001b[m\r\n package pl.allegro.opbox.core.domain.parameter.expression\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n"] +[28.395132000000004, "o", " import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextDeviceClassContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n import spock.lang.Specification\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n class DeviceFunctionSpec extends Specification {\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n def \"should return user's device\"() {\u001b[m\u001b[m\r\n given:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextDeviceClassContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- new ChiContextDeviceClassContextItem.Factory().create(\"Tablet\"))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m new ChiContextDeviceClassContextItem(\"Tablet\"))\u001b[m\u001b[m\r\n def function = new DeviceFunction()\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n expect:\u001b[m\u001b[m\r\n:\u001b[K"] +[29.150406000000004, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6\u001b[K~\b~\r\u001b[K\u001b[36m@@ -18,8 +18,8 @@\u001b[m \u001b[mclass DeviceFunctionSpec extends Specification {\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n def \"should return desktop as a fallback when the value is null\"() {\u001b[m\u001b[m\r\n given:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextDeviceClassContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- new ChiContextDeviceClassContextItem.Factory().create(null))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m new ChiContextDeviceClassContextItem(null))\u001b[m\u001b[m\r\n def function = new DeviceFunction()\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n expect:\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/IsInternalFunctionSpec.groovy b/core/src/test\u001b[m \b\u001b[1m/groovy/pl/allegro/opbox/core/domain/parameter/expression/IsInternalFunctionSpec.groovy\u001b[m\u001b[m\r\n\u001b[1mindex b2e8793cb..040c38e4f 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expr"] +[29.151308, "o", "ession/IsInternalFunctionSpec.groovy\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/IsInternalFunctionSpec.groovy\u001b[m\u001b[m\r\n\u001b[36m@@ -1,7 +1,7 @@\u001b[m\u001b[m\r\n package pl.allegro.opbox.core.domain.parameter.expression\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextInternalIpContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n import spock.lang.Specification\u001b[m\u001b[m\r\n import spock.lang.Unroll\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[36m@@ -10,8 +10,8 @@\u001b[m \u001b[mclass IsInternalFunctionSpec extends Specification {\u001b[m\u001b[m\r\n @Unroll\u001b[m\u001b[m\r\n def 'should return isInternal flag from RequestContext when isInternal is #isInternal'() {\u001b[m\u001b[m\r\n given:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextInternalIpContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- new ChiContextInternalIpContextItem.Factor"] +[29.15141, "o", "y().create(isInternal ? '1' : '0'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m Re"] +[29.151736999999997, "o", "questContextContainer.put(SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m new ChiContextInternalIpContextItem(isInternal ? '1' : '0'))\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n when:\u001b[m\u001b[m\r\n def function = new IsInternalFunction()\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/IsRwdFunctionSpec.groovy b/core/src/test/groo\u001b[m \b\u001b[1mvy/pl/allegro/opbox/core/domain/parameter/expression/IsRwdFunctionSpec.groovy\u001b[m\u001b[m\r\n\u001b[1mindex 0580b241a..389be0475 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/IsRwdFunctionSpec.groovy\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/IsRwdFunctionSpec.groovy\u001b[m\u001b[m\r\n\u001b[36m@@ -1,7 +1,7 @@\u001b[m\u001b[m\r\n package pl.allegro.opbox.core.domain.parameter.expression\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextDeviceClassContextIt"] +[29.151988000000003, "o", "em\u001b[m\u001b[m\r\n\u001b[3"] +[29.152095000000003, "o", "2m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n import spock.lang.Specification\u001b[m\u001b[m\r\n import spock.lang.Unroll\u001b[m\u001b[m\r\n:\u001b[K"] +[29.656685999999993, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6\u001b[K~\b~\r\u001b[K"] +[29.656926, "o", " \u001b[m\u001b[m\r\n\u001b[36m@@ -10,7 +10,7 @@\u001b[m \u001b[mclass IsRwdFunctionSpec extends Specification {\u001b[m\u001b[m\r\n @Unroll\u001b[m\u001b[m\r\n def 'value should be #isRwd when deviceClass is #deviceClass'() {\u001b[m\u001b[m\r\n given:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextDeviceClassContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n new ChiContextDeviceClassContextItem.Factory().create(deviceClass))\u001b[m\u001b[m\r\n def function = new IsRwdFunction()\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[36m@@ -30,7 +30,7 @@\u001b[m \u001b[mclass IsRwdFunctionSpec extends Specification {\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n def \"value should be null when deviceClass is missing\"() {\u001b[m\u001b[m\r\n given:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.remove(ChiContextDeviceClassContextItem.NAME)\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.remove(SimpleHeaderContextItem.NAME)\u001b[m\u001b[m\r\n def function = new IsRwdFunction()\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n expect:\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/test/"] +[29.657043, "o", "groovy/pl/allegro/"] +[29.657304999999994, "o", "opbox/core/domain/parameter/expression/UserCmIdFunctionSpec.groovy b/core/src/test/g\u001b[m \b\u001b[1mroovy/pl/allegro/opbox/core/domain/parameter/expression/UserCmIdFunctionSpec.groovy\u001b[m\u001b[m\r\n\u001b[1mindex b66a6c17d..fcba28477 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/UserCmIdFunctionSpec.groovy\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/test/groovy/pl/allegro/opbox/core/domain/parameter/expression/UserCmIdFunctionSpec.groovy\u001b[m\u001b[m\r\n\u001b[36m@@ -1,7 +1,7 @@\u001b[m\u001b[m\r\n package pl.allegro.opbox.core.domain.parameter.expression\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextCmuIdContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n import spock.lang.Specification\u001b[m\u001b[m\r\n import spock.lang.Unroll\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[36m@@ -11,8 +11,8 @@\u001b[m \u001b[mclass UserCmIdFunctionSpec extends Specification {\u001b[m\u001b[m\r\n \u001b[m\u001b"] +[29.65744099999999, "o", "[m\r\n def \"should return userCmId\"() {\u001b[m\u001b[m\r\n given:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextCmuIdContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- new ChiContextCmuIdContextItem.Factory().create('anUserCmId'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m new ChiContextCmuIdContextItem('anUserCmId'))\u001b[m\u001b[m\r\n def function = new UserCmIdFunction()\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n expect:\u001b[m\u001b[m\r\n\u001b[36m@@ -21,8 +21,8 @@\u001b[m \u001b[mclass UserCmIdFunctionSpec extends Specification {\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n def \"should return null for empty userCmId\"() {\u001b[m\u001b[m\r\n given:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextCmuIdContextItem.NAME,\u001b[m\u001b[m\r\n:\u001b[K"] +[30.164227999999994, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6"] +[30.164299999999997, "o", "\u001b[K~\b~\r\u001b[K"] +[30.164480999999995, "o", "\u001b[31m- new ChiContextCmuIdContextItem.Factory().create(null))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m new ChiContextCmuIdContextItem(null))\u001b[m\u001b[m\r\n def function = new UserCmIdFunction()\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n expect:\u001b[m\u001b[m\r\n\u001b[36m@@ -32,8 +32,8 @@\u001b[m \u001b[mclass UserCmIdFunctionSpec extends Specification {\u001b[m\u001b[m\r\n @Unroll\u001b[m\u001b[m\r\n def 'should throw exception when number of given arguments is invalid'() {\u001b[m\u001b[m\r\n given:\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextCmuIdContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- new ChiContextCmuIdContextItem.Factory().create('anUserCmId'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m new ChiContextCmuIdContextItem('anUserCmId'))\u001b[m\u001b[m\r\n def function = new UserCmIdFunction()\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n when:\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/test/groovy/pl/alle"] +[30.164618000000004, "o", "gro/opbox/core/d"] +[30.164796999999993, "o", "omain/render/RenderingTestUtils.groovy b/core/src/test/groovy/pl/allegro\u001b[m \b\u001b[1m/opbox/core/domain/render/RenderingTestUtils.groovy\u001b[m\u001b[m\r\n\u001b[1mindex eb5836399..1d944d9f6 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/test/groovy/pl/allegro/opbox/core/domain/render/RenderingTestUtils.groovy\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/test/groovy/pl/allegro/opbox/core/domain/render/RenderingTestUtils.groovy\u001b[m\u001b[m\r\n\u001b[36m@@ -11,9 +11,7 @@\u001b[m \u001b[mimport pl.allegro.opbox.core.infrastructure.user.authentication.token.UserTokenD\u001b[m\u001b[m\r\n import pl.allegro.opbox.core.util.result.Result\u001b[m\u001b[m\r\n import pl.allegro.opbox.core.util.test.TestClock\u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n"] +[30.164919999999995, "o", "\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextCmuIdContextItem\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextInternalIpContextItem\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextOverrideContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n import static java.util.concurrent.CompletableFuture.completedFuture\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[36m@@ -93,12 +91,12 @@\u001b[m \u001b[mclass RenderingTestUtils {\u001b[m\u001b[m\r\n String chiProps = null,\u001b[m\u001b[m\r\n boolean internal = false\u001b[m\u001b[m\r\n ) {\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextCmuIdContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- new ChiContextCmuIdContextItem.Factory().create(userCmId))\u001b[m\u001b[m\r\n\u001b[31m- RequestContextContainer.put(ChiContextOverrideContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- new ChiContextOverrideContextItem.Factory().create(chiProps))\u001b[m"] +[30.16501699999999, "o", "\u001b[m\r\n\u001b[31m- "] +[30.165126, "o", " RequestContextContainer.put(ChiContextInternalIpContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[31m- new ChiContextInternalIpContextItem.Factory().create(internal ? '1' : '0'))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m new ChiContextCmuIdContextItem(userCmId))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m new ChiContextOverrideContextItem(chiProps))\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m RequestContextContainer.put(SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m new ChiContextInternalIpContextItem(internal ? '1' : '0'))\u001b[m\u001b[m\r\n:\u001b[K"] +[30.872534, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b["] +[30.872575999999995, "o", "\u001b[K6\b6\u001b[K~\b~\r\u001b[K"] +[30.872708000000003, "o", " \u001b[m\u001b[m\r\n def experimentVariants = [\u001b[m\u001b[m\r\n getUserExperimentVariant : { eId, userInfo -> completedFuture(Optional.empty()) },\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/test/groovy/pl/allegro/opbox/core/util/context/CmuIdContextItemValidatorSpec.groovy b/core/src/test/groovy/\u001b[m \b\u001b[1mpl/allegro/opbox/core/util/context/CmuIdContextItemValidatorSpec.groovy\u001b[m\u001b[m\r\n\u001b[1mindex 659d7c8c1..0b21bfbd6 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/test/groovy/pl/allegro/opbox/core/util/context/CmuIdContextItemValidatorSpec.groovy\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/test/groovy/pl/allegro/opbox/core/util/context/CmuIdContextItemValidatorSpec.groovy\u001b[m\u001b[m\r\n\u001b[36m@@ -4,7 +4,7 @@\u001b[m \u001b[mimport io.micrometer.core.instrument.Tags\u001b[m\u001b[m\r\n import io.micrometer.core.instrument.simple.SimpleMeterRegistry\u001b[m\u001b[m\r\n import org.springframework.mock.web.MockHttpServletRequest\u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextCmuI"] +[30.872793, "o", "dContextIt"] +[30.872936999999993, "o", "em\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n import spock.lang.Specification\u001b[m\u001b[m\r\n import spock.lang.Unroll\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[36m@@ -24,7 +24,7 @@\u001b[m \u001b[mclass CmuIdContextItemValidatorSpec extends Specification {\u001b[m\u001b[m\r\n if (queryValue != null) servletRequest.queryString = \"userCmId=$queryValue\"\u001b[m\u001b[m\r\n if (contextValue != null)\u001b[m\u001b[m\r\n RequestContextContainer.put(\u001b[m\u001b[m\r\n\u001b[31m- ChiContextCmuIdContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n new ChiContextCmuIdContextItem.Factory().create(contextValue)\u001b[m\u001b[m\r\n )\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[36m@@ -52,7 +52,7 @@\u001b[m \u001b[mclass CmuIdContextItemValidatorSpec extends Specification {\u001b[m\u001b[m\r\n if (queryValue != null) servletRequest.queryString = \"userCmId=$queryValue\"\u001b[m\u001b[m\r\n if (contextValue != null)\u001b[m\u001b[m\r\n RequestContextContainer.put(\u001b[m\u001b[m\r\n\u001b[31m- "] +[30.873058, "o", " ChiContextCmuIdContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n new ChiContextCmuIdContextItem.Factory().create(contextValue)\u001b[m\u001b[m\r\n )\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/test/groovy/pl/allegro/opbox/core/util/context/DeviceClassContextItemValidatorSpec.groovy b/core/src/test/g\u001b[m \b\u001b[1mroovy/pl/allegro/opbox/core/util/context/DeviceClassContextItemValidatorSpec.groovy\u001b[m\u001b[m\r\n\u001b[1mindex af7b25d32..4d9d3d460 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/test/groovy/pl/allegro/opbox/core/util/context/DeviceClassContextItemValidatorSpec.groovy\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/test/groovy/pl/allegro/opbox/core/util/context/DeviceClassContextItemValidatorSpec.groovy\u001b[m\u001b[m\r\n\u001b[36m@@ -4,7 +4,7 @@\u001b[m \u001b[mimport io.micrometer.core.instrument.Tags\u001b[m\u001b[m\r\n import io.micrometer.core.instrument.simple.SimpleMeterRegistry\u001b[m\u001b[m\r\n import org.springframework.mock.web.MockHttpServletRequest\u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.Req"] +[30.873132999999996, "o", "uestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextDeviceClassContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.common.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n import spock.lang.Specification\u001b[m\u001b[m\r\n import spock.lang.Unroll\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n:\u001b[K"] +[31.467405999999997, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b["] +[31.46761099999999, "o", "\u001b[K6\b6\u001b[K~\b~\r\u001b[K"] +[31.467754999999997, "o", "\u001b[36m@@ -26,7 +26,7 @@\u001b[m \u001b[mclass DeviceClassContextItemValidatorSpec extends Specification {\u001b[m\u001b[m\r\n if (queryValue != null) servletRequest.queryString = \"uaDevice=$queryValue\"\u001b[m\u001b[m\r\n if (contextValue != null)\u001b[m\u001b[m\r\n RequestContextContainer.put(\u001b[m\u001b[m\r\n\u001b[31m- ChiContextDeviceClassContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n new ChiContextDeviceClassContextItem.Factory().create(contextValue)\u001b[m\u001b[m\r\n )\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[36m@@ -56,7 +56,7 @@\u001b[m \u001b[mclass DeviceClassContextItemValidatorSpec extends Specification {\u001b[m\u001b[m\r\n if (queryValue != null) servletRequest.queryString = \"uaDevice=$queryValue\"\u001b[m\u001b[m\r\n if (contextValue != null)\u001b[m\u001b[m\r\n RequestContextContainer.put(\u001b[m\u001b[m\r\n\u001b[31m- ChiContextDeviceClassContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n new ChiContextDevice"] +[31.46795999999999, "o", "ClassContextIt"] +[31.468227999999996, "o", "em.Factory().create(contextValue)\u001b[m\u001b[m\r\n )\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[1mdiff --git a/core/src/test/groovy/pl/allegro/opbox/core/util/context/UserInternalContextItemValidatorSpec.groovy b/core/src/test/\u001b[m \b\u001b[1mgroovy/pl/allegro/opbox/core/util/context/UserInternalContextItemValidatorSpec.groovy\u001b[m\u001b[m\r\n\u001b[1mindex 9facdfc10..676dfa026 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/core/src/test/groovy/pl/allegro/opbox/core/util/context/UserInternalContextItemValidatorSpec.groovy\u001b[m\u001b[m\r\n\u001b[1m+++ b/core/src/test/groovy/pl/allegro/opbox/core/util/context/UserInternalContextItemValidatorSpec.groovy\u001b[m\u001b[m\r\n\u001b[36m@@ -4,7 +4,7 @@\u001b[m \u001b[mimport io.micrometer.core.instrument.Tags\u001b[m\u001b[m\r\n import io.micrometer.core.instrument.simple.SimpleMeterRegistry\u001b[m\u001b[m\r\n import org.springframework.mock.web.MockHttpServletRequest\u001b[m\u001b[m\r\n import pl.allegro.tech.common.andamio.request.RequestContextContainer\u001b[m\u001b[m\r\n\u001b[31m-import pl.allegro.tech.common.andamio.spring.core.chicontext.ChiContextInternalIpContextItem\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32mimport pl.allegro.tech.co"] +[31.468380999999994, "o", "mmon.andamio.spring.core.propagation.SimpleHeaderContextItem\u001b[m\u001b[m\r\n import spock.lang.Specification\u001b[m\u001b[m\r\n import spock.lang.Unroll\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[36m@@ -24,7 +24,7 @@\u001b[m \u001b[mclass UserInternalContextItemValidatorSpec extends Specification {\u001b[m\u001b[m\r\n if (queryValue != null) servletRequest.queryString = \"userInternal=$queryValue\"\u001b[m\u001b[m\r\n if (contextValue != null)\u001b[m\u001b[m\r\n RequestContextContainer.put(\u001b[m\u001b[m\r\n\u001b[31m- ChiContextInternalIpContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n new ChiContextInternalIpContextItem.Factory().create(contextValue)\u001b[m\u001b[m\r\n )\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[36m@@ -52,7 +52,7 @@\u001b[m \u001b[mclass UserInternalContextItemValidatorSpec extends Specification {\u001b[m\u001b[m\r\n if (queryValue != null) servletRequest.queryString = \"userInternal=$queryValue\"\u001b[m\u001b[m\r\n if (contextValue != null)\u001b[m\u001b[m\r\n RequestContextContainer.put(\u001b[m\u001b[m\r\n\u001b[31m- "] +[31.468470999999994, "o", "ChiContextInternalIpContextItem.NAME,\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m SimpleHeaderContextItem.NAME,\u001b[m\u001b[m\r\n new ChiContextInternalIpContextItem.Factory().create(contextValue)\u001b[m\u001b[m\r\n )\u001b[m\u001b[m\r\n:\u001b[K"] +[32.10822, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b["] +[32.108462, "o", "\u001b[K6\b6\u001b[K~\b~\r\u001b[K \u001b[m\u001b[m\r\n\u001b[1mdiff --git a/project.properties b/project.properties\u001b[m\u001b[m\r\n\u001b[1mdeleted file mode 100644\u001b[m\u001b[m\r\n\u001b[1mindex d6e2b89bd..000000000\u001b[m\u001b[m\r\n\u001b[1m--- a/project.properties\u001b[m\u001b[m\r\n\u001b[1m+++ /dev/null\u001b[m\u001b[m\r\n\u001b[36m@@ -1,11 +0,0 @@\u001b[m\u001b[m\r\n\u001b[31m-domain=opbox\u001b[m\u001b[m\r\n\u001b[31m-context=core\u001b[m\u001b[m\r\n"] +[32.108677, "o", "\u001b[31m-description=opbox core service\u001b[m\u001b[m\r\n\u001b[31m-team=opbox-platform\u001b[m\u001b[m\r\n\u001b[31m-business-owner=Opbox Platform \u001b[m\u001b[m\r\n\u001b[31m-technical-owner=Opbox Platform \u001b[m\u001b[m\r\n\u001b[31m-ci-url=https://github.com/allegro-internal/opbox-core/actions\u001b[m\u001b[m\r\n\u001b[31m-bugtracker-url=https://jira.allegrogroup.com/browse/OPBOX\u001b[m\u001b[m\r\n\u001b[31m-type=service\u001b[m\u001b[m\r\n\u001b[31m-documentation-url=\u001b[m\u001b[m\r\n\u001b[31m-vendor=Allegro Group\u001b[m\u001b[m\r\n\u001b[7m(END)\u001b[27m\u001b[K"] +[32.709225, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[K[\b[\u001b[K6\b6"] +[32.709492999999995, "o", "\u001b[K~\b~\r\u001b[K\u0007\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"] +[33.265754, "o", "\r\u001b[K\u001b[?1l\u001b>\u001b[?1049l"] +[33.268005, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[33.270381, "o", "\u001b]2;aleksandr.serbin@polpc13015:~/ws/opbox-core\u0007"] +[33.270500999999996, "o", "\u001b]1;~/ws/opbox-core\u0007"] +[33.275299000000004, "o", "\u001b]7;file://polpc13015/Users/aleksandr.serbin/ws/opbox-core\u001b\\"] +[33.281937, "o", "\u001b[1A\u001b[122C /12,9s\r\n"] +[33.283387000000005, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mopbox-core\u001b[00m \u001b[01;34mgit:(\u001b[31mmaster\u001b[34m) \u001b[33m✗\u001b[00m "] +[33.28344799999999, "o", "\u001b[K\u001b[88C[10:21:09] \u001b[99D"] +[33.283576999999994, "o", "\u001b[?1h\u001b="] +[33.28364499999999, "o", "\u001b[?2004h"] +[34.28364499999999, "o", "\u001b[?2004l\r\r\n"] diff --git a/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/asciinema-player.css b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/asciinema-player.css new file mode 100644 index 00000000..a942eedf --- /dev/null +++ b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/asciinema-player.css @@ -0,0 +1,2352 @@ +div.ap-wrapper { + outline: none; + height: 100%; + display: flex; + justify-content: center; +} +div.ap-wrapper .title-bar { + display: none; + top: -78px; + transition: top 0.15s linear; + position: absolute; + left: 0; + right: 0; + box-sizing: content-box; + font-size: 20px; + line-height: 1em; + padding: 15px; + font-family: sans-serif; + color: white; + background-color: rgba(0, 0, 0, 0.8); +} +div.ap-wrapper .title-bar img { + vertical-align: middle; + height: 48px; + margin-right: 16px; +} +div.ap-wrapper .title-bar a { + color: white; + text-decoration: underline; +} +div.ap-wrapper .title-bar a:hover { + text-decoration: none; +} +div.ap-wrapper:fullscreen { + background-color: #000; + width: 100%; + align-items: center; +} +div.ap-wrapper:fullscreen .title-bar { + display: initial; +} +div.ap-wrapper:fullscreen.hud .title-bar { + top: 0; +} +div.ap-wrapper div.ap-player { + text-align: left; + display: inline-block; + padding: 0px; + position: relative; + box-sizing: content-box; + overflow: hidden; + max-width: 100%; + border-radius: 4px; + font-size: 15px; + background-color: var(--term-color-background); +} +.ap-player { + --term-color-foreground: #ffffff; + --term-color-background: #000000; + --term-color-0: var(--term-color-foreground); + --term-color-1: var(--term-color-foreground); + --term-color-2: var(--term-color-foreground); + --term-color-3: var(--term-color-foreground); + --term-color-4: var(--term-color-foreground); + --term-color-5: var(--term-color-foreground); + --term-color-6: var(--term-color-foreground); + --term-color-7: var(--term-color-foreground); + --term-color-8: var(--term-color-0); + --term-color-9: var(--term-color-1); + --term-color-10: var(--term-color-2); + --term-color-11: var(--term-color-3); + --term-color-12: var(--term-color-4); + --term-color-13: var(--term-color-5); + --term-color-14: var(--term-color-6); + --term-color-15: var(--term-color-7); +} +.ap-player .fg-0 { + --fg: var(--term-color-0); +} +.ap-player .bg-0 { + --bg: var(--term-color-0); +} +.ap-player .fg-1 { + --fg: var(--term-color-1); +} +.ap-player .bg-1 { + --bg: var(--term-color-1); +} +.ap-player .fg-2 { + --fg: var(--term-color-2); +} +.ap-player .bg-2 { + --bg: var(--term-color-2); +} +.ap-player .fg-3 { + --fg: var(--term-color-3); +} +.ap-player .bg-3 { + --bg: var(--term-color-3); +} +.ap-player .fg-4 { + --fg: var(--term-color-4); +} +.ap-player .bg-4 { + --bg: var(--term-color-4); +} +.ap-player .fg-5 { + --fg: var(--term-color-5); +} +.ap-player .bg-5 { + --bg: var(--term-color-5); +} +.ap-player .fg-6 { + --fg: var(--term-color-6); +} +.ap-player .bg-6 { + --bg: var(--term-color-6); +} +.ap-player .fg-7 { + --fg: var(--term-color-7); +} +.ap-player .bg-7 { + --bg: var(--term-color-7); +} +.ap-player .fg-8 { + --fg: var(--term-color-8); +} +.ap-player .bg-8 { + --bg: var(--term-color-8); +} +.ap-player .fg-9 { + --fg: var(--term-color-9); +} +.ap-player .bg-9 { + --bg: var(--term-color-9); +} +.ap-player .fg-10 { + --fg: var(--term-color-10); +} +.ap-player .bg-10 { + --bg: var(--term-color-10); +} +.ap-player .fg-11 { + --fg: var(--term-color-11); +} +.ap-player .bg-11 { + --bg: var(--term-color-11); +} +.ap-player .fg-12 { + --fg: var(--term-color-12); +} +.ap-player .bg-12 { + --bg: var(--term-color-12); +} +.ap-player .fg-13 { + --fg: var(--term-color-13); +} +.ap-player .bg-13 { + --bg: var(--term-color-13); +} +.ap-player .fg-14 { + --fg: var(--term-color-14); +} +.ap-player .bg-14 { + --bg: var(--term-color-14); +} +.ap-player .fg-15 { + --fg: var(--term-color-15); +} +.ap-player .bg-15 { + --bg: var(--term-color-15); +} +.ap-player .fg-8, +.ap-player .fg-9, +.ap-player .fg-10, +.ap-player .fg-11, +.ap-player .fg-12, +.ap-player .fg-13, +.ap-player .fg-14, +.ap-player .fg-15 { + font-weight: bold; +} +pre.ap-terminal { + box-sizing: content-box; + overflow: hidden; + padding: 0; + margin: 0px; + display: block; + white-space: pre; + word-wrap: normal; + word-break: normal; + border-radius: 0; + border-style: solid; + cursor: text; + border-width: 0.75em; + color: var(--term-color-foreground); + background-color: var(--term-color-background); + border-color: var(--term-color-background); + outline: none; + line-height: var(--term-line-height); + font-family: Consolas, Menlo, 'Bitstream Vera Sans Mono', monospace, 'Powerline Symbols'; + font-variant-ligatures: none; +} +pre.ap-terminal .ap-line { + letter-spacing: normal; + overflow: hidden; +} +pre.ap-terminal .ap-line span { + padding: 0; + display: inline-block; + height: 100%; +} +pre.ap-terminal .ap-line { + display: block; + width: 100%; + height: var(--term-line-height); + position: relative; +} +pre.ap-terminal .ap-line span { + position: absolute; + left: calc(100% * var(--offset) / var(--term-cols)); + color: var(--fg); + background-color: var(--bg); +} +pre.ap-terminal .ap-line .ap-inverse { + color: var(--bg); + background-color: var(--fg); +} +pre.ap-terminal .ap-line .cp-2580 { + border-top: calc(0.5 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2581 { + border-bottom: calc(0.125 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2582 { + border-bottom: calc(0.25 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2583 { + border-bottom: calc(0.375 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2584 { + border-bottom: calc(0.5 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2585 { + border-bottom: calc(0.625 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2586 { + border-bottom: calc(0.75 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2587 { + border-bottom: calc(0.875 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2588 { + background-color: var(--fg); +} +pre.ap-terminal .ap-line .cp-2589 { + border-left: 0.875ch solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-258a { + border-left: 0.75ch solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-258b { + border-left: 0.625ch solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-258c { + border-left: 0.5ch solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-258d { + border-left: 0.375ch solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-258e { + border-left: 0.25ch solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-258f { + border-left: 0.125ch solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2590 { + border-right: 0.5ch solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2591 { + background-color: color-mix(in srgb, var(--fg) 25%, var(--bg)); +} +pre.ap-terminal .ap-line .cp-2592 { + background-color: color-mix(in srgb, var(--fg) 50%, var(--bg)); +} +pre.ap-terminal .ap-line .cp-2593 { + background-color: color-mix(in srgb, var(--fg) 75%, var(--bg)); +} +pre.ap-terminal .ap-line .cp-2594 { + border-top: calc(0.125 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2595 { + border-right: 0.125ch solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2596 { + border-right: 0.5ch solid var(--bg); + border-top: calc(0.5 * var(--term-line-height)) solid var(--bg); + background-color: var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2597 { + border-left: 0.5ch solid var(--bg); + border-top: calc(0.5 * var(--term-line-height)) solid var(--bg); + background-color: var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2598 { + border-right: 0.5ch solid var(--bg); + border-bottom: calc(0.5 * var(--term-line-height)) solid var(--bg); + background-color: var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-2599 { + border-left: 0.5ch solid var(--fg); + border-bottom: calc(0.5 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-259a { + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-259a::before, +pre.ap-terminal .ap-line .cp-259a::after { + content: ''; + position: absolute; + width: 0.5ch; + height: calc(0.5 * var(--term-line-height)); + background-color: var(--fg); +} +pre.ap-terminal .ap-line .cp-259a::before { + top: 0; + left: 0; +} +pre.ap-terminal .ap-line .cp-259a::after { + bottom: 0; + right: 0; +} +pre.ap-terminal .ap-line .cp-259b { + border-left: 0.5ch solid var(--fg); + border-top: calc(0.5 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-259c { + border-right: 0.5ch solid var(--fg); + border-top: calc(0.5 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-259d { + border-left: 0.5ch solid var(--bg); + border-bottom: calc(0.5 * var(--term-line-height)) solid var(--bg); + background-color: var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-259e { + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-259e::before, +pre.ap-terminal .ap-line .cp-259e::after { + content: ''; + position: absolute; + width: 0.5ch; + height: calc(0.5 * var(--term-line-height)); + background-color: var(--fg); +} +pre.ap-terminal .ap-line .cp-259e::before { + top: 0; + right: 0; +} +pre.ap-terminal .ap-line .cp-259e::after { + bottom: 0; + left: 0; +} +pre.ap-terminal .ap-line .cp-259f { + border-right: 0.5ch solid var(--fg); + border-bottom: calc(0.5 * var(--term-line-height)) solid var(--fg); + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-e0b0 { + border-left: 1ch solid var(--fg); + border-top: calc(0.5 * var(--term-line-height)) solid transparent; + border-bottom: calc(0.5 * var(--term-line-height)) solid transparent; + box-sizing: border-box; +} +pre.ap-terminal .ap-line .cp-e0b2 { + border-right: 1ch solid var(--fg); + border-top: calc(0.5 * var(--term-line-height)) solid transparent; + border-bottom: calc(0.5 * var(--term-line-height)) solid transparent; + box-sizing: border-box; +} +pre.ap-terminal.ap-cursor-on .ap-line .ap-cursor { + color: var(--bg); + background-color: var(--fg); + border-radius: 0.05em; +} +pre.ap-terminal.ap-cursor-on .ap-line .ap-cursor.ap-inverse { + color: var(--fg); + background-color: var(--bg); +} +pre.ap-terminal:not(.ap-blink) .ap-line .ap-blink { + color: transparent; +} +pre.ap-terminal .ap-bright { + font-weight: bold; +} +pre.ap-terminal .ap-faint { + opacity: 0.5; +} +pre.ap-terminal .ap-underline { + text-decoration: underline; +} +pre.ap-terminal .ap-italic { + font-style: italic; +} +pre.ap-terminal .ap-strikethrough { + text-decoration: line-through; +} +.ap-line span { + --fg: var(--term-color-foreground); + --bg: var(--term-color-background); +} +div.ap-player div.ap-control-bar { + width: 100%; + height: 32px; + display: flex; + justify-content: space-between; + align-items: stretch; + color: var(--term-color-foreground); + box-sizing: content-box; + line-height: 1; + position: absolute; + bottom: 0; + left: 0; + opacity: 0; + transition: opacity 0.15s linear; + user-select: none; + border-top: 2px solid color-mix(in oklab, black 33%, var(--term-color-background)); + z-index: 30; +} +div.ap-player div.ap-control-bar * { + box-sizing: inherit; +} +div.ap-control-bar svg.ap-icon path { + fill: var(--term-color-foreground); +} +div.ap-control-bar span.ap-playback-button { + display: flex; + flex: 0 0 auto; + cursor: pointer; + height: 12px; + width: 12px; + padding: 10px; +} +div.ap-control-bar span.ap-playback-button svg { + height: 12px; + width: 12px; +} +div.ap-control-bar span.ap-timer { + display: flex; + flex: 0 0 auto; + min-width: 50px; + margin: 0 10px; + height: 100%; + text-align: center; + font-size: 13px; + line-height: 100%; + cursor: default; +} +div.ap-control-bar span.ap-timer span { + font-family: Consolas, Menlo, 'Bitstream Vera Sans Mono', monospace; + font-size: inherit; + font-weight: 600; + margin: auto; +} +div.ap-control-bar span.ap-timer .ap-time-remaining { + display: none; +} +div.ap-control-bar span.ap-timer:hover .ap-time-elapsed { + display: none; +} +div.ap-control-bar span.ap-timer:hover .ap-time-remaining { + display: flex; +} +div.ap-control-bar .ap-progressbar { + display: block; + flex: 1 1 auto; + height: 100%; + padding: 0 10px; +} +div.ap-control-bar .ap-progressbar .ap-bar { + display: block; + position: relative; + cursor: default; + height: 100%; + font-size: 0; +} +div.ap-control-bar .ap-progressbar .ap-bar .ap-gutter { + display: block; + position: absolute; + top: 15px; + left: 0; + right: 0; + height: 3px; +} +div.ap-control-bar .ap-progressbar .ap-bar .ap-gutter-empty { + background-color: color-mix(in oklab, var(--term-color-foreground) 20%, var(--term-color-background)); +} +div.ap-control-bar .ap-progressbar .ap-bar .ap-gutter-full { + width: 100%; + transform-origin: left center; + background-color: var(--term-color-foreground); + border-radius: 3px; +} +div.ap-control-bar.ap-seekable .ap-progressbar .ap-bar { + cursor: pointer; +} +div.ap-control-bar .ap-fullscreen-button { + display: block; + flex: 0 0 auto; + width: 14px; + height: 14px; + padding: 9px; + cursor: pointer; + position: relative; +} +div.ap-control-bar .ap-fullscreen-button svg { + width: 14px; + height: 14px; +} +div.ap-control-bar .ap-fullscreen-button svg.ap-icon-fullscreen-on { + display: inline; +} +div.ap-control-bar .ap-fullscreen-button svg.ap-icon-fullscreen-off { + display: none; +} +div.ap-control-bar .ap-fullscreen-button .ap-tooltip { + right: 5px; + left: initial; + transform: none; +} +div.ap-wrapper.ap-hud .ap-control-bar { + opacity: 1; +} +div.ap-wrapper:fullscreen .ap-fullscreen-button svg.ap-icon-fullscreen-on { + display: none; +} +div.ap-wrapper:fullscreen .ap-fullscreen-button svg.ap-icon-fullscreen-off { + display: inline; +} +span.ap-progressbar span.ap-marker-container { + display: block; + top: 0; + bottom: 0; + width: 21px; + position: absolute; + margin-left: -10px; +} +span.ap-marker-container span.ap-marker { + display: block; + top: 13px; + bottom: 12px; + left: 7px; + right: 7px; + background-color: color-mix(in oklab, var(--term-color-foreground) 33%, var(--term-color-background)); + position: absolute; + transition: top 0.1s, bottom 0.1s, left 0.1s, right 0.1s, background-color 0.1s; + border-radius: 50%; +} +span.ap-marker-container span.ap-marker.ap-marker-past { + background-color: var(--term-color-foreground); +} +span.ap-marker-container span.ap-marker:hover, +span.ap-marker-container:hover span.ap-marker { + background-color: var(--term-color-foreground); + top: 11px; + bottom: 10px; + left: 5px; + right: 5px; +} +.ap-tooltip-container span.ap-tooltip { + visibility: hidden; + background-color: var(--term-color-foreground); + color: var(--term-color-background); + font-family: Consolas, Menlo, 'Bitstream Vera Sans Mono', monospace; + font-weight: bold; + text-align: center; + padding: 0 0.5em; + border-radius: 4px; + position: absolute; + z-index: 1; + white-space: nowrap; + /* Prevents the text from wrapping and makes sure the tooltip width adapts to the text length */ + font-size: 13px; + line-height: 2em; + bottom: 100%; + left: 50%; + transform: translateX(-50%); +} +.ap-tooltip-container:hover span.ap-tooltip { + visibility: visible; +} +.ap-player .ap-overlay { + z-index: 10; + background-repeat: no-repeat; + background-position: center; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: flex; + justify-content: center; + align-items: center; +} +.ap-player .ap-overlay-start { + cursor: pointer; +} +.ap-player .ap-overlay-start .ap-play-button { + font-size: 0px; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + text-align: center; + color: white; + height: 80px; + max-height: 66%; + margin: auto; +} +.ap-player .ap-overlay-start .ap-play-button div { + height: 100%; +} +.ap-player .ap-overlay-start .ap-play-button div span { + height: 100%; + display: block; +} +.ap-player .ap-overlay-start .ap-play-button div span svg { + height: 100%; +} +.ap-player .ap-overlay-start .ap-play-button svg { + filter: drop-shadow(0px 0px 5px rgba(0, 0, 0, 0.4)); +} +.ap-player .ap-overlay-loading .ap-loader { + width: 48px; + height: 48px; + border-radius: 50%; + display: inline-block; + position: relative; + border: 10px solid; + border-color: rgba(255, 255, 255, 0.3) rgba(255, 255, 255, 0.5) rgba(255, 255, 255, 0.7) #ffffff; + border-color: color-mix(in srgb, var(--term-color-foreground) 30%, var(--term-color-background)) color-mix(in srgb, var(--term-color-foreground) 50%, var(--term-color-background)) color-mix(in srgb, var(--term-color-foreground) 70%, var(--term-color-background)) color-mix(in srgb, var(--term-color-foreground) 100%, var(--term-color-background)); + box-sizing: border-box; + animation: ap-loader-rotation 1s linear infinite; +} +.ap-player .ap-overlay-info { + background-color: var(--term-color-background); +} +.ap-player .ap-overlay-info span { + font-family: Consolas, Menlo, 'Bitstream Vera Sans Mono', monospace, 'Powerline Symbols'; + font-variant-ligatures: none; + font-size: 2em; + color: var(--term-color-foreground); +} +.ap-player .ap-overlay-info span .ap-line { + letter-spacing: normal; + overflow: hidden; +} +.ap-player .ap-overlay-info span .ap-line span { + padding: 0; + display: inline-block; + height: 100%; +} +.ap-player .ap-overlay-help { + background-color: rgba(0, 0, 0, 0.8); + container-type: inline-size; +} +.ap-player .ap-overlay-help > div { + font-family: Consolas, Menlo, 'Bitstream Vera Sans Mono', monospace, 'Powerline Symbols'; + font-variant-ligatures: none; + max-width: 85%; + max-height: 85%; + font-size: 18px; + color: var(--term-color-foreground); + background-color: var(--term-color-background); + border-radius: 6px; + box-sizing: border-box; + margin-bottom: 32px; +} +.ap-player .ap-overlay-help > div .ap-line { + letter-spacing: normal; + overflow: hidden; +} +.ap-player .ap-overlay-help > div .ap-line span { + padding: 0; + display: inline-block; + height: 100%; +} +.ap-player .ap-overlay-help > div div { + padding: calc(min(4cqw, 40px)); + font-size: calc(min(1.9cqw, 18px)); +} +.ap-player .ap-overlay-help > div div p { + font-weight: bold; + margin: 0 0 2em 0; +} +.ap-player .ap-overlay-help > div div ul { + list-style: none; + padding: 0; +} +.ap-player .ap-overlay-help > div div ul li { + margin: 0 0 0.75em 0; +} +.ap-player .ap-overlay-help > div div kbd { + color: var(--term-color-background); + background-color: var(--term-color-foreground); + padding: 0.2em 0.5em; + border-radius: 0.2em; + font-family: inherit; + font-size: 0.85em; + border: none; + margin: 0; +} +.ap-player .ap-overlay-error span { + font-size: 8em; +} +@keyframes ap-loader-rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +.ap-terminal .fg-16 { + --fg: #000000; +} +.ap-terminal .bg-16 { + --bg: #000000; +} +.ap-terminal .fg-17 { + --fg: #00005f; +} +.ap-terminal .bg-17 { + --bg: #00005f; +} +.ap-terminal .fg-18 { + --fg: #000087; +} +.ap-terminal .bg-18 { + --bg: #000087; +} +.ap-terminal .fg-19 { + --fg: #0000af; +} +.ap-terminal .bg-19 { + --bg: #0000af; +} +.ap-terminal .fg-20 { + --fg: #0000d7; +} +.ap-terminal .bg-20 { + --bg: #0000d7; +} +.ap-terminal .fg-21 { + --fg: #0000ff; +} +.ap-terminal .bg-21 { + --bg: #0000ff; +} +.ap-terminal .fg-22 { + --fg: #005f00; +} +.ap-terminal .bg-22 { + --bg: #005f00; +} +.ap-terminal .fg-23 { + --fg: #005f5f; +} +.ap-terminal .bg-23 { + --bg: #005f5f; +} +.ap-terminal .fg-24 { + --fg: #005f87; +} +.ap-terminal .bg-24 { + --bg: #005f87; +} +.ap-terminal .fg-25 { + --fg: #005faf; +} +.ap-terminal .bg-25 { + --bg: #005faf; +} +.ap-terminal .fg-26 { + --fg: #005fd7; +} +.ap-terminal .bg-26 { + --bg: #005fd7; +} +.ap-terminal .fg-27 { + --fg: #005fff; +} +.ap-terminal .bg-27 { + --bg: #005fff; +} +.ap-terminal .fg-28 { + --fg: #008700; +} +.ap-terminal .bg-28 { + --bg: #008700; +} +.ap-terminal .fg-29 { + --fg: #00875f; +} +.ap-terminal .bg-29 { + --bg: #00875f; +} +.ap-terminal .fg-30 { + --fg: #008787; +} +.ap-terminal .bg-30 { + --bg: #008787; +} +.ap-terminal .fg-31 { + --fg: #0087af; +} +.ap-terminal .bg-31 { + --bg: #0087af; +} +.ap-terminal .fg-32 { + --fg: #0087d7; +} +.ap-terminal .bg-32 { + --bg: #0087d7; +} +.ap-terminal .fg-33 { + --fg: #0087ff; +} +.ap-terminal .bg-33 { + --bg: #0087ff; +} +.ap-terminal .fg-34 { + --fg: #00af00; +} +.ap-terminal .bg-34 { + --bg: #00af00; +} +.ap-terminal .fg-35 { + --fg: #00af5f; +} +.ap-terminal .bg-35 { + --bg: #00af5f; +} +.ap-terminal .fg-36 { + --fg: #00af87; +} +.ap-terminal .bg-36 { + --bg: #00af87; +} +.ap-terminal .fg-37 { + --fg: #00afaf; +} +.ap-terminal .bg-37 { + --bg: #00afaf; +} +.ap-terminal .fg-38 { + --fg: #00afd7; +} +.ap-terminal .bg-38 { + --bg: #00afd7; +} +.ap-terminal .fg-39 { + --fg: #00afff; +} +.ap-terminal .bg-39 { + --bg: #00afff; +} +.ap-terminal .fg-40 { + --fg: #00d700; +} +.ap-terminal .bg-40 { + --bg: #00d700; +} +.ap-terminal .fg-41 { + --fg: #00d75f; +} +.ap-terminal .bg-41 { + --bg: #00d75f; +} +.ap-terminal .fg-42 { + --fg: #00d787; +} +.ap-terminal .bg-42 { + --bg: #00d787; +} +.ap-terminal .fg-43 { + --fg: #00d7af; +} +.ap-terminal .bg-43 { + --bg: #00d7af; +} +.ap-terminal .fg-44 { + --fg: #00d7d7; +} +.ap-terminal .bg-44 { + --bg: #00d7d7; +} +.ap-terminal .fg-45 { + --fg: #00d7ff; +} +.ap-terminal .bg-45 { + --bg: #00d7ff; +} +.ap-terminal .fg-46 { + --fg: #00ff00; +} +.ap-terminal .bg-46 { + --bg: #00ff00; +} +.ap-terminal .fg-47 { + --fg: #00ff5f; +} +.ap-terminal .bg-47 { + --bg: #00ff5f; +} +.ap-terminal .fg-48 { + --fg: #00ff87; +} +.ap-terminal .bg-48 { + --bg: #00ff87; +} +.ap-terminal .fg-49 { + --fg: #00ffaf; +} +.ap-terminal .bg-49 { + --bg: #00ffaf; +} +.ap-terminal .fg-50 { + --fg: #00ffd7; +} +.ap-terminal .bg-50 { + --bg: #00ffd7; +} +.ap-terminal .fg-51 { + --fg: #00ffff; +} +.ap-terminal .bg-51 { + --bg: #00ffff; +} +.ap-terminal .fg-52 { + --fg: #5f0000; +} +.ap-terminal .bg-52 { + --bg: #5f0000; +} +.ap-terminal .fg-53 { + --fg: #5f005f; +} +.ap-terminal .bg-53 { + --bg: #5f005f; +} +.ap-terminal .fg-54 { + --fg: #5f0087; +} +.ap-terminal .bg-54 { + --bg: #5f0087; +} +.ap-terminal .fg-55 { + --fg: #5f00af; +} +.ap-terminal .bg-55 { + --bg: #5f00af; +} +.ap-terminal .fg-56 { + --fg: #5f00d7; +} +.ap-terminal .bg-56 { + --bg: #5f00d7; +} +.ap-terminal .fg-57 { + --fg: #5f00ff; +} +.ap-terminal .bg-57 { + --bg: #5f00ff; +} +.ap-terminal .fg-58 { + --fg: #5f5f00; +} +.ap-terminal .bg-58 { + --bg: #5f5f00; +} +.ap-terminal .fg-59 { + --fg: #5f5f5f; +} +.ap-terminal .bg-59 { + --bg: #5f5f5f; +} +.ap-terminal .fg-60 { + --fg: #5f5f87; +} +.ap-terminal .bg-60 { + --bg: #5f5f87; +} +.ap-terminal .fg-61 { + --fg: #5f5faf; +} +.ap-terminal .bg-61 { + --bg: #5f5faf; +} +.ap-terminal .fg-62 { + --fg: #5f5fd7; +} +.ap-terminal .bg-62 { + --bg: #5f5fd7; +} +.ap-terminal .fg-63 { + --fg: #5f5fff; +} +.ap-terminal .bg-63 { + --bg: #5f5fff; +} +.ap-terminal .fg-64 { + --fg: #5f8700; +} +.ap-terminal .bg-64 { + --bg: #5f8700; +} +.ap-terminal .fg-65 { + --fg: #5f875f; +} +.ap-terminal .bg-65 { + --bg: #5f875f; +} +.ap-terminal .fg-66 { + --fg: #5f8787; +} +.ap-terminal .bg-66 { + --bg: #5f8787; +} +.ap-terminal .fg-67 { + --fg: #5f87af; +} +.ap-terminal .bg-67 { + --bg: #5f87af; +} +.ap-terminal .fg-68 { + --fg: #5f87d7; +} +.ap-terminal .bg-68 { + --bg: #5f87d7; +} +.ap-terminal .fg-69 { + --fg: #5f87ff; +} +.ap-terminal .bg-69 { + --bg: #5f87ff; +} +.ap-terminal .fg-70 { + --fg: #5faf00; +} +.ap-terminal .bg-70 { + --bg: #5faf00; +} +.ap-terminal .fg-71 { + --fg: #5faf5f; +} +.ap-terminal .bg-71 { + --bg: #5faf5f; +} +.ap-terminal .fg-72 { + --fg: #5faf87; +} +.ap-terminal .bg-72 { + --bg: #5faf87; +} +.ap-terminal .fg-73 { + --fg: #5fafaf; +} +.ap-terminal .bg-73 { + --bg: #5fafaf; +} +.ap-terminal .fg-74 { + --fg: #5fafd7; +} +.ap-terminal .bg-74 { + --bg: #5fafd7; +} +.ap-terminal .fg-75 { + --fg: #5fafff; +} +.ap-terminal .bg-75 { + --bg: #5fafff; +} +.ap-terminal .fg-76 { + --fg: #5fd700; +} +.ap-terminal .bg-76 { + --bg: #5fd700; +} +.ap-terminal .fg-77 { + --fg: #5fd75f; +} +.ap-terminal .bg-77 { + --bg: #5fd75f; +} +.ap-terminal .fg-78 { + --fg: #5fd787; +} +.ap-terminal .bg-78 { + --bg: #5fd787; +} +.ap-terminal .fg-79 { + --fg: #5fd7af; +} +.ap-terminal .bg-79 { + --bg: #5fd7af; +} +.ap-terminal .fg-80 { + --fg: #5fd7d7; +} +.ap-terminal .bg-80 { + --bg: #5fd7d7; +} +.ap-terminal .fg-81 { + --fg: #5fd7ff; +} +.ap-terminal .bg-81 { + --bg: #5fd7ff; +} +.ap-terminal .fg-82 { + --fg: #5fff00; +} +.ap-terminal .bg-82 { + --bg: #5fff00; +} +.ap-terminal .fg-83 { + --fg: #5fff5f; +} +.ap-terminal .bg-83 { + --bg: #5fff5f; +} +.ap-terminal .fg-84 { + --fg: #5fff87; +} +.ap-terminal .bg-84 { + --bg: #5fff87; +} +.ap-terminal .fg-85 { + --fg: #5fffaf; +} +.ap-terminal .bg-85 { + --bg: #5fffaf; +} +.ap-terminal .fg-86 { + --fg: #5fffd7; +} +.ap-terminal .bg-86 { + --bg: #5fffd7; +} +.ap-terminal .fg-87 { + --fg: #5fffff; +} +.ap-terminal .bg-87 { + --bg: #5fffff; +} +.ap-terminal .fg-88 { + --fg: #870000; +} +.ap-terminal .bg-88 { + --bg: #870000; +} +.ap-terminal .fg-89 { + --fg: #87005f; +} +.ap-terminal .bg-89 { + --bg: #87005f; +} +.ap-terminal .fg-90 { + --fg: #870087; +} +.ap-terminal .bg-90 { + --bg: #870087; +} +.ap-terminal .fg-91 { + --fg: #8700af; +} +.ap-terminal .bg-91 { + --bg: #8700af; +} +.ap-terminal .fg-92 { + --fg: #8700d7; +} +.ap-terminal .bg-92 { + --bg: #8700d7; +} +.ap-terminal .fg-93 { + --fg: #8700ff; +} +.ap-terminal .bg-93 { + --bg: #8700ff; +} +.ap-terminal .fg-94 { + --fg: #875f00; +} +.ap-terminal .bg-94 { + --bg: #875f00; +} +.ap-terminal .fg-95 { + --fg: #875f5f; +} +.ap-terminal .bg-95 { + --bg: #875f5f; +} +.ap-terminal .fg-96 { + --fg: #875f87; +} +.ap-terminal .bg-96 { + --bg: #875f87; +} +.ap-terminal .fg-97 { + --fg: #875faf; +} +.ap-terminal .bg-97 { + --bg: #875faf; +} +.ap-terminal .fg-98 { + --fg: #875fd7; +} +.ap-terminal .bg-98 { + --bg: #875fd7; +} +.ap-terminal .fg-99 { + --fg: #875fff; +} +.ap-terminal .bg-99 { + --bg: #875fff; +} +.ap-terminal .fg-100 { + --fg: #878700; +} +.ap-terminal .bg-100 { + --bg: #878700; +} +.ap-terminal .fg-101 { + --fg: #87875f; +} +.ap-terminal .bg-101 { + --bg: #87875f; +} +.ap-terminal .fg-102 { + --fg: #878787; +} +.ap-terminal .bg-102 { + --bg: #878787; +} +.ap-terminal .fg-103 { + --fg: #8787af; +} +.ap-terminal .bg-103 { + --bg: #8787af; +} +.ap-terminal .fg-104 { + --fg: #8787d7; +} +.ap-terminal .bg-104 { + --bg: #8787d7; +} +.ap-terminal .fg-105 { + --fg: #8787ff; +} +.ap-terminal .bg-105 { + --bg: #8787ff; +} +.ap-terminal .fg-106 { + --fg: #87af00; +} +.ap-terminal .bg-106 { + --bg: #87af00; +} +.ap-terminal .fg-107 { + --fg: #87af5f; +} +.ap-terminal .bg-107 { + --bg: #87af5f; +} +.ap-terminal .fg-108 { + --fg: #87af87; +} +.ap-terminal .bg-108 { + --bg: #87af87; +} +.ap-terminal .fg-109 { + --fg: #87afaf; +} +.ap-terminal .bg-109 { + --bg: #87afaf; +} +.ap-terminal .fg-110 { + --fg: #87afd7; +} +.ap-terminal .bg-110 { + --bg: #87afd7; +} +.ap-terminal .fg-111 { + --fg: #87afff; +} +.ap-terminal .bg-111 { + --bg: #87afff; +} +.ap-terminal .fg-112 { + --fg: #87d700; +} +.ap-terminal .bg-112 { + --bg: #87d700; +} +.ap-terminal .fg-113 { + --fg: #87d75f; +} +.ap-terminal .bg-113 { + --bg: #87d75f; +} +.ap-terminal .fg-114 { + --fg: #87d787; +} +.ap-terminal .bg-114 { + --bg: #87d787; +} +.ap-terminal .fg-115 { + --fg: #87d7af; +} +.ap-terminal .bg-115 { + --bg: #87d7af; +} +.ap-terminal .fg-116 { + --fg: #87d7d7; +} +.ap-terminal .bg-116 { + --bg: #87d7d7; +} +.ap-terminal .fg-117 { + --fg: #87d7ff; +} +.ap-terminal .bg-117 { + --bg: #87d7ff; +} +.ap-terminal .fg-118 { + --fg: #87ff00; +} +.ap-terminal .bg-118 { + --bg: #87ff00; +} +.ap-terminal .fg-119 { + --fg: #87ff5f; +} +.ap-terminal .bg-119 { + --bg: #87ff5f; +} +.ap-terminal .fg-120 { + --fg: #87ff87; +} +.ap-terminal .bg-120 { + --bg: #87ff87; +} +.ap-terminal .fg-121 { + --fg: #87ffaf; +} +.ap-terminal .bg-121 { + --bg: #87ffaf; +} +.ap-terminal .fg-122 { + --fg: #87ffd7; +} +.ap-terminal .bg-122 { + --bg: #87ffd7; +} +.ap-terminal .fg-123 { + --fg: #87ffff; +} +.ap-terminal .bg-123 { + --bg: #87ffff; +} +.ap-terminal .fg-124 { + --fg: #af0000; +} +.ap-terminal .bg-124 { + --bg: #af0000; +} +.ap-terminal .fg-125 { + --fg: #af005f; +} +.ap-terminal .bg-125 { + --bg: #af005f; +} +.ap-terminal .fg-126 { + --fg: #af0087; +} +.ap-terminal .bg-126 { + --bg: #af0087; +} +.ap-terminal .fg-127 { + --fg: #af00af; +} +.ap-terminal .bg-127 { + --bg: #af00af; +} +.ap-terminal .fg-128 { + --fg: #af00d7; +} +.ap-terminal .bg-128 { + --bg: #af00d7; +} +.ap-terminal .fg-129 { + --fg: #af00ff; +} +.ap-terminal .bg-129 { + --bg: #af00ff; +} +.ap-terminal .fg-130 { + --fg: #af5f00; +} +.ap-terminal .bg-130 { + --bg: #af5f00; +} +.ap-terminal .fg-131 { + --fg: #af5f5f; +} +.ap-terminal .bg-131 { + --bg: #af5f5f; +} +.ap-terminal .fg-132 { + --fg: #af5f87; +} +.ap-terminal .bg-132 { + --bg: #af5f87; +} +.ap-terminal .fg-133 { + --fg: #af5faf; +} +.ap-terminal .bg-133 { + --bg: #af5faf; +} +.ap-terminal .fg-134 { + --fg: #af5fd7; +} +.ap-terminal .bg-134 { + --bg: #af5fd7; +} +.ap-terminal .fg-135 { + --fg: #af5fff; +} +.ap-terminal .bg-135 { + --bg: #af5fff; +} +.ap-terminal .fg-136 { + --fg: #af8700; +} +.ap-terminal .bg-136 { + --bg: #af8700; +} +.ap-terminal .fg-137 { + --fg: #af875f; +} +.ap-terminal .bg-137 { + --bg: #af875f; +} +.ap-terminal .fg-138 { + --fg: #af8787; +} +.ap-terminal .bg-138 { + --bg: #af8787; +} +.ap-terminal .fg-139 { + --fg: #af87af; +} +.ap-terminal .bg-139 { + --bg: #af87af; +} +.ap-terminal .fg-140 { + --fg: #af87d7; +} +.ap-terminal .bg-140 { + --bg: #af87d7; +} +.ap-terminal .fg-141 { + --fg: #af87ff; +} +.ap-terminal .bg-141 { + --bg: #af87ff; +} +.ap-terminal .fg-142 { + --fg: #afaf00; +} +.ap-terminal .bg-142 { + --bg: #afaf00; +} +.ap-terminal .fg-143 { + --fg: #afaf5f; +} +.ap-terminal .bg-143 { + --bg: #afaf5f; +} +.ap-terminal .fg-144 { + --fg: #afaf87; +} +.ap-terminal .bg-144 { + --bg: #afaf87; +} +.ap-terminal .fg-145 { + --fg: #afafaf; +} +.ap-terminal .bg-145 { + --bg: #afafaf; +} +.ap-terminal .fg-146 { + --fg: #afafd7; +} +.ap-terminal .bg-146 { + --bg: #afafd7; +} +.ap-terminal .fg-147 { + --fg: #afafff; +} +.ap-terminal .bg-147 { + --bg: #afafff; +} +.ap-terminal .fg-148 { + --fg: #afd700; +} +.ap-terminal .bg-148 { + --bg: #afd700; +} +.ap-terminal .fg-149 { + --fg: #afd75f; +} +.ap-terminal .bg-149 { + --bg: #afd75f; +} +.ap-terminal .fg-150 { + --fg: #afd787; +} +.ap-terminal .bg-150 { + --bg: #afd787; +} +.ap-terminal .fg-151 { + --fg: #afd7af; +} +.ap-terminal .bg-151 { + --bg: #afd7af; +} +.ap-terminal .fg-152 { + --fg: #afd7d7; +} +.ap-terminal .bg-152 { + --bg: #afd7d7; +} +.ap-terminal .fg-153 { + --fg: #afd7ff; +} +.ap-terminal .bg-153 { + --bg: #afd7ff; +} +.ap-terminal .fg-154 { + --fg: #afff00; +} +.ap-terminal .bg-154 { + --bg: #afff00; +} +.ap-terminal .fg-155 { + --fg: #afff5f; +} +.ap-terminal .bg-155 { + --bg: #afff5f; +} +.ap-terminal .fg-156 { + --fg: #afff87; +} +.ap-terminal .bg-156 { + --bg: #afff87; +} +.ap-terminal .fg-157 { + --fg: #afffaf; +} +.ap-terminal .bg-157 { + --bg: #afffaf; +} +.ap-terminal .fg-158 { + --fg: #afffd7; +} +.ap-terminal .bg-158 { + --bg: #afffd7; +} +.ap-terminal .fg-159 { + --fg: #afffff; +} +.ap-terminal .bg-159 { + --bg: #afffff; +} +.ap-terminal .fg-160 { + --fg: #d70000; +} +.ap-terminal .bg-160 { + --bg: #d70000; +} +.ap-terminal .fg-161 { + --fg: #d7005f; +} +.ap-terminal .bg-161 { + --bg: #d7005f; +} +.ap-terminal .fg-162 { + --fg: #d70087; +} +.ap-terminal .bg-162 { + --bg: #d70087; +} +.ap-terminal .fg-163 { + --fg: #d700af; +} +.ap-terminal .bg-163 { + --bg: #d700af; +} +.ap-terminal .fg-164 { + --fg: #d700d7; +} +.ap-terminal .bg-164 { + --bg: #d700d7; +} +.ap-terminal .fg-165 { + --fg: #d700ff; +} +.ap-terminal .bg-165 { + --bg: #d700ff; +} +.ap-terminal .fg-166 { + --fg: #d75f00; +} +.ap-terminal .bg-166 { + --bg: #d75f00; +} +.ap-terminal .fg-167 { + --fg: #d75f5f; +} +.ap-terminal .bg-167 { + --bg: #d75f5f; +} +.ap-terminal .fg-168 { + --fg: #d75f87; +} +.ap-terminal .bg-168 { + --bg: #d75f87; +} +.ap-terminal .fg-169 { + --fg: #d75faf; +} +.ap-terminal .bg-169 { + --bg: #d75faf; +} +.ap-terminal .fg-170 { + --fg: #d75fd7; +} +.ap-terminal .bg-170 { + --bg: #d75fd7; +} +.ap-terminal .fg-171 { + --fg: #d75fff; +} +.ap-terminal .bg-171 { + --bg: #d75fff; +} +.ap-terminal .fg-172 { + --fg: #d78700; +} +.ap-terminal .bg-172 { + --bg: #d78700; +} +.ap-terminal .fg-173 { + --fg: #d7875f; +} +.ap-terminal .bg-173 { + --bg: #d7875f; +} +.ap-terminal .fg-174 { + --fg: #d78787; +} +.ap-terminal .bg-174 { + --bg: #d78787; +} +.ap-terminal .fg-175 { + --fg: #d787af; +} +.ap-terminal .bg-175 { + --bg: #d787af; +} +.ap-terminal .fg-176 { + --fg: #d787d7; +} +.ap-terminal .bg-176 { + --bg: #d787d7; +} +.ap-terminal .fg-177 { + --fg: #d787ff; +} +.ap-terminal .bg-177 { + --bg: #d787ff; +} +.ap-terminal .fg-178 { + --fg: #d7af00; +} +.ap-terminal .bg-178 { + --bg: #d7af00; +} +.ap-terminal .fg-179 { + --fg: #d7af5f; +} +.ap-terminal .bg-179 { + --bg: #d7af5f; +} +.ap-terminal .fg-180 { + --fg: #d7af87; +} +.ap-terminal .bg-180 { + --bg: #d7af87; +} +.ap-terminal .fg-181 { + --fg: #d7afaf; +} +.ap-terminal .bg-181 { + --bg: #d7afaf; +} +.ap-terminal .fg-182 { + --fg: #d7afd7; +} +.ap-terminal .bg-182 { + --bg: #d7afd7; +} +.ap-terminal .fg-183 { + --fg: #d7afff; +} +.ap-terminal .bg-183 { + --bg: #d7afff; +} +.ap-terminal .fg-184 { + --fg: #d7d700; +} +.ap-terminal .bg-184 { + --bg: #d7d700; +} +.ap-terminal .fg-185 { + --fg: #d7d75f; +} +.ap-terminal .bg-185 { + --bg: #d7d75f; +} +.ap-terminal .fg-186 { + --fg: #d7d787; +} +.ap-terminal .bg-186 { + --bg: #d7d787; +} +.ap-terminal .fg-187 { + --fg: #d7d7af; +} +.ap-terminal .bg-187 { + --bg: #d7d7af; +} +.ap-terminal .fg-188 { + --fg: #d7d7d7; +} +.ap-terminal .bg-188 { + --bg: #d7d7d7; +} +.ap-terminal .fg-189 { + --fg: #d7d7ff; +} +.ap-terminal .bg-189 { + --bg: #d7d7ff; +} +.ap-terminal .fg-190 { + --fg: #d7ff00; +} +.ap-terminal .bg-190 { + --bg: #d7ff00; +} +.ap-terminal .fg-191 { + --fg: #d7ff5f; +} +.ap-terminal .bg-191 { + --bg: #d7ff5f; +} +.ap-terminal .fg-192 { + --fg: #d7ff87; +} +.ap-terminal .bg-192 { + --bg: #d7ff87; +} +.ap-terminal .fg-193 { + --fg: #d7ffaf; +} +.ap-terminal .bg-193 { + --bg: #d7ffaf; +} +.ap-terminal .fg-194 { + --fg: #d7ffd7; +} +.ap-terminal .bg-194 { + --bg: #d7ffd7; +} +.ap-terminal .fg-195 { + --fg: #d7ffff; +} +.ap-terminal .bg-195 { + --bg: #d7ffff; +} +.ap-terminal .fg-196 { + --fg: #ff0000; +} +.ap-terminal .bg-196 { + --bg: #ff0000; +} +.ap-terminal .fg-197 { + --fg: #ff005f; +} +.ap-terminal .bg-197 { + --bg: #ff005f; +} +.ap-terminal .fg-198 { + --fg: #ff0087; +} +.ap-terminal .bg-198 { + --bg: #ff0087; +} +.ap-terminal .fg-199 { + --fg: #ff00af; +} +.ap-terminal .bg-199 { + --bg: #ff00af; +} +.ap-terminal .fg-200 { + --fg: #ff00d7; +} +.ap-terminal .bg-200 { + --bg: #ff00d7; +} +.ap-terminal .fg-201 { + --fg: #ff00ff; +} +.ap-terminal .bg-201 { + --bg: #ff00ff; +} +.ap-terminal .fg-202 { + --fg: #ff5f00; +} +.ap-terminal .bg-202 { + --bg: #ff5f00; +} +.ap-terminal .fg-203 { + --fg: #ff5f5f; +} +.ap-terminal .bg-203 { + --bg: #ff5f5f; +} +.ap-terminal .fg-204 { + --fg: #ff5f87; +} +.ap-terminal .bg-204 { + --bg: #ff5f87; +} +.ap-terminal .fg-205 { + --fg: #ff5faf; +} +.ap-terminal .bg-205 { + --bg: #ff5faf; +} +.ap-terminal .fg-206 { + --fg: #ff5fd7; +} +.ap-terminal .bg-206 { + --bg: #ff5fd7; +} +.ap-terminal .fg-207 { + --fg: #ff5fff; +} +.ap-terminal .bg-207 { + --bg: #ff5fff; +} +.ap-terminal .fg-208 { + --fg: #ff8700; +} +.ap-terminal .bg-208 { + --bg: #ff8700; +} +.ap-terminal .fg-209 { + --fg: #ff875f; +} +.ap-terminal .bg-209 { + --bg: #ff875f; +} +.ap-terminal .fg-210 { + --fg: #ff8787; +} +.ap-terminal .bg-210 { + --bg: #ff8787; +} +.ap-terminal .fg-211 { + --fg: #ff87af; +} +.ap-terminal .bg-211 { + --bg: #ff87af; +} +.ap-terminal .fg-212 { + --fg: #ff87d7; +} +.ap-terminal .bg-212 { + --bg: #ff87d7; +} +.ap-terminal .fg-213 { + --fg: #ff87ff; +} +.ap-terminal .bg-213 { + --bg: #ff87ff; +} +.ap-terminal .fg-214 { + --fg: #ffaf00; +} +.ap-terminal .bg-214 { + --bg: #ffaf00; +} +.ap-terminal .fg-215 { + --fg: #ffaf5f; +} +.ap-terminal .bg-215 { + --bg: #ffaf5f; +} +.ap-terminal .fg-216 { + --fg: #ffaf87; +} +.ap-terminal .bg-216 { + --bg: #ffaf87; +} +.ap-terminal .fg-217 { + --fg: #ffafaf; +} +.ap-terminal .bg-217 { + --bg: #ffafaf; +} +.ap-terminal .fg-218 { + --fg: #ffafd7; +} +.ap-terminal .bg-218 { + --bg: #ffafd7; +} +.ap-terminal .fg-219 { + --fg: #ffafff; +} +.ap-terminal .bg-219 { + --bg: #ffafff; +} +.ap-terminal .fg-220 { + --fg: #ffd700; +} +.ap-terminal .bg-220 { + --bg: #ffd700; +} +.ap-terminal .fg-221 { + --fg: #ffd75f; +} +.ap-terminal .bg-221 { + --bg: #ffd75f; +} +.ap-terminal .fg-222 { + --fg: #ffd787; +} +.ap-terminal .bg-222 { + --bg: #ffd787; +} +.ap-terminal .fg-223 { + --fg: #ffd7af; +} +.ap-terminal .bg-223 { + --bg: #ffd7af; +} +.ap-terminal .fg-224 { + --fg: #ffd7d7; +} +.ap-terminal .bg-224 { + --bg: #ffd7d7; +} +.ap-terminal .fg-225 { + --fg: #ffd7ff; +} +.ap-terminal .bg-225 { + --bg: #ffd7ff; +} +.ap-terminal .fg-226 { + --fg: #ffff00; +} +.ap-terminal .bg-226 { + --bg: #ffff00; +} +.ap-terminal .fg-227 { + --fg: #ffff5f; +} +.ap-terminal .bg-227 { + --bg: #ffff5f; +} +.ap-terminal .fg-228 { + --fg: #ffff87; +} +.ap-terminal .bg-228 { + --bg: #ffff87; +} +.ap-terminal .fg-229 { + --fg: #ffffaf; +} +.ap-terminal .bg-229 { + --bg: #ffffaf; +} +.ap-terminal .fg-230 { + --fg: #ffffd7; +} +.ap-terminal .bg-230 { + --bg: #ffffd7; +} +.ap-terminal .fg-231 { + --fg: #ffffff; +} +.ap-terminal .bg-231 { + --bg: #ffffff; +} +.ap-terminal .fg-232 { + --fg: #080808; +} +.ap-terminal .bg-232 { + --bg: #080808; +} +.ap-terminal .fg-233 { + --fg: #121212; +} +.ap-terminal .bg-233 { + --bg: #121212; +} +.ap-terminal .fg-234 { + --fg: #1c1c1c; +} +.ap-terminal .bg-234 { + --bg: #1c1c1c; +} +.ap-terminal .fg-235 { + --fg: #262626; +} +.ap-terminal .bg-235 { + --bg: #262626; +} +.ap-terminal .fg-236 { + --fg: #303030; +} +.ap-terminal .bg-236 { + --bg: #303030; +} +.ap-terminal .fg-237 { + --fg: #3a3a3a; +} +.ap-terminal .bg-237 { + --bg: #3a3a3a; +} +.ap-terminal .fg-238 { + --fg: #444444; +} +.ap-terminal .bg-238 { + --bg: #444444; +} +.ap-terminal .fg-239 { + --fg: #4e4e4e; +} +.ap-terminal .bg-239 { + --bg: #4e4e4e; +} +.ap-terminal .fg-240 { + --fg: #585858; +} +.ap-terminal .bg-240 { + --bg: #585858; +} +.ap-terminal .fg-241 { + --fg: #626262; +} +.ap-terminal .bg-241 { + --bg: #626262; +} +.ap-terminal .fg-242 { + --fg: #6c6c6c; +} +.ap-terminal .bg-242 { + --bg: #6c6c6c; +} +.ap-terminal .fg-243 { + --fg: #767676; +} +.ap-terminal .bg-243 { + --bg: #767676; +} +.ap-terminal .fg-244 { + --fg: #808080; +} +.ap-terminal .bg-244 { + --bg: #808080; +} +.ap-terminal .fg-245 { + --fg: #8a8a8a; +} +.ap-terminal .bg-245 { + --bg: #8a8a8a; +} +.ap-terminal .fg-246 { + --fg: #949494; +} +.ap-terminal .bg-246 { + --bg: #949494; +} +.ap-terminal .fg-247 { + --fg: #9e9e9e; +} +.ap-terminal .bg-247 { + --bg: #9e9e9e; +} +.ap-terminal .fg-248 { + --fg: #a8a8a8; +} +.ap-terminal .bg-248 { + --bg: #a8a8a8; +} +.ap-terminal .fg-249 { + --fg: #b2b2b2; +} +.ap-terminal .bg-249 { + --bg: #b2b2b2; +} +.ap-terminal .fg-250 { + --fg: #bcbcbc; +} +.ap-terminal .bg-250 { + --bg: #bcbcbc; +} +.ap-terminal .fg-251 { + --fg: #c6c6c6; +} +.ap-terminal .bg-251 { + --bg: #c6c6c6; +} +.ap-terminal .fg-252 { + --fg: #d0d0d0; +} +.ap-terminal .bg-252 { + --bg: #d0d0d0; +} +.ap-terminal .fg-253 { + --fg: #dadada; +} +.ap-terminal .bg-253 { + --bg: #dadada; +} +.ap-terminal .fg-254 { + --fg: #e4e4e4; +} +.ap-terminal .bg-254 { + --bg: #e4e4e4; +} +.ap-terminal .fg-255 { + --fg: #eeeeee; +} +.ap-terminal .bg-255 { + --bg: #eeeeee; +} +.asciinema-player-theme-asciinema { + --term-color-foreground: #cccccc; + --term-color-background: #121314; + --term-color-0: hsl(0, 0%, 0%); + --term-color-1: hsl(343, 70%, 55%); + --term-color-2: hsl(103, 70%, 44%); + --term-color-3: hsl(43, 70%, 55%); + --term-color-4: hsl(193, 70%, 49.5%); + --term-color-5: hsl(283, 70%, 60.5%); + --term-color-6: hsl(163, 70%, 60.5%); + --term-color-7: hsl(0, 0%, 85%); + --term-color-8: hsl(0, 0%, 30%); + --term-color-9: hsl(343, 70%, 55%); + --term-color-10: hsl(103, 70%, 44%); + --term-color-11: hsl(43, 70%, 55%); + --term-color-12: hsl(193, 70%, 49.5%); + --term-color-13: hsl(283, 70%, 60.5%); + --term-color-14: hsl(163, 70%, 60.5%); + --term-color-15: hsl(0, 0%, 100%); +} +/* + Based on Dracula: https://draculatheme.com + */ +.asciinema-player-theme-dracula { + --term-color-foreground: #f8f8f2; + --term-color-background: #282a36; + --term-color-0: #21222c; + --term-color-1: #ff5555; + --term-color-2: #50fa7b; + --term-color-3: #f1fa8c; + --term-color-4: #bd93f9; + --term-color-5: #ff79c6; + --term-color-6: #8be9fd; + --term-color-7: #f8f8f2; + --term-color-8: #6272a4; + --term-color-9: #ff6e6e; + --term-color-10: #69ff94; + --term-color-11: #ffffa5; + --term-color-12: #d6acff; + --term-color-13: #ff92df; + --term-color-14: #a4ffff; + --term-color-15: #ffffff; +} +/* Based on Monokai from base16 collection - https://github.com/chriskempson/base16 */ +.asciinema-player-theme-monokai { + --term-color-foreground: #f8f8f2; + --term-color-background: #272822; + --term-color-0: #272822; + --term-color-1: #f92672; + --term-color-2: #a6e22e; + --term-color-3: #f4bf75; + --term-color-4: #66d9ef; + --term-color-5: #ae81ff; + --term-color-6: #a1efe4; + --term-color-7: #f8f8f2; + --term-color-8: #75715e; + --term-color-15: #f9f8f5; +} +/* + Based on Nord: https://github.com/arcticicestudio/nord + Via: https://github.com/neilotoole/asciinema-theme-nord + */ +.asciinema-player-theme-nord { + --term-color-foreground: #eceff4; + --term-color-background: #2e3440; + --term-color-0: #3b4252; + --term-color-1: #bf616a; + --term-color-2: #a3be8c; + --term-color-3: #ebcb8b; + --term-color-4: #81a1c1; + --term-color-5: #b48ead; + --term-color-6: #88c0d0; + --term-color-7: #eceff4; +} +.asciinema-player-theme-seti { + --term-color-foreground: #cacecd; + --term-color-background: #111213; + --term-color-0: #323232; + --term-color-1: #c22832; + --term-color-2: #8ec43d; + --term-color-3: #e0c64f; + --term-color-4: #43a5d5; + --term-color-5: #8b57b5; + --term-color-6: #8ec43d; + --term-color-7: #eeeeee; + --term-color-15: #ffffff; +} +/* + Based on Solarized Dark: https://ethanschoonover.com/solarized/ + */ +.asciinema-player-theme-solarized-dark { + --term-color-foreground: #839496; + --term-color-background: #002b36; + --term-color-0: #073642; + --term-color-1: #dc322f; + --term-color-2: #859900; + --term-color-3: #b58900; + --term-color-4: #268bd2; + --term-color-5: #d33682; + --term-color-6: #2aa198; + --term-color-7: #eee8d5; + --term-color-8: #002b36; + --term-color-9: #cb4b16; + --term-color-10: #586e75; + --term-color-11: #657b83; + --term-color-12: #839496; + --term-color-13: #6c71c4; + --term-color-14: #93a1a1; + --term-color-15: #fdf6e3; +} +/* + Based on Solarized Light: https://ethanschoonover.com/solarized/ + */ +.asciinema-player-theme-solarized-light { + --term-color-foreground: #657b83; + --term-color-background: #fdf6e3; + --term-color-0: #073642; + --term-color-1: #dc322f; + --term-color-2: #859900; + --term-color-3: #b58900; + --term-color-4: #268bd2; + --term-color-5: #d33682; + --term-color-6: #2aa198; + --term-color-7: #eee8d5; + --term-color-8: #002b36; + --term-color-9: #cb4b16; + --term-color-10: #586e75; + --term-color-11: #657c83; + --term-color-12: #839496; + --term-color-13: #6c71c4; + --term-color-14: #93a1a1; + --term-color-15: #fdf6e3; +} +.asciinema-player-theme-solarized-light .ap-overlay-start .ap-play-button svg .ap-play-btn-fill { + fill: var(--term-color-1); +} +.asciinema-player-theme-solarized-light .ap-overlay-start .ap-play-button svg .ap-play-btn-stroke { + stroke: var(--term-color-1); +} +/* + Based on Tango: https://en.wikipedia.org/wiki/Tango_Desktop_Project + */ +.asciinema-player-theme-tango { + --term-color-foreground: #cccccc; + --term-color-background: #121314; + --term-color-0: #000000; + --term-color-1: #cc0000; + --term-color-2: #4e9a06; + --term-color-3: #c4a000; + --term-color-4: #3465a4; + --term-color-5: #75507b; + --term-color-6: #06989a; + --term-color-7: #d3d7cf; + --term-color-8: #555753; + --term-color-9: #ef2929; + --term-color-10: #8ae234; + --term-color-11: #fce94f; + --term-color-12: #729fcf; + --term-color-13: #ad7fa8; + --term-color-14: #34e2e2; + --term-color-15: #eeeeec; +} diff --git a/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/asciinema-player.min.js b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/asciinema-player.min.js new file mode 100644 index 00000000..85f30888 --- /dev/null +++ b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/asciinema-player.min.js @@ -0,0 +1 @@ +var AsciinemaPlayer=function(A){"use strict";const g={};const I=Symbol("solid-proxy"),B=Symbol("solid-track"),Q={equals:(A,g)=>A===g};let C=q;const E=1,e=2,i={owned:null,cleanups:null,context:null,owner:null};var V=null;let t=null,o=null,s=null,n=null,r=0;function a(A,g){const I=o,B=V,Q=0===A.length,C=Q?i:{owned:null,cleanups:null,context:null,owner:void 0===g?B:g},E=Q?A:()=>A((()=>l((()=>S(C)))));V=C,o=null;try{return R(E,!0)}finally{o=I,V=B}}function c(A,g){const I={value:A,observers:null,observerSlots:null,comparator:(g=g?Object.assign({},Q,g):Q).equals||void 0};return[F.bind(I),A=>("function"==typeof A&&(A=A(I.value)),d(I,A))]}function w(A,g,I){u(N(A,g,!1,E))}function D(A,g,I){I=I?Object.assign({},Q,I):Q;const B=N(A,g,!0,0);return B.observers=null,B.observerSlots=null,B.comparator=I.equals||void 0,u(B),F.bind(B)}function h(A){return R(A,!1)}function l(A){if(null===o)return A();const g=o;o=null;try{return A()}finally{o=g}}function M(A){!function(A,g,I){C=J;const B=N(A,g,!1,E);B.user=!0,n?n.push(B):u(B)}((()=>l(A)))}function y(A){return null===V||(null===V.cleanups?V.cleanups=[A]:V.cleanups.push(A)),A}function G(){return o}function k(A){const g=D(A),I=D((()=>L(g())));return I.toArray=()=>{const A=I();return Array.isArray(A)?A:null!=A?[A]:[]},I}function F(){const A=t;if(this.sources&&(this.state||A))if(this.state===E||A)u(this);else{const A=s;s=null,R((()=>Y(this)),!1),s=A}if(o){const A=this.observers?this.observers.length:0;o.sources?(o.sources.push(this),o.sourceSlots.push(A)):(o.sources=[this],o.sourceSlots=[A]),this.observers?(this.observers.push(o),this.observerSlots.push(o.sources.length-1)):(this.observers=[o],this.observerSlots=[o.sources.length-1])}return this.value}function d(A,g,I){let B=A.value;return A.comparator&&A.comparator(B,g)||(A.value=g,A.observers&&A.observers.length&&R((()=>{for(let g=0;g1e6)throw s=[],new Error}),!1)),g}function u(A){if(!A.fn)return;S(A);const g=V,I=o,B=r;o=V=A,function(A,g,I){let B;try{B=A.fn(g)}catch(g){A.pure&&(A.state=E,A.owned&&A.owned.forEach(S),A.owned=null),p(g)}(!A.updatedAt||A.updatedAt<=I)&&(null!=A.updatedAt&&"observers"in A?d(A,B):A.value=B,A.updatedAt=I)}(A,A.value,B),o=I,V=g}function N(A,g,I,B=E,Q){const C={fn:A,state:B,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:g,owner:V,context:null,pure:I};return null===V||V!==i&&(V.owned?V.owned.push(C):V.owned=[C]),C}function f(A){const g=t;if(0===A.state||g)return;if(A.state===e||g)return Y(A);if(A.suspense&&l(A.suspense.inFallback))return A.suspense.effects.push(A);const I=[A];for(;(A=A.owner)&&(!A.updatedAt||A.updatedAt=0;B--)if((A=I[B]).state===E||g)u(A);else if(A.state===e||g){const g=s;s=null,R((()=>Y(A,I[0])),!1),s=g}}function R(A,g){if(s)return A();let I=!1;g||(s=[]),n?I=!0:n=[],r++;try{const g=A();return function(A){s&&(q(s),s=null);if(A)return;const g=n;n=null,g.length&&R((()=>C(g)),!1)}(I),g}catch(A){I||(n=null),s=null,p(A)}}function q(A){for(let g=0;gA(g||{})))}function z(){return!0}const b={get:(A,g,B)=>g===I?B:A.get(g),has:(A,g)=>g===I||A.has(g),set:z,deleteProperty:z,getOwnPropertyDescriptor:(A,g)=>({configurable:!0,enumerable:!0,get:()=>A.get(g),set:z,deleteProperty:z}),ownKeys:A=>A.keys()};function v(A){return(A="function"==typeof A?A():A)?A:{}}function x(A){const g="fallback"in A&&{fallback:()=>A.fallback};return D(function(A,g,I={}){let Q=[],C=[],E=[],e=0,i=g.length>1?[]:null;return y((()=>H(E))),()=>{let V,t,o=A()||[];return o[B],l((()=>{let A,g,B,n,r,c,w,D,h,l=o.length;if(0===l)0!==e&&(H(E),E=[],Q=[],C=[],e=0,i&&(i=[])),I.fallback&&(Q=[m],C[0]=a((A=>(E[0]=A,I.fallback()))),e=1);else if(0===e){for(C=new Array(l),t=0;t=c&&D>=c&&Q[w]===o[D];w--,D--)B[D]=C[w],n[D]=E[w],i&&(r[D]=i[w]);for(A=new Map,g=new Array(D+1),t=D;t>=c;t--)h=o[t],V=A.get(h),g[t]=void 0===V?-1:V,A.set(h,t);for(V=c;V<=w;V++)h=Q[V],t=A.get(h),void 0!==t&&-1!==t?(B[t]=C[V],n[t]=E[V],i&&(r[t]=i[V]),t=g[t],A.set(h,t)):E[V]();for(t=c;tA.each),A.children,g||void 0))}function Z(A){const g="fallback"in A&&{fallback:()=>A.fallback};return D(function(A,g,I={}){let Q,C=[],E=[],e=[],i=[],V=0;return y((()=>H(e))),()=>{const t=A()||[];return t[B],l((()=>{if(0===t.length)return 0!==V&&(H(e),e=[],C=[],E=[],V=0,i=[]),I.fallback&&(C=[m],E[0]=a((A=>(e[0]=A,I.fallback()))),V=1),E;for(C[0]===m&&(e[0](),e=[],C=[],E=[],V=0),Q=0;Qt[Q])):Q>=C.length&&(E[Q]=a(o));for(;QA.each),A.children,g||void 0))}function W(A){let g=!1;const I=A.keyed,B=D((()=>A.when),void 0,{equals:(A,I)=>g?A===I:!A==!I});return D((()=>{const Q=B();if(Q){const B=A.children,C="function"==typeof B&&B.length>0;return g=I||C,C?l((()=>B(Q))):B}return A.fallback}),void 0,void 0)}function T(A){let g=!1,I=!1;const B=k((()=>A.children)),Q=D((()=>{let A=B();Array.isArray(A)||(A=[A]);for(let g=0;gA[0]===I[0]&&(g?A[1]===I[1]:!A[1]==!I[1])&&A[2]===I[2]});return D((()=>{const[B,C,E]=Q();if(B<0)return A.fallback;const e=E.children,i="function"==typeof e&&e.length>0;return g=I||i,i?l((()=>e(C))):e}),void 0,void 0)}function j(A){return A}const X="_$DX_DELEGATE";function O(A,g,I,B={}){let Q;return a((B=>{Q=B,g===document?A():BA(g,A(),g.firstChild?null:void 0,I)}),B.owner),()=>{Q(),g.textContent=""}}function P(A,g,I){const B=document.createElement("template");B.innerHTML=A;let Q=B.content.firstChild;return I&&(Q=Q.firstChild),Q}function _(A,g=window.document){const I=g[X]||(g[X]=new Set);for(let B=0,Q=A.length;BB.call(A,I[1],g))}else A.addEventListener(g,I)}function gA(A,g,I){if(!g)return I?function(A,g,I){null==I?A.removeAttribute(g):A.setAttribute(g,I)}(A,"style"):g;const B=A.style;if("string"==typeof g)return B.cssText=g;let Q,C;for(C in"string"==typeof I&&(B.cssText=I=void 0),I||(I={}),g||(g={}),I)null==g[C]&&B.removeProperty(C),delete I[C];for(C in g)Q=g[C],Q!==I[C]&&(B.setProperty(C,Q),I[C]=Q);return I}function IA(A,g,I){return l((()=>A(g,I)))}function BA(A,g,I,B){if(void 0===I||B||(B=[]),"function"!=typeof g)return CA(A,g,B,I);w((B=>CA(A,g(),B,I)),B)}function QA(A){const I=`$$${A.type}`;let B=A.composedPath&&A.composedPath()[0]||A.target;for(A.target!==B&&Object.defineProperty(A,"target",{configurable:!0,value:B}),Object.defineProperty(A,"currentTarget",{configurable:!0,get:()=>B||document}),g.registry&&!g.done&&(g.done=!0,document.querySelectorAll("[id^=pl-]").forEach((g=>{for(;g&&8!==g.nodeType&&g.nodeValue!=="pl-"+A;){let A=g.nextSibling;g.remove(),g=A}g&&g.remove()})));B;){const g=B[I];if(g&&!B.disabled){const Q=B[`${I}Data`];if(void 0!==Q?g.call(B,Q,A):g.call(B,A),A.cancelBubble)return}B=B._$host||B.parentNode||B.host}}function CA(A,I,B,Q,C){for(g.context&&!B&&(B=[...A.childNodes]);"function"==typeof B;)B=B();if(I===B)return B;const E=typeof I,e=void 0!==Q;if(A=e&&B[0]&&B[0].parentNode||A,"string"===E||"number"===E){if(g.context)return B;if("number"===E&&(I=I.toString()),e){let g=B[0];g&&3===g.nodeType?g.data=I:g=document.createTextNode(I),B=iA(A,B,Q,g)}else B=""!==B&&"string"==typeof B?A.firstChild.data=I:A.textContent=I}else if(null==I||"boolean"===E){if(g.context)return B;B=iA(A,B,Q)}else{if("function"===E)return w((()=>{let g=I();for(;"function"==typeof g;)g=g();B=CA(A,g,B,Q)})),()=>B;if(Array.isArray(I)){const E=[],i=B&&Array.isArray(B);if(EA(E,I,B,C))return w((()=>B=CA(A,E,B,Q,!0))),()=>B;if(g.context){if(!E.length)return B;for(let A=0;AB-e){const Q=g[E];for(;e=0;C--){const E=g[C];if(Q!==E){const g=E.parentNode===A;B||C?g&&E.remove():g?A.replaceChild(Q,E):A.insertBefore(Q,I)}else B=!0}}else A.insertBefore(Q,I);return[Q]}let VA;const tA=new Array(128).fill(void 0);function oA(A){return tA[A]}tA.push(void 0,null,!0,!1);let sA=tA.length;function nA(A){const g=oA(A);return function(A){A<132||(tA[A]=sA,sA=A)}(A),g}const rA="undefined"!=typeof TextDecoder?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};"undefined"!=typeof TextDecoder&&rA.decode();let aA=null;function cA(){return null!==aA&&0!==aA.byteLength||(aA=new Uint8Array(VA.memory.buffer)),aA}function wA(A,g){return A>>>=0,rA.decode(cA().subarray(A,A+g))}function DA(A){sA===tA.length&&tA.push(tA.length+1);const g=sA;return sA=tA[g],tA[g]=A,g}function hA(A){const g=typeof A;if("number"==g||"boolean"==g||null==A)return`${A}`;if("string"==g)return`"${A}"`;if("symbol"==g){const g=A.description;return null==g?"Symbol":`Symbol(${g})`}if("function"==g){const g=A.name;return"string"==typeof g&&g.length>0?`Function(${g})`:"Function"}if(Array.isArray(A)){const g=A.length;let I="[";g>0&&(I+=hA(A[0]));for(let B=1;B1))return toString.call(A);if(B=I[1],"Object"==B)try{return"Object("+JSON.stringify(A)+")"}catch(A){return"Object"}return A instanceof Error?`${A.name}: ${A.message}\n${A.stack}`:B}let lA=0;const MA="undefined"!=typeof TextEncoder?new TextEncoder("utf-8"):{encode:()=>{throw Error("TextEncoder not available")}},yA="function"==typeof MA.encodeInto?function(A,g){return MA.encodeInto(A,g)}:function(A,g){const I=MA.encode(A);return g.set(I),{read:A.length,written:I.length}};function GA(A,g,I){if(void 0===I){const I=MA.encode(A),B=g(I.length,1)>>>0;return cA().subarray(B,B+I.length).set(I),lA=I.length,B}let B=A.length,Q=g(B,1)>>>0;const C=cA();let E=0;for(;E127)break;C[Q+E]=g}if(E!==B){0!==E&&(A=A.slice(E)),Q=I(Q,B,B=E+3*A.length,1)>>>0;const g=cA().subarray(Q+E,Q+B);E+=yA(A,g).written,Q=I(Q,B,E,1)>>>0}return lA=E,Q}let kA=null;function FA(){return null!==kA&&0!==kA.byteLength||(kA=new Int32Array(VA.memory.buffer)),kA}let dA=null;function uA(A,g){return A>>>=0,(null!==dA&&0!==dA.byteLength||(dA=new Uint32Array(VA.memory.buffer)),dA).subarray(A/4,A/4+g)}const NA="undefined"==typeof FinalizationRegistry?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry((A=>VA.__wbg_vtwrapper_free(A>>>0)));class fA{static __wrap(A){A>>>=0;const g=Object.create(fA.prototype);return g.__wbg_ptr=A,NA.register(g,g.__wbg_ptr,g),g}__destroy_into_raw(){const A=this.__wbg_ptr;return this.__wbg_ptr=0,NA.unregister(this),A}free(){const A=this.__destroy_into_raw();VA.__wbg_vtwrapper_free(A)}feed(A){const g=GA(A,VA.__wbindgen_malloc,VA.__wbindgen_realloc),I=lA;return nA(VA.vtwrapper_feed(this.__wbg_ptr,g,I))}inspect(){let A,g;try{const Q=VA.__wbindgen_add_to_stack_pointer(-16);VA.vtwrapper_inspect(Q,this.__wbg_ptr);var I=FA()[Q/4+0],B=FA()[Q/4+1];return A=I,g=B,wA(I,B)}finally{VA.__wbindgen_add_to_stack_pointer(16),VA.__wbindgen_free(A,g,1)}}get_size(){try{const B=VA.__wbindgen_add_to_stack_pointer(-16);VA.vtwrapper_get_size(B,this.__wbg_ptr);var A=FA()[B/4+0],g=FA()[B/4+1],I=uA(A,g).slice();return VA.__wbindgen_free(A,4*g,4),I}finally{VA.__wbindgen_add_to_stack_pointer(16)}}get_line(A){return nA(VA.vtwrapper_get_line(this.__wbg_ptr,A))}get_cursor(){return nA(VA.vtwrapper_get_cursor(this.__wbg_ptr))}}function RA(){const A={wbg:{}};return A.wbg.__wbindgen_object_drop_ref=function(A){nA(A)},A.wbg.__wbindgen_error_new=function(A,g){return DA(new Error(wA(A,g)))},A.wbg.__wbindgen_object_clone_ref=function(A){return DA(oA(A))},A.wbg.__wbindgen_number_new=function(A){return DA(A)},A.wbg.__wbindgen_bigint_from_u64=function(A){return DA(BigInt.asUintN(64,A))},A.wbg.__wbindgen_string_new=function(A,g){return DA(wA(A,g))},A.wbg.__wbg_set_f975102236d3c502=function(A,g,I){oA(A)[nA(g)]=nA(I)},A.wbg.__wbg_new_b525de17f44a8943=function(){return DA(new Array)},A.wbg.__wbg_new_f841cc6f2098f4b5=function(){return DA(new Map)},A.wbg.__wbg_new_f9876326328f45ed=function(){return DA(new Object)},A.wbg.__wbindgen_is_string=function(A){return"string"==typeof oA(A)},A.wbg.__wbg_set_17224bc548dd1d7b=function(A,g,I){oA(A)[g>>>0]=nA(I)},A.wbg.__wbg_set_388c4c6422704173=function(A,g,I){return DA(oA(A).set(oA(g),oA(I)))},A.wbg.__wbindgen_debug_string=function(A,g){const I=GA(hA(oA(g)),VA.__wbindgen_malloc,VA.__wbindgen_realloc),B=lA;FA()[A/4+1]=B,FA()[A/4+0]=I},A.wbg.__wbindgen_throw=function(A,g){throw new Error(wA(A,g))},A}function qA(A,g){return VA=A.exports,JA.__wbindgen_wasm_module=g,kA=null,dA=null,aA=null,VA}async function JA(A){if(void 0!==VA)return VA;const g=RA();("string"==typeof A||"function"==typeof Request&&A instanceof Request||"function"==typeof URL&&A instanceof URL)&&(A=fetch(A));const{instance:I,module:B}=await async function(A,g){if("function"==typeof Response&&A instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(A,g)}catch(g){if("application/wasm"==A.headers.get("Content-Type"))throw g;console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",g)}const I=await A.arrayBuffer();return await WebAssembly.instantiate(I,g)}{const I=await WebAssembly.instantiate(A,g);return I instanceof WebAssembly.Instance?{instance:I,module:A}:I}}(await A,g);return qA(I,B)}var YA=Object.freeze({__proto__:null,VtWrapper:fA,create:function(A,g,I,B){const Q=VA.create(A,g,I,B);return fA.__wrap(Q)},default:JA,initSync:function(A){if(void 0!==VA)return VA;const g=RA();return A instanceof WebAssembly.Module||(A=new WebAssembly.Module(A)),qA(new WebAssembly.Instance(A,g),A)}});const UA=[62,0,0,0,63,52,53,54,55,56,57,58,59,60,61,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,0,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51];function SA(A){return UA[A-43]}const pA=function(A){let g,I=A.endsWith("==")?2:A.endsWith("=")?1:0,B=A.length,Q=new Uint8Array(B/4*3);for(let I=0,C=0;I>16,Q[C+1]=g>>8&255,Q[C+2]=255&g;return Q.subarray(0,Q.length-I)}("AGFzbQEAAAAB5QEcYAJ/fwF/YAN/f38Bf2ACf38AYAN/f38AYAF/AGAEf39/fwBgAX8Bf2AFf39/f38Bf2AFf39/f38AYAABf2AGf39/f39/AGAEf39/fwF/YAAAYAF8AX9gAX4Bf2AHf39/f39/fwF/YAJ+fwF/YBV/f39/f39/f39/f39/f39/f39/f38Bf2APf39/f39/f39/f39/f39/AX9gC39/f39/f39/f39/AX9gA39/fgBgBn9/f39/fwF/YAV/f35/fwBgBH9+f38AYAV/f31/fwBgBH99f38AYAV/f3x/fwBgBH98f38AAs4DDwN3YmcaX193YmluZGdlbl9vYmplY3RfZHJvcF9yZWYABAN3YmcUX193YmluZGdlbl9lcnJvcl9uZXcAAAN3YmcbX193YmluZGdlbl9vYmplY3RfY2xvbmVfcmVmAAYDd2JnFV9fd2JpbmRnZW5fbnVtYmVyX25ldwANA3diZxpfX3diaW5kZ2VuX2JpZ2ludF9mcm9tX3U2NAAOA3diZxVfX3diaW5kZ2VuX3N0cmluZ19uZXcAAAN3YmcaX193Ymdfc2V0X2Y5NzUxMDIyMzZkM2M1MDIAAwN3YmcaX193YmdfbmV3X2I1MjVkZTE3ZjQ0YTg5NDMACQN3YmcaX193YmdfbmV3X2Y4NDFjYzZmMjA5OGY0YjUACQN3YmcaX193YmdfbmV3X2Y5ODc2MzI2MzI4ZjQ1ZWQACQN3YmcUX193YmluZGdlbl9pc19zdHJpbmcABgN3YmcaX193Ymdfc2V0XzE3MjI0YmM1NDhkZDFkN2IAAwN3YmcaX193Ymdfc2V0XzM4OGM0YzY0MjI3MDQxNzMAAQN3YmcXX193YmluZGdlbl9kZWJ1Z19zdHJpbmcAAgN3YmcQX193YmluZGdlbl90aHJvdwACA+0B6wEGAgADAQcEAgEBAAICAAIPAgcIABACAgAKAAIKAwABBAIDBRECCgUHBwMDEgkCBBMFAgUFBQUAAAAAAxQEBQICAwgCBAIBBAgCAggFCgAAAgMAAwIACwUFAAMECAADAwYAAAAAAAACAwIDAQYEBQwDAAAAAAIBAgEABAACAgMABwAAAAIAAAALDAAAAAAAAAQCAgMVAAAECBYYGgcEAAUEBAAAAQQDAgYEBAQAAAAACwUDAAQBAQAAAAAAAgMCAgICAAABAAIDAwYAAwMAAwAEAAYABAQEBAAAAAACDAwAAAAAAAABAAMBAQAEBAUBcAF4eAUDAQARBgkBfwFBgIDAAAsH8gEMBm1lbW9yeQIAFF9fd2JnX3Z0d3JhcHBlcl9mcmVlAKUBBmNyZWF0ZQBkDnZ0d3JhcHBlcl9mZWVkAFQRdnR3cmFwcGVyX2luc3BlY3QAQBJ2dHdyYXBwZXJfZ2V0X3NpemUATRJ2dHdyYXBwZXJfZ2V0X2xpbmUAdBR2dHdyYXBwZXJfZ2V0X2N1cnNvcgB6EV9fd2JpbmRnZW5fbWFsbG9jAIkBEl9fd2JpbmRnZW5fcmVhbGxvYwCWAR9fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyAOABD19fd2JpbmRnZW5fZnJlZQDAAQneAQEAQQELd4cBswFv+QEZuQGaAfkBcaQBkAG9AZQB0wHkAcYBcugBugGjAeMBmQGTAcIBXLEBc3Bn5gHiAZgB+AFd5QGbAbsBkQFggAHhAbwB5QHSASztAfkB5wHjAccB+QH5AY8B6QGsAYEBjQGCAd0B+QEmY2v5AZUB3wH5AZ0BtgGyAa0BqAGmAaYBpwGmAakBW6oBqgGiAckBtwHEASjbAWK3AYQBIu4BzQH5Ac4BhQHPAasBL075AcwBtwGGAfEB7wH5AfAB2AHBAcUB0AHRAfkBzAH5AfQBGH/yAQroiATrAakkAgl/AX4jAEEQayIJJAACQAJAAkACQAJAAkACQCAAQfUBTwRAIABBzf97Tw0HIABBC2oiAEF4cSEEQYSDwQAoAgAiCEUNBEEAIARrIQMCf0EAIARBgAJJDQAaQR8gBEH///8HSw0AGiAEQQYgAEEIdmciAGt2QQFxIABBAXRrQT5qCyIHQQJ0Qej/wABqKAIAIgJFBEBBACEADAILQQAhACAEQQBBGSAHQQF2ayAHQR9GG3QhBgNAAkAgAigCBEF4cSIFIARJDQAgBSAEayIFIANPDQAgAiEBIAUiAw0AQQAhAyACIQAMBAsgAigCFCIFIAAgBSACIAZBHXZBBHFqQRBqKAIAIgJHGyAAIAUbIQAgBkEBdCEGIAINAAsMAQtBgIPBACgCACIGQRAgAEELakH4A3EgAEELSRsiBEEDdiICdiIBQQNxBEACQCABQX9zQQFxIAJqIgJBA3QiAEH4gMEAaiIBIABBgIHBAGooAgAiBSgCCCIARwRAIAAgATYCDCABIAA2AggMAQtBgIPBACAGQX4gAndxNgIACyAFQQhqIQMgBSACQQN0IgBBA3I2AgQgACAFaiIAIAAoAgRBAXI2AgQMBwsgBEGIg8EAKAIATQ0DAkACQCABRQRAQYSDwQAoAgAiAEUNBiAAaEECdEHo/8AAaigCACIBKAIEQXhxIARrIQMgASECA0ACQCABKAIQIgANACABKAIUIgANACACKAIYIQcCQAJAIAIgAigCDCIARgRAIAJBFEEQIAIoAhQiABtqKAIAIgENAUEAIQAMAgsgAigCCCIBIAA2AgwgACABNgIIDAELIAJBFGogAkEQaiAAGyEGA0AgBiEFIAEiACgCFCEBIABBFGogAEEQaiABGyEGIABBFEEQIAEbaigCACIBDQALIAVBADYCAAsgB0UNBCACIAIoAhxBAnRB6P/AAGoiASgCAEcEQCAHQRBBFCAHKAIQIAJGG2ogADYCACAARQ0FDAQLIAEgADYCACAADQNBhIPBAEGEg8EAKAIAQX4gAigCHHdxNgIADAQLIAAoAgRBeHEgBGsiASADSSEGIAEgAyAGGyEDIAAgAiAGGyECIAAhAQwACwALAkBBAiACdCIAQQAgAGtyIAEgAnRxaCICQQN0IgBB+IDBAGoiASAAQYCBwQBqKAIAIgMoAggiAEcEQCAAIAE2AgwgASAANgIIDAELQYCDwQAgBkF+IAJ3cTYCAAsgAyAEQQNyNgIEIAMgBGoiBiACQQN0IgAgBGsiBUEBcjYCBCAAIANqIAU2AgBBiIPBACgCACIABEAgAEF4cUH4gMEAaiEBQZCDwQAoAgAhBwJ/QYCDwQAoAgAiAkEBIABBA3Z0IgBxRQRAQYCDwQAgACACcjYCACABDAELIAEoAggLIQAgASAHNgIIIAAgBzYCDCAHIAE2AgwgByAANgIICyADQQhqIQNBkIPBACAGNgIAQYiDwQAgBTYCAAwICyAAIAc2AhggAigCECIBBEAgACABNgIQIAEgADYCGAsgAigCFCIBRQ0AIAAgATYCFCABIAA2AhgLAkACQCADQRBPBEAgAiAEQQNyNgIEIAIgBGoiBSADQQFyNgIEIAMgBWogAzYCAEGIg8EAKAIAIgBFDQEgAEF4cUH4gMEAaiEBQZCDwQAoAgAhBwJ/QYCDwQAoAgAiBkEBIABBA3Z0IgBxRQRAQYCDwQAgACAGcjYCACABDAELIAEoAggLIQAgASAHNgIIIAAgBzYCDCAHIAE2AgwgByAANgIIDAELIAIgAyAEaiIAQQNyNgIEIAAgAmoiACAAKAIEQQFyNgIEDAELQZCDwQAgBTYCAEGIg8EAIAM2AgALIAJBCGohAwwGCyAAIAFyRQRAQQAhAUECIAd0IgBBACAAa3IgCHEiAEUNAyAAaEECdEHo/8AAaigCACEACyAARQ0BCwNAIAEgACABIAAoAgRBeHEiASAEayIFIANJIgYbIAEgBEkiAhshASADIAUgAyAGGyACGyEDIAAoAhAiAgR/IAIFIAAoAhQLIgANAAsLIAFFDQBBiIPBACgCACIAIARPIAMgACAEa09xDQAgASgCGCEHAkACQCABIAEoAgwiAEYEQCABQRRBECABKAIUIgAbaigCACICDQFBACEADAILIAEoAggiAiAANgIMIAAgAjYCCAwBCyABQRRqIAFBEGogABshBgNAIAYhBSACIgAoAhQhAiAAQRRqIABBEGogAhshBiAAQRRBECACG2ooAgAiAg0ACyAFQQA2AgALIAdFDQIgASABKAIcQQJ0Qej/wABqIgIoAgBHBEAgB0EQQRQgBygCECABRhtqIAA2AgAgAEUNAwwCCyACIAA2AgAgAA0BQYSDwQBBhIPBACgCAEF+IAEoAhx3cTYCAAwCCwJAAkACQAJAAkBBiIPBACgCACICIARJBEBBjIPBACgCACIAIARNBEAgBEGvgARqQYCAfHEiAEEQdkAAIQIgCUEEaiIBQQA2AgggAUEAIABBgIB8cSACQX9GIgAbNgIEIAFBACACQRB0IAAbNgIAIAkoAgQiCEUEQEEAIQMMCgsgCSgCDCEFQZiDwQAgCSgCCCIHQZiDwQAoAgBqIgE2AgBBnIPBAEGcg8EAKAIAIgAgASAAIAFLGzYCAAJAAkBBlIPBACgCACIDBEBB6IDBACEAA0AgCCAAKAIAIgEgACgCBCICakYNAiAAKAIIIgANAAsMAgtBpIPBACgCACIAQQBHIAAgCE1xRQRAQaSDwQAgCDYCAAtBqIPBAEH/HzYCAEH0gMEAIAU2AgBB7IDBACAHNgIAQeiAwQAgCDYCAEGEgcEAQfiAwQA2AgBBjIHBAEGAgcEANgIAQYCBwQBB+IDBADYCAEGUgcEAQYiBwQA2AgBBiIHBAEGAgcEANgIAQZyBwQBBkIHBADYCAEGQgcEAQYiBwQA2AgBBpIHBAEGYgcEANgIAQZiBwQBBkIHBADYCAEGsgcEAQaCBwQA2AgBBoIHBAEGYgcEANgIAQbSBwQBBqIHBADYCAEGogcEAQaCBwQA2AgBBvIHBAEGwgcEANgIAQbCBwQBBqIHBADYCAEHEgcEAQbiBwQA2AgBBuIHBAEGwgcEANgIAQcCBwQBBuIHBADYCAEHMgcEAQcCBwQA2AgBByIHBAEHAgcEANgIAQdSBwQBByIHBADYCAEHQgcEAQciBwQA2AgBB3IHBAEHQgcEANgIAQdiBwQBB0IHBADYCAEHkgcEAQdiBwQA2AgBB4IHBAEHYgcEANgIAQeyBwQBB4IHBADYCAEHogcEAQeCBwQA2AgBB9IHBAEHogcEANgIAQfCBwQBB6IHBADYCAEH8gcEAQfCBwQA2AgBB+IHBAEHwgcEANgIAQYSCwQBB+IHBADYCAEGMgsEAQYCCwQA2AgBBgILBAEH4gcEANgIAQZSCwQBBiILBADYCAEGIgsEAQYCCwQA2AgBBnILBAEGQgsEANgIAQZCCwQBBiILBADYCAEGkgsEAQZiCwQA2AgBBmILBAEGQgsEANgIAQayCwQBBoILBADYCAEGggsEAQZiCwQA2AgBBtILBAEGogsEANgIAQaiCwQBBoILBADYCAEG8gsEAQbCCwQA2AgBBsILBAEGogsEANgIAQcSCwQBBuILBADYCAEG4gsEAQbCCwQA2AgBBzILBAEHAgsEANgIAQcCCwQBBuILBADYCAEHUgsEAQciCwQA2AgBByILBAEHAgsEANgIAQdyCwQBB0ILBADYCAEHQgsEAQciCwQA2AgBB5ILBAEHYgsEANgIAQdiCwQBB0ILBADYCAEHsgsEAQeCCwQA2AgBB4ILBAEHYgsEANgIAQfSCwQBB6ILBADYCAEHogsEAQeCCwQA2AgBB/ILBAEHwgsEANgIAQfCCwQBB6ILBADYCAEGUg8EAIAhBD2pBeHEiAEEIayICNgIAQfiCwQBB8ILBADYCAEGMg8EAIAdBKGsiASAIIABrakEIaiIANgIAIAIgAEEBcjYCBCABIAhqQSg2AgRBoIPBAEGAgIABNgIADAgLIAMgCE8NACABIANLDQAgACgCDCIBQQFxDQAgAUEBdiAFRg0DC0Gkg8EAQaSDwQAoAgAiACAIIAAgCEkbNgIAIAcgCGohAkHogMEAIQACQAJAA0AgAiAAKAIARwRAIAAoAggiAA0BDAILCyAAKAIMIgFBAXENACABQQF2IAVGDQELQeiAwQAhAANAAkAgACgCACIBIANNBEAgASAAKAIEaiIGIANLDQELIAAoAgghAAwBCwtBlIPBACAIQQ9qQXhxIgBBCGsiAjYCAEGMg8EAIAdBKGsiASAIIABrakEIaiIANgIAIAIgAEEBcjYCBCABIAhqQSg2AgRBoIPBAEGAgIABNgIAIAMgBkEga0F4cUEIayIAIAAgA0EQakkbIgFBGzYCBEHogMEAKQIAIQogAUEQakHwgMEAKQIANwIAIAEgCjcCCEH0gMEAIAU2AgBB7IDBACAHNgIAQeiAwQAgCDYCAEHwgMEAIAFBCGo2AgAgAUEcaiEAA0AgAEEHNgIAIAYgAEEEaiIASw0ACyABIANGDQcgASABKAIEQX5xNgIEIAMgASADayIAQQFyNgIEIAEgADYCACAAQYACTwRAIAMgABAkDAgLIABBeHFB+IDBAGohAQJ/QYCDwQAoAgAiAkEBIABBA3Z0IgBxRQRAQYCDwQAgACACcjYCACABDAELIAEoAggLIQAgASADNgIIIAAgAzYCDCADIAE2AgwgAyAANgIIDAcLIAAgCDYCACAAIAAoAgQgB2o2AgQgCEEPakF4cUEIayIGIARBA3I2AgQgAkEPakF4cUEIayIDIAQgBmoiBWshBCADQZSDwQAoAgBGDQMgA0GQg8EAKAIARg0EIAMoAgQiAUEDcUEBRgRAIAMgAUF4cSIAEB8gACAEaiEEIAAgA2oiAygCBCEBCyADIAFBfnE2AgQgBSAEQQFyNgIEIAQgBWogBDYCACAEQYACTwRAIAUgBBAkDAYLIARBeHFB+IDBAGohAQJ/QYCDwQAoAgAiAkEBIARBA3Z0IgBxRQRAQYCDwQAgACACcjYCACABDAELIAEoAggLIQAgASAFNgIIIAAgBTYCDCAFIAE2AgwgBSAANgIIDAULQYyDwQAgACAEayIBNgIAQZSDwQBBlIPBACgCACICIARqIgA2AgAgACABQQFyNgIEIAIgBEEDcjYCBCACQQhqIQMMCAtBkIPBACgCACEGAkAgAiAEayIBQQ9NBEBBkIPBAEEANgIAQYiDwQBBADYCACAGIAJBA3I2AgQgAiAGaiIAIAAoAgRBAXI2AgQMAQtBiIPBACABNgIAQZCDwQAgBCAGaiIANgIAIAAgAUEBcjYCBCACIAZqIAE2AgAgBiAEQQNyNgIECyAGQQhqIQMMBwsgACACIAdqNgIEQZSDwQBBlIPBACgCACIGQQ9qQXhxIgBBCGsiAjYCAEGMg8EAQYyDwQAoAgAgB2oiASAGIABrakEIaiIANgIAIAIgAEEBcjYCBCABIAZqQSg2AgRBoIPBAEGAgIABNgIADAMLQZSDwQAgBTYCAEGMg8EAQYyDwQAoAgAgBGoiADYCACAFIABBAXI2AgQMAQtBkIPBACAFNgIAQYiDwQBBiIPBACgCACAEaiIANgIAIAUgAEEBcjYCBCAAIAVqIAA2AgALIAZBCGohAwwDC0EAIQNBjIPBACgCACIAIARNDQJBjIPBACAAIARrIgE2AgBBlIPBAEGUg8EAKAIAIgIgBGoiADYCACAAIAFBAXI2AgQgAiAEQQNyNgIEIAJBCGohAwwCCyAAIAc2AhggASgCECICBEAgACACNgIQIAIgADYCGAsgASgCFCICRQ0AIAAgAjYCFCACIAA2AhgLAkAgA0EQTwRAIAEgBEEDcjYCBCABIARqIgUgA0EBcjYCBCADIAVqIAM2AgAgA0GAAk8EQCAFIAMQJAwCCyADQXhxQfiAwQBqIQICf0GAg8EAKAIAIgZBASADQQN2dCIAcUUEQEGAg8EAIAAgBnI2AgAgAgwBCyACKAIICyEAIAIgBTYCCCAAIAU2AgwgBSACNgIMIAUgADYCCAwBCyABIAMgBGoiAEEDcjYCBCAAIAFqIgAgACgCBEEBcjYCBAsgAUEIaiEDCyAJQRBqJAAgAwudDgIKfwR+IwBBgAFrIgMkACABKQIgIQwgAUGAgICAeDYCICADQUBrIgRBGGoiAiABQThqKQIANwMAIARBEGoiBiABQTBqKQIANwMAIARBCGoiBCABQShqKQIANwMAIAMgDDcDQAJAAkAgDKdBgICAgHhHBEAgACADKQNANwIAIABBGGogAikDADcCACAAQRBqIAYpAwA3AgAgAEEIaiAEKQMANwIADAELIANBQGsQuAEgASgCQCICIAEoAkRHBEAgAUEgaiEJIAFBFGohCANAIAEgAkEQajYCQAJAAkACQAJ/AkAgAigCACIGQf8ATwRAIAZBoAFJDQEgBkEGdkH/AHEgBkENdkGAq8AAai0AAEEHdHIiBEH/EksNAyAGQQJ2QQ9xIARBgK3AAGotAABBBHRyIgRB4B1PDQRBASAEQYDAwABqLQAAIAZBAXRBBnF2QQNxIgQgBEEDRhshBAwFC0EBIAZBH0sNARoLQQALIQQMAgsgBEGAE0HsqMAAEF8ACyAEQeAdQfyowAAQXwALIAEgASgCSCIGIARqNgJIAkACQAJAAkACQCAEQQFLDQAgAigCACIFQfz//wBxQbDBA0YNACAFQeD//wBxQYDLAEYNACAFQYD//wBxQYDKAEYNACAFQYD+/wBxQYDQAEYNACABKAIAIgtBgICAgHhHDQFBmf/AAC0AABpBBEEEEMgBIgdFDQggByACKAIANgIAIANBQGsiBUEBNgIIIAUgBzYCBCAFQQE2AgAgA0H4AGoiByACQQxqLwEAOwEAIAMgAikCBDcDcCABELgBIAEgBDYCECABIAY2AgwgAUEIaiAFQQhqKAIANgIAIAEgAykDQDcCACAIIAMpA3A3AgAgCEEIaiAHLwEAOwEADAQLQZn/wAAtAAAaQQRBBBDIASIIRQ0HIAggAigCADYCACADQRBqIgVBATYCCCAFIAg2AgQgBUEBNgIAIANBCGoiCCACQQxqLwEAOwEAIAMgAikCBDcDACADQUBrIgJBGGoiBSABQRhqKQIANwMAIAJBEGoiByABQRBqKQIANwMAIAJBCGoiCyABQQhqKQIANwMAIAEpAgAhDCABQYCAgIB4NgIAIAMgDDcDQCAMp0GAgICAeEYNASADQSBqIgJBGGoiCiAFKQMANwMAIAJBEGoiBSAHKQMANwMAIAJBCGoiAiALKQMANwMAIAMgAykDQDcDICAJELgBIAEgBDYCMCABIAY2AiwgCUEIaiADQRhqKAIANgIAIAkgAykDEDcCACABIAMpAwA3AjQgAUE8aiAILwEAOwEAIAAgAykDIDcCACAAQQhqIAIpAwA3AgAgAEEQaiAFKQMANwIAIABBGGogCikDADcCAAwGCyAILQAAIQcCQCACLQAEIgpBAkYEQCAHQQJHDQMMAQsgB0ECRg0CIAcgCkcNAiAKRQRAIAItAAUgAS0AFUYNAQwDCyACLQAFIAEtABVHDQIgAi0ABiABLQAWRw0CIAItAAcgAS0AF0cNAgsgAS0AGCEHAkAgAi0ACCIKQQJGBEAgB0ECRw0DDAELIAdBAkYNAiAHIApHDQIgCkUEQCACLQAJIAEtABlHDQMMAQsgAi0ACSABLQAZRw0CIAItAAogAS0AGkcNAiACLQALIAEtABtHDQILIAItAAwgAS0AHEcNASACLQANIAEtAB1HDQEgBCABKAIQRw0BIAsgASgCCCICRgRAIAEgCxB3IAEoAgghAgsgASgCBCACQQJ0aiAFNgIAIAEgASgCCEEBajYCCAwCCyADQUBrELgBIAAgAykDEDcCACAAIAQ2AhAgACAGNgIMIAAgAykDADcCFCAAQQhqIANBGGooAgA2AgAgAEEcaiAILwEAOwEADAQLQZn/wAAtAAAaQQRBBBDIASIJBEAgCSACKAIANgIAIANB8ABqIgVBATYCCCAFIAk2AgQgBUEBNgIAIANB6ABqIgkgAkEMai8BADsBACABKQIAIQwgAikCBCENIAEgAykDcDcCACABQQhqIgIpAgAhDiABIAY2AgwgAiAFQQhqKAIANgIAIAFBEGoiAikCACEPIAIgBDYCACADQUBrIgRBCGoiAiAONwMAIARBEGoiBiAPNwMAIARBGGoiBCABQRhqKQIANwMAIAMgDTcDYCADIAw3A0AgCCADKQNgNwIAIAhBCGogCS8BADsBACAAQRhqIAQpAwA3AgAgAEEQaiAGKQMANwIAIABBCGogAikDADcCACAAIAMpA0A3AgAMBAsMBAsgASgCQCICIAEoAkRHDQALCyAAIAEpAgA3AgAgAUGAgICAeDYCACAAQRhqIAFBGGopAgA3AgAgAEEQaiABQRBqKQIANwIAIABBCGogAUEIaikCADcCAAsgA0GAAWokAA8LQQRBBEHU/8AAKAIAIgBB1wAgABsRAgAAC8YGAQh/AkACQCAAQQNqQXxxIgMgAGsiCCABSw0AIAEgCGsiBkEESQ0AIAZBA3EhB0EAIQECQCAAIANGIgkNAAJAIAAgA2siBEF8SwRAQQAhAwwBC0EAIQMDQCABIAAgA2oiAiwAAEG/f0pqIAJBAWosAABBv39KaiACQQJqLAAAQb9/SmogAkEDaiwAAEG/f0pqIQEgA0EEaiIDDQALCyAJDQAgACADaiECA0AgASACLAAAQb9/SmohASACQQFqIQIgBEEBaiIEDQALCyAAIAhqIQMCQCAHRQ0AIAMgBkF8cWoiACwAAEG/f0ohBSAHQQFGDQAgBSAALAABQb9/SmohBSAHQQJGDQAgBSAALAACQb9/SmohBQsgBkECdiEGIAEgBWohBANAIAMhACAGRQ0CIAZBwAEgBkHAAUkbIgVBA3EhByAFQQJ0IQNBACECIAZBBE8EQCAAIANB8AdxaiEIIAAhAQNAIAIgASgCACICQX9zQQd2IAJBBnZyQYGChAhxaiABKAIEIgJBf3NBB3YgAkEGdnJBgYKECHFqIAEoAggiAkF/c0EHdiACQQZ2ckGBgoQIcWogASgCDCICQX9zQQd2IAJBBnZyQYGChAhxaiECIAggAUEQaiIBRw0ACwsgBiAFayEGIAAgA2ohAyACQQh2Qf+B/AdxIAJB/4H8B3FqQYGABGxBEHYgBGohBCAHRQ0ACwJ/IAAgBUH8AXFBAnRqIgAoAgAiAUF/c0EHdiABQQZ2ckGBgoQIcSIBIAdBAUYNABogASAAKAIEIgFBf3NBB3YgAUEGdnJBgYKECHFqIgEgB0ECRg0AGiAAKAIIIgBBf3NBB3YgAEEGdnJBgYKECHEgAWoLIgFBCHZB/4EccSABQf+B/AdxakGBgARsQRB2IARqDwsgAUUEQEEADwsgAUEDcSEDAkAgAUEESQRADAELIAFBfHEhBQNAIAQgACACaiIBLAAAQb9/SmogAUEBaiwAAEG/f0pqIAFBAmosAABBv39KaiABQQNqLAAAQb9/SmohBCAFIAJBBGoiAkcNAAsLIANFDQAgACACaiEBA0AgBCABLAAAQb9/SmohBCABQQFqIQEgA0EBayIDDQALCyAEC/UGAgx/AX4jAEGQAWsiBCQAAkAgAEUNACACRQ0AAkACQANAIAAgAmpBGEkNASAAIAIgACACSSIDG0EJTwRAAkAgA0UEQCACQQJ0IQZBACACQQR0ayEFA0AgBgRAIAEhAyAGIQcDQCADIAVqIggoAgAhCSAIIAMoAgA2AgAgAyAJNgIAIANBBGohAyAHQQFrIgcNAAsLIAEgBWohASACIAAgAmsiAE0NAAsMAQsgAEECdCEGQQAgAEEEdCIFayEIA0AgBgRAIAEhAyAGIQcDQCADIAhqIgkoAgAhCiAJIAMoAgA2AgAgAyAKNgIAIANBBGohAyAHQQFrIgcNAAsLIAEgBWohASACIABrIgIgAE8NAAsLIAJFDQQgAA0BDAQLCyABIABBBHQiB2siAyACQQR0IgZqIQUgACACSw0BIARBEGoiACADIAcQ9wEaIAMgASAGEPUBIAUgACAHEPcBGgwCCyAEQQhqIgggASAAQQR0ayIGQQhqKQIANwMAIAQgBikCADcDACACQQR0IQkgAiIHIQEDQCAGIAFBBHRqIQUDQCAEQRhqIgogCCkDADcDACAEIAQpAwA3AxBBACEDA0AgAyAFaiILKAIAIQwgCyAEQRBqIANqIgsoAgA2AgAgCyAMNgIAIANBBGoiA0EQRw0ACyAIIAopAwA3AwAgBCAEKQMQNwMAIAAgAUsEQCAFIAlqIQUgASACaiEBDAELCyABIABrIgEEQCABIAcgASAHSRshBwwBBSAEKQMAIQ8gBkEIaiAEQQhqIggpAwA3AgAgBiAPNwIAIAdBAkkNA0EBIQUDQCAGIAVBBHRqIgkpAgAhDyAIIAlBCGoiCikCADcDACAEIA83AwAgAiAFaiEBA0AgBEEYaiILIAgpAwA3AwAgBCAEKQMANwMQIAYgAUEEdGohDEEAIQMDQCADIAxqIg0oAgAhDiANIARBEGogA2oiDSgCADYCACANIA42AgAgA0EEaiIDQRBHDQALIAggCykDADcDACAEIAQpAxA3AwAgACABSwRAIAEgAmohAQwBCyAFIAEgAGsiAUcNAAsgBCkDACEPIAogCCkDADcCACAJIA83AgAgBUEBaiIFIAdHDQALDAMLAAsACyAEQRBqIgAgASAGEPcBGiAFIAMgBxD1ASADIAAgBhD3ARoLIARBkAFqJAALlwYBBn8CQCAAKAIAIgggACgCCCIEcgRAAkAgBEUNACABIAJqIQcCQCAAKAIMIgZFBEAgASEEDAELIAEhBANAIAQiAyAHRg0CAn8gA0EBaiADLAAAIgRBAE4NABogA0ECaiAEQWBJDQAaIANBA2ogBEFwSQ0AGiAEQf8BcUESdEGAgPAAcSADLQADQT9xIAMtAAJBP3FBBnQgAy0AAUE/cUEMdHJyckGAgMQARg0DIANBBGoLIgQgBSADa2ohBSAGQQFrIgYNAAsLIAQgB0YNAAJAIAQsAAAiA0EATg0AIANBYEkNACADQXBJDQAgA0H/AXFBEnRBgIDwAHEgBC0AA0E/cSAELQACQT9xQQZ0IAQtAAFBP3FBDHRycnJBgIDEAEYNAQsCQCAFRQ0AIAIgBU0EQCACIAVGDQEMAgsgASAFaiwAAEFASA0BCyAFIQILIAhFDQEgACgCBCEHAkAgAkEQTwRAIAEgAhARIQMMAQsgAkUEQEEAIQMMAQsgAkEDcSEGAkAgAkEESQRAQQAhA0EAIQUMAQsgAkEMcSEIQQAhA0EAIQUDQCADIAEgBWoiBCwAAEG/f0pqIARBAWosAABBv39KaiAEQQJqLAAAQb9/SmogBEEDaiwAAEG/f0pqIQMgCCAFQQRqIgVHDQALCyAGRQ0AIAEgBWohBANAIAMgBCwAAEG/f0pqIQMgBEEBaiEEIAZBAWsiBg0ACwsCQCADIAdJBEAgByADayEEQQAhAwJAAkACQCAALQAgQQFrDgIAAQILIAQhA0EAIQQMAQsgBEEBdiEDIARBAWpBAXYhBAsgA0EBaiEDIAAoAhAhBiAAKAIYIQUgACgCFCEAA0AgA0EBayIDRQ0CIAAgBiAFKAIQEQAARQ0AC0EBDwsMAgtBASEDIAAgASACIAUoAgwRAQAEf0EBBUEAIQMCfwNAIAQgAyAERg0BGiADQQFqIQMgACAGIAUoAhARAABFDQALIANBAWsLIARJCw8LIAAoAhQgASACIAAoAhgoAgwRAQAPCyAAKAIUIAEgAiAAKAIYKAIMEQEAC7UFAQh/QStBgIDEACAAKAIcIghBAXEiBhshDCAEIAZqIQYCQCAIQQRxRQRAQQAhAQwBCwJAIAJBEE8EQCABIAIQESEFDAELIAJFBEAMAQsgAkEDcSEJAkAgAkEESQRADAELIAJBDHEhCgNAIAUgASAHaiILLAAAQb9/SmogC0EBaiwAAEG/f0pqIAtBAmosAABBv39KaiALQQNqLAAAQb9/SmohBSAKIAdBBGoiB0cNAAsLIAlFDQAgASAHaiEHA0AgBSAHLAAAQb9/SmohBSAHQQFqIQcgCUEBayIJDQALCyAFIAZqIQYLAkACQCAAKAIARQRAQQEhBSAAKAIUIgYgACgCGCIAIAwgASACEI4BDQEMAgsgACgCBCIHIAZNBEBBASEFIAAoAhQiBiAAKAIYIgAgDCABIAIQjgENAQwCCyAIQQhxBEAgACgCECEIIABBMDYCECAALQAgIQpBASEFIABBAToAICAAKAIUIgkgACgCGCILIAwgASACEI4BDQEgByAGa0EBaiEFAkADQCAFQQFrIgVFDQEgCUEwIAsoAhARAABFDQALQQEPC0EBIQUgCSADIAQgCygCDBEBAA0BIAAgCjoAICAAIAg2AhBBACEFDAELIAcgBmshBgJAAkACQCAALQAgIgVBAWsOAwABAAILIAYhBUEAIQYMAQsgBkEBdiEFIAZBAWpBAXYhBgsgBUEBaiEFIAAoAhAhCiAAKAIYIQggACgCFCEAAkADQCAFQQFrIgVFDQEgACAKIAgoAhARAABFDQALQQEPC0EBIQUgACAIIAwgASACEI4BDQAgACADIAQgCCgCDBEBAA0AQQAhBQNAIAUgBkYEQEEADwsgBUEBaiEFIAAgCiAIKAIQEQAARQ0ACyAFQQFrIAZJDwsgBQ8LIAYgAyAEIAAoAgwRAQAL/gUBBX8gAEEIayEBIAEgAEEEaygCACIDQXhxIgBqIQICQAJAAkACQCADQQFxDQAgA0ECcUUNASABKAIAIgMgAGohACABIANrIgFBkIPBACgCAEYEQCACKAIEQQNxQQNHDQFBiIPBACAANgIAIAIgAigCBEF+cTYCBCABIABBAXI2AgQgAiAANgIADwsgASADEB8LAkACQCACKAIEIgNBAnFFBEAgAkGUg8EAKAIARg0CIAJBkIPBACgCAEYNBSACIANBeHEiAhAfIAEgACACaiIAQQFyNgIEIAAgAWogADYCACABQZCDwQAoAgBHDQFBiIPBACAANgIADwsgAiADQX5xNgIEIAEgAEEBcjYCBCAAIAFqIAA2AgALIABBgAJJDQIgASAAECRBACEBQaiDwQBBqIPBACgCAEEBayIANgIAIAANAUHwgMEAKAIAIgAEQANAIAFBAWohASAAKAIIIgANAAsLQaiDwQAgAUH/HyABQf8fSxs2AgAPC0GUg8EAIAE2AgBBjIPBAEGMg8EAKAIAIABqIgA2AgAgASAAQQFyNgIEQZCDwQAoAgAgAUYEQEGIg8EAQQA2AgBBkIPBAEEANgIACyAAQaCDwQAoAgAiA00NAEGUg8EAKAIAIgJFDQBBACEBAkBBjIPBACgCACIEQSlJDQBB6IDBACEAA0AgAiAAKAIAIgVPBEAgBSAAKAIEaiACSw0CCyAAKAIIIgANAAsLQfCAwQAoAgAiAARAA0AgAUEBaiEBIAAoAggiAA0ACwtBqIPBACABQf8fIAFB/x9LGzYCACADIARPDQBBoIPBAEF/NgIACw8LIABBeHFB+IDBAGohAgJ/QYCDwQAoAgAiA0EBIABBA3Z0IgBxRQRAQYCDwQAgACADcjYCACACDAELIAIoAggLIQAgAiABNgIIIAAgATYCDCABIAI2AgwgASAANgIIDwtBkIPBACABNgIAQYiDwQBBiIPBACgCACAAaiIANgIAIAEgAEEBcjYCBCAAIAFqIAA2AgALhgwCDn8BfiMAQUBqIgQkACABKAIkIQkgASgCFCELIAEoAhAhBiAEQTBqIQwgBEEgaiIOQQhqIQ8CQAJAA0AgASgCACEDIAFBgICAgHg2AgAgBAJ/IANBgICAgHhHBEAgBiECIAEpAgghECABKAIEDAELIAYgC0YNAiABIAZBEGoiAjYCECAGKAIAIgNBgICAgHhGDQIgBikCCCEQIAYoAgQLNgIQIAQgAzYCDCAEIBA3AhRBfyAQpyIDIAlHIAMgCUsbIgZBAUcEQCAGQf8BcQRAIARBLGohCEEAIQYjAEEQayIFJAAgBEEMaiIHKAIIIQICQCAHLQAMIgwNAAJAIAJFDQAgBygCBEEQayEKIAJBBHQhCyACQQFrQf////8AcUEBagNAIAogC2oQbkUNASAGQQFqIQYgC0EQayILDQALIQYLIAkgAiAGayIGIAYgCUkbIgYgAksNACAHIAY2AgggBiECCwJAIAIgCU0EQCAIQYCAgIB4NgIADAELAkACQAJAIAIgCWsiA0UEQEEAIQZBBCECDAELIANB////P0sNAUGZ/8AALQAAGiADQQR0IgZBBBDIASICRQ0CCyAHIAk2AgggAiAHKAIEIAlBBHRqIAYQ9wEhAiAFIAw6AAwgBSADNgIIIAUgAjYCBCAFIAM2AgAgDEUEQCAFEFUgBSgCCCEDCyADBEAgB0EBOgAMIAggBSkCADcCACAIQQhqIAVBCGopAgA3AgAMAwsgCEGAgICAeDYCACAFKAIAIgJFDQIgBSgCBCACQQR0ENQBDAILEJcBAAtBBCAGQdT/wAAoAgAiAEHXACAAGxECAAALIAVBEGokACABQQhqIAhBCGopAgA3AgAgASAEKQIsNwIAIABBCGogB0EIaikCADcCACAAIAQpAgw3AgAMBAsgACAEKQIMNwIAIABBCGogBEEUaikCADcCAAwDCwJAIAIgC0cEQCABIAJBEGoiBjYCECACKAIAIgVBgICAgHhHDQELIARBADsBOCAEQQI6ADQgBEECOgAwIARBIDYCLCAEIAkgA2s2AjwgBEEMaiIBIARBLGoQKSAAIAQpAgw3AgAgBEEAOgAYIABBCGogAUEIaikCADcCAAwDCyAOIAIpAgQ3AgAgDyACQQxqKAIANgIAIAQgBTYCHCAEQSxqIQUgBEEcaiEDIwBBIGsiAiQAAkAgBEEMaiIHKAIIIgggCUYEQCAFQQE6AAAgBSADKQIANwIEIAVBDGogA0EIaikCADcCAAwBCyAJIAhrIQggBy0ADARAIAMtAAxFBEAgAxBVCyADKAIIIgogCE0EQCAHIAMoAgQiCCAIIApBBHRqEGxBACEKAkAgAy0ADA0AIAdBADoADEEBIQogBygCCCINIAlPDQAgAkEAOwEYIAJBAjoAFCACQQI6ABAgAkEgNgIMIAIgCSANazYCHCAHIAJBDGoQKQsgBUGAgICAeDYCBCAFIAo6AAAgAygCACIDRQ0CIAggA0EEdBDUAQwCCwJAIAMoAggiCiAITwRAIAMoAgQhCiACIAg2AgQgAiAKNgIADAELIAggCkH4p8AAENoBAAsgByACKAIAIgcgByACKAIEQQR0ahBsIAMoAgAhCiADKAIEIg0gAygCCCIHIAgQoQEgBSANNgIIIAUgCjYCBCAFQQE6AAAgBSADLQAMOgAQIAUgByAHIAhrIgMgAyAHSxs2AgwMAQsgAkEAOwEYIAJBAjoAFCACQQI6ABAgAiAINgIcIAJBIDYCDCAHIAJBDGoQKSAFQQE6AAAgBSADKQIANwIEIAVBDGogA0EIaikCADcCAAsgAkEgaiQAIAQtACxFBEAgASAEKQIMNwIAIAFBCGogBEEUaikCADcCACAEKAIwIgJBgICAgHhGDQEgAkUNASAEKAI0IAJBBHQQ1AEMAQsLIAQoAjBBgICAgHhHBEAgASAMKQIANwIAIAFBCGogDEEIaikCADcCAAsgACAEKQIMNwIAIABBCGogBEEUaikCADcCAAwBCyAAQYCAgIB4NgIAIAFBgICAgHg2AgALIARBQGskAAv8BAEKfyMAQTBrIgMkACADQQM6ACwgA0EgNgIcIANBADYCKCADIAE2AiQgAyAANgIgIANBADYCFCADQQA2AgwCfwJAAkACQCACKAIQIgpFBEAgAigCDCIARQ0BIAIoAgghASAAQQN0IQUgAEEBa0H/////AXFBAWohByACKAIAIQADQCAAQQRqKAIAIgQEQCADKAIgIAAoAgAgBCADKAIkKAIMEQEADQQLIAEoAgAgA0EMaiABKAIEEQAADQMgAUEIaiEBIABBCGohACAFQQhrIgUNAAsMAQsgAigCFCIARQ0AIABBBXQhCyAAQQFrQf///z9xQQFqIQcgAigCCCEIIAIoAgAhAANAIABBBGooAgAiAQRAIAMoAiAgACgCACABIAMoAiQoAgwRAQANAwsgAyAFIApqIgFBEGooAgA2AhwgAyABQRxqLQAAOgAsIAMgAUEYaigCADYCKCABQQxqKAIAIQRBACEJQQAhBgJAAkACQCABQQhqKAIAQQFrDgIAAgELIAggBEEDdGoiDCgCBEHsAEcNASAMKAIAKAIAIQQLQQEhBgsgAyAENgIQIAMgBjYCDCABQQRqKAIAIQQCQAJAAkAgASgCAEEBaw4CAAIBCyAIIARBA3RqIgYoAgRB7ABHDQEgBigCACgCACEEC0EBIQkLIAMgBDYCGCADIAk2AhQgCCABQRRqKAIAQQN0aiIBKAIAIANBDGogASgCBBEAAA0CIABBCGohACALIAVBIGoiBUcNAAsLIAcgAigCBE8NASADKAIgIAIoAgAgB0EDdGoiACgCACAAKAIEIAMoAiQoAgwRAQBFDQELQQEMAQtBAAsgA0EwaiQAC48EAQt/IAFBAWshDSAAKAIEIQogACgCACELIAAoAgghDANAAkACQCACIARJDQADQCABIARqIQUCQAJAIAIgBGsiB0EITwRAAkAgBUEDakF8cSIGIAVrIgMEQEEAIQADQCAAIAVqLQAAQQpGDQUgAyAAQQFqIgBHDQALIAdBCGsiACADTw0BDAMLIAdBCGshAAsDQCAGQQRqKAIAIglBipSo0ABzQYGChAhrIAlBf3NxIAYoAgAiCUGKlKjQAHNBgYKECGsgCUF/c3FyQYCBgoR4cQ0CIAZBCGohBiAAIANBCGoiA08NAAsMAQsgAiAERgRAIAIhBAwEC0EAIQADQCAAIAVqLQAAQQpGDQIgByAAQQFqIgBHDQALIAIhBAwDCyADIAdGBEAgAiEEDAMLA0AgAyAFai0AAEEKRgRAIAMhAAwCCyAHIANBAWoiA0cNAAsgAiEEDAILIAAgBGoiBkEBaiEEAkAgAiAGTQ0AIAAgBWotAABBCkcNAEEAIQUgBCIGIQAMAwsgAiAETw0ACwtBASEFIAIiACAIIgZHDQBBAA8LAkAgDC0AAEUNACALQejnwABBBCAKKAIMEQEARQ0AQQEPCyAAIAhrIQdBACEDIAAgCEcEQCAAIA1qLQAAQQpGIQMLIAEgCGohACAMIAM6AAAgBiEIIAsgACAHIAooAgwRAQAiACAFckUNAAsgAAvSBgEFfyMAQcABayICJAAgACgCACEDIAJBuAFqQeCEwAA2AgAgAkEEaiIAQawBakHohsAANgIAIABBpAFqQYiHwAA2AgAgAEGcAWpB+IbAADYCACACQZgBakH4hsAANgIAIAJBkAFqQaCCwAA2AgAgAkGIAWpBoILAADYCACACQYABakHohsAANgIAIABB9ABqQeiGwAA2AgAgAkHwAGpB6IbAADYCACACQegAakHohsAANgIAIABB3ABqQeiGwAA2AgAgAkHYAGpB2IbAADYCACACQdAAakGggsAANgIAIAJByABqQciGwAA2AgAgAkFAa0G4hsAANgIAIAJBOGpBqIbAADYCACACQTBqQZiGwAA2AgAgAEEkakGIhsAANgIAIAJBIGpB+IXAADYCACACQRhqQfiFwAA2AgAgAkEQakGggsAANgIAIAIgA0HCAWo2AqwBIAIgA0HcAGo2AqQBIAIgA0GIAWo2ApwBIAIgA0H0AGo2ApQBIAIgA0GsAWo2AowBIAIgA0GoAWo2AoQBIAIgA0HBAWo2AnwgAiADQcABajYCdCACIANBvwFqNgJsIAIgA0G+AWo2AmQgAiADQb0BajYCXCACIANB0ABqNgJUIAIgA0GkAWo2AkwgAiADQbABajYCRCACIANBsgFqNgI8IAIgA0HoAGo2AjQgAiADQcgAajYCLCACIANBvAFqNgIkIAIgA0EkajYCHCACIAM2AhQgAiADQaABajYCDCACQaCCwAA2AgggAiADQZwBajYCBCACIANBwwFqNgK8ASACIAJBvAFqNgK0AUEXIQZB9IjAACEEIwBBIGsiAyQAIANBFzYCACADQRc2AgQgASgCFEGYh8AAQQggASgCGCgCDBEBACEFIANBADoADSADIAU6AAwgAyABNgIIAn8D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IAMtAAwhAgNAIAUgAxBYIAAoAgAiBgRAIAAoAgQgBkEEdBDUAQsgACAFKQMANwIAIAAgAjoADCAAQQhqIAVBCGooAgA2AgAgASAAQRBqIgBHDQALCyABKAIAIgAEQCABKAIEIABBBHQQ1AELIAEgAykCADcCACABQQhqIANBCGopAgA3AgALIAVBEGokACAEQTBqJAAPCyABIAJBoJ7AABDcAQALIAIgAEGgnsAAENoBAAvIAQECfwJAAkAgACgCCCIFIAFPBEAgACgCBCABQQR0aiEAIAUgAWsiBCACSQRAQYyqwABBIUGwqsAAEIwBAAsgBCACayIEIAAgBEEEdGogAhASIAEgAmoiBCACSQ0BIAQgBUsNAiACBEAgAkEEdCECA0AgACADKQIANwIAIABBCGogA0EIaikCADcCACAAQRBqIQAgAkEQayICDQALCw8LIAEgBUG4p8AAENkBAAsgASAEQcinwAAQ3AEACyAEIAVByKfAABDaAQALjgEBA38jAEGAAWsiBCQAIAAoAgAhAANAIAIgBGpB/wBqIABBD3EiA0EwciADQdcAaiADQQpJGzoAACACQQFrIQIgAEEQSSAAQQR2IQBFDQALIAJBgAFqIgBBgQFPBEAgAEGAAUGc6MAAENkBAAsgAUGs6MAAQQIgAiAEakGAAWpBACACaxAUIARBgAFqJAALlgEBA38jAEGAAWsiBCQAIAAtAAAhAkEAIQADQCAAIARqQf8AaiACQQ9xIgNBMHIgA0E3aiADQQpJGzoAACAAQQFrIQAgAkH/AXEiA0EEdiECIANBEE8NAAsgAEGAAWoiAkGBAU8EQCACQYABQZzowAAQ2QEACyABQazowABBAiAAIARqQYABakEAIABrEBQgBEGAAWokAAuXAQEDfyMAQYABayIEJAAgAC0AACECQQAhAANAIAAgBGpB/wBqIAJBD3EiA0EwciADQdcAaiADQQpJGzoAACAAQQFrIQAgAkH/AXEiA0EEdiECIANBEE8NAAsgAEGAAWoiAkGBAU8EQCACQYABQZzowAAQ2QEACyABQazowABBAiAAIARqQYABakEAIABrEBQgBEGAAWokAAuNAQEDfyMAQYABayIEJAAgACgCACEAA0AgAiAEakH/AGogAEEPcSIDQTByIANBN2ogA0EKSRs6AAAgAkEBayECIABBEEkg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IQEgCCAFNgIEIAggATYCACACQSBqJAAMAQsgAkEBNgIMIAJBmJfAADYCCCACQgA3AhQgAkH0lsAANgIQIAJBCGpB7JfAABCSAQALIAMoAggiAUGBgICAeEYNACABRQ0BIAEgAygCDEHU/8AAKAIAIgBB1wAgABsRAgAACyADQRBqJAAMAQsQlwEACyAGQQhqIAcpAgQ3AwAgBigCCCEBIAYgBigCDDYCBCAGIAE2AgAgBigCBCEBIAAgBigCADYCACAAIAE2AgQgBkEgaiQAC3EBAX8jAEEQayICJAAgAiAAQSBqNgIMIAFBkYTAAEEGQZeEwABBBSAAQQxqQZyEwABBrITAAEEEIABBGGpBsITAAEEEIABBHGpBoILAAEG0hMAAQRAgAEHEhMAAQdSEwABBCyACQQxqEDIgAkEQaiQAC3EBAX8jAEEQayICJAAgAiAAQRNqNgIMIAFBrIrAAEEIQbSKwABBCiAAQaCCwABBvorAAEEKIABBBGpBoIDAAEEDIABBCGpBuIbAAEHvh8AAQQsgAEESakHohsAAQfqHwABBDiACQQxqEDIgAkEQaiQAC28BAX8jAEEwayICJAAgAiABNgIEIAIgADYCACACQSxqQdYANgIAIAJBAzYCDCACQYTkwAA2AgggAkICNwIUIAJB1gA2AiQgAiACQSBqNgIQIAIgAkEEajYCKCACIAI2AiAgAkEIakHkmsAAEJIBAAtsAQF/IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0EsakHWADYCACADQQI2AgwgA0GM5sAANgIIIANCAjcCFCADQdYANgIkIAMgA0EgajYCECADIAM2AiggAyADQQRqNgIgIANBCGogAhCSAQALZgECfyMAQRBrIgIkACAAKAIAIgNBAWohAAJ/IAMtAABFBEAgAiAANgIIIAFBtJLAAEEHIAJBCGpBvJLAABA3DAELIAIgADYCDCABQcySwABBAyACQQxqQdCSwAAQNwsgAkEQaiQAC2IBA38jAEEQayIDJAAgASgCCCEEIANBCGogASgCACACNQIAEEogAygCDCECIAMoAggiBUUEQCABQQRqIAQgAhDWASABIARBAWo2AggLIAAgBTYCACAAIAI2AgQgA0EQaiQAC2YAIwBBMGsiACQAQZj/wAAtAAAEQCAAQQI2AhAgAEHQ38AANgIMIABC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QRBxRQRAIANBIHFFBEAgADMBACABECMPCyMAQYABayIDJAAgAC8BACECQQAhAANAIAAgA2pB/wBqIAJBD3EiBEEwciAEQTdqIARBCkkbOgAAIABBAWshACACQf//A3EiBEEEdiECIARBEE8NAAsgAEGAAWoiAkGBAU8EQCACQYABQZzowAAQ2QEACyABQazowABBAiAAIANqQYABakEAIABrEBQgA0GAAWokAA8LIwBBgAFrIgMkACAALwEAIQJBACEAA0AgACADakH/AGogAkEPcSIEQTByIARB1wBqIARBCkkbOgAAIABBAWshACACQf//A3EiBEEEdiECIARBEE8NAAsgAEGAAWoiAkGBAU8EQCACQYABQZzowAAQ2QEACyABQazowABBAiAAIANqQYABakEAIABrEBQgA0GAAWokAAs3AQF/IAAoAgAhACABKAIcIgJBEHFFBEAgAkEgcUUEQCAAIAEQ3QEPCyAAIAEQRg8LIAAgARBHCzcBAX8gACgCACEAIAEoAhwiAkEQcUUEQCACQSBxRQRAIAAgARDbAQ8LIAAgARBIDwsgACABEEULsAIBAn8jAEEgayICJAAgAkEBOwEcIAIgATYCGCACIAA2AhQgAkHI5cAANgIQIAJByOTAADYCDCMAQRBrIgEkACACQQxqIgAoAggiAkUEQEGk4MAAEN4BAAsgASAAKAIMNgIMIAEgADYCCCABIAI2AgQjAEEQayIAJAAgAUEEaiIBKAIAIgIoAgwhAwJAAkACQAJAIAIoAgQOAgABAgsgAw0BQeDdwAAhAkEAIQMMAgsgAw0AIAIoAgAiAigCBCEDIAIoAgAhAgwBCyAAIAI2AgwgAEGAgICAeDYCACAAQejgwAAgASgCBCIAKAIIIAEoAgggAC0AECAALQAREDQACyAAIAM2AgQgACACNgIAIABB1ODAACABKAIEIgAoAgggASgCCCAALQAQIAAtABEQNAALMwEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUHYisAAQQ0gAkEMakHoisAAEDcgAkEQaiQACzABAX8gASgCHCICQRBxRQRAIAJBIHFFBEAgACABENsBDwsgACABEEgPCyAAIAEQRQswAQF/IAEoAhwiAkEQcUUEQCACQSBxRQRAIAAgARDdAQ8LIAAgARBGDwsgACABEEcLMAACQAJAIANp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AgAgCkEwaiQADAILQZ6TwABBxgAgCkEvakHkk8AAQcSUwAAQVgALIwBBMGsiACQAIABBATYCECAAQZTlwAA2AgwgAEIBNwIYIABB7QA2AiggACAAQSRqNgIUIAAgAEEvajYCJCAAQQxqQZiWwAAQkgEACyATQRBqJAAgAAvGAQECfyMAQRBrIgAkACABKAIUQaDfwABBCyABKAIYKAIMEQEAIQMgAEEIaiICQQA6AAUgAiADOgAEIAIgATYCACACIgEtAAQhAwJAIAItAAVFBEAgA0EARyEBDAELQQEhAiADRQRAIAEoAgAiAi0AHEEEcUUEQCABIAIoAhRB9+fAAEECIAIoAhgoAgwRAQAiAToABAwCCyACKAIUQfbnwABBASACKAIYKAIMEQEAIQILIAEgAjoABCACIQELIABBEGokACABCzABAX8gAEEQahAuAkAgACgCACIBQYCAgIB4Rg0AIAFFDQAgACgCBCABQQR0ENQBCwsvAQJ/IAAgACgCqAEiAiAAKAKsAUEBaiIDIAEgAEGyAWoQISAAQdwAaiACIAMQbQsvAQJ/IAAgACgCqAEiAiAAKAKsAUEBaiIDIAEgAEGyAWoQUCAAQdwAaiACIAMQbQsrACABIAJJBEBBjKnAAEEjQfypwAAQjAEACyACIAAgAkEEdGogASACaxASCyUAIABFBEBBqJbAAEEyEOoBAAsgACACIAMgBCAFIAEoAhARBwALMAAgASgCFCAALQAAQQJ0IgBBjI3AAGooAgAgAEHUjMAAaigCACABKAIYKAIMEQEACzAAIAEoAhQgAC0AAEECdCIAQdCNwABqKAIAIABBxI3AAGooAgAgASgCGCgCDBEBAAuoAQEDfyMAQeABayIBJAAjAEHwAWsiAiQAAkACQCAABEAgACgCAA0BIABBADYCACACQQxqIgMgAEHkARD3ARogASADQQRqQeABEPcBGiAAQeQBENQBIAJB8AFqJAAMAgsQ6wEACxDsAQALIAFBxAFqELMBIAFBDGoiABB7IAAQrgEgAUEwaiIAEHsgABCuASABQdAAahCvASABQdwAahC3ASABQeABaiQACyMAIABFBEBBqJbAAEEyEOoBAAsgACACIAMgBCABKAIQEQUACyMAIABFBEBBqJbAAEEyEOoBAAsgACACIAMgBCABKAIQERcACyMAIABFBEBB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cGFydAAAAAQAAAAEAAAABAAAAA0AAABwYXJ0cwAAAAQAAAAEAAAABAAAAA4AAABHcm91bmRFc2NhcGVFc2NhcGVJbnRlcm1lZGlhdGVDc2lFbnRyeUNzaVBhcmFtQ3NpSW50ZXJtZWRpYXRlQ3NpSWdub3JlRGNzRW50cnlEY3NQYXJhbURjc0ludGVybWVkaWF0ZURjc1Bhc3N0aHJvdWdoRGNzSWdub3JlT3NjU3RyaW5nU29zUG1BcGNTdHJpbmdmZ2JnYm9sZAFmYWludGl0YWxpY3VuZGVybGluZXN0cmlrZXRocm91Z2hibGlua2ludmVyc2VCdWZmZXJsaW5lcw8AAAAMAAAABAAAABAAAABjb2xzcm93c3Njcm9sbGJhY2tfbGltaXQEAAAADAAAAAQAAAARAAAAdHJpbV9uZWVkZWQABAAAAAQAAAAEAAAAEgAAAFBhcmFtcwAABAAAAAQAAAAEAAAAEwAAAFBhcnNlcnN0YXRlAAgAAAABAAAAAQAAABQAAABwYXJhbXMAABUAAAAMAAAABAAAABYAAABpbnRlcm1lZGlhdGVzAAAABAAAAAQAAAAEAAAAFwAAAE5vcm1hbEJvbGRGYWludEFzY2lpRHJhd2luZwAYAAAAJAAAAAQAAAAZAAAACAAAAAEAAAABAAAAGgAAAAQAAAAIAAAABAAAABsAAAAEAAAADAAAAAQAAAAcAAAACAAAAAoAAAABAAAAHQAAAAgAAAACAAAAAQAAAB4AAAAfAAAADAAAAAQAAAAgAAAACAAAAAEAAAABAAAAIQAAAAQAAAAUAAAABAAAACIAAAAjAAAADAAAAAQAAAAkAAAAVGVybWluYWxidWZmZXJvdGhlcl9idWZmZXJhY3RpdmVfYnVmZmVyX3R5cGVjdXJzb3JjaGFyc2V0c2FjdGl2ZV9jaGFyc2V0dGFic2luc2VydF9tb2Rlb3JpZ2luX21vZGVhdXRvX3dyYXBfbW9kZW5ld19saW5lX21vZGVuZXh0X3ByaW50X3dyYXBzdG9wX21hcmdpbmJvdHRvbV9tYXJnaW5zYXZlZF9jdHhhbHRlcm5hdGVfc2F2ZWRfY3R4ZGlydHlfbGluZXNyZXNpemFibGVyZXNpemVkACwCEAAEAAAAMAIQAAQAAACgAxAABgAAAKYDEAAMAAAAsgMQABIAAAA0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VVVVVFVVVVVVVVVVBQAUABQEUFVVVVVVVVUVUVVVVVVVVVUAAAAAAABAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQUAAFRVVVVVVVVVVVVVVVVVFQAAVVVRVVVVVVUFEAAAAQFQVVVVVVVVVVVVVQFVVVVVVVVVVVVVVVVVUFUAAFVVVVVVVVVVVVUFAEHQwsAAC+MNQFVVVVVVVVVVVVVVVVVFVAEAVFEBAFVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVEAVRVUVUVVVUFVVVVVVVVRUFVVVVVVVVVVVVVVVVVVVRBFRRQUVVVVVVVVVVQUVVVARBUUVVVVVUFVVVVVVUFAFFVVVVVVVVVVVVVVVVVVQQBVFVRVQFVVQVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVRVRVVVFVFVVVVVVVVVVVVVVUVFVVVVVVVVVVVVVVVVUEVAUEUFVBVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVRREBQRQVUFVVQVVVVVVVVVVUFVVVVVVVVVVVVVVVVUVRAFUVVFVFVVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVFFQVEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVEAQFVVFQBAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUQAAVFVVAEBVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVEVFVVVVVVVVVVVVVVVVVAQAAQAAEVQEAAAEAAAAAAAAAAFRVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBBABBQVVVVVVVVVAFVFVVVQFUVVVFQVVRVVVVUVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAAAAAAAAAABVVVVVVVVVAVVVVVVVVVVVVVVVVQVUVVVVVVVVBVVVVVVVVVUFVVVVVVVVVQVVVVVVVVVVVVVVVVVVVVVVEABQVUUBAABVVVFVVVVVVVVVVVVVFQBVVVVVVVVVVVVVVVVVQVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVAFVRVRVUBVVVVVVVVFRRVVVVVVVVVVVVVVVVVVUUAQEQBAFQVAAAUVVVVVVVVVVVVVVVVAAAAAAAAAEBVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVAABQBVVVVVVVVVVVVRUAAFVVVVBVVVVVVVVVBVAQUFVVVVVVVVVVVVVVVVVFUBFQVVVVVVVVVVVVVVVVVVUAAAVVVVVVVVVAAAAABABUUVVUUFVVVRUA139fX3//BUD3XdV1VVVVVVVVVVUAAAAAVVdVVf1XVVVVVVVVVVVVV1VVVVVVVVVVAAAAAAAAAABUVVVV1V1dVdV1VVV9VVVVVVVVVVVVVVXVV9V/////Vf//X1VVVV1V////VVVVVXVVVV9VVVVV9XVXVVVV1VVVVVVVVffX39ddXXX91///d1X/VV9dVV9XdVVVVX//9fVfVVVV9f9fVVVdXVVVXVVVVVVV1VVVVVV1VaVVVVVpVVVVVVVVVVVVVVVVVVVVqVaWVVVVVVVVVVVVVVX/////////////////////////////////////////////3///////////Vf///////////1VVVf/////1X1VV3/9fVfX1VV9f9df1X1VVVfVfVdVVVVVpVX1d9VVaVXdVVVVVVVVVVXdVqqqqVVVV399/31VVVZVVVVVVlVVV9VlVpVVVVVXpVfr/7//+///fVe//r/vv+1VZpVVVVVVVVVVWVVVVVV1VVVVmlZpVVVVVVVVV9f//VVVVVVWpVVVVVVVVVlVVlVVVVVVVVZVWVVVVVVVVVVVVVVVVVvlfVVVVVVVVVVVVVVVVVVVVVVVVVVUVUFVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVQAAAAAAAAAAqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVWqqqqqqlpVVVVVVVWqqqqqqqqqqqqqqqqqqgoAqqqqaqmqqqqqqqqqqqqqqqqqqqqqqqqqqmqBqqqqqqqqqqqqVamqqqqqqqqqqqqqqaqqqqqqqqqqqqqqqqiqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVVWVqqqqqqqqqqqqqqpqqqqqqqqqqqqqqv//qqqqqqqqqqqqqqqqqqqqVqqqqqqqqqqqqqqqqqpqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVAAABQVVVVVVVVVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVFRRVVVVVVVVVBVVRVVVVVVVBVVVVVVVUAAAAAUFVFFVVVVVVVVVVVVQUAUFVVVVVVFQAAUFVVVaqqqqqqqqpWQFVVVVVVVVVVVVVVFQVQUFVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVAUBBQVVVFVVVVFVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVQQUVAVRVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVUVRRVVVVVaqqqqqqqqqqqlVVVQAAAAAAQBUAQb/QwAALoQhVVVVVVVVVVUVVVVVVVVVVVQAAAACqqlpVAAAAAKqqqqqqqqqqaqqqqqpqqlVVVVVVqqqqqqqqqqpWVVVVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVVapqVVUAAFRdVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVBUBVAUFVAFVVVVVVVVVVVVVAFVVVVVVVVVVVVUFVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVRVUVVVVVVVVVVVVVVVVVVVVVVVVVQFVBQAAVFVVVVVVVVVVVVVVBVBVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVAAAAQFVVVVVVVVVVVVUUVFUVUFVVVVVVVVVVVVVVFUBBVUVVVVVVVVVVVVVVVVVVVVVAVVVVVVVVVVUVAAEAVFVVVVVVVVVVVVVVVVVVFVVVVVBVVVVVVVVVVVVVVVUFAEBVVQEUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVUARVRVVVVVVVVVUVFQBAVVVVVVVUVVVVVRVVVVUFAFQAVFVVVVVVVVVVVVVVVVVVVVUAAAVEVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVUUAEQRBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQVQVRBUVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVFQBAEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVEAEFVVVVVVVVVVVQEFEABVVVVVVVVVVVVVVVVVVVVVFQAAQVVVVVVVVVVVVVVVVVVUVRVEFVVVVVVVVVVVVVVVVVVVVVVVVVVVAAVVVFVVVVVVVVUBAEBVVVVVVVVVVVUVABRAVRVVVQFAAVVVVVVVVVVVVVVVBQAAQFBVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQAAQVVVVVQUAAAAAAAUABEFVVVVVVVVVVVVVVVVVVQFARRAAEFVVVVVVVVVVVVVVVVVVVVVVVVARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVUVVVQVVVVVVVVVVVVVVVVBUBVRFVVVVVVVVVVVVVVVVVVVVQVAAAAUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVFVVVVVVVVVVVVVVVVVVAEBVVVVVVRVVVVVVVVVVVVVVVVVVVVUVQFVVVVVVVVVVVVVVVVVVVVVVVVWqVFVVWlVVVaqqqqqqqqqqqqqqqqqqVVWqqqqqqlpVVVVVVVVVVVVVqqpWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqpqmmqqqqqqqqqqmpVVVVlVVVVVVVVVWpZVVVVqlVVqqqqqqqqqqqqqqqqqqqqqqqqqlVVVVVVVVVVQQBVVVVVVVVVAEHr2MAAC0VQAAAAAABAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVURUAUAAAAAQAEAVVVVVVVVVQVQVVVVVQVUVVVVVVVVVVVVVVVVVVUAQb3ZwAALAkAVAEHL2cAAC8slVFVRVVVVVFVVVVUVAAEAAABVVVVVAEAAAAAAFAAQBEBVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVQBAVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVlVVVVVVVVVVVVVVVVVVVVVVlVVVVVVVVVVVVVVVVf//f1X/////////X///////////////////X1X/////////76uq6v////9XVVVVVWpVVVWqqqqqqqqqqqqqqlWqqlZVWlVVVapaVVVVVVVVqqqqqqqqqqpWVVWpqpqqqqqqqqqqqqqqqqqqqqqqqqaqqqqqqlVVVaqqqqqqqqqqqqpqlapVVVWqqqqqVlaqqqqqqqqqqqqqqqqqqqqqqmqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlqqqqqqqqqqqqqqqqqqqqlpVVZVqqqqqqqqqVVVVVWVVVVVVVVVpVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVlaqqqqqqVVVVVVVVVVVVVVVVqlpVVmqpVapVVZVWVaqqVlVVVVVVVVVVqqqqVVZVVVVVVVWqqqqqqqqqqqqqqmqqqpqqqqqqqqqqqqqqqqqqqlVVVVVVVVVVVVVVVaqqqlaqqlZVqqqqqqqqqqqqqqqaqlpVpaqqqlWqqlZVqqpWVf///////////////////19YAAAADAAAAAQAAABZAAAAWgAAAFsAAAAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi42L3NyYy9kbG1hbGxvYy5yc2Fzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQA+C4QACkAAACoBAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplIDw9IHNpemUgKyBtYXhfb3ZlcmhlYWQAAPguEAApAAAArgQAAA0AAABBY2Nlc3NFcnJvcm1lbW9yeSBhbGxvY2F0aW9uIG9mICBieXRlcyBmYWlsZWQAAACrLxAAFQAAAMAvEAANAAAAbGlicmFyeS9zdGQvc3JjL2FsbG9jLnJz4C8QABgAAABiAQAACQAAAGxpYnJhcnkvc3RkL3NyYy9wYW5pY2tpbmcucnMIMBAAHAAAAIQCAAAeAAAAWAAAAAwAAAAEAAAAXAAAAF0AAAAIAAAABAAAAF4AAABdAAAACAAAAAQAAABfAAAAYAAAAGEAAAAQAAAABAAAAGIAAABjAAAAZAAAAAAAAAABAAAAZQAAAEhhc2ggdGFibGUgY2FwYWNpdHkgb3ZlcmZsb3eMMBAAHAAAAC9ydXN0L2RlcHMvaGFzaGJyb3duLTAuMTQuMy9zcmMvcmF3L21vZC5ycwAAsDAQACoAAABWAAAAKAAAAEVycm9yAAAAZgAAAAwAAAAEAAAAZwAAAGgAAABpAAAAY2FwYWNpdHkgb3ZlcmZsb3cAAAAMMRAAEQAAAGxpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMucnMoMRAAHAAAABkAAAAFAAAAYSBmb3JtYXR0aW5nIHRyYWl0IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yAGoAAAAAAAAAAQAAAGsAAABsaWJyYXJ5L2FsbG9jL3NyYy9mbXQucnOYMRAAGAAAAHkCAAAgAAAAKSBzaG91bGQgYmUgPCBsZW4gKGlzIClpbnNlcnRpb24gaW5kZXggKGlzICkgc2hvdWxkIGJlIDw9IGxlbiAoaXMgAADXMRAAFAAAAOsxEAAXAAAA1jEQAAEAAAByZW1vdmFsIGluZGV4IChpcyAAABwyEAASAAAAwDEQABYAAADWMRAAAQAAAGxpYnJhcnkvY29yZS9zcmMvZm10L21vZC5ycykwMTIzNDU2Nzg5YWJjZGVmQm9ycm93TXV0RXJyb3JhbHJlYWR5IGJvcnJvd2VkOiCCMhAAEgAAAFtjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlcQAAAAAAAAABAAAAcgAAAGluZGV4IG91dCBvZiBib3VuZHM6IHRoZSBsZW4gaXMgIGJ1dCB0aGUgaW5kZXggaXMgAADYMhAAIAAAAPgyEAASAAAAcwAAAAQAAAAEAAAAdAAAAD09IT1tYXRjaGVzYXNzZXJ0aW9uIGBsZWZ0ICByaWdodGAgZmFpbGVkCiAgbGVmdDogCiByaWdodDogADczEAAQAAAARzMQABcAAABeMxAACQAAACByaWdodGAgZmFpbGVkOiAKICBsZWZ0OiAAAAA3MxAAEAAAAIAzEAAQAAAAkDMQAAkAAABeMxAACQAAADogAABIMhAAAAAAALwzEAACAAAAcwAAAAwAAAAEAAAAdQAAAHYAAAB3AAAAICAgICB7ICwgIHsKLAp9IH0oKAosCl1saWJyYXJ5L2NvcmUvc3JjL2ZtdC9udW0ucnMAAP8zEAAbAAAAaQAAABcAAAAweDAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5AABIMhAAGwAAAAIIAAAJAAAAcwAAAAgAAAAEAAAAbgAAAGZhbHNldHJ1ZXJhbmdlIHN0YXJ0IGluZGV4ICBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCAAAAAhNRAAEgAAADM1EAAiAAAAcmFuZ2UgZW5kIGluZGV4IGg1EAAQAAAAMzUQACIAAABzbGljZSBpbmRleCBzdGFydHMgYXQgIGJ1dCBlbmRzIGF0IACINRAAFgAAAJ41EAANAAAAYXR0ZW1wdGVkIHRvIGluZGV4IHNsaWNlIHVwIHRvIG1heGltdW0g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AwEFKwM8CCoYASA3AQEBBAgEAQMHCgIdAToBAQECBAgBCQEKAhoBAgI5AQQCBAICAwMBHgIDAQsCOQEEBQECBAEUAhYGAQE6AQECAQQIAQcDCgIeATsBAQEMAQkBKAEDATcBAQMFAwEEBwILAh0BOgECAQIBAwEFAgcCCwIcAjkCAQECBAgBCQEKAh0BSAEEAQIDAQEIAVEBAgcMCGIBAgkLB0kCGwEBAQEBNw4BBQECBQsBJAkBZgQBBgECAgIZAgQDEAQNAQICBgEPAQADAAMdAh4CHgJAAgEHCAECCwkBLQMBAXUCIgF2AwQCCQEGA9sCAgE6AQEHAQEBAQIIBgoCATAfMQQwBwEBBQEoCQwCIAQCAgEDOAEBAgMBAQM6CAICmAMBDQEHBAEGAQMCxkAAAcMhAAONAWAgAAZpAgAEAQogAlACAAEDAQQBGQIFAZcCGhINASYIGQsuAzABAgQCAicBQwYCAgICDAEIAS8BMwEBAwICBQIBASoCCAHuAQIBBAEAAQAQEBAAAgAB4gGVBQADAQIFBCgDBAGlAgAEAAJQA0YLMQR7ATYPKQECAgoDMQQCAgcBPQMkBQEIPgEMAjQJCgQCAV8DAgEBAgYBAgGdAQMIFQI5AgEBAQEWAQ4HAwXDCAIDAQEXAVEBAgYBAQIBAQIBAusBAgQGAgECGwJVCAIBAQJqAQEBAgYBAWUDAgQBBQAJAQL1AQoCAQEEAZAEAgIEASAKKAYCBAgBCQYCAy4NAQIABwEGAQFSFgIHAQIBAnoGAwEBAgEHAQFIAgMBAQEAAgsCNAUFAQEBAAEGDwAFOwcAAT8EUQEAAgAuAhcAAQEDBAUICAIHHgSUAwA3BDIIAQ4BFgUBDwAHARECBwECAQVkAaAHAAE9BAAEAAdtBwBggPAAewlwcm9kdWNlcnMCCGxhbmd1YWdlAQRSdXN0AAxwcm9jZXNzZWQtYnkDBXJ1c3RjHTEuNzguMCAoOWIwMDk1NmU1IDIwMjQtMDQtMjkpBndhbHJ1cwYwLjIwLjMMd2FzbS1iaW5kZ2VuEjAuMi45MiAoMmE0YTQ5MzYyKQAsD3RhcmdldF9mZWF0dXJlcwIrD211dGFibGUtZ2xvYmFscysIc2lnbi1leHQ=");function LA(A){return"number"==typeof A?A:"string"==typeof A?A.split(":").reverse().map(parseFloat).reduce(((A,g,I)=>A+g*Math.pow(60,I))):void 0}class mA{constructor(){let A=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;this.speed=A,this.startTime=performance.now()}getTime(){return this.speed*(performance.now()-this.startTime)/1e3}setTime(A){this.startTime=performance.now()-A/this.speed*1e3}}class HA{constructor(){}getTime(A){}setTime(A){}}const KA=(async()=>(await JA(pA),YA))();class zA{constructor(A){this.core=A,this.driver=A.driver}onEnter(A){}init(){}play(){}pause(){}togglePlay(){}seek(A){return!1}step(){}stop(){this.driver.stop()}}class bA extends zA{async init(){try{return await this.core.initializeDriver(),this.core.setState("idle")}catch(A){throw this.core.setState("errored"),A}}async play(){this.core.dispatchEvent("play");const A=await this.init();await A.doPlay()}async togglePlay(){await this.play()}async seek(A){const g=await this.init();return await g.seek(A)}async step(){const A=await this.init();await A.step()}stop(){}}class vA extends zA{onEnter(A){let{reason:g,message:I}=A;this.core.dispatchEvent("idle",{message:I}),"paused"===g&&this.core.dispatchEvent("pause")}async play(){this.core.dispatchEvent("play"),await this.doPlay()}async doPlay(){const A=await this.driver.play();!0===A?this.core.setState("playing"):"function"==typeof A&&(this.core.setState("playing"),this.driver.stop=A)}async togglePlay(){await this.play()}seek(A){return this.driver.seek(A)}step(){this.driver.step()}}class xA extends zA{onEnter(){this.core.dispatchEvent("playing")}pause(){!0===this.driver.pause()&&this.core.setState("idle",{reason:"paused"})}togglePlay(){this.pause()}seek(A){return this.driver.seek(A)}}class ZA extends zA{onEnter(){this.core.dispatchEvent("loading")}}class WA extends zA{onEnter(A){let{message:g}=A;this.core.dispatchEvent("offline",{message:g})}}class TA extends zA{onEnter(A){let{message:g}=A;this.core.dispatchEvent("ended",{message:g})}async play(){this.core.dispatchEvent("play"),await this.driver.restart()&&this.core.setState("playing")}async togglePlay(){await this.play()}seek(A){return!0===this.driver.seek(A)&&(this.core.setState("idle"),!0)}}class jA extends zA{onEnter(){this.core.dispatchEvent("errored")}}class XA{constructor(A,g){this.logger=g.logger,this.state=new bA(this),this.stateName="uninitialized",this.driver=null,this.driverFn=A,this.changedLines=new Set,this.cursor=void 0,this.duration=void 0,this.cols=g.cols,this.rows=g.rows,this.speed=g.speed??1,this.loop=g.loop,this.idleTimeLimit=g.idleTimeLimit,this.preload=g.preload,this.startAt=LA(g.startAt),this.poster=this.parsePoster(g.poster),this.markers=this.normalizeMarkers(g.markers),this.pauseOnMarkers=g.pauseOnMarkers,this.commandQueue=Promise.resolve(),this.eventHandlers=new Map([["ended",[]],["errored",[]],["idle",[]],["init",[]],["input",[]],["loading",[]],["marker",[]],["offline",[]],["pause",[]],["play",[]],["playing",[]],["reset",[]],["resize",[]],["seeked",[]],["terminalUpdate",[]]])}addEventListener(A,g){this.eventHandlers.get(A).push(g)}dispatchEvent(A){let g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};for(const I of this.eventHandlers.get(A))I(g)}async init(){this.wasm=await KA;const A=this.feed.bind(this),g=this.now.bind(this),I=this.resetVt.bind(this),B=this.setState.bind(this),Q="npt"===this.poster.type?this.poster.value:void 0;this.driver=this.driverFn({feed:A,onInput:A=>{this.dispatchEvent("input",{data:A})},onMarker:A=>{let{index:g,time:I,label:B}=A;this.dispatchEvent("marker",{index:g,time:I,label:B})},reset:I,now:g,setTimeout:(A,g)=>window.setTimeout(A,g/this.speed),setInterval:(A,g)=>window.setInterval(A,g/this.speed),setState:B,logger:this.logger},{cols:this.cols,rows:this.rows,idleTimeLimit:this.idleTimeLimit,startAt:this.startAt,loop:this.loop,posterTime:Q,markers:this.markers,pauseOnMarkers:this.pauseOnMarkers}),"function"==typeof this.driver&&(this.driver={play:this.driver}),(this.preload||void 0!==Q)&&this.withState((A=>A.init()));const C="text"===this.poster.type?this.renderPoster(this.poster.value):void 0,E={isPausable:!!this.driver.pause,isSeekable:!!this.driver.seek,poster:C};if(void 0===this.driver.init&&(this.driver.init=()=>({})),void 0===this.driver.pause&&(this.driver.pause=()=>{}),void 0===this.driver.seek&&(this.driver.seek=A=>!1),void 0===this.driver.step&&(this.driver.step=()=>{}),void 0===this.driver.stop&&(this.driver.stop=()=>{}),void 0===this.driver.restart&&(this.driver.restart=()=>{}),void 0===this.driver.getCurrentTime){const A=this.driver.play;let g=new HA;this.driver.play=()=>(g=new mA(this.speed),A()),this.driver.getCurrentTime=()=>g.getTime()}return E}play(){return this.withState((A=>A.play()))}pause(){return this.withState((A=>A.pause()))}togglePlay(){return this.withState((A=>A.togglePlay()))}seek(A){return this.withState((async g=>{await g.seek(A)&&this.dispatchEvent("seeked")}))}step(){return this.withState((A=>A.step()))}stop(){return this.withState((A=>A.stop()))}withState(A){return this.enqueueCommand((()=>A(this.state)))}enqueueCommand(A){return this.commandQueue=this.commandQueue.then(A),this.commandQueue}getChangedLines(){if(this.changedLines.size>0){const A=new Map,g=this.vt.rows;for(const I of this.changedLines)I1&&void 0!==arguments[1]?arguments[1]:{};if(this.stateName===A)return this.state;if(this.stateName=A,"playing"===A)this.state=new xA(this);else if("idle"===A)this.state=new vA(this);else if("loading"===A)this.state=new ZA(this);else if("ended"===A)this.state=new TA(this);else if("offline"===A)this.state=new WA(this);else{if("errored"!==A)throw`invalid state: ${A}`;this.state=new jA(this)}return this.state.onEnter(g),this.state}feed(A){this.doFeed(A),this.dispatchEvent("terminalUpdate")}doFeed(A){const[g,I]=this.vt.feed(A);if(g.forEach((A=>this.changedLines.add(A))),this.cursor=void 0,I){const[A,g]=this.vt.get_size();this.vt.cols=A,this.vt.rows=g,this.logger.debug(`core: vt resize (${A}x${g})`),this.dispatchEvent("resize",{cols:A,rows:g})}}now(){return performance.now()*this.speed}async initializeDriver(){const A=await this.driver.init();this.cols=this.cols??A.cols??80,this.rows=this.rows??A.rows??24,this.duration=this.duration??A.duration,this.markers=this.normalizeMarkers(A.markers)??this.markers??[],0===this.cols&&(this.cols=80),0===this.rows&&(this.rows=24),this.initializeVt(this.cols,this.rows);const g=void 0!==A.poster?this.renderPoster(A.poster):void 0;this.dispatchEvent("init",{cols:this.cols,rows:this.rows,duration:this.duration,markers:this.markers,theme:A.theme,poster:g})}resetVt(A,g){let I=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,B=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;this.cols=A,this.rows=g,this.cursor=void 0,this.initializeVt(A,g),void 0!==I&&""!==I&&this.doFeed(I),this.dispatchEvent("reset",{cols:A,rows:g,theme:B})}initializeVt(A,g){this.logger.debug(`core: vt init (${A}x${g})`),this.vt=this.wasm.create(A,g,!0,100),this.vt.cols=A,this.vt.rows=g,this.changedLines.clear();for(let A=0;AB.feed(A)));const Q=B.get_cursor()??!1,C=[];for(let A=0;A"number"==typeof A?[A,""]:A))}}const OA=Symbol("store-raw"),PA=Symbol("store-node"),_A=Symbol("store-name");function $A(A,g){let B=A[I];if(!B&&(Object.defineProperty(A,I,{value:B=new Proxy(A,Eg)}),!Array.isArray(A))){const g=Object.keys(A),I=Object.getOwnPropertyDescriptors(A);for(let Q=0,C=g.length;Q!0,deleteProperty:()=>!0,ownKeys:function(A){return Qg(A),Reflect.ownKeys(A)},getOwnPropertyDescriptor:function(A,g){const B=Reflect.getOwnPropertyDescriptor(A,g);return B&&!B.get&&B.configurable&&g!==I&&g!==PA&&g!==_A?(delete B.value,delete B.writable,B.get=()=>A[I][g],B):B}};function eg(A,g,I,B=!1){if(!B&&A[g]===I)return;const Q=A[g],C=A.length;void 0===I?delete A[g]:A[g]=I;let E,e=Ig(A);(E=Bg(e,g,Q))&&E.$((()=>I)),Array.isArray(A)&&A.length!==C&&(E=Bg(e,"length",C))&&E.$(A.length),(E=e._)&&E.$()}function ig(A,g){const I=Object.keys(g);for(let B=0;B1){B=g.shift();const C=typeof B,E=Array.isArray(A);if(Array.isArray(B)){for(let Q=0;Q1)return void Vg(A[B],g,[B].concat(I));Q=A[B],I=[B].concat(I)}let C=g[0];"function"==typeof C&&(C=C(Q,I),C===Q)||void 0===B&&null==C||(C=gg(C),void 0===B||Ag(Q)&&Ag(C)&&!Array.isArray(C)?ig(Q,C):eg(A,B,C))}function tg(...[A,g]){const I=gg(A||{}),B=Array.isArray(I);return[$A(I),function(...A){h((()=>{B&&1===A.length?function(A,g){if("function"==typeof g&&(g=g(A)),g=gg(g),Array.isArray(g)){if(A===g)return;let I=0,B=g.length;for(;I=E&&i>=E&&(C[e]===A[i]||Q&&C[E]&&A[E]&&C[e][Q]===A[i][Q]);e--,i--)s[i]=C[e];if(E>i||E>e){for(I=E;I<=i;I++)eg(C,I,A[I]);for(;IA.length&&eg(C,"length",A.length))}for(t=new Array(i+1),I=i;I>=E;I--)V=A[I],o=Q&&V?V[Q]:V,g=n.get(o),t[I]=void 0===g?-1:g,n.set(o,I);for(g=E;g<=e;g++)V=C[g],o=Q&&V?V[Q]:V,I=n.get(o),void 0!==I&&-1!==I&&(s[I]=C[g],I=t[I],n.set(o,I));for(I=E;IA.length&&eg(C,"length",A.length))}const E=Object.keys(A);for(let g=0,I=E.length;g{if(!Ag(A)||!Ag(Q))return Q;const g=sg(Q,{[og]:A},og,I,B);return void 0===g?A:g}}const rg=P("");var ag=A=>{const g=D((()=>{if(1==A.text.length){const g=A.text.codePointAt(0);if(g>=9600&&g<=9631||57520==g||57522==g)return g}})),I=D((()=>g()?" ":A.text)),B=D((()=>function(A,g,I,B){const Q=A.get("fg"),C=A.get("bg");let E={"--offset":g,width:I*B+.01+"ch"};"string"==typeof Q&&(E["--fg"]=Q);"string"==typeof C&&(E["--bg"]=C);return E}(A.pen,A.offset,I().length,A.charWidth))),Q=D((()=>function(A,g,I){const B=cg(A.get("fg"),A.get("bold"),"fg-"),Q=cg(A.get("bg"),A.get("blink"),"bg-");let C=I??"";void 0!==g&&(C+=` cp-${g.toString(16)}`);B&&(C+=" "+B);Q&&(C+=" "+Q);A.has("bold")&&(C+=" ap-bright");A.has("faint")&&(C+=" ap-faint");A.has("italic")&&(C+=" ap-italic");A.has("underline")&&(C+=" ap-underline");A.has("blink")&&(C+=" ap-blink");A.get("inverse")&&(C+=" ap-inverse");return C}(A.pen,g(),A.extraClass)));return(()=>{const A=rg.cloneNode(!0);return BA(A,I),w((g=>{const I=Q(),C=B();return I!==g._v$&&$(A,g._v$=I),g._v$2=gA(A,C,g._v$2),g}),{_v$:void 0,_v$2:void 0}),A})()};function cg(A,g,I){if("number"==typeof A)return g&&A<8&&(A+=8),`${I}${A}`}const wg=P('');var Dg=A=>(()=>{const g=wg.cloneNode(!0);return BA(g,K(Z,{get each(){return(()=>{if("number"==typeof A.cursor){const g=[];let I=0,B=0;for(;B0&&g.push({...Q,text:Q.text.substring(0,C)}),g.push({...Q,text:Q.text[C],offset:Q.offset+C,extraClass:"ap-cursor"}),CK(ag,function(...A){let g=!1;for(let B=0;B=0;I--){const B=v(A[I])[g];if(void 0!==B)return B}},has(g){for(let I=A.length-1;I>=0;I--)if(g in v(A[I]))return!0;return!1},keys(){const g=[];for(let I=0;I=0;g--)if(A[g]){const I=Object.getOwnPropertyDescriptors(A[g]);for(const g in I)g in B||Object.defineProperty(B,g,{enumerable:!0,get(){for(let I=A.length-1;I>=0;I--){const B=(A[I]||{})[g];if(void 0!==B)return B}}})}return B}(A))})),g})();const hg=P('
');var lg=A=>{const g=()=>A.lineHeight??1.3333333333,I=D((()=>({width:`${A.cols}ch`,height:g()*A.rows+"em","font-size":100*(A.scale||1)+"%","font-family":A.fontFamily,"--term-line-height":`${g()}em`,"--term-cols":A.cols}))),B=D((()=>A.cursor?.[0])),Q=D((()=>A.cursor?.[1]));return(()=>{const g=hg.cloneNode(!0),C=A.ref;return"function"==typeof C?IA(C,g):A.ref=g,BA(g,K(x,{get each(){return A.lines},children:(A,g)=>K(Dg,{get segments(){return A.segments},get cursor(){return D((()=>g()===Q()))()?B():null}})})),w((B=>{const Q=!(!A.blink&&!A.cursorHold),C=!!A.blink,E=I();return Q!==B._v$&&g.classList.toggle("ap-cursor-on",B._v$=Q),C!==B._v$2&&g.classList.toggle("ap-blink",B._v$2=C),B._v$3=gA(g,E,B._v$3),B}),{_v$:void 0,_v$2:void 0,_v$3:void 0}),g})()};const Mg=P(''),yg=P(''),Gg=P(''),kg=P(''),Fg=P('
Fullscreen (f)
'),dg=P('');function ug(A){let g=Math.floor(A);const I=Math.floor(g/86400);g%=86400;const B=Math.floor(g/3600);g%=3600;const Q=Math.floor(g/60);return g%=60,I>0?`${Ng(I)}:${Ng(B)}:${Ng(Q)}:${Ng(g)}`:B>0?`${Ng(B)}:${Ng(Q)}:${Ng(g)}`:`${Ng(Q)}:${Ng(g)}`}function Ng(A){return A<10?`0${A}`:A.toString()}var fg=A=>{const g=A=>g=>{g.preventDefault(),A(g)},I=()=>"number"==typeof A.currentTime?ug(A.currentTime):"--:--",B=()=>"number"==typeof A.remainingTime?"-"+ug(A.remainingTime):I(),Q=D((()=>"number"==typeof A.duration?A.markers.filter((g=>g[0]{const g=A.currentTarget.offsetWidth,I=A.currentTarget.getBoundingClientRect(),B=A.clientX-I.left;return 100*Math.max(0,B/g)+"%"},[E,e]=c(!1),i=function(A,g){let I=!0;return function(){if(I){I=!1;for(var B=arguments.length,Q=new Array(B),C=0;CI=!0),g)}}}(A.onSeekClick,50),V=g=>{g._marker||g.altKey||g.shiftKey||g.metaKey||g.ctrlKey||0!==g.button||(e(!0),A.onSeekClick(C(g)))},t=A=>{A.altKey||A.shiftKey||A.metaKey||A.ctrlKey||E()&&i(C(A))},o=()=>{e(!1)};return document.addEventListener("mouseup",o),y((()=>{document.removeEventListener("mouseup",o)})),(()=>{const C=Fg.cloneNode(!0),E=C.firstChild,e=E.firstChild,i=e.nextSibling,o=E.nextSibling,s=A.ref;return"function"==typeof s?IA(s,C):A.ref=C,BA(C,K(W,{get when(){return A.isPausable},get children(){const I=Gg.cloneNode(!0);return AA(I,"click",g(A.onPlayClick),!0),BA(I,K(T,{get children(){return[K(j,{get when(){return A.isPlaying},get children(){return Mg.cloneNode(!0)}}),K(j,{get when(){return!A.isPlaying},get children(){return yg.cloneNode(!0)}})]}})),I}}),E),BA(e,I),BA(i,B),BA(C,K(W,{get when(){return"number"==typeof A.progress||A.isSeekable},get children(){const I=kg.cloneNode(!0),B=I.firstChild,C=B.firstChild.nextSibling;return B.$$mousemove=t,B.$$mousedown=V,BA(B,K(x,{get each(){return Q()},children:(I,B)=>(()=>{const Q=dg.cloneNode(!0),C=Q.firstChild,E=C.nextSibling;var e;return Q.$$mousedown=A=>{A._marker=!0},AA(Q,"click",(e=B(),g((()=>{A.onSeekClick({marker:e})}))),!0),BA(E,(()=>(A=>""===A[1]?ug(A[0]):`${ug(A[0])} - ${A[1]}`)(I))),w((g=>{const B=(g=>g[0]/A.duration*100+"%")(I),E=!!(g=>"number"==typeof A.currentTime&&g[0]<=A.currentTime)(I);return B!==g._v$&&Q.style.setProperty("left",g._v$=B),E!==g._v$2&&C.classList.toggle("ap-marker-past",g._v$2=E),g}),{_v$:void 0,_v$2:void 0}),Q})()}),null),w((g=>gA(C,{transform:`scaleX(${A.progress||0}`},g))),I}}),o),AA(o,"click",g(A.onFullscreenClick),!0),w((()=>C.classList.toggle("ap-seekable",!!A.isSeekable))),C})()};_(["click","mousedown","mousemove"]);const Rg=P('
💥
');var qg=A=>Rg.cloneNode(!0);const Jg=P('
');var Yg=A=>Jg.cloneNode(!0);const Ug=P('
');var Sg=A=>(()=>{const g=Ug.cloneNode(!0),I=g.firstChild;return BA(I,(()=>A.message)),w((g=>gA(I,{"font-family":A.fontFamily},g))),g})();const pg=P('
');var Lg=A=>(()=>{const g=pg.cloneNode(!0);var I;return AA(g,"click",(I=A.onClick,A=>{A.preventDefault(),I(A)}),!0),g})();_(["click"]);const mg=P('

Keyboard shortcuts

  • space - pause / resume
  • f - toggle fullscreen mode
  • / - rewind / fast-forward by 5 seconds
  • Shift + / - rewind / fast-forward by 10%
  • [ / ] - jump to the previous / next marker
  • 0, 1, 2 ... 9 - jump to 0%, 10%, 20% ... 90%
  • . - step through a recording, one frame at a time (when paused)
  • ? - toggle this help popup
');var Hg=A=>(()=>{const g=mg.cloneNode(!0),I=g.firstChild;var B;return AA(g,"click",(B=A.onClose,A=>{A.preventDefault(),B(A)}),!0),I.$$click=A=>{A.stopPropagation()},w((I=>gA(g,{"font-family":A.fontFamily},I))),g})();_(["click"]);const Kg=P('
');var zg=A=>{const g=A.logger,I=A.core,B=A.autoPlay,[Q,C]=tg({lines:[],cursor:void 0,charW:A.charW,charH:A.charH,bordersW:A.bordersW,bordersH:A.bordersH,containerW:0,containerH:0,isPausable:!0,isSeekable:!0,isFullscreen:!1,currentTime:null,remainingTime:null,progress:null,blink:!0,cursorHold:!1}),[E,e]=c(!1),[i,V]=c(B?null:"start"),[t,o]=c(null),[s,n]=c({cols:A.cols,rows:A.rows},{equals:(A,g)=>A.cols===g.cols&&A.rows===g.rows}),[r,a]=c(void 0),[l,G]=tg([]),[k,F]=c(!1),[d,u]=c(!1),[N,f]=c(void 0),R=D((()=>s().cols||80)),q=D((()=>s().rows||24)),J=()=>!1===A.controls?0:32;let Y,U,S,p,L,m,H,z,b;function v(){oA(),iA(),VA()}function x(A){h((()=>{A.rows{let{cols:g,rows:I,duration:B,theme:Q,poster:C,markers:E}=A;h((()=>{x({cols:g,rows:I}),a(B),f(Q),G(E),Z(C)}))})),I.addEventListener("play",(()=>{V(null)})),I.addEventListener("playing",(()=>{h((()=>{e(!0),V(null),O(),tA(),eA()}))})),I.addEventListener("idle",(()=>{h((()=>{e(!1),v()}))})),I.addEventListener("loading",(()=>{h((()=>{e(!1),v(),V("loader")}))})),I.addEventListener("offline",(A=>{let{message:g}=A;h((()=>{e(!1),v(),void 0!==g&&(o(g),V("info"))}))})),I.addEventListener("ended",(A=>{let{message:g}=A;h((()=>{e(!1),v(),void 0!==g&&(o(g),V("info"))}))})),I.addEventListener("errored",(()=>{V("error")})),I.addEventListener("resize",x),I.addEventListener("reset",(A=>{let{cols:g,rows:I,theme:B}=A;h((()=>{x({cols:g,rows:I}),f(B),O()}))})),I.addEventListener("seeked",(()=>{VA()})),I.addEventListener("terminalUpdate",(()=>{void 0===Y&&(Y=requestAnimationFrame(O))}));const X=()=>{b=new ResizeObserver(function(A,g){let I;return function(){for(var B=arguments.length,Q=new Array(B),C=0;CA.apply(this,Q)),g)}}((A=>{C({containerW:L.offsetWidth,containerH:L.offsetHeight}),L.dispatchEvent(new CustomEvent("resize",{detail:{el:m}}))}),10)),b.observe(L)};M((async()=>{g.info("player mounted"),g.debug("font measurements",{charW:Q.charW,charH:Q.charH}),X();const{isPausable:A,isSeekable:E,poster:e}=await I.init();h((()=>{C({isPausable:A,isSeekable:E,containerW:L.offsetWidth,containerH:L.offsetHeight}),Z(e)})),B&&I.play()})),y((()=>{I.stop(),oA(),iA(),b.disconnect()}));const O=()=>{const A=I.getChangedLines();h((()=>{A&&A.forEach(((A,g)=>{C("lines",g,ng(A))})),C("cursor",ng(I.getCursor())),C("cursorHold",!0)})),Y=void 0},P=D((()=>{const g=Q.charW*R()+Q.bordersW,I=Q.charH*q()+Q.bordersH;let B=A.fit??"width";if("both"===B||Q.isFullscreen){B=Q.containerW/(Q.containerH-J())>g/I?"height":"width"}if(!1===B||"none"===B)return{};if("width"===B){const A=Q.containerW/g;return{scale:A,width:Q.containerW,height:I*A+J()}}if("height"===B){const A=(Q.containerH-J())/I;return{scale:A,width:g*A,height:Q.containerH}}throw`unsupported fit mode: ${B}`})),_=()=>{C("isFullscreen",document.fullscreenElement??document.webkitFullscreenElement)},AA=()=>{Q.isFullscreen?(document.exitFullscreen??document.webkitExitFullscreen??(()=>{})).apply(document):(L.requestFullscreen??L.webkitRequestFullscreen??(()=>{})).apply(L)},QA=A=>{if(!(A.altKey||A.metaKey||A.ctrlKey)){if(" "==A.key)I.togglePlay();else if("."==A.key)I.step(),VA();else if("f"==A.key)AA();else if("["==A.key)I.seek({marker:"prev"});else if("]"==A.key)I.seek({marker:"next"});else if(A.key.charCodeAt(0)>=48&&A.key.charCodeAt(0)<=57){const g=(A.key.charCodeAt(0)-48)/10;I.seek(100*g+"%")}else if("?"==A.key)d()?u(!1):(I.pause(),u(!0));else if("ArrowLeft"==A.key)A.shiftKey?I.seek("<<<"):I.seek("<<");else if("ArrowRight"==A.key)A.shiftKey?I.seek(">>>"):I.seek(">>");else{if("Escape"!=A.key)return;u(!1)}A.stopPropagation(),A.preventDefault()}},CA=()=>{Q.isFullscreen&&sA(!0)},EA=()=>{Q.isFullscreen||sA(!1)},eA=()=>{S=setInterval(VA,100)},iA=()=>{clearInterval(S)},VA=()=>{const A=I.getCurrentTime(),g=I.getRemainingTime(),B=I.getProgress();C({currentTime:A,remainingTime:g,progress:B})},tA=()=>{p=setInterval((()=>{C((A=>{const g={blink:!A.blink};return g.blink&&(g.cursorHold=!1),g}))}),500)},oA=()=>{clearInterval(p),C("blink",!0)},sA=A=>{clearTimeout(U),A&&(U=setTimeout((()=>sA(!1)),2e3)),F(A)},nA=D((()=>{const g=A.theme||"auto/asciinema";return"auto/"===g.slice(0,5)?{name:g.slice(5),colors:N()}:{name:g}})),rA=(()=>{const g=Kg.cloneNode(!0),B=g.firstChild;"function"==typeof L?IA(L,g):L=g,g.addEventListener("webkitfullscreenchange",_),g.addEventListener("fullscreenchange",_),g.$$mousemove=CA,g.$$keydown=QA;return"function"==typeof m?IA(m,B):m=B,B.$$mousemove=()=>sA(!0),B.addEventListener("mouseleave",EA),BA(B,K(lg,{get cols(){return R()},get rows(){return q()},get scale(){return P()?.scale},get blink(){return Q.blink},get lines(){return Q.lines},get cursor(){return Q.cursor},get cursorHold(){return Q.cursorHold},get fontFamily(){return A.terminalFontFamily},get lineHeight(){return A.terminalLineHeight},ref(A){"function"==typeof H?H(A):H=A}}),null),BA(B,K(W,{get when(){return!1!==A.controls},get children(){return K(fg,{get duration(){return r()},get currentTime(){return Q.currentTime},get remainingTime(){return Q.remainingTime},get progress(){return Q.progress},markers:l,get isPlaying(){return E()},get isPausable(){return Q.isPausable},get isSeekable(){return Q.isSeekable},onPlayClick:()=>I.togglePlay(),onFullscreenClick:AA,onSeekClick:A=>I.seek(A),ref(A){"function"==typeof z?z(A):z=A}})}}),null),BA(B,K(T,{get children(){return[K(j,{get when(){return"start"==i()},get children(){return K(Lg,{onClick:()=>I.play()})}}),K(j,{get when(){return"loader"==i()},get children(){return K(Yg,{})}}),K(j,{get when(){return"info"==i()},get children(){return K(Sg,{get message(){return t()},get fontFamily(){return A.terminalFontFamily}})}}),K(j,{get when(){return"error"==i()},get children(){return K(qg,{})}})]}}),null),BA(B,K(W,{get when(){return d()},get children(){return K(Hg,{get fontFamily(){return A.terminalFontFamily},onClose:()=>u(!1)})}}),null),w((I=>{const Q=!!(!0===A.controls||"auto"===A.controls&&k()),C=`ap-player asciinema-player-theme-${nA().name}`,E=(()=>{const g={};!1!==A.fit&&"none"!==A.fit||void 0===A.terminalFontSize||("small"===A.terminalFontSize?g["font-size"]="12px":"medium"===A.terminalFontSize?g["font-size"]="18px":"big"===A.terminalFontSize?g["font-size"]="24px":g["font-size"]=A.terminalFontSize);const I=P();void 0!==I.width&&(g.width=`${I.width}px`,g.height=`${I.height}px`);const B=nA().colors;return void 0!==B&&(g["--term-color-foreground"]=B.foreground,g["--term-color-background"]=B.background,B.palette.forEach(((A,I)=>{g[`--term-color-${I}`]=A}))),g})();return Q!==I._v$&&g.classList.toggle("ap-hud",I._v$=Q),C!==I._v$2&&$(B,I._v$2=C),I._v$3=gA(B,E,I._v$3),I}),{_v$:void 0,_v$2:void 0,_v$3:void 0}),g})();return rA};_(["keydown","mousemove"]);class bg{log(){}debug(){}info(){}warn(){}error(){}}class vg{constructor(A,g){this.logger=A,this.prefix=g}log(A){for(var g=arguments.length,I=new Array(g>1?g-1:0),B=1;B1?g-1:0),B=1;B1?g-1:0),B=1;B1?g-1:0),B=1;B1?g-1:0),B=1;BI=>{g(A(I))}}(A))}flatMap(A){return this.transform(function(A){return g=>I=>{A(I).forEach(g)}}(A))}filter(A){return this.transform(function(A){return g=>I=>{A(I)&&g(I)}}(A))}take(A){return this.transform(function(A){let g=0;return I=>B=>{gB=>{g+=1,g>A&&I(B)}}(A))}transform(A){return new xg(this.input,this.xfs.concat([A]))}multiplex(A,g){return new xg(new Wg(this[Symbol.iterator](),A[Symbol.iterator](),g))}toArray(){return Array.from(this)}[Symbol.iterator](){let A=0,g=[],I=!1;const B=(Q=this.xfs,C=A=>g.push(A),Q.reverse().reduce(((A,g)=>{const I=Zg(g(A.step));return{step:I.step,flush:()=>{I.flush(),A.flush()}}}),Zg(C)));var Q,C;return{next:()=>{for(A===g.length&&(g=[],A=0);0===g.length;){const A=this.input.next();if(A.done)break;B.step(A.value)}return 0!==g.length||I||(B.flush(),I=!0),g.length>0?{done:!1,value:g[A++]}:{done:!0}}}}}function Zg(A){return"function"==typeof A?{step:A,flush:()=>{}}:A}class Wg{constructor(A,g,I){this.left=A,this.right=g,this.comparator=I}[Symbol.iterator](){let A,g;return{next:()=>{if(void 0===A&&void 0!==this.left){const g=this.left.next();g.done?this.left=void 0:A=g.value}if(void 0===g&&void 0!==this.right){const A=this.right.next();A.done?this.right=void 0:g=A.value}if(void 0===A&&void 0===g)return{done:!0};if(void 0===A){const A=g;return g=void 0,{done:!1,value:A}}if(void 0===g){const g=A;return A=void 0,{done:!1,value:g}}if(this.comparator(A,g)){const g=A;return A=void 0,{done:!1,value:g}}{const A=g;return g=void 0,{done:!1,value:A}}}}}}async function Tg(A){let g,I;if(A instanceof Response){const B=await A.text(),Q=function(A){const g=A.split("\n");let I;try{I=JSON.parse(g[0])}catch(A){return}const B=new xg(g).drop(1).filter((A=>"["===A[0])).map(JSON.parse).toArray();return{header:I,events:B}}(B);void 0!==Q?(g=Q.header,I=Q.events):g=JSON.parse(B)}else if("object"==typeof A&&"number"==typeof A.version)g=A;else{if(!Array.isArray(A))throw"invalid data";g=A[0],I=A.slice(1,A.length)}if(1===g.version)return function(A){let g=0;const I=new xg(A.stdout).map((A=>(g+=A[0],[g,"o",A[1]])));return{cols:A.width,rows:A.height,events:I}}(g);if(2===g.version)return function(A,g){return{cols:A.width,rows:A.height,theme:jg(A.theme),events:g,idleTimeLimit:A.idle_time_limit}}(g,I);throw`asciicast v${g.version} format not supported`}function jg(A){const g=/^#[0-9A-Fa-f]{6}$/,I=A?.fg,B=A?.bg,Q=A?.palette;if(g.test(I)&&g.test(B)&&/^(#[0-9A-Fa-f]{6}:){7,}#[0-9A-Fa-f]{6}$/.test(Q))return{foreground:I,background:B,palette:Q.split(":")}}function Xg(A){if("r"===A[1]){const[g,I]=A[2].split("x");return[A[0],"o",`[8;${I};${g};t`]}return A}function Og(A){return"number"==typeof A?[A,"m",""]:[A[0],"m",A[1]]}function Pg(){let A=0;return function(g){return"m"===g[1]?[g[0],g[1],{index:A++,time:g[0],label:g[2]}]:g}}class _g{constructor(){this.items=[],this.onPush=void 0}push(A){this.items.push(A),void 0!==this.onPush&&(this.onPush(this.popAll()),this.onPush=void 0)}popAll(){if(this.items.length>0){const A=this.items;return this.items=[],A}{const A=this;return new Promise((g=>{A.onPush=g}))}}}function $g(A,g,I,B,Q,C){if(0===A)return C.debug("using no buffer"),function(A){return{pushEvent(g){if("o"===g[1])A(g[2]);else if("r"===g[1]){const[I,B]=g[2].split("x");A(`[8;${B};${I};t`)}},pushText(g){A(g)},stop(){}}}(g);{let E;return"number"==typeof(A=A??{})?(C.debug(`using fixed time buffer (${A} ms)`),E=g=>A):"function"==typeof A?(C.debug("using custom dynamic buffer"),E=A({logger:C})):(C.debug("using adaptive buffer",A),E=function(A,g){let{logger:I}=A,{minTime:B=25,maxLevel:Q=100,interval:C=50,windowSize:E=20,smoothingFactor:e=.2,minImprovementDuration:i=1e3}=g,V=0,t=a(V),o=[],s=0,n=0,r=null;function a(A){return 0===A?B:C*A}return A=>{if(o.push(A),o.lengthgg>A?g:A))}(o);s=B*e+s*(1-e),n=(B-g)*e+n*(1-e);const C=s+n;if(A>t&&I.debug("buffer underrun",{latency:A,maxJitter:s,jitterRange:n,bufferTime:t}),Vt)t=a(V+=1),I.debug("jitter increased, raising bufferTime",{latency:A,maxJitter:s,jitterRange:n,bufferTime:t});else if(V>1&&Ci&&(r=performance.now(),t=a(V-=1),I.debug("jitter decreased, lowering bufferTime",{latency:A,maxJitter:s,jitterRange:n,bufferTime:t})),t;return r=null,t}}({logger:C},A)),function(A,g,I,B,Q){let C=arguments.length>5&&void 0!==arguments[5]?arguments[5]:1/60,E=performance.now()-1e3*Q,e=A(0);const i=new _g;C*=1e3;let V=-C,t=!1;function o(){return performance.now()-E}return setTimeout((async()=>{for(;!t;){const A=await i.popAll();if(t)return;for(const B of A){const A=1e3*B[0]+e;if(A-V0&&(await AI(Q),t))return;I(B[0]),g(B[2]),V=A}}}),0),{pushEvent(g){let I=o()-1e3*g[0];if(I<0&&(B.debug(`correcting epoch by ${I} ms`),E+=I,I=0),e=A(I),"o"===g[1])i.push(g);else if("r"===g[1]){const[A,I]=g[2].split("x");i.push([g[0],"o",`[8;${I};${A};t`])}},pushText(A){i.push([o(),"o",A])},stop(){t=!0,i.push(void 0)}}}(E,g,I,C,B??0,Q)}}function AI(A){return new Promise((g=>{setTimeout(g,A)}))}function gI(A){return Math.min(500*Math.pow(2,A),5e3)}function II(A){if(A.length<13)return;const g=function(A){const g=BI(A.subarray(0,4)),I=BI(A.subarray(4,8));return g+I/1e6}(A.subarray(0,8)),I=BI(A.subarray(8,12));return{time:g,data:A.subarray(12,12+I),len:I+12}}function BI(A){return A[0]+256*A[1]+256*A[2]*256+256*A[3]*256*256}const QI=new Map([["benchmark",function(A,g){let I,{url:B,iterations:Q=10}=A,{feed:C,setState:E,now:e}=g,i=0;return{async init(){const A=await Tg(await fetch(B)),{cols:g,rows:Q,events:C}=A;I=Array.from(C).filter((A=>{let[g,I,B]=A;return"o"===I})).map((A=>{let[g,I,B]=A;return[g,B]}));const E=I[I.length-1][0];for(const[A,g]of I)i+=new Blob([g]).size;return{cols:g,rows:Q,duration:E}},play(){const A=e();for(let A=0;A{E("stopped",{reason:"ended"})}),0),!0}}}],["clock",function(A,g,I){let{hourColor:B=3,minuteColor:Q=4,separatorColor:C=9}=A,{feed:E}=g,{cols:e=5,rows:i=1}=I;const V=Math.floor(i/2),t=Math.floor(e/2)-2,o=`[?25l[${V}B`;let s;const n=()=>{const A=new Date,g=A.getHours(),I=A.getMinutes(),E=[];E.push("\r");for(let A=0;A{n().forEach(E)};return{init:()=>{const A=[o].concat(n());return{cols:e,rows:i,duration:1440,poster:A}},play:()=>(E(o),r(),s=setInterval(r,1e3),!0),stop:()=>{clearInterval(s)},getCurrentTime:()=>{const A=new Date;return 60*A.getHours()+A.getMinutes()}}}],["eventsource",function(A,g){let I,B,{url:Q,bufferTime:C,minFrameTime:E}=A,{feed:e,reset:i,setState:V,logger:t}=g;t=new vg(t,"eventsource: ");let o=new HA;function s(A){void 0!==B&&B.stop(),B=$g(C,e,(A=>o.setTime(A)),A,E,t)}return{play:()=>{I=new EventSource(Q),I.addEventListener("open",(()=>{t.info("opened"),s()})),I.addEventListener("error",(A=>{t.info("errored"),t.debug({e:A}),V("loading")})),I.addEventListener("message",(A=>{const g=JSON.parse(A.data);if(Array.isArray(g))B.pushEvent(g);else if(void 0!==g.cols||void 0!==g.width){const A=g.cols??g.width,I=g.rows??g.height;t.debug(`vt reset (${A}x${I})`),V("playing"),s(g.time),i(A,I,g.init??void 0),o=new mA,"number"==typeof g.time&&o.setTime(g.time)}else"offline"===g.state&&(t.info("stream offline"),V("offline",{message:"Stream offline"}),o=new HA)})),I.addEventListener("done",(()=>{t.info("closed"),I.close(),V("ended",{message:"Stream ended"})}))},stop:()=>{void 0!==B&&B.stop(),void 0!==I&&I.close()},getCurrentTime:()=>o.getTime()}}],["random",function(A,g){let{feed:I,setTimeout:B}=g;const Q=" ".charCodeAt(0),C="~".charCodeAt(0)-Q;let E;const e=()=>{const A=Math.pow(5,4*Math.random());E=B(i,A)},i=()=>{e();const A=String.fromCharCode(Q+Math.floor(Math.random()*C));I(A)};return()=>(e(),()=>clearInterval(E))}],["recording",function(A,g,I){let B,Q,C,E,e,i,V,t,o,{feed:s,onInput:n,onMarker:r,now:a,setTimeout:c,setState:w,logger:D}=g,{idleTimeLimit:h,startAt:l,loop:M,posterTime:y,markers:G,pauseOnMarkers:k,cols:F,rows:d}=I,u=0,N=0,f=0;async function R(A,g){const I=await fetch(A,g);if(!I.ok)throw`failed fetching recording from ${A}: ${I.status} ${I.statusText}`;return I}function q(){const A=C[u];A?V=c(J,function(A){let g=1e3*A-(a()-t);return g<0&&(g=0),g}(A[0])):(Y(),f++,!0===M||"number"==typeof M&&f1e3*g[0]);q()}function Y(){clearTimeout(V),V=null}function U(A){const[g,I,B]=A;if("o"===I)s(B);else if("i"===I)n(B);else if("m"===I&&(r(B),k))return S(),o=1e3*g,w("idle",{reason:"paused"}),!0;return!1}function S(){return!V||(Y(),o=a()-t,!0)}function p(){t=a()-o,o=null,q()}function L(A){const g=!!V;S();const I=(o??0)/1e3;if("string"==typeof A)"<<"===A?A=I-5:">>"===A?A=I+5:"<<<"===A?A=I-.1*e:">>>"===A?A=I+.1*e:"%"===A[A.length-1]&&(A=parseFloat(A.substring(0,A.length-1))/100*e);else if("object"==typeof A)if("prev"===A.marker)A=m(I)??0,g&&I-A<1&&(A=m(A)??0);else if("next"===A.marker)A=function(A){if(0==E.length)return;let g,I=E.length-1,B=E[I];for(;B&&B[0]>A;)g=B[0],B=E[--I];return g}(I)??e;else if("number"==typeof A.marker){const g=E[A.marker];if(void 0===g)throw`invalid marker index: ${A.marker}`;A=g[0]}const B=Math.min(Math.max(A,0),e);B[A[0],"o",A[1]])),C=new xg(I).map((A=>[A[0],"i",A[1]])),E=new xg(B).map(Og);return Q.multiplex(C,((A,g)=>A[0]A[0]1&&void 0!==arguments[1]?arguments[1]:1/60;return B=>{let Q=0,C=0;return{step:A=>{Q++,void 0!==g?A[1]===g[1]&&A[0]-g[0]{void 0!==g&&(B(g),C++),A.debug(`batched ${Q} frames to ${C} frames`)}}}}(g,C)).map(function(A,g,I){let B=0,Q=0;return function(C){const E=C[0]-B-A;return B=C[0],E>0&&(Q+=E,C[0]"m"!==A[1])).multiplex(e,((A,g)=>A[0]"i"===A[1]?[A[0]+E,A[1],A[2]]:A)),i.sort(((A,g)=>A[0]-g[0])));const t=i[i.length-1][0],o=B-V.offset;return{...A,events:i,duration:t,effectiveStartAt:o}}(await g(await function(A){let{url:g,data:I,fetchOpts:B={}}=A;if("string"==typeof g)return R(g,B);if(Array.isArray(g))return Promise.all(g.map((A=>R(A,B))));if(void 0!==I)return"function"==typeof I&&(I=I()),I instanceof Promise||(I=Promise.resolve(I)),I.then((A=>"string"==typeof A||A instanceof ArrayBuffer?new Response(A):A));throw"failed fetching recording file: url/data missing in src"}(A),{encoding:o}),D,{idleTimeLimit:h,startAt:l,minFrameTime:I,inputOffset:V,markers_:G});if(({cols:B,rows:Q,events:C,duration:e,effectiveStartAt:i}=s),F=F??B,d=d??Q,0===C.length)throw"recording is missing events";void 0!==t&&function(A,g){const I=document.createElement("a"),B=A.events.map((A=>"m"===A[1]?[A[0],A[1],A[2].label]:A)),Q=function(A){return`${JSON.stringify({version:2,width:A.cols,height:A.rows})}\n${A.events.map(JSON.stringify).join("\n")}\n`}({...A,events:B});I.href=URL.createObjectURL(new Blob([Q],{type:"text/plain"})),I.download=g,I.click()}(s,t);const n=void 0!==y?(r=y,C.filter((A=>A[0]A[2]))):void 0;var r;return E=C.filter((A=>"m"===A[1])).map((A=>[A[0],A[2].label])),{cols:B,rows:Q,duration:e,theme:s.theme,poster:n,markers:E}},play:function(){if(V)throw"already playing";if(void 0===C[u])throw"already ended";return null!==i&&L(i),p(),!0},pause:S,seek:L,step:function(){let A=C[u++];for(;void 0!==A&&"o"!==A[1];)A=C[u++];if(void 0===A)return;s(A[2]);const g=A[0];N=g,o=1e3*g,i=null},restart:function(){if(V)throw"still playing";if(void 0!==C[u])throw"not ended";return L(0),p(),!0},stop:S,getCurrentTime:function(){return V?(a()-t)/1e3:(o??0)/1e3}}}],["websocket",function(A,g){let{url:I,bufferTime:B,reconnectDelay:Q=gI,minFrameTime:C}=A,{feed:E,reset:e,setState:i,logger:V}=g;V=new vg(V,"websocket: ");const t=new TextDecoder;let o,s,n,r=new HA,a=0,c=!1,w=!1;function D(A){void 0!==s&&s.stop(),s=$g(B,E,(A=>r.setTime(A)),A,C,V)}function h(A){if("string"==typeof A.data)V.info("activating asciicast-compatible handler"),D(),o.onmessage=l,l(A);else{const g=new Uint8Array(A.data);if(65==g[0]&&76==g[1]&&105==g[2]&&83==g[3])1==g[4]?(V.info("activating ALiS v1 handler"),o.onmessage=y):(V.warn(`unsupported ALiS version (${g[4]})`),o.close());else{V.info("activating raw text handler"),D();const I=t.decode(g),B=function(A){const g=A.match(/\x1b\[8;(\d+);(\d+)t/);if(null!==g)return[parseInt(g[2],10),parseInt(g[1],10)]}(I)??function(A){const g=A.match(/\[.*COLUMNS="(\d{1,3})" LINES="(\d{1,3})".*\]/);if(null!==g)return[parseInt(g[1],10),parseInt(g[2],10)]}(I);if(void 0!==B){const[A,g]=B;d(A,g,0,void 0)}o.onmessage=F,F(A)}}}function l(A){const g=JSON.parse(A.data);Array.isArray(g)?s.pushEvent(g):void 0!==g.cols||void 0!==g.width?d(g.cols??g.width,g.rows??g.height,g.time,g.init??void 0):"offline"===g.status&&u()}const M=54;function y(A){const g=A.data,I=new DataView(g),B=I.getUint8(0);let Q=1;if(1===B){const A=I.getUint16(Q,!0);Q+=2;const B=I.getUint16(Q,!0);Q+=2;const C=I.getFloat32(Q,!0);Q+=4;const E=I.getUint8(Q);let e;Q+=1,1===E&&(e=function(A){const g=G(A[0],A[1],A[2]),I=G(A[3],A[4],A[5]),B=[];for(let g=0;g<16;g++)B.push(G(A[3*g+6],A[3*g+7],A[3*g+8]));return{foreground:g,background:I,palette:B}}(new Uint8Array(g,Q,M)),Q+=M);const i=I.getUint32(Q,!0);let V;Q+=4,i>0&&(V=t.decode(new Uint8Array(g,Q,i)),Q+=i),d(A,B,C,V,e)}else if(111===B){const A=I.getFloat32(1,!0),B=I.getUint32(5,!0),Q=t.decode(new Uint8Array(g,9,B));s.pushEvent([A,"o",Q])}else if(114===B){const A=I.getFloat32(1,!0),g=I.getUint16(5,!0),B=I.getUint16(7,!0);s.pushEvent([A,"r",`${g}x${B}`])}else 4===B?u():V.debug(`unknown frame type: ${B}`)}function G(A,g,I){return`#${k(A)}${k(g)}${k(I)}`}function k(A){return A.toString(16).padStart(2,"0")}function F(A){s.pushText(t.decode(A.data))}function d(A,g,I,B,Q){V.debug(`stream reset (${A}x${g} @${I})`),i("playing"),D(I),e(A,g,B,Q),r=new mA,w=!0,"number"==typeof I&&r.setTime(I)}function u(){V.info("stream offline"),i("offline",w?{message:"Stream ended"}:{message:"Stream offline"}),r=new HA}function N(){o=new WebSocket(I),o.binaryType="arraybuffer",o.onopen=()=>{V.info("opened"),n=setTimeout((()=>{a=0}),1e3)},o.onmessage=h,o.onclose=A=>{if(c||1e3===A.code||1005===A.code)V.info("closed"),i("ended",{message:"Stream ended"});else{clearTimeout(n);const A=Q(a++);V.info(`unclean close, reconnecting in ${A}...`),i("loading"),setTimeout(N,A)}},w=!1}return{play:()=>{N()},stop:()=>{c=!0,void 0!==s&&s.stop(),void 0!==o&&o.close()},getCurrentTime:()=>r.getTime()}}]]),CI=new Map([["asciicast",Tg],["typescript",async function(A,g){let{encoding:I}=g;const B=new TextDecoder(I);let Q,C,E=(await A[0].text()).split("\n").filter((A=>A.length>0)).map((A=>A.split(" ")));E[0].length<3&&(E=E.map((A=>["O",A[0],A[1]])));const e=await A[1].arrayBuffer(),i=new Uint8Array(e),V=i.findIndex((A=>10==A))+1,t=B.decode(i.subarray(0,V)).match(/COLUMNS="(\d+)" LINES="(\d+)"/);null!==t&&(Q=parseInt(t[1],10),C=parseInt(t[2],10));const o={array:i,cursor:V};let s=o;if(void 0!==A[2]){const g=await A[2].arrayBuffer();s={array:new Uint8Array(g),cursor:V}}const n=[];let r=0;for(const A of E)if(r+=parseFloat(A[1]),"O"===A[0]){const g=parseInt(A[2],10),I=o.array.subarray(o.cursor,o.cursor+g),Q=B.decode(I);n.push([r,"o",Q]),o.cursor+=g}else if("I"===A[0]){const g=parseInt(A[2],10),I=s.array.subarray(s.cursor,s.cursor+g),Q=B.decode(I);n.push([r,"i",Q]),s.cursor+=g}else if("S"===A[0]&&"SIGWINCH"===A[2]){const g=parseInt(A[4].slice(5),10),I=parseInt(A[3].slice(5),10);n.push([r,"r",`${g}x${I}`])}else"H"===A[0]&&"COLUMNS"===A[2]?Q=parseInt(A[3],10):"H"===A[0]&&"LINES"===A[2]&&(C=parseInt(A[3],10));return Q=Q??80,C=C??24,{cols:Q,rows:C,events:n}}],["ttyrec",async function(A,g){let{encoding:I}=g;const B=new TextDecoder(I),Q=await A.arrayBuffer(),C=new Uint8Array(Q),E=II(C),e=E.time,i=B.decode(E.data).match(/\x1b\[8;(\d+);(\d+)t/),V=[];let t=80,o=24;null!==i&&(t=parseInt(i[2],10),o=parseInt(i[1],10));let s=0,n=II(C);for(;void 0!==n;){const A=n.time-e,g=B.decode(n.data);V.push([A,"o",g]),s+=n.len,n=II(C.subarray(s))}return{cols:t,rows:o,events:V}}]]);return A.create=function(A,g){let I=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const B=I.logger??new bg,Q=new XA(function(A){if("function"==typeof A)return A;"string"==typeof A&&(A="ws://"==A.substring(0,5)||"wss://"==A.substring(0,6)?{driver:"websocket",url:A}:"clock:"==A.substring(0,6)?{driver:"clock"}:"random:"==A.substring(0,7)?{driver:"random"}:"benchmark:"==A.substring(0,10)?{driver:"benchmark",url:A.substring(10)}:{driver:"recording",url:A});void 0===A.driver&&(A.driver="recording");if("recording"==A.driver&&(void 0===A.parser&&(A.parser="asciicast"),"string"==typeof A.parser)){if(!CI.has(A.parser))throw`unknown parser: ${A.parser}`;A.parser=CI.get(A.parser)}if(QI.has(A.driver)){const g=QI.get(A.driver);return(I,B)=>g(A,I,B)}throw`unsupported driver: ${JSON.stringify(A)}`}(A),{logger:B,cols:I.cols,rows:I.rows,loop:I.loop,speed:I.speed,preload:I.preload,startAt:I.startAt,poster:I.poster,markers:I.markers,pauseOnMarkers:I.pauseOnMarkers,idleTimeLimit:I.idleTimeLimit}),C=function(A,g){const I=80,B=24,Q=document.createElement("div");let C;Q.style.height="0px",Q.style.overflow="hidden",Q.style.fontSize="15px",document.body.appendChild(Q);const E=O((()=>(C=K(lg,{cols:I,rows:B,lineHeight:g,fontFamily:A,lines:[]}),C)),Q),e={charW:C.clientWidth/I,charH:C.clientHeight/B,bordersW:C.offsetWidth-C.clientWidth,bordersH:C.offsetHeight-C.clientHeight};return E(),document.body.removeChild(Q),e}(I.terminalFontFamily,I.terminalLineHeight),E={logger:B,core:Q,cols:I.cols,rows:I.rows,fit:I.fit,controls:I.controls??"auto",autoPlay:I.autoPlay??I.autoplay,terminalFontSize:I.terminalFontSize,terminalFontFamily:I.terminalFontFamily,terminalLineHeight:I.terminalLineHeight,theme:I.theme,...C};let e;const i=O((()=>(e=K(zg,E),e)),g),V={el:e,dispose:i,getCurrentTime:()=>Q.getCurrentTime(),getDuration:()=>Q.getDuration(),play:()=>Q.play(),pause:()=>Q.pause(),seek:A=>Q.seek(A),addEventListener:(A,g)=>Q.addEventListener(A,g.bind(V))};return V},A}({}); diff --git a/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-build-green.png b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-build-green.png new file mode 100644 index 00000000..b996ff6f Binary files /dev/null and b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-build-green.png differ diff --git a/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-commands.png b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-commands.png new file mode 100644 index 00000000..ec990c17 Binary files /dev/null and b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-commands.png differ diff --git a/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-from-dependabot.png b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-from-dependabot.png new file mode 100644 index 00000000..e546aeb9 Binary files /dev/null and b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-from-dependabot.png differ diff --git a/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-migration-finished.png b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-migration-finished.png new file mode 100644 index 00000000..6b1fd425 Binary files /dev/null and b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-migration-finished.png differ diff --git a/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-migration-start-comment.png b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-migration-start-comment.png new file mode 100644 index 00000000..69eeab5c Binary files /dev/null and b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-migration-start-comment.png differ diff --git a/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-takedown.png b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-takedown.png new file mode 100644 index 00000000..1d51898a Binary files /dev/null and b/assets/img/articles/2024-09-10-automating-code-migrations-at-scale/pull-request-takedown.png differ diff --git a/assets/img/authors/bartosz.galek.jpg b/assets/img/authors/bartosz.galek.jpg index 63abc8f3..27792952 100644 Binary files a/assets/img/authors/bartosz.galek.jpg and b/assets/img/authors/bartosz.galek.jpg differ