Skip to main content

HTTP Response Shaping

1. What this document is about

This document covers response field selection (also known as sparse fieldsets) in REST APIs: a mechanism that allows clients to request only the fields they actually need, instead of receiving a fixed, full representation of a resource.

This document applies to:

  • REST APIs with multiple consumers (frontend, mobile, integrations, patterns)
  • APIs under high traffic or strict latency budgets
  • Systems where payload size, CPU usage and serialization cost matter
  • Architectures that need evolution without breaking consumers

This document does not apply to:

  • Internal-only APIs with a single tightly-coupled client
  • CRUD-style systems with trivial payloads and low traffic
  • APIs where GraphQL is already the chosen contract model
  • Systems where response shapping would violate regulatory or auditing requirements

2. Why this matters in real systems

In real systems, APIs rarely stay simple.

What starts as:

GET /customers/{id}

with a single frontend client, eventually becomes:

  • Web frontend
  • Mobile apps
  • Background jobs
  • External partners
  • Internal services with different data needs

Typical pressures that surface:

  • Payloads grow faster than clients actually need
  • Serialization and deserialization become a measurable cost
  • Small UI changes require new endpoints or DTOs
  • Breaking changes accumulate due to rigid response contracts
  • Over-fetching becomes the norm, not the exception

When field selection is ignored:

  • APIs return wasted data on every request
  • p95/p99 latency degrades silently as payloads grow
  • Cache efficiency drops due to larger response bodies
  • Teams create endpoint explosion (/customers/summary,/customers/details, /customers/mobile, etc.)

Simper approaches stop working because:

  • DTO proliferation becomes unmanageable
  • Versioning every representation is not scalable
  • Clients evolve faster than backend release cycles

Field selection emerges as a response to evolution pressure, not as an optimization trick.


3. Core concept (mental model)

Think of a REST resource as a logical dataset not a fixed JSON shape.

The mental model is:

The server owns the data and invariants. The client declares which projection of that data it wants.

Conceptually:

  1. The client sends a request with a field projection
  2. The server validates that projection
  3. The server executes a query optimized for that projection
  4. The server returns only the selected fields

This is not dynamic typing. This is controlled projection.

A useful analogy is SQL SELECT lists:

SELECT Id, Name, Status FROM Customers

You are not changing what the table is. You are controlling which columns are materialized.

Field selection in REST applies the same idea to HTTP representations.


4. How it works (step-by-step)

Step 1 — Client expresses intent

The client explicitly declares required fields, usually via a query parameter:

GET /customers/42?fields=id,name,status

Assumption:

  • The client knows what it needs
  • The API documents supported fields

Invariant:

  • Fields not requested must not be returned

Step 2 — API parses and validates the field set

The server parses the fields parameter into a strctured representation.

Validation includes:

  • Unknown fields
  • Forbidden fields (authorization)
  • Conflicting or invalid combinations

Why this exists:

  • Prevents leaking internal or sensitive fields
  • Avoids runtime reflection chaos
  • Keeps the API contract explicit

Invariant:

  • Field selection is opt-in, never implicit

Step 3 — Projection is applied at the data access layer

The projection must influence data fetching, not just serialization.

This is critical.

Correct:

  • Database query fetches only required columns

Incorrect:

  • Load full entity → serialize selectively

Why:

  • Avoids unnecessary IO
  • Avoids EF Core tracking overhead
  • Reduces memory allocations

Invariant:

  • Over-fetching is considered a bug, not a convenience

Step 4 — Response is shaped deterministically

The response serializer outputs only requested fields.

Guarantees:

  • Stable field naming
  • No ordering guarantees unless documented
  • Missing fields are omitted, not null

Invariant:

  • Absence means "not requested", not "unknown"

5. Minimal but realistic example (.NET)

request

GET /customers/42?fields=id,name,status

Domain model (simplified)

Customer.cs
public sealed class Customer
{
public Guid Id { get; init; }
public string Name { get; init; } = null!;
public string Email { get; init; } = null!;
public CustomerStatus Status { get; init; }
public DateTime CreatedAt { get; init; }
}

Field definition contract

Explicit, server-owned mapping

