diff --git a/.stylelintrc.yml b/.stylelintrc.yml
index 27156f865..2a3fc8c75 100644
--- a/.stylelintrc.yml
+++ b/.stylelintrc.yml
@@ -12,6 +12,7 @@ rules:
   #   - https://github.com/stylelint/stylelint-config-recommended/blob/main/index.js
 
   # possible errors (these are all on by default)
+  declaration-block-no-redundant-longhand-properties: null
   no-descending-specificity: null
 
   # limit language features
diff --git a/content/_data/site.yaml b/content/_data/site.yaml
index 147ac8784..dc6b829ea 100644
--- a/content/_data/site.yaml
+++ b/content/_data/site.yaml
@@ -12,7 +12,9 @@ styles:
 facebook_id: 1820980378150914
 social:
   email: birds
-  twitter: oddbird
+  mastodon:
+    user: oddbird
+    server: front-end.social
   github: oddbird
 nav:
   - url: /work/
@@ -26,5 +28,5 @@ nav:
 me:
   - https://www.oddbird.net/
   - mailto:birds@oddbird.net
-  - https://twitter.com/oddbird
+  - https://front-end.social/@OddBird
   - https://github.com/oddbird
diff --git a/content/_data/webmentions.json b/content/_data/webmentions.json
index a25474f49..dc2fec4b1 100644
--- a/content/_data/webmentions.json
+++ b/content/_data/webmentions.json
@@ -1,5 +1,5 @@
 {
-  "lastFetched": "2023-10-09T08:06:29.347Z",
+  "lastFetched": "2023-10-23T08:05:56.397Z",
   "children": [
     {
       "type": "entry",
diff --git a/content/_includes/site/footer.njk b/content/_includes/site/footer.njk
index d2afd3bad..29087c4e4 100644
--- a/content/_includes/site/footer.njk
+++ b/content/_includes/site/footer.njk
@@ -6,9 +6,9 @@
 {%- set footer_title = "Let's chat about your web project" -%}
 {%- set footer_content -%}
   Fill out the form,
-  [schedule a call](https://calendly.com/oddbird/discovery),
-  send us an [email](mailto:birds@oddbird.net),
-  or find us on [Twitter](https://twitter.com/oddbird) or [GitHub](https://github.com/oddbird)
+  [schedule a call](https://calendly.com/oddbird/discovery), or
+  send us an [email](mailto:birds@oddbird.net).
+  {{ contact.social(site.social, 'OddBird', false, rel='me') | safe }}
 {%- endset -%}
 
 {%- if add_cta %}
diff --git a/content/_includes/talks.macros.njk b/content/_includes/talks.macros.njk
index d512e86fc..dafb65d97 100644
--- a/content/_includes/talks.macros.njk
+++ b/content/_includes/talks.macros.njk
@@ -136,16 +136,12 @@ params:
             ) }}
           {% endh %}
 
-          {% if not compact %}
-            {% if not event.is_future %}
-              {{ links(event) }}
-            {% elif event.data.discount %}
-              <p class="event-discount">
-                Use discount code
-                <code>{{ event.data.discount.code }}</code>
-                to get <strong>{{ event.data.discount.amount }} off</strong>
-              </p>
-            {% endif %}
+          {% if not event.is_future %}
+            {{ '' if compact else links(event) }}
+          {% elif event.data.note %}
+            <p class="event-note">
+              {{ event.data.note | mdInline | safe }}
+            </p>
           {% endif %}
         </li>
       {%- endfor -%}
diff --git a/content/birds/index.njk b/content/birds/index.njk
index 8a97185b6..632a63473 100644
--- a/content/birds/index.njk
+++ b/content/birds/index.njk
@@ -5,7 +5,9 @@ sub: Founded in 2008 by three odd siblings
 permalink: about/index.html
 bird: oddbird
 social:
-  twitter: oddbird
+  mastodon:
+    user: oddbird
+    server: front-end.social
   github: oddbird
   email: birds
 summary: |
diff --git a/content/blog/2023/fastapi-path-operations-for-django-developers.md b/content/blog/2023/fastapi-path-operations-for-django-developers.md
new file mode 100644
index 000000000..326dbbccf
--- /dev/null
+++ b/content/blog/2023/fastapi-path-operations-for-django-developers.md
@@ -0,0 +1,264 @@
+---
+title: FastAPI Path Operations for Django Developers
+author: ed
+date: 2023-10-19
+tags:
+  - Article
+  - Python
+  - Django
+  - FastAPI
+image:
+  src: blog/2023/fast.jpg
+summary: |
+  FastAPI path operations are the equivalent of Django views. In this article we
+  explore the differences, advantages, and gotchas of using them from the
+  perspective of a Django developer.
+---
+
+If you've heard about [FastAPI], a modern and fast web framework for building
+APIs with Python, you might be wondering how it compares to Django, the most
+popular and mature web framework for Python. In this series, I will answer this
+question by comparing various aspects and features of Django and FastAPI, based
+on our recent experience converting an internal project from Django to FastAPI.
+
+[FastAPI]: https://fastapi.tiangolo.com/
+
+1. FastAPI Path Operations for Django Developers (this article)
+2. [SQLAlchemy for Django Developers]
+3. Testing a FastAPI Application (coming soon)
+4. How To Use FastAPI Dependency Injection Everywhere (coming soon)
+
+[SQLAlchemy for Django Developers]: /2023/10/23/sqlalchemy-for-django-developers/
+
+## Why is FastAPI Worth Considering?
+
+I discovered Django when I wanted to explore web frameworks outside the ASP.NET
+and Windows ecosystem. I was impressed by its "batteries included" approach that
+provides everything you need to build a web application, from the database layer
+to the user interface. I also appreciate its "don't repeat yourself" philosophy
+that encourages developers to write less code and focus on the business logic.
+For over a decade, Django has been my go-to framework for building web apps that
+are secure, performant, and a pleasure to work with.
+
+In recent years, I have experienced two big shifts in the way I develop web
+applications. First, I expect development tools to do more for me when it comes
+to authoring software. Modern IDEs and code editors have really spoiled me with
+convenient features like go-to-definition, auto-completion, and one-click
+refactoring. This also means I expect languages and frameworks themselves to
+encourage best practices and help me write better code. Static type checking,
+automatic code formatting, and dependency injection are some of the features
+that I have a hard time living without.
+
+Because Django pre-dates Python's type checking system and it (rightly) wants to
+remain as backwards compatible as possible, all efforts to leverage static type
+checking and deeper text editor integration have been bolted-on, experimental,
+and incomplete. The main player in this space seems to be [django-stubs], which
+provides type hints for Django as a separate package. After using it for a
+while, my conclusion is that Django was not designed with types in mind, and
+efforts to add them are mostly futile. The time and effort of adding and
+maintaining type hints for a Django app is not worth the limited benefits.
+
+[django-stubs]: https://github.com/typeddjango/django-stubs
+
+The second shift has to do with the proliferation of single-page applications
+and the need for cohesion and consistency across the API and frontend layers.
+Cohesion means that the API should provide a clear and logical way to access and
+manipulate the data and services that the backend offers. Consistency means that
+the API should follow common standards and conventions for data types, formats,
+errors, validations, and documentation.
+
+Developing APIs with Django means you're probably using the excellent [Django
+REST Framework] (DRF for short). This package is a shining example of how Django
+gives you complete and robust functionality with very little code (shout out to
+you, `ViewSet`). However, it suffers from the same problems as Django itself: it
+was not designed with types in mind or to share information about endpoints and
+serializers with consumers of its APIs. We tried to bridge this gap with
+[drf-spectacular], which produces [OpenAPI] schemas from DRF views and
+serializers. Its main limitation is that it relies on developers to manually
+annotate their application with additional information, and there's no guarantee
+that your schema will be up-to-date with your code. For this reason I wouldn't
+consider it a definitive solution.
+
+[Django REST Framework]: https://www.django-rest-framework.org/
+[drf-spectacular]: https://github.com/tfranzel/drf-spectacular
+[OpenAPI]: https://swagger.io/specification/
+
+In the middle of all this, I kept hearing about FastAPI and how it was not only
+fast, but also leveraged Python's type system to provide a better developer
+experience *and* automatic documentation and schemas for API consumers. After
+following its excellent [tutorial], I asked the team to consider it for
+[OddBooks], our collaborative writing tool. An exploratory branch was created
+and after reviewing the resulting code, we decided to go ahead and officially
+switch to FastAPI for this project.
+
+[tutorial]: https://fastapi.tiangolo.com/tutorial/
+[OddBooks]: https://oddbooks.app
+
+## Django Views
+
+In OddBooks we have a `Version` model that encapsulates the idea of a snapshot
+of a document at a given point in time. Here's a simplified Django model:
+
+```python
+class Version(models.Model):
+    document = models.ForeignKey(Document, on_delete=models.CASCADE)
+    created_at = models.DateTimeField(auto_now_add=True)
+    title = models.CharField(max_length=255)
+    text = models.TextField()
+```
+
+And the corresponding DRF serializer and view set that only allows editing the
+document and text during creation, not updates:
+
+```python
+class VersionSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Version
+        fields = ["id", "document", "created_at", "title", "text"]
+        read_only_fields = ["id", "document", "created_at", "text"]
+
+class VersionCreateSerializer(VersionSerializer):
+    class Meta(VersionSerializer.Meta):
+        read_only_fields = ["id", "created_at"]
+
+class VersionViewSet(viewsets.ModelViewSet):
+    queryset = Version.objects.all()
+    serializer_class = VersionSerializer
+
+    def get_serializer_class(self):
+        if self.action == "create":
+            return VersionCreateSerializer
+        return super().get_serializer_class()
+```
+
+Notice a few things:
+
+- We don't get auto-complete or static type checking for the serializer fields.
+  We are on our own to fill out `fields` and `read_only_fields`. There's also no
+  way to know the types of the fields without looking at the model definition
+  directly.
+- We get no documentation or schemas for the API endpoints. We have to manually
+  write them and keep them up-to-date with the code.
+
+## FastAPI Path Operations
+
+Here's an equivalent version written as FastAPI path operations (the equivalent
+of Django views):
+
+```python
+from pydantic import BaseModel
+from fastapi import FastAPI
+
+class VersionUpdate(BaseModel):
+    title: str
+
+class VersionCreate(BaseModel):
+    document: int
+    title: str
+    text: str
+
+class VersionRead(BaseModel):
+    id: int
+    document: int
+    created_at: datetime
+    text: str
+
+app = FastAPI()
+
+@app.get("/versions", response_model=list[VersionRead])
+def list_versions():
+    return get_versions_from_db()
+
+@app.post("/versions", response_model=VersionRead, status_code=201)
+def create_version(version: VersionCreate):
+    return write_version_to_db(**version.dict())
+
+@app.put("/versions/{version_id}", response_model=VersionRead)
+def update_version(version_id: int, version: VersionUpdate):
+    version = get_version_from_db(id=version_id)
+    version.title = version.title
+    version.save()
+    return version
+
+@app.get("/versions/{version_id}", response_model=VersionRead)
+def get_version(version_id: int):
+    return get_version_from_db(id=version_id)
+
+@app.delete("/versions/{version_id}", status_code=204)
+def delete_version(version_id: int):
+    delete_version_from_db(id=version_id)
+```
+
+*Note: I'm hiding the actual database read and write operations behind
+`get_versions_from_db` and similar functions. How you [connect to your database]
+is a separate topic and I want to focus on writing and consuming API endpoints
+here.*
+
+[connect to your database]: /2023/10/23/sqlalchemy-for-django-developers/
+
+In contrast with the Django version, we get:
+
+- Auto-complete and static type checking for the model fields thanks to
+  [Pydantic]. Need to see what fields are available on a version instance? Just
+  type `version.` and your editor will show you the available fields and their
+  types.
+- [Automatic documentation] and [OpenAPI schema] for the API endpoints. This is
+  cohesive and consistent enough to be used to autogenerate frontend type
+  definitions and [API clients]. We are actually doing this in OddBooks and it
+  has done away with a handful of unit / integration tests and consistently
+  warns the frontend team when the API has changed.
+- Runtime validation of the request body and URL parameters by using type hints.
+  FastAPI will ensure that something like `def update_version(id: int, version:
+  VersionUpdate):` will only accept a JSON body with a `title` field and an
+  integer URL parameter.
+- Automatic serialization of the response body by using the `response_model`
+  parameter. FastAPI will ensure that the response body is a JSON object with
+  the expected fields and types. The path operation itself can return anything
+  that can be converted to JSON, including Pydantic models, dictionaries, lists,
+  and primitives.
+
+[Pydantic]: https://docs.pydantic.dev/latest/
+[Automatic documentation]: https://fastapi.tiangolo.com/tutorial/path-params/#documentation
+[OpenAPI schema]: https://fastapi.tiangolo.com/tutorial/first-steps/#check-the-openapijson
+[API clients]: https://fastapi.tiangolo.com/advanced/generate-clients/
+
+## Advice for Django Developers
+
+You will notice that the FastAPI version is considerably more verbose than the
+Django version. This is where Django's "batteries included" approach really
+shines. However, I would argue that the verbosity is worth it for the benefits
+listed above, and by also nudging developers to be explicit in the input and
+output types of each individual endpoint, instead of relying on the hooks
+provided by DRF to serialize and deserialize data in different ways. You might
+even say we have traded one set of "batteries" for another.
+
+FastAPI itself doesn't have concepts of models or serializers. Instead, it
+relies on [Pydantic] models to validate data. These models are not meant to be
+used as representations of database tables, but rather as representations of the
+data that is sent and received by the API, so they are closer to DRF
+serializers.
+
+I spent a non-trivial amount of time trying to make FastAPI behave like Django
+by trying to minimize the amount of Pydantic models. If Django only needs one or
+two serializers for all CRUD operations, why can't FastAPI do the same? I
+started going down the rabbit hole of adding custom methods and properties,
+using inheritance, and in general introducing a lot of complexity to get that
+DRY magic back. I eventually realized that I was fighting against the framework
+instead of embracing it, and that I was better off writing small, focused
+Pydantic models for each endpoint.
+
+## Conclusion
+
+So, is FastAPI worth considering? I would say yes, especially if you're
+developing an API that needs to be consumed by a frontend application. The
+benefits of static type checking, automatic documentation, and automatic schema
+generation are too good to pass up. If you're developing a traditional,
+multi-page application then the benefits are less clear and you might be better
+off sticking with Django because while FastAPI offers Jinja2 support for
+[templating] and easily serves [static files] as well, it lacks a [built-in ORM]
+and [admin interface].
+
+[templating]: https://fastapi.tiangolo.com/advanced/templates/
+[static files]: https://fastapi.tiangolo.com/tutorial/static-files/
+[built-in ORM]: https://docs.djangoproject.com/en/4.2/topics/db/queries/
+[admin interface]: https://docs.djangoproject.com/en/4.2/ref/contrib/admin/
diff --git a/content/blog/2023/sqlalchemy-for-django-developers.md b/content/blog/2023/sqlalchemy-for-django-developers.md
new file mode 100644
index 000000000..d47c7314b
--- /dev/null
+++ b/content/blog/2023/sqlalchemy-for-django-developers.md
@@ -0,0 +1,361 @@
+---
+title: SQLAlchemy for Django Developers
+author: ed
+date: 2023-10-23
+tags:
+  - Article
+  - Python
+  - Django
+  - FastAPI
+  - SQLAlchemy
+image:
+  src: blog/2023/library.jpg
+summary: |
+  SQLAlchemy is a Python library for interacting with relational databases. It
+  is a popular alternative to Django's ORM used by frameworks such as FastAPI.
+  In this article we will help curious Django developers write their first
+  queries with SQLAlchemy, and highlight key differences.
+---
+
+If you've heard about [FastAPI], a modern and fast web framework for building
+APIs with Python, you might be wondering how it compares to Django, the most
+popular and mature web framework for Python. In this series, I will answer this
+question by comparing various aspects and features of Django and FastAPI, based
+on our recent experience converting an internal project from Django to FastAPI.
+
+[FastAPI]: https://fastapi.tiangolo.com/
+
+1. [FastAPI Path Operations for Django Developers]
+2. SQLAlchemy for Django Developers (this article)
+3. Testing a FastAPI Application (coming soon)
+4. How To Use FastAPI Dependency Injection Everywhere (coming soon)
+
+[FastAPI Path Operations for Django Developers]: /2023/10/19/fastapi-path-operations-for-django-developers/
+
+## About SQLAlchemy
+
+Both Django's [ORM] (Object Relational Mapper) and [SQLAlchemy] are libraries
+for interacting with relational databases. Django's ORM is tightly coupled with
+the Django framework, while SQLAlchemy is a standalone library that can be used
+with any Python application. I heard about it many years ago, but never had the
+need to use it because Django's ORM was good enough for me (to the point that I
+know surprisingly little SQL). But when I started using FastAPI, SQLAlchemy was
+the recommended library for interacting with the database. Let's follow
+SQLAlchemy's [Quick Start] guide to create a simple database while learning
+about the differences between SQLAlchemy and Django's ORM.
+
+[ORM]: https://docs.djangoproject.com/en/4.2/topics/db/queries/
+[SQLAlchemy]: https://www.sqlalchemy.org/
+[Quick Start]: https://docs.sqlalchemy.org/en/20/orm/quickstart.html
+
+## Model Definition: Surprisingly Similar
+
+The first thing I noticed when I started using SQLAlchemy was how similar it is
+to Django's ORM when it comes to defining models as classes that represent
+database tables. Here is an example of a `User` model in Django:
+
+```python
+from django.db import models
+
+class User(models.Model):
+    name = models.CharField(max_length=100)
+    fullname = models.TextField()
+```
+
+And here is the same model in SQLAlchemy:
+
+```python
+from sqlalchemy import String
+from sqlalchemy.orm import Mapped, mapped_column, DeclarativeBase
+
+class User(DeclarativeBase):
+     __tablename__ = "user_account"
+
+     id: Mapped[int] = mapped_column(primary_key=True)
+     name: Mapped[str] = mapped_column(String(30))
+     fullname: Mapped[Optional[str]]
+```
+
+*Note: this [declarative style] for model definition is relatively new,
+superseding the old `declarative_base` function in SQLAlchemy 2.0. You might
+still encounter the old style in some codebases.*
+
+[declarative style]: https://docs.sqlalchemy.org/en/20/orm/mapping_styles.html#orm-declarative-mapping
+
+These two models are similar in that once they get information out of the
+database, table columns are accessible as attributes of the model instances such
+as `user.name` and `user.fullname`. In the same way, modifying the attributes of
+a model instance like `user.name = "Jane"` will modify the corresponding
+database record when the object is "saved" (which is done differently in
+SQLAlchemy as we will see later).
+
+In contrast, these models differ in that SQLAlchemy relies more heavily on type
+hints to define the model. In my opinion this results in a more natural and
+robust developer experience. For example, the `fullname` field only requires the
+`Mapped[Optional[str]]` annotation to be mapped to a nullable text column.
+Fields that require further customization that can't be expressed in a type
+hint, like setting a character limit or marking a column as primary key, can use
+the [`mapped_column`] function as seen in the `id` and `name` fields. In all
+cases, by using the [`Mapped`] annotation type checkers have everything they
+need to correctly type the model attributes.
+
+[`mapped_column`]: https://docs.sqlalchemy.org/en/20/orm/mapping_api.html#sqlalchemy.orm.mapped_column
+[`Mapped`]: https://docs.sqlalchemy.org/en/20/orm/internals.html#sqlalchemy.orm.Mapped
+
+SQLAlchemy also supports defining models with the
+[imperative syntax], which is less similar to Django's ORM. I personally prefer
+the declarative syntax and find it more readable and intuitive.
+
+[imperative syntax]: https://docs.sqlalchemy.org/en/20/orm/mapping_styles.html#orm-imperative-mapping
+
+## Engines and Sessions Instead of Managers
+
+In Django, every model comes with a manager exposed as the `objects` attribute.
+This means that as long as you get a reference to the model class, you can
+access the manager and perform queries. For example, for the `User` model, you
+can get all users with `User.objects.all()`.
+
+In SQLAlchemy, you need to create an [engine] and [session] first before you can
+perform any queries. You can think of the engine as a factory that provides us
+with database connections, and sessions map roughly to these individual
+connections.
+
+[engine]: https://docs.sqlalchemy.org/en/20/core/connections.html#sqlalchemy.engine.Engine
+[session]: https://docs.sqlalchemy.org/en/20/tutorial/dbapi_transactions.html#tutorial-executing-orm-session
+
+```python
+from sqlalchemy import create_engine
+from sqlalchemy.orm import Session
+
+engine = create_engine("sqlite:///db.sqlite3")
+with Session(engine) as session:
+    users = session.execute("SELECT * FROM users").all()
+```
+
+*Notice we are using raw SQL here instead of the ORM. We will get to the ORM in
+the next section.*
+
+You don't need to use a context manager to create a session, but it is
+recommended so that the session is automatically closed when you are done with
+it. This can get annoying when you are writing FastAPI path operations because
+the code for each operation will be inside a context manager. Luckily, you can
+create a FastAPI dependency that `yield`s the session from the context manager
+and use it by declaring it as an argument in your path operation.
+
+```python
+from fastapi import Depends, FastAPI
+from sqlalchemy import create_engine
+from sqlalchemy.orm import Session, sessionmaker
+
+engine = create_engine("sqlite:///db.sqlite3")
+SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
+
+app = FastAPI()
+
+def get_session() -> Session:
+    with SessionLocal() as session:
+        yield session
+
+@app.get("/users", response_model=...)
+def get_users(session: Session = Depends(get_session)):
+    return session.execute("SELECT * FROM users").all()
+```
+
+## Query with Class Attributes Instead of Keyword Arguments
+
+In Django, you can query a model with keyword arguments. For example, if you
+want to get a single user with the name "John", you can do
+`User.objects.get(name="John")`. In SQLAlchemy, you need to use class attributes
+instead:
+
+```python
+from sqlalchemy import select
+
+john = session.scalars(select(User).where(User.name == "John")).one()
+```
+
+The `where` method is chained to the `select` function and achieves the same as
+the `filter` and `get` methods in Django. However, instead of keyword arguments,
+we use an actual comparison of the `name` attribute with the string `"John"`.
+This caught me off guard at first but I've come to appreciate it because I get
+help from my text editor when building queries instead of trying to guess the
+names of keyword arguments.
+
+More complex queries are also different. Django encourages you to use a double
+underscore syntax for more specific lookups. For example, to get all users with
+IDs 1, 2, or 3, you use `User.objects.filter(id__in=[1, 2, 3])`. SQLAlchemy
+achieves this by exposing custom methods as part of the class attributes:
+
+```python
+users = session.scalars(select(User).where(User.id.in_([1, 2, 3]))).all()
+```
+
+*The trailing underscore in `in_()` is needed because `in` is a reserved word in
+Python, not because of anything specific to SQLAlchemy.*
+
+There's a whole host of interesting methods you can use with model attributes as
+explained in the [`ColumnElement` documentation].
+
+[`ColumnElement` documentation]:
+    https://docs.sqlalchemy.org/en/20/core/sqlelement.html#sqlalchemy.sql.expression.ColumnElement
+
+The `select` function accepts entire model classes or individual columns as
+arguments. For example, to get only the `name` column, you can do
+`select(User.name)`.
+
+Finally, notice that we call `one()` or `all()` instead of using separate
+`get()` and `filter()` methods. This is because the `scalars` method returns a
+[ScalarResult] that allows us to chose how to get the results.
+
+[ScalarResult]: https://docs.sqlalchemy.org/en/20/core/connections.html#sqlalchemy.engine.ScalarResult
+
+## Commit Sessions Instead of Saving Model Instances
+
+In Django, given a model instance `user`, you can save it to the database with
+`user.save()`. In SQLAlchemy, you need to commit the session instead:
+
+```python
+session.add(user)
+session.commit()
+```
+
+This actually makes it easier to bundle together multiple "saves", even if they
+are for different models, into a single transaction. You can do this by adding
+multiple objects to the session and then committing the session.
+
+```python
+user1 = User(...)
+user2 = User(...)
+address1 = Address(...)
+session.add_all([user1, user2, address1])
+session.commit()
+```
+
+In Django terms, the session is like a transaction that you can commit to when
+you're ready, and the notion of saving individual model instances by calling one
+of their methods is not present.
+
+## Relations Require More Work
+
+Let's add an `Address` and let each user have multiple addresses. In Django, you
+can do this with a `ForeignKey`:
+
+```python
+# No changes required to the User model
+
+class Address(models.Model):
+    user = models.ForeignKey(User, on_delete=models.CASCADE)
+    email_address = models.TextField()
+```
+
+In SQLAlchemy, you need to define the relationship explicitly:
+
+```python
+from sqlalchemy import ForeignKey, String
+from sqlalchemy.orm import relationship, Mapped, mapped_column, DeclarativeBase
+
+class User(DeclarativeBase):
+    # Previous attributes omitted for brevity
+
+    addresses: Mapped[list["Address"]] = relationship(
+        back_populates="user", cascade="all, delete-orphan"
+    )
+
+class Address(DeclarativeBase):
+    __tablename__ = "address"
+
+    id: Mapped[int] = mapped_column(primary_key=True)
+    email_address: Mapped[str]
+    user_id: Mapped[int] = mapped_column(ForeignKey("user_account.id"))
+
+    user: Mapped["User"] = relationship(back_populates="addresses")
+```
+
+Notice you need to define both the `user_id` column and the `user` relationship
+in the `Address` model, something that Django does automatically. Additionally,
+you also need to define the "other side" of the relationship as
+`User.addresses`.
+
+Once your models are in place you can query the `Address` model and join it with
+the `User` model:
+
+```python
+from sqlalchemy import select
+
+stmt = (
+    select(Address)
+    .join(Address.user)
+    .where(User.name == "sandy")
+)
+sandy_addresses = session.scalars(stmt).all()
+```
+
+There is no double underscore syntax like in Django, and no "related managers"
+that allow you to get related objects from a given model instance. Instead we
+need to use a `join` to bring in the `User` model and then filter on the `name`
+attribute.
+
+One clear advantage of SQLAlchemy is that you can instantiate models and relate
+them before they are saved, and then commit them all at once:
+
+```python
+spongebob = User(
+    name="spongebob",
+    fullname="SpongeBob SquarePants",
+    addresses=[Address(email_address="spongebob@sqlalchemy.org")],
+)
+sandy = User(
+    name="sandy",
+    fullname="Sandy Cheeks",
+    addresses=[
+        Address(email_address="sandy@sqlalchemy.org"),
+        Address(email_address="sandy@squirrelpower.org"),
+    ],
+)
+patrick = User(name="patrick", fullname="Patrick Star")
+session.add_all([spongebob, sandy, patrick])
+session.commit()
+```
+
+In Django you would need to save all the users first, then save the addresses
+with the `user` attribute set to the corresponding user. Here we can nest them
+naturally and SQLAlchemy will take care of the rest.
+
+## Migrations Are Not Built-In
+
+Django comes with a built-in [migration system] that allows you to create and
+apply migrations with a single command. This is definitely one of the most
+important features of Django and I was surprised to find out that SQLAlchemy
+does not have a built-in alternative. Instead, they maintain a separate package
+called [Alembic] to manage migrations (which have their name changed to
+"revisions").
+
+[migration system]: https://docs.djangoproject.com/en/4.2/topics/migrations/
+[Alembic]: https://alembic.sqlalchemy.org/en/latest/
+
+We won't go into details here, but the basic substitutions are:
+
+- `./manage.py makemigrations` becomes `alembic revision --autogenerate`
+- `./manage.py migrate` becomes `alembic upgrade head`
+- `./manage.py migrate app <migration number>` becomes `alembic upgrade
+  <revision hash>` if going forward, or `alembic downgrade <revision hash>` if
+  going back
+
+SQLAlchemy and Alembic don't have the concept of "apps" as standalone elements
+with their own models and migrations. Instead, they use a single
+`alembic/versions` directory that contains all the revisions for all tables, and
+autogenerating revisions will scan the entire database for changes.
+
+To date I don't know how to manage migrations in databases that have models
+defined by third-party packages. This is in contrast with Django where
+third-parties usually ship their own migration history to manage their tables
+independently from user-defined models.
+
+## Conclusion
+
+SQLAlchemy is a powerful library. We have only scratched the surface of what it
+can do. I think it's as powerful as Django's ORM, but it's definitely not as
+streamlined and putting the pieces together requires time. There also seems to
+be a lot of old, pre-2.0 information out there that can be confusing. All in
+all, I think it's a library worth learning and keeping in your tool belt,
+especially if you are using FastAPI.
diff --git a/content/blog/elsewhere/interview/video/learn-with-jason-cqs.md b/content/blog/elsewhere/interview/video/learn-with-jason-cqs.md
new file mode 100644
index 000000000..605521fb0
--- /dev/null
+++ b/content/blog/elsewhere/interview/video/learn-with-jason-cqs.md
@@ -0,0 +1,27 @@
+---
+title: Demystifying CSS Container Queries
+venue: Learn With Jason
+url: https://www.learnwithjason.dev/demystifying-css-container-queries
+date: 2023-10-16
+author: miriam
+image:
+  src: blog/2023/learn-with-jason.jpg
+tags:
+  - CSS
+  - Container Queries
+summary: |
+  CSS Container Queries
+  promise even more powerful styling approaches,
+  but… what the heck are they?
+  How do they actually work?
+  Miriam joined Jason
+  to teach and explore Container Queries
+  in live code.
+media:
+  - iframe: https://www.youtube.com/embed/KVFU0pOIJLI
+  - iframe: https://www.youtube.com/embed/eTTdl5CZDlo
+---
+
+{% import "embed.macros.njk" as embed %}
+
+{{ embed.figure(data=media) }}
diff --git a/content/blog/wingingit/winging-it-03.md b/content/blog/wingingit/winging-it-03.md
new file mode 100644
index 000000000..60eef40af
--- /dev/null
+++ b/content/blog/wingingit/winging-it-03.md
@@ -0,0 +1,48 @@
+---
+title: Intuitive Web Design with OOUX
+episode: 3
+tags:
+  - OOUX
+  - Design
+author:
+  - sondra
+  - james
+  - davidh
+date: 2023-10-24
+length: 32 mins
+image:
+  src: winging-it/winging-it-3.jpg
+media:
+  - iframe: https://www.youtube.com/embed/wk5tFSqYVzs
+summary: |
+  During our conversation we look at 3 examples of unintuitive web design, and
+  learn how to create websites and apps that are more intuitive using
+  object-oriented user experience (OOUX) design strategies.
+---
+
+{% import "embed.macros.njk" as embed %}
+{% import "utility.macros.njk" as utility %}
+
+{{ embed.figure(
+  data=media
+) }}
+
+{{ utility.main_action(
+  'Subscribe to Channel »',
+  subscribe_url
+) }}
+
+## What we cover:
+
+- What is OOUX
+- Practical examples for discovering objects
+- Types of objects including broken, shapeshifter, and isolated objects
+- Object maps
+- OOUX Certification
+
+## Links:
+
+- [Denver Zoo](https://denverzoo.org/)
+- [OOUX Certification (affiliate link)](http://partners.ooux.com/348125/17189)
+- [Slides](https://xd.adobe.com/view/59a38984-ff8c-4ae6-b09f-2cbf31f235fc-0cf0/)
+- [OddBird on Mastodon](https://front-end.social/@OddBird)
diff --git a/content/contact/index.njk b/content/contact/index.njk
index 2a0e12f26..04434772a 100644
--- a/content/contact/index.njk
+++ b/content/contact/index.njk
@@ -2,8 +2,11 @@
 title: Contact
 sub: Let's get to know each other
 banner: Contact OddBird
+bird: oddbird
 social:
-  twitter: oddbird
+  mastodon:
+    user: oddbird
+    server: front-end.social
   github: oddbird
   email: birds
 summary: |
diff --git a/content/index.njk b/content/index.njk
index 931750230..38a6222dd 100644
--- a/content/index.njk
+++ b/content/index.njk
@@ -81,7 +81,7 @@ resilient design systems, and **well-tested code.**
 - Branding & Logo Design
 - User Research & Concepting
 - UI/UX Design (*OOUX*)
-- Python & Django on the backend
+- Python on the backend (*Django, FastAPI*)
 - CSS & Sass on the frontend
 - JavaScript (*Svelte, Vue, React, Node, etc.*)
 - Design Systems & Component Libraries
diff --git a/content/quickstart.md b/content/quickstart.md
index 3d0a37a67..8c6379cc6 100644
--- a/content/quickstart.md
+++ b/content/quickstart.md
@@ -345,3 +345,138 @@ and sends invoices to clients on the same schedule.
 
 [harvest]: https://www.getharvest.com/
 [accounts]: mailto:accounts@oddbird.net
+
+## Success Criteria:
+
+This guide will help you understand
+the expectations for your role at OddBird.
+The criteria are divided into three groups:
+Work Quality, Communication, and Learning & Growth.
+Each group has three levels of performance:
+Underperform, Meet Expectations, and Exceed Expectations.
+You can use this guide to assess your own performance,
+identify your strengths and areas for improvement,
+and set your goals and action plans.
+
+### Work Quality
+
+#### Underperform
+
+- Lack initiative and wait for direction or assignments
+  on high priority work
+- Produce low-quality or incomplete work
+  that requires excessive rework
+  or refactoring from others
+- Use outdated or inappropriate tools, technologies, or methodologies
+- Avoid or give up on challenges
+- Do not create plans for big assignments,
+  or dissect them into smaller tasks
+
+#### Meet Expectations
+
+- Take initiative on high priority work
+  by chipping away at it
+- Deliver complete and high-quality work,
+  and act on feedback from others
+- Approach challenges
+  by creating plans for big assignments,
+  and dissecting them into smaller tasks
+
+#### Exceed Expectations
+
+- Take ownership of features and infrastructure
+- Lead internal review processes
+  and deliver high-quality, actionable feedback to others
+- Make requests for input early in process
+  to tackle challenging work
+- Take initiative and lead others
+  in creating plans for big assignments,
+  and dissecting them into smaller tasks
+
+### Communication
+
+#### Underperform
+
+- Rarely communicate
+  or do so in an untimely manner
+- Miss large parts of or entire meetings without notice
+- Do not document the breakdown of upcoming work
+  or the status of in-progress work,
+  and do not reflect on your contributions, accomplishments,
+  or lessons from challenges (self-retro)
+- Do not ask for help or guidance when blocked,
+  and avoid participating and learning
+  from review and discussions
+- Show disinterest or indifference when planning new work
+
+#### Meet Expectations
+
+- Communicate frequently
+  and in a timely manner
+- Attend most meetings
+  and notify others in advance
+  when you will be late or cannot attend
+- Post a breakdown of your daily assignments
+  documenting completed work,
+  the status of in-progress work,
+  and upcoming tasks
+- Document your contributions,
+  accomplishments,
+  and lessons from challenges (self-retro)
+- Reach out with questions when blocked
+  and engage with review and planning
+  by asking follow-up questions
+
+#### Exceed Expectations
+
+- Communicate with trust in advance
+  and request engagement from others
+- Lead meetings and discussions
+  about internal and external projects
+- Follow up during and after reviews and discussions
+  with questions that help confirm understanding
+- Generate internal documents,
+  blog posts,
+  and other valuable content
+  based on your contributions
+  (especially accomplishments and challenges)
+
+### Learning & Growth
+
+#### Underperform
+
+- Do not participate or learn from review and discussions,
+  and asks few or no questions
+- Resist and reject change and feedback,
+  and do not adjust to the changing needs
+  and expectations of projects
+- Lack initiative and collaboration skills,
+  and don't support the team's goals and objectives
+- Refuse to follow established team processes
+
+#### Meet Expectations
+
+- Engage with review and discussions
+  by asking more questions
+- Reach out with questions when blocked
+- Act on feedback as an opportunity to learn and improve,
+  and remain flexible and adaptable to change
+- Challenge the team processes
+  and look for ways to improve them
+
+#### Exceed Expectations
+
+- Demonstrate curiosity and pursue challenges
+  that help you and the team grow
+- Learn new skills, technologies, or methodologies
+  that can improve your performance
+  and the quality of your work
+- Help others adapt
+  to the changing needs and expectations of the project
+- Demonstrate leadership,
+  initiative,
+  and collaboration skills,
+  and contribute to the team's goals and objectives
+- Adjust the team processes,
+  listening to feedback
+  and guiding the team through the changes
diff --git a/content/services/development.md b/content/services/development.md
index 935b45a9d..15deede9f 100644
--- a/content/services/development.md
+++ b/content/services/development.md
@@ -17,7 +17,8 @@ summary: |
   efficiently.
 
   We provide expertise across a range of technologies, including
-  **Python/Django**, accessible **HTML**, **CSS/Sass**,
+  **Python** with **Django** & **FastAPI**,
+  accessible **HTML**, **CSS/Sass**,
   **JavaScript** with **React** & **Vue**, **Node**, and more.
 ---
 
@@ -147,7 +148,7 @@ performance and architecture.
 
 ### Languages & Tools
 
-- **Python** with **Django** (*core contributor*)
+- **Python** with **FastAPI** or **Django** (*core contributor*)
 - **HTML/CSS** with **Sass** (*core contributor*)
 - **JavaScript** with **Vue**, **React**, or **Svelte**
 - Node
diff --git a/content/talks.njk b/content/talks.njk
index eaca93d0c..c0d8ab5c0 100644
--- a/content/talks.njk
+++ b/content/talks.njk
@@ -1,25 +1,22 @@
 ---
 title: Talks & Workshops
-sub: Bring us to your conference or browse past talks
-image:
-  src: talks/miriam.jpg
-  alt: Miriam Suzanne speaking at a conference
-  position: left center
+sub: Bring us to your event or browse past talks
 action:
-  text: Hire us for conference talks »
+  text: Hire us to give a talk or workshop »
   url: /contact/
 summary: |
-  **We provide award-winning conference talks & workshops**
+  **We provide award-winning talks & workshops**
+  for companies or conferences,
   to help you create resilient web applications
   and design systems --
   improving team process, communication,
   site performance, and accessibility.
-  Missed a conference?
   Dive into the posts below
   for the latest videos & slides,
-  and upcoming conference dates.
+  and upcoming conference or workshop dates.
 ---
 
+{% import 'utility.macros.njk' as utility %}
 {% import 'quotes.macros.njk' as quotes %}
 {% import 'layout.macros.njk' as layout %}
 {% import 'talks.macros.njk' as talks %}
@@ -30,6 +27,30 @@ summary: |
   slugs=['spot-on', 'popular-tutorial']
 ) }}
 
+{% set fw = collections._talk | findPage('data.feature', 'workshop') %}
+{% if fw %}
+  {{ layout.title('Featured Workshop') }}
+  <article {{ post.aria_label(item) }} class="feature-workshop">
+    {{ post.hero(fw.data.image, 'post') }}
+    <header class="training-header">
+      {{ post.banner(fw) }}
+      {{ post.subtitle(fw.data.sub) }}
+      {{ post.byline(fw, collections) }}
+    </header>
+
+    <div class="training-detail">
+      {{ fw.data.summary | md | safe }}
+
+      {% if fw.data.action %}
+        {{ utility.main_action(
+          fw.data.action.text,
+          url=fw.data.action.url
+        ) }}
+      {% endif %}
+    </div>
+  </article>
+{% endif %}
+
 {{ talks.section(
   title='Upcoming Events',
   events=collections.all | getPublic | getEvents | getFuture,
@@ -37,7 +58,7 @@ summary: |
   by_bird=collections
 ) }}
 
-{{ layout.title('Talks & Workshops') }}
+{{ layout.title('All Talks & Workshops') }}
 {% call layout.grid('training') %}
   {% for item in collections._talk | getPublic | eventSort | reverse %}
     <article {{ post.aria_label(item) }} class="training-item">
diff --git a/content/workshops/advanced-css.md b/content/workshops/advanced-css.md
index e2b87e766..787e1701e 100644
--- a/content/workshops/advanced-css.md
+++ b/content/workshops/advanced-css.md
@@ -1,7 +1,7 @@
 ---
 title: Advanced CSS Workshop
 banner: Advanced CSS for Modern Applications
-sub: with practical use-cases, tooling, and pitfalls
+sub: A workshop with practical use-cases, tooling, and pitfalls
 author: miriam
 date: 2019-04-18
 image:
diff --git a/content/workshops/cascading-styles-deep.md b/content/workshops/cascading-styles-deep.md
index 3271df358..46cd22707 100644
--- a/content/workshops/cascading-styles-deep.md
+++ b/content/workshops/cascading-styles-deep.md
@@ -1,10 +1,15 @@
 ---
-title: Cascading Styles
-sub: A CSS Deep Dive
+title: Cascading Style Systems
+sub: A workshop on resilient & maintainable CSS
+feature: workshop
 author: miriam
 date: 2023-01-09
+action:
+  text: Hire us to give a workshop »
+  url: /contact/
 image:
-  src: talks/mia-back.jpg
+  src: talks/mia-smashing-de.jpg
+  position: top
   alt: |
     Mia from behind,
     standing at a laptop -
@@ -17,71 +22,166 @@ tags:
   - Cascade Layers
   - Container Queries
   - CSS Scope
-  - Color
+  - CSS Nesting
 events:
+  - venue: Smashing Workshops
+    date: 2024-02-26
+    adr: Online
+    url: https://smashingconf.com/online-workshops/workshops/modern-css-miriam-suzanne/
+    note: >
+      Tickets [on sale now](https://smashingconf.com/online-workshops/workshops/modern-css-miriam-suzanne/)!
   - venue: Smashing Workshops
     date: 2023-09-06
     adr: Freiburg, Germany
     url: https://smashingconf.com/freiburg-2023/workshops/miriam-suzanne/
 summary: |
-  It’s a great time to revisit
-  everything you thought you knew about CSS.
-  Join Miriam for a deep dive
-  into what makes the language work,
-  and how we can harness its power
-  to develop resilient and delightful experiences
-  that hold up across browsers, languages, and device interfaces.
+  New CSS features are shipping at an unprecedented rate --
+  cascade layers, container queries, the `:has()` selector,
+  subgrid, nesting, and so much more.
+  **It’s a good time to step back and understand
+  how these tools fit together in a declarative system --
+  a resilient cascade of styles**.
+
+  This workshop is available
+  to companies as well as conferences.
 ---
 
-A lot has changed in the nearly 30 years since CSS was first proposed,
-and new features are shipping at an unprecedented rate --
-cascade layers, container queries,
-the ':has()' selector, wide-gamut colors,
-subgrid, and so much more.
-
-Meanwhile, we're still getting used to
-custom properties and basic grids!
-Taken one at a time, the list can feel overwhelming,
-but these features all fit together to form a highly systemic language
-based on a radical foundation: _the cascade of styles_.
-Together, we’ll explore:
-
-## Selectors & the Cascade
-
-We’ll look at selectors,
-their specificity,
-nesting, and of course custom properties.
-
-- cascade origins and importance
-- cascade layers
-- specificity and source-order
-- :is(), :where(), and :has()
-- nesting & scope
-- preference & support queries
-- custom properties
-- naming & organizing conventions
-- progressive enhancement
-
-## Layout & Typography
-
-From modern CSS layout to functions,
-from aspect ratios to media & container queries.
-
-- display, flow, and context
-- writing modes
-- logical properties
-- flexbox, grid, and subgrid
-- comparison functions
-- aspect-ratios
-- scroll-snapping
-- media & container queries
-
-## CSS Colors
-
-Lastly, new color spaces & formats, accent-color and much more!
-
-- accent-color
-- color-scheme
-- new color spaces & formats
-- gradient color spaces
-- color-mix()
+It’s an exciting time, but the list can also feel overwhelming.
+Do I really need grids if I already know flexbox?
+What problem do layers actually solve?
+Should I rewrite my styles with each feature release,
+or stick with the tools that I know?
+
+If you ever feel lost in the CSS weeds,
+wrestling with the cascade,
+or you just want to improve your workflow
+with modern, efficient, and maintainable stylesheets,
+then this workshop is for you!
+We'll approach the language as a cohesive system,
+learn new features along the way,
+and then put it all in practice
+with a resilient approach to CSS architecture.
+
+Join Miriam for a deep dive
+into what makes the language work,
+and how we can harness its power
+to **develop resilient and delightful experiences**
+that hold up across browsers, languages, and device interfaces.
+
+## What Will Attendees Learn In This Workshop?
+
+- Building maintainable CSS systems with progressive enhancement
+- The entire cascade, why it exists,
+  and what all is involved (much more than specificity!)
+- Managing style conflicts with cascade layers, scope, and nesting
+- Modern selectors like `:is()`, `:where()`, and `:has()`
+- Value resolution and validation, beyond cascading and inheritance
+- Using custom properties to build adaptive systems
+- The advantages of logical vs physical dimensions
+- The layout flow with intrinsic and extrinsic sizing
+- Size comparison functions like min(), max(), and clamp()
+- When to use flexbox vs grid for layout and alignment
+- Fast and dynamic layouts using subgrid and container queries
+
+## Who Is This For?
+
+This workshop is intended for designers & developers
+with at least a basic understanding in HTML and CSS.
+You don’t need to be an expert to keep up,
+but even the experts are likely to learn something new.
+
+## Schedule
+
+The workshop is taught in five sessions, each with two parts:
+
+### 1. Resilient Styles: a Declarative Cascade
+
+#### First, Do No Harm
+
+CSS is fundamentally different
+from other languages or design tools,
+built around a radical vision
+for contextual style and user-control.
+We’ll dig into the practical implications of that vision,
+and how the ‘grain’ of the language
+can guide us to more performant and resilient styles.
+
+#### Cascading & Inheritance
+
+A deep-dive into the algorithms
+that take us from simple property/value declarations
+to a fully-styled web application.
+Along the way, we’ll explore new features like nesting,
+cascade layers, scope, and the `:has()` selector.
+
+### 2. Dynamic Systems: Custom Properties & Value Resolution
+
+#### Custom Properties Reveal the Matrix
+
+CSS custom properties (aka “variables”)
+expose the internals of CSS value resolution and error recovery.
+What does it even mean for properties
+to become ‘invalid at computed value time’?
+And how can we use these CSS internals to our advantage,
+developing more robust and dynamic style systems?
+
+#### CSS Variables in Practice
+
+Practical use-cases,
+and interactive exercises related to CSS variables and functions.
+
+### 3. Intrinsic Layouts: Distributing Space
+
+#### Flowing & Flexing
+
+Unlike the printed page,
+web content and context can be unpredictable.
+CSS provides tools to manage that uncertainty,
+aligning & distributing objects on the page.
+We’ll talk about normal flow,
+intrinsic and extrinsic sizing,
+logical properties,
+box sizing & alignment,
+and the flexible box model.
+
+#### Flex & Alignment in Practice
+
+Practical use-cases,
+and interactive exercises related to distributing space.
+
+### 4. Intrinsic Layouts: Defining Structure
+
+#### Defining Structure
+
+Sometimes we also need to impose external structure
+to create consistent and reliable layouts,
+even with unpredictable content.
+This is a full session dedicated to grid & subgrid,
+the multiple ‘stages of squishiness’,
+and container queries.
+
+#### Grids & Containers in Practice
+
+Practical use-cases,
+and interactive exercises related to defining layouts.
+
+### 5. Resilient Styles: Organizing Conventions
+
+#### Cascade Aligned Programming
+
+There are many conventions for organizing CSS,
+but the best systems all share underlying principles
+based on CSS itself.
+What would it mean to use _the cascade_ itself
+as our guide for writing maintainable CSS?
+
+#### Modern and Resilient
+
+CSS is designed to adapt to context --
+failing silently, and enhancing progressively.
+We have tools to manage that context and support everyone,
+without giving up on the latest features.
+The details may vary from project to project,
+but we’ll look at practical strategies
+for building an expressive and robust CSS system
+that works for you.
diff --git a/content/workshops/django-end-to-end-testing.md b/content/workshops/django-end-to-end-testing.md
index 17031eaad..b05d8c6aa 100644
--- a/content/workshops/django-end-to-end-testing.md
+++ b/content/workshops/django-end-to-end-testing.md
@@ -1,5 +1,6 @@
 ---
 title: Effective End-to-End Testing for Django
+sub: A hands-on workshop using pytest and Playwright
 date: 2022-10-16
 author: ed
 image:
diff --git a/content/workshops/resilient-systems.md b/content/workshops/resilient-systems.md
index ee2f26fc7..5b6cc76af 100644
--- a/content/workshops/resilient-systems.md
+++ b/content/workshops/resilient-systems.md
@@ -1,6 +1,6 @@
 ---
 title: Resilient Web Systems
-sub: Inspiration & practical steps to take full advantage of the web
+sub: A workshop with practical steps to take full advantage of the web
 author: miriam
 card: feature
 date: 2020-01-01
diff --git a/package.json b/package.json
index fea726c24..b053d0953 100644
--- a/package.json
+++ b/package.json
@@ -58,30 +58,30 @@
     "@11ty/eleventy-img": "^3.1.1",
     "@11ty/eleventy-plugin-rss": "^1.2.0",
     "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0",
-    "@babel/core": "^7.23.0",
-    "@babel/preset-env": "^7.22.20",
+    "@babel/core": "^7.23.2",
+    "@babel/preset-env": "^7.23.2",
     "@netlify/plugin-a11y": "^1.0.0-beta.1",
     "@rollup/plugin-babel": "^6.0.4",
-    "@rollup/plugin-commonjs": "^25.0.5",
+    "@rollup/plugin-commonjs": "^25.0.7",
     "@rollup/plugin-node-resolve": "^15.2.3",
     "@rollup/plugin-terser": "^0.4.4",
     "@tommoor/remove-markdown": "^0.3.2",
-    "@typescript-eslint/parser": "^6.7.4",
+    "@typescript-eslint/parser": "^6.8.0",
     "autoprefixer": "^10.4.16",
     "babel-jest": "^29.7.0",
     "chalk": "^4.1.2",
     "chokidar-cli": "^3.0.0",
-    "core-js": "^3.33.0",
+    "core-js": "^3.33.1",
     "date-fns": "^2.30.0",
     "date-fns-tz": "^2.0.0",
     "dotenv": "^16.3.1",
     "doxray": "^0.10.1",
-    "eslint": "^8.51.0",
+    "eslint": "^8.52.0",
     "eslint-config-prettier": "^9.0.0",
     "eslint-import-resolver-node": "^0.3.9",
     "eslint-import-resolver-typescript": "^3.6.1",
-    "eslint-plugin-import": "^2.28.1",
-    "eslint-plugin-jest": "^27.4.2",
+    "eslint-plugin-import": "^2.29.0",
+    "eslint-plugin-jest": "^27.4.3",
     "eslint-plugin-simple-import-sort": "^10.0.0",
     "fs-extra": "^11.1.1",
     "jest": "^29.7.0",
@@ -99,14 +99,14 @@
     "postcss": "^8.4.31",
     "prettier": "^3.0.3",
     "rimraf": "^3.0.2",
-    "rollup": "^4.0.2",
+    "rollup": "^4.1.4",
     "sanitize-html": "^2.11.0",
-    "sass": "^1.69.0",
+    "sass": "^1.69.4",
     "sassdoc": "^2.7.4",
     "sassdoc-theme-herman": "^5.0.1",
     "slugify": "^1.6.6",
     "striptags": "^3.2.0",
-    "stylelint": "^15.10.3",
+    "stylelint": "^15.11.0",
     "stylelint-config-standard-scss": "^11.0.0",
     "truncate-html": "^1.0.4",
     "typescript": "^5.2.2",
diff --git a/src/images/blog/2023/fast.jpg b/src/images/blog/2023/fast.jpg
new file mode 100644
index 000000000..662d60f64
Binary files /dev/null and b/src/images/blog/2023/fast.jpg differ
diff --git a/src/images/blog/2023/learn-with-jason.jpg b/src/images/blog/2023/learn-with-jason.jpg
new file mode 100644
index 000000000..5709cf18a
Binary files /dev/null and b/src/images/blog/2023/learn-with-jason.jpg differ
diff --git a/src/images/blog/2023/library.jpg b/src/images/blog/2023/library.jpg
new file mode 100644
index 000000000..d5371fae3
Binary files /dev/null and b/src/images/blog/2023/library.jpg differ
diff --git a/src/images/talks/mia-smashing-de.jpg b/src/images/talks/mia-smashing-de.jpg
new file mode 100644
index 000000000..fe3ced2bc
Binary files /dev/null and b/src/images/talks/mia-smashing-de.jpg differ
diff --git a/src/images/winging-it/winging-it-3.jpg b/src/images/winging-it/winging-it-3.jpg
new file mode 100644
index 000000000..2c98ddfb9
Binary files /dev/null and b/src/images/winging-it/winging-it-3.jpg differ
diff --git a/src/scss/components/_events.scss b/src/scss/components/_events.scss
index 5be3a1ed9..18343e19e 100644
--- a/src/scss/components/_events.scss
+++ b/src/scss/components/_events.scss
@@ -55,14 +55,12 @@
   }
 }
 
