{"componentChunkName":"component---gatsby-theme-spaceout-src-templates-article-template-tsx","path":"/domain-driven-design-in-typescript","result":{"pageContext":{"article":{"id":"9462c0d5-d35a-5b1d-b248-1d7c0c42b923","slug":"/domain-driven-design-in-typescript","secret":false,"title":"Domain-Driven Design in TypeScript","author":"Luke Celitan","date":"September 8th, 2025","dateForSEO":"2025-09-08T00:00:00.000Z","timeToRead":5,"excerpt":"A comprehensive deep-dive into Domain-Driven Design (DDD) with TypeScript, covering theory, practical implementation, advanced patterns, and real-world scenarios.","subscription":true,"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"Domain-Driven Design in TypeScript\",\n  \"excerpt\": \"A comprehensive deep-dive into Domain-Driven Design (DDD) with TypeScript, covering theory, practical implementation, advanced patterns, and real-world scenarios.\",\n  \"date\": \"2025-09-08T00:00:00.000Z\",\n  \"hero\": \"ddd.png\",\n  \"author\": \"Luke Celitan\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\", \"Nodejs\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"the-definitive-guide-to-domain-driven-design-in-typescript-patterns-examples-and-best-practices\"\n  }, \"The Definitive Guide to Domain-Driven Design in TypeScript: Patterns, Examples, and Best Practices\"), mdx(\"h2\", {\n    \"id\": \"1-introduction\"\n  }, \"1. Introduction\"), mdx(\"p\", null, \"Domain-Driven Design (DDD) is more than a set of patterns\\u2014it\\u2019s a philosophy and a collaborative approach to building complex software. In TypeScript, DDD can help you create robust, maintainable, and expressive systems that truly reflect your business\\u2019s core logic. In this guide, I\\u2019ll take you on a deep technical journey through DDD, showing not just the theory, but how to implement it in TypeScript, with real-world scenarios, advanced patterns, and practical advice from the trenches.\"), mdx(\"h2\", {\n    \"id\": \"2-what-is-domain-driven-design\"\n  }, \"2. What is Domain-Driven Design?\"), mdx(\"p\", null, \"At its heart, DDD is about focusing on the domain\\u2014the sphere of knowledge and activity around which your business revolves. DDD is a way of thinking, a set of priorities, and a collection of patterns and practices that help teams tackle complexity by modeling software after the real-world problems it\\u2019s meant to solve.\"), mdx(\"p\", null, \"Key tenets of DDD include:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Knowledge Crunching:\"), \" Iteratively refining the domain model in close collaboration with domain experts.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Ubiquitous Language:\"), \" Building a shared language that permeates code, tests, and conversations.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Model-Driven Design:\"), \" Ensuring the code and the domain model evolve together, avoiding the analysis/design divide.\")), mdx(\"p\", null, \"DDD is not just for large enterprises. Even in smaller TypeScript projects, the principles of DDD can help you avoid anemic models, clarify intent, and build systems that are easier to change and reason about.\"), mdx(\"h2\", {\n    \"id\": \"3-the-building-blocks-of-ddd\"\n  }, \"3. The Building Blocks of DDD\"), mdx(\"p\", null, \"Let\\u2019s start with the core building blocks. Each of these is both a conceptual tool and a practical pattern you\\u2019ll use in your TypeScript code.\"), mdx(\"h3\", {\n    \"id\": \"entities\"\n  }, \"Entities\"), mdx(\"p\", null, \"Entities are objects with a distinct identity that persists over time. Their identity matters more than their attributes.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Customer {\\n  constructor(\\n    public readonly id: string,\\n    public name: string,\\n    public email: string\\n  ) {}\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use immutable IDs (UUIDs, database-generated, etc.).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Equality is based on identity, not attributes.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Entities can change state, but their identity remains constant.\")), mdx(\"h3\", {\n    \"id\": \"value-objects\"\n  }, \"Value Objects\"), mdx(\"p\", null, \"Value Objects are defined only by their attributes. They are immutable and interchangeable if their values are equal.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Address {\\n  constructor(\\n    public readonly street: string,\\n    public readonly city: string,\\n    public readonly zip: string\\n  ) {}\\n\\n  equals(other: Address): boolean {\\n    return (\\n      this.street === other.street &&\\n      this.city === other.city &&\\n      this.zip === other.zip\\n    );\\n  }\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Make value objects immutable.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Implement equality checks.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use value objects to encapsulate concepts like Money, DateRange, or EmailAddress.\")), mdx(\"h3\", {\n    \"id\": \"aggregates\"\n  }, \"Aggregates\"), mdx(\"p\", null, \"Aggregates are clusters of associated objects (entities and value objects) treated as a unit for data changes. Each aggregate has a root entity (the Aggregate Root) that enforces invariants and controls access.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Order {\\n  private items: OrderItem[] = [];\\n\\n  constructor(public readonly id: string, public customer: Customer) {}\\n\\n  addItem(item: OrderItem) {\\n    this.items.push(item);\\n  }\\n\\n  get total(): number {\\n    return this.items.reduce((sum, item) => sum + item.price, 0);\\n  }\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Only allow external access through the aggregate root.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Enforce invariants at the aggregate level.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Keep aggregates small and focused.\")), mdx(\"h3\", {\n    \"id\": \"repositories\"\n  }, \"Repositories\"), mdx(\"p\", null, \"Repositories abstract away the details of data storage and retrieval for aggregates.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"interface OrderRepository {\\n  findById(id: string): Promise<Order | null>;\\n  save(order: Order): Promise<void>;\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Repositories work with aggregates, not entities or value objects directly.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Keep repository interfaces simple and intention-revealing.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use dependency injection for testability.\")), mdx(\"h3\", {\n    \"id\": \"services\"\n  }, \"Services\"), mdx(\"p\", null, \"Services encapsulate domain operations that don\\u2019t naturally fit on an entity or value object.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class PaymentService {\\n  processPayment(order: Order, paymentDetails: PaymentDetails): PaymentResult {\\n    // ...\\n  }\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use domain services for operations involving multiple aggregates or domain concepts.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Keep services stateless when possible.\")), mdx(\"h3\", {\n    \"id\": \"modules\"\n  }, \"Modules\"), mdx(\"p\", null, \"Modules group related concepts to reduce cognitive load and clarify boundaries. In TypeScript, use folders, namespaces, or ES modules.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"4-modeling-the-domain-in-typescript\"\n  }, \"4. Modeling the Domain in TypeScript\"), mdx(\"p\", null, \"TypeScript\\u2019s type system is a powerful ally for DDD. You can use interfaces, classes, and type guards to model the domain, enforce invariants, and prevent invalid states.\"), mdx(\"h3\", {\n    \"id\": \"example-shipping-domain\"\n  }, \"Example: Shipping Domain\"), mdx(\"p\", null, \"Let\\u2019s model a simplified shipping domain: Cargo, Voyage, Booking, and Location.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// Value Object\\nclass Location {\\n  constructor(\\n    public readonly code: string, // e.g., 'NYC', 'LON'\\n    public readonly name: string\\n  ) {}\\n}\\n\\n// Entity\\nclass Cargo {\\n  private bookings: Booking[] = [];\\n\\n  constructor(\\n    public readonly id: string,\\n    public origin: Location,\\n    public destination: Location\\n  ) {}\\n\\n  book(voyage: Voyage) {\\n    this.bookings.push(new Booking(this, voyage));\\n  }\\n}\\n\\n// Entity\\nclass Voyage {\\n  constructor(\\n    public readonly id: string,\\n    public readonly schedule: VoyageSchedule\\n  ) {}\\n}\\n\\n// Value Object\\nclass VoyageSchedule {\\n  constructor(\\n    public readonly departure: Location,\\n    public readonly arrival: Location,\\n    public readonly departureDate: Date,\\n    public readonly arrivalDate: Date\\n  ) {}\\n}\\n\\n// Aggregate Root\\nclass Booking {\\n  constructor(\\n    public readonly cargo: Cargo,\\n    public readonly voyage: Voyage\\n  ) {}\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"TypeScript Patterns for DDD:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"readonly\"), \" for immutability.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use interfaces for contracts (e.g., repositories, services).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use type guards to enforce invariants at runtime.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"5-ubiquitous-language-and-knowledge-crunching\"\n  }, \"5. Ubiquitous Language and Knowledge Crunching\"), mdx(\"p\", null, \"A Ubiquitous Language is a shared vocabulary that connects code, tests, and conversations. It\\u2019s the backbone of DDD. In TypeScript, this means naming classes, methods, and variables after domain concepts, and refactoring relentlessly to keep the language consistent.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// Instead of ambiguous names:\\nconst x = new Booking(y, z);\\n\\n// Use domain terms:\\nconst booking = new Booking(cargo, voyage);\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Knowledge Crunching:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Work closely with domain experts.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use code, diagrams, and conversations to refine the model.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Expect the model to evolve as you learn more.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"6-layered-architecture-in-typescript\"\n  }, \"6. Layered Architecture in TypeScript\"), mdx(\"p\", null, \"A layered architecture separates concerns and keeps the domain model isolated from infrastructure and UI. A typical structure:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"UI Layer:\"), \" Handles user interaction.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Application Layer:\"), \" Orchestrates use cases, coordinates aggregates.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Domain Layer:\"), \" Contains entities, value objects, aggregates, services.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Infrastructure Layer:\"), \" Handles persistence, messaging, external APIs.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example Folder Structure:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"src/\\n  domain/\\n    entities/\\n    value-objects/\\n    services/\\n    repositories/\\n  application/\\n    use-cases/\\n  infrastructure/\\n    orm/\\n    api/\\n  ui/\\n    web/\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Dependency Rule:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Domain layer depends on nothing.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Application depends on domain.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Infrastructure depends on domain and application.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"UI depends on application.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"7-aggregates-factories-and-repositories-advanced-implementation\"\n  }, \"7. Aggregates, Factories, and Repositories: Advanced Implementation\"), mdx(\"h3\", {\n    \"id\": \"aggregates-1\"\n  }, \"Aggregates\"), mdx(\"p\", null, \"Aggregates enforce invariants and transactional consistency. In TypeScript, you can use private fields and methods to encapsulate rules.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class BankAccount {\\n  private balance: number;\\n  private transactions: Transaction[] = [];\\n\\n  constructor(public readonly id: string, initialBalance: number) {\\n    this.balance = initialBalance;\\n  }\\n\\n  deposit(amount: number) {\\n    if (amount <= 0) throw new Error('Amount must be positive');\\n    this.balance += amount;\\n    this.transactions.push(new Transaction('deposit', amount));\\n  }\\n\\n  withdraw(amount: number) {\\n    if (amount <= 0) throw new Error('Amount must be positive');\\n    if (amount > this.balance) throw new Error('Insufficient funds');\\n    this.balance -= amount;\\n    this.transactions.push(new Transaction('withdraw', amount));\\n  }\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"factories\"\n  }, \"Factories\"), mdx(\"p\", null, \"Factories encapsulate complex creation logic, especially for aggregates.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class BankAccountFactory {\\n  static openAccount(id: string, initialBalance: number): BankAccount {\\n    if (initialBalance < 0) throw new Error('Initial balance must be non-negative');\\n    return new BankAccount(id, initialBalance);\\n  }\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"repositories-1\"\n  }, \"Repositories\"), mdx(\"p\", null, \"Repositories abstract persistence. In TypeScript, use interfaces and dependency injection.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"interface BankAccountRepository {\\n  findById(id: string): Promise<BankAccount | null>;\\n  save(account: BankAccount): Promise<void>;\\n}\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"8-strategic-design\"\n  }, \"8. Strategic Design\"), mdx(\"p\", null, \"Strategic design is about managing complexity at scale. It\\u2019s where DDD really shines in large systems.\"), mdx(\"h3\", {\n    \"id\": \"bounded-contexts\"\n  }, \"Bounded Contexts\"), mdx(\"p\", null, \"A Bounded Context is an explicit boundary within which a particular domain model applies. Different teams or subsystems may have different models for the same concept.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"In a shipping company, the term \\u201CCustomer\\u201D might mean a paying client in the booking context, but a recipient in the delivery context.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Make context boundaries explicit in code and documentation.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integrate contexts via translation layers, APIs, or events.\")), mdx(\"h3\", {\n    \"id\": \"context-maps\"\n  }, \"Context Maps\"), mdx(\"p\", null, \"A Context Map documents the relationships between bounded contexts: shared kernel, customer/supplier, conformist, anticorruption layer, etc.\"), mdx(\"h3\", {\n    \"id\": \"shared-kernel\"\n  }, \"Shared Kernel\"), mdx(\"p\", null, \"A shared subset of the model/codebase used by multiple contexts. Requires close collaboration.\"), mdx(\"h3\", {\n    \"id\": \"anticorruption-layer\"\n  }, \"Anticorruption Layer\"), mdx(\"p\", null, \"A translation layer that protects your model from external or legacy models.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"TypeScript Example:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// External API model\\ntype ExternalOrder = { order_id: string; total: number };\\n\\n// Internal model\\nclass Order {\\n  constructor(public readonly id: string, public readonly total: number) {}\\n}\\n\\n// Anticorruption Layer\\nfunction mapExternalOrder(external: ExternalOrder): Order {\\n  return new Order(external.order_id, external.total);\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"open-host-service--published-language\"\n  }, \"Open Host Service & Published Language\"), mdx(\"p\", null, \"Expose your model via a stable API or protocol, using a well-documented language (e.g., OpenAPI, GraphQL schema, or industry XML standard).\"), mdx(\"h3\", {\n    \"id\": \"distillation\"\n  }, \"Distillation\"), mdx(\"p\", null, \"Focus on the core domain, separate generic subdomains, and keep the model as simple as possible.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"9-supple-design-making-models-easy-to-use-and-change\"\n  }, \"9. Supple Design: Making Models Easy to Use and Change\"), mdx(\"p\", null, \"Supple design is about making your models expressive, intention-revealing, and easy to evolve.\"), mdx(\"h3\", {\n    \"id\": \"intention-revealing-interfaces\"\n  }, \"Intention-Revealing Interfaces\"), mdx(\"p\", null, \"Name methods and classes after domain concepts, not technical details.\"), mdx(\"h3\", {\n    \"id\": \"side-effect-free-functions\"\n  }, \"Side-Effect-Free Functions\"), mdx(\"p\", null, \"Prefer pure functions for calculations and queries.\"), mdx(\"h3\", {\n    \"id\": \"assertions-and-invariants\"\n  }, \"Assertions and Invariants\"), mdx(\"p\", null, \"Use TypeScript\\u2019s type system and runtime checks to enforce invariants.\"), mdx(\"h3\", {\n    \"id\": \"specification-pattern\"\n  }, \"Specification Pattern\"), mdx(\"p\", null, \"Encapsulate business rules as reusable, composable objects.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"interface Specification<T> {\\n  isSatisfiedBy(candidate: T): boolean;\\n}\\n\\nclass OverdraftAllowed implements Specification<BankAccount> {\\n  isSatisfiedBy(account: BankAccount): boolean {\\n    return account.balance >= 0;\\n  }\\n}\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"10-refactoring-toward-deeper-insight\"\n  }, \"10. Refactoring Toward Deeper Insight\"), mdx(\"p\", null, \"DDD is an iterative process. As you learn more, refactor your model to reflect deeper understanding.\"), mdx(\"h3\", {\n    \"id\": \"example-evolving-a-naive-model\"\n  }, \"Example: Evolving a Naive Model\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Before:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Invoice {\\n  constructor(public amount: number, public paid: boolean) {}\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"After:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Invoice {\\n  private payments: Payment[] = [];\\n  constructor(public readonly id: string, public readonly total: number) {}\\n\\n  addPayment(payment: Payment) {\\n    this.payments.push(payment);\\n  }\\n\\n  get paid(): boolean {\\n    return this.payments.reduce((sum, p) => sum + p.amount, 0) >= this.total;\\n  }\\n}\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"11-testing-and-evolving-your-domain-model\"\n  }, \"11. Testing and Evolving Your Domain Model\"), mdx(\"p\", null, \"Testing is essential for evolving your domain model safely.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example with Jest:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"test('BankAccount deposit increases balance', () => {\\n  const account = new BankAccount('id', 100);\\n  account.deposit(50);\\n  expect(account.balance).toBe(150);\\n});\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Test aggregates, value objects, and business rules.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use mocks for repositories and services.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"12-real-world-case-study-from-naive-model-to-deep-model\"\n  }, \"12. Real-World Case Study: From Naive Model to Deep Model\"), mdx(\"p\", null, \"Let\\u2019s walk through a shipping scenario, from a naive model to a deep, expressive domain model.\"), mdx(\"h3\", {\n    \"id\": \"step-1-naive-model\"\n  }, \"Step 1: Naive Model\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Shipment {\\n  constructor(\\n    public id: string,\\n    public origin: string,\\n    public destination: string,\\n    public status: string\\n  ) {}\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"step-2-introducing-value-objects-and-entities\"\n  }, \"Step 2: Introducing Value Objects and Entities\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Location {\\n  constructor(public readonly code: string, public readonly name: string) {}\\n}\\n\\nclass Shipment {\\n  private status: ShipmentStatus;\\n  constructor(\\n    public readonly id: string,\\n    public readonly origin: Location,\\n    public readonly destination: Location\\n  ) {\\n    this.status = ShipmentStatus.Pending;\\n  }\\n\\n  markInTransit() {\\n    if (this.status !== ShipmentStatus.Pending) throw new Error('Invalid state');\\n    this.status = ShipmentStatus.InTransit;\\n  }\\n}\\n\\nenum ShipmentStatus {\\n  Pending,\\n  InTransit,\\n  Delivered,\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"step-3-aggregates-and-invariants\"\n  }, \"Step 3: Aggregates and Invariants\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Shipment {\\n  private events: ShipmentEvent[] = [];\\n  // ...\\n  addEvent(event: ShipmentEvent) {\\n    // Enforce business rules here\\n    this.events.push(event);\\n  }\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"step-4-bounded-contexts-and-integration\"\n  }, \"Step 4: Bounded Contexts and Integration\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Booking, Tracking, and Billing contexts each have their own models for Shipment.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integrate via APIs or events, using anticorruption layers.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"13-best-practices-and-common-pitfalls\"\n  }, \"13. Best Practices and Common Pitfalls\"), mdx(\"h3\", {\n    \"id\": \"best-practices\"\n  }, \"Best Practices\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Collaborate closely with domain experts.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Build and maintain a ubiquitous language.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Keep aggregates small and focused.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use value objects liberally.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Isolate the domain model from infrastructure.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Test business rules thoroughly.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Refactor toward deeper insight.\")), mdx(\"h3\", {\n    \"id\": \"common-pitfalls\"\n  }, \"Common Pitfalls\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Anemic domain models (entities with only getters/setters).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Overly large aggregates.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Leaking infrastructure concerns into the domain.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Ignoring bounded contexts and integration challenges.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Failing to evolve the model as understanding grows.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"14-conclusion-and-further-resources\"\n  }, \"14. Conclusion and Further Resources\"), mdx(\"p\", null, \"Domain-Driven Design is a journey, not a destination. In TypeScript, DDD can help you build systems that are robust, expressive, and a joy to work with. By focusing on the domain, collaborating with experts, and relentlessly refining your model, you can tackle even the most complex business problems.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Further Reading:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Eric Evans, \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Domain-Driven Design: Tackling Complexity in the Heart of Software\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Vaughn Vernon, \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Implementing Domain-Driven Design\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Patterns of Enterprise Application Architecture (Martin Fowler)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Domain-Driven Design Community: \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://dddcommunity.org/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://dddcommunity.org/\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Awesome DDD: \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/heynickc/awesome-ddd\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://github.com/heynickc/awesome-ddd\"))), mdx(\"hr\", null), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"This guide is intended as a living reference. As the TypeScript ecosystem and DDD practices evolve, so too should your models and your approach. Happy modeling!\")));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS","Nodejs"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAFEklEQVQ4y02UeUwVVxTGhx00YkVZRCgosqnsIBQVZHnwAJ9oWR+LYBAsPkVaC2ixFAppC2hj49I/mhBwSVT+qGLUttHGpC5FoFgsoKylRcAFUHBrrP31zhiNk5zMzL1zvvN953x3JGtraxbYLSArawNhYWG86+BASEgIOp0Of39/tmzZwtd797Jv3z7KyspYsWIFanUMERERLFq0iN2lu8nJ2URIaCgazVokV1cXMtLTqa2pISgoCEtLS4KDgykvr8DDw4PZs2fj5OSE8+LF2NjYYGRsRF5eHqEhocTFxVFZWUVycgp+ovjy5cuRNBoNZbt3i6pqlixZguPChXh5eSpg1gLAx8cHXz8/AgICWLpsGTbz5yvM7O3tycjIRBWpIj8/XyjR4enpiRQtgDIzMlCpVAQKhlZWVpiZmREYGKQkbN68mZSUFKKiooS0HNLS0li5ciVW1laYmJoqLBMSEyn7tIyar6qRqior+bCwkFWrVjHHwkIwsCExMYmioiLiYuMUuXPmvIO5ublSTGYvg+bm5uIk2rBYhE63VchOpri4BKmhvp7q6mrs37VnxowZJCUlKUzmC2mSJL0JAwMD9PT1lWdTM1OFQEFBAfJQfX19CQ8PVwYmHdi/n9LSUkHfBD/RK7nBM2fOVBINDQ0VIANDA4yNjTEyMnoTevp6ilytNhVjE2OcnZ0VN0glJSUkCYmzZs1S+uXm5qaAyX2UAeVkmbkMqG+gr6zJDCU9CYu5FlRVVQl3vIedvZ1iMUn2nAwg097x0Q709PReydR7JVMGfA1mYmKi2EYOuaD8XXZ2Njt37lIYy8UkuWfyhnyvra3F29sbV1dXxY/yIGR2yodv9fPtkK22Z0+tYiM7OzukdfHxoroBmZmZDA8P8+TJUyYmJrn/4AF9ff00N1+n6cwZDh48RHlFhTKw16dEZuzg6EBdXR3OLi7Y2toiabVa0VQT5eh1dNzk0aMpxsbuMjU1zcuX//Hixb88f/4Pr69nz57zSOzdu3efzs4uTp9u4sTxE4qH5wlVooehih22bSugra2dvt5+2lp/47pgdv16K+3tN7h9q4fenj6mp58wPj7J6OhdwX6AkZExHj9+KgBPivO/Wki2Fz1MXs/cuebExKo4d+40DfXf8e2hbzh6pI4LF84rcfz4EcG+jZHRv7h06SfOnj3FxYs/0NJyjdbWa+z6pEjYxlH8WIR3M+LOEx14lDCfOvKSL5MQfgp10FFSo8+QHvsjBRtaKdV18/GmDorzOslaewGt+hwb1/1MYXYbW9Ob0axqJNDlACr/w+Ise3WzPf0OOWv/Jid+gKzYP8mOHeKDhCHxPkimuldED5vW9ZG7vk9Z00YMsCbgNiud/iDUpZPIpT2ovQaI8uhDWhPQyba0fvKTeinMHBSJvehS+0lX3SbOvwvN8m5i/boEQBfvr7jF+uBbxPp2EuPbRbSXuPt0E+XZicrjphJSqPsVksM72KgRCSFtJK3uQKu6gSawjTD3FiKWtRDt3Y7a53fx3Mpq91+VNTmivNoIX9pMpEeL2G8n0rNVDCUhCzMTS9RRyTg6eGJn605wUAxZmTqKdnxGSfHnlJfVUFG+R3nPzdlOWmoukeHxuLn4YTnPkTRtLpq4VK78cgOpqel7vviyisqqchoa6jjZeJzBwX4ejN9ncnJCeO4hQ0ODwnM3Gbs7ysOHE0xMjnNnZJirVy/T2HiCw4frOXbsMNOPp/gfjo9PExhws5AAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/6720283e0e150a9ffbed2b2e549d8728/a1946/ddd.png","srcSet":"/static/6720283e0e150a9ffbed2b2e549d8728/5b37e/ddd.png 236w,\n/static/6720283e0e150a9ffbed2b2e549d8728/49058/ddd.png 472w,\n/static/6720283e0e150a9ffbed2b2e549d8728/a1946/ddd.png 944w,\n/static/6720283e0e150a9ffbed2b2e549d8728/6050d/ddd.png 1200w","srcWebp":"/static/6720283e0e150a9ffbed2b2e549d8728/99fbb/ddd.webp","srcSetWebp":"/static/6720283e0e150a9ffbed2b2e549d8728/77392/ddd.webp 236w,\n/static/6720283e0e150a9ffbed2b2e549d8728/1f177/ddd.webp 472w,\n/static/6720283e0e150a9ffbed2b2e549d8728/99fbb/ddd.webp 944w,\n/static/6720283e0e150a9ffbed2b2e549d8728/9000d/ddd.webp 1200w","sizes":"(max-width: 944px) 100vw, 944px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2021c0%2012%200%2021%201%2020l2-1-1%202c-2%203-3%205-1%204v4l-1%203c0%203%204%208%204%206l2-1c1%201%200%204-4%205-2%201-3%205-1%207l1-1h2c-1-1%200-2%201-2%202-1%202-1%201%202l-2%202-1%201H2c-2-1-3%200-1%202v1c-2%200-1%208%202%2011l3%201%201-3%201%201v1l1-1h3c2-1%200-3-2-3v-1h2c2%201%201-2-2-4l-3-3%202-2%207-2v3l1%202c2-1%201%201-1%202v3c1%201%202%201%203-1%202-1%203%200%201%202v6c0%201%200%202-1%201l1%203c3%204%205%205%204%203v-4l-1-3-1-1c-1%201-1%201%200%200%200-3%203-1%205%203l3%203%203%201c2%202%202%202%203%201%201-2%201-2%203%200l3%201%202%202c2%203%202%206-2%208-2%200-3%202-3%203l-1%202-1-1h-1v-1l-1-1-3-1c-2-2-2-2-3%200l1%202%201%202v5l1%202c0%201%200%202%202%203l1%203-18-17C3%2092%200%2090%200%2092l1%204v1c-2-1-1%201%201%202h1c-1-2%201-3%204%200a316%20316%200%200126%2028h-2l-1-1h-2c-1-2-5-2-5-1%200%200%201%202%203%202l3%201%201-1v8l2%201%202%201c2%201%203%201%203-1h1l1-1v-1c2%200%202%202%200%203-1%201-2%202-1%204s1%202-2%202l-1%202c-1%202-6%2011-8%2011l-1%201-1%201c-2%201-2%201-1-1%201-3%201-4-1-2l-2%202v-3l-1%201c1-1-1-3-4-5-3-3-5-4-5-3H8l-1-2-2-1-1-1v-3H2l-1%201-1%204%201%205%201-4v-3l2%202%201%205%202%204%201%201%201%201h1v1h1v1l-1%202c-2%201-1%202%202%202h1v-5%201l1%201%202%202c0%205-7%204-12-2-3-4-4-2-4%208%200%209%200%209%202%202%200-7%202-5%202%203%200%204%200%205-2%205l-2%201c0%202%201%203%206%205%208%204%209%204%2010%209%201%203-1%208-4%208l1-2%202-3-2-1-3-1H8c0%202-1%202-4%200-3-1-3-1-3%201l-1%2010v8h8c1-1%201-1-1-1s-2%200-1-2c1-5%204-4%204%203%200%204%200%204-1%203H7l3%203c5%204%203%204-3%203-7-3-7-3-7%203%201%206%201%207%208%207%202%200%202%200%201-1l-1-1c2%200%203-2%201-3l-2%201c0%201-1%202-3%202s-2%200-2-3c1-3%204-3%2010-2h2v-2c1%201%202%203%202%208%200%209%200%209-7%207l-3-1h2c3-1%203-4%200-4H4c-4-1-4%202-3%2013%200%202%202%201%202%200l1-2%201-1%201-2c2%200%202%201%202%204%200%205-2%207-3%205%200-3-5-2-5%201l2%202%202%201h3l1%201c0%201%201%202%202%201l1%201c0%202-4%202-5%200l-3-1c-2%200-3%200-2%201v1c-2%201%200%203%203%203s4%200%203%202l1%202%201%202c0%201-1%202-3%201H4l2%201c2%201%202%201-2%201l-4-1v6l1%206h10l-2-1-3-1%207-1c9%201%2014%203%2013%205h-5l-5-2c-3%200-3%200-2%201%204%201%202%201-3%201s-5%200-4%201c1%202%201%202%202%201h4l9%201c5%201%205%201-6%201s-12%200-12-2l-3-2a578%20578%200%20002%2086h1l1%201h1v2h2c-1%203%200%205%201%203%201-1%201-1%201%201v4h2l2%201-1%201c-2-2-1%201%202%205l4%203%203%201c4%202%209%201%208-2l1-1h1c0-1%201-1%202%201s2%202%2011%201l12-1c4%201%204-1%200-6l-16-21%203-1%205%201%204%204%203%205%201%201%201%201-1%202-1%202%202-1h2l1%201v2c-2%201%200%203%202%203h2v1l-1%201%202%201c1-1%202%200%202%201%201%203%201%203%204%202s3-1%202%201v3c0%202%200%202%203%201l2-2v-1h2v-1c-1-1%200-2%202-1v-2h8l5-1h5l7-2%205-1%2015-2c2%200%202%200%201-1h5l7-1a998%20998%200%2001115-2v-1l1%201%203%201c3%200%203%200-1%201s3%201%2022%203h7a137%20137%200%200023%204l4%201%205%201h1l2%201%203%201v-1l-2-2h1l6%202h4l-3-2c-4-4-3-4%202-1%203%202%203%202%204%201l2-2c2%200%209-10%2012-16l1-1%202-2c-1-2%200-2%204%200l-1-2-2-2h5l5%201-5%209-10%2014c-1%202-1%202%204%202%203%200%205%201%207%203%203%202%206%203%205%201-1-1%200-1%201-1v-1l1-1%202-1h-1c-2%200-2-1-1-3l1-1%201-1h4c3%200%204%200%204-2%200-5%201-9%203-11l2-3%201-1v-1l2-1h2l8-1h1c2-1%202-1%202%203a829%20829%200%20000-81c0%203-2%204-3%202h-1l-2%201c-1%200-1-1%201-3l2-4%201-3%201%201v2c1-1%202-14%202-62%200-66%200-66-3-65-1%200-1-1%201-2%201-1%202-2%202-5%200-2%200-3-1-1%200%203-8%208-10%207-1-1-2-1-4%201-3%202-5%203-3%201v-2l-2%201h-2l1-3c2-1%202-1%200-3-1-3-3-4-2-2v3l-2-2%201-2%201-1-1-1h-1v-1l-6-1%201-1c1%201%203%200%204-3%203-3%206-4%206-2l-1%201-1%201c1%202%202%202%205%200%202-1%202-2%201-2l1-3c4-4%203-5-1-1-3%202-3%202-4%201-1-2%206-8%208-7l2%201c3%200%204%201%201%201-1%200-2%200-1%201h4c0-1%201-2%203-2l4-2h-5c-4%201-5%201-2-2v-2l-1%201-2%201%202-3c3-3%205-3%203-1-1%202%200%202%202%201v-2l1-2c1%201%201%200%201-3l-1-8c0-4%200-4-2-3h-5l-2-2v-1l-2-2c-1-3%200-3%206-9s6-7%206-11l-1-4h-1l-2-2v-2l2%201c1%202%202%201%202-3l-2-5c-2-1-2-2-1-2l2%201%201-14c0-11%200-15-1-14l-2%202h-1c-2%202-5-2-5-6-1-2%202-6%203-5l1-1v-1l1-1-1-1c-1%200-2-3-1-4h3l1%201-1%203v2c1%200%202%201%202%205l1-10V0h-17l-3%204-3%204-4%204c-2%203-5%204-3%202l-1-1-1-1c-1-2%200-4%201-3l1-1c-1-1%200-3%201-5l2-3h-5c-4%200-6%200-7%202v3h1l-1%202-1-1h-1l-1%201-2%207h-2v-1h-2v-2l-2-1h-4l-2-3-2-1-1%201V5l-1-1-4-1-6-3h-2l3%203a413%20413%200%200010%2011v4h1v-2h1l3%201c2%202%202%203-2%209-2%203-2%204-1%204v3h-2l-1-1c-1%201-5-4-4-6%200-2%200-2-1-1%200%202-3%201-3%200v-2l2-3c3-4%204-10%200-11-1-1-2%200-3%203-1%202-2%203-3%202l-1%201%201%203c2%200%202%201%201%202-1%202-2%202-3%200l-1-2-1-1c-1%201-2%200-3-1s-1-1%202-1c2%200%202%200%201-1l-2-4-1-2-1%203c-2%203-3%204-2%201V9l2-1c1%200%203-4%202-5l1-2c1-1-2-1-14-1h-15l1%203c0%202%200%202-2%201-1-2-2-2-2-1-1%201-1%201-2-1%200-2%200-2-20-2-15%200-19%200-18%201v2c0%201-3-1-2-2l-2-1v2c1%201%200%201-5%201l-7%201h-2l-2-1V2l1-2-3%202-2%203V2c1-3-1-2-2%201l-3%202a325%20325%200%2000-44-2h-1c-1%202-3%200-2-2l-1-1-1%202-12%201-12-1c1-2-1-2-14-2h-15l1%203c1%202%201%204-1%202l-1-2c1-1-3-3-4-2l1%201v1l1%201h-1l-2%201v1l-1-2-2-2%201-1c1-1-6-1-15-1L81%201h-1L68%200H58l1%202c1%202%202%203%203%202h1c1%201%200%201-1%201l-1%201%201%201%201%201v4l-1-1c-3-3-3-2%201%205%203%207%204%2010%202%209l-1%202c1%201%200%202-1%203-2%202-3%200-3-4l-1-5c-2-2-2-3-1-6v-3l-1-1-2-3c-2-1-2-1-3%201-1%203-2%204-4%204s-2%201-1%203c1%201%200%202-1%203-2%201-2%202-1%202v1c-1%202-3%201-5-2v-5l1-1c-1-1-1-1%200%200l1-1c-1-1-1-1%200%200l1-1v-1c1%201%206-3%208-5l1-1h2c1-2%202-2%203%201%203%204%204%203%202-2-2-4-4-5-6-3h-1c1-1-2-1-12-1-8%200-13%200-12%201l-1%201c-1%200-2%200-1-1L13%200H0v21M186%207l3%201%205%201c1%201%200%201-3%201h-6l-1-2c-1-2-2-2-7-2l-6%201h-2c-2%200-1%207%200%208%202%201%2068%200%2070-1l1-4%201-4h-17c-2-1-3%200-3%201h-1c0-3-34-3-34%200m-59%201l-2%201c-1%202%200%206%201%206l1%201%201%201c2%201%203%201%202-1%200-2%200-3%203-2%204%200%207-3%206-5%200-2-8-3-12-1m-7%207l2%205c1%207%201%207-1%207l-1-2c1-2-2-4-4-4v2l1%202v3l2%201v1c-2%200-1%202%201%202l1%201v1l1-1%201%201%203%203h3l-3%202-2%203h2l5-3c3-2%203-3%202-3l-2-2c0-3-2-3-2%200-1%203-1%203-4-9-3-8-5-13-5-10m22%202l-1%201c-3-1-9%201-8%203%200%202%200%202-1%201v7l3%205h3c4-1%205%200%202%202l-1%202c1%202%207-3%207-6l-4-16v1M33%2022l-3%206-2%201c-3-1-3%200-2%202h2c0-2%201-1%203%202%202%205%204%209%202%208s-1%200%201%203c1%201%201%201%201-1-1-2-1-2%203%202l4%204%202-2c2-2%202-2%201-3l-1-2%203%202c4%205%202%201-3-7-4-7-9-12-8-7%201%201%201%201-1%201l-3-1-1-1%201-1c1%201%204-3%204-5s2-1%204%202c2%205%208%2014%209%2014L37%2020c-2-2-2-2-4%202m282-1c0%202%200%202-1%201l-1-1v2l1%201c-1%202%200%205%201%204l1%203%204%204c4%203%204%203%206%201l2-7c-2-2%201-1%202%201%202%202%202%202%201%203-1%200-2%201-2%203l-3%203c-2%203%204%2010%207%207h2l1-1v-1c1%202%202%201%202-2v-1h1v-3c1-1%201-2-4-6a47%2047%200%2000-12-10l-7-4-1%203M51%2021l-4%203-1%201h-1c-1%201%200%203%201%205%202%205%204%204%208-1%203-3%204-6%202-5h-1v-2c2%200%201-3%200-3l-4%202m307%205c-4%207-4%208-3%208l1%202h-1c-2-2-2-2-7%206a3775%203775%200%2001-21%2037l3%202h2l1%201c1%201%201%201%204-2s4-5%203-6l1-2v-3c0-2%200-2%201-1%200%201%201%201%202-1l1-3%201-2%201-2-1-1c1-3%200-3-2-1-1%202-3%202-2-1h1v-2h2c0-1%201-1%202%201l3%203c-2%205%205-5%208-11%200-2%201-3%202-3l1-2h1l1-1c-1-1-1-1%200%200l1-1v-1c1%201%201%201%200%200l1-2%202%201%202%201%201-1v-2h-4l1-2c1-1-2-2-4-2v-2l-1-1v-1l-1-1h-1l3-1%202-1-1-1c-1%200-2-1-1-2%200-4-1-4-5%203m-53%2012v4l-2%203-1%203c0%201%200%202%201%201h1l3-2v1c0%202%202%205%203%204l1%201v1l3-4c1-3%202-4%203-3l2-1c2-2%201-4-2-3l-4-3-4-3h-3l-1-1v2M16%2041v1h-1l-3%205%203%205c2%202%203%205%202%206h1l3%202c6%207%208%209%2010%207l1-2%201-1c1%201%201%200%201-1v-4c1-3%200-5-1-5h-1l1-1-1-1v-1h-1c-1%202-4-2-2-4l-1-1-4-1h-1v-2h-2c-2-2-5-3-5-2m352%2015c-5%208-6%208-4%208%202-1%202%200%200%202-1%202-1%202%203%207a149%20149%200%200018%2016c0%202%203%200%208-4l4-6v-1l1-2c0-2-1-3-2-3v-1l-1-1h-1c0-1%200-2-1-1l-1-1h-1l-1-1-1-2-2-1c1-1-5-8-9-10-2-2-3-2-5%200l-2%201%202-2v-3l-5%205m-172%204c-24%201-42%207-65%2019-15%207-44%2033-41%2035v1h-1l-1%201c-1-1-1-1%200%200l-1%201v1h-1c-1-1-1-1-2%201v3h-1v1h-2v2l-1%201-3%203c-3%204-4%206-2%205v2h-1c0-3-2-1-8%2011-12%2023-18%2061-15%2089v9s2%204%202%209l7%2020%205%2012h4c4%200%204-1%202-5v-1c1-1%202%201%203%202%202%204%207%206%206%202l1-2%201%203%203%201h3l-2-4-2-4c2%201%207%201%206-1l1-1%201-2h1v1l1%201%202-2c1-2%200-2-4-2l-4-1c1-1-3-3-8-4l-2-2c0-1%203-1%206%201l3%201%204%201h2l2%201h-2c-2%200-2%200-1%201l10%201%202-1%201%201c0%202%204%204%207%203%202%200%202%200%200-2l-2-1-1-1%201-2%208%201-1%201h-2%204c6%200%206%200%204-1v-1l2-1%201-1c2%201%202%204%200%204v2l1%202-2-1h-2l1%201h-2c-4%200-8%201-7%202l3%201c2%200%202%200%201%201s0%202%206%203l3%201-3-2c-3-4-1-4%203-1%203%203%209%205%208%203-2-3%209-2%2011%201%201%202%204%203%206%201%201-1%201-1-2-2-4-2-4-3%201-3a515%20515%200%200019%201l3%203-1%201-9-1c-4-2-7-3-8-1-1%201-1%201%201%202%202%200%202%200%201%201a618%20618%200%200092-2c-4-2-4-3%200-3l6%203c3%203%205%204%204%202s7-2%2010%200h19v-1h5l-1%201%2017%201%2018-1h1c0%203%206%201%207-2l3-7v-2l1-2%201-1%201-1%201-3v-2l1-1v-2l1-3v-3l2-2c2-1%201%206-5%2020l-5%2012h4c3%200%204%200%207-8a146%20146%200%200011-77c-1-18-15-60-20-59l-1-2-3-7c-4-7-9-13-9-11v2l-2-2c0-2-3-4-4-3l2%203c2%203%202%205-1%203v2c1%201%202%200%204-1%202-2%203-2%203%200l-1%201c-1%200-1%201%201%203a125%20125%200%200117%2036c1-1%202%202%203%208l1%206c3%204%203%209%203%2015l1%203v19c1%206%201%207-1%207-4-1-7%202-5%208l1-1%201-3%201-2c1%200%202%201%202%203l-1%202-1%202v1c-1-1-2%200-2%201l-2%201-1-6c0-7%202-10%204-9%201%201%201%200%201-3l1-5-1-5v-4l-1-6-1-5-1-3v-4l-2-5-1-5-1-4c0-6-15-32-25-44-3-4-4-5-3-6h3c2%202%201-1-2-3-1-2-2-2-2-1%201%201-2%202-4%201h-1v-1h-1l-1-1c1-1-15-16-17-15l-1-2-3-1v-1l-1-1h-1l-1-1c-1%201-6-2-5-3l-1-1h-2l-1-1v-1c-2%201-14-5-13-6h-2l-2-1v-1h-1l-1%201v-1l-1-2v1h-5v-2h-6c-3%200-3%200-1-1s2-1-1-1h-5v-1l-3-1h-3l-2-1h-5l-5%201h-3l7%201c8%201%2031%207%2038%2010%2030%2013%2069%2051%2071%2070v4l-2-5c-2-2-3-5-2-6h-1c-1%201-1%201-1-1v-1l-2-1h1l1-1-2-1-4-4c-4-6-6-8-5-5v2l4%2010c7%2011%2012%2021%2015%2032%205%2015%208%2048%205%2048l-2-1h-1l-15-2a2484%202484%200%2000-250-29%20184%20184%200%200117-49l-5%209-5%207-2%203-3%203c0-3%206-16%2011-24%204-6%206-11%203-9l-1%201v3h-2v2c0%202%200%202-1%201s-3%200-2%202v3c-1%202-1%202-2%201-2-3-9%2012-7%2015%200%202%200%202-1%201l-1%201a73%2073%200%2001-7%2023l-1%202c-2%204-3%2031-1%2031l2-4c1-2%201-2%201%201l-1%204-1%201%201%201%201%204%202%205v3c-5-2-5%203-1%2018a213%20213%200%20015%2017v2l1%203%202%202-3-1a97%2097%200%2001-11-39v-3c-3%205-4-27-1-45%204-18%2013-41%2022-55%208-12%2012-16%2014-15%202%200%202%200%202-2-1-2%200-4%207-10%207-7%2010-8%208-6l1%201%201-2c0-1%207-9%209-9%203-1%205-2%204-3h1l1-1h1v-1h1c2%200%202%200%201-1v-1h3l1-1h1v-1h1c2%200%202%200%201-1v-1h1l1-1%201%201v-1l2-1h1c-1-1%200-1%200%200l2-1h1l3-1%203-1c2%200%2010-3%209-4v-1l10-2c17-5%2035-6%2050-4a369%20369%200%200025%205%20142%20142%200%200160%2036c9%209%2013%2012%2012%209-1-1%202-1%203%201h2c0-2-21-22-23-21v-1c1-1-3-4-4-3l-1-1-1-1-1-1h-2v-2h-2l-1-1v-1h-1l-1-2v1l-1%201-1-2v-2h-4c-2%200-2%200-1-1%202-1%200-2-2-1-2%200-5-1-3-2a166%20166%200%2000-78-16M39%2067l-1%201-2%201h-2l-3%201c-2%201-2%201%201%204l4%203c2%200%202%200%201%201l-4%201c-1-1-2%201%200%201%201%201%2015-3%2015-4%200-2-9-11-9-9m143%207l1%201-3%201h-7v2h-2l-4%201-3%201-1%201-1-1-8%201c-7%203-10%205-7%205v1c-2%201-3%201-2-1h-1c-2%200-2%201-1%202v1c-1%200-2%200-1-1%201-3-15%206-21%2011l-4%203-1%201v1l-3%201-2%203c2%201-4%205-6%204l-1%201h1l-2%203c-4%205-4%206%201%202%2021-20%2050-35%2078-40%2012-3%2012-3%207-3l-6-1h-1m169%2017l-2%203%203%204c2%203%204%205%203%206h2l1%202c2%201%205-2%204-5l1-1h1l2%201c1%200%201-1-2-3l-3-2c-1%202-2%200-2-2l2-1c2%202%201-1-2-3h-4c-1-1-2%200-4%201M0%20120l2%203v3l-2%206c0%203%200%204%201%203h3v-1c-2-1-2-2-1-4%201-1%202-2%201-3v-1l2%202%204%203c2%201%203%201%202%202s-1%201%201%202h1l2-1c6%202%206%202%202-1l-5-4c0-2-4-5-5-5l-4-2c-3-3-4-4-4-2m183%20141l-1%201c-1-1-2%200-2%201l1%201%203%201h-3l-2%201%206-1h3v2c-1%201-1%201%201%201v1c-1%201-1%201%202%201l3-1h2c4%200%208-3%204-4l-2-1h-5c-3-1-3-1-1-1%204%200%203-1%200-2l-3%201h-3c-2-2-3-2-3-1M20%20312l1%207h4c12-1%2012-15%200-15h-5v8m91%200v7h5c5%200%208-3%208-7%200-5-3-8-8-8h-5v8m77%200v7h5c6%200%208-2%208-7s-3-8-8-8h-5v8m-150-3c-4%204-1%2011%203%2011%203%200%206-4%206-6%200-6-6-9-9-5m198%200c-2%202-2%207-1%209l5%201c2-1%202%200%202%201l-4%201c-3%200-4%202%200%203%205%201%206-2%206-9v-7l-4-1-4%202M42%20333c-1%202%201%2014%202%2015l1-2c0-3%200-3%202-2%205%201%208-8%204-11-2-2-8-2-9%200m67-1l1%2016%201-3c0-3%200-3%201-2%204%204%2010-4%207-10-2-1-8-2-10-1m42%2029a177%20177%200%2000107%200c3-2-27%203-34%206-2%200-2%200-2-2s1-2%206-3a800%20800%200%2001-19%201l10%201%201%202c1%201-4%201-13%201-11%200-14-1-15-2h-2c-1%201-21-2-22-4l-9-1-8%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAFEklEQVQ4y02UeUwVVxTGhx00YkVZRCgosqnsIBQVZHnwAJ9oWR+LYBAsPkVaC2ixFAppC2hj49I/mhBwSVT+qGLUttHGpC5FoFgsoKylRcAFUHBrrP31zhiNk5zMzL1zvvN953x3JGtraxbYLSArawNhYWG86+BASEgIOp0Of39/tmzZwtd797Jv3z7KyspYsWIFanUMERERLFq0iN2lu8nJ2URIaCgazVokV1cXMtLTqa2pISgoCEtLS4KDgykvr8DDw4PZs2fj5OSE8+LF2NjYYGRsRF5eHqEhocTFxVFZWUVycgp+ovjy5cuRNBoNZbt3i6pqlixZguPChXh5eSpg1gLAx8cHXz8/AgICWLpsGTbz5yvM7O3tycjIRBWpIj8/XyjR4enpiRQtgDIzMlCpVAQKhlZWVpiZmREYGKQkbN68mZSUFKKiooS0HNLS0li5ciVW1laYmJoqLBMSEyn7tIyar6qRqior+bCwkFWrVjHHwkIwsCExMYmioiLiYuMUuXPmvIO5ublSTGYvg+bm5uIk2rBYhE63VchOpri4BKmhvp7q6mrs37VnxowZJCUlKUzmC2mSJL0JAwMD9PT1lWdTM1OFQEFBAfJQfX19CQ8PVwYmHdi/n9LSUkHfBD/RK7nBM2fOVBINDQ0VIANDA4yNjTEyMnoTevp6ilytNhVjE2OcnZ0VN0glJSUkCYmzZs1S+uXm5qaAyX2UAeVkmbkMqG+gr6zJDCU9CYu5FlRVVQl3vIedvZ1iMUn2nAwg097x0Q709PReydR7JVMGfA1mYmKi2EYOuaD8XXZ2Njt37lIYy8UkuWfyhnyvra3F29sbV1dXxY/yIGR2yodv9fPtkK22Z0+tYiM7OzukdfHxoroBmZmZDA8P8+TJUyYmJrn/4AF9ff00N1+n6cwZDh48RHlFhTKw16dEZuzg6EBdXR3OLi7Y2toiabVa0VQT5eh1dNzk0aMpxsbuMjU1zcuX//Hixb88f/4Pr69nz57zSOzdu3efzs4uTp9u4sTxE4qH5wlVooehih22bSugra2dvt5+2lp/47pgdv16K+3tN7h9q4fenj6mp58wPj7J6OhdwX6AkZExHj9+KgBPivO/Wki2Fz1MXs/cuebExKo4d+40DfXf8e2hbzh6pI4LF84rcfz4EcG+jZHRv7h06SfOnj3FxYs/0NJyjdbWa+z6pEjYxlH8WIR3M+LOEx14lDCfOvKSL5MQfgp10FFSo8+QHvsjBRtaKdV18/GmDorzOslaewGt+hwb1/1MYXYbW9Ob0axqJNDlACr/w+Ise3WzPf0OOWv/Jid+gKzYP8mOHeKDhCHxPkimuldED5vW9ZG7vk9Z00YMsCbgNiud/iDUpZPIpT2ovQaI8uhDWhPQyba0fvKTeinMHBSJvehS+0lX3SbOvwvN8m5i/boEQBfvr7jF+uBbxPp2EuPbRbSXuPt0E+XZicrjphJSqPsVksM72KgRCSFtJK3uQKu6gSawjTD3FiKWtRDt3Y7a53fx3Mpq91+VNTmivNoIX9pMpEeL2G8n0rNVDCUhCzMTS9RRyTg6eGJn605wUAxZmTqKdnxGSfHnlJfVUFG+R3nPzdlOWmoukeHxuLn4YTnPkTRtLpq4VK78cgOpqel7vviyisqqchoa6jjZeJzBwX4ejN9ncnJCeO4hQ0ODwnM3Gbs7ysOHE0xMjnNnZJirVy/T2HiCw4frOXbsMNOPp/gfjo9PExhws5AAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/6720283e0e150a9ffbed2b2e549d8728/3ddd4/ddd.png","srcSet":"/static/6720283e0e150a9ffbed2b2e549d8728/078a8/ddd.png 163w,\n/static/6720283e0e150a9ffbed2b2e549d8728/e56da/ddd.png 327w,\n/static/6720283e0e150a9ffbed2b2e549d8728/3ddd4/ddd.png 653w,\n/static/6720283e0e150a9ffbed2b2e549d8728/c5cc7/ddd.png 980w,\n/static/6720283e0e150a9ffbed2b2e549d8728/6050d/ddd.png 1200w","srcWebp":"/static/6720283e0e150a9ffbed2b2e549d8728/0acdf/ddd.webp","srcSetWebp":"/static/6720283e0e150a9ffbed2b2e549d8728/ac59e/ddd.webp 163w,\n/static/6720283e0e150a9ffbed2b2e549d8728/7660b/ddd.webp 327w,\n/static/6720283e0e150a9ffbed2b2e549d8728/0acdf/ddd.webp 653w,\n/static/6720283e0e150a9ffbed2b2e549d8728/75470/ddd.webp 980w,\n/static/6720283e0e150a9ffbed2b2e549d8728/9000d/ddd.webp 1200w","sizes":"(max-width: 653px) 100vw, 653px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2021c0%2012%200%2021%201%2020l2-1-1%202c-2%203-3%205-1%204v4l-1%203c0%203%204%208%204%206l2-1c1%201%200%204-4%205-2%201-3%205-1%207l1-1h2c-1-1%200-2%201-2%202-1%202-1%201%202l-2%202-1%201H2c-2-1-3%200-1%202v1c-2%200-1%208%202%2011l3%201%201-3%201%201v1l1-1h3c2-1%200-3-2-3v-1h2c2%201%201-2-2-4l-3-3%202-2%207-2v3l1%202c2-1%201%201-1%202v3c1%201%202%201%203-1%202-1%203%200%201%202v6c0%201%200%202-1%201l1%203c3%204%205%205%204%203v-4l-1-3-1-1c-1%201-1%201%200%200%200-3%203-1%205%203l3%203%203%201c2%202%202%202%203%201%201-2%201-2%203%200l3%201%202%202c2%203%202%206-2%208-2%200-3%202-3%203l-1%202-1-1h-1v-1l-1-1-3-1c-2-2-2-2-3%200l1%202%201%202v5l1%202c0%201%200%202%202%203l1%203-18-17C3%2092%200%2090%200%2092l1%204v1c-2-1-1%201%201%202h1c-1-2%201-3%204%200a316%20316%200%200126%2028h-2l-1-1h-2c-1-2-5-2-5-1%200%200%201%202%203%202l3%201%201-1v8l2%201%202%201c2%201%203%201%203-1h1l1-1v-1c2%200%202%202%200%203-1%201-2%202-1%204s1%202-2%202l-1%202c-1%202-6%2011-8%2011l-1%201-1%201c-2%201-2%201-1-1%201-3%201-4-1-2l-2%202v-3l-1%201c1-1-1-3-4-5-3-3-5-4-5-3H8l-1-2-2-1-1-1v-3H2l-1%201-1%204%201%205%201-4v-3l2%202%201%205%202%204%201%201%201%201h1v1h1v1l-1%202c-2%201-1%202%202%202h1v-5%201l1%201%202%202c0%205-7%204-12-2-3-4-4-2-4%208%200%209%200%209%202%202%200-7%202-5%202%203%200%204%200%205-2%205l-2%201c0%202%201%203%206%205%208%204%209%204%2010%209%201%203-1%208-4%208l1-2%202-3-2-1-3-1H8c0%202-1%202-4%200-3-1-3-1-3%201l-1%2010v8h8c1-1%201-1-1-1s-2%200-1-2c1-5%204-4%204%203%200%204%200%204-1%203H7l3%203c5%204%203%204-3%203-7-3-7-3-7%203%201%206%201%207%208%207%202%200%202%200%201-1l-1-1c2%200%203-2%201-3l-2%201c0%201-1%202-3%202s-2%200-2-3c1-3%204-3%2010-2h2v-2c1%201%202%203%202%208%200%209%200%209-7%207l-3-1h2c3-1%203-4%200-4H4c-4-1-4%202-3%2013%200%202%202%201%202%200l1-2%201-1%201-2c2%200%202%201%202%204%200%205-2%207-3%205%200-3-5-2-5%201l2%202%202%201h3l1%201c0%201%201%202%202%201l1%201c0%202-4%202-5%200l-3-1c-2%200-3%200-2%201v1c-2%201%200%203%203%203s4%200%203%202l1%202%201%202c0%201-1%202-3%201H4l2%201c2%201%202%201-2%201l-4-1v6l1%206h10l-2-1-3-1%207-1c9%201%2014%203%2013%205h-5l-5-2c-3%200-3%200-2%201%204%201%202%201-3%201s-5%200-4%201c1%202%201%202%202%201h4l9%201c5%201%205%201-6%201s-12%200-12-2l-3-2a578%20578%200%20002%2086h1l1%201h1v2h2c-1%203%200%205%201%203%201-1%201-1%201%201v4h2l2%201-1%201c-2-2-1%201%202%205l4%203%203%201c4%202%209%201%208-2l1-1h1c0-1%201-1%202%201s2%202%2011%201l12-1c4%201%204-1%200-6l-16-21%203-1%205%201%204%204%203%205%201%201%201%201-1%202-1%202%202-1h2l1%201v2c-2%201%200%203%202%203h2v1l-1%201%202%201c1-1%202%200%202%201%201%203%201%203%204%202s3-1%202%201v3c0%202%200%202%203%201l2-2v-1h2v-1c-1-1%200-2%202-1v-2h8l5-1h5l7-2%205-1%2015-2c2%200%202%200%201-1h5l7-1a998%20998%200%2001115-2v-1l1%201%203%201c3%200%203%200-1%201s3%201%2022%203h7a137%20137%200%200023%204l4%201%205%201h1l2%201%203%201v-1l-2-2h1l6%202h4l-3-2c-4-4-3-4%202-1%203%202%203%202%204%201l2-2c2%200%209-10%2012-16l1-1%202-2c-1-2%200-2%204%200l-1-2-2-2h5l5%201-5%209-10%2014c-1%202-1%202%204%202%203%200%205%201%207%203%203%202%206%203%205%201-1-1%200-1%201-1v-1l1-1%202-1h-1c-2%200-2-1-1-3l1-1%201-1h4c3%200%204%200%204-2%200-5%201-9%203-11l2-3%201-1v-1l2-1h2l8-1h1c2-1%202-1%202%203a829%20829%200%20000-81c0%203-2%204-3%202h-1l-2%201c-1%200-1-1%201-3l2-4%201-3%201%201v2c1-1%202-14%202-62%200-66%200-66-3-65-1%200-1-1%201-2%201-1%202-2%202-5%200-2%200-3-1-1%200%203-8%208-10%207-1-1-2-1-4%201-3%202-5%203-3%201v-2l-2%201h-2l1-3c2-1%202-1%200-3-1-3-3-4-2-2v3l-2-2%201-2%201-1-1-1h-1v-1l-6-1%201-1c1%201%203%200%204-3%203-3%206-4%206-2l-1%201-1%201c1%202%202%202%205%200%202-1%202-2%201-2l1-3c4-4%203-5-1-1-3%202-3%202-4%201-1-2%206-8%208-7l2%201c3%200%204%201%201%201-1%200-2%200-1%201h4c0-1%201-2%203-2l4-2h-5c-4%201-5%201-2-2v-2l-1%201-2%201%202-3c3-3%205-3%203-1-1%202%200%202%202%201v-2l1-2c1%201%201%200%201-3l-1-8c0-4%200-4-2-3h-5l-2-2v-1l-2-2c-1-3%200-3%206-9s6-7%206-11l-1-4h-1l-2-2v-2l2%201c1%202%202%201%202-3l-2-5c-2-1-2-2-1-2l2%201%201-14c0-11%200-15-1-14l-2%202h-1c-2%202-5-2-5-6-1-2%202-6%203-5l1-1v-1l1-1-1-1c-1%200-2-3-1-4h3l1%201-1%203v2c1%200%202%201%202%205l1-10V0h-17l-3%204-3%204-4%204c-2%203-5%204-3%202l-1-1-1-1c-1-2%200-4%201-3l1-1c-1-1%200-3%201-5l2-3h-5c-4%200-6%200-7%202v3h1l-1%202-1-1h-1l-1%201-2%207h-2v-1h-2v-2l-2-1h-4l-2-3-2-1-1%201V5l-1-1-4-1-6-3h-2l3%203a413%20413%200%200010%2011v4h1v-2h1l3%201c2%202%202%203-2%209-2%203-2%204-1%204v3h-2l-1-1c-1%201-5-4-4-6%200-2%200-2-1-1%200%202-3%201-3%200v-2l2-3c3-4%204-10%200-11-1-1-2%200-3%203-1%202-2%203-3%202l-1%201%201%203c2%200%202%201%201%202-1%202-2%202-3%200l-1-2-1-1c-1%201-2%200-3-1s-1-1%202-1c2%200%202%200%201-1l-2-4-1-2-1%203c-2%203-3%204-2%201V9l2-1c1%200%203-4%202-5l1-2c1-1-2-1-14-1h-15l1%203c0%202%200%202-2%201-1-2-2-2-2-1-1%201-1%201-2-1%200-2%200-2-20-2-15%200-19%200-18%201v2c0%201-3-1-2-2l-2-1v2c1%201%200%201-5%201l-7%201h-2l-2-1V2l1-2-3%202-2%203V2c1-3-1-2-2%201l-3%202a325%20325%200%2000-44-2h-1c-1%202-3%200-2-2l-1-1-1%202-12%201-12-1c1-2-1-2-14-2h-15l1%203c1%202%201%204-1%202l-1-2c1-1-3-3-4-2l1%201v1l1%201h-1l-2%201v1l-1-2-2-2%201-1c1-1-6-1-15-1L81%201h-1L68%200H58l1%202c1%202%202%203%203%202h1c1%201%200%201-1%201l-1%201%201%201%201%201v4l-1-1c-3-3-3-2%201%205%203%207%204%2010%202%209l-1%202c1%201%200%202-1%203-2%202-3%200-3-4l-1-5c-2-2-2-3-1-6v-3l-1-1-2-3c-2-1-2-1-3%201-1%203-2%204-4%204s-2%201-1%203c1%201%200%202-1%203-2%201-2%202-1%202v1c-1%202-3%201-5-2v-5l1-1c-1-1-1-1%200%200l1-1c-1-1-1-1%200%200l1-1v-1c1%201%206-3%208-5l1-1h2c1-2%202-2%203%201%203%204%204%203%202-2-2-4-4-5-6-3h-1c1-1-2-1-12-1-8%200-13%200-12%201l-1%201c-1%200-2%200-1-1L13%200H0v21M186%207l3%201%205%201c1%201%200%201-3%201h-6l-1-2c-1-2-2-2-7-2l-6%201h-2c-2%200-1%207%200%208%202%201%2068%200%2070-1l1-4%201-4h-17c-2-1-3%200-3%201h-1c0-3-34-3-34%200m-59%201l-2%201c-1%202%200%206%201%206l1%201%201%201c2%201%203%201%202-1%200-2%200-3%203-2%204%200%207-3%206-5%200-2-8-3-12-1m-7%207l2%205c1%207%201%207-1%207l-1-2c1-2-2-4-4-4v2l1%202v3l2%201v1c-2%200-1%202%201%202l1%201v1l1-1%201%201%203%203h3l-3%202-2%203h2l5-3c3-2%203-3%202-3l-2-2c0-3-2-3-2%200-1%203-1%203-4-9-3-8-5-13-5-10m22%202l-1%201c-3-1-9%201-8%203%200%202%200%202-1%201v7l3%205h3c4-1%205%200%202%202l-1%202c1%202%207-3%207-6l-4-16v1M33%2022l-3%206-2%201c-3-1-3%200-2%202h2c0-2%201-1%203%202%202%205%204%209%202%208s-1%200%201%203c1%201%201%201%201-1-1-2-1-2%203%202l4%204%202-2c2-2%202-2%201-3l-1-2%203%202c4%205%202%201-3-7-4-7-9-12-8-7%201%201%201%201-1%201l-3-1-1-1%201-1c1%201%204-3%204-5s2-1%204%202c2%205%208%2014%209%2014L37%2020c-2-2-2-2-4%202m282-1c0%202%200%202-1%201l-1-1v2l1%201c-1%202%200%205%201%204l1%203%204%204c4%203%204%203%206%201l2-7c-2-2%201-1%202%201%202%202%202%202%201%203-1%200-2%201-2%203l-3%203c-2%203%204%2010%207%207h2l1-1v-1c1%202%202%201%202-2v-1h1v-3c1-1%201-2-4-6a47%2047%200%2000-12-10l-7-4-1%203M51%2021l-4%203-1%201h-1c-1%201%200%203%201%205%202%205%204%204%208-1%203-3%204-6%202-5h-1v-2c2%200%201-3%200-3l-4%202m307%205c-4%207-4%208-3%208l1%202h-1c-2-2-2-2-7%206a3775%203775%200%2001-21%2037l3%202h2l1%201c1%201%201%201%204-2s4-5%203-6l1-2v-3c0-2%200-2%201-1%200%201%201%201%202-1l1-3%201-2%201-2-1-1c1-3%200-3-2-1-1%202-3%202-2-1h1v-2h2c0-1%201-1%202%201l3%203c-2%205%205-5%208-11%200-2%201-3%202-3l1-2h1l1-1c-1-1-1-1%200%200l1-1v-1c1%201%201%201%200%200l1-2%202%201%202%201%201-1v-2h-4l1-2c1-1-2-2-4-2v-2l-1-1v-1l-1-1h-1l3-1%202-1-1-1c-1%200-2-1-1-2%200-4-1-4-5%203m-53%2012v4l-2%203-1%203c0%201%200%202%201%201h1l3-2v1c0%202%202%205%203%204l1%201v1l3-4c1-3%202-4%203-3l2-1c2-2%201-4-2-3l-4-3-4-3h-3l-1-1v2M16%2041v1h-1l-3%205%203%205c2%202%203%205%202%206h1l3%202c6%207%208%209%2010%207l1-2%201-1c1%201%201%200%201-1v-4c1-3%200-5-1-5h-1l1-1-1-1v-1h-1c-1%202-4-2-2-4l-1-1-4-1h-1v-2h-2c-2-2-5-3-5-2m352%2015c-5%208-6%208-4%208%202-1%202%200%200%202-1%202-1%202%203%207a149%20149%200%200018%2016c0%202%203%200%208-4l4-6v-1l1-2c0-2-1-3-2-3v-1l-1-1h-1c0-1%200-2-1-1l-1-1h-1l-1-1-1-2-2-1c1-1-5-8-9-10-2-2-3-2-5%200l-2%201%202-2v-3l-5%205m-172%204c-24%201-42%207-65%2019-15%207-44%2033-41%2035v1h-1l-1%201c-1-1-1-1%200%200l-1%201v1h-1c-1-1-1-1-2%201v3h-1v1h-2v2l-1%201-3%203c-3%204-4%206-2%205v2h-1c0-3-2-1-8%2011-12%2023-18%2061-15%2089v9s2%204%202%209l7%2020%205%2012h4c4%200%204-1%202-5v-1c1-1%202%201%203%202%202%204%207%206%206%202l1-2%201%203%203%201h3l-2-4-2-4c2%201%207%201%206-1l1-1%201-2h1v1l1%201%202-2c1-2%200-2-4-2l-4-1c1-1-3-3-8-4l-2-2c0-1%203-1%206%201l3%201%204%201h2l2%201h-2c-2%200-2%200-1%201l10%201%202-1%201%201c0%202%204%204%207%203%202%200%202%200%200-2l-2-1-1-1%201-2%208%201-1%201h-2%204c6%200%206%200%204-1v-1l2-1%201-1c2%201%202%204%200%204v2l1%202-2-1h-2l1%201h-2c-4%200-8%201-7%202l3%201c2%200%202%200%201%201s0%202%206%203l3%201-3-2c-3-4-1-4%203-1%203%203%209%205%208%203-2-3%209-2%2011%201%201%202%204%203%206%201%201-1%201-1-2-2-4-2-4-3%201-3a515%20515%200%200019%201l3%203-1%201-9-1c-4-2-7-3-8-1-1%201-1%201%201%202%202%200%202%200%201%201a618%20618%200%200092-2c-4-2-4-3%200-3l6%203c3%203%205%204%204%202s7-2%2010%200h19v-1h5l-1%201%2017%201%2018-1h1c0%203%206%201%207-2l3-7v-2l1-2%201-1%201-1%201-3v-2l1-1v-2l1-3v-3l2-2c2-1%201%206-5%2020l-5%2012h4c3%200%204%200%207-8a146%20146%200%200011-77c-1-18-15-60-20-59l-1-2-3-7c-4-7-9-13-9-11v2l-2-2c0-2-3-4-4-3l2%203c2%203%202%205-1%203v2c1%201%202%200%204-1%202-2%203-2%203%200l-1%201c-1%200-1%201%201%203a125%20125%200%200117%2036c1-1%202%202%203%208l1%206c3%204%203%209%203%2015l1%203v19c1%206%201%207-1%207-4-1-7%202-5%208l1-1%201-3%201-2c1%200%202%201%202%203l-1%202-1%202v1c-1-1-2%200-2%201l-2%201-1-6c0-7%202-10%204-9%201%201%201%200%201-3l1-5-1-5v-4l-1-6-1-5-1-3v-4l-2-5-1-5-1-4c0-6-15-32-25-44-3-4-4-5-3-6h3c2%202%201-1-2-3-1-2-2-2-2-1%201%201-2%202-4%201h-1v-1h-1l-1-1c1-1-15-16-17-15l-1-2-3-1v-1l-1-1h-1l-1-1c-1%201-6-2-5-3l-1-1h-2l-1-1v-1c-2%201-14-5-13-6h-2l-2-1v-1h-1l-1%201v-1l-1-2v1h-5v-2h-6c-3%200-3%200-1-1s2-1-1-1h-5v-1l-3-1h-3l-2-1h-5l-5%201h-3l7%201c8%201%2031%207%2038%2010%2030%2013%2069%2051%2071%2070v4l-2-5c-2-2-3-5-2-6h-1c-1%201-1%201-1-1v-1l-2-1h1l1-1-2-1-4-4c-4-6-6-8-5-5v2l4%2010c7%2011%2012%2021%2015%2032%205%2015%208%2048%205%2048l-2-1h-1l-15-2a2484%202484%200%2000-250-29%20184%20184%200%200117-49l-5%209-5%207-2%203-3%203c0-3%206-16%2011-24%204-6%206-11%203-9l-1%201v3h-2v2c0%202%200%202-1%201s-3%200-2%202v3c-1%202-1%202-2%201-2-3-9%2012-7%2015%200%202%200%202-1%201l-1%201a73%2073%200%2001-7%2023l-1%202c-2%204-3%2031-1%2031l2-4c1-2%201-2%201%201l-1%204-1%201%201%201%201%204%202%205v3c-5-2-5%203-1%2018a213%20213%200%20015%2017v2l1%203%202%202-3-1a97%2097%200%2001-11-39v-3c-3%205-4-27-1-45%204-18%2013-41%2022-55%208-12%2012-16%2014-15%202%200%202%200%202-2-1-2%200-4%207-10%207-7%2010-8%208-6l1%201%201-2c0-1%207-9%209-9%203-1%205-2%204-3h1l1-1h1v-1h1c2%200%202%200%201-1v-1h3l1-1h1v-1h1c2%200%202%200%201-1v-1h1l1-1%201%201v-1l2-1h1c-1-1%200-1%200%200l2-1h1l3-1%203-1c2%200%2010-3%209-4v-1l10-2c17-5%2035-6%2050-4a369%20369%200%200025%205%20142%20142%200%200160%2036c9%209%2013%2012%2012%209-1-1%202-1%203%201h2c0-2-21-22-23-21v-1c1-1-3-4-4-3l-1-1-1-1-1-1h-2v-2h-2l-1-1v-1h-1l-1-2v1l-1%201-1-2v-2h-4c-2%200-2%200-1-1%202-1%200-2-2-1-2%200-5-1-3-2a166%20166%200%2000-78-16M39%2067l-1%201-2%201h-2l-3%201c-2%201-2%201%201%204l4%203c2%200%202%200%201%201l-4%201c-1-1-2%201%200%201%201%201%2015-3%2015-4%200-2-9-11-9-9m143%207l1%201-3%201h-7v2h-2l-4%201-3%201-1%201-1-1-8%201c-7%203-10%205-7%205v1c-2%201-3%201-2-1h-1c-2%200-2%201-1%202v1c-1%200-2%200-1-1%201-3-15%206-21%2011l-4%203-1%201v1l-3%201-2%203c2%201-4%205-6%204l-1%201h1l-2%203c-4%205-4%206%201%202%2021-20%2050-35%2078-40%2012-3%2012-3%207-3l-6-1h-1m169%2017l-2%203%203%204c2%203%204%205%203%206h2l1%202c2%201%205-2%204-5l1-1h1l2%201c1%200%201-1-2-3l-3-2c-1%202-2%200-2-2l2-1c2%202%201-1-2-3h-4c-1-1-2%200-4%201M0%20120l2%203v3l-2%206c0%203%200%204%201%203h3v-1c-2-1-2-2-1-4%201-1%202-2%201-3v-1l2%202%204%203c2%201%203%201%202%202s-1%201%201%202h1l2-1c6%202%206%202%202-1l-5-4c0-2-4-5-5-5l-4-2c-3-3-4-4-4-2m183%20141l-1%201c-1-1-2%200-2%201l1%201%203%201h-3l-2%201%206-1h3v2c-1%201-1%201%201%201v1c-1%201-1%201%202%201l3-1h2c4%200%208-3%204-4l-2-1h-5c-3-1-3-1-1-1%204%200%203-1%200-2l-3%201h-3c-2-2-3-2-3-1M20%20312l1%207h4c12-1%2012-15%200-15h-5v8m91%200v7h5c5%200%208-3%208-7%200-5-3-8-8-8h-5v8m77%200v7h5c6%200%208-2%208-7s-3-8-8-8h-5v8m-150-3c-4%204-1%2011%203%2011%203%200%206-4%206-6%200-6-6-9-9-5m198%200c-2%202-2%207-1%209l5%201c2-1%202%200%202%201l-4%201c-3%200-4%202%200%203%205%201%206-2%206-9v-7l-4-1-4%202M42%20333c-1%202%201%2014%202%2015l1-2c0-3%200-3%202-2%205%201%208-8%204-11-2-2-8-2-9%200m67-1l1%2016%201-3c0-3%200-3%201-2%204%204%2010-4%207-10-2-1-8-2-10-1m42%2029a177%20177%200%2000107%200c3-2-27%203-34%206-2%200-2%200-2-2s1-2%206-3a800%20800%200%2001-19%201l10%201%201%202c1%201-4%201-13%201-11%200-14-1-15-2h-2c-1%201-21-2-22-4l-9-1-8%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAFEklEQVQ4y02UeUwVVxTGhx00YkVZRCgosqnsIBQVZHnwAJ9oWR+LYBAsPkVaC2ixFAppC2hj49I/mhBwSVT+qGLUttHGpC5FoFgsoKylRcAFUHBrrP31zhiNk5zMzL1zvvN953x3JGtraxbYLSArawNhYWG86+BASEgIOp0Of39/tmzZwtd797Jv3z7KyspYsWIFanUMERERLFq0iN2lu8nJ2URIaCgazVokV1cXMtLTqa2pISgoCEtLS4KDgykvr8DDw4PZs2fj5OSE8+LF2NjYYGRsRF5eHqEhocTFxVFZWUVycgp+ovjy5cuRNBoNZbt3i6pqlixZguPChXh5eSpg1gLAx8cHXz8/AgICWLpsGTbz5yvM7O3tycjIRBWpIj8/XyjR4enpiRQtgDIzMlCpVAQKhlZWVpiZmREYGKQkbN68mZSUFKKiooS0HNLS0li5ciVW1laYmJoqLBMSEyn7tIyar6qRqior+bCwkFWrVjHHwkIwsCExMYmioiLiYuMUuXPmvIO5ublSTGYvg+bm5uIk2rBYhE63VchOpri4BKmhvp7q6mrs37VnxowZJCUlKUzmC2mSJL0JAwMD9PT1lWdTM1OFQEFBAfJQfX19CQ8PVwYmHdi/n9LSUkHfBD/RK7nBM2fOVBINDQ0VIANDA4yNjTEyMnoTevp6ilytNhVjE2OcnZ0VN0glJSUkCYmzZs1S+uXm5qaAyX2UAeVkmbkMqG+gr6zJDCU9CYu5FlRVVQl3vIedvZ1iMUn2nAwg097x0Q709PReydR7JVMGfA1mYmKi2EYOuaD8XXZ2Njt37lIYy8UkuWfyhnyvra3F29sbV1dXxY/yIGR2yodv9fPtkK22Z0+tYiM7OzukdfHxoroBmZmZDA8P8+TJUyYmJrn/4AF9ff00N1+n6cwZDh48RHlFhTKw16dEZuzg6EBdXR3OLi7Y2toiabVa0VQT5eh1dNzk0aMpxsbuMjU1zcuX//Hixb88f/4Pr69nz57zSOzdu3efzs4uTp9u4sTxE4qH5wlVooehih22bSugra2dvt5+2lp/47pgdv16K+3tN7h9q4fenj6mp58wPj7J6OhdwX6AkZExHj9+KgBPivO/Wki2Fz1MXs/cuebExKo4d+40DfXf8e2hbzh6pI4LF84rcfz4EcG+jZHRv7h06SfOnj3FxYs/0NJyjdbWa+z6pEjYxlH8WIR3M+LOEx14lDCfOvKSL5MQfgp10FFSo8+QHvsjBRtaKdV18/GmDorzOslaewGt+hwb1/1MYXYbW9Ob0axqJNDlACr/w+Ise3WzPf0OOWv/Jid+gKzYP8mOHeKDhCHxPkimuldED5vW9ZG7vk9Z00YMsCbgNiud/iDUpZPIpT2ovQaI8uhDWhPQyba0fvKTeinMHBSJvehS+0lX3SbOvwvN8m5i/boEQBfvr7jF+uBbxPp2EuPbRbSXuPt0E+XZicrjphJSqPsVksM72KgRCSFtJK3uQKu6gSawjTD3FiKWtRDt3Y7a53fx3Mpq91+VNTmivNoIX9pMpEeL2G8n0rNVDCUhCzMTS9RRyTg6eGJn605wUAxZmTqKdnxGSfHnlJfVUFG+R3nPzdlOWmoukeHxuLn4YTnPkTRtLpq4VK78cgOpqel7vviyisqqchoa6jjZeJzBwX4ejN9ncnJCeO4hQ0ODwnM3Gbs7ysOHE0xMjnNnZJirVy/T2HiCw4frOXbsMNOPp/gfjo9PExhws5AAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/6720283e0e150a9ffbed2b2e549d8728/502b1/ddd.png","srcSet":"/static/6720283e0e150a9ffbed2b2e549d8728/f2e6d/ddd.png 114w,\n/static/6720283e0e150a9ffbed2b2e549d8728/4ddba/ddd.png 229w,\n/static/6720283e0e150a9ffbed2b2e549d8728/502b1/ddd.png 457w,\n/static/6720283e0e150a9ffbed2b2e549d8728/7ddc2/ddd.png 686w,\n/static/6720283e0e150a9ffbed2b2e549d8728/435bf/ddd.png 914w,\n/static/6720283e0e150a9ffbed2b2e549d8728/6050d/ddd.png 1200w","srcWebp":"/static/6720283e0e150a9ffbed2b2e549d8728/15384/ddd.webp","srcSetWebp":"/static/6720283e0e150a9ffbed2b2e549d8728/31fce/ddd.webp 114w,\n/static/6720283e0e150a9ffbed2b2e549d8728/e3e25/ddd.webp 229w,\n/static/6720283e0e150a9ffbed2b2e549d8728/15384/ddd.webp 457w,\n/static/6720283e0e150a9ffbed2b2e549d8728/0258d/ddd.webp 686w,\n/static/6720283e0e150a9ffbed2b2e549d8728/64ea2/ddd.webp 914w,\n/static/6720283e0e150a9ffbed2b2e549d8728/9000d/ddd.webp 1200w","sizes":"(max-width: 457px) 100vw, 457px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2021c0%2012%200%2021%201%2020l2-1-1%202c-2%203-3%205-1%204v4l-1%203c0%203%204%208%204%206l2-1c1%201%200%204-4%205-2%201-3%205-1%207l1-1h2c-1-1%200-2%201-2%202-1%202-1%201%202l-2%202-1%201H2c-2-1-3%200-1%202v1c-2%200-1%208%202%2011l3%201%201-3%201%201v1l1-1h3c2-1%200-3-2-3v-1h2c2%201%201-2-2-4l-3-3%202-2%207-2v3l1%202c2-1%201%201-1%202v3c1%201%202%201%203-1%202-1%203%200%201%202v6c0%201%200%202-1%201l1%203c3%204%205%205%204%203v-4l-1-3-1-1c-1%201-1%201%200%200%200-3%203-1%205%203l3%203%203%201c2%202%202%202%203%201%201-2%201-2%203%200l3%201%202%202c2%203%202%206-2%208-2%200-3%202-3%203l-1%202-1-1h-1v-1l-1-1-3-1c-2-2-2-2-3%200l1%202%201%202v5l1%202c0%201%200%202%202%203l1%203-18-17C3%2092%200%2090%200%2092l1%204v1c-2-1-1%201%201%202h1c-1-2%201-3%204%200a316%20316%200%200126%2028h-2l-1-1h-2c-1-2-5-2-5-1%200%200%201%202%203%202l3%201%201-1v8l2%201%202%201c2%201%203%201%203-1h1l1-1v-1c2%200%202%202%200%203-1%201-2%202-1%204s1%202-2%202l-1%202c-1%202-6%2011-8%2011l-1%201-1%201c-2%201-2%201-1-1%201-3%201-4-1-2l-2%202v-3l-1%201c1-1-1-3-4-5-3-3-5-4-5-3H8l-1-2-2-1-1-1v-3H2l-1%201-1%204%201%205%201-4v-3l2%202%201%205%202%204%201%201%201%201h1v1h1v1l-1%202c-2%201-1%202%202%202h1v-5%201l1%201%202%202c0%205-7%204-12-2-3-4-4-2-4%208%200%209%200%209%202%202%200-7%202-5%202%203%200%204%200%205-2%205l-2%201c0%202%201%203%206%205%208%204%209%204%2010%209%201%203-1%208-4%208l1-2%202-3-2-1-3-1H8c0%202-1%202-4%200-3-1-3-1-3%201l-1%2010v8h8c1-1%201-1-1-1s-2%200-1-2c1-5%204-4%204%203%200%204%200%204-1%203H7l3%203c5%204%203%204-3%203-7-3-7-3-7%203%201%206%201%207%208%207%202%200%202%200%201-1l-1-1c2%200%203-2%201-3l-2%201c0%201-1%202-3%202s-2%200-2-3c1-3%204-3%2010-2h2v-2c1%201%202%203%202%208%200%209%200%209-7%207l-3-1h2c3-1%203-4%200-4H4c-4-1-4%202-3%2013%200%202%202%201%202%200l1-2%201-1%201-2c2%200%202%201%202%204%200%205-2%207-3%205%200-3-5-2-5%201l2%202%202%201h3l1%201c0%201%201%202%202%201l1%201c0%202-4%202-5%200l-3-1c-2%200-3%200-2%201v1c-2%201%200%203%203%203s4%200%203%202l1%202%201%202c0%201-1%202-3%201H4l2%201c2%201%202%201-2%201l-4-1v6l1%206h10l-2-1-3-1%207-1c9%201%2014%203%2013%205h-5l-5-2c-3%200-3%200-2%201%204%201%202%201-3%201s-5%200-4%201c1%202%201%202%202%201h4l9%201c5%201%205%201-6%201s-12%200-12-2l-3-2a578%20578%200%20002%2086h1l1%201h1v2h2c-1%203%200%205%201%203%201-1%201-1%201%201v4h2l2%201-1%201c-2-2-1%201%202%205l4%203%203%201c4%202%209%201%208-2l1-1h1c0-1%201-1%202%201s2%202%2011%201l12-1c4%201%204-1%200-6l-16-21%203-1%205%201%204%204%203%205%201%201%201%201-1%202-1%202%202-1h2l1%201v2c-2%201%200%203%202%203h2v1l-1%201%202%201c1-1%202%200%202%201%201%203%201%203%204%202s3-1%202%201v3c0%202%200%202%203%201l2-2v-1h2v-1c-1-1%200-2%202-1v-2h8l5-1h5l7-2%205-1%2015-2c2%200%202%200%201-1h5l7-1a998%20998%200%2001115-2v-1l1%201%203%201c3%200%203%200-1%201s3%201%2022%203h7a137%20137%200%200023%204l4%201%205%201h1l2%201%203%201v-1l-2-2h1l6%202h4l-3-2c-4-4-3-4%202-1%203%202%203%202%204%201l2-2c2%200%209-10%2012-16l1-1%202-2c-1-2%200-2%204%200l-1-2-2-2h5l5%201-5%209-10%2014c-1%202-1%202%204%202%203%200%205%201%207%203%203%202%206%203%205%201-1-1%200-1%201-1v-1l1-1%202-1h-1c-2%200-2-1-1-3l1-1%201-1h4c3%200%204%200%204-2%200-5%201-9%203-11l2-3%201-1v-1l2-1h2l8-1h1c2-1%202-1%202%203a829%20829%200%20000-81c0%203-2%204-3%202h-1l-2%201c-1%200-1-1%201-3l2-4%201-3%201%201v2c1-1%202-14%202-62%200-66%200-66-3-65-1%200-1-1%201-2%201-1%202-2%202-5%200-2%200-3-1-1%200%203-8%208-10%207-1-1-2-1-4%201-3%202-5%203-3%201v-2l-2%201h-2l1-3c2-1%202-1%200-3-1-3-3-4-2-2v3l-2-2%201-2%201-1-1-1h-1v-1l-6-1%201-1c1%201%203%200%204-3%203-3%206-4%206-2l-1%201-1%201c1%202%202%202%205%200%202-1%202-2%201-2l1-3c4-4%203-5-1-1-3%202-3%202-4%201-1-2%206-8%208-7l2%201c3%200%204%201%201%201-1%200-2%200-1%201h4c0-1%201-2%203-2l4-2h-5c-4%201-5%201-2-2v-2l-1%201-2%201%202-3c3-3%205-3%203-1-1%202%200%202%202%201v-2l1-2c1%201%201%200%201-3l-1-8c0-4%200-4-2-3h-5l-2-2v-1l-2-2c-1-3%200-3%206-9s6-7%206-11l-1-4h-1l-2-2v-2l2%201c1%202%202%201%202-3l-2-5c-2-1-2-2-1-2l2%201%201-14c0-11%200-15-1-14l-2%202h-1c-2%202-5-2-5-6-1-2%202-6%203-5l1-1v-1l1-1-1-1c-1%200-2-3-1-4h3l1%201-1%203v2c1%200%202%201%202%205l1-10V0h-17l-3%204-3%204-4%204c-2%203-5%204-3%202l-1-1-1-1c-1-2%200-4%201-3l1-1c-1-1%200-3%201-5l2-3h-5c-4%200-6%200-7%202v3h1l-1%202-1-1h-1l-1%201-2%207h-2v-1h-2v-2l-2-1h-4l-2-3-2-1-1%201V5l-1-1-4-1-6-3h-2l3%203a413%20413%200%200010%2011v4h1v-2h1l3%201c2%202%202%203-2%209-2%203-2%204-1%204v3h-2l-1-1c-1%201-5-4-4-6%200-2%200-2-1-1%200%202-3%201-3%200v-2l2-3c3-4%204-10%200-11-1-1-2%200-3%203-1%202-2%203-3%202l-1%201%201%203c2%200%202%201%201%202-1%202-2%202-3%200l-1-2-1-1c-1%201-2%200-3-1s-1-1%202-1c2%200%202%200%201-1l-2-4-1-2-1%203c-2%203-3%204-2%201V9l2-1c1%200%203-4%202-5l1-2c1-1-2-1-14-1h-15l1%203c0%202%200%202-2%201-1-2-2-2-2-1-1%201-1%201-2-1%200-2%200-2-20-2-15%200-19%200-18%201v2c0%201-3-1-2-2l-2-1v2c1%201%200%201-5%201l-7%201h-2l-2-1V2l1-2-3%202-2%203V2c1-3-1-2-2%201l-3%202a325%20325%200%2000-44-2h-1c-1%202-3%200-2-2l-1-1-1%202-12%201-12-1c1-2-1-2-14-2h-15l1%203c1%202%201%204-1%202l-1-2c1-1-3-3-4-2l1%201v1l1%201h-1l-2%201v1l-1-2-2-2%201-1c1-1-6-1-15-1L81%201h-1L68%200H58l1%202c1%202%202%203%203%202h1c1%201%200%201-1%201l-1%201%201%201%201%201v4l-1-1c-3-3-3-2%201%205%203%207%204%2010%202%209l-1%202c1%201%200%202-1%203-2%202-3%200-3-4l-1-5c-2-2-2-3-1-6v-3l-1-1-2-3c-2-1-2-1-3%201-1%203-2%204-4%204s-2%201-1%203c1%201%200%202-1%203-2%201-2%202-1%202v1c-1%202-3%201-5-2v-5l1-1c-1-1-1-1%200%200l1-1c-1-1-1-1%200%200l1-1v-1c1%201%206-3%208-5l1-1h2c1-2%202-2%203%201%203%204%204%203%202-2-2-4-4-5-6-3h-1c1-1-2-1-12-1-8%200-13%200-12%201l-1%201c-1%200-2%200-1-1L13%200H0v21M186%207l3%201%205%201c1%201%200%201-3%201h-6l-1-2c-1-2-2-2-7-2l-6%201h-2c-2%200-1%207%200%208%202%201%2068%200%2070-1l1-4%201-4h-17c-2-1-3%200-3%201h-1c0-3-34-3-34%200m-59%201l-2%201c-1%202%200%206%201%206l1%201%201%201c2%201%203%201%202-1%200-2%200-3%203-2%204%200%207-3%206-5%200-2-8-3-12-1m-7%207l2%205c1%207%201%207-1%207l-1-2c1-2-2-4-4-4v2l1%202v3l2%201v1c-2%200-1%202%201%202l1%201v1l1-1%201%201%203%203h3l-3%202-2%203h2l5-3c3-2%203-3%202-3l-2-2c0-3-2-3-2%200-1%203-1%203-4-9-3-8-5-13-5-10m22%202l-1%201c-3-1-9%201-8%203%200%202%200%202-1%201v7l3%205h3c4-1%205%200%202%202l-1%202c1%202%207-3%207-6l-4-16v1M33%2022l-3%206-2%201c-3-1-3%200-2%202h2c0-2%201-1%203%202%202%205%204%209%202%208s-1%200%201%203c1%201%201%201%201-1-1-2-1-2%203%202l4%204%202-2c2-2%202-2%201-3l-1-2%203%202c4%205%202%201-3-7-4-7-9-12-8-7%201%201%201%201-1%201l-3-1-1-1%201-1c1%201%204-3%204-5s2-1%204%202c2%205%208%2014%209%2014L37%2020c-2-2-2-2-4%202m282-1c0%202%200%202-1%201l-1-1v2l1%201c-1%202%200%205%201%204l1%203%204%204c4%203%204%203%206%201l2-7c-2-2%201-1%202%201%202%202%202%202%201%203-1%200-2%201-2%203l-3%203c-2%203%204%2010%207%207h2l1-1v-1c1%202%202%201%202-2v-1h1v-3c1-1%201-2-4-6a47%2047%200%2000-12-10l-7-4-1%203M51%2021l-4%203-1%201h-1c-1%201%200%203%201%205%202%205%204%204%208-1%203-3%204-6%202-5h-1v-2c2%200%201-3%200-3l-4%202m307%205c-4%207-4%208-3%208l1%202h-1c-2-2-2-2-7%206a3775%203775%200%2001-21%2037l3%202h2l1%201c1%201%201%201%204-2s4-5%203-6l1-2v-3c0-2%200-2%201-1%200%201%201%201%202-1l1-3%201-2%201-2-1-1c1-3%200-3-2-1-1%202-3%202-2-1h1v-2h2c0-1%201-1%202%201l3%203c-2%205%205-5%208-11%200-2%201-3%202-3l1-2h1l1-1c-1-1-1-1%200%200l1-1v-1c1%201%201%201%200%200l1-2%202%201%202%201%201-1v-2h-4l1-2c1-1-2-2-4-2v-2l-1-1v-1l-1-1h-1l3-1%202-1-1-1c-1%200-2-1-1-2%200-4-1-4-5%203m-53%2012v4l-2%203-1%203c0%201%200%202%201%201h1l3-2v1c0%202%202%205%203%204l1%201v1l3-4c1-3%202-4%203-3l2-1c2-2%201-4-2-3l-4-3-4-3h-3l-1-1v2M16%2041v1h-1l-3%205%203%205c2%202%203%205%202%206h1l3%202c6%207%208%209%2010%207l1-2%201-1c1%201%201%200%201-1v-4c1-3%200-5-1-5h-1l1-1-1-1v-1h-1c-1%202-4-2-2-4l-1-1-4-1h-1v-2h-2c-2-2-5-3-5-2m352%2015c-5%208-6%208-4%208%202-1%202%200%200%202-1%202-1%202%203%207a149%20149%200%200018%2016c0%202%203%200%208-4l4-6v-1l1-2c0-2-1-3-2-3v-1l-1-1h-1c0-1%200-2-1-1l-1-1h-1l-1-1-1-2-2-1c1-1-5-8-9-10-2-2-3-2-5%200l-2%201%202-2v-3l-5%205m-172%204c-24%201-42%207-65%2019-15%207-44%2033-41%2035v1h-1l-1%201c-1-1-1-1%200%200l-1%201v1h-1c-1-1-1-1-2%201v3h-1v1h-2v2l-1%201-3%203c-3%204-4%206-2%205v2h-1c0-3-2-1-8%2011-12%2023-18%2061-15%2089v9s2%204%202%209l7%2020%205%2012h4c4%200%204-1%202-5v-1c1-1%202%201%203%202%202%204%207%206%206%202l1-2%201%203%203%201h3l-2-4-2-4c2%201%207%201%206-1l1-1%201-2h1v1l1%201%202-2c1-2%200-2-4-2l-4-1c1-1-3-3-8-4l-2-2c0-1%203-1%206%201l3%201%204%201h2l2%201h-2c-2%200-2%200-1%201l10%201%202-1%201%201c0%202%204%204%207%203%202%200%202%200%200-2l-2-1-1-1%201-2%208%201-1%201h-2%204c6%200%206%200%204-1v-1l2-1%201-1c2%201%202%204%200%204v2l1%202-2-1h-2l1%201h-2c-4%200-8%201-7%202l3%201c2%200%202%200%201%201s0%202%206%203l3%201-3-2c-3-4-1-4%203-1%203%203%209%205%208%203-2-3%209-2%2011%201%201%202%204%203%206%201%201-1%201-1-2-2-4-2-4-3%201-3a515%20515%200%200019%201l3%203-1%201-9-1c-4-2-7-3-8-1-1%201-1%201%201%202%202%200%202%200%201%201a618%20618%200%200092-2c-4-2-4-3%200-3l6%203c3%203%205%204%204%202s7-2%2010%200h19v-1h5l-1%201%2017%201%2018-1h1c0%203%206%201%207-2l3-7v-2l1-2%201-1%201-1%201-3v-2l1-1v-2l1-3v-3l2-2c2-1%201%206-5%2020l-5%2012h4c3%200%204%200%207-8a146%20146%200%200011-77c-1-18-15-60-20-59l-1-2-3-7c-4-7-9-13-9-11v2l-2-2c0-2-3-4-4-3l2%203c2%203%202%205-1%203v2c1%201%202%200%204-1%202-2%203-2%203%200l-1%201c-1%200-1%201%201%203a125%20125%200%200117%2036c1-1%202%202%203%208l1%206c3%204%203%209%203%2015l1%203v19c1%206%201%207-1%207-4-1-7%202-5%208l1-1%201-3%201-2c1%200%202%201%202%203l-1%202-1%202v1c-1-1-2%200-2%201l-2%201-1-6c0-7%202-10%204-9%201%201%201%200%201-3l1-5-1-5v-4l-1-6-1-5-1-3v-4l-2-5-1-5-1-4c0-6-15-32-25-44-3-4-4-5-3-6h3c2%202%201-1-2-3-1-2-2-2-2-1%201%201-2%202-4%201h-1v-1h-1l-1-1c1-1-15-16-17-15l-1-2-3-1v-1l-1-1h-1l-1-1c-1%201-6-2-5-3l-1-1h-2l-1-1v-1c-2%201-14-5-13-6h-2l-2-1v-1h-1l-1%201v-1l-1-2v1h-5v-2h-6c-3%200-3%200-1-1s2-1-1-1h-5v-1l-3-1h-3l-2-1h-5l-5%201h-3l7%201c8%201%2031%207%2038%2010%2030%2013%2069%2051%2071%2070v4l-2-5c-2-2-3-5-2-6h-1c-1%201-1%201-1-1v-1l-2-1h1l1-1-2-1-4-4c-4-6-6-8-5-5v2l4%2010c7%2011%2012%2021%2015%2032%205%2015%208%2048%205%2048l-2-1h-1l-15-2a2484%202484%200%2000-250-29%20184%20184%200%200117-49l-5%209-5%207-2%203-3%203c0-3%206-16%2011-24%204-6%206-11%203-9l-1%201v3h-2v2c0%202%200%202-1%201s-3%200-2%202v3c-1%202-1%202-2%201-2-3-9%2012-7%2015%200%202%200%202-1%201l-1%201a73%2073%200%2001-7%2023l-1%202c-2%204-3%2031-1%2031l2-4c1-2%201-2%201%201l-1%204-1%201%201%201%201%204%202%205v3c-5-2-5%203-1%2018a213%20213%200%20015%2017v2l1%203%202%202-3-1a97%2097%200%2001-11-39v-3c-3%205-4-27-1-45%204-18%2013-41%2022-55%208-12%2012-16%2014-15%202%200%202%200%202-2-1-2%200-4%207-10%207-7%2010-8%208-6l1%201%201-2c0-1%207-9%209-9%203-1%205-2%204-3h1l1-1h1v-1h1c2%200%202%200%201-1v-1h3l1-1h1v-1h1c2%200%202%200%201-1v-1h1l1-1%201%201v-1l2-1h1c-1-1%200-1%200%200l2-1h1l3-1%203-1c2%200%2010-3%209-4v-1l10-2c17-5%2035-6%2050-4a369%20369%200%200025%205%20142%20142%200%200160%2036c9%209%2013%2012%2012%209-1-1%202-1%203%201h2c0-2-21-22-23-21v-1c1-1-3-4-4-3l-1-1-1-1-1-1h-2v-2h-2l-1-1v-1h-1l-1-2v1l-1%201-1-2v-2h-4c-2%200-2%200-1-1%202-1%200-2-2-1-2%200-5-1-3-2a166%20166%200%2000-78-16M39%2067l-1%201-2%201h-2l-3%201c-2%201-2%201%201%204l4%203c2%200%202%200%201%201l-4%201c-1-1-2%201%200%201%201%201%2015-3%2015-4%200-2-9-11-9-9m143%207l1%201-3%201h-7v2h-2l-4%201-3%201-1%201-1-1-8%201c-7%203-10%205-7%205v1c-2%201-3%201-2-1h-1c-2%200-2%201-1%202v1c-1%200-2%200-1-1%201-3-15%206-21%2011l-4%203-1%201v1l-3%201-2%203c2%201-4%205-6%204l-1%201h1l-2%203c-4%205-4%206%201%202%2021-20%2050-35%2078-40%2012-3%2012-3%207-3l-6-1h-1m169%2017l-2%203%203%204c2%203%204%205%203%206h2l1%202c2%201%205-2%204-5l1-1h1l2%201c1%200%201-1-2-3l-3-2c-1%202-2%200-2-2l2-1c2%202%201-1-2-3h-4c-1-1-2%200-4%201M0%20120l2%203v3l-2%206c0%203%200%204%201%203h3v-1c-2-1-2-2-1-4%201-1%202-2%201-3v-1l2%202%204%203c2%201%203%201%202%202s-1%201%201%202h1l2-1c6%202%206%202%202-1l-5-4c0-2-4-5-5-5l-4-2c-3-3-4-4-4-2m183%20141l-1%201c-1-1-2%200-2%201l1%201%203%201h-3l-2%201%206-1h3v2c-1%201-1%201%201%201v1c-1%201-1%201%202%201l3-1h2c4%200%208-3%204-4l-2-1h-5c-3-1-3-1-1-1%204%200%203-1%200-2l-3%201h-3c-2-2-3-2-3-1M20%20312l1%207h4c12-1%2012-15%200-15h-5v8m91%200v7h5c5%200%208-3%208-7%200-5-3-8-8-8h-5v8m77%200v7h5c6%200%208-2%208-7s-3-8-8-8h-5v8m-150-3c-4%204-1%2011%203%2011%203%200%206-4%206-6%200-6-6-9-9-5m198%200c-2%202-2%207-1%209l5%201c2-1%202%200%202%201l-4%201c-3%200-4%202%200%203%205%201%206-2%206-9v-7l-4-1-4%202M42%20333c-1%202%201%2014%202%2015l1-2c0-3%200-3%202-2%205%201%208-8%204-11-2-2-8-2-9%200m67-1l1%2016%201-3c0-3%200-3%201-2%204%204%2010-4%207-10-2-1-8-2-10-1m42%2029a177%20177%200%2000107%200c3-2-27%203-34%206-2%200-2%200-2-2s1-2%206-3a800%20800%200%2001-19%201l10%201%201%202c1%201-4%201-13%201-11%200-14-1-15-2h-2c-1%201-21-2-22-4l-9-1-8%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/6720283e0e150a9ffbed2b2e549d8728/6050d/ddd.png"}}},"authors":[{"authorsPage":true,"bio":"Hello everybody 👋 !  My name is Luke and I am the creator and owner of the spaceout.pl. Personally, I am a big geek with huge love for Star Wars, Marvel and DC comic books, Funk and 80s music. I take most of my design inspiration from offline experiences like going to art museums, galleries and working with other creative people on various projects. I also work with various Activist and NGO groups as a pro-bono designer and developer.\n","id":"f69d27c7-7f9a-5fbd-b05d-1a324fd10c0a","name":"Luke Celitan","featured":true,"social":[{"url":"https://www.facebook.com/spaceout/"},{"url":"https://twitter.com/spaceout.pl"},{"url":"https://www.instagram.com/spaceout.pl/"},{"url":"https://huggingface.co/MassivDash"},{"url":"https://bsky.app/profile/lukecelitan.bsky.social"}],"slug":"/authors/luke-celitan","avatar":{"small":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIFAQME/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABvOTVgtERIAH/xAAaEAEBAQEAAwAAAAAAAAAAAAACAQMEABAS/9oACAEBAAEFAmoDjs0/Oq1a9kUzN+j7/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxESECAxMlH/2gAIAQEABj8CLHgTGqmBPXSlTANsrmKyXLK0B92f/8QAHhABAAECBwAAAAAAAAAAAAAAAREAIRAgMUFhcdH/2gAIAQEAAT8hUmKFDbjke4JaIOG01Fthsd0YugnJ/9oADAMBAAIAAwAAABDzzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEBAAEDBQEAAAAAAAAAAAABETEAQWEQICFxgZH/2gAIAQEAAT8QhmFXf0c6oSU1s8jwz0W5QpAeFf1+Gp7aimCmBvvoV0CRyUvZ/9k=","aspectRatio":1,"src":"/static/4f53b0980dc97328dd1294bbc374fd0e/fa1ea/spaceghost.jpg","srcSet":"/static/4f53b0980dc97328dd1294bbc374fd0e/afb2b/spaceghost.jpg 13w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/7c20e/spaceghost.jpg 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/fa1ea/spaceghost.jpg 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/03612/spaceghost.jpg 75w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/61cdf/spaceghost.jpg 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg 305w","srcWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/e7b2c/spaceghost.webp","srcSetWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/58718/spaceghost.webp 13w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/74aad/spaceghost.webp 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/e7b2c/spaceghost.webp 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/ed320/spaceghost.webp 75w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/66016/spaceghost.webp 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp 305w","sizes":"(max-width: 50px) 100vw, 50px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2065A519%20519%200%200065%20299c-5%2020-5%2018%203%2015%208-4%2039-10%2057-12%2011-1%2010%200%2010-11%200-29%206-103%2010-121%204-21%2016-36%2033-43%206-2%208-2%2020-2%2018%200%2024%202%2036%2013%2020%2021%2025%2046%2029%20138l2%2026h10a267%20267%200%200168%2014l-6-26A607%20607%200%2000218%2071c-10-10-15-15-18-15-2%200-6%203-11%209m47%20129c-14%208-26%2015-26%2017%200%203%2018%205%2024%202%205-3%209-10%209-18%200-5%200-5-7-1m-82%201l1%205c1%2011%209%2018%2020%2017%207-1%2013-3%2013-5s-32-19-34-17'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"medium":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIFAQME/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABvOTVgtERIAH/xAAaEAEBAQEAAwAAAAAAAAAAAAACAQMEABAS/9oACAEBAAEFAmoDjs0/Oq1a9kUzN+j7/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxESECAxMlH/2gAIAQEABj8CLHgTGqmBPXSlTANsrmKyXLK0B92f/8QAHhABAAECBwAAAAAAAAAAAAAAAREAIRAgMUFhcdH/2gAIAQEAAT8hUmKFDbjke4JaIOG01Fthsd0YugnJ/9oADAMBAAIAAwAAABDzzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEBAAEDBQEAAAAAAAAAAAABETEAQWEQICFxgZH/2gAIAQEAAT8QhmFXf0c6oSU1s8jwz0W5QpAeFf1+Gp7aimCmBvvoV0CRyUvZ/9k=","aspectRatio":1,"src":"/static/4f53b0980dc97328dd1294bbc374fd0e/61cdf/spaceghost.jpg","srcSet":"/static/4f53b0980dc97328dd1294bbc374fd0e/7c20e/spaceghost.jpg 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/fa1ea/spaceghost.jpg 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/61cdf/spaceghost.jpg 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/59538/spaceghost.jpg 150w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/fd013/spaceghost.jpg 200w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg 305w","srcWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/66016/spaceghost.webp","srcSetWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/74aad/spaceghost.webp 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/e7b2c/spaceghost.webp 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/66016/spaceghost.webp 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/d9b14/spaceghost.webp 150w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/6b183/spaceghost.webp 200w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp 305w","sizes":"(max-width: 100px) 100vw, 100px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2065A519%20519%200%200065%20299c-5%2020-5%2018%203%2015%208-4%2039-10%2057-12%2011-1%2010%200%2010-11%200-29%206-103%2010-121%204-21%2016-36%2033-43%206-2%208-2%2020-2%2018%200%2024%202%2036%2013%2020%2021%2025%2046%2029%20138l2%2026h10a267%20267%200%200168%2014l-6-26A607%20607%200%2000218%2071c-10-10-15-15-18-15-2%200-6%203-11%209m47%20129c-14%208-26%2015-26%2017%200%203%2018%205%2024%202%205-3%209-10%209-18%200-5%200-5-7-1m-82%201l1%205c1%2011%209%2018%2020%2017%207-1%2013-3%2013-5s-32-19-34-17'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"large":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIFAQME/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABvOTVgtERIAH/xAAaEAEBAQEAAwAAAAAAAAAAAAACAQMEABAS/9oACAEBAAEFAmoDjs0/Oq1a9kUzN+j7/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxESECAxMlH/2gAIAQEABj8CLHgTGqmBPXSlTANsrmKyXLK0B92f/8QAHhABAAECBwAAAAAAAAAAAAAAAREAIRAgMUFhcdH/2gAIAQEAAT8hUmKFDbjke4JaIOG01Fthsd0YugnJ/9oADAMBAAIAAwAAABDzzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEBAAEDBQEAAAAAAAAAAAABETEAQWEQICFxgZH/2gAIAQEAAT8QhmFXf0c6oSU1s8jwz0W5QpAeFf1+Gp7aimCmBvvoV0CRyUvZ/9k=","aspectRatio":1,"src":"/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg","srcSet":"/static/4f53b0980dc97328dd1294bbc374fd0e/a2637/spaceghost.jpg 82w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/15203/spaceghost.jpg 164w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg 305w","srcWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp","srcSetWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/2d087/spaceghost.webp 82w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/29d87/spaceghost.webp 164w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp 305w","sizes":"(max-width: 305px) 100vw, 305px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2065A519%20519%200%200065%20299c-5%2020-5%2018%203%2015%208-4%2039-10%2057-12%2011-1%2010%200%2010-11%200-29%206-103%2010-121%204-21%2016-36%2033-43%206-2%208-2%2020-2%2018%200%2024%202%2036%2013%2020%2021%2025%2046%2029%20138l2%2026h10a267%20267%200%200168%2014l-6-26A607%20607%200%2000218%2071c-10-10-15-15-18-15-2%200-6%203-11%209m47%20129c-14%208-26%2015-26%2017%200%203%2018%205%2024%202%205-3%209-10%209-18%200-5%200-5-7-1m-82%201l1%205c1%2011%209%2018%2020%2017%207-1%2013-3%2013-5s-32-19-34-17'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"}}}],"basePath":"/","tech":["TS","Nodejs"],"category":"Post","slug":"/domain-driven-design-in-typescript","id":"9462c0d5-d35a-5b1d-b248-1d7c0c42b923","title":"Domain-Driven Design in TypeScript","appDescription":null,"mailchimp":false,"next":[{"id":"a1dadfa4-c917-5b75-bbe9-bff89947e8bf","slug":"/sse-vs-websockets","secret":false,"title":"SSE vs WebSockets","author":"Luke Celitan","date":"September 7th, 2025","dateForSEO":"2025-09-07T00:00:00.000Z","timeToRead":3,"excerpt":"A comprehensive deep-dive into Server-Sent Events and WebSockets, covering protocol details, architecture, performance, security, best practices, troubleshooting, advanced concepts, and real-world use cases with practical code examples.","subscription":true,"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"SSE vs WebSockets\",\n  \"excerpt\": \"A comprehensive deep-dive into Server-Sent Events and WebSockets, covering protocol details, architecture, performance, security, best practices, troubleshooting, advanced concepts, and real-world use cases with practical code examples.\",\n  \"date\": \"2025-09-07T00:00:00.000Z\",\n  \"hero\": \"sse.png\",\n  \"author\": \"Luke Celitan\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\", \"Nodejs\", \"ReactIcon\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"sse-vs-websockets-the-definitive-guide-with-examples-and-best-practices\"\n  }, \"SSE vs WebSockets: The Definitive Guide with Examples and Best Practices\"), mdx(\"h2\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"Real-time communication is a cornerstone of modern web applications, powering everything from live notifications and chat apps to collaborative editing and dashboards. Two of the most popular technologies for enabling real-time data exchange are Server-Sent Events (SSE) and WebSockets. While both are battle-tested and widely supported, they differ significantly in architecture, protocol, performance, and use cases. In this guide, I\\u2019ll provide an exhaustive technical deep-dive into SSE and WebSockets, including practical examples, performance considerations, best practices, common pitfalls, troubleshooting guides, and advanced concepts.\"), mdx(\"h2\", {\n    \"id\": \"what-are-websockets\"\n  }, \"What are WebSockets?\"), mdx(\"p\", null, \"WebSockets are a protocol that enables full-duplex, bi-directional communication between client and server over a single, long-lived TCP connection. Standardized in RFC 6455, WebSockets start as an HTTP connection and then upgrade to the WebSocket protocol via the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Upgrade\"), \" header. This allows for real-time data exchange without the overhead of repeated HTTP requests.\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Prefixes:\"), mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"ws://\"), \" for non-secure connections\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"wss://\"), \" for secure (TLS) connections\"))), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Ports:\"), \" Uses HTTP ports 80 (ws) and 443 (wss)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Message Types:\"), \" Supports both text and binary data\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Browser Support:\"), \" Universal\")), mdx(\"h3\", {\n    \"id\": \"minimal-websocket-example-nodejs--react\"\n  }, \"Minimal WebSocket Example (Node.js + React)\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Node.js Server:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"const WebSocket = require('ws');\\nconst wss = new WebSocket.Server({ port: 8080 });\\nwss.on('connection', ws => {\\n  ws.on('message', message => {\\n    console.log('received:', message);\\n    ws.send(`Echo: ${message}`);\\n  });\\n  ws.send('Welcome to WebSocket!');\\n});\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"React Client:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"const ws = new WebSocket('ws://localhost:8080');\\nws.onopen = () => ws.send('Hello Server!');\\nws.onmessage = event => console.log(event.data);\\n\")), mdx(\"h2\", {\n    \"id\": \"what-are-server-sent-events-sse\"\n  }, \"What are Server-Sent Events (SSE)?\"), mdx(\"p\", null, \"SSE is a browser-native technology for sending real-time updates from server to client over a single HTTP connection. Defined in the HTML5 spec, SSE uses the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"EventSource\"), \" API on the client and a simple text/event-stream protocol on the server. SSE is one-way: only the server can push events to the client.\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Protocol:\"), \" HTTP (supports HTTP/1.1 and HTTP/2)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Message Type:\"), \" UTF-8 encoded text\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Automatic Reconnection:\"), \" Built-in\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Stream Resume:\"), \" Built-in via Last-Event-ID\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Browser Support:\"), \" Most modern browsers\")), mdx(\"h3\", {\n    \"id\": \"minimal-sse-example-nodejs--react\"\n  }, \"Minimal SSE Example (Node.js + React)\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Node.js Server:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"const express = require('express');\\nconst app = express();\\napp.get('/events', (req, res) => {\\n  res.set({\\n    'Content-Type': 'text/event-stream',\\n    'Cache-Control': 'no-cache',\\n    'Connection': 'keep-alive',\\n  });\\n  res.flushHeaders();\\n  res.write('data: Welcome to SSE!\\\\n\\\\n');\\n  setInterval(() => {\\n    res.write(`data: ${new Date().toISOString()}\\\\n\\\\n`);\\n  }, 1000);\\n});\\napp.listen(3000);\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"React Client:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"const eventSource = new EventSource('http://localhost:3000/events');\\neventSource.onmessage = event => console.log(event.data);\\n\")), mdx(\"h2\", {\n    \"id\": \"detailed-comparison-sse-vs-websockets\"\n  }, \"Detailed Comparison: SSE vs WebSockets\"), mdx(\"h3\", {\n    \"id\": \"communication-direction\"\n  }, \"Communication Direction\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"SSE:\"), \" One-way (server \\u2192 client)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"WebSockets:\"), \" Two-way (client \\u2194 server)\")), mdx(\"h3\", {\n    \"id\": \"underlying-protocol\"\n  }, \"Underlying Protocol\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"SSE:\"), \" HTTP (works with HTTP/1.1 and HTTP/2)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"WebSockets:\"), \" Custom protocol, upgrades from HTTP\")), mdx(\"h3\", {\n    \"id\": \"security\"\n  }, \"Security\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"SSE:\"), \" Inherits HTTP security (same-origin, CORS, TLS)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"WebSockets:\"), \" No same-origin policy, vulnerable to CSRF-like attacks, must use origin checks and TLS\")), mdx(\"h3\", {\n    \"id\": \"simplicity\"\n  }, \"Simplicity\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"SSE:\"), \" Simple to set up, automatic reconnection and stream resume\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"WebSockets:\"), \" More complex, manual reconnection, state management\")), mdx(\"h3\", {\n    \"id\": \"performance\"\n  }, \"Performance\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"SSE:\"), \" Fire-and-forget, efficient for many clients, limited by text-only messages\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"WebSockets:\"), \" Handles high-frequency, bi-directional data, supports binary, but requires more server resources\")), mdx(\"h3\", {\n    \"id\": \"message-structure\"\n  }, \"Message Structure\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"SSE:\"), \" UTF-8 text only\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"WebSockets:\"), \" Text and binary (images, files, etc.)\")), mdx(\"h3\", {\n    \"id\": \"ease-of-adoption\"\n  }, \"Ease of Adoption\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"SSE:\"), \" Native browser support via EventSource, easy server setup\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"WebSockets:\"), \" Universal browser support, many libraries (Socket.io, ws, etc.)\")), mdx(\"h3\", {\n    \"id\": \"tooling\"\n  }, \"Tooling\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Testing:\"), \" Postman, JMeter, Gatling, k6, sse-perf\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Documentation:\"), \" AsyncAPI (not OpenAPI)\")), mdx(\"h2\", {\n    \"id\": \"best-practices\"\n  }, \"Best Practices\"), mdx(\"h3\", {\n    \"id\": \"when-to-use-sse-vs-websockets\"\n  }, \"When to Use SSE vs WebSockets\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Use Case\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"SSE\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"WebSockets\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Live notifications\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Chat apps\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Collaborative editing\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Real-time dashboards\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Streaming binary data\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"One-way updates\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Bi-directional comms\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\")))), mdx(\"h3\", {\n    \"id\": \"handling-reconnections\"\n  }, \"Handling Reconnections\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"SSE:\"), \" Automatic, with Last-Event-ID for resume\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"WebSockets:\"), \" Manual, use exponential backoff and state recovery\")), mdx(\"h3\", {\n    \"id\": \"scaling-and-resource-management\"\n  }, \"Scaling and Resource Management\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use load balancers that support sticky sessions for WebSockets\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"For SSE, leverage HTTP/2 multiplexing to avoid connection limits\")), mdx(\"h3\", {\n    \"id\": \"security-recommendations\"\n  }, \"Security Recommendations\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Always use TLS (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"wss://\"), \" or HTTPS)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"For WebSockets, validate origin and implement CSRF protection\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"For SSE, use CORS headers and secure cookies\")), mdx(\"h3\", {\n    \"id\": \"performance-tuning\"\n  }, \"Performance Tuning\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Benchmark with k6, Gatling, or JMeter\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Monitor connection counts and memory usage\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"For WebSockets, optimize message size and frequency\")), mdx(\"h2\", {\n    \"id\": \"real-world-use-cases\"\n  }, \"Real-World Use Cases\"), mdx(\"h3\", {\n    \"id\": \"live-notifications-sse\"\n  }, \"Live Notifications (SSE)\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Stock tickers, news feeds, system alerts\")), mdx(\"h3\", {\n    \"id\": \"chat-apps-websockets\"\n  }, \"Chat Apps (WebSockets)\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Real-time messaging, collaborative editing\")), mdx(\"h3\", {\n    \"id\": \"dashboards-both\"\n  }, \"Dashboards (Both)\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Live data updates, analytics\")), mdx(\"h3\", {\n    \"id\": \"collaborative-editing-websockets\"\n  }, \"Collaborative Editing (WebSockets)\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Google Docs-style apps\")), mdx(\"h2\", {\n    \"id\": \"troubleshooting--common-pitfalls\"\n  }, \"Troubleshooting & Common Pitfalls\"), mdx(\"h3\", {\n    \"id\": \"connection-limits\"\n  }, \"Connection Limits\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"SSE: HTTP/1.1 limits parallel connections; use HTTP/2\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"WebSockets: Server resource exhaustion; use connection pooling\")), mdx(\"h3\", {\n    \"id\": \"head-of-line-blocking\"\n  }, \"Head-of-Line Blocking\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"SSE: Mitigated by HTTP/2 multiplexing\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"WebSockets: Not an issue, but TCP-level blocking can occur\")), mdx(\"h3\", {\n    \"id\": \"network-issues\"\n  }, \"Network Issues\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Handle disconnects and retries gracefully\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Log and monitor connection health\")), mdx(\"h3\", {\n    \"id\": \"debugging-message-delivery\"\n  }, \"Debugging Message Delivery\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use browser dev tools, network inspectors\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"For WebSockets, log handshake and message events\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"For SSE, check event-stream formatting and headers\")), mdx(\"h2\", {\n    \"id\": \"advanced-concepts\"\n  }, \"Advanced Concepts\"), mdx(\"h3\", {\n    \"id\": \"http2-multiplexing-for-sse\"\n  }, \"HTTP/2 Multiplexing for SSE\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Allows many SSE connections without browser-imposed limits\")), mdx(\"h3\", {\n    \"id\": \"binary-data-streaming-with-websockets\"\n  }, \"Binary Data Streaming with WebSockets\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Send images, files, audio efficiently\")), mdx(\"h3\", {\n    \"id\": \"integrating-with-cloudserverless-platforms\"\n  }, \"Integrating with Cloud/Serverless Platforms\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use managed services (AWS API Gateway, Azure Web PubSub)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Consider scaling strategies for long-lived connections\")), mdx(\"h2\", {\n    \"id\": \"summary-table-key-differences\"\n  }, \"Summary Table: Key Differences\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Category\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"SSE\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"WebSockets\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Direction\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"One-way (server \\u2192 client)\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Two-way (client \\u2194 server)\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Protocol\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"HTTP\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Custom (upgrade from HTTP)\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Security\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"HTTP security\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Manual origin checks\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Simplicity\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Easy, auto-reconnect\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Complex, manual reconnect\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Performance\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text only, efficient\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text & binary, high freq.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Message Structure\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"UTF-8 text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text & binary\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Adoption\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Native EventSource\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Many libraries\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Tooling\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Postman, JMeter, Gatling\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Socket.io, ws, k6\")))), mdx(\"h2\", {\n    \"id\": \"conclusion--further-resources\"\n  }, \"Conclusion & Further Resources\"), mdx(\"p\", null, \"Both SSE and WebSockets are powerful tools for real-time communication, each with their own strengths and trade-offs. Choose SSE for simple, one-way updates and WebSockets for complex, bi-directional interactions. Always consider your app\\u2019s requirements, scalability, and security needs before deciding. For further reading and advanced guides, check out:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"MDN: Server-Sent Events\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"MDN: WebSockets\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://tools.ietf.org/html/rfc6455\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"RFC 6455: WebSocket Protocol\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.asyncapi.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"AsyncAPI\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://socket.io/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Socket.io\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://k6.io/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"k6\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://gatling.io/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Gatling\"))));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS","Nodejs","ReactIcon"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEcklEQVQ4y5WTeUyUVxTFv2hqW2sTo3SlTdAEgwUjCS6IGqfUOjjIYrEWtKLWJdGKIJUKEgFxQVOkTSBRGhUrS4I0qQQ0/YNGMBrAESwKyDYg22zMDIwgogR/fd8jaFeTvuTOu/Ny33nn3nM+5RliPZO/jKf/zCf2J0+e4HA4GB4epqKiAqvVytDQ0F/qlT9fmsgfP37MyMjI8/OxsTGZl5aW0tbWRlVVFedzcqi9c4fCwkvob99+OeCFCxe4ceOGzCfA1HXmTDYpKSmcPXuOpqYmDIZ2qm/d4tq1a7S2tska5d/ajIuL41JRkfw/Ojoqd7W1nPM5xMcnkJmZRUlJqQBppbq6mtzcvBeAE2A2m03OqM1gYMuWLaSnp/P06ejzh5KSkklLS+PUqVNER8dwIu2EYHqWxMREEhIOCsbNLxgODg6SI2bS1d1NQ0ODvPTTxYs0t7Rgt9sZGBigqOhnIiM3s39/HNnZP5KVlcVFUVNfX8+hQ0no9eNzVFQBMjIyRHxPd3cPlZVV1NbWikeGqKurw2y2SBHWrftcqlpTU8PJk98RG/sNWq0WDw8PXF1dKSsrGxelo6MDT09PZs+eJVuqrKyUtnj06JEURmVYUlLC6tU6weQQycnJHDt2nMDAQIKCgti1azebBXO9Xo/FYkXp7e3F3d1dhq+vL83NzVJZQ3s75eXlpKamcvTIUcG+mx07drD2szAOpx6Rs1MZ7tsXK1VWWzcajeMtBwcH4+LigmaFhq6uLtny1StXhccKKS4uprOzE6fTKc0cERGBj48P3t7egsASyd5kMgsLGeRdKUq28JdWG8C2bdt5IEZgNJok0HbBKL+gQM5QFUCd3+nTp3Fzc5OA4eHhNDY2YrZY6BGdWvv6xgHbRXubvtzExg0bhc/ihZqRMmbMmElUVJQEVFsymUzk5eUTFhbGBlEbGhrK5V8uy89RdYLahXJTDD4vN5e7QtHgNUEE6nQECgE+1miI2buXgvx8WoV9+oTCSUIU7/nziRbnV8RnqIKpd9XH+gWoCqzof7/LvgMJHE/PIObbeGLiDrBx6zb8NP6kpp2k5l4DI8L79w0dnBDWWhUYhPtHXhxMOczOPVEkHj5CXWMTLR2dGG12FGfKZowxwdwMmcf1EC/KAubwq78bvwW407ZzJcbYEB58HUBXlA5HYgSd0UEUr/iQbI8pFC5+i6r1C7HGr6d9jw7bwXBhm4WTsOvexxniRr//dAZWufAwdBbONR9gC3gXqzjrWzlThAvmJa9gXagwuGIqw/5vMqSZhsNvCuYFCtZFk+SumDTTsUUuoG+TD/YvPHGEe+HYvhTnbn/sXy3BttUXx9bF2ERu1bli8nsV49LXRbwmd9OyqZiXv/E8FJP2PSyfzMQiWLQumsJ9n8m0LpjMvXkKXcumiXMXsYtitebTt7Fo38Gy6r9DGe2381TE2MN+Kq6WErDcD5+5c4gMW8u5zB+ouV5Ob0uTrBkdENH/8lD427L1D9AjnF9/v4l7Ijp7evk/6w+cHbEsnYxFcwAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/481191268200c41bde3c6f108ae5ed24/a1946/sse.png","srcSet":"/static/481191268200c41bde3c6f108ae5ed24/5b37e/sse.png 236w,\n/static/481191268200c41bde3c6f108ae5ed24/49058/sse.png 472w,\n/static/481191268200c41bde3c6f108ae5ed24/a1946/sse.png 944w,\n/static/481191268200c41bde3c6f108ae5ed24/6050d/sse.png 1200w","srcWebp":"/static/481191268200c41bde3c6f108ae5ed24/99fbb/sse.webp","srcSetWebp":"/static/481191268200c41bde3c6f108ae5ed24/77392/sse.webp 236w,\n/static/481191268200c41bde3c6f108ae5ed24/1f177/sse.webp 472w,\n/static/481191268200c41bde3c6f108ae5ed24/99fbb/sse.webp 944w,\n/static/481191268200c41bde3c6f108ae5ed24/9000d/sse.webp 1200w","sizes":"(max-width: 944px) 100vw, 944px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M269%2011l-24%206c-13%202-15%204-10%205h4l-4%201c-3%200-4%201-4%207%200%204-1%206-2%206l-3%202-2%204c-2%202-2%204-2%2019l-1%2017h-3l-2%201-5%202-2%201%202%201%202%202v3c0%202%200%202-1%200-1-4-4-5-5-3l-3%202v2c1%204%201%205-1%207l-2%203c1%201%200%203-1%204l-1%203%201-3c0-3%200-3-1-2s-2%205-2%2015l-2%2017c-1%205-1%2014%202%2020v6c-2%204-5%202-6-2%200-5-5-8-5-4l-4%201c-5%200-5%200-5%203%200%202%201%203%203%204%202%200%203%201%203%202h-6l1%204c-2-2-10-1-10%202h-1l-1-1v2l-3%201h-2l-2%201h-1c2%201-7%203-10%202-2%200-2%200%200%201h-1l-6%201h-2l2%201c2%201%202%201-1%201-4-1-13%202-11%203h-2c-3%200-6%202-6%205v2l-1%204-2%202v-7l-1-4c0-2-2-4-5-4l1%208v4l1%202v1l-1%201%201%201v2c1-1%202%200%204%202l2%201%202-4%202-2c-1-5%200-7%202-7%201%201%201%201%200%200l1-1h4l24-8v3l-1%203-3%203-2%202-1%203-2%204c-2%200-2%201-2%203l-1%201c-2-1-1%201%201%202%201%202%205%202%207%201h1l2-1h1a1638%201638%200%20017-3l1-2%201-3v-1l3-5c1-4%203-5%205-6s2%200%202%208v10l-3%201a8989%208989%200%2001-81%2025c0-1%201-2%202-1%203%200%205-2%205-5-1-3-4-4-6-1-1%201-1%200-1-4v-61c0%203%203%204%205%202v-7c-1-1%201-1%207-3l6-3-10%202c-8%203-10%203-10%201l-2-4-2-3%205-2%2015-5%209-3v-13l4-1h9c6%200%208-1%206-3-1-2%200-3%202-2h3c1-3%209-3%2015-1s8%204%204%204c-2%200-2%203-1%205l-2%202c-5%202%201%201%207-1%2011-4%2011-5-3-10-5-1-8-3-8-4%200-2-5-5-8-5l-3-2-2-4c-2%200-4-4-3-5l-1-2c-2-2-2-2%200-4%203-3%202-9-1-10-2-1-2-2-2-10%200-6%200-8%202-8l1-5c0-4-1-5-4-6-2%200-3-1-3-2h-7c-6%200-6%200-6-2s1-3%202-3h8c1%201-7%202-8%201l-1%201%206%201c4%200%205-1%205-2-1-3-4-4-10-3-3%201-3%201-3%205%200%203%200%204-4%205s-4%202-4%205l2%205c2%202%201%2015-2%2017-2%201-3%2010-1%2012v3c-1%201-2%202-1%203%200%202-2%205-4%205l1%201%202%202c0%202-3%201-5-1H83l-2%201-7%203-5%202%204-1c3-1%207%200%207%202l6%202c5%200%206-1%204-2v-1l3%201%203%201%203%201-3%201c-2%200-2%200-1%201h5l2-1h3l7%201%203%201c0%201-8%205-9%204l-1%202-1%203v4c0%204-3%205-6%201-3-2-7-3-10-1v4c2%202%202%202%200%202s-2%200-1%201l1%201h-2l-2-1-2%201-2%201c-2%200-2%200-2%203l1%202-6-3-8-3h-1c1-1-15-8-16-7l-1-1-7-5c-8-4-8-4-2-5%203-1%203-1%203%201%200%203%2012%206%2015%204v-1c-12%200-16-2-13-4%201-1%206%200%206%201h9l2-4c0-2%200-2%206%200h1c0-1-1-2-3-2l-3-1%204-2%202-1-4%201c-3%201-4%200-3-4l-1-2-1%201c0%201-7%202-9%201s-2-1%203-2c4-2%204-2%201-1-8%201-9%201-9%207v5l-4%201c-13%203-15%205-15%2016%200%207-1%207-4%208l-3%202v19c0%2022%200%2021%204%2023%205%203%204%2010-1%2011-3%201-5%205-3%209%201%202%205%203%208%201%202-2%2014%206%2013%208h-5l-2-1-6%201%201%202c2%204%202%206%201%206l-2-2a535%20535%200%2001-1%202c1%205%203%206%208%204%207-3%2015%207%209%2010-2%201-2%201%200%201%204-1%205%201%201%201h-3c-1-1-1-1-2%201%200%201-1%202-3%202l-2%202c0%202-4%204-13%208-2%201-2%201%201%201s4%200%203-1h7c1%201%201%201%200%200-2-2-3-2%203-4l3%201h1v-2l1%202v3l1-3c0-3%200-3%201-1l1%203v-3l1-3v2l1%202v-2l1-1%201%204%201%204%201-3v-3l1%201%201%202h2l1%201c2%200%204%204%205%2010l1%204-1%203-4%201-3%201-3%202v-5l-4-10c-1-3-2-6-1-7h-1c-2%201-2%202%201%207%203%206%204%2016%202%2015h-2c0%203-2%200-2-3%200-4-3-12-4-11l1%204c2%204%202%2011%201%2013-1%201-2%200-2-4l-3-10%201%207v7c-1%202-3%200-3-2%200-5-8-18-11-18l-2-2c-2-1-2-1-5%202-2%202-2%203-2%209%201%206%204%2015%206%2015h2l-1%201c-2-1-1%201%201%202h2v1c-1%201%200%201%201%203%203%202%208%201%2015-2s8-3%208-1l1%206%202%203H0v75h30a764%20764%200%200140%203c1-1%201%200%201%201l1%201h2l1%201h1l1%201v1h1l1%201c1%200%204%201%203%202l1%201%203%201h1v2c2-1%205%201%204%202l3%201%201%201%202%201%202%201c1%201%204%200%2013-3l12-5%204%203c3%202%205%203%206%202v-2c-2-1-1-2%205-1l5%201h-5l-4%202-7%205c-7%203-7%204-7%206%200%203%202%204%205%207%206%203%2010%204%205%201s-9-7-9-8c0-2%205-4%2018-9l26-14-8%203c-5%203-6%204-6%202s-1-3-3%200c-2%201-4%201-3-2l2-1v-2c-1-1%203-3%2010-5l20-1-6%203-4%203%207-3%2014-4-9%205-9%205%2011-4c5-3%2011-5%2013-5s-2%202-13%208l-18%207c-3%200-1-2%203-4l3-2-15%207-8%204c-4%201-6%203-5%203l7-2%206-3%204%203%205%202-3-3c-4-2-5-5-3-5l1%201%208%204v-1c-1-2%207-6%2022-13l12-5%20100-1h100v-75h-15c-14%200-15%200-14-1v-2l-2%202-4%201c-3%200-3%200%203-4%204-1%207-3%207-4l2-1v2c-3%203-1%203%202%200%202-2%202-5%203-13a1701%201701%200%2000-1-130c-1-3-2-3-1%200%200%202-1%201-4-2l-8-5c-4%200-5-1-3-2l4%201%205%201-7-4-2-1-2-2c-3%200-4-5-2-5l4-2c2-3%202-3%202-15l1-15%201-4%203-4%202-1h-2c-4%202-5-1-5-16-1-13-2-20-4-17l-8%203c-7%201-8%202-6%202s-4%203-25%209c-25%207-31%2010-31%2012l3-1a479%20479%200%200163-17l-1%201-3%204-5%206v5l3%201c4-1%2010-4%209-5l3-3v23l1%2015c0%2012%200%2013-2%2014-3%202-4%200-2-3l3-6c0-3-2-7-3-6l-1-1h-5c-5%200-5%200-5%202s0%202-1%201-1-1-1%202v1c0-2-1-2-3%200-3%201-3%201-1%201s3%200%203%204l2%206-1%202h-2c-1%202-10%205-12%205l-1-3c0-5-1-6-3-4s-3%206-1%208l-9%204-10%203%202-4c1-3%201-3%203-1%202%201%205-1%205-4s-4-3-5%200l-1-3c-1-4-5-7-10-7h-2l3%201h-2c-3%200-4%200-6%203-2%202-3%204-2%205v7c0%203%200%205%201%204v-5l2%202c3%202%204%204%201%204l1%201c2%201%202%201-3%202l-6%201a1112%201112%200%20011-70c-3%200-4%207-4%2038a473%20473%200%2001-4-34l-4-3%201-1v-2l-2%201-3%203h-3l2-2%202-2-2-1h-4l-1-1v-3c-3%200-4%202-4%2012l-1%204c-2-1-2-13%200-16%202-2%203-3%209-3l1-7c0-7%200-8%202-8v-1c-2%200-2-1-1-1h7l-1-1h-3c-4-2-2-4%203-4s7%201%205%204c-1%202%200%204%204%204%203%200%207-2%206-4h-5l-1%201-2-1%201-1c3%200-1-3-5-4-5-2-5-2%202-4h7v1l2%201%202%201c2%200%202%200%201-1-3%200-2-2%201-2%202%200%202%200%201%202l1%202h2l-5%201h8c4-2%204-4%200-4-3-1-2-2%204-4%204-1%2015%200%2014%202v3c0%202-1%203-2%203-3%201-3%204%200%204l4%202%202-1c0-1%200-2%202-2v3h1l2-1v2c-2%201-2%201-1%202%202%202%202%202-5%204l-8%203c-4%202%202%201%2010-2s9-4%208-2l2%201%205-2c2%200%202%200%200-1-3-1-3-4%200-4%203-1%206%200%203%201-1%201-1%201%201%201%202-1%208%200%2012%202v-1l-6-3c-2%200-5-1-6-3l-6-3c-4%200-4%200-4-4s-1-4-7-4l-6-2h-5l-6-1c-1%201-4%200-7-1h-7c-3%201-4%201-4-5%200-7%200-7-9-7-7-1-10%200-21%203m-5%202c-29%207-29%207-26%208s5%201%2030-5c24-6%2023-6%2021-7s-4-1-25%204m1%205l-26%207-1%203v12h4l4-1-4%201c-4%201-5%203-2%203l6%202h3l1-1h2l4-1h5l-6%202-5%202%207%202c6%202%207%202%208%201%200-1%201-2%203-2l2-4c0-3%200-3-3-2h-3l3-1c5-2%205-7%200-7-3%200-3%200-2-1%202-2%200-1-9%201l-9%202%209-3%2016-5%2015-5-12%205c-4%201-2%203%203%203l2-2%204-3%206-2c2%200%203-13%201-13l-26%207m-33%2045c-2%202-3%209-1%208l1-3c0-1%200-2%201-1l3%201v1l2%201%202-1-1-1-2-1v-1l15%205%204%202v10c0%2010%200%2013%201%209%202-3%201-20%200-21l-16-6c-8-3-7-3-9-2m-119%201l1%201c2%200%202%201%202%206%200%2017%200%2016%203%2016s3%200%202-3l-1-4%204-1c3-1%205-1%204-2h-1l-1-2v-2c-2%200-5-3-5-5s-7-5-8-4m188%206v2l-1%201v1c-1%201-1%200-1-1l-1-1c-2%201-2%2010-1%2013%201%202%201%202-1%204-2%201-2%202-1%2012l1%2011s5-4%204-5%200-2%201-1l6-1%204-2-5%201h-4v-8c0-8%201-10%206-13v-1l-3%201h-1l-2-1c-3%200-3-2-2-4%202-1%204-1%202%201-1%201%200%202%202%200s1-3-1-4h-2l2-2%202-2-2-1h-2m50%201l-4%201h-3c-2%200-3%200-2%201s-7%204-9%203h-1l-2%201c-3%201-3%2021%200%2022%201%201%208%200%208-1l3-1%203-1h2l1-1h2l1-1h1l1-1v-2l1-3v-2c2-1%202-5%201-12%200-5-1-6-3-3m-114%208c1%201%200%202-2%200-1-1-12%200-12%201h1l4%202c2%203%203%205%200%203-1-1-1-1-1%201l3%206%201%206v-9l-1-3c1-1%203%204%203%208%201%204%201%205%203%203h1c1%201%201%201%202-1%200-2%201-3%202-3%202%200%201-4-1-8-2-5-2-6%201-3l2%208%201%204V84h1c0-2-2-3-2-2-1%201-1%201-2-1v-1l1-1-2-2v1h-1c-2-2-4-1-2%201m76%208c1%201-7%203-8%202l-1%206c0%206%200%207%202%207l10-4v-2l1%201c1%201%201-1%201-4l-1-6-3-1-1%201m-108%2014c-3%201-4%202-5%2010s0%209%205%208l5-1v-9c0-10%200-10-5-8m65%204c0%204-1%206-2%205l-1%201%201%202c2%200%202%200%200%202v2h1v2l-1%204-1%2019%201%2014%202-7a272%20272%200%20000-44m-39%2010l-2%202c2%200%203%202%202%203-1%202-6%201-7-1-2-2-9-3-10-1l-3%201-3%201-3%201c-3%201-4%201-4%203s0%202%203%202l5-2c3%200%203%200%201-2v-1c2%200%208%207%2011%2013%203%204%204%2010%205%2017v3h4l-1-1-1-2%202-1v-13l2%209c0%205%200%205%202%204l2-2%202-2%204-4%201-1%201%202c1%200%202%201%201%202%200%201%205%200%206-2s0-11-2-16l-2-5c1-1%205%209%206%2015%200%204%201%205%201%203%202-5-5-25-9-24-3%201-7%201-8-1h-6m-60%204c3%204%203%207-1%207-2%200-3%200-3%202%200%203%202%206%205%204%201-1%201%200%201%2013%200%205%200%207%201%206%202-1%201-29-1-32l-3-3%201%203m-144%200c-1%202%200%203%201%201%201-1%203%200%207%202l4%203c-1%201-2%200-3-1s-2-1-2%203v4l-1-5v-4l-2%205-1%206%203%201%203%201c0%203%202%201%202-2l1-3v3l1%205%201-5c-1-6-1-6%2010%200l13%205c4%200%2015%205%2018%208%204%205%204%207%204%2047l1%2038c1%200%201%202%201-42%200-40-1-44-4-47l-55-25-2%202m340%2014l-1%203-3%203-1%204%203%201-2%201c-4-1%200%203%206%206%207%203%207%205%207%2021l-1%2026-2%2011v-10c0-12-1-11-1%202v9c1-2%201-2%201%200l-1%204c-2%201-2%200-1-12l-1-13c-1%200-2%200-1-1l-1-1c-1%201-1-2-1-9%200-19-2-26-5-22l-5%201h-3v9l-2%2013-2%2012c-1%2011-2%2013-4%2013l-2-1%202-3c1-4%202-12%200-10-2%203-10%205-18%206h-8v3l-1%203c-3%200-1%206%202%207%204%201%2022%200%2020-1l1-2c1-2%202-2%202-1h3c0%203-9%207-16%208-3%201-2%201%204%203%208%203%2021%203%2028%202h1v1c3%201-5%203-11%203-10%200-17-1-28-6l-10-3v3c-1%203-1%203%206%206%206%202%208%204%207%204h1l2%201%204%203c9%205%2010%206%2010%2014l1%207c3%200-2%205-6%206-2%201-2%201%200%202l2%202%203%203%202%202-4%201c-5%202-5%202%201%205l4%202-7%203c-9%203-10%205-6%207%207%204%2015%203%2026-3l11-5-9%205c-6%204-8%205-6%205l11-4c7-4%208-5%2010-9l3-6%201-59a687%20687%200%2000-3-63c0-6-1-8-4-11-3-4-8-4-8-1m-220%205c-3%201-7%206-5%206l2%205c0%205%200%205%201%202l1-3v6l5-2c6-2%206-2%205-9s-2-8-9-5m-82%206v5l7%204c9%204%207%200%208%2030%201%2022%201%2023%202%208l1-12v14c0%207%200%2013-1%2012-1-2-3-1-4%203-2%203-2%204%201%205%202%201%203%203%201%203l-1-1c-1-1-1-1-1%201l-1-1c-1-2-1%200-1%205%200%206%200%207%202%208h2l1%201%202%202a585%20585%200%2000-1-73v-2l-1-2v-3l-1-2c0-2-2-3-9-7l-6-3v5m212-1c-1%202%200%207%201%207l1%201%201%201c2%201%202%2010-1%2010-1%200-1%201%201%203l2%202-3%203c-4%204-3%205%202%207%203%201%205%201%2015-3l10-4-9%203-8%202c-1-1-1-1%201-1v-1l-1-9a2524%202524%200%2000-2-14c-2%201-2%201-2%2012l-1%207v-23c1-1%200-2-2-3-4-2-5-2-5%200m38%2012v7c1%200%205-1%204-2h1l1-1v-1h6l5-1-5%203a61%2061%200%2000-8%203c-3%200-7%203-6%203v1a338%20338%200%200033-11v-5c0-2%200-2-2%200l-2%203-3%202-2%201h-2l-3-1%201-1v-2c0-2%200-2-1-1h-1l-1-1c-1%201-2%200-3-1v-2h-3l-2%201-2%201c-1-1-1-1%200%200l-1%201h-1c0%202-3%201-3-1v5m45-6l-1%201h2l1%201%201%202h1l1%201c1-2%203%201%203%205%200%203%200%204%202%204v1c-4%200-2%207%203%208%201%201%201%201-1%201-3%200-3%200-2%201s1%201-1%201v1c2%200%203%207%201%207-1%200-1%201%201%201v1l-2%201%205%202v-8c2%200%201-22-1-24s-9-7-10-6l-1-1h-2m-163%202l1%202c0%202%204%205%206%205l2%201c1%201%201%201-1%201-3%200-3%200-2%202%201%201%201%201-1%201l-2-1v48l5-1%2011-3c5-1%208-2%205-2-2%200-2-2-2-17l1-18h-5l-5-1c-1-1-1-1%202-1%204%201%2010-2%209-4s-4-2-4-1c0%202-3%201-4%200-1-2-2-2-2-1h-1l-2-2%201-1%202-2-3-2c-2-2-3-3-6-2l-3-1-1-2-1%202m147%209l-1%203c0%205-1%207-6%208-4%202-5%203-5%205l-1%203-2%204c0%204-2%206-6%207l-2%202c0%202%2010%202%2017%200%208-3%209-5%209-14l-1-13c0-6-1-7-2-5m-120%208l-2%2018c0%2020-1%2019%209%2016%207-2%209-3%207-1h4c1-1%201-1-1-1-3%200-2%200%205-3l-5%201c-8%202-8%201%200-2l8-3-8-4c-10-4-10-5-10-9s0-5-3-6c-2-1-3-3-3-5l-1-1m-29%207c0%205-1%205-2%206-2%202-7%200-7-1v-1l-3-1c-7-3-7-2-8%2012-1%2013-1%2016-5%2016-3%201-4%206-1%206l3%205c0%203%200%203%203%202%202%200%202%200%201%201-2%202%200%201%208-1%204-2%206-3%204-3s-2%200%202-2l5-2c2-1%202-3%201-20a222%20222%200%2000-1-17M47%20206l2%204%208%204%2017%2011c1%201%201%200%201-5v-6l-1%205-1%203c0-5-1-6-8-8l-9-5h-2l-2-1c-1-1-2-2-3-1v-1l-1-1c-1-1-1%200-1%201m197-1l-12%203-10%203v5c-2%2011-9%2023-15%2028-4%203-7%204-3%201l1-2%201-3%203-1h1v-1l1-1c-1-2%200-4%201-2%201%201%201%201%201-1v-1c1%201%201%201%201-1v-1c1%201%201%201%201-1l2-9c2-9%202-9-9-5l-8%203-2%205c-2%2011-8%2018-17%2021-3%201-5%203-5%204%200%203-12-1-15-5h-1v-1l-1-2c-3%200-6%209-3%209l2%201%202%202%201-2%201-1c2%200%203%203%201%203-1%200-1%201%201%204l2%202%2012-4c7-3%2013-5%2014-4v-1h1c2%200%202%200%201-1h2c2%201-5%205-20%2011l-8%203%206%2011%201%204%201%201h1v1c1-1%203%202%202%203l1%201h2v1c-1%201-1%201%201%201l6-2c2%200%202%200%201%201h28c1-1%201-1%200%200s2%201%2012%201h13l3-3%203-4-3-1c-2-1-2-1-1-2v-1l-5%202c-2%200-2%200%201-1l3-3-3-1h-2c3-2-1-2-6%200l-5%202-1%201h6l-15%206%204-2c5-2%205-2%204-4l-1-2-1-1-1%201-1%201-1-1h-2v-2l2-3-2%202c-3%202-5%203-3%201v-2l1-1%201-2h-1l-1-1c0-1%204-3%205-2l1-2-1-2v-1h1l1-2%201-14%205-3c2-1%203-1%202-2s-1-1%201-2v-3l3-1%201%201v5h3v-1l5-3c4-2%205-4%202-5-2-1-2-1%200-1l3%201h3c2%200%202-1%202-7%201-9%201-9-3-11-3-1-4-2-4-4-1-2-1-2-3-1m-57%2018l-11%203c-3%201-3%202-3%205%200%202%200%203-2%204l-3%201c0%202-4%205-4%204l-1%201%202%203c2%201%202%201%205-1%202-2%203-2%205-1%205%204%2018-8%2020-19%201-4%202-4-8%200m106%200c-2%200-2%201-2%204%200%204%200%204-1%201%200-3%200-4-3-3l-1%201-1%201v11l1-1h2l2-2%201-1h3c2-1%202-1%201-2v-2l1-4c0-3-1-3-3-3m37%2010v1h-2l-5%201h-7c-1%201%200%201%201%201v1c-2%200-2%201-1%201%202%200%201%202-1%202h-6l1-2h-1l-4%201-3%201-6%202c-5%200-10%202-12%204-2%201-1%203%201%201h1l4%201%205-1-4%201c-4%202-15%202-16%200l-2-1-1-1%202-1h1l-1-2c-7%202-8%205-2%207l5%201%203%203c3%203%201%203-4%200s-10-5-8-3l5%203c7%204%207%204%206%2013-1%204%200%209%202%2010l12-4%2010-3v-8c-1-7-1-8%201-8h1c0-1%204-2%205-1h2c0-2%200-2%201-1h3l1-2h2c0-2%200-2%201-1l2%201%201-1c-1-3%201-3%202-1%201%201%201%201%201-1l1-2c1%200%201%202-1%205v8l-1-3c0-3-1-4-4-2-2%201-3%202-3%205v4l-1-4-1-3-1%205-1%202c-1-1-2%200-2%201l1%201%201%201%203%202%203%201%201-1v1l2%201c1-1%202-1%201%202l1%203%202-2%201-2h1l2%201%201%201h2c-1%202%200%202%201%202%204%200%202-4-1-5h-4l-1-1h-2c-2%200-2%200%201-1%203-2%207-3%204-1v1c2%201%203%200%201-3l-1-1h-4c-2-1%201-4%204-5l7-2c4-1%204-1%204-6a149%20149%200%20010-12l-20%207-9%201%206-2c18-7%2021-8%2020-9l-3-1c-2%200-2%200-1%201%202%200-1%202-8%204-13%205-14%205-11%202l3-2v-1h4l2-1h2l4-2c2-1%203-2%201-2h-3m-98%209c-2%201-3%202-2%203h-1c-1-2-2%201-2%206v6h2l1%201v-3h4v-2c-2-1-2-2-1-2h1c-1-1-1-1%201-1h1v-1c1%200%203%202%203%205%201%201%201%200%201-2%200-3%200-4-2-3v-1c4-2%202-4-3-4v-3l-3%201m-70%2023c-4%201-4%203-3%2012%202%208%203%209%2012%209l7-1-5-8-6-8c0-3-3-5-5-4m-99%204a100%20100%200%20015%2016l2-1%201-2h1l1%201%201-1v-1l1-1v-2l1-1v-3c3-1-2-5-8-5h-5m89%200l-1%205c0%205-2%207-7%207-3%200-4%201-6%203l-2%202h2l8-2c3-2%204-2%205-1v2l5%201c3%200%203%200%202-3l-3-9c0-6-2-8-3-5m-53%2047l2%208c2%208%203%209%205%203%202-9%203-9%204-2%202%208%204%207%206-2l1-8-3%206c-1%207-1%207-3%201-2-8-4-9-5-2-2%208-2%208-4%201-1-5-3-8-3-5m34%207v8h4c4%200%205-1%205-3%202-5%200-9-4-8-2%200-3-1-3-3l-1-2-1%208m28-2l-2%204c0%206%207%208%2010%203%203-6-4-12-8-7'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEcklEQVQ4y5WTeUyUVxTFv2hqW2sTo3SlTdAEgwUjCS6IGqfUOjjIYrEWtKLWJdGKIJUKEgFxQVOkTSBRGhUrS4I0qQQ0/YNGMBrAESwKyDYg22zMDIwgogR/fd8jaFeTvuTOu/Ny33nn3nM+5RliPZO/jKf/zCf2J0+e4HA4GB4epqKiAqvVytDQ0F/qlT9fmsgfP37MyMjI8/OxsTGZl5aW0tbWRlVVFedzcqi9c4fCwkvob99+OeCFCxe4ceOGzCfA1HXmTDYpKSmcPXuOpqYmDIZ2qm/d4tq1a7S2tska5d/ajIuL41JRkfw/Ojoqd7W1nPM5xMcnkJmZRUlJqQBppbq6mtzcvBeAE2A2m03OqM1gYMuWLaSnp/P06ejzh5KSkklLS+PUqVNER8dwIu2EYHqWxMREEhIOCsbNLxgODg6SI2bS1d1NQ0ODvPTTxYs0t7Rgt9sZGBigqOhnIiM3s39/HNnZP5KVlcVFUVNfX8+hQ0no9eNzVFQBMjIyRHxPd3cPlZVV1NbWikeGqKurw2y2SBHWrftcqlpTU8PJk98RG/sNWq0WDw8PXF1dKSsrGxelo6MDT09PZs+eJVuqrKyUtnj06JEURmVYUlLC6tU6weQQycnJHDt2nMDAQIKCgti1azebBXO9Xo/FYkXp7e3F3d1dhq+vL83NzVJZQ3s75eXlpKamcvTIUcG+mx07drD2szAOpx6Rs1MZ7tsXK1VWWzcajeMtBwcH4+LigmaFhq6uLtny1StXhccKKS4uprOzE6fTKc0cERGBj48P3t7egsASyd5kMgsLGeRdKUq28JdWG8C2bdt5IEZgNJok0HbBKL+gQM5QFUCd3+nTp3Fzc5OA4eHhNDY2YrZY6BGdWvv6xgHbRXubvtzExg0bhc/ihZqRMmbMmElUVJQEVFsymUzk5eUTFhbGBlEbGhrK5V8uy89RdYLahXJTDD4vN5e7QtHgNUEE6nQECgE+1miI2buXgvx8WoV9+oTCSUIU7/nziRbnV8RnqIKpd9XH+gWoCqzof7/LvgMJHE/PIObbeGLiDrBx6zb8NP6kpp2k5l4DI8L79w0dnBDWWhUYhPtHXhxMOczOPVEkHj5CXWMTLR2dGG12FGfKZowxwdwMmcf1EC/KAubwq78bvwW407ZzJcbYEB58HUBXlA5HYgSd0UEUr/iQbI8pFC5+i6r1C7HGr6d9jw7bwXBhm4WTsOvexxniRr//dAZWufAwdBbONR9gC3gXqzjrWzlThAvmJa9gXagwuGIqw/5vMqSZhsNvCuYFCtZFk+SumDTTsUUuoG+TD/YvPHGEe+HYvhTnbn/sXy3BttUXx9bF2ERu1bli8nsV49LXRbwmd9OyqZiXv/E8FJP2PSyfzMQiWLQumsJ9n8m0LpjMvXkKXcumiXMXsYtitebTt7Fo38Gy6r9DGe2381TE2MN+Kq6WErDcD5+5c4gMW8u5zB+ouV5Ob0uTrBkdENH/8lD427L1D9AjnF9/v4l7Ijp7evk/6w+cHbEsnYxFcwAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/481191268200c41bde3c6f108ae5ed24/3ddd4/sse.png","srcSet":"/static/481191268200c41bde3c6f108ae5ed24/078a8/sse.png 163w,\n/static/481191268200c41bde3c6f108ae5ed24/e56da/sse.png 327w,\n/static/481191268200c41bde3c6f108ae5ed24/3ddd4/sse.png 653w,\n/static/481191268200c41bde3c6f108ae5ed24/c5cc7/sse.png 980w,\n/static/481191268200c41bde3c6f108ae5ed24/6050d/sse.png 1200w","srcWebp":"/static/481191268200c41bde3c6f108ae5ed24/0acdf/sse.webp","srcSetWebp":"/static/481191268200c41bde3c6f108ae5ed24/ac59e/sse.webp 163w,\n/static/481191268200c41bde3c6f108ae5ed24/7660b/sse.webp 327w,\n/static/481191268200c41bde3c6f108ae5ed24/0acdf/sse.webp 653w,\n/static/481191268200c41bde3c6f108ae5ed24/75470/sse.webp 980w,\n/static/481191268200c41bde3c6f108ae5ed24/9000d/sse.webp 1200w","sizes":"(max-width: 653px) 100vw, 653px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M269%2011l-24%206c-13%202-15%204-10%205h4l-4%201c-3%200-4%201-4%207%200%204-1%206-2%206l-3%202-2%204c-2%202-2%204-2%2019l-1%2017h-3l-2%201-5%202-2%201%202%201%202%202v3c0%202%200%202-1%200-1-4-4-5-5-3l-3%202v2c1%204%201%205-1%207l-2%203c1%201%200%203-1%204l-1%203%201-3c0-3%200-3-1-2s-2%205-2%2015l-2%2017c-1%205-1%2014%202%2020v6c-2%204-5%202-6-2%200-5-5-8-5-4l-4%201c-5%200-5%200-5%203%200%202%201%203%203%204%202%200%203%201%203%202h-6l1%204c-2-2-10-1-10%202h-1l-1-1v2l-3%201h-2l-2%201h-1c2%201-7%203-10%202-2%200-2%200%200%201h-1l-6%201h-2l2%201c2%201%202%201-1%201-4-1-13%202-11%203h-2c-3%200-6%202-6%205v2l-1%204-2%202v-7l-1-4c0-2-2-4-5-4l1%208v4l1%202v1l-1%201%201%201v2c1-1%202%200%204%202l2%201%202-4%202-2c-1-5%200-7%202-7%201%201%201%201%200%200l1-1h4l24-8v3l-1%203-3%203-2%202-1%203-2%204c-2%200-2%201-2%203l-1%201c-2-1-1%201%201%202%201%202%205%202%207%201h1l2-1h1a1638%201638%200%20017-3l1-2%201-3v-1l3-5c1-4%203-5%205-6s2%200%202%208v10l-3%201a8989%208989%200%2001-81%2025c0-1%201-2%202-1%203%200%205-2%205-5-1-3-4-4-6-1-1%201-1%200-1-4v-61c0%203%203%204%205%202v-7c-1-1%201-1%207-3l6-3-10%202c-8%203-10%203-10%201l-2-4-2-3%205-2%2015-5%209-3v-13l4-1h9c6%200%208-1%206-3-1-2%200-3%202-2h3c1-3%209-3%2015-1s8%204%204%204c-2%200-2%203-1%205l-2%202c-5%202%201%201%207-1%2011-4%2011-5-3-10-5-1-8-3-8-4%200-2-5-5-8-5l-3-2-2-4c-2%200-4-4-3-5l-1-2c-2-2-2-2%200-4%203-3%202-9-1-10-2-1-2-2-2-10%200-6%200-8%202-8l1-5c0-4-1-5-4-6-2%200-3-1-3-2h-7c-6%200-6%200-6-2s1-3%202-3h8c1%201-7%202-8%201l-1%201%206%201c4%200%205-1%205-2-1-3-4-4-10-3-3%201-3%201-3%205%200%203%200%204-4%205s-4%202-4%205l2%205c2%202%201%2015-2%2017-2%201-3%2010-1%2012v3c-1%201-2%202-1%203%200%202-2%205-4%205l1%201%202%202c0%202-3%201-5-1H83l-2%201-7%203-5%202%204-1c3-1%207%200%207%202l6%202c5%200%206-1%204-2v-1l3%201%203%201%203%201-3%201c-2%200-2%200-1%201h5l2-1h3l7%201%203%201c0%201-8%205-9%204l-1%202-1%203v4c0%204-3%205-6%201-3-2-7-3-10-1v4c2%202%202%202%200%202s-2%200-1%201l1%201h-2l-2-1-2%201-2%201c-2%200-2%200-2%203l1%202-6-3-8-3h-1c1-1-15-8-16-7l-1-1-7-5c-8-4-8-4-2-5%203-1%203-1%203%201%200%203%2012%206%2015%204v-1c-12%200-16-2-13-4%201-1%206%200%206%201h9l2-4c0-2%200-2%206%200h1c0-1-1-2-3-2l-3-1%204-2%202-1-4%201c-3%201-4%200-3-4l-1-2-1%201c0%201-7%202-9%201s-2-1%203-2c4-2%204-2%201-1-8%201-9%201-9%207v5l-4%201c-13%203-15%205-15%2016%200%207-1%207-4%208l-3%202v19c0%2022%200%2021%204%2023%205%203%204%2010-1%2011-3%201-5%205-3%209%201%202%205%203%208%201%202-2%2014%206%2013%208h-5l-2-1-6%201%201%202c2%204%202%206%201%206l-2-2a535%20535%200%2001-1%202c1%205%203%206%208%204%207-3%2015%207%209%2010-2%201-2%201%200%201%204-1%205%201%201%201h-3c-1-1-1-1-2%201%200%201-1%202-3%202l-2%202c0%202-4%204-13%208-2%201-2%201%201%201s4%200%203-1h7c1%201%201%201%200%200-2-2-3-2%203-4l3%201h1v-2l1%202v3l1-3c0-3%200-3%201-1l1%203v-3l1-3v2l1%202v-2l1-1%201%204%201%204%201-3v-3l1%201%201%202h2l1%201c2%200%204%204%205%2010l1%204-1%203-4%201-3%201-3%202v-5l-4-10c-1-3-2-6-1-7h-1c-2%201-2%202%201%207%203%206%204%2016%202%2015h-2c0%203-2%200-2-3%200-4-3-12-4-11l1%204c2%204%202%2011%201%2013-1%201-2%200-2-4l-3-10%201%207v7c-1%202-3%200-3-2%200-5-8-18-11-18l-2-2c-2-1-2-1-5%202-2%202-2%203-2%209%201%206%204%2015%206%2015h2l-1%201c-2-1-1%201%201%202h2v1c-1%201%200%201%201%203%203%202%208%201%2015-2s8-3%208-1l1%206%202%203H0v75h30a764%20764%200%200140%203c1-1%201%200%201%201l1%201h2l1%201h1l1%201v1h1l1%201c1%200%204%201%203%202l1%201%203%201h1v2c2-1%205%201%204%202l3%201%201%201%202%201%202%201c1%201%204%200%2013-3l12-5%204%203c3%202%205%203%206%202v-2c-2-1-1-2%205-1l5%201h-5l-4%202-7%205c-7%203-7%204-7%206%200%203%202%204%205%207%206%203%2010%204%205%201s-9-7-9-8c0-2%205-4%2018-9l26-14-8%203c-5%203-6%204-6%202s-1-3-3%200c-2%201-4%201-3-2l2-1v-2c-1-1%203-3%2010-5l20-1-6%203-4%203%207-3%2014-4-9%205-9%205%2011-4c5-3%2011-5%2013-5s-2%202-13%208l-18%207c-3%200-1-2%203-4l3-2-15%207-8%204c-4%201-6%203-5%203l7-2%206-3%204%203%205%202-3-3c-4-2-5-5-3-5l1%201%208%204v-1c-1-2%207-6%2022-13l12-5%20100-1h100v-75h-15c-14%200-15%200-14-1v-2l-2%202-4%201c-3%200-3%200%203-4%204-1%207-3%207-4l2-1v2c-3%203-1%203%202%200%202-2%202-5%203-13a1701%201701%200%2000-1-130c-1-3-2-3-1%200%200%202-1%201-4-2l-8-5c-4%200-5-1-3-2l4%201%205%201-7-4-2-1-2-2c-3%200-4-5-2-5l4-2c2-3%202-3%202-15l1-15%201-4%203-4%202-1h-2c-4%202-5-1-5-16-1-13-2-20-4-17l-8%203c-7%201-8%202-6%202s-4%203-25%209c-25%207-31%2010-31%2012l3-1a479%20479%200%200163-17l-1%201-3%204-5%206v5l3%201c4-1%2010-4%209-5l3-3v23l1%2015c0%2012%200%2013-2%2014-3%202-4%200-2-3l3-6c0-3-2-7-3-6l-1-1h-5c-5%200-5%200-5%202s0%202-1%201-1-1-1%202v1c0-2-1-2-3%200-3%201-3%201-1%201s3%200%203%204l2%206-1%202h-2c-1%202-10%205-12%205l-1-3c0-5-1-6-3-4s-3%206-1%208l-9%204-10%203%202-4c1-3%201-3%203-1%202%201%205-1%205-4s-4-3-5%200l-1-3c-1-4-5-7-10-7h-2l3%201h-2c-3%200-4%200-6%203-2%202-3%204-2%205v7c0%203%200%205%201%204v-5l2%202c3%202%204%204%201%204l1%201c2%201%202%201-3%202l-6%201a1112%201112%200%20011-70c-3%200-4%207-4%2038a473%20473%200%2001-4-34l-4-3%201-1v-2l-2%201-3%203h-3l2-2%202-2-2-1h-4l-1-1v-3c-3%200-4%202-4%2012l-1%204c-2-1-2-13%200-16%202-2%203-3%209-3l1-7c0-7%200-8%202-8v-1c-2%200-2-1-1-1h7l-1-1h-3c-4-2-2-4%203-4s7%201%205%204c-1%202%200%204%204%204%203%200%207-2%206-4h-5l-1%201-2-1%201-1c3%200-1-3-5-4-5-2-5-2%202-4h7v1l2%201%202%201c2%200%202%200%201-1-3%200-2-2%201-2%202%200%202%200%201%202l1%202h2l-5%201h8c4-2%204-4%200-4-3-1-2-2%204-4%204-1%2015%200%2014%202v3c0%202-1%203-2%203-3%201-3%204%200%204l4%202%202-1c0-1%200-2%202-2v3h1l2-1v2c-2%201-2%201-1%202%202%202%202%202-5%204l-8%203c-4%202%202%201%2010-2s9-4%208-2l2%201%205-2c2%200%202%200%200-1-3-1-3-4%200-4%203-1%206%200%203%201-1%201-1%201%201%201%202-1%208%200%2012%202v-1l-6-3c-2%200-5-1-6-3l-6-3c-4%200-4%200-4-4s-1-4-7-4l-6-2h-5l-6-1c-1%201-4%200-7-1h-7c-3%201-4%201-4-5%200-7%200-7-9-7-7-1-10%200-21%203m-5%202c-29%207-29%207-26%208s5%201%2030-5c24-6%2023-6%2021-7s-4-1-25%204m1%205l-26%207-1%203v12h4l4-1-4%201c-4%201-5%203-2%203l6%202h3l1-1h2l4-1h5l-6%202-5%202%207%202c6%202%207%202%208%201%200-1%201-2%203-2l2-4c0-3%200-3-3-2h-3l3-1c5-2%205-7%200-7-3%200-3%200-2-1%202-2%200-1-9%201l-9%202%209-3%2016-5%2015-5-12%205c-4%201-2%203%203%203l2-2%204-3%206-2c2%200%203-13%201-13l-26%207m-33%2045c-2%202-3%209-1%208l1-3c0-1%200-2%201-1l3%201v1l2%201%202-1-1-1-2-1v-1l15%205%204%202v10c0%2010%200%2013%201%209%202-3%201-20%200-21l-16-6c-8-3-7-3-9-2m-119%201l1%201c2%200%202%201%202%206%200%2017%200%2016%203%2016s3%200%202-3l-1-4%204-1c3-1%205-1%204-2h-1l-1-2v-2c-2%200-5-3-5-5s-7-5-8-4m188%206v2l-1%201v1c-1%201-1%200-1-1l-1-1c-2%201-2%2010-1%2013%201%202%201%202-1%204-2%201-2%202-1%2012l1%2011s5-4%204-5%200-2%201-1l6-1%204-2-5%201h-4v-8c0-8%201-10%206-13v-1l-3%201h-1l-2-1c-3%200-3-2-2-4%202-1%204-1%202%201-1%201%200%202%202%200s1-3-1-4h-2l2-2%202-2-2-1h-2m50%201l-4%201h-3c-2%200-3%200-2%201s-7%204-9%203h-1l-2%201c-3%201-3%2021%200%2022%201%201%208%200%208-1l3-1%203-1h2l1-1h2l1-1h1l1-1v-2l1-3v-2c2-1%202-5%201-12%200-5-1-6-3-3m-114%208c1%201%200%202-2%200-1-1-12%200-12%201h1l4%202c2%203%203%205%200%203-1-1-1-1-1%201l3%206%201%206v-9l-1-3c1-1%203%204%203%208%201%204%201%205%203%203h1c1%201%201%201%202-1%200-2%201-3%202-3%202%200%201-4-1-8-2-5-2-6%201-3l2%208%201%204V84h1c0-2-2-3-2-2-1%201-1%201-2-1v-1l1-1-2-2v1h-1c-2-2-4-1-2%201m76%208c1%201-7%203-8%202l-1%206c0%206%200%207%202%207l10-4v-2l1%201c1%201%201-1%201-4l-1-6-3-1-1%201m-108%2014c-3%201-4%202-5%2010s0%209%205%208l5-1v-9c0-10%200-10-5-8m65%204c0%204-1%206-2%205l-1%201%201%202c2%200%202%200%200%202v2h1v2l-1%204-1%2019%201%2014%202-7a272%20272%200%20000-44m-39%2010l-2%202c2%200%203%202%202%203-1%202-6%201-7-1-2-2-9-3-10-1l-3%201-3%201-3%201c-3%201-4%201-4%203s0%202%203%202l5-2c3%200%203%200%201-2v-1c2%200%208%207%2011%2013%203%204%204%2010%205%2017v3h4l-1-1-1-2%202-1v-13l2%209c0%205%200%205%202%204l2-2%202-2%204-4%201-1%201%202c1%200%202%201%201%202%200%201%205%200%206-2s0-11-2-16l-2-5c1-1%205%209%206%2015%200%204%201%205%201%203%202-5-5-25-9-24-3%201-7%201-8-1h-6m-60%204c3%204%203%207-1%207-2%200-3%200-3%202%200%203%202%206%205%204%201-1%201%200%201%2013%200%205%200%207%201%206%202-1%201-29-1-32l-3-3%201%203m-144%200c-1%202%200%203%201%201%201-1%203%200%207%202l4%203c-1%201-2%200-3-1s-2-1-2%203v4l-1-5v-4l-2%205-1%206%203%201%203%201c0%203%202%201%202-2l1-3v3l1%205%201-5c-1-6-1-6%2010%200l13%205c4%200%2015%205%2018%208%204%205%204%207%204%2047l1%2038c1%200%201%202%201-42%200-40-1-44-4-47l-55-25-2%202m340%2014l-1%203-3%203-1%204%203%201-2%201c-4-1%200%203%206%206%207%203%207%205%207%2021l-1%2026-2%2011v-10c0-12-1-11-1%202v9c1-2%201-2%201%200l-1%204c-2%201-2%200-1-12l-1-13c-1%200-2%200-1-1l-1-1c-1%201-1-2-1-9%200-19-2-26-5-22l-5%201h-3v9l-2%2013-2%2012c-1%2011-2%2013-4%2013l-2-1%202-3c1-4%202-12%200-10-2%203-10%205-18%206h-8v3l-1%203c-3%200-1%206%202%207%204%201%2022%200%2020-1l1-2c1-2%202-2%202-1h3c0%203-9%207-16%208-3%201-2%201%204%203%208%203%2021%203%2028%202h1v1c3%201-5%203-11%203-10%200-17-1-28-6l-10-3v3c-1%203-1%203%206%206%206%202%208%204%207%204h1l2%201%204%203c9%205%2010%206%2010%2014l1%207c3%200-2%205-6%206-2%201-2%201%200%202l2%202%203%203%202%202-4%201c-5%202-5%202%201%205l4%202-7%203c-9%203-10%205-6%207%207%204%2015%203%2026-3l11-5-9%205c-6%204-8%205-6%205l11-4c7-4%208-5%2010-9l3-6%201-59a687%20687%200%2000-3-63c0-6-1-8-4-11-3-4-8-4-8-1m-220%205c-3%201-7%206-5%206l2%205c0%205%200%205%201%202l1-3v6l5-2c6-2%206-2%205-9s-2-8-9-5m-82%206v5l7%204c9%204%207%200%208%2030%201%2022%201%2023%202%208l1-12v14c0%207%200%2013-1%2012-1-2-3-1-4%203-2%203-2%204%201%205%202%201%203%203%201%203l-1-1c-1-1-1-1-1%201l-1-1c-1-2-1%200-1%205%200%206%200%207%202%208h2l1%201%202%202a585%20585%200%2000-1-73v-2l-1-2v-3l-1-2c0-2-2-3-9-7l-6-3v5m212-1c-1%202%200%207%201%207l1%201%201%201c2%201%202%2010-1%2010-1%200-1%201%201%203l2%202-3%203c-4%204-3%205%202%207%203%201%205%201%2015-3l10-4-9%203-8%202c-1-1-1-1%201-1v-1l-1-9a2524%202524%200%2000-2-14c-2%201-2%201-2%2012l-1%207v-23c1-1%200-2-2-3-4-2-5-2-5%200m38%2012v7c1%200%205-1%204-2h1l1-1v-1h6l5-1-5%203a61%2061%200%2000-8%203c-3%200-7%203-6%203v1a338%20338%200%200033-11v-5c0-2%200-2-2%200l-2%203-3%202-2%201h-2l-3-1%201-1v-2c0-2%200-2-1-1h-1l-1-1c-1%201-2%200-3-1v-2h-3l-2%201-2%201c-1-1-1-1%200%200l-1%201h-1c0%202-3%201-3-1v5m45-6l-1%201h2l1%201%201%202h1l1%201c1-2%203%201%203%205%200%203%200%204%202%204v1c-4%200-2%207%203%208%201%201%201%201-1%201-3%200-3%200-2%201s1%201-1%201v1c2%200%203%207%201%207-1%200-1%201%201%201v1l-2%201%205%202v-8c2%200%201-22-1-24s-9-7-10-6l-1-1h-2m-163%202l1%202c0%202%204%205%206%205l2%201c1%201%201%201-1%201-3%200-3%200-2%202%201%201%201%201-1%201l-2-1v48l5-1%2011-3c5-1%208-2%205-2-2%200-2-2-2-17l1-18h-5l-5-1c-1-1-1-1%202-1%204%201%2010-2%209-4s-4-2-4-1c0%202-3%201-4%200-1-2-2-2-2-1h-1l-2-2%201-1%202-2-3-2c-2-2-3-3-6-2l-3-1-1-2-1%202m147%209l-1%203c0%205-1%207-6%208-4%202-5%203-5%205l-1%203-2%204c0%204-2%206-6%207l-2%202c0%202%2010%202%2017%200%208-3%209-5%209-14l-1-13c0-6-1-7-2-5m-120%208l-2%2018c0%2020-1%2019%209%2016%207-2%209-3%207-1h4c1-1%201-1-1-1-3%200-2%200%205-3l-5%201c-8%202-8%201%200-2l8-3-8-4c-10-4-10-5-10-9s0-5-3-6c-2-1-3-3-3-5l-1-1m-29%207c0%205-1%205-2%206-2%202-7%200-7-1v-1l-3-1c-7-3-7-2-8%2012-1%2013-1%2016-5%2016-3%201-4%206-1%206l3%205c0%203%200%203%203%202%202%200%202%200%201%201-2%202%200%201%208-1%204-2%206-3%204-3s-2%200%202-2l5-2c2-1%202-3%201-20a222%20222%200%2000-1-17M47%20206l2%204%208%204%2017%2011c1%201%201%200%201-5v-6l-1%205-1%203c0-5-1-6-8-8l-9-5h-2l-2-1c-1-1-2-2-3-1v-1l-1-1c-1-1-1%200-1%201m197-1l-12%203-10%203v5c-2%2011-9%2023-15%2028-4%203-7%204-3%201l1-2%201-3%203-1h1v-1l1-1c-1-2%200-4%201-2%201%201%201%201%201-1v-1c1%201%201%201%201-1v-1c1%201%201%201%201-1l2-9c2-9%202-9-9-5l-8%203-2%205c-2%2011-8%2018-17%2021-3%201-5%203-5%204%200%203-12-1-15-5h-1v-1l-1-2c-3%200-6%209-3%209l2%201%202%202%201-2%201-1c2%200%203%203%201%203-1%200-1%201%201%204l2%202%2012-4c7-3%2013-5%2014-4v-1h1c2%200%202%200%201-1h2c2%201-5%205-20%2011l-8%203%206%2011%201%204%201%201h1v1c1-1%203%202%202%203l1%201h2v1c-1%201-1%201%201%201l6-2c2%200%202%200%201%201h28c1-1%201-1%200%200s2%201%2012%201h13l3-3%203-4-3-1c-2-1-2-1-1-2v-1l-5%202c-2%200-2%200%201-1l3-3-3-1h-2c3-2-1-2-6%200l-5%202-1%201h6l-15%206%204-2c5-2%205-2%204-4l-1-2-1-1-1%201-1%201-1-1h-2v-2l2-3-2%202c-3%202-5%203-3%201v-2l1-1%201-2h-1l-1-1c0-1%204-3%205-2l1-2-1-2v-1h1l1-2%201-14%205-3c2-1%203-1%202-2s-1-1%201-2v-3l3-1%201%201v5h3v-1l5-3c4-2%205-4%202-5-2-1-2-1%200-1l3%201h3c2%200%202-1%202-7%201-9%201-9-3-11-3-1-4-2-4-4-1-2-1-2-3-1m-57%2018l-11%203c-3%201-3%202-3%205%200%202%200%203-2%204l-3%201c0%202-4%205-4%204l-1%201%202%203c2%201%202%201%205-1%202-2%203-2%205-1%205%204%2018-8%2020-19%201-4%202-4-8%200m106%200c-2%200-2%201-2%204%200%204%200%204-1%201%200-3%200-4-3-3l-1%201-1%201v11l1-1h2l2-2%201-1h3c2-1%202-1%201-2v-2l1-4c0-3-1-3-3-3m37%2010v1h-2l-5%201h-7c-1%201%200%201%201%201v1c-2%200-2%201-1%201%202%200%201%202-1%202h-6l1-2h-1l-4%201-3%201-6%202c-5%200-10%202-12%204-2%201-1%203%201%201h1l4%201%205-1-4%201c-4%202-15%202-16%200l-2-1-1-1%202-1h1l-1-2c-7%202-8%205-2%207l5%201%203%203c3%203%201%203-4%200s-10-5-8-3l5%203c7%204%207%204%206%2013-1%204%200%209%202%2010l12-4%2010-3v-8c-1-7-1-8%201-8h1c0-1%204-2%205-1h2c0-2%200-2%201-1h3l1-2h2c0-2%200-2%201-1l2%201%201-1c-1-3%201-3%202-1%201%201%201%201%201-1l1-2c1%200%201%202-1%205v8l-1-3c0-3-1-4-4-2-2%201-3%202-3%205v4l-1-4-1-3-1%205-1%202c-1-1-2%200-2%201l1%201%201%201%203%202%203%201%201-1v1l2%201c1-1%202-1%201%202l1%203%202-2%201-2h1l2%201%201%201h2c-1%202%200%202%201%202%204%200%202-4-1-5h-4l-1-1h-2c-2%200-2%200%201-1%203-2%207-3%204-1v1c2%201%203%200%201-3l-1-1h-4c-2-1%201-4%204-5l7-2c4-1%204-1%204-6a149%20149%200%20010-12l-20%207-9%201%206-2c18-7%2021-8%2020-9l-3-1c-2%200-2%200-1%201%202%200-1%202-8%204-13%205-14%205-11%202l3-2v-1h4l2-1h2l4-2c2-1%203-2%201-2h-3m-98%209c-2%201-3%202-2%203h-1c-1-2-2%201-2%206v6h2l1%201v-3h4v-2c-2-1-2-2-1-2h1c-1-1-1-1%201-1h1v-1c1%200%203%202%203%205%201%201%201%200%201-2%200-3%200-4-2-3v-1c4-2%202-4-3-4v-3l-3%201m-70%2023c-4%201-4%203-3%2012%202%208%203%209%2012%209l7-1-5-8-6-8c0-3-3-5-5-4m-99%204a100%20100%200%20015%2016l2-1%201-2h1l1%201%201-1v-1l1-1v-2l1-1v-3c3-1-2-5-8-5h-5m89%200l-1%205c0%205-2%207-7%207-3%200-4%201-6%203l-2%202h2l8-2c3-2%204-2%205-1v2l5%201c3%200%203%200%202-3l-3-9c0-6-2-8-3-5m-53%2047l2%208c2%208%203%209%205%203%202-9%203-9%204-2%202%208%204%207%206-2l1-8-3%206c-1%207-1%207-3%201-2-8-4-9-5-2-2%208-2%208-4%201-1-5-3-8-3-5m34%207v8h4c4%200%205-1%205-3%202-5%200-9-4-8-2%200-3-1-3-3l-1-2-1%208m28-2l-2%204c0%206%207%208%2010%203%203-6-4-12-8-7'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEcklEQVQ4y5WTeUyUVxTFv2hqW2sTo3SlTdAEgwUjCS6IGqfUOjjIYrEWtKLWJdGKIJUKEgFxQVOkTSBRGhUrS4I0qQQ0/YNGMBrAESwKyDYg22zMDIwgogR/fd8jaFeTvuTOu/Ny33nn3nM+5RliPZO/jKf/zCf2J0+e4HA4GB4epqKiAqvVytDQ0F/qlT9fmsgfP37MyMjI8/OxsTGZl5aW0tbWRlVVFedzcqi9c4fCwkvob99+OeCFCxe4ceOGzCfA1HXmTDYpKSmcPXuOpqYmDIZ2qm/d4tq1a7S2tska5d/ajIuL41JRkfw/Ojoqd7W1nPM5xMcnkJmZRUlJqQBppbq6mtzcvBeAE2A2m03OqM1gYMuWLaSnp/P06ejzh5KSkklLS+PUqVNER8dwIu2EYHqWxMREEhIOCsbNLxgODg6SI2bS1d1NQ0ODvPTTxYs0t7Rgt9sZGBigqOhnIiM3s39/HNnZP5KVlcVFUVNfX8+hQ0no9eNzVFQBMjIyRHxPd3cPlZVV1NbWikeGqKurw2y2SBHWrftcqlpTU8PJk98RG/sNWq0WDw8PXF1dKSsrGxelo6MDT09PZs+eJVuqrKyUtnj06JEURmVYUlLC6tU6weQQycnJHDt2nMDAQIKCgti1azebBXO9Xo/FYkXp7e3F3d1dhq+vL83NzVJZQ3s75eXlpKamcvTIUcG+mx07drD2szAOpx6Rs1MZ7tsXK1VWWzcajeMtBwcH4+LigmaFhq6uLtny1StXhccKKS4uprOzE6fTKc0cERGBj48P3t7egsASyd5kMgsLGeRdKUq28JdWG8C2bdt5IEZgNJok0HbBKL+gQM5QFUCd3+nTp3Fzc5OA4eHhNDY2YrZY6BGdWvv6xgHbRXubvtzExg0bhc/ihZqRMmbMmElUVJQEVFsymUzk5eUTFhbGBlEbGhrK5V8uy89RdYLahXJTDD4vN5e7QtHgNUEE6nQECgE+1miI2buXgvx8WoV9+oTCSUIU7/nziRbnV8RnqIKpd9XH+gWoCqzof7/LvgMJHE/PIObbeGLiDrBx6zb8NP6kpp2k5l4DI8L79w0dnBDWWhUYhPtHXhxMOczOPVEkHj5CXWMTLR2dGG12FGfKZowxwdwMmcf1EC/KAubwq78bvwW407ZzJcbYEB58HUBXlA5HYgSd0UEUr/iQbI8pFC5+i6r1C7HGr6d9jw7bwXBhm4WTsOvexxniRr//dAZWufAwdBbONR9gC3gXqzjrWzlThAvmJa9gXagwuGIqw/5vMqSZhsNvCuYFCtZFk+SumDTTsUUuoG+TD/YvPHGEe+HYvhTnbn/sXy3BttUXx9bF2ERu1bli8nsV49LXRbwmd9OyqZiXv/E8FJP2PSyfzMQiWLQumsJ9n8m0LpjMvXkKXcumiXMXsYtitebTt7Fo38Gy6r9DGe2381TE2MN+Kq6WErDcD5+5c4gMW8u5zB+ouV5Ob0uTrBkdENH/8lD427L1D9AjnF9/v4l7Ijp7evk/6w+cHbEsnYxFcwAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/481191268200c41bde3c6f108ae5ed24/502b1/sse.png","srcSet":"/static/481191268200c41bde3c6f108ae5ed24/f2e6d/sse.png 114w,\n/static/481191268200c41bde3c6f108ae5ed24/4ddba/sse.png 229w,\n/static/481191268200c41bde3c6f108ae5ed24/502b1/sse.png 457w,\n/static/481191268200c41bde3c6f108ae5ed24/7ddc2/sse.png 686w,\n/static/481191268200c41bde3c6f108ae5ed24/435bf/sse.png 914w,\n/static/481191268200c41bde3c6f108ae5ed24/6050d/sse.png 1200w","srcWebp":"/static/481191268200c41bde3c6f108ae5ed24/15384/sse.webp","srcSetWebp":"/static/481191268200c41bde3c6f108ae5ed24/31fce/sse.webp 114w,\n/static/481191268200c41bde3c6f108ae5ed24/e3e25/sse.webp 229w,\n/static/481191268200c41bde3c6f108ae5ed24/15384/sse.webp 457w,\n/static/481191268200c41bde3c6f108ae5ed24/0258d/sse.webp 686w,\n/static/481191268200c41bde3c6f108ae5ed24/64ea2/sse.webp 914w,\n/static/481191268200c41bde3c6f108ae5ed24/9000d/sse.webp 1200w","sizes":"(max-width: 457px) 100vw, 457px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M269%2011l-24%206c-13%202-15%204-10%205h4l-4%201c-3%200-4%201-4%207%200%204-1%206-2%206l-3%202-2%204c-2%202-2%204-2%2019l-1%2017h-3l-2%201-5%202-2%201%202%201%202%202v3c0%202%200%202-1%200-1-4-4-5-5-3l-3%202v2c1%204%201%205-1%207l-2%203c1%201%200%203-1%204l-1%203%201-3c0-3%200-3-1-2s-2%205-2%2015l-2%2017c-1%205-1%2014%202%2020v6c-2%204-5%202-6-2%200-5-5-8-5-4l-4%201c-5%200-5%200-5%203%200%202%201%203%203%204%202%200%203%201%203%202h-6l1%204c-2-2-10-1-10%202h-1l-1-1v2l-3%201h-2l-2%201h-1c2%201-7%203-10%202-2%200-2%200%200%201h-1l-6%201h-2l2%201c2%201%202%201-1%201-4-1-13%202-11%203h-2c-3%200-6%202-6%205v2l-1%204-2%202v-7l-1-4c0-2-2-4-5-4l1%208v4l1%202v1l-1%201%201%201v2c1-1%202%200%204%202l2%201%202-4%202-2c-1-5%200-7%202-7%201%201%201%201%200%200l1-1h4l24-8v3l-1%203-3%203-2%202-1%203-2%204c-2%200-2%201-2%203l-1%201c-2-1-1%201%201%202%201%202%205%202%207%201h1l2-1h1a1638%201638%200%20017-3l1-2%201-3v-1l3-5c1-4%203-5%205-6s2%200%202%208v10l-3%201a8989%208989%200%2001-81%2025c0-1%201-2%202-1%203%200%205-2%205-5-1-3-4-4-6-1-1%201-1%200-1-4v-61c0%203%203%204%205%202v-7c-1-1%201-1%207-3l6-3-10%202c-8%203-10%203-10%201l-2-4-2-3%205-2%2015-5%209-3v-13l4-1h9c6%200%208-1%206-3-1-2%200-3%202-2h3c1-3%209-3%2015-1s8%204%204%204c-2%200-2%203-1%205l-2%202c-5%202%201%201%207-1%2011-4%2011-5-3-10-5-1-8-3-8-4%200-2-5-5-8-5l-3-2-2-4c-2%200-4-4-3-5l-1-2c-2-2-2-2%200-4%203-3%202-9-1-10-2-1-2-2-2-10%200-6%200-8%202-8l1-5c0-4-1-5-4-6-2%200-3-1-3-2h-7c-6%200-6%200-6-2s1-3%202-3h8c1%201-7%202-8%201l-1%201%206%201c4%200%205-1%205-2-1-3-4-4-10-3-3%201-3%201-3%205%200%203%200%204-4%205s-4%202-4%205l2%205c2%202%201%2015-2%2017-2%201-3%2010-1%2012v3c-1%201-2%202-1%203%200%202-2%205-4%205l1%201%202%202c0%202-3%201-5-1H83l-2%201-7%203-5%202%204-1c3-1%207%200%207%202l6%202c5%200%206-1%204-2v-1l3%201%203%201%203%201-3%201c-2%200-2%200-1%201h5l2-1h3l7%201%203%201c0%201-8%205-9%204l-1%202-1%203v4c0%204-3%205-6%201-3-2-7-3-10-1v4c2%202%202%202%200%202s-2%200-1%201l1%201h-2l-2-1-2%201-2%201c-2%200-2%200-2%203l1%202-6-3-8-3h-1c1-1-15-8-16-7l-1-1-7-5c-8-4-8-4-2-5%203-1%203-1%203%201%200%203%2012%206%2015%204v-1c-12%200-16-2-13-4%201-1%206%200%206%201h9l2-4c0-2%200-2%206%200h1c0-1-1-2-3-2l-3-1%204-2%202-1-4%201c-3%201-4%200-3-4l-1-2-1%201c0%201-7%202-9%201s-2-1%203-2c4-2%204-2%201-1-8%201-9%201-9%207v5l-4%201c-13%203-15%205-15%2016%200%207-1%207-4%208l-3%202v19c0%2022%200%2021%204%2023%205%203%204%2010-1%2011-3%201-5%205-3%209%201%202%205%203%208%201%202-2%2014%206%2013%208h-5l-2-1-6%201%201%202c2%204%202%206%201%206l-2-2a535%20535%200%2001-1%202c1%205%203%206%208%204%207-3%2015%207%209%2010-2%201-2%201%200%201%204-1%205%201%201%201h-3c-1-1-1-1-2%201%200%201-1%202-3%202l-2%202c0%202-4%204-13%208-2%201-2%201%201%201s4%200%203-1h7c1%201%201%201%200%200-2-2-3-2%203-4l3%201h1v-2l1%202v3l1-3c0-3%200-3%201-1l1%203v-3l1-3v2l1%202v-2l1-1%201%204%201%204%201-3v-3l1%201%201%202h2l1%201c2%200%204%204%205%2010l1%204-1%203-4%201-3%201-3%202v-5l-4-10c-1-3-2-6-1-7h-1c-2%201-2%202%201%207%203%206%204%2016%202%2015h-2c0%203-2%200-2-3%200-4-3-12-4-11l1%204c2%204%202%2011%201%2013-1%201-2%200-2-4l-3-10%201%207v7c-1%202-3%200-3-2%200-5-8-18-11-18l-2-2c-2-1-2-1-5%202-2%202-2%203-2%209%201%206%204%2015%206%2015h2l-1%201c-2-1-1%201%201%202h2v1c-1%201%200%201%201%203%203%202%208%201%2015-2s8-3%208-1l1%206%202%203H0v75h30a764%20764%200%200140%203c1-1%201%200%201%201l1%201h2l1%201h1l1%201v1h1l1%201c1%200%204%201%203%202l1%201%203%201h1v2c2-1%205%201%204%202l3%201%201%201%202%201%202%201c1%201%204%200%2013-3l12-5%204%203c3%202%205%203%206%202v-2c-2-1-1-2%205-1l5%201h-5l-4%202-7%205c-7%203-7%204-7%206%200%203%202%204%205%207%206%203%2010%204%205%201s-9-7-9-8c0-2%205-4%2018-9l26-14-8%203c-5%203-6%204-6%202s-1-3-3%200c-2%201-4%201-3-2l2-1v-2c-1-1%203-3%2010-5l20-1-6%203-4%203%207-3%2014-4-9%205-9%205%2011-4c5-3%2011-5%2013-5s-2%202-13%208l-18%207c-3%200-1-2%203-4l3-2-15%207-8%204c-4%201-6%203-5%203l7-2%206-3%204%203%205%202-3-3c-4-2-5-5-3-5l1%201%208%204v-1c-1-2%207-6%2022-13l12-5%20100-1h100v-75h-15c-14%200-15%200-14-1v-2l-2%202-4%201c-3%200-3%200%203-4%204-1%207-3%207-4l2-1v2c-3%203-1%203%202%200%202-2%202-5%203-13a1701%201701%200%2000-1-130c-1-3-2-3-1%200%200%202-1%201-4-2l-8-5c-4%200-5-1-3-2l4%201%205%201-7-4-2-1-2-2c-3%200-4-5-2-5l4-2c2-3%202-3%202-15l1-15%201-4%203-4%202-1h-2c-4%202-5-1-5-16-1-13-2-20-4-17l-8%203c-7%201-8%202-6%202s-4%203-25%209c-25%207-31%2010-31%2012l3-1a479%20479%200%200163-17l-1%201-3%204-5%206v5l3%201c4-1%2010-4%209-5l3-3v23l1%2015c0%2012%200%2013-2%2014-3%202-4%200-2-3l3-6c0-3-2-7-3-6l-1-1h-5c-5%200-5%200-5%202s0%202-1%201-1-1-1%202v1c0-2-1-2-3%200-3%201-3%201-1%201s3%200%203%204l2%206-1%202h-2c-1%202-10%205-12%205l-1-3c0-5-1-6-3-4s-3%206-1%208l-9%204-10%203%202-4c1-3%201-3%203-1%202%201%205-1%205-4s-4-3-5%200l-1-3c-1-4-5-7-10-7h-2l3%201h-2c-3%200-4%200-6%203-2%202-3%204-2%205v7c0%203%200%205%201%204v-5l2%202c3%202%204%204%201%204l1%201c2%201%202%201-3%202l-6%201a1112%201112%200%20011-70c-3%200-4%207-4%2038a473%20473%200%2001-4-34l-4-3%201-1v-2l-2%201-3%203h-3l2-2%202-2-2-1h-4l-1-1v-3c-3%200-4%202-4%2012l-1%204c-2-1-2-13%200-16%202-2%203-3%209-3l1-7c0-7%200-8%202-8v-1c-2%200-2-1-1-1h7l-1-1h-3c-4-2-2-4%203-4s7%201%205%204c-1%202%200%204%204%204%203%200%207-2%206-4h-5l-1%201-2-1%201-1c3%200-1-3-5-4-5-2-5-2%202-4h7v1l2%201%202%201c2%200%202%200%201-1-3%200-2-2%201-2%202%200%202%200%201%202l1%202h2l-5%201h8c4-2%204-4%200-4-3-1-2-2%204-4%204-1%2015%200%2014%202v3c0%202-1%203-2%203-3%201-3%204%200%204l4%202%202-1c0-1%200-2%202-2v3h1l2-1v2c-2%201-2%201-1%202%202%202%202%202-5%204l-8%203c-4%202%202%201%2010-2s9-4%208-2l2%201%205-2c2%200%202%200%200-1-3-1-3-4%200-4%203-1%206%200%203%201-1%201-1%201%201%201%202-1%208%200%2012%202v-1l-6-3c-2%200-5-1-6-3l-6-3c-4%200-4%200-4-4s-1-4-7-4l-6-2h-5l-6-1c-1%201-4%200-7-1h-7c-3%201-4%201-4-5%200-7%200-7-9-7-7-1-10%200-21%203m-5%202c-29%207-29%207-26%208s5%201%2030-5c24-6%2023-6%2021-7s-4-1-25%204m1%205l-26%207-1%203v12h4l4-1-4%201c-4%201-5%203-2%203l6%202h3l1-1h2l4-1h5l-6%202-5%202%207%202c6%202%207%202%208%201%200-1%201-2%203-2l2-4c0-3%200-3-3-2h-3l3-1c5-2%205-7%200-7-3%200-3%200-2-1%202-2%200-1-9%201l-9%202%209-3%2016-5%2015-5-12%205c-4%201-2%203%203%203l2-2%204-3%206-2c2%200%203-13%201-13l-26%207m-33%2045c-2%202-3%209-1%208l1-3c0-1%200-2%201-1l3%201v1l2%201%202-1-1-1-2-1v-1l15%205%204%202v10c0%2010%200%2013%201%209%202-3%201-20%200-21l-16-6c-8-3-7-3-9-2m-119%201l1%201c2%200%202%201%202%206%200%2017%200%2016%203%2016s3%200%202-3l-1-4%204-1c3-1%205-1%204-2h-1l-1-2v-2c-2%200-5-3-5-5s-7-5-8-4m188%206v2l-1%201v1c-1%201-1%200-1-1l-1-1c-2%201-2%2010-1%2013%201%202%201%202-1%204-2%201-2%202-1%2012l1%2011s5-4%204-5%200-2%201-1l6-1%204-2-5%201h-4v-8c0-8%201-10%206-13v-1l-3%201h-1l-2-1c-3%200-3-2-2-4%202-1%204-1%202%201-1%201%200%202%202%200s1-3-1-4h-2l2-2%202-2-2-1h-2m50%201l-4%201h-3c-2%200-3%200-2%201s-7%204-9%203h-1l-2%201c-3%201-3%2021%200%2022%201%201%208%200%208-1l3-1%203-1h2l1-1h2l1-1h1l1-1v-2l1-3v-2c2-1%202-5%201-12%200-5-1-6-3-3m-114%208c1%201%200%202-2%200-1-1-12%200-12%201h1l4%202c2%203%203%205%200%203-1-1-1-1-1%201l3%206%201%206v-9l-1-3c1-1%203%204%203%208%201%204%201%205%203%203h1c1%201%201%201%202-1%200-2%201-3%202-3%202%200%201-4-1-8-2-5-2-6%201-3l2%208%201%204V84h1c0-2-2-3-2-2-1%201-1%201-2-1v-1l1-1-2-2v1h-1c-2-2-4-1-2%201m76%208c1%201-7%203-8%202l-1%206c0%206%200%207%202%207l10-4v-2l1%201c1%201%201-1%201-4l-1-6-3-1-1%201m-108%2014c-3%201-4%202-5%2010s0%209%205%208l5-1v-9c0-10%200-10-5-8m65%204c0%204-1%206-2%205l-1%201%201%202c2%200%202%200%200%202v2h1v2l-1%204-1%2019%201%2014%202-7a272%20272%200%20000-44m-39%2010l-2%202c2%200%203%202%202%203-1%202-6%201-7-1-2-2-9-3-10-1l-3%201-3%201-3%201c-3%201-4%201-4%203s0%202%203%202l5-2c3%200%203%200%201-2v-1c2%200%208%207%2011%2013%203%204%204%2010%205%2017v3h4l-1-1-1-2%202-1v-13l2%209c0%205%200%205%202%204l2-2%202-2%204-4%201-1%201%202c1%200%202%201%201%202%200%201%205%200%206-2s0-11-2-16l-2-5c1-1%205%209%206%2015%200%204%201%205%201%203%202-5-5-25-9-24-3%201-7%201-8-1h-6m-60%204c3%204%203%207-1%207-2%200-3%200-3%202%200%203%202%206%205%204%201-1%201%200%201%2013%200%205%200%207%201%206%202-1%201-29-1-32l-3-3%201%203m-144%200c-1%202%200%203%201%201%201-1%203%200%207%202l4%203c-1%201-2%200-3-1s-2-1-2%203v4l-1-5v-4l-2%205-1%206%203%201%203%201c0%203%202%201%202-2l1-3v3l1%205%201-5c-1-6-1-6%2010%200l13%205c4%200%2015%205%2018%208%204%205%204%207%204%2047l1%2038c1%200%201%202%201-42%200-40-1-44-4-47l-55-25-2%202m340%2014l-1%203-3%203-1%204%203%201-2%201c-4-1%200%203%206%206%207%203%207%205%207%2021l-1%2026-2%2011v-10c0-12-1-11-1%202v9c1-2%201-2%201%200l-1%204c-2%201-2%200-1-12l-1-13c-1%200-2%200-1-1l-1-1c-1%201-1-2-1-9%200-19-2-26-5-22l-5%201h-3v9l-2%2013-2%2012c-1%2011-2%2013-4%2013l-2-1%202-3c1-4%202-12%200-10-2%203-10%205-18%206h-8v3l-1%203c-3%200-1%206%202%207%204%201%2022%200%2020-1l1-2c1-2%202-2%202-1h3c0%203-9%207-16%208-3%201-2%201%204%203%208%203%2021%203%2028%202h1v1c3%201-5%203-11%203-10%200-17-1-28-6l-10-3v3c-1%203-1%203%206%206%206%202%208%204%207%204h1l2%201%204%203c9%205%2010%206%2010%2014l1%207c3%200-2%205-6%206-2%201-2%201%200%202l2%202%203%203%202%202-4%201c-5%202-5%202%201%205l4%202-7%203c-9%203-10%205-6%207%207%204%2015%203%2026-3l11-5-9%205c-6%204-8%205-6%205l11-4c7-4%208-5%2010-9l3-6%201-59a687%20687%200%2000-3-63c0-6-1-8-4-11-3-4-8-4-8-1m-220%205c-3%201-7%206-5%206l2%205c0%205%200%205%201%202l1-3v6l5-2c6-2%206-2%205-9s-2-8-9-5m-82%206v5l7%204c9%204%207%200%208%2030%201%2022%201%2023%202%208l1-12v14c0%207%200%2013-1%2012-1-2-3-1-4%203-2%203-2%204%201%205%202%201%203%203%201%203l-1-1c-1-1-1-1-1%201l-1-1c-1-2-1%200-1%205%200%206%200%207%202%208h2l1%201%202%202a585%20585%200%2000-1-73v-2l-1-2v-3l-1-2c0-2-2-3-9-7l-6-3v5m212-1c-1%202%200%207%201%207l1%201%201%201c2%201%202%2010-1%2010-1%200-1%201%201%203l2%202-3%203c-4%204-3%205%202%207%203%201%205%201%2015-3l10-4-9%203-8%202c-1-1-1-1%201-1v-1l-1-9a2524%202524%200%2000-2-14c-2%201-2%201-2%2012l-1%207v-23c1-1%200-2-2-3-4-2-5-2-5%200m38%2012v7c1%200%205-1%204-2h1l1-1v-1h6l5-1-5%203a61%2061%200%2000-8%203c-3%200-7%203-6%203v1a338%20338%200%200033-11v-5c0-2%200-2-2%200l-2%203-3%202-2%201h-2l-3-1%201-1v-2c0-2%200-2-1-1h-1l-1-1c-1%201-2%200-3-1v-2h-3l-2%201-2%201c-1-1-1-1%200%200l-1%201h-1c0%202-3%201-3-1v5m45-6l-1%201h2l1%201%201%202h1l1%201c1-2%203%201%203%205%200%203%200%204%202%204v1c-4%200-2%207%203%208%201%201%201%201-1%201-3%200-3%200-2%201s1%201-1%201v1c2%200%203%207%201%207-1%200-1%201%201%201v1l-2%201%205%202v-8c2%200%201-22-1-24s-9-7-10-6l-1-1h-2m-163%202l1%202c0%202%204%205%206%205l2%201c1%201%201%201-1%201-3%200-3%200-2%202%201%201%201%201-1%201l-2-1v48l5-1%2011-3c5-1%208-2%205-2-2%200-2-2-2-17l1-18h-5l-5-1c-1-1-1-1%202-1%204%201%2010-2%209-4s-4-2-4-1c0%202-3%201-4%200-1-2-2-2-2-1h-1l-2-2%201-1%202-2-3-2c-2-2-3-3-6-2l-3-1-1-2-1%202m147%209l-1%203c0%205-1%207-6%208-4%202-5%203-5%205l-1%203-2%204c0%204-2%206-6%207l-2%202c0%202%2010%202%2017%200%208-3%209-5%209-14l-1-13c0-6-1-7-2-5m-120%208l-2%2018c0%2020-1%2019%209%2016%207-2%209-3%207-1h4c1-1%201-1-1-1-3%200-2%200%205-3l-5%201c-8%202-8%201%200-2l8-3-8-4c-10-4-10-5-10-9s0-5-3-6c-2-1-3-3-3-5l-1-1m-29%207c0%205-1%205-2%206-2%202-7%200-7-1v-1l-3-1c-7-3-7-2-8%2012-1%2013-1%2016-5%2016-3%201-4%206-1%206l3%205c0%203%200%203%203%202%202%200%202%200%201%201-2%202%200%201%208-1%204-2%206-3%204-3s-2%200%202-2l5-2c2-1%202-3%201-20a222%20222%200%2000-1-17M47%20206l2%204%208%204%2017%2011c1%201%201%200%201-5v-6l-1%205-1%203c0-5-1-6-8-8l-9-5h-2l-2-1c-1-1-2-2-3-1v-1l-1-1c-1-1-1%200-1%201m197-1l-12%203-10%203v5c-2%2011-9%2023-15%2028-4%203-7%204-3%201l1-2%201-3%203-1h1v-1l1-1c-1-2%200-4%201-2%201%201%201%201%201-1v-1c1%201%201%201%201-1v-1c1%201%201%201%201-1l2-9c2-9%202-9-9-5l-8%203-2%205c-2%2011-8%2018-17%2021-3%201-5%203-5%204%200%203-12-1-15-5h-1v-1l-1-2c-3%200-6%209-3%209l2%201%202%202%201-2%201-1c2%200%203%203%201%203-1%200-1%201%201%204l2%202%2012-4c7-3%2013-5%2014-4v-1h1c2%200%202%200%201-1h2c2%201-5%205-20%2011l-8%203%206%2011%201%204%201%201h1v1c1-1%203%202%202%203l1%201h2v1c-1%201-1%201%201%201l6-2c2%200%202%200%201%201h28c1-1%201-1%200%200s2%201%2012%201h13l3-3%203-4-3-1c-2-1-2-1-1-2v-1l-5%202c-2%200-2%200%201-1l3-3-3-1h-2c3-2-1-2-6%200l-5%202-1%201h6l-15%206%204-2c5-2%205-2%204-4l-1-2-1-1-1%201-1%201-1-1h-2v-2l2-3-2%202c-3%202-5%203-3%201v-2l1-1%201-2h-1l-1-1c0-1%204-3%205-2l1-2-1-2v-1h1l1-2%201-14%205-3c2-1%203-1%202-2s-1-1%201-2v-3l3-1%201%201v5h3v-1l5-3c4-2%205-4%202-5-2-1-2-1%200-1l3%201h3c2%200%202-1%202-7%201-9%201-9-3-11-3-1-4-2-4-4-1-2-1-2-3-1m-57%2018l-11%203c-3%201-3%202-3%205%200%202%200%203-2%204l-3%201c0%202-4%205-4%204l-1%201%202%203c2%201%202%201%205-1%202-2%203-2%205-1%205%204%2018-8%2020-19%201-4%202-4-8%200m106%200c-2%200-2%201-2%204%200%204%200%204-1%201%200-3%200-4-3-3l-1%201-1%201v11l1-1h2l2-2%201-1h3c2-1%202-1%201-2v-2l1-4c0-3-1-3-3-3m37%2010v1h-2l-5%201h-7c-1%201%200%201%201%201v1c-2%200-2%201-1%201%202%200%201%202-1%202h-6l1-2h-1l-4%201-3%201-6%202c-5%200-10%202-12%204-2%201-1%203%201%201h1l4%201%205-1-4%201c-4%202-15%202-16%200l-2-1-1-1%202-1h1l-1-2c-7%202-8%205-2%207l5%201%203%203c3%203%201%203-4%200s-10-5-8-3l5%203c7%204%207%204%206%2013-1%204%200%209%202%2010l12-4%2010-3v-8c-1-7-1-8%201-8h1c0-1%204-2%205-1h2c0-2%200-2%201-1h3l1-2h2c0-2%200-2%201-1l2%201%201-1c-1-3%201-3%202-1%201%201%201%201%201-1l1-2c1%200%201%202-1%205v8l-1-3c0-3-1-4-4-2-2%201-3%202-3%205v4l-1-4-1-3-1%205-1%202c-1-1-2%200-2%201l1%201%201%201%203%202%203%201%201-1v1l2%201c1-1%202-1%201%202l1%203%202-2%201-2h1l2%201%201%201h2c-1%202%200%202%201%202%204%200%202-4-1-5h-4l-1-1h-2c-2%200-2%200%201-1%203-2%207-3%204-1v1c2%201%203%200%201-3l-1-1h-4c-2-1%201-4%204-5l7-2c4-1%204-1%204-6a149%20149%200%20010-12l-20%207-9%201%206-2c18-7%2021-8%2020-9l-3-1c-2%200-2%200-1%201%202%200-1%202-8%204-13%205-14%205-11%202l3-2v-1h4l2-1h2l4-2c2-1%203-2%201-2h-3m-98%209c-2%201-3%202-2%203h-1c-1-2-2%201-2%206v6h2l1%201v-3h4v-2c-2-1-2-2-1-2h1c-1-1-1-1%201-1h1v-1c1%200%203%202%203%205%201%201%201%200%201-2%200-3%200-4-2-3v-1c4-2%202-4-3-4v-3l-3%201m-70%2023c-4%201-4%203-3%2012%202%208%203%209%2012%209l7-1-5-8-6-8c0-3-3-5-5-4m-99%204a100%20100%200%20015%2016l2-1%201-2h1l1%201%201-1v-1l1-1v-2l1-1v-3c3-1-2-5-8-5h-5m89%200l-1%205c0%205-2%207-7%207-3%200-4%201-6%203l-2%202h2l8-2c3-2%204-2%205-1v2l5%201c3%200%203%200%202-3l-3-9c0-6-2-8-3-5m-53%2047l2%208c2%208%203%209%205%203%202-9%203-9%204-2%202%208%204%207%206-2l1-8-3%206c-1%207-1%207-3%201-2-8-4-9-5-2-2%208-2%208-4%201-1-5-3-8-3-5m34%207v8h4c4%200%205-1%205-3%202-5%200-9-4-8-2%200-3-1-3-3l-1-2-1%208m28-2l-2%204c0%206%207%208%2010%203%203-6-4-12-8-7'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/481191268200c41bde3c6f108ae5ed24/6050d/sse.png"}}},{"id":"ef1f89b3-4985-550f-9f1b-b00f91e8fcec","slug":"/the-definitive-guide-to-video-optimization-and-delivery-in-web-applications","secret":false,"title":"The Definitive Guide to Video Optimization and Delivery in Web Applications","author":"Luke Celitan","date":"July 3rd, 2025","dateForSEO":"2025-07-03T00:00:00.000Z","timeToRead":5,"excerpt":"A comprehensive deep-dive into optimizing, storing, and delivering video for web applications, including FFmpeg best practices, advanced streaming, storage strategies, CDN integration, troubleshooting, and real-world use cases.","subscription":true,"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"The Definitive Guide to Video Optimization and Delivery in Web Applications\",\n  \"excerpt\": \"A comprehensive deep-dive into optimizing, storing, and delivering video for web applications, including FFmpeg best practices, advanced streaming, storage strategies, CDN integration, troubleshooting, and real-world use cases.\",\n  \"date\": \"2025-07-03T00:00:00.000Z\",\n  \"hero\": \"videoCover.png\",\n  \"author\": \"Luke Celitan\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\", \"JS\", \"Nodejs\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"the-definitive-guide-to-video-optimization-and-delivery-in-web-applications\"\n  }, \"The Definitive Guide to Video Optimization and Delivery in Web Applications\"), mdx(\"h2\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"Video is now a cornerstone of modern web applications, powering everything from marketing landing pages to SaaS platforms, e-learning, and social media. But delivering a seamless video experience is a complex technical challenge: you must balance quality, performance, compatibility, storage, and cost. In this guide, I\\u2019ll walk you through the full lifecycle of video in web apps\\u2014from encoding and optimization (with FFmpeg) to storage, delivery, playback, monitoring, and troubleshooting. Whether you\\u2019re building a video-heavy product or just want to improve your site\\u2019s performance, this is your definitive technical reference.\"), mdx(\"h2\", {\n    \"id\": \"why-video-optimization-matters\"\n  }, \"Why Video Optimization Matters\"), mdx(\"h3\", {\n    \"id\": \"the-rise-of-video-in-web-apps\"\n  }, \"The Rise of Video in Web Apps\"), mdx(\"p\", null, \"Video content is everywhere\\u2014product demos, tutorials, webinars, user-generated content, and more. But unoptimized video can cripple your user experience:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Slow load times\"), \" frustrate users and increase bounce rates.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"High bandwidth usage\"), \" drives up hosting costs and can throttle mobile users.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Playback issues\"), \" (buffering, stuttering) hurt engagement and retention.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Poor SEO\"), \": Slow pages and broken video playback can tank your search rankings.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Device compatibility\"), \": Not all browsers and devices support every format or codec.\")), mdx(\"h3\", {\n    \"id\": \"key-challenges\"\n  }, \"Key Challenges\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Performance\"), \": Fast startup, smooth playback, minimal buffering.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Compatibility\"), \": Support for all major browsers and devices.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Storage\"), \": Efficient, scalable, and cost-effective storage solutions.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Delivery\"), \": Global reach, caching, and adaptive streaming.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Monitoring\"), \": Analytics to track and improve video performance.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"video-codecs-formats-and-choosing-the-right-settings\"\n  }, \"Video Codecs, Formats, and Choosing the Right Settings\"), mdx(\"h3\", {\n    \"id\": \"common-codecs-and-formats\"\n  }, \"Common Codecs and Formats\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"H.264 (AVC)\"), \": The web\\u2019s workhorse\\u2014widely supported, efficient, and compatible with most browsers and devices.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"VP9\"), \": Open-source, better compression than H.264, supported in Chrome/Firefox/Edge.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"AV1\"), \": The future\\u2014superior compression, but limited hardware/browser support (as of 2024).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"HEVC (H.265)\"), \": Great for high-res, but licensing and browser support are issues.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Audio\"), \": AAC (most common), Opus (for WebRTC), MP3 (legacy).\")), mdx(\"h3\", {\n    \"id\": \"choosing-resolution-bitrate-and-codec\"\n  }, \"Choosing Resolution, Bitrate, and Codec\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Resolution\"), \": 720p (1280x720) is a good baseline for web; 1080p for premium content; 480p for mobile/low-bandwidth.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Bitrate\"), \": Lower bitrates reduce file size but can hurt quality. Aim for 1-2 Mbps for 720p, 2-4 Mbps for 1080p.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Codec\"), \": H.264 for maximum compatibility; VP9/AV1 for advanced use cases.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Audio\"), \": 128 kbps AAC is a solid default.\")), mdx(\"h3\", {\n    \"id\": \"example-codec-compatibility-table\"\n  }, \"Example: Codec Compatibility Table\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Codec\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Chrome\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Firefox\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Safari\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Edge\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Mobile\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"H.264\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"VP9\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Partial\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"AV1\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Partial\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"HEVC\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Partial\")))), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"ffmpeg-optimization-examples\"\n  }, \"FFmpeg Optimization Examples\"), mdx(\"p\", null, \"Optimizing video for web playback is essential. FFmpeg is the industry-standard tool for video encoding, transcoding, and optimization. Here are the most effective FFmpeg workflows for web video:\"), mdx(\"h3\", {\n    \"id\": \"1-basic-video-optimization\"\n  }, \"1. Basic Video Optimization\"), mdx(\"p\", null, \"Reduce resolution and bitrate for faster loading and lower bandwidth:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"ffmpeg -i input_video.mp4 \\\\\\n  -vf \\\"scale=1280:-2\\\" \\\\\\n  -c:v libx264 -crf 23 \\\\\\n  -preset medium \\\\\\n  -c:a aac -b:a 128k \\\\\\n  output.mp4\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Breakdown:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-vf \\\"scale=1280:-2\\\"\"), \": Scales width to 1280px, keeps aspect ratio.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-c:v libx264\"), \": H.264 codec for video.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-crf 23\"), \": Quality/file size trade-off (lower is higher quality).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-preset medium\"), \": Encoding speed vs. compression.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-c:a aac -b:a 128k\"), \": AAC audio at 128 kbps.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"When to use:\"), \" For most web videos, this produces a good balance of quality and size.\"), mdx(\"h3\", {\n    \"id\": \"2-fast-start-optimization-moov-atom\"\n  }, \"2. Fast Start Optimization (MOOV Atom)\"), mdx(\"p\", null, \"Move the MOOV atom to the beginning for instant playback:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"ffmpeg -i input_video.mp4 \\\\\\n  -movflags faststart \\\\\\n  -c copy \\\\\\n  output.mp4\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Breakdown:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-movflags faststart\"), \": Moves MOOV atom for fast streaming.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-c copy\"), \": No re-encoding; just optimizes file structure.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"When to use:\"), \" Always for web playback\\u2014enables instant start in browsers.\"), mdx(\"h3\", {\n    \"id\": \"3-two-pass-encoding-for-quality-and-file-size\"\n  }, \"3. Two-Pass Encoding for Quality and File Size\"), mdx(\"p\", null, \"Get better quality at smaller sizes:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"ffmpeg -i input_video.mp4 \\\\\\n  -c:v libx264 -b:v 1M -pass 1 -an -f null /dev/null && \\\\\\nffmpeg -i input_video.mp4 \\\\\\n  -c:v libx264 -b:v 1M -pass 2 \\\\\\n  -c:a aac -b:a 128k \\\\\\n  output.mp4\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Breakdown:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"First pass analyzes video; second pass encodes optimally.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-b:v 1M\"), \": Target video bitrate (1 Mbps).\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"When to use:\"), \" For premium content, or when you need the best quality-to-size ratio.\"), mdx(\"h3\", {\n    \"id\": \"4-keyframe-optimization-for-web-seeking\"\n  }, \"4. Keyframe Optimization for Web Seeking\"), mdx(\"p\", null, \"Improve seeking accuracy in web players:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"ffmpeg -i input_video.mp4 \\\\\\n  -c:v libx264 -crf 23 \\\\\\n  -g 30 -keyint_min 30 \\\\\\n  -c:a aac -b:a 128k \\\\\\n  output.mp4\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Breakdown:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-g 30 -keyint_min 30\"), \": Keyframe every 30 frames (about 1 per second at 30fps).\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"When to use:\"), \" For videos where users will seek frequently (tutorials, demos).\"), mdx(\"h3\", {\n    \"id\": \"5-adaptive-bitrate-streaming-hlsdash\"\n  }, \"5. Adaptive Bitrate Streaming (HLS/DASH)\"), mdx(\"p\", null, \"Create multiple renditions for responsive playback:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"# Example: HLS renditions\\nffmpeg -i input_video.mp4 \\\\\\n  -map 0:v -map 0:a \\\\\\n  -b:v:0 300k -s:v:0 426x240 \\\\\\n  -b:v:1 800k -s:v:1 640x360 \\\\\\n  -b:v:2 1400k -s:v:2 1280x720 \\\\\\n  -c:v libx264 -c:a aac \\\\\\n  -f hls \\\\\\n  -hls_time 4 -hls_playlist_type vod \\\\\\n  -hls_segment_filename \\\"output_%v_%03d.ts\\\" \\\\\\n  output.m3u8\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Breakdown:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Multiple bitrates/resolutions for adaptive streaming.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"output.m3u8\"), \": HLS manifest file for web players.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"When to use:\"), \" For scalable, responsive video delivery (Netflix, YouTube style).\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"storage-and-delivery-best-practices\"\n  }, \"Storage and Delivery Best Practices\"), mdx(\"h3\", {\n    \"id\": \"where-to-store-videos\"\n  }, \"Where to Store Videos\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cloud Storage\"), \": AWS S3, Google Cloud Storage, Azure Blob Storage.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Pros\"), \": Scalable, reliable, integrates with CDNs.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cons\"), \": Cost, egress fees, latency (if not paired with CDN).\"))), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"CDN Integration\"), \": Cloudflare, Akamai, Fastly, AWS CloudFront.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Pros\"), \": Global caching, fast delivery, DDoS protection.\"))), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Self-Hosting\"), \": On-premises or VPS.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Pros\"), \": Full control, no egress fees.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cons\"), \": Maintenance, scaling, security.\")))), mdx(\"h3\", {\n    \"id\": \"folder-structure-and-naming-conventions\"\n  }, \"Folder Structure and Naming Conventions\"), mdx(\"p\", null, \"Organize for scalability and automation:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"/videos/\\n  /2024/\\n    /06/\\n      /projectA/\\n        video1_720p.mp4\\n        video1_1080p.mp4\\n        video1_hls.m3u8\\n      /projectB/\\n        ...\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use date/project-based folders for easy lifecycle management.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Name files with resolution/bitrate for clarity.\")), mdx(\"h3\", {\n    \"id\": \"object-storage-vs-block-storage\"\n  }, \"Object Storage vs. Block Storage\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Object Storage (S3, GCS, Azure Blob)\"), \": Best for large, unstructured files; supports versioning, lifecycle policies.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Block Storage\"), \": Not recommended for video\\u2014better for databases, VMs.\")), mdx(\"h3\", {\n    \"id\": \"versioning-and-lifecycle-management\"\n  }, \"Versioning and Lifecycle Management\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Enable versioning to prevent accidental overwrites.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use lifecycle policies to auto-delete old/unused videos.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tag assets for easy search and management.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"serving-videos-efficiently\"\n  }, \"Serving Videos Efficiently\"), mdx(\"h3\", {\n    \"id\": \"using-cdns-for-global-delivery\"\n  }, \"Using CDNs for Global Delivery\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Why CDNs?\"), \": Reduce latency, cache content near users, handle traffic spikes.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"How to Integrate\"), \": Point your storage bucket as the CDN origin; set up cache rules for video files.\")), mdx(\"h3\", {\n    \"id\": \"http-streaming-protocols\"\n  }, \"HTTP Streaming Protocols\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"HLS (HTTP Live Streaming)\"), \": Apple\\u2019s protocol, works everywhere except some older Android browsers.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"DASH (Dynamic Adaptive Streaming over HTTP)\"), \": Open standard, supported in most modern browsers.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Progressive Download\"), \": Simple, but no adaptive bitrate.\")), mdx(\"h3\", {\n    \"id\": \"setting-correct-http-headers\"\n  }, \"Setting Correct HTTP Headers\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"CORS\"), \": Allow cross-origin requests for video playback.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cache-Control\"), \": Set long cache times for static video files.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Range Requests\"), \": Enable partial downloads for seeking.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example: S3 Bucket CORS Policy\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"[\\n  {\\n    \\\"AllowedHeaders\\\": [\\\"*\\\"],\\n    \\\"AllowedMethods\\\": [\\\"GET\\\"],\\n    \\\"AllowedOrigins\\\": [\\\"*\\\"]\\n  }\\n]\\n\")), mdx(\"h3\", {\n    \"id\": \"integrating-with-web-video-players\"\n  }, \"Integrating with Web Video Players\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Video.js\"), \": Popular, extensible, supports HLS/DASH.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"hls.js\"), \": JavaScript library for HLS playback in browsers.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Shaka Player\"), \": Advanced DASH/HLS support.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example: Video.js Setup\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-html\"\n  }, \"<video id=\\\"my-video\\\" class=\\\"video-js\\\" controls preload=\\\"auto\\\" width=\\\"640\\\" height=\\\"360\\\">\\n  <source src=\\\"https://cdn.example.com/output.m3u8\\\" type=\\\"application/x-mpegURL\\\">\\n</video>\\n<script src=\\\"https://vjs.zencdn.net/7.20.3/video.js\\\"></script>\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"advanced-optimization-techniques\"\n  }, \"Advanced Optimization Techniques\"), mdx(\"h3\", {\n    \"id\": \"adaptive-bitrate-streaming-generating-multiple-renditions\"\n  }, \"Adaptive Bitrate Streaming: Generating Multiple Renditions\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use FFmpeg to create multiple resolutions/bitrates.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Generate manifest files (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \".m3u8\"), \" for HLS, \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \".mpd\"), \" for DASH).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integrate with players that auto-select the best stream.\")), mdx(\"h3\", {\n    \"id\": \"two-pass-encoding-and-its-benefits\"\n  }, \"Two-Pass Encoding and Its Benefits\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"First pass analyzes, second pass encodes for optimal quality.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use for premium content or when bandwidth is expensive.\")), mdx(\"h3\", {\n    \"id\": \"keyframe-interval-tuning-for-web-seeking\"\n  }, \"Keyframe Interval Tuning for Web Seeking\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Shorter intervals = better seeking, but larger files.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tune based on content type (tutorials vs. movies).\")), mdx(\"h3\", {\n    \"id\": \"audio-optimization\"\n  }, \"Audio Optimization\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use AAC for compatibility.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"128 kbps stereo for most content; 64 kbps mono for voice-only.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Normalize audio levels for consistent playback.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"performance-monitoring-and-analytics\"\n  }, \"Performance Monitoring and Analytics\"), mdx(\"h3\", {\n    \"id\": \"measuring-video-performance\"\n  }, \"Measuring Video Performance\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Startup Time\"), \": How fast does playback begin?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Buffering Events\"), \": Frequency and duration.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Playback Errors\"), \": Failed loads, codec issues.\")), mdx(\"h3\", {\n    \"id\": \"analytics-tools\"\n  }, \"Analytics Tools\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Mux Data\"), \": Deep video analytics (startup time, rebuffering, engagement).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Google Analytics\"), \": Track video events (play, pause, seek).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Custom Logging\"), \": Use player events to log performance.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example: Video.js Event Logging\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"var player = videojs('my-video');\\nplayer.on('error', function() {\\n  // Log error to analytics\\n});\\nplayer.on('waiting', function() {\\n  // Log buffering event\\n});\\n\")), mdx(\"h3\", {\n    \"id\": \"lighthouse-and-core-web-vitals-impact\"\n  }, \"Lighthouse and Core Web Vitals Impact\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Fast video startup improves Largest Contentful Paint (LCP).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Optimized video reduces Total Blocking Time (TBT).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use Lighthouse to audit video performance.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"best-practices-and-common-pitfalls\"\n  }, \"Best Practices and Common Pitfalls\"), mdx(\"h3\", {\n    \"id\": \"balancing-quality-and-file-size\"\n  }, \"Balancing Quality and File Size\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Test different CRF/bitrate settings to find the sweet spot.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use adaptive streaming for diverse audiences.\")), mdx(\"h3\", {\n    \"id\": \"testing-across-devices-and-browsers\"\n  }, \"Testing Across Devices and Browsers\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Always test on Chrome, Firefox, Safari, Edge, iOS, Android.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use BrowserStack or Sauce Labs for automated cross-browser testing.\")), mdx(\"h3\", {\n    \"id\": \"handling-different-content-types\"\n  }, \"Handling Different Content Types\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Animation\"), \": Lower bitrate, fewer artifacts.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Live-Action\"), \": Higher bitrate, more keyframes.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Screen Recordings\"), \": Tune for sharp text.\")), mdx(\"h3\", {\n    \"id\": \"accessibility-considerations\"\n  }, \"Accessibility Considerations\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Add captions/subtitles (WebVTT, SRT).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Provide transcripts for search and accessibility.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use ARIA roles for custom video controls.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"real-world-use-cases-and-case-studies\"\n  }, \"Real-World Use Cases and Case Studies\"), mdx(\"h3\", {\n    \"id\": \"case-study-1-optimizing-a-video-heavy-landing-page\"\n  }, \"Case Study 1: Optimizing a Video-Heavy Landing Page\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Used FFmpeg to create 720p/1080p HLS renditions.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Stored videos in S3, delivered via CloudFront CDN.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integrated Video.js for adaptive playback.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Result: 40% faster load times, 30% lower bandwidth costs, improved SEO.\")), mdx(\"h3\", {\n    \"id\": \"case-study-2-scalable-video-delivery-pipeline-for-saas\"\n  }, \"Case Study 2: Scalable Video Delivery Pipeline for SaaS\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Automated FFmpeg encoding via CI/CD pipeline.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Used S3 versioning and lifecycle policies.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Monitored performance with Mux Data.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Result: Seamless video uploads, instant playback, robust analytics.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"troubleshooting-and-faq\"\n  }, \"Troubleshooting and FAQ\"), mdx(\"h3\", {\n    \"id\": \"common-encoding-errors\"\n  }, \"Common Encoding Errors\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Codec not supported\"), \": Check browser compatibility; re-encode with H.264/AAC.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"File too large\"), \": Lower bitrate/CRF, use two-pass encoding.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Playback stutters\"), \": Check CDN cache, optimize keyframes.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"No audio\"), \": Ensure AAC codec, check audio bitrate.\")), mdx(\"h3\", {\n    \"id\": \"debugging-playback-issues\"\n  }, \"Debugging Playback Issues\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use browser dev tools to inspect network requests.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Check CORS and range request headers.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Test with multiple players (Video.js, hls.js).\")), mdx(\"h3\", {\n    \"id\": \"storage-and-delivery-bottlenecks\"\n  }, \"Storage and Delivery Bottlenecks\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Monitor CDN cache hit rates.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use lifecycle policies to clean up old assets.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Scale storage buckets for high traffic.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"conclusion-and-further-resources\"\n  }, \"Conclusion and Further Resources\"), mdx(\"p\", null, \"Optimizing, storing, and delivering video for web applications is a multi-faceted technical challenge\\u2014but with the right tools and best practices, you can deliver a world-class experience. Use FFmpeg for encoding, cloud storage and CDNs for delivery, and modern web players for playback. Monitor performance, test across devices, and always keep accessibility in mind.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Further Reading:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://ffmpeg.org/documentation.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"FFmpeg Documentation\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://docs.aws.amazon.com/AmazonS3/latest/userguide/HostingVideos.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"AWS S3 Video Hosting Guide\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://docs.mux.com/docs/video\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Mux Video API\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://docs.videojs.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Video.js Documentation\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://web.dev/video/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Google Web Fundamentals: Video\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://web.dev/lighthouse-performance/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Lighthouse Performance Audits\"))), mdx(\"hr\", null), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Author:\"), \" Luke Celitan\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Category:\"), \" Post\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Tech:\"), \" Video, FFmpeg, Web, CDN, AWS, S3, HLS, DASH, JavaScript\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS","JS","Nodejs"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEGklEQVQ4y2VU60/TVxj+JTgcOD4QHC6FySIMF/jALRVNpikKctGwMbMEDUMHswO2Ti4CTsgcDOYEN3CSWHAGhohYLBcprJa72JZauZdLgQIFZ5b9E8/ec3oD1+TNOc/vvOc5z3mf91SwLL3E6o6YgIVilYfru8XswmzdhR1z2yjsIDJvJ3qD8H+HuEhXFo3ONcGmyLHJdbojmY1ry5NOgvWVKds6YUa0ZDJg0TSONXu+4NzoINqmgmHzwguYZrSccGFWhynjCCdiawzPz+icmOUIjo3bVa0vT3FVTM2EYRg93W1YXjBiZnIMGnUnNH91Ym5qjHImOOEyHbpm3y+4auMqrG1jF+421OHatasoLs5H2Y8lePjgHqnVYWSoD89H1TzXNK3dIUhwKbONi3N6dCpbceNGBWprqtBQfxvXfy5Hbq4MZ86koF5+C5trs5ib1mGUiNW9j7FBN3F4ILxp++hQL2prq9HU1ADtmIZ/Hxnuwx35bWRkXkDh5TyMP+/nuZPGUTzpekS11NuNY6bYDWD1Yo7dIrL8glzUkLp2RQs6SK2cyCoqyyCT5SA7W4qW5rukcoYIn0GlUkLd1wHr6rSjbWymsMKODKqoXpeRmvo50tPPQSrNwPnzaUhLO8uJSkqKcfZcKup+r4aFFD1Vd6Ors41UtkE/9pRfXXCoe2kYguJhE228iG9ypMjMSEcOzfPyZJB9m4WC/EsoLspHyqfJnNA0a4CqRwnFo2ZS/Afa2xqxRbV1vpQNkqx7pkbW15mQXvwSRUV5+P5KAcrLSnGFXC65Wogv0lLxWUoyP1ivG6KrdvISNd6Tk5njvI7CCns6/PnYrq5U3EcmFT8n6yt8J8vmapMSTyLuhAQJ8bEoLszF4IAKAwO96CGFcnkduqjOTBBrcGFrfQ6blhlsrc9yySZqB2X7fdT8eh3V1Do3qypQWHAJVb/8hJY/G9CveQKddhCjw2p0dynQ+qAR5vkX+Ns6z9tJSEqIxSfJiTiVFIfTFEcOi7ma+LgYHPv4CI/jMUeRGH8CyacT+FosRYzkGA5Hi3GU1k8lxiLh5HEeAv1w4EAg9u8PgL//+wgLC+M4MDAIQUFBEIn8EBDwAQ4e/Ijwh9i37z34+PjwuVgshq+vLyNxhZubGyIjIxEdHY2oqCiEh4dzzObBwcEIDQ3l3yIiIiCRSHDokJhwGEJCQuDh8TbY/h2E7+zZAz8/Eanz56eJRCLCfnx8d+9e/s3b2xvuu3cTgQcPT09PeHl5Ydeut+Du7k7YwxkC679xbT+FBgZdPwx8bhsZHhnsQXdHK5ob5fjtZiUqy0vxQ2kR6u/Uop/+eXTU0Eb9IPXxMA/BapmGlVy20lNyjuQWc8xqd585+M+rRfz72ozXmwt2vIRXGyZnniP+A6N5aZFmTZfeAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/8225dfbb906deda73afc1c2bda83682c/a1946/videoCover.png","srcSet":"/static/8225dfbb906deda73afc1c2bda83682c/5b37e/videoCover.png 236w,\n/static/8225dfbb906deda73afc1c2bda83682c/49058/videoCover.png 472w,\n/static/8225dfbb906deda73afc1c2bda83682c/a1946/videoCover.png 944w,\n/static/8225dfbb906deda73afc1c2bda83682c/6050d/videoCover.png 1200w","srcWebp":"/static/8225dfbb906deda73afc1c2bda83682c/99fbb/videoCover.webp","srcSetWebp":"/static/8225dfbb906deda73afc1c2bda83682c/77392/videoCover.webp 236w,\n/static/8225dfbb906deda73afc1c2bda83682c/1f177/videoCover.webp 472w,\n/static/8225dfbb906deda73afc1c2bda83682c/99fbb/videoCover.webp 944w,\n/static/8225dfbb906deda73afc1c2bda83682c/9000d/videoCover.webp 1200w","sizes":"(max-width: 944px) 100vw, 944px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M192%2081c0%201%200%202-2%202l-2%202-1%202-1%203c1%202%200%201-2-1-3-4-6-3-7%200l1%203h10l9%201v-3l-2-6c0-3-3-7-3-3m-10%2022l7%201%2012%202%205%202-6-1c-13-1-35-1-36%201l-4%202-1%201h-1l-1%201-7%203-9%203-4%201h-4l-1%201h-1v1l-1%201h-1l-1%201h-1l-1%201-3%201h2c3%200%203%200-3%203l-10%207-4%203c0-2-3%204-4%2011-2%207-3%209-4%209l-4%208c-4%2012-4%208%201-9l1-9h-1l-1%202c-1-1-2%201-2%203%201%202-2%204-3%203-1-2-6%209-5%2012l-1%204c-1%201-1%201-1-1%200-4-2%200-4%2010-2%208-4%2041-2%2036%201-1%201-1%201%202l2%208%202%2011%201%201v1l1%201c1-1%206%205%206%207l4%206%204%206%201%201h2c-1%201%208%206%209%206%202%200%207%201%206%202l5%202c5%202%205%202%201%202l-12-4c-10-5-12-5-5-1%2020%2012%2065%2017%2098%2010%2039-8%2060-28%2066-62%203-19%200-55-7-71-3-6-3-5-1%203%205%2015%208%2046%206%2061-1%208-4%2019-5%2019l2-8c2-10%202-42%200-53-4-15-9-26-17-37-4-5-5-7-2-5%201%201%201%201%200%200v-1l3%201c1-1-10-9-17-13-8-4-16-6-13-4%202%202%201%201-8-1l-15-3-11-2-3%201m147%2013l-2%206c0%203%200%203-1%201s-1-2-1%200l2%204c2%202%203%205%201%205l-1%202-1-1-1-2-1%202c-1%202-1%202-3%200h-2l2%203c5%205%209%2011%208%2011-1%201%200%201%201%202%205%202%207-1%203-6l-1-5c1-1%200-4-1-7-2-3-2-5-1-10%200-5%200-8-1-5m-174%2018c-17%202-36%207-37%2010-2%204%201%2010%205%2010h3l3%203c3%201%203%202%202%203-2%201-3%203-1%202%201-1%205%202%204%203v5c0%202%201%202%203%202l2%202%203%201%201%201%202%201%202%204%201%203%201-2c-1-3-1-3%204-3%205-1%205-1%205%202%201%202%201%202%208-1%205-3%2011-4%209-2l2%201%201-3c1-5%205-6%207-1%200%202%203%203%203%200l3-1c2%200%202%200%202-3%200-4%201-5%202-3v-1l1-1%201-1%202-1c1%201%202%200%202-1-1-1%200-1%201-2%202%200%202-1%201-1-1-1%201-5%203-5v-1h1l1-1v-1c1-1%200-11-1-12-4-5-35-8-52-6m204%2056c1%201%200%203-1%205l-1%206-1%204v4l2%206c0%206%203%208%205%207%203-2%203-9%201-9-1-1%200-1%202-1%203%200%204%200%203-2l1-2c4%202%203-6-1-8l-4-6c-1-2-2-4-4-4h-2m-26%2012c-1%203-1%203-4%203-2%200-3%200-3-2s0-2-1%201c-2%203-1%208%200%209v2c2%201%203%200%202-3%200-2%200-2%201-1s2%202%201%203l1%202c2%201%202%204-1%206l1-4-3-1c-2%200-2%201-2%203l-1%203c-1%201%201%202%203%201l-1%202c-2%202-2%207%200%208v1c-1%201%200%205%202%205l1%202%201%203c2%201%204%200%205-5%200-5%206-12%2010-12l2-1c0-2-3-2-6%200-3%201-4%201-5-1-1-1-1-1-1%201h-1c-2-2-1-5%201-5v-1c-2-2-2-3-2-12v-7m-126%208a362%20362%200%2001-87-1c-8%200%209%203%2032%205l8%201c2%201%2038%200%2042-1s9-4%208-5l-3%201m11%2013c-4%204-4%205-12%205l-3%202c-1%203-18%204-25%201h-5l-2-1%206-1h6l-5-1c-3-1-7-2-8-1l-3-1h-1c0%201%201%202%203%202%202%201%202%201%201%202-1%202-14%203-14%201v-3c3-1%200-2-6-2h-5c1-1-3-1-11-1s-13%200-11%201l26%202c1%200%202%200%201%201l1%201%201%201h-14c-7-2-26-2-24%200%201%201%2014%202%2019%201l4%201c3%203%2067%203%2075%201l4-3%201-2v-2l1-1c1%201%205-6%204-7l-4%204m131%2019v1l-1%201h-1l-2%201c-3%201-5%204-3%207%201%202%201%202-1%202v-1l-2%201c-1%201-2%203-1%204l-1%201c-2-1-5%203-4%205%201%201%200%201-1%203-2%200-3%202-2%202l-1%201c-1-1-1-1%200%200l-2%204c-2%202-2%203%200%204v1c-1%200-2%200-1%201l-1%201h-1c1%201-3%204-4%203l-1%201c1%201-32%201-104%201H110v-2c0-2-1-3-4-3-2%200-3%200-1%201%202%200%205%203%204%204l-2-1-4-1-6-2c-1-2-6-2-11-2-2%200-2%200%201%201%205%203%205%205-1%205-4%200-5%200-5-2h-1v1l-40%201H0v75h84a1901%201901%200%2001104%203%202003%202003%200%200169%207h3l1-1v-4c1%200%202%201%202%205l1%203h-7c0%202%2011%201%2024-3a387%20387%200%2001119-11l1-37v-37h-74l8-10a87%2087%200%200017-27c2%200%200-7-1-8l-2%201m-196%2012c8%200%2010%201%206%202l-4%201%205%201c5%201%206%202%206%203-1%201%200%201%201%201l-3%201-10%201a498%20498%200%20004%202l6%201%207-4c8-5%208-7%200-7l-6-1c-1-2-3-2-9-2s-7%200-3%201m88%204c-8%205-16%209-23%2010-14%204-21%206-16%206l-4%201c-8%202-11%201-8-1l3-2h-6a718%20718%200%2001-34%204h5l-5%201c-6%201%2014%202%2024%202%2025-2%2026-2%2037-6l10-2%202-1%208-6%2012-8c0-1-1-1-5%202m-20%2046c0%202%200%202-2%201-4-1-8%205-5%2010%201%202%202%202%205%202h4v-8l-1-8-1%203m-152%206v7h4c6%200%208-2%208-7%200-6-2-8-8-8h-4v8m188-3c-4%204-2%2010%203%2010%203%200%205-2%205-6%200-5-5-8-8-4m66%200c-5%205%201%2013%207%209%202-1%202-7%200-9-3-3-4-3-7%200M25%20326c-6%204-4%2014%203%2015%205%200%207-2%207-8s-5-9-10-7m187%208v7h5c5%200%208-3%208-7%200-5-3-8-8-8h-5v8m-187-5c-5%206%202%2014%206%209%202-1%203-8%201-10s-6-1-7%201m108%202c-4%204-2%2010%203%2010%206%200%208-8%203-11-3-1-4-1-6%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEGklEQVQ4y2VU60/TVxj+JTgcOD4QHC6FySIMF/jALRVNpikKctGwMbMEDUMHswO2Ti4CTsgcDOYEN3CSWHAGhohYLBcprJa72JZauZdLgQIFZ5b9E8/ec3oD1+TNOc/vvOc5z3mf91SwLL3E6o6YgIVilYfru8XswmzdhR1z2yjsIDJvJ3qD8H+HuEhXFo3ONcGmyLHJdbojmY1ry5NOgvWVKds6YUa0ZDJg0TSONXu+4NzoINqmgmHzwguYZrSccGFWhynjCCdiawzPz+icmOUIjo3bVa0vT3FVTM2EYRg93W1YXjBiZnIMGnUnNH91Ym5qjHImOOEyHbpm3y+4auMqrG1jF+421OHatasoLs5H2Y8lePjgHqnVYWSoD89H1TzXNK3dIUhwKbONi3N6dCpbceNGBWprqtBQfxvXfy5Hbq4MZ86koF5+C5trs5ib1mGUiNW9j7FBN3F4ILxp++hQL2prq9HU1ADtmIZ/Hxnuwx35bWRkXkDh5TyMP+/nuZPGUTzpekS11NuNY6bYDWD1Yo7dIrL8glzUkLp2RQs6SK2cyCoqyyCT5SA7W4qW5rukcoYIn0GlUkLd1wHr6rSjbWymsMKODKqoXpeRmvo50tPPQSrNwPnzaUhLO8uJSkqKcfZcKup+r4aFFD1Vd6Ors41UtkE/9pRfXXCoe2kYguJhE228iG9ypMjMSEcOzfPyZJB9m4WC/EsoLspHyqfJnNA0a4CqRwnFo2ZS/Afa2xqxRbV1vpQNkqx7pkbW15mQXvwSRUV5+P5KAcrLSnGFXC65Wogv0lLxWUoyP1ivG6KrdvISNd6Tk5njvI7CCns6/PnYrq5U3EcmFT8n6yt8J8vmapMSTyLuhAQJ8bEoLszF4IAKAwO96CGFcnkduqjOTBBrcGFrfQ6blhlsrc9yySZqB2X7fdT8eh3V1Do3qypQWHAJVb/8hJY/G9CveQKddhCjw2p0dynQ+qAR5vkX+Ns6z9tJSEqIxSfJiTiVFIfTFEcOi7ma+LgYHPv4CI/jMUeRGH8CyacT+FosRYzkGA5Hi3GU1k8lxiLh5HEeAv1w4EAg9u8PgL//+wgLC+M4MDAIQUFBEIn8EBDwAQ4e/Ijwh9i37z34+PjwuVgshq+vLyNxhZubGyIjIxEdHY2oqCiEh4dzzObBwcEIDQ3l3yIiIiCRSHDokJhwGEJCQuDh8TbY/h2E7+zZAz8/Eanz56eJRCLCfnx8d+9e/s3b2xvuu3cTgQcPT09PeHl5Ydeut+Du7k7YwxkC679xbT+FBgZdPwx8bhsZHhnsQXdHK5ob5fjtZiUqy0vxQ2kR6u/Uop/+eXTU0Eb9IPXxMA/BapmGlVy20lNyjuQWc8xqd585+M+rRfz72ozXmwt2vIRXGyZnniP+A6N5aZFmTZfeAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/8225dfbb906deda73afc1c2bda83682c/3ddd4/videoCover.png","srcSet":"/static/8225dfbb906deda73afc1c2bda83682c/078a8/videoCover.png 163w,\n/static/8225dfbb906deda73afc1c2bda83682c/e56da/videoCover.png 327w,\n/static/8225dfbb906deda73afc1c2bda83682c/3ddd4/videoCover.png 653w,\n/static/8225dfbb906deda73afc1c2bda83682c/c5cc7/videoCover.png 980w,\n/static/8225dfbb906deda73afc1c2bda83682c/6050d/videoCover.png 1200w","srcWebp":"/static/8225dfbb906deda73afc1c2bda83682c/0acdf/videoCover.webp","srcSetWebp":"/static/8225dfbb906deda73afc1c2bda83682c/ac59e/videoCover.webp 163w,\n/static/8225dfbb906deda73afc1c2bda83682c/7660b/videoCover.webp 327w,\n/static/8225dfbb906deda73afc1c2bda83682c/0acdf/videoCover.webp 653w,\n/static/8225dfbb906deda73afc1c2bda83682c/75470/videoCover.webp 980w,\n/static/8225dfbb906deda73afc1c2bda83682c/9000d/videoCover.webp 1200w","sizes":"(max-width: 653px) 100vw, 653px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M192%2081c0%201%200%202-2%202l-2%202-1%202-1%203c1%202%200%201-2-1-3-4-6-3-7%200l1%203h10l9%201v-3l-2-6c0-3-3-7-3-3m-10%2022l7%201%2012%202%205%202-6-1c-13-1-35-1-36%201l-4%202-1%201h-1l-1%201-7%203-9%203-4%201h-4l-1%201h-1v1l-1%201h-1l-1%201h-1l-1%201-3%201h2c3%200%203%200-3%203l-10%207-4%203c0-2-3%204-4%2011-2%207-3%209-4%209l-4%208c-4%2012-4%208%201-9l1-9h-1l-1%202c-1-1-2%201-2%203%201%202-2%204-3%203-1-2-6%209-5%2012l-1%204c-1%201-1%201-1-1%200-4-2%200-4%2010-2%208-4%2041-2%2036%201-1%201-1%201%202l2%208%202%2011%201%201v1l1%201c1-1%206%205%206%207l4%206%204%206%201%201h2c-1%201%208%206%209%206%202%200%207%201%206%202l5%202c5%202%205%202%201%202l-12-4c-10-5-12-5-5-1%2020%2012%2065%2017%2098%2010%2039-8%2060-28%2066-62%203-19%200-55-7-71-3-6-3-5-1%203%205%2015%208%2046%206%2061-1%208-4%2019-5%2019l2-8c2-10%202-42%200-53-4-15-9-26-17-37-4-5-5-7-2-5%201%201%201%201%200%200v-1l3%201c1-1-10-9-17-13-8-4-16-6-13-4%202%202%201%201-8-1l-15-3-11-2-3%201m147%2013l-2%206c0%203%200%203-1%201s-1-2-1%200l2%204c2%202%203%205%201%205l-1%202-1-1-1-2-1%202c-1%202-1%202-3%200h-2l2%203c5%205%209%2011%208%2011-1%201%200%201%201%202%205%202%207-1%203-6l-1-5c1-1%200-4-1-7-2-3-2-5-1-10%200-5%200-8-1-5m-174%2018c-17%202-36%207-37%2010-2%204%201%2010%205%2010h3l3%203c3%201%203%202%202%203-2%201-3%203-1%202%201-1%205%202%204%203v5c0%202%201%202%203%202l2%202%203%201%201%201%202%201%202%204%201%203%201-2c-1-3-1-3%204-3%205-1%205-1%205%202%201%202%201%202%208-1%205-3%2011-4%209-2l2%201%201-3c1-5%205-6%207-1%200%202%203%203%203%200l3-1c2%200%202%200%202-3%200-4%201-5%202-3v-1l1-1%201-1%202-1c1%201%202%200%202-1-1-1%200-1%201-2%202%200%202-1%201-1-1-1%201-5%203-5v-1h1l1-1v-1c1-1%200-11-1-12-4-5-35-8-52-6m204%2056c1%201%200%203-1%205l-1%206-1%204v4l2%206c0%206%203%208%205%207%203-2%203-9%201-9-1-1%200-1%202-1%203%200%204%200%203-2l1-2c4%202%203-6-1-8l-4-6c-1-2-2-4-4-4h-2m-26%2012c-1%203-1%203-4%203-2%200-3%200-3-2s0-2-1%201c-2%203-1%208%200%209v2c2%201%203%200%202-3%200-2%200-2%201-1s2%202%201%203l1%202c2%201%202%204-1%206l1-4-3-1c-2%200-2%201-2%203l-1%203c-1%201%201%202%203%201l-1%202c-2%202-2%207%200%208v1c-1%201%200%205%202%205l1%202%201%203c2%201%204%200%205-5%200-5%206-12%2010-12l2-1c0-2-3-2-6%200-3%201-4%201-5-1-1-1-1-1-1%201h-1c-2-2-1-5%201-5v-1c-2-2-2-3-2-12v-7m-126%208a362%20362%200%2001-87-1c-8%200%209%203%2032%205l8%201c2%201%2038%200%2042-1s9-4%208-5l-3%201m11%2013c-4%204-4%205-12%205l-3%202c-1%203-18%204-25%201h-5l-2-1%206-1h6l-5-1c-3-1-7-2-8-1l-3-1h-1c0%201%201%202%203%202%202%201%202%201%201%202-1%202-14%203-14%201v-3c3-1%200-2-6-2h-5c1-1-3-1-11-1s-13%200-11%201l26%202c1%200%202%200%201%201l1%201%201%201h-14c-7-2-26-2-24%200%201%201%2014%202%2019%201l4%201c3%203%2067%203%2075%201l4-3%201-2v-2l1-1c1%201%205-6%204-7l-4%204m131%2019v1l-1%201h-1l-2%201c-3%201-5%204-3%207%201%202%201%202-1%202v-1l-2%201c-1%201-2%203-1%204l-1%201c-2-1-5%203-4%205%201%201%200%201-1%203-2%200-3%202-2%202l-1%201c-1-1-1-1%200%200l-2%204c-2%202-2%203%200%204v1c-1%200-2%200-1%201l-1%201h-1c1%201-3%204-4%203l-1%201c1%201-32%201-104%201H110v-2c0-2-1-3-4-3-2%200-3%200-1%201%202%200%205%203%204%204l-2-1-4-1-6-2c-1-2-6-2-11-2-2%200-2%200%201%201%205%203%205%205-1%205-4%200-5%200-5-2h-1v1l-40%201H0v75h84a1901%201901%200%2001104%203%202003%202003%200%200169%207h3l1-1v-4c1%200%202%201%202%205l1%203h-7c0%202%2011%201%2024-3a387%20387%200%2001119-11l1-37v-37h-74l8-10a87%2087%200%200017-27c2%200%200-7-1-8l-2%201m-196%2012c8%200%2010%201%206%202l-4%201%205%201c5%201%206%202%206%203-1%201%200%201%201%201l-3%201-10%201a498%20498%200%20004%202l6%201%207-4c8-5%208-7%200-7l-6-1c-1-2-3-2-9-2s-7%200-3%201m88%204c-8%205-16%209-23%2010-14%204-21%206-16%206l-4%201c-8%202-11%201-8-1l3-2h-6a718%20718%200%2001-34%204h5l-5%201c-6%201%2014%202%2024%202%2025-2%2026-2%2037-6l10-2%202-1%208-6%2012-8c0-1-1-1-5%202m-20%2046c0%202%200%202-2%201-4-1-8%205-5%2010%201%202%202%202%205%202h4v-8l-1-8-1%203m-152%206v7h4c6%200%208-2%208-7%200-6-2-8-8-8h-4v8m188-3c-4%204-2%2010%203%2010%203%200%205-2%205-6%200-5-5-8-8-4m66%200c-5%205%201%2013%207%209%202-1%202-7%200-9-3-3-4-3-7%200M25%20326c-6%204-4%2014%203%2015%205%200%207-2%207-8s-5-9-10-7m187%208v7h5c5%200%208-3%208-7%200-5-3-8-8-8h-5v8m-187-5c-5%206%202%2014%206%209%202-1%203-8%201-10s-6-1-7%201m108%202c-4%204-2%2010%203%2010%206%200%208-8%203-11-3-1-4-1-6%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEGklEQVQ4y2VU60/TVxj+JTgcOD4QHC6FySIMF/jALRVNpikKctGwMbMEDUMHswO2Ti4CTsgcDOYEN3CSWHAGhohYLBcprJa72JZauZdLgQIFZ5b9E8/ec3oD1+TNOc/vvOc5z3mf91SwLL3E6o6YgIVilYfru8XswmzdhR1z2yjsIDJvJ3qD8H+HuEhXFo3ONcGmyLHJdbojmY1ry5NOgvWVKds6YUa0ZDJg0TSONXu+4NzoINqmgmHzwguYZrSccGFWhynjCCdiawzPz+icmOUIjo3bVa0vT3FVTM2EYRg93W1YXjBiZnIMGnUnNH91Ym5qjHImOOEyHbpm3y+4auMqrG1jF+421OHatasoLs5H2Y8lePjgHqnVYWSoD89H1TzXNK3dIUhwKbONi3N6dCpbceNGBWprqtBQfxvXfy5Hbq4MZ86koF5+C5trs5ib1mGUiNW9j7FBN3F4ILxp++hQL2prq9HU1ADtmIZ/Hxnuwx35bWRkXkDh5TyMP+/nuZPGUTzpekS11NuNY6bYDWD1Yo7dIrL8glzUkLp2RQs6SK2cyCoqyyCT5SA7W4qW5rukcoYIn0GlUkLd1wHr6rSjbWymsMKODKqoXpeRmvo50tPPQSrNwPnzaUhLO8uJSkqKcfZcKup+r4aFFD1Vd6Ors41UtkE/9pRfXXCoe2kYguJhE228iG9ypMjMSEcOzfPyZJB9m4WC/EsoLspHyqfJnNA0a4CqRwnFo2ZS/Afa2xqxRbV1vpQNkqx7pkbW15mQXvwSRUV5+P5KAcrLSnGFXC65Wogv0lLxWUoyP1ivG6KrdvISNd6Tk5njvI7CCns6/PnYrq5U3EcmFT8n6yt8J8vmapMSTyLuhAQJ8bEoLszF4IAKAwO96CGFcnkduqjOTBBrcGFrfQ6blhlsrc9yySZqB2X7fdT8eh3V1Do3qypQWHAJVb/8hJY/G9CveQKddhCjw2p0dynQ+qAR5vkX+Ns6z9tJSEqIxSfJiTiVFIfTFEcOi7ma+LgYHPv4CI/jMUeRGH8CyacT+FosRYzkGA5Hi3GU1k8lxiLh5HEeAv1w4EAg9u8PgL//+wgLC+M4MDAIQUFBEIn8EBDwAQ4e/Ijwh9i37z34+PjwuVgshq+vLyNxhZubGyIjIxEdHY2oqCiEh4dzzObBwcEIDQ3l3yIiIiCRSHDokJhwGEJCQuDh8TbY/h2E7+zZAz8/Eanz56eJRCLCfnx8d+9e/s3b2xvuu3cTgQcPT09PeHl5Ydeut+Du7k7YwxkC679xbT+FBgZdPwx8bhsZHhnsQXdHK5ob5fjtZiUqy0vxQ2kR6u/Uop/+eXTU0Eb9IPXxMA/BapmGlVy20lNyjuQWc8xqd585+M+rRfz72ozXmwt2vIRXGyZnniP+A6N5aZFmTZfeAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/8225dfbb906deda73afc1c2bda83682c/502b1/videoCover.png","srcSet":"/static/8225dfbb906deda73afc1c2bda83682c/f2e6d/videoCover.png 114w,\n/static/8225dfbb906deda73afc1c2bda83682c/4ddba/videoCover.png 229w,\n/static/8225dfbb906deda73afc1c2bda83682c/502b1/videoCover.png 457w,\n/static/8225dfbb906deda73afc1c2bda83682c/7ddc2/videoCover.png 686w,\n/static/8225dfbb906deda73afc1c2bda83682c/435bf/videoCover.png 914w,\n/static/8225dfbb906deda73afc1c2bda83682c/6050d/videoCover.png 1200w","srcWebp":"/static/8225dfbb906deda73afc1c2bda83682c/15384/videoCover.webp","srcSetWebp":"/static/8225dfbb906deda73afc1c2bda83682c/31fce/videoCover.webp 114w,\n/static/8225dfbb906deda73afc1c2bda83682c/e3e25/videoCover.webp 229w,\n/static/8225dfbb906deda73afc1c2bda83682c/15384/videoCover.webp 457w,\n/static/8225dfbb906deda73afc1c2bda83682c/0258d/videoCover.webp 686w,\n/static/8225dfbb906deda73afc1c2bda83682c/64ea2/videoCover.webp 914w,\n/static/8225dfbb906deda73afc1c2bda83682c/9000d/videoCover.webp 1200w","sizes":"(max-width: 457px) 100vw, 457px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M192%2081c0%201%200%202-2%202l-2%202-1%202-1%203c1%202%200%201-2-1-3-4-6-3-7%200l1%203h10l9%201v-3l-2-6c0-3-3-7-3-3m-10%2022l7%201%2012%202%205%202-6-1c-13-1-35-1-36%201l-4%202-1%201h-1l-1%201-7%203-9%203-4%201h-4l-1%201h-1v1l-1%201h-1l-1%201h-1l-1%201-3%201h2c3%200%203%200-3%203l-10%207-4%203c0-2-3%204-4%2011-2%207-3%209-4%209l-4%208c-4%2012-4%208%201-9l1-9h-1l-1%202c-1-1-2%201-2%203%201%202-2%204-3%203-1-2-6%209-5%2012l-1%204c-1%201-1%201-1-1%200-4-2%200-4%2010-2%208-4%2041-2%2036%201-1%201-1%201%202l2%208%202%2011%201%201v1l1%201c1-1%206%205%206%207l4%206%204%206%201%201h2c-1%201%208%206%209%206%202%200%207%201%206%202l5%202c5%202%205%202%201%202l-12-4c-10-5-12-5-5-1%2020%2012%2065%2017%2098%2010%2039-8%2060-28%2066-62%203-19%200-55-7-71-3-6-3-5-1%203%205%2015%208%2046%206%2061-1%208-4%2019-5%2019l2-8c2-10%202-42%200-53-4-15-9-26-17-37-4-5-5-7-2-5%201%201%201%201%200%200v-1l3%201c1-1-10-9-17-13-8-4-16-6-13-4%202%202%201%201-8-1l-15-3-11-2-3%201m147%2013l-2%206c0%203%200%203-1%201s-1-2-1%200l2%204c2%202%203%205%201%205l-1%202-1-1-1-2-1%202c-1%202-1%202-3%200h-2l2%203c5%205%209%2011%208%2011-1%201%200%201%201%202%205%202%207-1%203-6l-1-5c1-1%200-4-1-7-2-3-2-5-1-10%200-5%200-8-1-5m-174%2018c-17%202-36%207-37%2010-2%204%201%2010%205%2010h3l3%203c3%201%203%202%202%203-2%201-3%203-1%202%201-1%205%202%204%203v5c0%202%201%202%203%202l2%202%203%201%201%201%202%201%202%204%201%203%201-2c-1-3-1-3%204-3%205-1%205-1%205%202%201%202%201%202%208-1%205-3%2011-4%209-2l2%201%201-3c1-5%205-6%207-1%200%202%203%203%203%200l3-1c2%200%202%200%202-3%200-4%201-5%202-3v-1l1-1%201-1%202-1c1%201%202%200%202-1-1-1%200-1%201-2%202%200%202-1%201-1-1-1%201-5%203-5v-1h1l1-1v-1c1-1%200-11-1-12-4-5-35-8-52-6m204%2056c1%201%200%203-1%205l-1%206-1%204v4l2%206c0%206%203%208%205%207%203-2%203-9%201-9-1-1%200-1%202-1%203%200%204%200%203-2l1-2c4%202%203-6-1-8l-4-6c-1-2-2-4-4-4h-2m-26%2012c-1%203-1%203-4%203-2%200-3%200-3-2s0-2-1%201c-2%203-1%208%200%209v2c2%201%203%200%202-3%200-2%200-2%201-1s2%202%201%203l1%202c2%201%202%204-1%206l1-4-3-1c-2%200-2%201-2%203l-1%203c-1%201%201%202%203%201l-1%202c-2%202-2%207%200%208v1c-1%201%200%205%202%205l1%202%201%203c2%201%204%200%205-5%200-5%206-12%2010-12l2-1c0-2-3-2-6%200-3%201-4%201-5-1-1-1-1-1-1%201h-1c-2-2-1-5%201-5v-1c-2-2-2-3-2-12v-7m-126%208a362%20362%200%2001-87-1c-8%200%209%203%2032%205l8%201c2%201%2038%200%2042-1s9-4%208-5l-3%201m11%2013c-4%204-4%205-12%205l-3%202c-1%203-18%204-25%201h-5l-2-1%206-1h6l-5-1c-3-1-7-2-8-1l-3-1h-1c0%201%201%202%203%202%202%201%202%201%201%202-1%202-14%203-14%201v-3c3-1%200-2-6-2h-5c1-1-3-1-11-1s-13%200-11%201l26%202c1%200%202%200%201%201l1%201%201%201h-14c-7-2-26-2-24%200%201%201%2014%202%2019%201l4%201c3%203%2067%203%2075%201l4-3%201-2v-2l1-1c1%201%205-6%204-7l-4%204m131%2019v1l-1%201h-1l-2%201c-3%201-5%204-3%207%201%202%201%202-1%202v-1l-2%201c-1%201-2%203-1%204l-1%201c-2-1-5%203-4%205%201%201%200%201-1%203-2%200-3%202-2%202l-1%201c-1-1-1-1%200%200l-2%204c-2%202-2%203%200%204v1c-1%200-2%200-1%201l-1%201h-1c1%201-3%204-4%203l-1%201c1%201-32%201-104%201H110v-2c0-2-1-3-4-3-2%200-3%200-1%201%202%200%205%203%204%204l-2-1-4-1-6-2c-1-2-6-2-11-2-2%200-2%200%201%201%205%203%205%205-1%205-4%200-5%200-5-2h-1v1l-40%201H0v75h84a1901%201901%200%2001104%203%202003%202003%200%200169%207h3l1-1v-4c1%200%202%201%202%205l1%203h-7c0%202%2011%201%2024-3a387%20387%200%2001119-11l1-37v-37h-74l8-10a87%2087%200%200017-27c2%200%200-7-1-8l-2%201m-196%2012c8%200%2010%201%206%202l-4%201%205%201c5%201%206%202%206%203-1%201%200%201%201%201l-3%201-10%201a498%20498%200%20004%202l6%201%207-4c8-5%208-7%200-7l-6-1c-1-2-3-2-9-2s-7%200-3%201m88%204c-8%205-16%209-23%2010-14%204-21%206-16%206l-4%201c-8%202-11%201-8-1l3-2h-6a718%20718%200%2001-34%204h5l-5%201c-6%201%2014%202%2024%202%2025-2%2026-2%2037-6l10-2%202-1%208-6%2012-8c0-1-1-1-5%202m-20%2046c0%202%200%202-2%201-4-1-8%205-5%2010%201%202%202%202%205%202h4v-8l-1-8-1%203m-152%206v7h4c6%200%208-2%208-7%200-6-2-8-8-8h-4v8m188-3c-4%204-2%2010%203%2010%203%200%205-2%205-6%200-5-5-8-8-4m66%200c-5%205%201%2013%207%209%202-1%202-7%200-9-3-3-4-3-7%200M25%20326c-6%204-4%2014%203%2015%205%200%207-2%207-8s-5-9-10-7m187%208v7h5c5%200%208-3%208-7%200-5-3-8-8-8h-5v8m-187-5c-5%206%202%2014%206%209%202-1%203-8%201-10s-6-1-7%201m108%202c-4%204-2%2010%203%2010%206%200%208-8%203-11-3-1-4-1-6%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/8225dfbb906deda73afc1c2bda83682c/6050d/videoCover.png"}}}]}},"staticQueryHashes":["1609575157","2068910035","2361467917","2361467917","3838421970","500183989","5650841"]}