CustomerFields.cs
public static class CustomerFields
{
public static readonly IReadOnlyDictionary<string, Expression<Func<Customer, object>>> Map =
new Dictionary<string, Expression<Func<Customer, object>>>(StringComparer.OrdinalIgnoreCase)
{
["id"] = c => c.Id,
["name"] = c => c.Name,
["email"] = c => c.Email,
["status"] = c => c.Status
};
}

Why this matters:

  • No reflection
  • No stringly-typed access to domain objects
  • Compile-time safety
  • Centralized authorization control

Query execution with projection

public async Task<IDictionary<string, object>> GetCustomerAsync(
Guid id,
IReadOnlyCollection<string> fields,
CancellationToken cancellationToken)
{
var projections = fields
.Select(f => CustomerFields.Map[f])
.ToArray();

var query = _db.Customers
.Where(c => c.Id == id)
.Select(BuildProjection(projections));

return await query.SingleAsync(cancellationToken);
}

Projection builder:

private static Expression<Func<Customer, IDictionary<string, object>>> BuildProjection(
Expression<Func<Customer, object>>[] selectors)
{
return customer => selectors.ToDictionary(
s => GetFieldName(s),
s => s.Compile().Invoke(customer)
);
}

Key properties:

  • No full entity materialization
  • Projection happens at query level
  • Field list drives execution

Serialization

The returned dictionary is serialized directly via System.Text.Json.

No custom converters. No dynamic objects. No reflection at runtime.


6. Design trade-offs

ApproachProsCons
Fixed DTOsSimpleDTO explosion, poor evolution
Multiple endpointsExplicitMaintence overhead
GraphQLPowerfulOperational and cognitive cost
Field selection (this)Efficient, REST-nativeMore backend complexity

What you gain:

  • Payload reduction
  • Better cache utilization
  • Easier API evolution
  • Explicit client intent

What you give up:

  • Simplicity of static DTOs
  • Some tooling familiarity
  • Slightly higher implementation complexity

What you implicitly accept:

  • Clients must be disciplined
  • Documentation becomes critical
  • Validation logic is unavoidable

7. Common mistakes and misconceptions

"We can just ignore unrequested fields during serialization"

Why it happends:

  • Looks simpler

Problem:

  • Database and domain layers still over-fetch

Avoidance:

  • Always push projection down to the query

"Let clients request any field dynamically"

Why it happends:

  • Over-flexibility mindset

Problem:

  • Security leaks
  • Contract instability

Avoidance:

  • Explicit server-side field registry

"Missing fields should be returned as null"

Why it happends:

  • Misunderstanding semantics

Problem:

  • Breaks client assumptions
  • Blurs meaning

Avoidance:

  • Omitted means omitted

8. Operational and production considerations

Things to monitor:

  • Payload size distribution
  • p95/p99 latency by field set
  • Cache hit ratio variance
  • GC pressure from allocations

What degrades first:

  • Serialization cost under high cardinality field sets
  • Cache efficiency if field sets are too granula

Operational risks:

  • Unbounded combinations of field sets
  • Cache fragmentation
  • Poor documentation causing misuse

Mitigations:

  • Field set normalization
  • Max field count limits
  • Default field sets for common clients

9. When NOT to use this

Do not use sparse fieldsets when:

  • You control both client and server tightly
  • Payload size is negligible
  • API is strictly internal and short-lived
  • Regulatory requirements mandate fixed schemas
  • Team maturity does not support contract discipline

In these cases, simpler DTO-based APIs are safer.


10. Key takeaways

  • Field selection is about evolution, not just performance
  • Over-fetching is a hidden cost that compounds over time
  • Projections must influence data access, not just serialization
  • Explicit field contracts are mandatory for safety
  • Cache behavior must be considered early
  • Flexibility without constraints becomes technical debt
  • REST can evolve without becoming GraphQL

11. High-Level Overview

Visual representation of the end-to-end flow, highlighting the transactional boundary, outbox persistence, asynchronous dispatch, and downstream consumption.