-.event-discount,
+.event-note,
 .event-links {
   font-size: var(--small);
 }
 
-.event-discount {
-  @include config.wrap-content('[' ']');
-
+.event-note {
   font-style: italic;
 }
 
diff --git a/src/scss/layout/_title.scss b/src/scss/layout/_title.scss
index c0f057b52..a529a745a 100644
--- a/src/scss/layout/_title.scss
+++ b/src/scss/layout/_title.scss
@@ -40,7 +40,8 @@
     line-height: 1.1;
 
     span {
-      &:first-of-type {
+      // spans not generated by the typogrify plugin
+      &:not([class]) {
         display: block;
         font-size: var(--h3);
         font-weight: normal;
diff --git a/yarn.lock b/yarn.lock
index 6dd21b738..f3d14980d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -183,33 +183,33 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/compat-data@npm:^7.22.20, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9":
-  version: 7.22.20
-  resolution: "@babel/compat-data@npm:7.22.20"
-  checksum: efedd1d18878c10fde95e4d82b1236a9aba41395ef798cbb651f58dbf5632dbff475736c507b8d13d4c8f44809d41c0eb2ef0d694283af9ba5dd8339b6dab451
+"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.2":
+  version: 7.23.2
+  resolution: "@babel/compat-data@npm:7.23.2"
+  checksum: d8dc27437d40907b271161d4c88ffe72ccecb034c730deb1960a417b59a14d7c5ebca8cd80dd458a01cd396a7a329eb48cddcc3791b5a84da33d7f278f7bec6a
   languageName: node
   linkType: hard
 
-"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.0":
-  version: 7.23.0
-  resolution: "@babel/core@npm:7.23.0"
+"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.2":
+  version: 7.23.2
+  resolution: "@babel/core@npm:7.23.2"
   dependencies:
     "@ampproject/remapping": ^2.2.0
     "@babel/code-frame": ^7.22.13
     "@babel/generator": ^7.23.0
     "@babel/helper-compilation-targets": ^7.22.15
     "@babel/helper-module-transforms": ^7.23.0
-    "@babel/helpers": ^7.23.0
+    "@babel/helpers": ^7.23.2
     "@babel/parser": ^7.23.0
     "@babel/template": ^7.22.15
-    "@babel/traverse": ^7.23.0
+    "@babel/traverse": ^7.23.2
     "@babel/types": ^7.23.0
     convert-source-map: ^2.0.0
     debug: ^4.1.0
     gensync: ^1.0.0-beta.2
     json5: ^2.2.3
     semver: ^6.3.1
-  checksum: cebd9b48dbc970a7548522f207f245c69567e5ea17ebb1a4e4de563823cf20a01177fe8d2fe19b6e1461361f92fa169fd0b29f8ee9d44eeec84842be1feee5f2
+  checksum: 003897718ded16f3b75632d63cd49486bf67ff206cc7ebd1a10d49e2456f8d45740910d5ec7e42e3faf0deec7a2e96b1a02e766d19a67a8309053f0d4e57c0fe
   languageName: node
   linkType: hard
 
@@ -288,9 +288,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-define-polyfill-provider@npm:^0.4.2":
-  version: 0.4.2
-  resolution: "@babel/helper-define-polyfill-provider@npm:0.4.2"
+"@babel/helper-define-polyfill-provider@npm:^0.4.3":
+  version: 0.4.3
+  resolution: "@babel/helper-define-polyfill-provider@npm:0.4.3"
   dependencies:
     "@babel/helper-compilation-targets": ^7.22.6
     "@babel/helper-plugin-utils": ^7.22.5
@@ -299,7 +299,7 @@ __metadata:
     resolve: ^1.14.2
   peerDependencies:
     "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0
-  checksum: 1f6dec0c5d0876d278fe15b71238eccc5f74c4e2efa2c78aaafa8bc2cc96336b8e68d94cd1a78497356c96e8b91b8c1f4452179820624d1702aee2f9832e6569
+  checksum: 5d21e3f47b320e4b5b644195ec405e7ebc3739e48e65899efc808c5fa9c3bf5b06ce0d8ff5246ca99d1411e368f4557bc66730196c5781a5c4e986ee703bee79
   languageName: node
   linkType: hard
 
@@ -378,7 +378,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-remap-async-to-generator@npm:^7.22.5, @babel/helper-remap-async-to-generator@npm:^7.22.9":
+"@babel/helper-remap-async-to-generator@npm:^7.22.20, @babel/helper-remap-async-to-generator@npm:^7.22.5":
   version: 7.22.20
   resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20"
   dependencies:
@@ -463,14 +463,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helpers@npm:^7.23.0":
-  version: 7.23.1
-  resolution: "@babel/helpers@npm:7.23.1"
+"@babel/helpers@npm:^7.23.2":
+  version: 7.23.2
+  resolution: "@babel/helpers@npm:7.23.2"
   dependencies:
     "@babel/template": ^7.22.15
-    "@babel/traverse": ^7.23.0
+    "@babel/traverse": ^7.23.2
     "@babel/types": ^7.23.0
-  checksum: acfc345102045c24ea2a4d60e00dcf8220e215af3add4520e2167700661338e6a80bd56baf44bb764af05ec6621101c9afc315dc107e18c61fa6da8acbdbb893
+  checksum: aaf4828df75ec460eaa70e5c9f66e6dadc28dae3728ddb7f6c13187dbf38030e142194b83d81aa8a31bbc35a5529a5d7d3f3cf59d5d0b595f5dd7f9d8f1ced8e
   languageName: node
   linkType: hard
 
@@ -770,17 +770,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-async-generator-functions@npm:^7.22.15":
-  version: 7.22.15
-  resolution: "@babel/plugin-transform-async-generator-functions@npm:7.22.15"
+"@babel/plugin-transform-async-generator-functions@npm:^7.23.2":
+  version: 7.23.2
+  resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.2"
   dependencies:
-    "@babel/helper-environment-visitor": ^7.22.5
+    "@babel/helper-environment-visitor": ^7.22.20
     "@babel/helper-plugin-utils": ^7.22.5
-    "@babel/helper-remap-async-to-generator": ^7.22.9
+    "@babel/helper-remap-async-to-generator": ^7.22.20
     "@babel/plugin-syntax-async-generators": ^7.8.4
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: fad98786b446ce63bde0d14a221e2617eef5a7bbca62b49d96f16ab5e1694521234cfba6145b830fbf9af16d60a8a3dbf148e8694830bd91796fe333b0599e73
+  checksum: e1abae0edcda7304d7c17702ac25a127578791b89c4f767d60589249fa3e50ec33f8c9ff39d3d8d41f00b29947654eaddd4fd586e04c4d598122db745fab2868
   languageName: node
   linkType: hard
 
@@ -808,7 +808,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-block-scoping@npm:^7.22.15":
+"@babel/plugin-transform-block-scoping@npm:^7.23.0":
   version: 7.23.0
   resolution: "@babel/plugin-transform-block-scoping@npm:7.23.0"
   dependencies:
@@ -875,7 +875,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-destructuring@npm:^7.22.15":
+"@babel/plugin-transform-destructuring@npm:^7.23.0":
   version: 7.23.0
   resolution: "@babel/plugin-transform-destructuring@npm:7.23.0"
   dependencies:
@@ -1015,7 +1015,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-modules-amd@npm:^7.22.5":
+"@babel/plugin-transform-modules-amd@npm:^7.23.0":
   version: 7.23.0
   resolution: "@babel/plugin-transform-modules-amd@npm:7.23.0"
   dependencies:
@@ -1027,7 +1027,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-modules-commonjs@npm:^7.22.15":
+"@babel/plugin-transform-modules-commonjs@npm:^7.23.0":
   version: 7.23.0
   resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.0"
   dependencies:
@@ -1040,7 +1040,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-modules-systemjs@npm:^7.22.11":
+"@babel/plugin-transform-modules-systemjs@npm:^7.23.0":
   version: 7.23.0
   resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.0"
   dependencies:
@@ -1152,7 +1152,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-optional-chaining@npm:^7.22.15":
+"@babel/plugin-transform-optional-chaining@npm:^7.22.15, @babel/plugin-transform-optional-chaining@npm:^7.23.0":
   version: 7.23.0
   resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.0"
   dependencies:
@@ -1339,11 +1339,11 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/preset-env@npm:^7.22.20":
-  version: 7.22.20
-  resolution: "@babel/preset-env@npm:7.22.20"
+"@babel/preset-env@npm:^7.23.2":
+  version: 7.23.2
+  resolution: "@babel/preset-env@npm:7.23.2"
   dependencies:
-    "@babel/compat-data": ^7.22.20
+    "@babel/compat-data": ^7.23.2
     "@babel/helper-compilation-targets": ^7.22.15
     "@babel/helper-plugin-utils": ^7.22.5
     "@babel/helper-validator-option": ^7.22.15
@@ -1369,15 +1369,15 @@ __metadata:
     "@babel/plugin-syntax-top-level-await": ^7.14.5
     "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6
     "@babel/plugin-transform-arrow-functions": ^7.22.5
-    "@babel/plugin-transform-async-generator-functions": ^7.22.15
+    "@babel/plugin-transform-async-generator-functions": ^7.23.2
     "@babel/plugin-transform-async-to-generator": ^7.22.5
     "@babel/plugin-transform-block-scoped-functions": ^7.22.5
-    "@babel/plugin-transform-block-scoping": ^7.22.15
+    "@babel/plugin-transform-block-scoping": ^7.23.0
     "@babel/plugin-transform-class-properties": ^7.22.5
     "@babel/plugin-transform-class-static-block": ^7.22.11
     "@babel/plugin-transform-classes": ^7.22.15
     "@babel/plugin-transform-computed-properties": ^7.22.5
-    "@babel/plugin-transform-destructuring": ^7.22.15
+    "@babel/plugin-transform-destructuring": ^7.23.0
     "@babel/plugin-transform-dotall-regex": ^7.22.5
     "@babel/plugin-transform-duplicate-keys": ^7.22.5
     "@babel/plugin-transform-dynamic-import": ^7.22.11
@@ -1389,9 +1389,9 @@ __metadata:
     "@babel/plugin-transform-literals": ^7.22.5
     "@babel/plugin-transform-logical-assignment-operators": ^7.22.11
     "@babel/plugin-transform-member-expression-literals": ^7.22.5
-    "@babel/plugin-transform-modules-amd": ^7.22.5
-    "@babel/plugin-transform-modules-commonjs": ^7.22.15
-    "@babel/plugin-transform-modules-systemjs": ^7.22.11
+    "@babel/plugin-transform-modules-amd": ^7.23.0
+    "@babel/plugin-transform-modules-commonjs": ^7.23.0
+    "@babel/plugin-transform-modules-systemjs": ^7.23.0
     "@babel/plugin-transform-modules-umd": ^7.22.5
     "@babel/plugin-transform-named-capturing-groups-regex": ^7.22.5
     "@babel/plugin-transform-new-target": ^7.22.5
@@ -1400,7 +1400,7 @@ __metadata:
     "@babel/plugin-transform-object-rest-spread": ^7.22.15
     "@babel/plugin-transform-object-super": ^7.22.5
     "@babel/plugin-transform-optional-catch-binding": ^7.22.11
-    "@babel/plugin-transform-optional-chaining": ^7.22.15
+    "@babel/plugin-transform-optional-chaining": ^7.23.0
     "@babel/plugin-transform-parameters": ^7.22.15
     "@babel/plugin-transform-private-methods": ^7.22.5
     "@babel/plugin-transform-private-property-in-object": ^7.22.11
@@ -1417,15 +1417,15 @@ __metadata:
     "@babel/plugin-transform-unicode-regex": ^7.22.5
     "@babel/plugin-transform-unicode-sets-regex": ^7.22.5
     "@babel/preset-modules": 0.1.6-no-external-plugins
-    "@babel/types": ^7.22.19
-    babel-plugin-polyfill-corejs2: ^0.4.5
-    babel-plugin-polyfill-corejs3: ^0.8.3
-    babel-plugin-polyfill-regenerator: ^0.5.2
+    "@babel/types": ^7.23.0
+    babel-plugin-polyfill-corejs2: ^0.4.6
+    babel-plugin-polyfill-corejs3: ^0.8.5
+    babel-plugin-polyfill-regenerator: ^0.5.3
     core-js-compat: ^3.31.0
     semver: ^6.3.1
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 99357a5cb30f53bacdc0d1cd6dff0f052ea6c2d1ba874d969bba69897ef716e87283e84a59dc52fb49aa31fd1b6f55ed756c64c04f5678380700239f6030b881
+  checksum: 49327ef584b529b56aedd6577937b80c0d89603c68b23795495a13af04b5aa008db9ad04cd280423600cdc0d3cce13ae9d0d9a977db5c8193697b20ced8a10b2
   languageName: node
   linkType: hard
 
@@ -1450,11 +1450,11 @@ __metadata:
   linkType: hard
 
 "@babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.8.4":
-  version: 7.23.1
-  resolution: "@babel/runtime@npm:7.23.1"
+  version: 7.23.2
+  resolution: "@babel/runtime@npm:7.23.2"
   dependencies:
     regenerator-runtime: ^0.14.0
-  checksum: 0cd0d43e6e7dc7f9152fda8c8312b08321cda2f56ef53d6c22ebdd773abdc6f5d0a69008de90aa41908d00e2c1facb24715ff121274e689305c858355ff02c70
+  checksum: 6c4df4839ec75ca10175f636d6362f91df8a3137f86b38f6cd3a4c90668a0fe8e9281d320958f4fbd43b394988958585a17c3aab2a4ea6bf7316b22916a371fb
   languageName: node
   linkType: hard
 
@@ -1469,9 +1469,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/traverse@npm:^7.23.0":
-  version: 7.23.0
-  resolution: "@babel/traverse@npm:7.23.0"
+"@babel/traverse@npm:^7.23.2":
+  version: 7.23.2
+  resolution: "@babel/traverse@npm:7.23.2"
   dependencies:
     "@babel/code-frame": ^7.22.13
     "@babel/generator": ^7.23.0
@@ -1483,7 +1483,7 @@ __metadata:
     "@babel/types": ^7.23.0
     debug: ^4.1.0
     globals: ^11.1.0
-  checksum: 0b17fae53269e1af2cd3edba00892bc2975ad5df9eea7b84815dab07dfec2928c451066d51bc65b4be61d8499e77db7e547ce69ef2a7b0eca3f96269cb43a0b0
+  checksum: 26a1eea0dde41ab99dde8b9773a013a0dc50324e5110a049f5d634e721ff08afffd54940b3974a20308d7952085ac769689369e9127dea655f868c0f6e1ab35d
   languageName: node
   linkType: hard
 
@@ -1575,21 +1575,21 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@eslint/js@npm:8.51.0":
-  version: 8.51.0
-  resolution: "@eslint/js@npm:8.51.0"
-  checksum: 0228bf1e1e0414843e56d9ff362a2a72d579c078f93174666f29315690e9e30a8633ad72c923297f7fd7182381b5a476805ff04dac8debe638953eb1ded3ac73
+"@eslint/js@npm:8.52.0":
+  version: 8.52.0
+  resolution: "@eslint/js@npm:8.52.0"
+  checksum: 490893b8091a66415f4ac98b963d23eb287264ea3bd6af7ec788f0570705cf64fd6ab84b717785980f55e39d08ff5c7fde6d8e4391ccb507169370ce3a6d091a
   languageName: node
   linkType: hard
 
-"@humanwhocodes/config-array@npm:^0.11.11":
-  version: 0.11.11
-  resolution: "@humanwhocodes/config-array@npm:0.11.11"
+"@humanwhocodes/config-array@npm:^0.11.13":
+  version: 0.11.13
+  resolution: "@humanwhocodes/config-array@npm:0.11.13"
   dependencies:
-    "@humanwhocodes/object-schema": ^1.2.1
+    "@humanwhocodes/object-schema": ^2.0.1
     debug: ^4.1.1
     minimatch: ^3.0.5
-  checksum: db84507375ab77b8ffdd24f498a5b49ad6b64391d30dd2ac56885501d03964d29637e05b1ed5aefa09d57ac667e28028bc22d2da872bfcd619652fbdb5f4ca19
+  checksum: f8ea57b0d7ed7f2d64cd3944654976829d9da91c04d9c860e18804729a33f7681f78166ef4c761850b8c324d362f7d53f14c5c44907a6b38b32c703ff85e4805
   languageName: node
   linkType: hard
 
@@ -1600,10 +1600,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@humanwhocodes/object-schema@npm:^1.2.1":
-  version: 1.2.1
-  resolution: "@humanwhocodes/object-schema@npm:1.2.1"
-  checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1
+"@humanwhocodes/object-schema@npm:^2.0.1":
+  version: 2.0.1
+  resolution: "@humanwhocodes/object-schema@npm:2.0.1"
+  checksum: 24929487b1ed48795d2f08346a0116cc5ee4634848bce64161fb947109352c562310fd159fc64dda0e8b853307f5794605191a9547f7341158559ca3c8262a45
   languageName: node
   linkType: hard
 
@@ -1913,7 +1913,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13, @jridgewell/sourcemap-codec@npm:^1.4.14":
+"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15":
   version: 1.4.15
   resolution: "@jridgewell/sourcemap-codec@npm:1.4.15"
   checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8
@@ -1921,12 +1921,12 @@ __metadata:
   linkType: hard
 
 "@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9":
-  version: 0.3.19
-  resolution: "@jridgewell/trace-mapping@npm:0.3.19"
+  version: 0.3.20
+  resolution: "@jridgewell/trace-mapping@npm:0.3.20"
   dependencies:
     "@jridgewell/resolve-uri": ^3.1.0
     "@jridgewell/sourcemap-codec": ^1.4.14
-  checksum: 956a6f0f6fec060fb48c6bf1f5ec2064e13cd38c8be3873877d4b92b4a27ba58289a34071752671262a3e3c202abcc3fa2aac64d8447b4b0fa1ba3c9047f1c20
+  checksum: cd1a7353135f385909468ff0cf20bdd37e59f2ee49a13a966dedf921943e222082c583ade2b579ff6cd0d8faafcb5461f253e1bf2a9f48fec439211fdbe788f5
   languageName: node
   linkType: hard
 
@@ -2006,22 +2006,22 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@rollup/plugin-commonjs@npm:^25.0.5":
-  version: 25.0.5
-  resolution: "@rollup/plugin-commonjs@npm:25.0.5"
+"@rollup/plugin-commonjs@npm:^25.0.7":
+  version: 25.0.7
+  resolution: "@rollup/plugin-commonjs@npm:25.0.7"
   dependencies:
     "@rollup/pluginutils": ^5.0.1
     commondir: ^1.0.1
     estree-walker: ^2.0.2
     glob: ^8.0.3
     is-reference: 1.2.1
-    magic-string: ^0.27.0
+    magic-string: ^0.30.3
   peerDependencies:
     rollup: ^2.68.0||^3.0.0||^4.0.0
   peerDependenciesMeta:
     rollup:
       optional: true
-  checksum: 37cb6ce5188448250c2a97775c5879814119ff9fb3576d35089b7c00fed1a2b46b78d74a1377027cca26d0d984cfe99f450bfc0da561d596447ab6064adb4f08
+  checksum: 052e11839a9edc556eda5dcc759ab816dcc57e9f0f905a1e6e14fff954eaa6b1e2d0d544f5bd18d863993c5eba43d8ac9c19d9bb53b1c3b1213f32cfc9d50b2e
   languageName: node
   linkType: hard
 
@@ -2076,86 +2076,86 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@rollup/rollup-android-arm-eabi@npm:4.0.2":
-  version: 4.0.2
-  resolution: "@rollup/rollup-android-arm-eabi@npm:4.0.2"
+"@rollup/rollup-android-arm-eabi@npm:4.1.4":
+  version: 4.1.4
+  resolution: "@rollup/rollup-android-arm-eabi@npm:4.1.4"
   conditions: os=android & cpu=arm
   languageName: node
   linkType: hard
 
-"@rollup/rollup-android-arm64@npm:4.0.2":
-  version: 4.0.2
-  resolution: "@rollup/rollup-android-arm64@npm:4.0.2"
+"@rollup/rollup-android-arm64@npm:4.1.4":
+  version: 4.1.4
+  resolution: "@rollup/rollup-android-arm64@npm:4.1.4"
   conditions: os=android & cpu=arm64
   languageName: node
   linkType: hard
 
-"@rollup/rollup-darwin-arm64@npm:4.0.2":
-  version: 4.0.2
-  resolution: "@rollup/rollup-darwin-arm64@npm:4.0.2"
+"@rollup/rollup-darwin-arm64@npm:4.1.4":
+  version: 4.1.4
+  resolution: "@rollup/rollup-darwin-arm64@npm:4.1.4"
   conditions: os=darwin & cpu=arm64
   languageName: node
   linkType: hard
 
-"@rollup/rollup-darwin-x64@npm:4.0.2":
-  version: 4.0.2
-  resolution: "@rollup/rollup-darwin-x64@npm:4.0.2"
+"@rollup/rollup-darwin-x64@npm:4.1.4":
+  version: 4.1.4
+  resolution: "@rollup/rollup-darwin-x64@npm:4.1.4"
   conditions: os=darwin & cpu=x64
   languageName: node
   linkType: hard
 
-"@rollup/rollup-linux-arm-gnueabihf@npm:4.0.2":
-  version: 4.0.2
-  resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.0.2"
+"@rollup/rollup-linux-arm-gnueabihf@npm:4.1.4":
+  version: 4.1.4
+  resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.1.4"
   conditions: os=linux & cpu=arm
   languageName: node
   linkType: hard
 
-"@rollup/rollup-linux-arm64-gnu@npm:4.0.2":
-  version: 4.0.2
-  resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.0.2"
+"@rollup/rollup-linux-arm64-gnu@npm:4.1.4":
+  version: 4.1.4
+  resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.1.4"
   conditions: os=linux & cpu=arm64 & libc=glibc
   languageName: node
   linkType: hard
 
-"@rollup/rollup-linux-arm64-musl@npm:4.0.2":
-  version: 4.0.2
-  resolution: "@rollup/rollup-linux-arm64-musl@npm:4.0.2"
+"@rollup/rollup-linux-arm64-musl@npm:4.1.4":
+  version: 4.1.4
+  resolution: "@rollup/rollup-linux-arm64-musl@npm:4.1.4"
   conditions: os=linux & cpu=arm64 & libc=musl
   languageName: node
   linkType: hard
 
-"@rollup/rollup-linux-x64-gnu@npm:4.0.2":
-  version: 4.0.2
-  resolution: "@rollup/rollup-linux-x64-gnu@npm:4.0.2"
+"@rollup/rollup-linux-x64-gnu@npm:4.1.4":
+  version: 4.1.4
+  resolution: "@rollup/rollup-linux-x64-gnu@npm:4.1.4"
   conditions: os=linux & cpu=x64 & libc=glibc
   languageName: node
   linkType: hard
 
-"@rollup/rollup-linux-x64-musl@npm:4.0.2":
-  version: 4.0.2
-  resolution: "@rollup/rollup-linux-x64-musl@npm:4.0.2"
+"@rollup/rollup-linux-x64-musl@npm:4.1.4":
+  version: 4.1.4
+  resolution: "@rollup/rollup-linux-x64-musl@npm:4.1.4"
   conditions: os=linux & cpu=x64 & libc=musl
   languageName: node
   linkType: hard
 
-"@rollup/rollup-win32-arm64-msvc@npm:4.0.2":
-  version: 4.0.2
-  resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.0.2"
+"@rollup/rollup-win32-arm64-msvc@npm:4.1.4":
+  version: 4.1.4
+  resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.1.4"
   conditions: os=win32 & cpu=arm64
   languageName: node
   linkType: hard
 
-"@rollup/rollup-win32-ia32-msvc@npm:4.0.2":
-  version: 4.0.2
-  resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.0.2"
+"@rollup/rollup-win32-ia32-msvc@npm:4.1.4":
+  version: 4.1.4
+  resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.1.4"
   conditions: os=win32 & cpu=ia32
   languageName: node
   linkType: hard
 
-"@rollup/rollup-win32-x64-msvc@npm:4.0.2":
-  version: 4.0.2
-  resolution: "@rollup/rollup-win32-x64-msvc@npm:4.0.2"
+"@rollup/rollup-win32-x64-msvc@npm:4.1.4":
+  version: 4.1.4
+  resolution: "@rollup/rollup-win32-x64-msvc@npm:4.1.4"
   conditions: os=win32 & cpu=x64
   languageName: node
   linkType: hard
@@ -2236,93 +2236,93 @@ __metadata:
   linkType: hard
 
 "@types/babel__core@npm:^7.1.14":
-  version: 7.20.2
-  resolution: "@types/babel__core@npm:7.20.2"
+  version: 7.20.3
+  resolution: "@types/babel__core@npm:7.20.3"
   dependencies:
     "@babel/parser": ^7.20.7
     "@babel/types": ^7.20.7
     "@types/babel__generator": "*"
     "@types/babel__template": "*"
     "@types/babel__traverse": "*"
-  checksum: 564fbaa8ff1305d50807ada0ec227c3e7528bebb2f8fe6b2ed88db0735a31511a74ad18729679c43eeed8025ed29d408f53059289719e95ab1352ed559a100bd
+  checksum: 8d14acc14d99b4b8bf36c00da368f6d597bd9ae3344aa7048f83f0f701b0463fa7c7bf2e50c3e4382fdbcfd1e4187b3452a0f0888b0f3ae8fad975591f7bdb94
   languageName: node
   linkType: hard
 
 "@types/babel__generator@npm:*":
-  version: 7.6.5
-  resolution: "@types/babel__generator@npm:7.6.5"
+  version: 7.6.6
+  resolution: "@types/babel__generator@npm:7.6.6"
   dependencies:
     "@babel/types": ^7.0.0
-  checksum: c7459f5025c4c800eaf58f4db3b24e9d736331fe7df40961d9bc49f31b46e2a3be83dc9276e8688f10a5ed752ae153ad5f1bdd45e2245bac95273730b9115ec2
+  checksum: 36e8838c7e16eff611447579e840526946a8b14c794c82486cee2a5ad2257aa6cad746d8ecff3144e3721178837d2c25d0a435d384391eb67846b933c062b075
   languageName: node
   linkType: hard
 
 "@types/babel__template@npm:*":
-  version: 7.4.2
-  resolution: "@types/babel__template@npm:7.4.2"
+  version: 7.4.3
+  resolution: "@types/babel__template@npm:7.4.3"
   dependencies:
     "@babel/parser": ^7.1.0
     "@babel/types": ^7.0.0
-  checksum: 0fe977b45a3269336c77f3ae4641a6c48abf0fa35ab1a23fb571690786af02d6cec08255a43499b0b25c5633800f7ae882ace450cce905e3060fa9e6995047ae
+  checksum: 55deb814c94d1bfb78c4d1de1de1b73eb17c79374602f3bd8aa14e356a77fca64d01646cebe25ec9b307f53a047acc6d53ad6e931019d0726422f5f911e945aa
   languageName: node
   linkType: hard
 
 "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6":
-  version: 7.20.2
-  resolution: "@types/babel__traverse@npm:7.20.2"
+  version: 7.20.3
+  resolution: "@types/babel__traverse@npm:7.20.3"
   dependencies:
     "@babel/types": ^7.20.7
-  checksum: 981340286479524436348d32373eaa3bf993c635cbf70307b4b69463eee83406a959ac4844f683911e0db8ab8d9f0025ab630dc7a8c170fee9ee74144c2a528f
+  checksum: 6d0f70d8972647c9b78b51a54f0b6481c4f23f0bb2699ad276e6070678bd121fede99e8e2c8c3e409d2f31a0bf83ae511abc6fefb91f0630c8d728a3a9136790
   languageName: node
   linkType: hard
 
 "@types/cheerio@npm:^0.22.8":
-  version: 0.22.32
-  resolution: "@types/cheerio@npm:0.22.32"
+  version: 0.22.33
+  resolution: "@types/cheerio@npm:0.22.33"
   dependencies:
     "@types/node": "*"
-  checksum: 5a4885e03889c19638f0086d53e653d36a9eb097d0a08ec69dddf65ef685cd7118989c4fb28d5b28746502efc54bc57a3f751ee2a9aab3cfd32991bf5b51df10
+  checksum: da4745b4d431b79c0ea046ae831a65f948d889bac5c7fe8b50b38055401e7c736e97c0f499e6506941b3ed4d80e4c5b8736b34fc7ecdcae48be7353eb24230be
   languageName: node
   linkType: hard
 
 "@types/estree@npm:*, @types/estree@npm:^1.0.0":
-  version: 1.0.2
-  resolution: "@types/estree@npm:1.0.2"
-  checksum: aeedb1b2fe20cbe06f44b99b562bf9703e360bfcdf5bb3d61d248182ee1dd63500f2474e12f098ffe1f5ac3202b43b3e18ec99902d9328d5374f5512fa077e45
+  version: 1.0.3
+  resolution: "@types/estree@npm:1.0.3"
+  checksum: f21a5448995f8aa61ab2248d10590d275666b11d26c27fe75b3c23420b07b469d5ce820deefcf7399671faa09d56eb7ce012322948e484d94686fda154be5221
   languageName: node
   linkType: hard
 
 "@types/graceful-fs@npm:^4.1.3":
-  version: 4.1.7
-  resolution: "@types/graceful-fs@npm:4.1.7"
+  version: 4.1.8
+  resolution: "@types/graceful-fs@npm:4.1.8"
   dependencies:
     "@types/node": "*"
-  checksum: 8b97e208f85c9efd02a6003a582c77646dd87be0af13aec9419a720771560a8a87a979eaca73ae193d7c73127f34d0a958403a9b5d6246e450289fd8c79adf09
+  checksum: 6e1ee9c119e075134696171b680fee7b627f3e077ec5e5ad9ba9359f1688a84fa35ea6804f96922c43ca30ab8d4ca9531a526b64f57fa13e1d721bf741884829
   languageName: node
   linkType: hard
 
 "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1":
-  version: 2.0.4
-  resolution: "@types/istanbul-lib-coverage@npm:2.0.4"
-  checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7
+  version: 2.0.5
+  resolution: "@types/istanbul-lib-coverage@npm:2.0.5"
+  checksum: 978eaf327f9a238eb1e2828b93b4b48e288ffb88c4be81330c74477ab8b93fac41a8784260d72bdd9995535d70608f738199b6364fd3344842e924a3ec3301e7
   languageName: node
   linkType: hard
 
 "@types/istanbul-lib-report@npm:*":
-  version: 3.0.1
-  resolution: "@types/istanbul-lib-report@npm:3.0.1"
+  version: 3.0.2
+  resolution: "@types/istanbul-lib-report@npm:3.0.2"
   dependencies:
     "@types/istanbul-lib-coverage": "*"
-  checksum: cfc66de48577bb7b2636a6afded7056483693c3ea70916276518cdfaa0d4b51bf564ded88fb13e75716665c3af3d4d54e9c2de042c0219dcabad7e81c398688b
+  checksum: 549e44e14a4dc98164ce477ca8650d33898e5c74a6bb8079cbec7f811567dcb805a3bfdbf83ce53222eaecc37ae53aa7f25bda1a7d8347449155c8f0b4f30232
   languageName: node
   linkType: hard
 
 "@types/istanbul-reports@npm:^3.0.0":
-  version: 3.0.2
-  resolution: "@types/istanbul-reports@npm:3.0.2"
+  version: 3.0.3
+  resolution: "@types/istanbul-reports@npm:3.0.3"
   dependencies:
     "@types/istanbul-lib-report": "*"
-  checksum: f52028d6fe4d28f0085dd7ed66ccfa6af632579e9a4091b90928ffef93d4dbec0bacd49e9caf1b939d05df9eafc5ac1f5939413cdf8ac59fbe4b29602d4d0939
+  checksum: 21d007be7dd09165ed24f5cc9947319ad435fc3b3e568f3eec0a42ee80fd2adccdeb929bc1311efb2cf7597835638cde865d3630d8b4c15d1390c9527bcad1a9
   languageName: node
   linkType: hard
 
@@ -2338,9 +2338,9 @@ __metadata:
   linkType: hard
 
 "@types/json-schema@npm:^7.0.9":
-  version: 7.0.13
-  resolution: "@types/json-schema@npm:7.0.13"
-  checksum: 345df21a678fa72fb389f35f33de77833d09d4a142bb2bcb27c18690efa4cf70fc2876e43843cefb3fbdb9fcb12cd3e970a90936df30f53bbee899865ff605ab
+  version: 7.0.14
+  resolution: "@types/json-schema@npm:7.0.14"
+  checksum: 4b3dd99616c7c808201c56f6c7f6552eb67b5c0c753ab3fa03a6cb549aae950da537e9558e53fa65fba23d1be624a1e4e8d20c15027efbe41e03ca56f2b04fb0
   languageName: node
   linkType: hard
 
@@ -2368,23 +2368,25 @@ __metadata:
   linkType: hard
 
 "@types/minimist@npm:^1.2.2":
-  version: 1.2.3
-  resolution: "@types/minimist@npm:1.2.3"
-  checksum: 666ea4f8c39dcbdfbc3171fe6b3902157c845cc9cb8cee33c10deb706cda5e0cc80f98ace2d6d29f6774b0dc21180c96cd73c592a1cbefe04777247c7ba0e84b
+  version: 1.2.4
+  resolution: "@types/minimist@npm:1.2.4"
+  checksum: d7912f9a466312cbc1333800272b9208178140ef4da2ccec3fa82231c8e67f57f84275b3c19109c4f68f1b7b057baeacc6b80af1de14b58b46e6b54233e44c6a
   languageName: node
   linkType: hard
 
 "@types/node@npm:*":
-  version: 20.8.3
-  resolution: "@types/node@npm:20.8.3"
-  checksum: bfb88b341faeb19f8fd37306a3bf433721b876c6491d10fcb0b13fd26601fa36ee45113dd82b1e1c23e3c957dff5b99f81a16493cefa03abe797e41a2487a4f7
+  version: 20.8.7
+  resolution: "@types/node@npm:20.8.7"
+  dependencies:
+    undici-types: ~5.25.1
+  checksum: 2173c0c03daefcb60c03a61b1371b28c8fe412e7a40dc6646458b809d14a85fbc7aeb369d957d57f0aaaafd99964e77436f29b3b579232d8f2b20c58abbd1d25
   languageName: node
   linkType: hard
 
 "@types/normalize-package-data@npm:^2.4.0":
-  version: 2.4.2
-  resolution: "@types/normalize-package-data@npm:2.4.2"
-  checksum: 2132e4054711e6118de967ae3a34f8c564e58d71fbcab678ec2c34c14659f638a86c35a0fd45237ea35a4a03079cf0a485e3f97736ffba5ed647bfb5da086b03
+  version: 2.4.3
+  resolution: "@types/normalize-package-data@npm:2.4.3"
+  checksum: 6f60e157c0fc39b80d80eb9043cdd78e4090f25c5264ef0317f5701648a5712fd453d364569675a19aef44a18c6f14f6e4809bdc0b97a46a0ed9ce4a320bbe42
   languageName: node
   linkType: hard
 
@@ -2396,75 +2398,75 @@ __metadata:
   linkType: hard
 
 "@types/responselike@npm:^1.0.0":
-  version: 1.0.1
-  resolution: "@types/responselike@npm:1.0.1"
+  version: 1.0.2
+  resolution: "@types/responselike@npm:1.0.2"
   dependencies:
     "@types/node": "*"
-  checksum: ae8c36c9354aaedfa462dab655aa17613529d545a418acc54ba0214145fc1d0454be2ae107031a1b2c24768f19f2af7e4096a85d1e604010becd0bec2355cb0e
+  checksum: ff1767e947eb7d49849e4566040453efcd894888e85b398f7f8cb731552f303f26aceda573b680a142b77ec5fb6c79535d9c6d047d9f936c386dbf3863d2ae17
   languageName: node
   linkType: hard
 
 "@types/semver@npm:^7.3.12":
-  version: 7.5.3
-  resolution: "@types/semver@npm:7.5.3"
-  checksum: 349fdd1ab6c213bac5c991bac766bd07b8b12e63762462bb058740dcd2eb09c8193d068bb226f134661275f2022976214c0e727a4e5eb83ec1b131127c980d3e
+  version: 7.5.4
+  resolution: "@types/semver@npm:7.5.4"
+  checksum: 120c0189f6fec5f2d12d0d71ac8a4cfa952dc17fa3d842e8afddb82bba8828a4052f8799c1653e2b47ae1977435f38e8985658fde971905ce5afb8e23ee97ecf
   languageName: node
   linkType: hard
 
 "@types/stack-utils@npm:^2.0.0":
-  version: 2.0.1
-  resolution: "@types/stack-utils@npm:2.0.1"
-  checksum: 205fdbe3326b7046d7eaf5e494d8084f2659086a266f3f9cf00bccc549c8e36e407f88168ad4383c8b07099957ad669f75f2532ed4bc70be2b037330f7bae019
+  version: 2.0.2
+  resolution: "@types/stack-utils@npm:2.0.2"
+  checksum: 777cc7ac0c1000c5a07561013bcf7bd8477a3d55f55f376ee2f0c586331f7b999f57788140cfbdb65f6d7d97c0c41fe8fe6c778fd3ed71859c9b681ea76fc621
   languageName: node
   linkType: hard
 
 "@types/tough-cookie@npm:*":
-  version: 4.0.3
-  resolution: "@types/tough-cookie@npm:4.0.3"
-  checksum: f201be1bbca2f2d3572032513cdb9825845114d2604a7f4091af848eeee3228a573cdc5e8082b04468a2848bb1d058f1adbb97db822e22c975ebd6fcd851a453
+  version: 4.0.4
+  resolution: "@types/tough-cookie@npm:4.0.4"
+  checksum: 6be275b09f5fbf33f359fd6d5372c69357cf96dea5d7ba7a6563c76c6cce8b0c7f81caa4805810b0e67427cad381aeef00d8c060d614fee79ca245c2b9887c3a
   languageName: node
   linkType: hard
 
 "@types/yargs-parser@npm:*":
-  version: 21.0.1
-  resolution: "@types/yargs-parser@npm:21.0.1"
-  checksum: 64e6316c2045e2d460c4fb79572f872f9d2f98fddc6d9d3949c71f0b6ad0ef8a2706cf49db26dfb02a9cb81433abb8f340f015e1d20a9692279abe9477b72c8e
+  version: 21.0.2
+  resolution: "@types/yargs-parser@npm:21.0.2"
+  checksum: e979051aac91d778fdb3953aced8cf039d954c3936b910b57735b7b52a413d065e6b2aea1cb2c583f6c23296a6f8543d2541879d798f0afedd7409a562b7bdeb
   languageName: node
   linkType: hard
 
 "@types/yargs@npm:^17.0.8":
-  version: 17.0.28
-  resolution: "@types/yargs@npm:17.0.28"
+  version: 17.0.29
+  resolution: "@types/yargs@npm:17.0.29"
   dependencies:
     "@types/yargs-parser": "*"
-  checksum: f78c5e5c29903933c0557b4ffcd1d0b8564d66859c8ca4aa51da3714e49109ed7c2644334a1918d033df19028f4cecc91fd2e502651bb8e8451f246c371da847
+  checksum: 8bbc0edd573a5a084cb13a9985c124490fd74e73b1ed8a3058861c13124e103b00a19770dc55c53215653a7845d7033e0695917b75153cfe9618d5b2fd3cf86e
   languageName: node
   linkType: hard
 
 "@types/yauzl@npm:^2.9.1":
-  version: 2.10.1
-  resolution: "@types/yauzl@npm:2.10.1"
+  version: 2.10.2
+  resolution: "@types/yauzl@npm:2.10.2"
   dependencies:
     "@types/node": "*"
-  checksum: 3377916a2d493cb2422b167fb7dfff8cb3ea045a9489dab4955858719bf7fe6808e5f6a51ee819904fb7f623f7ac092b87f9d6a857ea1214a45070d19c8b3d7e
+  checksum: 4ee53b704074064179ed50881b2dfa6f07f8a7032af487f513aa04f0ed333be4ff4231ac8531e6a2024cc45ac69a22e78a2ff4e39a6ed2fe8cc0bfabc353da45
   languageName: node
   linkType: hard
 
-"@typescript-eslint/parser@npm:^6.7.4":
-  version: 6.7.4
-  resolution: "@typescript-eslint/parser@npm:6.7.4"
+"@typescript-eslint/parser@npm:^6.8.0":
+  version: 6.8.0
+  resolution: "@typescript-eslint/parser@npm:6.8.0"
   dependencies:
-    "@typescript-eslint/scope-manager": 6.7.4
-    "@typescript-eslint/types": 6.7.4
-    "@typescript-eslint/typescript-estree": 6.7.4
-    "@typescript-eslint/visitor-keys": 6.7.4
+    "@typescript-eslint/scope-manager": 6.8.0
+    "@typescript-eslint/types": 6.8.0
+    "@typescript-eslint/typescript-estree": 6.8.0
+    "@typescript-eslint/visitor-keys": 6.8.0
     debug: ^4.3.4
   peerDependencies:
     eslint: ^7.0.0 || ^8.0.0
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 60e7c01a69c1a67577f031cd6ef3c7980a9aedf2045b9950e339836acb2fe9d7bf0c8909fa95d713a8270f19dead43d82beb27dcf8705f81fe35b14b737e8fe0
+  checksum: 10d7a3ae383fee5a5cba9541c72e23d6ab01cca6b414a62b44dacb5ebc15c80b80aa6c105b6469d3795f2f8514ae2499c069cd2d9dcac61f3db9ef6c7a75e080
   languageName: node
   linkType: hard
 
@@ -2478,13 +2480,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/scope-manager@npm:6.7.4":
-  version: 6.7.4
-  resolution: "@typescript-eslint/scope-manager@npm:6.7.4"
+"@typescript-eslint/scope-manager@npm:6.8.0":
+  version: 6.8.0
+  resolution: "@typescript-eslint/scope-manager@npm:6.8.0"
   dependencies:
-    "@typescript-eslint/types": 6.7.4
-    "@typescript-eslint/visitor-keys": 6.7.4
-  checksum: 8475d28f6408c204fb6bf25df45c1f16cad950190e31346c4b1ae15461a96f30b31b6fd1d3d635b41db6aa9a3fd3de25f04823632c74eeea478f34ebd134a1b0
+    "@typescript-eslint/types": 6.8.0
+    "@typescript-eslint/visitor-keys": 6.8.0
+  checksum: b6cf2803531d1c14b56c30fd3cd807b80e17fe48d0da8e5aa9ae50915407ed732c7e2a7ac8030b7cf8ed07b8e481a1138d76bf05b727837a0e016280c2f6873b
   languageName: node
   linkType: hard
 
@@ -2495,10 +2497,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/types@npm:6.7.4":
-  version: 6.7.4
-  resolution: "@typescript-eslint/types@npm:6.7.4"
-  checksum: 287ae48a2bb722b866460bcb2ba4ff908348145b3fc0af4ea75679d474e9ba3632bf64689044f181fe8ca3cb5f41238bb31ea428d5e78f1c3982f6dac6b7b149
+"@typescript-eslint/types@npm:6.8.0":
+  version: 6.8.0
+  resolution: "@typescript-eslint/types@npm:6.8.0"
+  checksum: 1fcd85f6d575116d51c6ee757ed37610ae5e7e4296a29f93c9c6949f6cd16d24550eb7fc5bae7a43119cc08e13836f69a7ae7c54ebba6c95aef96b34d3bfb7f7
   languageName: node
   linkType: hard
 
@@ -2520,12 +2522,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/typescript-estree@npm:6.7.4":
-  version: 6.7.4
-  resolution: "@typescript-eslint/typescript-estree@npm:6.7.4"
+"@typescript-eslint/typescript-estree@npm:6.8.0":
+  version: 6.8.0
+  resolution: "@typescript-eslint/typescript-estree@npm:6.8.0"
   dependencies:
-    "@typescript-eslint/types": 6.7.4
-    "@typescript-eslint/visitor-keys": 6.7.4
+    "@typescript-eslint/types": 6.8.0
+    "@typescript-eslint/visitor-keys": 6.8.0
     debug: ^4.3.4
     globby: ^11.1.0
     is-glob: ^4.0.3
@@ -2534,7 +2536,7 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 2e8f5e972403233522eff09cfe7a0a23549cfd462e82b434aa32ddbdba5b329be5a549514a157f6b79e2d0159c9348d23b202e5d915d4f2c7cbfe72e1a48a429
+  checksum: 388db7f33ef1bc0e7b960c0bce9c744c2e32c66c7ab8dfae73d8533958202ad6f31663b0010f79c45b5ff93159c67f45b00693d73b9da2472b17156dfd26b4a8
   languageName: node
   linkType: hard
 
@@ -2566,13 +2568,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/visitor-keys@npm:6.7.4":
-  version: 6.7.4
-  resolution: "@typescript-eslint/visitor-keys@npm:6.7.4"
+"@typescript-eslint/visitor-keys@npm:6.8.0":
+  version: 6.8.0
+  resolution: "@typescript-eslint/visitor-keys@npm:6.8.0"
   dependencies:
-    "@typescript-eslint/types": 6.7.4
+    "@typescript-eslint/types": 6.8.0
     eslint-visitor-keys: ^3.4.1
-  checksum: 34d09798b6c48dc059e88c6cb3df5f96e859bd65d1dd05d907b8a3c7a5708a737d50607081fb14a4b974b90cfe4169a93db974bf53af8b282420187f73b0afac
+  checksum: 710d9067b85d7715a400ae625c083c41733abb891d7b35108de083913980f9642e79d27689599fa39915f0fecae16dbfc30367007fccc838ccd917943660de22
+  languageName: node
+  linkType: hard
+
+"@ungap/structured-clone@npm:^1.2.0":
+  version: 1.2.0
+  resolution: "@ungap/structured-clone@npm:1.2.0"
+  checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524
   languageName: node
   linkType: hard
 
@@ -2920,7 +2929,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"array-includes@npm:^3.1.6":
+"array-includes@npm:^3.1.7":
   version: 3.1.7
   resolution: "array-includes@npm:3.1.7"
   dependencies:
@@ -2956,7 +2965,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"array.prototype.findlastindex@npm:^1.2.2":
+"array.prototype.findlastindex@npm:^1.2.3":
   version: 1.2.3
   resolution: "array.prototype.findlastindex@npm:1.2.3"
   dependencies:
@@ -2969,7 +2978,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"array.prototype.flat@npm:^1.3.1":
+"array.prototype.flat@npm:^1.3.2":
   version: 1.3.2
   resolution: "array.prototype.flat@npm:1.3.2"
   dependencies:
@@ -2981,7 +2990,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"array.prototype.flatmap@npm:^1.3.1":
+"array.prototype.flatmap@npm:^1.3.2":
   version: 1.3.2
   resolution: "array.prototype.flatmap@npm:1.3.2"
   dependencies:
@@ -3152,39 +3161,39 @@ __metadata:
   languageName: node
   linkType: hard
 
-"babel-plugin-polyfill-corejs2@npm:^0.4.5":
-  version: 0.4.5
-  resolution: "babel-plugin-polyfill-corejs2@npm:0.4.5"
+"babel-plugin-polyfill-corejs2@npm:^0.4.6":
+  version: 0.4.6
+  resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6"
   dependencies:
     "@babel/compat-data": ^7.22.6
-    "@babel/helper-define-polyfill-provider": ^0.4.2
+    "@babel/helper-define-polyfill-provider": ^0.4.3
     semver: ^6.3.1
   peerDependencies:
     "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0
-  checksum: 33a8e06aa54e2858d211c743d179f0487b03222f9ca1bfd7c4865bca243fca942a3358cb75f6bb894ed476cbddede834811fbd6903ff589f055821146f053e1a
+  checksum: 08896811df31530be6a9bcdd630cb9fd4b5ae5181039d18db3796efbc54e38d57a42af460845c10a04434e1bc45c0d47743c7e6c860383cc6b141083cde22030
   languageName: node
   linkType: hard
 
-"babel-plugin-polyfill-corejs3@npm:^0.8.3":
-  version: 0.8.4
-  resolution: "babel-plugin-polyfill-corejs3@npm:0.8.4"
+"babel-plugin-polyfill-corejs3@npm:^0.8.5":
+  version: 0.8.5
+  resolution: "babel-plugin-polyfill-corejs3@npm:0.8.5"
   dependencies:
-    "@babel/helper-define-polyfill-provider": ^0.4.2
+    "@babel/helper-define-polyfill-provider": ^0.4.3
     core-js-compat: ^3.32.2
   peerDependencies:
     "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0
-  checksum: 7243241a5b978b1335d51bcbd1248d6c4df88f6b3726706e71e0392f111c59bbf01118c85bb0ed42dce65e90e8fc768d19eda0a81a321cbe54abd3df9a285dc8
+  checksum: 54ff3956c4f88e483d38b27ceec6199b9e73fceac10ebf969469d215e6a62929384e4433f85335c9a6ba809329636e27f9bdae2f54075f833e7a745341c07d84
   languageName: node
   linkType: hard
 
-"babel-plugin-polyfill-regenerator@npm:^0.5.2":
-  version: 0.5.2
-  resolution: "babel-plugin-polyfill-regenerator@npm:0.5.2"
+"babel-plugin-polyfill-regenerator@npm:^0.5.3":
+  version: 0.5.3
+  resolution: "babel-plugin-polyfill-regenerator@npm:0.5.3"
   dependencies:
-    "@babel/helper-define-polyfill-provider": ^0.4.2
+    "@babel/helper-define-polyfill-provider": ^0.4.3
   peerDependencies:
     "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0
-  checksum: d962200f604016a9a09bc9b4aaf60a3db7af876bb65bcefaeac04d44ac9d9ec4037cf24ce117760cc141d7046b6394c7eb0320ba9665cb4a2ee64df2be187c93
+  checksum: 2bb546582cda1870d19e646a7183baeb2cccd56e0ef3e4eaeabd28e120daf17cb87399194a9ccdcf32506bcaa68d23e73440fc8ab990a7a0f8c5a77c12d5d4bc
   languageName: node
   linkType: hard
 
@@ -3484,13 +3493,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2":
-  version: 1.0.2
-  resolution: "call-bind@npm:1.0.2"
+"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5":
+  version: 1.0.5
+  resolution: "call-bind@npm:1.0.5"
   dependencies:
-    function-bind: ^1.1.1
-    get-intrinsic: ^1.0.2
-  checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0
+    function-bind: ^1.1.2
+    get-intrinsic: ^1.2.1
+    set-function-length: ^1.1.1
+  checksum: 449e83ecbd4ba48e7eaac5af26fea3b50f8f6072202c2dd7c5a6e7a6308f2421abe5e13a3bbd55221087f76320c5e09f25a8fdad1bab2b77c68ae74d92234ea5
   languageName: node
   linkType: hard
 
@@ -3538,9 +3548,9 @@ __metadata:
   linkType: hard
 
 "caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001541":
-  version: 1.0.30001546
-  resolution: "caniuse-lite@npm:1.0.30001546"
-  checksum: d3ef82f5ee94743002c5b2dd61c84342debcc94b2d5907b64ade3514ecfc4f20bbe86a6bc453fd6436d5fbcf6582e07405d7c2077565675a71c83adc238a11fa
+  version: 1.0.30001553
+  resolution: "caniuse-lite@npm:1.0.30001553"
+  checksum: 45d6a2a3c3a098c8093a4c8883fceafb4bbf59d96f6fd5bb381ba4581d07eecbe0ede4f55383f0d49374154ff6a808bd90fbe32b17ccd1738034d2579787b33c
   languageName: node
   linkType: hard
 
@@ -4093,11 +4103,11 @@ __metadata:
   linkType: hard
 
 "core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.32.2":
-  version: 3.33.0
-  resolution: "core-js-compat@npm:3.33.0"
+  version: 3.33.1
+  resolution: "core-js-compat@npm:3.33.1"
   dependencies:
     browserslist: ^4.22.1
-  checksum: 83ae54008c09b8e0ae3c59457039866c342c7e28b0d30eebb638a5b51c01432e63fe97695c90645cbc6a8b073a4f9a8b0e75f0818bbf8b4b054e01f4c17d3181
+  checksum: 39329daf135a3d8fdd86cf61d4fb2e868d1d9a60308cd98fccd0296d5e40b040c107e9aaa8a87163d8c058c69fbd441bc0a7a035aebd2d0978275bd0b257df15
   languageName: node
   linkType: hard
 
@@ -4108,10 +4118,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"core-js@npm:^3.33.0":
-  version: 3.33.0
-  resolution: "core-js@npm:3.33.0"
-  checksum: dd62217935ac281faf6f833bb306fb891162919fcf9c1f0c975b1b91e82ac09a940f5deb5950bbb582739ceef716e8bd7e4f9eab8328932fb029d3bc2ecb2881
+"core-js@npm:^3.33.1":
+  version: 3.33.1
+  resolution: "core-js@npm:3.33.1"
+  checksum: 3a95003b0e77995203587117f3bde7f4e96adf434b6b78033dbe60347ffe38b2bac31eafab6a4cc641e5766062846b52f336ab4553fc0902c278959af4778e53
   languageName: node
   linkType: hard
 
@@ -4187,10 +4197,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"css-functions-list@npm:^3.2.0":
-  version: 3.2.0
-  resolution: "css-functions-list@npm:3.2.0"
-  checksum: fe912ea852fad500aef9a4f04db9a0371c7b0eb1ac1a45fbd8df0156ae0538cee7492ebd620b9bb502fe5bf2b5ed3bf3c16b6659cf67c7144eff0b597bcc3891
+"css-functions-list@npm:^3.2.1":
+  version: 3.2.1
+  resolution: "css-functions-list@npm:3.2.1"
+  checksum: 57d7deb3b05e84d95b88ba9b3244cf60d33b40652b3357f084c805b24a9febda5987ade44ef25a56be41e73249a7dcc157abd704d8a0e998b2c1c2e2d5de6461
   languageName: node
   linkType: hard
 
@@ -4446,14 +4456,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"define-data-property@npm:^1.0.1":
-  version: 1.1.0
-  resolution: "define-data-property@npm:1.1.0"
+"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1":
+  version: 1.1.1
+  resolution: "define-data-property@npm:1.1.1"
   dependencies:
     get-intrinsic: ^1.2.1
     gopd: ^1.0.1
     has-property-descriptors: ^1.0.0
-  checksum: 7ad4ee84cca8ad427a4831f5693526804b62ce9dfd4efac77214e95a4382aed930072251d4075dc8dc9fc949a353ed51f19f5285a84a788ba9216cc51472a093
+  checksum: a29855ad3f0630ea82e3c5012c812efa6ca3078d5c2aa8df06b5f597c1cde6f7254692df41945851d903e05a1668607b6d34e778f402b9ff9ffb38111f1a3f0d
   languageName: node
   linkType: hard
 
@@ -4782,9 +4792,9 @@ __metadata:
   linkType: hard
 
 "electron-to-chromium@npm:^1.4.535":
-  version: 1.4.544
-  resolution: "electron-to-chromium@npm:1.4.544"
-  checksum: 78e88e4c56fc4faaa9a405de5e0b51305531e9cdf2c71bcc9296c2c59fb68001472e5b924f8701c873bc855ab5174cf0340642712d7af05c1d8e92356529397e
+  version: 1.4.563
+  resolution: "electron-to-chromium@npm:1.4.563"
+  checksum: 50512b9662688291b1c4e921def7206bab1ebd57f5bf5bdbb7961842ae69b4baad5df1293084b62ea07686c578e42ed17546434d7c9102960914240770921a5b
   languageName: node
   linkType: hard
 
@@ -4930,24 +4940,24 @@ __metadata:
   linkType: hard
 
 "es-abstract@npm:^1.22.1":
-  version: 1.22.2
-  resolution: "es-abstract@npm:1.22.2"
+  version: 1.22.3
+  resolution: "es-abstract@npm:1.22.3"
   dependencies:
     array-buffer-byte-length: ^1.0.0
     arraybuffer.prototype.slice: ^1.0.2
     available-typed-arrays: ^1.0.5
-    call-bind: ^1.0.2
+    call-bind: ^1.0.5
     es-set-tostringtag: ^2.0.1
     es-to-primitive: ^1.2.1
     function.prototype.name: ^1.1.6
-    get-intrinsic: ^1.2.1
+    get-intrinsic: ^1.2.2
     get-symbol-description: ^1.0.0
     globalthis: ^1.0.3
     gopd: ^1.0.1
-    has: ^1.0.3
     has-property-descriptors: ^1.0.0
     has-proto: ^1.0.1
     has-symbols: ^1.0.3
+    hasown: ^2.0.0
     internal-slot: ^1.0.5
     is-array-buffer: ^3.0.2
     is-callable: ^1.2.7
@@ -4957,7 +4967,7 @@ __metadata:
     is-string: ^1.0.7
     is-typed-array: ^1.1.12
     is-weakref: ^1.0.2
-    object-inspect: ^1.12.3
+    object-inspect: ^1.13.1
     object-keys: ^1.1.1
     object.assign: ^4.1.4
     regexp.prototype.flags: ^1.5.1
@@ -4971,28 +4981,28 @@ __metadata:
     typed-array-byte-offset: ^1.0.0
     typed-array-length: ^1.0.4
     unbox-primitive: ^1.0.2
-    which-typed-array: ^1.1.11
-  checksum: cc70e592d360d7d729859013dee7a610c6b27ed8630df0547c16b0d16d9fe6505a70ee14d1af08d970fdd132b3f88c9ca7815ce72c9011608abf8ab0e55fc515
+    which-typed-array: ^1.1.13
+  checksum: b1bdc962856836f6e72be10b58dc128282bdf33771c7a38ae90419d920fc3b36cc5d2b70a222ad8016e3fc322c367bf4e9e89fc2bc79b7e933c05b218e83d79a
   languageName: node
   linkType: hard
 
 "es-set-tostringtag@npm:^2.0.1":
-  version: 2.0.1
-  resolution: "es-set-tostringtag@npm:2.0.1"
+  version: 2.0.2
+  resolution: "es-set-tostringtag@npm:2.0.2"
   dependencies:
-    get-intrinsic: ^1.1.3
-    has: ^1.0.3
+    get-intrinsic: ^1.2.2
     has-tostringtag: ^1.0.0
-  checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884
+    hasown: ^2.0.0
+  checksum: afcec3a4c9890ae14d7ec606204858441c801ff84f312538e1d1ccf1e5493c8b17bd672235df785f803756472cb4f2d49b87bde5237aef33411e74c22f194e07
   languageName: node
   linkType: hard
 
 "es-shim-unscopables@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "es-shim-unscopables@npm:1.0.0"
+  version: 1.0.2
+  resolution: "es-shim-unscopables@npm:1.0.2"
   dependencies:
-    has: ^1.0.3
-  checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1
+    hasown: ^2.0.0
+  checksum: 432bd527c62065da09ed1d37a3f8e623c423683285e6188108286f4a1e8e164a5bcbfbc0051557c7d14633cd2a41ce24c7048e6bbb66a985413fd32f1be72626
   languageName: node
   linkType: hard
 
@@ -5099,7 +5109,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"eslint-import-resolver-node@npm:^0.3.7, eslint-import-resolver-node@npm:^0.3.9":
+"eslint-import-resolver-node@npm:^0.3.9":
   version: 0.3.9
   resolution: "eslint-import-resolver-node@npm:0.3.9"
   dependencies:
@@ -5140,36 +5150,36 @@ __metadata:
   languageName: node
   linkType: hard
 
-"eslint-plugin-import@npm:^2.28.1":
-  version: 2.28.1
-  resolution: "eslint-plugin-import@npm:2.28.1"
+"eslint-plugin-import@npm:^2.29.0":
+  version: 2.29.0
+  resolution: "eslint-plugin-import@npm:2.29.0"
   dependencies:
-    array-includes: ^3.1.6
-    array.prototype.findlastindex: ^1.2.2
-    array.prototype.flat: ^1.3.1
-    array.prototype.flatmap: ^1.3.1
+    array-includes: ^3.1.7
+    array.prototype.findlastindex: ^1.2.3
+    array.prototype.flat: ^1.3.2
+    array.prototype.flatmap: ^1.3.2
     debug: ^3.2.7
     doctrine: ^2.1.0
-    eslint-import-resolver-node: ^0.3.7
+    eslint-import-resolver-node: ^0.3.9
     eslint-module-utils: ^2.8.0
-    has: ^1.0.3
-    is-core-module: ^2.13.0
+    hasown: ^2.0.0
+    is-core-module: ^2.13.1
     is-glob: ^4.0.3
     minimatch: ^3.1.2
-    object.fromentries: ^2.0.6
-    object.groupby: ^1.0.0
-    object.values: ^1.1.6
+    object.fromentries: ^2.0.7
+    object.groupby: ^1.0.1
+    object.values: ^1.1.7
     semver: ^6.3.1
     tsconfig-paths: ^3.14.2
   peerDependencies:
     eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
-  checksum: e8ae6dd8f06d8adf685f9c1cfd46ac9e053e344a05c4090767e83b63a85c8421ada389807a39e73c643b9bff156715c122e89778169110ed68d6428e12607edf
+  checksum: 19ee541fb95eb7a796f3daebe42387b8d8262bbbcc4fd8a6e92f63a12035f3d2c6cb8bc0b6a70864fa14b1b50ed6b8e6eed5833e625e16cb6bb98b665beff269
   languageName: node
   linkType: hard
 
-"eslint-plugin-jest@npm:^27.4.2":
-  version: 27.4.2
-  resolution: "eslint-plugin-jest@npm:27.4.2"
+"eslint-plugin-jest@npm:^27.4.3":
+  version: 27.4.3
+  resolution: "eslint-plugin-jest@npm:27.4.3"
   dependencies:
     "@typescript-eslint/utils": ^5.10.0
   peerDependencies:
@@ -5181,7 +5191,7 @@ __metadata:
       optional: true
     jest:
       optional: true
-  checksum: 99a8301ae00c37da97866b8b13c89a077716d2c653b26bc417d242e7300a43237c0017fd488c43966fa38585f19050facdbbc71d03ca36a1ce6f2ba930a9143e
+  checksum: de062a04f30d72535aecfd6594aa302cf350d62e86805c8f0edbb3dce4cde5b557766e7acfd0f87709a9b70854cc2522c04b875337925c64d0d9bc1118ef4693
   languageName: node
   linkType: hard
 
@@ -5221,17 +5231,18 @@ __metadata:
   languageName: node
   linkType: hard
 
-"eslint@npm:^8.51.0":
-  version: 8.51.0
-  resolution: "eslint@npm:8.51.0"
+"eslint@npm:^8.52.0":
+  version: 8.52.0
+  resolution: "eslint@npm:8.52.0"
   dependencies:
     "@eslint-community/eslint-utils": ^4.2.0
     "@eslint-community/regexpp": ^4.6.1
     "@eslint/eslintrc": ^2.1.2
-    "@eslint/js": 8.51.0
-    "@humanwhocodes/config-array": ^0.11.11
+    "@eslint/js": 8.52.0
+    "@humanwhocodes/config-array": ^0.11.13
     "@humanwhocodes/module-importer": ^1.0.1
     "@nodelib/fs.walk": ^1.2.8
+    "@ungap/structured-clone": ^1.2.0
     ajv: ^6.12.4
     chalk: ^4.0.0
     cross-spawn: ^7.0.2
@@ -5264,7 +5275,7 @@ __metadata:
     text-table: ^0.2.0
   bin:
     eslint: bin/eslint.js
-  checksum: 214fa5d1fcb67af1b8992ce9584ccd85e1aa7a482f8b8ea5b96edc28fa838a18a3b69456db45fc1ed3ef95f1e9efa9714f737292dc681e572d471d02fda9649c
+  checksum: fd22d1e9bd7090e31b00cbc7a3b98f3b76020a4c4641f987ae7d0c8f52e1b88c3b268bdfdabac2e1a93513e5d11339b718ff45cbff48a44c35d7e52feba510ed
   languageName: node
   linkType: hard
 
@@ -5546,6 +5557,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"file-entry-cache@npm:^7.0.0":
+  version: 7.0.1
+  resolution: "file-entry-cache@npm:7.0.1"
+  dependencies:
+    flat-cache: ^3.1.1
+  checksum: 3b5affa175cc246147ca394fa2ed719d306126a9259bef7b29c4024451d6671c82bf505600c37ec1398f80427c1fa91edb973b5d5228fd40590f797ce7a2401c
+  languageName: node
+  linkType: hard
+
 "filelist@npm:^1.0.4":
   version: 1.0.4
   resolution: "filelist@npm:1.0.4"
@@ -5615,7 +5635,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"flat-cache@npm:^3.0.4":
+"flat-cache@npm:^3.0.4, flat-cache@npm:^3.1.1":
   version: 3.1.1
   resolution: "flat-cache@npm:3.1.1"
   dependencies:
@@ -5674,9 +5694,9 @@ __metadata:
   linkType: hard
 
 "fraction.js@npm:^4.3.6":
-  version: 4.3.6
-  resolution: "fraction.js@npm:4.3.6"
-  checksum: e96ae77e64ebfd442d3a5a01a3f0637b0663fc2440bcf2841b3ad9341ba24c81fb2e3e7142e43ef7d088558c6b3f8609df135b201adc7a1c674aea6a71384162
+  version: 4.3.7
+  resolution: "fraction.js@npm:4.3.7"
+  checksum: e1553ae3f08e3ba0e8c06e43a3ab20b319966dfb7ddb96fd9b5d0ee11a66571af7f993229c88ebbb0d4a816eb813a24ed48207b140d442a8f76f33763b8d1f3f
   languageName: node
   linkType: hard
 
@@ -5762,10 +5782,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"function-bind@npm:^1.1.1":
-  version: 1.1.1
-  resolution: "function-bind@npm:1.1.1"
-  checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a
+"function-bind@npm:^1.1.2":
+  version: 1.1.2
+  resolution: "function-bind@npm:1.1.2"
+  checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1
   languageName: node
   linkType: hard
 
@@ -5818,15 +5838,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1":
-  version: 1.2.1
-  resolution: "get-intrinsic@npm:1.2.1"
+"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2":
+  version: 1.2.2
+  resolution: "get-intrinsic@npm:1.2.2"
   dependencies:
-    function-bind: ^1.1.1
-    has: ^1.0.3
+    function-bind: ^1.1.2
     has-proto: ^1.0.1
     has-symbols: ^1.0.3
-  checksum: 5b61d88552c24b0cf6fa2d1b3bc5459d7306f699de060d76442cce49a4721f52b8c560a33ab392cf5575b7810277d54ded9d4d39a1ea61855619ebc005aa7e5f
+    hasown: ^2.0.0
+  checksum: 447ff0724df26829908dc033b62732359596fcf66027bc131ab37984afb33842d9cd458fd6cecadfe7eac22fd8a54b349799ed334cf2726025c921c7250e7417
   languageName: node
   linkType: hard
 
@@ -6213,11 +6233,11 @@ __metadata:
   linkType: hard
 
 "has-property-descriptors@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "has-property-descriptors@npm:1.0.0"
+  version: 1.0.1
+  resolution: "has-property-descriptors@npm:1.0.1"
   dependencies:
-    get-intrinsic: ^1.1.1
-  checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb
+    get-intrinsic: ^1.2.2
+  checksum: 2bcc6bf6ec6af375add4e4b4ef586e43674850a91ad4d46666d0b28ba8e1fd69e424c7677d24d60f69470ad0afaa2f3197f508b20b0bb7dd99a8ab77ffc4b7c4
   languageName: node
   linkType: hard
 
@@ -6258,10 +6278,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"has@npm:^1.0.3":
-  version: 1.0.4
-  resolution: "has@npm:1.0.4"
-  checksum: 8a11ba062e0627c9578a1d08285401e39f1d071a9692ddf793199070edb5648b21c774dd733e2a181edd635bf6862731885f476f4ccf67c998d7a5ff7cef2550
+"hasown@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "hasown@npm:2.0.0"
+  dependencies:
+    function-bind: ^1.1.2
+  checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176
   languageName: node
   linkType: hard
 
@@ -6574,13 +6596,13 @@ __metadata:
   linkType: hard
 
 "internal-slot@npm:^1.0.5":
-  version: 1.0.5
-  resolution: "internal-slot@npm:1.0.5"
+  version: 1.0.6
+  resolution: "internal-slot@npm:1.0.6"
   dependencies:
-    get-intrinsic: ^1.2.0
-    has: ^1.0.3
+    get-intrinsic: ^1.2.2
+    hasown: ^2.0.0
     side-channel: ^1.0.4
-  checksum: 97e84046bf9e7574d0956bd98d7162313ce7057883b6db6c5c7b5e5f05688864b0978ba07610c726d15d66544ffe4b1050107d93f8a39ebc59b15d8b429b497a
+  checksum: 7872454888047553ce97a3fa1da7cc054a28ec5400a9c2e9f4dbe4fe7c1d041cb8e8301467614b80d4246d50377aad2fb58860b294ed74d6700cc346b6f89549
   languageName: node
   linkType: hard
 
@@ -6705,12 +6727,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0":
-  version: 2.13.0
-  resolution: "is-core-module@npm:2.13.0"
+"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.5.0":
+  version: 2.13.1
+  resolution: "is-core-module@npm:2.13.1"
   dependencies:
-    has: ^1.0.3
-  checksum: 053ab101fb390bfeb2333360fd131387bed54e476b26860dc7f5a700bbf34a0ec4454f7c8c4d43e8a0030957e4b3db6e16d35e1890ea6fb654c833095e040355
+    hasown: ^2.0.0
+  checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c
   languageName: node
   linkType: hard
 
@@ -7045,7 +7067,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is@npm:^3.2.1":
+"is@npm:^3.3.0":
   version: 3.3.0
   resolution: "is@npm:3.3.0"
   checksum: 81fad3b40c606984c2d0699207c4c48d2a0d29cc834b274d0b74c172f3eeebdb981301fe0d690ce090a96bf021a8a1f8b1325262ad9870c525e557ac4a559c56
@@ -7916,6 +7938,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"known-css-properties@npm:^0.29.0":
+  version: 0.29.0
+  resolution: "known-css-properties@npm:0.29.0"
+  checksum: daa6562e907f856cbfd58a00c42f532c9bba283388984da6a3bffb494e56612e5f23c52f30b0d9885f0ea07ad5d88bfa0470ee65017a6ce6c565289a1afd78af
+  languageName: node
+  linkType: hard
+
 "latest-version@npm:^5.0.0":
   version: 5.1.0
   resolution: "latest-version@npm:5.1.0"
@@ -7977,14 +8006,14 @@ __metadata:
   linkType: hard
 
 "liquidjs@npm:^10.7.0":
-  version: 10.9.2
-  resolution: "liquidjs@npm:10.9.2"
+  version: 10.9.3
+  resolution: "liquidjs@npm:10.9.3"
   dependencies:
     commander: ^10.0.0
   bin:
     liquid: bin/liquid.js
     liquidjs: bin/liquid.js
-  checksum: 2d061869fe76f69f7bf38258c34ddd17659174aaad9a072dc35a230cf858d39ff514e7bf5898065eb2de838392acc04e8fdcf7ec70c6ec53ab11d097ab068148
+  checksum: 8f4d62f746706a9483a03527798b3b0277a4becaddee7f4b43fe30298849c34db99c1bfbeb99145e3119c96847527b8b3c42eff386605bf72443de472df88089
   languageName: node
   linkType: hard
 
@@ -8405,12 +8434,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"magic-string@npm:^0.27.0":
-  version: 0.27.0
-  resolution: "magic-string@npm:0.27.0"
+"magic-string@npm:^0.30.3":
+  version: 0.30.5
+  resolution: "magic-string@npm:0.30.5"
   dependencies:
-    "@jridgewell/sourcemap-codec": ^1.4.13
-  checksum: 273faaa50baadb7a2df6e442eac34ad611304fc08fe16e24fe2e472fd944bfcb73ffb50d2dc972dc04e92784222002af46868cb9698b1be181c81830fd95a13e
+    "@jridgewell/sourcemap-codec": ^1.4.15
+  checksum: da10fecff0c0a7d3faf756913ce62bd6d5e7b0402be48c3b27bfd651b90e29677e279069a63b764bcdc1b8ecdcdb898f29a5c5ec510f2323e8d62ee057a6eb18
   languageName: node
   linkType: hard
 
@@ -8977,11 +9006,11 @@ __metadata:
   linkType: hard
 
 "node-abi@npm:^3.3.0":
-  version: 3.47.0
-  resolution: "node-abi@npm:3.47.0"
+  version: 3.51.0
+  resolution: "node-abi@npm:3.51.0"
   dependencies:
     semver: ^7.3.5
-  checksum: ff8498dcd4a805ebf0af27162023bb17e56cb973c955d6c411ebce0938b0827e34323ede846b635daff516d5cd2ea8d64f9d99f2d63f61d1d7469415323fa9a6
+  checksum: 3fabc9d58f0478767157560249f79c4a9e95082b96700cd8cc470f517bd566dbab82a37c862db3f78d3187be9f19f5cd9822b6f1b7ac7a3254fa70c3e3b38a83
   languageName: node
   linkType: hard
 
@@ -9044,12 +9073,12 @@ __metadata:
   linkType: hard
 
 "node.extend@npm:~2.0.2":
-  version: 2.0.2
-  resolution: "node.extend@npm:2.0.2"
+  version: 2.0.3
+  resolution: "node.extend@npm:2.0.3"
   dependencies:
-    has: ^1.0.3
-    is: ^3.2.1
-  checksum: 1fe3a1ca7fc35392f169c8a46d889d07deb201bba3a20d17df23efab509698c9639737b0c235c9be772a34035e749bae5d477f74c9e26a1b67c78bd7d6dce8e4
+    hasown: ^2.0.0
+    is: ^3.3.0
+  checksum: fde3c527df4b814d773d06392a576a062a6322bbcf4ad2c8726c900573256164fd04d61ee9b09fca774f1dfae7035cb47d23334da50b308d83e9c525f2b83ea9
   languageName: node
   linkType: hard
 
@@ -9233,10 +9262,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0":
-  version: 1.12.3
-  resolution: "object-inspect@npm:1.12.3"
-  checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db
+"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0":
+  version: 1.13.1
+  resolution: "object-inspect@npm:1.13.1"
+  checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f
   languageName: node
   linkType: hard
 
@@ -9259,7 +9288,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"object.fromentries@npm:^2.0.6":
+"object.fromentries@npm:^2.0.7":
   version: 2.0.7
   resolution: "object.fromentries@npm:2.0.7"
   dependencies:
@@ -9270,7 +9299,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"object.groupby@npm:^1.0.0":
+"object.groupby@npm:^1.0.1":
   version: 1.0.1
   resolution: "object.groupby@npm:1.0.1"
   dependencies:
@@ -9282,7 +9311,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"object.values@npm:^1.1.6":
+"object.values@npm:^1.1.7":
   version: 1.1.7
   resolution: "object.values@npm:1.1.7"
   dependencies:
@@ -9303,33 +9332,33 @@ __metadata:
     "@11ty/eleventy-plugin-rss": ^1.2.0
     "@11ty/eleventy-plugin-syntaxhighlight": ^5.0.0
     "@algolia/algoliasearch-netlify-frontend": ^1.0.15
-    "@babel/core": ^7.23.0
-    "@babel/preset-env": ^7.22.20
+    "@babel/core": ^7.23.2
+    "@babel/preset-env": ^7.23.2
     "@netlify/plugin-a11y": ^1.0.0-beta.1
     "@rollup/plugin-babel": ^6.0.4
-    "@rollup/plugin-commonjs": ^25.0.5
+    "@rollup/plugin-commonjs": ^25.0.7
     "@rollup/plugin-node-resolve": ^15.2.3
     "@rollup/plugin-terser": ^0.4.4
     "@tommoor/remove-markdown": ^0.3.2
-    "@typescript-eslint/parser": ^6.7.4
+    "@typescript-eslint/parser": ^6.8.0
     accoutrement: ^4.0.4
     autoprefixer: ^10.4.16
     babel-jest: ^29.7.0
     cascading-color-systems: ^0.1.0-beta.16
     chalk: ^4.1.2
     chokidar-cli: ^3.0.0
-    core-js: ^3.33.0
+    core-js: ^3.33.1
     cssremedy: ^0.1.0-beta.2
     date-fns: ^2.30.0
     date-fns-tz: ^2.0.0
     dotenv: ^16.3.1
     doxray: ^0.10.1
-    eslint: ^8.51.0
+    eslint: ^8.52.0
     eslint-config-prettier: ^9.0.0
     eslint-import-resolver-node: ^0.3.9
     eslint-import-resolver-typescript: ^3.6.1
-    eslint-plugin-import: ^2.28.1
-    eslint-plugin-jest: ^27.4.2
+    eslint-plugin-import: ^2.29.0
+    eslint-plugin-jest: ^27.4.3
     eslint-plugin-simple-import-sort: ^10.0.0
     fs-extra: ^11.1.1
     jest: ^29.7.0
@@ -9347,14 +9376,14 @@ __metadata:
     postcss: ^8.4.31
     prettier: ^3.0.3
     rimraf: ^3.0.2
-    rollup: ^4.0.2
+    rollup: ^4.1.4
     sanitize-html: ^2.11.0
-    sass: ^1.69.0
+    sass: ^1.69.4
     sassdoc: ^2.7.4
     sassdoc-theme-herman: ^5.0.1
     slugify: ^1.6.6
     striptags: ^3.2.0
-    stylelint: ^15.10.3
+    stylelint: ^15.11.0
     stylelint-config-standard-scss: ^11.0.0
     truncate-html: ^1.0.4
     typescript: ^5.2.2
@@ -9838,7 +9867,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"postcss@npm:*, postcss@npm:^8.3.11, postcss@npm:^8.4.27, postcss@npm:^8.4.31":
+"postcss@npm:*, postcss@npm:^8.3.11, postcss@npm:^8.4.28, postcss@npm:^8.4.31":
   version: 8.4.31
   resolution: "postcss@npm:8.4.31"
   dependencies:
@@ -10645,28 +10674,28 @@ __metadata:
   linkType: hard
 
 "resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.15.1, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4":
-  version: 1.22.6
-  resolution: "resolve@npm:1.22.6"
+  version: 1.22.8
+  resolution: "resolve@npm:1.22.8"
   dependencies:
     is-core-module: ^2.13.0
     path-parse: ^1.0.7
     supports-preserve-symlinks-flag: ^1.0.0
   bin:
     resolve: bin/resolve
-  checksum: d13bf66d4e2ee30d291491f16f2fa44edd4e0cefb85d53249dd6f93e70b2b8c20ec62f01b18662e3cd40e50a7528f18c4087a99490048992a3bb954cf3201a5b
+  checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c
   languageName: node
   linkType: hard
 
 "resolve@patch:resolve@^1.10.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.14.2#~builtin<compat/resolve>, resolve@patch:resolve@^1.15.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.4#~builtin<compat/resolve>":
-  version: 1.22.6
-  resolution: "resolve@patch:resolve@npm%3A1.22.6#~builtin<compat/resolve>::version=1.22.6&hash=c3c19d"
+  version: 1.22.8
+  resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin<compat/resolve>::version=1.22.8&hash=c3c19d"
   dependencies:
     is-core-module: ^2.13.0
     path-parse: ^1.0.7
     supports-preserve-symlinks-flag: ^1.0.0
   bin:
     resolve: bin/resolve
-  checksum: 9d3b3c67aefd12cecbe5f10ca4d1f51ea190891096497c43f301b086883b426466918c3a64f1bbf1788fabb52b579d58809614006c5d0b49186702b3b8fb746a
+  checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847
   languageName: node
   linkType: hard
 
@@ -10715,22 +10744,22 @@ __metadata:
   languageName: node
   linkType: hard
 
-"rollup@npm:^4.0.2":
-  version: 4.0.2
-  resolution: "rollup@npm:4.0.2"
-  dependencies:
-    "@rollup/rollup-android-arm-eabi": 4.0.2
-    "@rollup/rollup-android-arm64": 4.0.2
-    "@rollup/rollup-darwin-arm64": 4.0.2
-    "@rollup/rollup-darwin-x64": 4.0.2
-    "@rollup/rollup-linux-arm-gnueabihf": 4.0.2
-    "@rollup/rollup-linux-arm64-gnu": 4.0.2
-    "@rollup/rollup-linux-arm64-musl": 4.0.2
-    "@rollup/rollup-linux-x64-gnu": 4.0.2
-    "@rollup/rollup-linux-x64-musl": 4.0.2
-    "@rollup/rollup-win32-arm64-msvc": 4.0.2
-    "@rollup/rollup-win32-ia32-msvc": 4.0.2
-    "@rollup/rollup-win32-x64-msvc": 4.0.2
+"rollup@npm:^4.1.4":
+  version: 4.1.4
+  resolution: "rollup@npm:4.1.4"
+  dependencies:
+    "@rollup/rollup-android-arm-eabi": 4.1.4
+    "@rollup/rollup-android-arm64": 4.1.4
+    "@rollup/rollup-darwin-arm64": 4.1.4
+    "@rollup/rollup-darwin-x64": 4.1.4
+    "@rollup/rollup-linux-arm-gnueabihf": 4.1.4
+    "@rollup/rollup-linux-arm64-gnu": 4.1.4
+    "@rollup/rollup-linux-arm64-musl": 4.1.4
+    "@rollup/rollup-linux-x64-gnu": 4.1.4
+    "@rollup/rollup-linux-x64-musl": 4.1.4
+    "@rollup/rollup-win32-arm64-msvc": 4.1.4
+    "@rollup/rollup-win32-ia32-msvc": 4.1.4
+    "@rollup/rollup-win32-x64-msvc": 4.1.4
     fsevents: ~2.3.2
   dependenciesMeta:
     "@rollup/rollup-android-arm-eabi":
@@ -10761,7 +10790,7 @@ __metadata:
       optional: true
   bin:
     rollup: dist/bin/rollup
-  checksum: 29ada628da893964b238466053e81750a9e0339e2a933fe6b100d0de2cb68c493f6cc4af558f5bbdafdfcd085e7d8d06da025776ef54fdd46447c3244053fb41
+  checksum: 1a2226627df78c1ce90c0f7ce8e4f589117205c7c699e91403d132d945b3e1d9803d2c2ebaa1a7ef144cc9c08d83b7eb177e6aa5c82517d8faad6a3a59d82666
   languageName: node
   linkType: hard
 
@@ -10862,16 +10891,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"sass@npm:^1.69.0":
-  version: 1.69.0
-  resolution: "sass@npm:1.69.0"
+"sass@npm:^1.69.4":
+  version: 1.69.4
+  resolution: "sass@npm:1.69.4"
   dependencies:
     chokidar: ">=3.0.0 <4.0.0"
     immutable: ^4.0.0
     source-map-js: ">=0.6.2 <2.0.0"
   bin:
     sass: sass.js
-  checksum: eabea31ea3b1dd529c7eff345c8b6468afe6ab8011bd4f95caa2cffb8fb115cc055ea21de425be6197f7ed22516f5652eccb98d315d592ea152ada553f964b8a
+  checksum: ed5558445b59dfa711e094f804e4a360544dd916c069ee211e1c687446146721d91d4304f33fe5df3966a10de96eba43369beb2e14f0881c285424e5e44cf360
   languageName: node
   linkType: hard
 
@@ -11077,6 +11106,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"set-function-length@npm:^1.1.1":
+  version: 1.1.1
+  resolution: "set-function-length@npm:1.1.1"
+  dependencies:
+    define-data-property: ^1.1.1
+    get-intrinsic: ^1.2.1
+    gopd: ^1.0.1
+    has-property-descriptors: ^1.0.0
+  checksum: c131d7569cd7e110cafdfbfbb0557249b538477624dfac4fc18c376d879672fa52563b74029ca01f8f4583a8acb35bb1e873d573a24edb80d978a7ee607c6e06
+  languageName: node
+  linkType: hard
+
 "set-function-name@npm:^2.0.0":
   version: 2.0.1
   resolution: "set-function-name@npm:2.0.1"
@@ -11695,9 +11736,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"stylelint@npm:^15.10.3":
-  version: 15.10.3
-  resolution: "stylelint@npm:15.10.3"
+"stylelint@npm:^15.11.0":
+  version: 15.11.0
+  resolution: "stylelint@npm:15.11.0"
   dependencies:
     "@csstools/css-parser-algorithms": ^2.3.1
     "@csstools/css-tokenizer": ^2.2.0
@@ -11706,12 +11747,12 @@ __metadata:
     balanced-match: ^2.0.0
     colord: ^2.9.3
     cosmiconfig: ^8.2.0
-    css-functions-list: ^3.2.0
+    css-functions-list: ^3.2.1
     css-tree: ^2.3.1
     debug: ^4.3.4
     fast-glob: ^3.3.1
     fastest-levenshtein: ^1.0.16
-    file-entry-cache: ^6.0.1
+    file-entry-cache: ^7.0.0
     global-modules: ^2.0.0
     globby: ^11.1.0
     globjoin: ^0.1.4
@@ -11720,13 +11761,13 @@ __metadata:
     import-lazy: ^4.0.0
     imurmurhash: ^0.1.4
     is-plain-object: ^5.0.0
-    known-css-properties: ^0.28.0
+    known-css-properties: ^0.29.0
     mathml-tag-names: ^2.1.3
     meow: ^10.1.5
     micromatch: ^4.0.5
     normalize-path: ^3.0.0
     picocolors: ^1.0.0
-    postcss: ^8.4.27
+    postcss: ^8.4.28
     postcss-resolve-nested-selector: ^0.1.1
     postcss-safe-parser: ^6.0.0
     postcss-selector-parser: ^6.0.13
@@ -11741,7 +11782,7 @@ __metadata:
     write-file-atomic: ^5.0.1
   bin:
     stylelint: bin/stylelint.mjs
-  checksum: eb70dd0e4d500141f4868ddb7403ad7eb8732b02a3f2fe3907d0859369cedd395b60b0075da758b5be07de771c586b1bf64de4eead8159d46b0d16beff827e67
+  checksum: 9835f8a3e3976a3b81a35569d08f5f4a9c3b5cff415f1345a505870afc0c3231acff27f119d937c5bb11fdbc98d554af564c2a648a52604280a59a11974fcbfc
   languageName: node
   linkType: hard
 
@@ -11892,8 +11933,8 @@ __metadata:
   linkType: hard
 
 "terser@npm:^5.17.4":
-  version: 5.21.0
-  resolution: "terser@npm:5.21.0"
+  version: 5.22.0
+  resolution: "terser@npm:5.22.0"
   dependencies:
     "@jridgewell/source-map": ^0.3.3
     acorn: ^8.8.2
@@ -11901,7 +11942,7 @@ __metadata:
     source-map-support: ~0.5.20
   bin:
     terser: bin/terser
-  checksum: 130f1567af1ffa4ddb067651bb284a01b45b5c83e82b3a072a5ff94b0b00ac35090f89c8714631a4a45972f65187bc149fc7144380611f437e1e3d9e174b136b
+  checksum: ee95981c54ebd381e0b7f5872c646e7a05543e53960f8e0c2f240863c368989d43a3ca80b7e9f691683c92ba199eb4b91d61785fef0b9ca4a887eb55866001f4
   languageName: node
   linkType: hard
 
@@ -12338,6 +12379,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"undici-types@npm:~5.25.1":
+  version: 5.25.3
+  resolution: "undici-types@npm:5.25.3"
+  checksum: ec9d2cc36520cbd9fbe3b3b6c682a87fe5be214699e1f57d1e3d9a2cb5be422e62735f06e0067dc325fd3dd7404c697e4d479f9147dc8a804e049e29f357f2ff
+  languageName: node
+  linkType: hard
+
 "unicode-canonical-property-names-ecmascript@npm:^2.0.0":
   version: 2.0.0
   resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0"
@@ -12730,16 +12778,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"which-typed-array@npm:^1.1.11":
-  version: 1.1.11
-  resolution: "which-typed-array@npm:1.1.11"
+"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13":
+  version: 1.1.13
+  resolution: "which-typed-array@npm:1.1.13"
   dependencies:
     available-typed-arrays: ^1.0.5
-    call-bind: ^1.0.2
+    call-bind: ^1.0.4
     for-each: ^0.3.3
     gopd: ^1.0.1
     has-tostringtag: ^1.0.0
-  checksum: 711ffc8ef891ca6597b19539075ec3e08bb9b4c2ca1f78887e3c07a977ab91ac1421940505a197758fb5939aa9524976d0a5bbcac34d07ed6faa75cedbb17206
+  checksum: 3828a0d5d72c800e369d447e54c7620742a4cc0c9baf1b5e8c17e9b6ff90d8d861a3a6dd4800f1953dbf80e5e5cec954a289e5b4a223e3bee4aeb1f8c5f33309
   languageName: node
   linkType: hard