Scroll to zoom • Drag to pan
HTTP Response Shaping (Sparse Fieldsets)HTTP Response Shaping (Sparse Fieldsets)API Service (.NET / ASP.NET Core)Client AClient BClient CHTTP BoundaryRoutingField Set ParserField RegistryField-level AuthorizationNormalizationCache PolicyQuery PlannerData AccessRelational DBResponse ShaperObservabilityClient A(Web UI)Client A(Web UI)Client B(Mobile)Client B(Mobile)Client C(Partner)Client C(Partner)HTTP Boundary(API Gateway / Reverse Proxy)HTTP Boundary(API Gateway / Reverse Proxy)RoutingEndpointRoutingEndpointField Set Parser(fields=...)Field Set Parser(fields=...)Field Registry(Allowed fields)Field Registry(Allowed fields)Field-level Authorization(PII / tenant / roles)Field-level Authorization(PII / tenant / roles)Normalization(Default sets + limits)(max fields, canonical order)Normalization(Default sets + limits)(max fields, canonical order)Cache Policy(Vary by fields)(OutputCache / CDN)Cache Policy(Vary by fields)(OutputCache / CDN)Query Planner(Projection pushdown)Query Planner(Projection pushdown)Data Access(EF Core / SQL)Data Access(EF Core / SQL)Relational DBRelational DBResponse Shaper(Dictionary/DTO projection)(System.Text.Json)Response Shaper(Dictionary/DTO projection)(System.Text.Json)Observability(OTel traces/metrics/logs)Observability(OTel traces/metrics/logs)Requests (different clients, different projections)GET /customers/42?fields=id,name,statusGET /customers/42?fields=id,nameGET /customers/42(no fields param)Forward HTTP request(headers + query)Extract fields query paramValidate field names existCheck exposure rules(field allowlist per role/tenant)Normalize selection- apply defaults if missing- enforce max fields- canonical orderCompute cache key strategyVary: fields, auth, tenantEmit tags/attributes(fields_count, canonical_fields, client_type)Mental model:- Resource is stable; representation is projected.- Client declares "what fields are needed".Invariant:- Omitted fields MUST NOT be returned.Server-owned contract:- Explicit field registry (no reflection).- Unknown fields -> 400 (fail fast).- Prevents accidental exposure of internal properties.Security is non-negotiable:- Field-level authz gates PII.- Multi-tenant constraints apply BEFORE shaping.- "fields" must never bypass policy.Cache-aware execution pathAttempt cache lookup(OutputCache / CDN)alt[Cache HIT]Cached shaped response200 OK (shaped)JSON (selected fields)[Cache MISS]Build query planfor selected fieldsExecute projected query(only requested columns)SELECT <columns>FROM CustomersWHERE Id=...Row with selected columnsMaterialize minimal shape(Dictionary/DTO)Store shaped response(cacheable only when safe)Shaped response200 OK (shaped)JSON (selected fields)Performance rule:- Projection must influence data access.Bad:- Load full entity -> trim at serialization.Good:- Push projection into SQL/EF query.Caching risk:- Field combinations increase cache cardinality.Mitigations:- Canonical order for fields.- Default field sets for common clients.- Max field count and/or allow known presets.Observability signals:- payload_bytes- fields_count distribution- latency (p95/p99) by canonical_fields- cache_hit_ratio by fieldset- db_time & fetched columnsDesign options & trade-offsOption A: Fixed DTOs+ Simple, tooling-friendly- DTO explosion, slower evolutionOption B: Multiple endpoints (/summary, /details, /mobile)+ Explicit representations- Endpoint sprawl, ownership driftOption C: GraphQL+ Powerful selection/composition- Operational + cognitive costOption D: Sparse Fieldsets (this)+ Efficient + evolvable REST contract- Validation, authz, caching complexityCommon mistakes (earned in production)1) Shape only at serializationEffect: DB/CPU still over-fetchFix: projection pushdown2) Allow arbitrary fieldsEffect: leaks + contract driftFix: explicit registry + field-level authz3) Return missing fields as nullEffect: semantics break ("unknown" vs "not requested")Fix: omit unrequested fields4) Unbounded field combinationsEffect: cache fragmentationFix: defaults, presets, limitsWhen NOT to useAvoid sparse fieldsets when:- Single internal client with tight coupling- Payloads are small / traffic is low- Fixed schemas are mandated (compliance/audit)- Team cannot sustain contract disciplineHTTP Response ShapingGoal:- Reduce payload + CPU + bandwidth- Keep REST resource stable while allowing projectionsKey invariants:- Explicit client intent (fields=...)- Server-owned allowlist & policy gates- Projection pushdown into queriesProduction constraints:- cache cardinality, authz/PII, p99 latency, GC pressure, observabilityplantuml-src hLXjRziu4lwkNp7m0aMC-6MJxLxRt7KFYUEqsIQn6xlRBmK2Mg9jNYHIAr9nl8Vxx_SCASco-m8SSFjb6t5cE1m-yyn3E-LIIU_dyodTIviRRINDrY9NUaL7irmK-FjAoJInqjbk5Db7fV5LPBGGyUEgCALEHYOr1Rb2Q8ibgLtBogv5OZOSRIbIArihtZKsXPO5dRniBIHoAShKNHdjxaGcwLexMRJMpul2REPh5JzgQIsT34vRYrDHE1MhN6Wt5Kd26v-yRgrVcEVc-sdxEDeuIV-E21P58ejmff_-Tl7gzFNF_FNWj3zT-V-mmdbMtqvEJbwVleh-quvhvP-br768xLFVDoQwKKjvexJyziRDwW_AJUrZxuNvvTNBarzF3Wo-SnIaBMA73vrHgX2Mph_eeyzoGP-kknqIbi9dV3cmku3ThLceLBRjmfS3qn5CEHLSUjks-XH5-IvDwdXKNd2YejZ2yNnwJU-4anknfI7W-YGPdTF2F6z3i76oab6qCC_KOTkPB9uKAdyqk1lFuN4-c_f_ZKp1cTRdtjlptfGEuFYYnph9ZTBE1ww-xflwji0cZejhPO4CbxvJtWu6Wv1GMFYMsxrSAUl2iTBKR6H2mJaurilVSEsdE7XAvwLRcqBz9PmocgjwVOqZEgdPSeZkIcKLYot_sWzqPufCf3ldoz1on4rEnvIgJA7RiP29vogl7iL26wrYaP97M0XUHpeyvKZ4QzoDILNCP_m3DqYBRNr6V9cKBYzTC1lIwFAkmWD_26xx0J-M4Y6cgT3QbnhN_YyPS_wKbtODaj5LpOF9llUbS8BEunY40T_nbSS0zfrzl0bUR13MemJ_N0WWgtClKryX7Fdo8fXT7C2bpPa-hqlbay9vXvVp2ULDcdpesTOwcGtcyjaDVhUcoZZuxWUUB02S9u4MKeuBE9dZpj7po72OILUes0vJiwgk6DQHr0a1-b7qzYtW0zAnkCkZH2sNaac2OjzfkCVTfrrojajltqPHq-7K_yrt4vtHE-wTkBJEPEYtuSlJVrOeLqbFWvzxrWbNsgZTzV-3UxJ703zoH1MqgH14dbmnZxmndAeEXT-LAJQYIC9CAq8XuBgM0g1bTF_9I89hxGBlqATm7ZzpZLszYpSDUqML3UzLDIVi_m3sWHSP78WFP4a-OpbghE3XMn3cexMC7x6U6ri2VqM99grfWmJpG0eV0Xfy0mz3EtUZu8z0ktP3jEOFz6qQxl6BxfF8ytHRJr5BQacPijQJMf-aNfe2dBXhRFvwqDfHQnjiskf9FeF9qBWIFjowZt9BE2LAi09CkStF6i8GoBfNKLBK3eAOG2oN6pn3JgpiK3XWUe6uJJtiGmpgTotUUMYOo4FcmMrpYNlqaxjGgxKZiwmfznO6E4vc4fcUHNqMDwRaWokBVCKYbNy7EF92MZRqD8ALgY5aCe1BDR8I6QSOivOwcxLea84lfALCPD8PHDVwIHGAf-IT9ZYJQ-YSRZ_DvdGtcTC2IKfNGkyWEZShvtsOVSFxFBjaqGUh8LGCYS6mvF3ZvnmrL5KY25cXZ7kZaCiA1rq-m2Vzg16WpWHLV_dpptIq52g56hFE6qqBZ1Fm0eauLaceMWDGPAHOVJ43eZR0fLFIVZ_zC6fcCYuBq1PN55VNrt9bdEAQym7QGqnuNA-07l3szJNdSmlGgdurnt1m1fVo-NbONuol9lTZbfKiKTcX4uxNeGnSWJj1sJ1fSW5fc7kujTC5DteWziM6Rr0-8zKmGuHR1mhSnsdWPa3r79UQvQw2VMhCOvb_Sun50eCqV7X_FOVqgaBqzrZA6oJ-799lCOmHM3Uij6F2KzpQv0CT1UCkZ0BhSMisX7r6lyycTp3oLB2J4v64xAxokRsUpU1zSCHgO2B2HQa0gOhqyFKBamKTH6GnMNd0UJStFNjoEUMkZK8ibCbet5r5nXxGQPbXw21MAm27kq2OsVXcF9hJFoghtxxeg_l9BOtgMV15Vtu_1WYk4rPQ7EF25sClbtkpeOt2fJRfL-6-shEvublW46ti6JLJMe42mmLzDTQxhMizvCUPOsbnSB68u873JK2-69krr6J5KdQ_1v7P_mKRrK3-FZnqyXM5LWfgAeib3m9-lV2eElDqqSWktszABzFmlc7Pn2I2gWwY2v6mzOqHsAbCGIdQCICWBV1yHeArPgYr9zz1zCuOxpA5c6i94-OVmp9j2D7cqVHzzcbhH_utbwfGzh5X7K0WMoZjTyHWr74XMUU5beuX6h36UciGtIgdLi6ElKVxyv6uBK81cO5gzHmOsMjeDi1c6GvGwIxFRVNG9J_QIEXa24C_-2bmjPz8xWSKor9lJnoILIkaxVFCnJP5oHyMMp0g_cuFKkW-6sOiJeKrI5lS6mP7_kRNOVxcJPVr-U6iZVgXEWzhvHuABiXEnKk7rMJnu1GUwIzeAPsdjBhDzaZtKdAMPF9G-XSiPHFPDykbzQphpsYOkYkCzsfLFF4kT0vXfvuH7jt7BNnCCvNbgOI-CBXnlUel2zGvIRTOxBCLJx7KM3ZtoF8Bgo3vXDpyyUkm5sTXu20I81fUV53DGrjc6NgzHyD4EinBY8vX5fwuVlDc2kzh2Eithv-EPFD2RD8UyHGlx5hbb1HgwPhTHr2vXSZN7szyq2adYMxPoRaXC8HHh7pE77g2ajHFacEKUgMnzWJm6hiBUmdkEFZbXexSMjagz-KIgREqEVOLUVAaT3-6Jgc5Xj-hqhQ-W7vGzpmMkAiuhHGorsqFPck0FFIc4u-OwKTIiDv1gt5B9sNG9WSt7XHRRwzzJxhX_WDN7h85qkDJe4PduFxXQFe9caw1PJXUtmEHJG2OipQLrE_4A3hjadzrGyOj54vSR7V3hOcSIl5eVPL3KQhBgmFB7GGg2NOSWhIrJHJzqeMeOzbNg_16GK8SWHdREre9iiKRqD82pFH8HvqoIBWEFK5_ecIx6ThfDfaOLj6btetNwYpHoouqu89_GAa_xZ5WU-l0WSj2hB8Qp4ty-YdHgzcfL_r2i7_vdtcYiT85OPS0tq5VLrNgLIBn_Caea6N0wRB1AOz5Ph8PAWLKDkepi6YOwCvp8KWjvyRdcH5eBwXoYx6TyayXXM2WimZ5JViHmFnXSSvC15DKcnzl2HrvG2kUT4DH9WfFhZxDfSYO4Bdi5hCEChI51MNnLCV-ibM4LAxuZrG29YZ8jtzLHLdU6L4zIj0IicPju8UHV4mBfBLHYLl3v8EKUUZDedx1XESBAiLptSyE3jjwoqVH1xpALFqeiNlFXggGN5Zyh_sB5LUz_UhOlKTVL4ewAFLz5L0tLHZKFA7nGeYYQTFkRH5_Li-JzhIjs6M81m0GzkPDFPbwz6xa4STF4P1eU-XnqKEr_mi0?>HTTP Response Shaping (Sparse Fieldsets)HTTP Response Shaping (Sparse Fieldsets)API Service (.NET / ASP.NET Core)Client AClient BClient CHTTP BoundaryRoutingField Set ParserField RegistryField-level AuthorizationNormalizationCache PolicyQuery PlannerData AccessRelational DBResponse ShaperObservabilityClient A(Web UI)Client A(Web UI)Client B(Mobile)Client B(Mobile)Client C(Partner)Client C(Partner)HTTP Boundary(API Gateway / Reverse Proxy)HTTP Boundary(API Gateway / Reverse Proxy)RoutingEndpointRoutingEndpointField Set Parser(fields=...)Field Set Parser(fields=...)Field Registry(Allowed fields)Field Registry(Allowed fields)Field-level Authorization(PII / tenant / roles)Field-level Authorization(PII / tenant / roles)Normalization(Default sets + limits)(max fields, canonical order)Normalization(Default sets + limits)(max fields, canonical order)Cache Policy(Vary by fields)(OutputCache / CDN)Cache Policy(Vary by fields)(OutputCache / CDN)Query Planner(Projection pushdown)Query Planner(Projection pushdown)Data Access(EF Core / SQL)Data Access(EF Core / SQL)Relational DBRelational DBResponse Shaper(Dictionary/DTO projection)(System.Text.Json)Response Shaper(Dictionary/DTO projection)(System.Text.Json)Observability(OTel traces/metrics/logs)Observability(OTel traces/metrics/logs)Requests (different clients, different projections)GET /customers/42?fields=id,name,statusGET /customers/42?fields=id,nameGET /customers/42(no fields param)Forward HTTP request(headers + query)Extract fields query paramValidate field names existCheck exposure rules(field allowlist per role/tenant)Normalize selection- apply defaults if missing- enforce max fields- canonical orderCompute cache key strategyVary: fields, auth, tenantEmit tags/attributes(fields_count, canonical_fields, client_type)Mental model:- Resource is stable; representation is projected.- Client declares "what fields are needed".Invariant:- Omitted fields MUST NOT be returned.Server-owned contract:- Explicit field registry (no reflection).- Unknown fields -> 400 (fail fast).- Prevents accidental exposure of internal properties.Security is non-negotiable:- Field-level authz gates PII.- Multi-tenant constraints apply BEFORE shaping.- "fields" must never bypass policy.Cache-aware execution pathAttempt cache lookup(OutputCache / CDN)alt[Cache HIT]Cached shaped response200 OK (shaped)JSON (selected fields)[Cache MISS]Build query planfor selected fieldsExecute projected query(only requested columns)SELECT <columns>FROM CustomersWHERE Id=...Row with selected columnsMaterialize minimal shape(Dictionary/DTO)Store shaped response(cacheable only when safe)Shaped response200 OK (shaped)JSON (selected fields)Performance rule:- Projection must influence data access.Bad:- Load full entity -> trim at serialization.Good:- Push projection into SQL/EF query.Caching risk:- Field combinations increase cache cardinality.Mitigations:- Canonical order for fields.- Default field sets for common clients.- Max field count and/or allow known presets.Observability signals:- payload_bytes- fields_count distribution- latency (p95/p99) by canonical_fields- cache_hit_ratio by fieldset- db_time & fetched columnsDesign options & trade-offsOption A: Fixed DTOs+ Simple, tooling-friendly- DTO explosion, slower evolutionOption B: Multiple endpoints (/summary, /details, /mobile)+ Explicit representations- Endpoint sprawl, ownership driftOption C: GraphQL+ Powerful selection/composition- Operational + cognitive costOption D: Sparse Fieldsets (this)+ Efficient + evolvable REST contract- Validation, authz, caching complexityCommon mistakes (earned in production)1) Shape only at serializationEffect: DB/CPU still over-fetchFix: projection pushdown2) Allow arbitrary fieldsEffect: leaks + contract driftFix: explicit registry + field-level authz3) Return missing fields as nullEffect: semantics break ("unknown" vs "not requested")Fix: omit unrequested fields4) Unbounded field combinationsEffect: cache fragmentationFix: defaults, presets, limitsWhen NOT to useAvoid sparse fieldsets when:- Single internal client with tight coupling- Payloads are small / traffic is low- Fixed schemas are mandated (compliance/audit)- Team cannot sustain contract disciplineHTTP Response ShapingGoal:- Reduce payload + CPU + bandwidth- Keep REST resource stable while allowing projectionsKey invariants:- Explicit client intent (fields=...)- Server-owned allowlist & policy gates- Projection pushdown into queriesProduction constraints:- cache cardinality, authz/PII, p99 latency, GC pressure, observabilityplantuml-src hLXjRziu4lwkNp7m0aMC-6MJxLxRt7KFYUEqsIQn6xlRBmK2Mg9jNYHIAr9nl8Vxx_SCASco-m8SSFjb6t5cE1m-yyn3E-LIIU_dyodTIviRRINDrY9NUaL7irmK-FjAoJInqjbk5Db7fV5LPBGGyUEgCALEHYOr1Rb2Q8ibgLtBogv5OZOSRIbIArihtZKsXPO5dRniBIHoAShKNHdjxaGcwLexMRJMpul2REPh5JzgQIsT34vRYrDHE1MhN6Wt5Kd26v-yRgrVcEVc-sdxEDeuIV-E21P58ejmff_-Tl7gzFNF_FNWj3zT-V-mmdbMtqvEJbwVleh-quvhvP-br768xLFVDoQwKKjvexJyziRDwW_AJUrZxuNvvTNBarzF3Wo-SnIaBMA73vrHgX2Mph_eeyzoGP-kknqIbi9dV3cmku3ThLceLBRjmfS3qn5CEHLSUjks-XH5-IvDwdXKNd2YejZ2yNnwJU-4anknfI7W-YGPdTF2F6z3i76oab6qCC_KOTkPB9uKAdyqk1lFuN4-c_f_ZKp1cTRdtjlptfGEuFYYnph9ZTBE1ww-xflwji0cZejhPO4CbxvJtWu6Wv1GMFYMsxrSAUl2iTBKR6H2mJaurilVSEsdE7XAvwLRcqBz9PmocgjwVOqZEgdPSeZkIcKLYot_sWzqPufCf3ldoz1on4rEnvIgJA7RiP29vogl7iL26wrYaP97M0XUHpeyvKZ4QzoDILNCP_m3DqYBRNr6V9cKBYzTC1lIwFAkmWD_26xx0J-M4Y6cgT3QbnhN_YyPS_wKbtODaj5LpOF9llUbS8BEunY40T_nbSS0zfrzl0bUR13MemJ_N0WWgtClKryX7Fdo8fXT7C2bpPa-hqlbay9vXvVp2ULDcdpesTOwcGtcyjaDVhUcoZZuxWUUB02S9u4MKeuBE9dZpj7po72OILUes0vJiwgk6DQHr0a1-b7qzYtW0zAnkCkZH2sNaac2OjzfkCVTfrrojajltqPHq-7K_yrt4vtHE-wTkBJEPEYtuSlJVrOeLqbFWvzxrWbNsgZTzV-3UxJ703zoH1MqgH14dbmnZxmndAeEXT-LAJQYIC9CAq8XuBgM0g1bTF_9I89hxGBlqATm7ZzpZLszYpSDUqML3UzLDIVi_m3sWHSP78WFP4a-OpbghE3XMn3cexMC7x6U6ri2VqM99grfWmJpG0eV0Xfy0mz3EtUZu8z0ktP3jEOFz6qQxl6BxfF8ytHRJr5BQacPijQJMf-aNfe2dBXhRFvwqDfHQnjiskf9FeF9qBWIFjowZt9BE2LAi09CkStF6i8GoBfNKLBK3eAOG2oN6pn3JgpiK3XWUe6uJJtiGmpgTotUUMYOo4FcmMrpYNlqaxjGgxKZiwmfznO6E4vc4fcUHNqMDwRaWokBVCKYbNy7EF92MZRqD8ALgY5aCe1BDR8I6QSOivOwcxLea84lfALCPD8PHDVwIHGAf-IT9ZYJQ-YSRZ_DvdGtcTC2IKfNGkyWEZShvtsOVSFxFBjaqGUh8LGCYS6mvF3ZvnmrL5KY25cXZ7kZaCiA1rq-m2Vzg16WpWHLV_dpptIq52g56hFE6qqBZ1Fm0eauLaceMWDGPAHOVJ43eZR0fLFIVZ_zC6fcCYuBq1PN55VNrt9bdEAQym7QGqnuNA-07l3szJNdSmlGgdurnt1m1fVo-NbONuol9lTZbfKiKTcX4uxNeGnSWJj1sJ1fSW5fc7kujTC5DteWziM6Rr0-8zKmGuHR1mhSnsdWPa3r79UQvQw2VMhCOvb_Sun50eCqV7X_FOVqgaBqzrZA6oJ-799lCOmHM3Uij6F2KzpQv0CT1UCkZ0BhSMisX7r6lyycTp3oLB2J4v64xAxokRsUpU1zSCHgO2B2HQa0gOhqyFKBamKTH6GnMNd0UJStFNjoEUMkZK8ibCbet5r5nXxGQPbXw21MAm27kq2OsVXcF9hJFoghtxxeg_l9BOtgMV15Vtu_1WYk4rPQ7EF25sClbtkpeOt2fJRfL-6-shEvublW46ti6JLJMe42mmLzDTQxhMizvCUPOsbnSB68u873JK2-69krr6J5KdQ_1v7P_mKRrK3-FZnqyXM5LWfgAeib3m9-lV2eElDqqSWktszABzFmlc7Pn2I2gWwY2v6mzOqHsAbCGIdQCICWBV1yHeArPgYr9zz1zCuOxpA5c6i94-OVmp9j2D7cqVHzzcbhH_utbwfGzh5X7K0WMoZjTyHWr74XMUU5beuX6h36UciGtIgdLi6ElKVxyv6uBK81cO5gzHmOsMjeDi1c6GvGwIxFRVNG9J_QIEXa24C_-2bmjPz8xWSKor9lJnoILIkaxVFCnJP5oHyMMp0g_cuFKkW-6sOiJeKrI5lS6mP7_kRNOVxcJPVr-U6iZVgXEWzhvHuABiXEnKk7rMJnu1GUwIzeAPsdjBhDzaZtKdAMPF9G-XSiPHFPDykbzQphpsYOkYkCzsfLFF4kT0vXfvuH7jt7BNnCCvNbgOI-CBXnlUel2zGvIRTOxBCLJx7KM3ZtoF8Bgo3vXDpyyUkm5sTXu20I81fUV53DGrjc6NgzHyD4EinBY8vX5fwuVlDc2kzh2Eithv-EPFD2RD8UyHGlx5hbb1HgwPhTHr2vXSZN7szyq2adYMxPoRaXC8HHh7pE77g2ajHFacEKUgMnzWJm6hiBUmdkEFZbXexSMjagz-KIgREqEVOLUVAaT3-6Jgc5Xj-hqhQ-W7vGzpmMkAiuhHGorsqFPck0FFIc4u-OwKTIiDv1gt5B9sNG9WSt7XHRRwzzJxhX_WDN7h85qkDJe4PduFxXQFe9caw1PJXUtmEHJG2OipQLrE_4A3hjadzrGyOj54vSR7V3hOcSIl5eVPL3KQhBgmFB7GGg2NOSWhIrJHJzqeMeOzbNg_16GK8SWHdREre9iiKRqD82pFH8HvqoIBWEFK5_ecIx6ThfDfaOLj6btetNwYpHoouqu89_GAa_xZ5WU-l0WSj2hB8Qp4ty-YdHgzcfL_r2i7_vdtcYiT85OPS0tq5VLrNgLIBn_Caea6N0wRB1AOz5Ph8PAWLKDkepi6YOwCvp8KWjvyRdcH5eBwXoYx6TyayXXM2WimZ5JViHmFnXSSvC15DKcnzl2HrvG2kUT4DH9WfFhZxDfSYO4Bdi5hCEChI51MNnLCV-ibM4LAxuZrG29YZ8jtzLHLdU6L4zIj0IicPju8UHV4mBfBLHYLl3v8EKUUZDedx1XESBAiLptSyE3jjwoqVH1xpALFqeiNlFXggGN5Zyh_sB5LUz_UhOlKTVL4ewAFLz5L0tLHZKFA7nGeYYQTFkRH5_Li-JzhIjs6M81m0GzkPDFPbwz6xa4STF4P1eU-XnqKEr_mi0?>