Commit cbce8b0
authored
* Rename crates to trusted-server-core and trusted-server-adapter-fastly
Rename crates/common → crates/trusted-server-core and crates/fastly →
crates/trusted-server-adapter-fastly following the EdgeZero naming
convention. Add EdgeZero workspace dependencies pinned to rev 170b74b.
Update all references across docs, CI workflows, scripts, agent files,
and configuration.
* Add platform abstraction layer with traits and RuntimeServices
Introduces trusted-server-core::platform with PlatformConfigStore,
PlatformSecretStore, PlatformKvStore, PlatformBackend, PlatformHttpClient,
and PlatformGeo traits alongside ClientInfo, PlatformError, and
RuntimeServices. Wires the Fastly adapter implementations and threads
RuntimeServices into route_request. Moves GeoInfo to platform/types as
platform-neutral data and adds geo_from_fastly for field mapping.
* Address platform layer review feedback
- Defer KV store opening: replace early error return with a local
UnavailableKvStore fallback so routes that do not need synthetic ID
access succeed when the KV store is missing or temporarily unavailable
- Use ConfigStore::try_open + try_get and SecretStore::try_get throughout
FastlyPlatformConfigStore and FastlyPlatformSecretStore to honour the
Result contract instead of panicking on open/lookup failure
- Encapsulate RuntimeServices service fields as pub(crate) with public
getter methods (config_store, secret_store, backend, http_client, geo)
and a pub new() constructor; adapter updated to use new()
- Reference #487 in FastlyPlatformHttpClient stub (PR 6 implements it)
- Remove unused KvPage re-export from platform/mod.rs
- Use super::KvHandle shorthand in RuntimeServices::kv_handle()
* Reject host strings containing control characters in BackendConfig
* Fix clippy error
* Validate scheme and host for control characters in BackendConfig
* Address review findings on platform abstraction layer
* Address review findings on platform abstraction layer
* Add config store read path and storage module split
- Split fastly_storage.rs into storage/{config_store,secret_store,api_client,mod}.rs
- Add PlatformConfigStore read path via FastlyPlatformConfigStore::get using ConfigStore::try_open/try_get
- Add PlatformError::NotImplemented variant; stub write methods on FastlyPlatformConfigStore and FastlyPlatformSecretStore
- Add StoreName/StoreId newtypes with From<String>, From<&str>, AsRef<str>
- Add UnavailableKvStore to core platform module
- Add RuntimeServicesBuilder replacing 7-arg constructor
- Migrate get_active_jwks and handle_trusted_server_discovery to use &RuntimeServices
- Update call sites in signing.rs, rotation.rs, main.rs
- Add success-path test for handle_trusted_server_discovery using StubJwksConfigStore
- Fix test_parse_cookies_to_jar_empty typo (was emtpy)
* Harden legacy config-store reads and align Fastly adapter stubs
* Address storage review feedback
* Resolved github-advanced-security bot problems
* Address PR review feedback on platform abstraction layer
- Make StoreName and StoreId inner fields private; From/AsRef provide all
needed construction and access
- Add #[deprecated] to GeoInfo::from_request with #[allow(deprecated)] at
the three legacy call sites to track migration progress
- Enumerate the six platform traits in the platform module doc comment
- Extract backend_config_from_spec helper to remove duplicate BackendConfig
construction in predict_name and ensure
- Replace .into_iter().collect() with .to_vec() on secret plaintext bytes
- Remove unused bytes dependency from trusted-server-adapter-fastly
- Add comment on SecretStore::open clarifying it already returns Result
(unlike ConfigStore::open which panics)
* Add PR 4 design spec for secret store trait (read-only)
* Clarify test scope and deferred branches in PR 4 spec
* Add implementation plan for PR 4 secret store trait
* Add test for get_secret_bytes open-failure path
* Add NotImplemented tests for FastlyPlatformSecretStore write stubs
* Inline StoreId binding and add section comment in write-stub tests
* Remove plan
* Add PR 6 design spec for backend and HTTP client traits
* Address spec review findings on PR 6 design
* Implement PlatformHttpClient and thread RuntimeServices through proxy layer
- Add PlatformHttpClient trait with send(), send_async(), and select() methods
- Add PlatformBackend trait with predict_name() and ensure() methods
- Add PlatformResponse wrapper around EdgeZero HTTP responses
- Add PlatformPendingRequest and PlatformSelectResult for auction fan-out
- Thread RuntimeServices through IntegrationProxy::handle(), IntegrationRegistry::handle_proxy(),
and all first-party proxy endpoints so handlers can reach the HTTP client
- Add StubHttpClient and StubBackend test stubs with build_services_with_http_client helper
- Add proxy_request_calls_platform_http_client_send integration test
- Fix proxy_with_redirects to stay within 7-arg clippy limit via ProxyRequestHeaders struct
- Document Body::Stream limitation in edge_request_to_fastly with warning log
- Document intentional duplication of platform_response_to_fastly across proxy and orchestrator
- Remove spec file (promoted to plan + implementation)
* Address pr review findings
* Resolve pr review findings
* Add PR7 design spec for geo lookup + client info extract-once
Documents the call site migration plan: five Fastly SDK extraction
points in trusted-server-core replaced by RuntimeServices::client_info
reads, following Phase 1 injection pattern from the EdgeZero migration design.
* Fix spec review issues in PR7 design doc
- Correct erroneous claim about generate_synthetic_id being called twice
via DeviceInfo; it is called once (line 91 for fresh_id), DeviceInfo.ip
is a separate req.get_client_ip_addr() call fixed independently
- Add before/after snippet for handle_publisher_request call site in main.rs
- Add noop_services import instruction for http_util.rs test module
- Clarify _services rename (drop underscore, not add new param) in didomi.rs
- Clarify nextjs #[allow(deprecated)] annotations are out of scope (different function)
* Update PR7 spec to address all five agent review findings
- Change RequestInfo::from_request signature to &ClientInfo (not
&RuntimeServices) so prebid can call it with context.client_info
- Scope SDK-call acceptance criteria to active non-deprecated code only
- List all six AuctionContext construction sites including two production
sites in orchestrator.rs and three test helpers in orchestrator/prebid
- Add explicit warn-and-continue pattern for publisher.rs geo lookup
- Correct testing table: formats.rs and endpoints.rs have no test modules;
add orchestrator.rs and prebid.rs test helper update rows
* Add PR7 implementation plan and address plan review findings
Plan covers 6 tasks in compilation-safe order: AuctionContext struct change
first, then from_request signature, then synthetic.rs cascade, then publisher
geo, then didomi. Includes two new copy_headers unit tests (Some/None).
Spec fixes: clarify injection pattern exceptions for &ClientInfo and
Option<IpAddr>; reword acceptance criterion to reflect that provider-layer
reads flow through AuctionContext.client_info.
* Fix three plan review findings and two open questions
- Finding 1 (High): Add missing publisher.rs test call site at line ~695
for get_or_generate_synthetic_id — was omitted from Task 3 Step 6
- Finding 2 (Medium): Remove crate::geo::GeoInfo import from endpoints.rs
rather than replacing it — type is not used by name after the change,
keeping any import fails clippy -D warnings
- Finding 3 (Low): Replace interactive git add -p in Task 6 with explicit
file staging instruction
- Open Q1: Add Task 2 step to update stale handle_publisher_request
signature in auction/README.md
- Open Q2: Add Task 2 step to update from_request doc comment to reflect
ClientInfo-based TLS detection instead of Fastly SDK calls
* Broaden two low-severity doc cleanup steps in PR7 plan
- Step 7: cover all four stale Fastly-SDK-specific locations in
http_util.rs (SPOOFABLE_FORWARDED_HEADERS doc, RequestInfo struct doc,
from_request doc, detect_request_scheme doc)
- Step 8: replace the whole routing snippet in auction/README.md, not
just the one handle_publisher_request line — handle_auction and
integration_registry.handle_proxy are also stale in that snippet
* Fix two remaining low findings in PR7 plan
- Add missing Location 2 (RequestInfo.scheme field doc, line ~67) to
Step 7; renumber subsequent locations 3-5
- Replace &runtime_services with runtime_services in Step 5 and README
snippet — runtime_services is already &RuntimeServices in route_request
* Fix count drift in Step 7: four → five locations
* Add client_info field to AuctionContext and fix all construction sites
* Change RequestInfo::from_request to take &ClientInfo, thread services into handle_publisher_request
* Add Task 2 follow-up coverage and README route fixes
* Add services param to generate_synthetic_id, remove Fastly IP/geo calls in formats and endpoints
* Revert premature publisher geo change from Task 3
* Replace deprecated GeoInfo::from_request in publisher.rs with services.geo().lookup()
* Remove Fastly IP extraction from Didomi copy_headers, use ClientInfo instead
* Move IpAddr import to test module level in didomi.rs
* Apply rustfmt formatting to didomi.rs, publisher.rs, and synthetic.rs
Fix multi-line function call style in didomi.rs, line-break wrapping in
publisher.rs test, and import ordering in synthetic.rs test module.
* Add test coverage for generate_synthetic_id with concrete client IP
Adds noop_services_with_client_ip helper to test_support and a new
test that verifies the client_ip path through generate_synthetic_id
by asserting the HMAC differs when the IP changes.
* Align geo lookup warn log format with codebase convention ({e} not {e:?})
* Apply Prettier formatting to PR7 plan and spec docs
* Document content rewriting as platform-agnostic in platform module
* Document html_processor as platform-agnostic
* Document streaming_processor as platform-agnostic
* Fix unresolved doc link: replace EdgeRequest with edgezero_core::http::Request
* Add plan for content rewriting
* Add plan for PR9: wire signing to store primitives
* Add build_services_with_config_and_secret to test_support
* Add FastlyManagementApiClient to adapter
* Implement FastlyPlatformConfigStore and FastlyPlatformSecretStore write methods via management API
Replace FastlyApiClient with FastlyManagementApiClient in the put/delete
methods of FastlyPlatformConfigStore and the create/delete methods of
FastlyPlatformSecretStore. Remove the now-unused FastlyApiClient import.
* Migrate KeyRotationManager from FastlyApiClient to RuntimeServices store primitives
* Migrate signing.rs from FastlyConfigStore/FastlySecretStore to RuntimeServices
* Delete storage/api_client.rs from core; remove FastlyApiClient
* Fix formatting after CI gate check
* Add services to AuctionContext; remove deprecated from_config shim
Thread RuntimeServices into AuctionContext so auction providers can
access platform stores directly. Update PrebidAuctionProvider to use
RequestSigner::from_services(context.services) instead of the now-
removed from_config() shim. All construction sites and test helpers
updated accordingly.
This satisfies the final acceptance criterion of #490: no
FastlyConfigStore/FastlySecretStore construction remains in the
request_signing/ modules.
* Fix prettier formatting in PR9 plan document
* Add PR 10 logging initialization design
* Add PR 10 logging initialization plan
* Fix PR 10 logging plan to avoid per-log allocation
* Extract Fastly logging initialization into adapter module
* Wire Fastly main.rs to adapter-local logging module
* Remove log-fastly from core dependencies
* Format Fastly logging module declaration
* format plan docs
* Address PR findings
* Restore idiomatic fern logging and improve target label extraction
- Reverted gratuitous _message rename and record.args() usage in logging.rs, returning to the idiomatic message parameter inside the fern format closure.
- Refactored target_label to use .rsplit_once("::") rather than .split("::").last(). This provides a more explicit and robust way to extract the final module segment.
- Expanded target_label test coverage to explicitly test edge cases such as inputs without :: separators, empty strings, and inputs with trailing ::.
* Migrate utility layer to HTTP types
* Migrate handler layer to HTTP types
* Address PR review findings
* Address review findings
* Address review findings
* Resolve review findings
* Resolve PR review findings
* Address review findings
* Removed unused import
* Fix rotate/delete atomicity, HTTP verb, idempotent deletes, and weak tests
* Resolve PR review feedback on logging module
* Address review findings
* Resolve PR review findings
* Address round-3 review findings
- Revert proxy.rs merge artifact: restore per-request allowed_domains
at both redirect_is_permitted call sites; remove dead_code allow and
stale comment — integration proxies defaulting to &[] get open mode
again as documented
- Drop unused trusted-server-js dep from adapter Cargo.toml
- Fix check_response: gate body read behind error branch so 2xx paths
do not buffer and discard the response body
- Remove self-referential SECRET_UPSERT_METHOD test
- Reorder write-cost doc so outbound HTTPS round-trip leads; handle-open
caching noted as negligible
- Refactor make_request to take fastly::http::Method; drop string match
and unreachable arm; remove SECRET_UPSERT_METHOD const
- Add SigningStoreIds named struct in endpoints.rs; update both call
sites to destructure by name
* Address PR review: add body-size caps and remove orchestrator duplication
- Add VERIFY_MAX_BODY_BYTES (4096) cap to handle_verify_signature
- Add AUCTION_MAX_BODY_BYTES (65536) cap to handle_auction
- Add ADMIN_MAX_BODY_BYTES (4096) cap to handle_rotate_key and handle_deactivate_key
- Delete platform_response_to_fastly from orchestrator; both call sites now use crate::compat::to_fastly_response directly
- Add sign_rejects_oversized_body and rebuild_rejects_oversized_body regression tests asserting 413 on oversized POST bodies
* Resolve PR review findings
* Resolve PR review findings
* Resolve PR review findings
* Use append_header in place of set_header
* fix lint
* Route Fastly cookie calls through compat bridge after PR10 merge
cookies.rs set_ec_cookie/expire_ec_cookie now take Response<EdgeBody> to
satisfy the migration_guards invariant. registry.rs and publisher.rs call
the Fastly-typed equivalents in compat instead. Remove synthetic.rs entry
from migration_guards (file deleted in PR10).
* Remove unused Logger import
* Resolve PR review findings
* Fix fmt lint
* Rename synthetic_id_cookie_value_is_safe → ec_cookie_value_is_safe
* Resolve PR review findings
* Resolve PR 624 review findings
Blocking fixes:
- Remove debug_assert! in compat::to_fastly_response that contradicted the
documented silent-drop fallback and caused to_fastly_response_with_streaming_body_produces_empty_body
to panic in debug builds
- Restore streaming dispatch for PublisherResponse::Stream, which was regressed
by the PR 11 compat shim. Introduce HandlerOutcome enum so route_request can
signal streaming intent back to the adapter. main() handles HandlerOutcome::Streaming
via to_fastly_response_skeleton + stream_to_client + stream_publisher_body directly,
avoiding the Vec<u8> buffer that delayed TTFB and scaled WASM memory with body size.
Non-blocking fixes:
- Add to_fastly_response_skeleton for headers-only fastly response conversion
- Add geo-401 comment: skip geo lookup for unauthenticated callers
- Add audited-callers comment on EdgeBody::Stream arms in compat
- Add O(N) / PR 15 comment on bytes.to_vec() calls
- Deduplicate auction/publisher status extraction in route_tests via outcome_status helper
* Call StreamingBody::finish() to properly terminate chunked response
StreamingBody in fastly 0.11.12 has no Drop impl — dropping it without
calling finish() leaves the chunked HTTP stream with no terminal chunk,
causing clients to receive "unexpected EOF during chunk size line".
Match on stream_publisher_body result and call finish() in both the
success and error paths so the response is always properly terminated.
* Apply cargo fmt formatting
* Resolve PR 624 round-6 review findings
Blocking fixes:
- Restore drop(streaming_body) on error path so client sees EOF/truncated
response instead of a silently completed partial response (cd4c621 regression)
- Add HandlerOutcome::AuthChallenge variant to distinguish our enforce_basic_auth
401s from origin-forwarded 401s; gate geo lookup on AuthChallenge only so
origin-forwarded 401s still carry geo headers
Non-blocking fixes:
- Fix stream_publisher_body doc: remove incorrect async claim; function is sync
- Clarify to_fastly_request_ref doc: non-empty body is a caller error
- Add enforce_max_body_size helper in http_util; replace 6 duplicated body-size
cap blocks across proxy, auction, and request_signing endpoints
- Add test for to_fastly_response_skeleton covering status + header round-trip
- Restore "bytes" unit in enforce_max_body_size error message for log clarity
- Widen enforce_max_body_size what param from &'static str to &str
* Bound publisher response body size and document interim buffering
Add MAX_PLATFORM_RESPONSE_BODY_BYTES (10 MiB) cap in
fastly_response_to_platform to prevent heap exhaustion from large origin
responses. Content-Length pre-check avoids the WASM heap copy entirely for
declared-size responses; post-materialization check covers chunked responses
without Content-Length.
Document the interim buffering regression in PublisherResponse::Stream and
PassThrough doc comments, noting that both variants now hold a fully
materialised body until the platform HTTP client gains streaming response
support in PR 15.
Resolves PR 624 round-7 review findings.
* Add edge_cookie module, test helpers, and integration handle signatures
Complete merge resolution of remaining unstaged files:
- lib.rs: expose edge_cookie as pub(crate) module (used by proxy.rs)
- platform/test_support.rs: add recorded_request_headers() on StubHttpClient
and build_services_with_http_client() factory for tests with custom HTTP clients
- integrations/{datadome,didomi,lockr,permutive,prebid,sourcepoint}: add
_services: &RuntimeServices parameter to handle() following main branch
IntegrationProxy trait change
* Fix remaining code review findings from merge
Address medium-priority findings surfaced during review of the main merge:
- test_support.rs: record request headers in send_async (was only recorded
in send), so recorded_request_headers() is consistent across sync and
async HTTP test paths
- test_support.rs: document StubBackend vs NoopBackend distinction on
build_services_with_http_client so callers understand the tradeoff
- endpoints.rs: 413 PAYLOAD_TOO_LARGE response now includes Content-Type
and a client-facing message instead of an empty body with a server-internal
error string
- kv.rs: derive Clone for KvIdentityGraph (trivial String wrapper)
- main.rs: build KvIdentityGraph once and clone for finalize_kv_graph,
eliminating the double call to maybe_identity_graph
* Fix cargo fmt lint
* Migrate auction format tests to edgezero http types after merge
Merge 6e191e9 combined the edgezero http::Request/Response migration with
new auction tests from main that still used the Fastly SDK API, and added
the RequestTooLarge error variant. Update the auction format tests to build
Request<EdgeBody> via the http builder, read response bodies through
EdgeBody::into_bytes, pass the new services and geo arguments to
convert_tsjs_to_auction_request, and use http accessors. Cover the new
RequestTooLarge variant in the error status-code guard and mapping test.
* Migrate integration and provider HTTP types (PR 13) (#626)
* Migrate integration and provider HTTP types
* Resolve PR findings
* Resolve PR findings
* Address review findings: safe body reads and bounded inbound forwarding
- Add collect_body_bounded helper with INTEGRATION_MAX_BODY_BYTES (256 KiB)
cap to prevent unbounded memory use on streaming bodies
- Replace all into_bytes() calls (panic on Body::Stream) with collect_body
or collect_body_bounded across integrations and auction endpoint
- Make AuctionProvider::parse_response async so implementations can safely
drain response bodies without panicking on the Stream variant
- Add .await to both parse_response call sites in the orchestrator
- Cap inbound request bodies in lockr, permutive, datadome, and didomi
proxy handlers using collect_body_bounded before forwarding upstream
- Fix lockr Origin header: replace expect() with a warn-and-skip fallback
so an invalid user-supplied origin cannot crash the edge worker
- Add PayloadSizeError::StreamRead variant to google_tag_manager and return
502 (not 413) when a stream transport error occurs while reading the body
- Remove extra blank line before closing brace in google_tag_manager impl block
* Address PR review: fmt, testlight body cap, auction constant, stale README
- Run cargo fmt --all (7+ files had formatting failures)
- Cap testlight POST body with collect_body_bounded + INTEGRATION_MAX_BODY_BYTES
- Use dedicated AUCTION_MAX_BODY_BYTES (256 KiB) for /auction instead of INTEGRATION_MAX_BODY_BYTES
- Update auction/README.md: parse_response is now async, parallel execution via select() is live
* Resolve PR review findings
* Resolve PR 626 review findings
Blocking fixes:
- Fix doc_markdown clippy errors in integrations/mod.rs (BAD_GATEWAY,
max_bytes, one_chunk wrapped in backticks)
- Drop change_context() on collect_body_bounded() calls in auction,
datadome, didomi, lockr, permutive — RequestTooLarge (413) was being
rewritten to Integration/Auction (502); now propagates unchanged via ?
so oversized bodies correctly surface as PAYLOAD_TOO_LARGE
- Remove debug_assert! in compat::to_fastly_response (already fixed in
PR 12, missed in PR 13 merge)
Non-blocking fixes:
- Migrate testlight upstream response read from unbounded collect_body to
collect_response_bounded(UPSTREAM_RTB_MAX_RESPONSE_BYTES) matching all
other RTB integrations; remove now-unused collect_body function
- Upgrade orchestrator predicted-backend-name fallback log from debug to
warn so operators see silent bid-loss fallback in production
* Apply cargo fmt formatting
* Resolve PR 626 round-1 review findings
Blocking fixes:
- Use collect_response_bounded for sourcepoint JS response bodies, replacing
the EdgeBody::Stream branch that silently returned an empty body; streaming
responses now drain up to the 5 MiB cap and surface oversized bodies as
Integration/502, matching all other integrations
- Run cargo fmt to fix 8 formatting hunks in sourcepoint.rs introduced by the
May 12 merge
Non-blocking:
- Orchestrator now identifies the failing provider on select() Err by diffing
backend_to_provider keys against the new remaining list; logs with provider
name and pushes AuctionResponse::error so the response array counts correctly
Refactor:
- Add first_byte_timeout: Option<Duration> to ensure_integration_backend; proxy
call sites pass None (keeps 15 s default); auction providers (aps, adserver_mock,
prebid) switch from BackendConfig::from_url_with_first_byte_timeout to
ensure_integration_backend with the auction-scoped timeout, going through the
platform abstraction consistently
* Resolve PR 626 round-2 review findings
- Fix orchestrator select() Err path: add failed_backend_name to
PlatformSelectResult and populate it from fastly::SendError::backend_name()
in the Fastly adapter; orchestrator now uses this field directly instead of
the broken diff-against-remaining logic (which always failed on Fastly because
remaining entries have no backend names)
- Add push_select_error() to StubHttpClient and strip backend names from
remaining entries in select() to match Fastly production behavior
- Add select_error_is_attributed_to_correct_provider test: two stub providers,
one fails via injected select error, assert correct attribution
- Remove CONTENT_LENGTH from datadome headers_to_copy (body is re-materialized
so client Content-Length is wrong for the outbound request)
- Replace _request_info ignored param in prebid to_openrtb with request_info
and remove the duplicate internal RequestInfo::from_request call
- Replace from_utf8_lossy with strict from_utf8 + fallback in google_tag_manager
- Replace .expect() on HeaderValue::from_str with if let Ok in adserver_mock
* Give auction transport failures a consistent error envelope
Provider transport failures (select() errors) pushed a bare
AuctionResponse::error with no metadata, while parse and launch failures
attach error_type/message. Route transport failures through a shared
helper with a new ERROR_TYPE_TRANSPORT classifier and a static,
upstream-safe message, so the public /auction response shape no longer
depends on how a provider failed. Add unit coverage for the new helper.
1 parent bc6d78c commit cbce8b0
40 files changed
Lines changed: 5357 additions & 2655 deletions
File tree
- crates
- trusted-server-adapter-fastly/src
- trusted-server-core/src
- auction
- ec
- integrations
- platform
- request_signing
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
324 | 324 | | |
325 | 325 | | |
326 | 326 | | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
327 | 336 | | |
328 | 337 | | |
329 | 338 | | |
| |||
347 | 356 | | |
348 | 357 | | |
349 | 358 | | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
350 | 377 | | |
351 | 378 | | |
352 | 379 | | |
| |||
355 | 382 | | |
356 | 383 | | |
357 | 384 | | |
358 | | - | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
359 | 397 | | |
360 | 398 | | |
361 | 399 | | |
| |||
453 | 491 | | |
454 | 492 | | |
455 | 493 | | |
456 | | - | |
| 494 | + | |
457 | 495 | | |
458 | 496 | | |
459 | 497 | | |
| |||
462 | 500 | | |
463 | 501 | | |
464 | 502 | | |
465 | | - | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
466 | 507 | | |
467 | 508 | | |
468 | | - | |
469 | | - | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
470 | 516 | | |
471 | 517 | | |
472 | 518 | | |
473 | | - | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
474 | 524 | | |
475 | 525 | | |
476 | 526 | | |
| |||
Lines changed: 101 additions & 38 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
11 | 10 | | |
12 | 11 | | |
13 | 12 | | |
14 | 13 | | |
15 | 14 | | |
16 | 15 | | |
17 | 16 | | |
| 17 | + | |
| 18 | + | |
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
| |||
24 | 25 | | |
25 | 26 | | |
26 | 27 | | |
| 28 | + | |
27 | 29 | | |
28 | 30 | | |
29 | 31 | | |
30 | 32 | | |
31 | 33 | | |
32 | 34 | | |
33 | | - | |
| 35 | + | |
34 | 36 | | |
35 | 37 | | |
36 | 38 | | |
| |||
310 | 312 | | |
311 | 313 | | |
312 | 314 | | |
| 315 | + | |
313 | 316 | | |
314 | 317 | | |
315 | 318 | | |
316 | 319 | | |
317 | 320 | | |
318 | | - | |
| 321 | + | |
319 | 322 | | |
320 | 323 | | |
321 | 324 | | |
322 | | - | |
| 325 | + | |
323 | 326 | | |
324 | 327 | | |
325 | 328 | | |
326 | 329 | | |
327 | 330 | | |
328 | | - | |
| 331 | + | |
329 | 332 | | |
330 | | - | |
| 333 | + | |
331 | 334 | | |
332 | 335 | | |
333 | 336 | | |
| |||
512 | 515 | | |
513 | 516 | | |
514 | 517 | | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
515 | 570 | | |
516 | 571 | | |
517 | 572 | | |
| |||
531 | 586 | | |
532 | 587 | | |
533 | 588 | | |
534 | | - | |
| 589 | + | |
535 | 590 | | |
536 | 591 | | |
537 | 592 | | |
538 | 593 | | |
539 | 594 | | |
540 | | - | |
| 595 | + | |
541 | 596 | | |
542 | | - | |
543 | | - | |
544 | | - | |
| 597 | + | |
| 598 | + | |
545 | 599 | | |
546 | 600 | | |
547 | 601 | | |
| |||
555 | 609 | | |
556 | 610 | | |
557 | 611 | | |
558 | | - | |
| 612 | + | |
559 | 613 | | |
560 | 614 | | |
561 | 615 | | |
562 | 616 | | |
563 | 617 | | |
564 | | - | |
| 618 | + | |
565 | 619 | | |
566 | | - | |
567 | | - | |
568 | | - | |
| 620 | + | |
| 621 | + | |
569 | 622 | | |
570 | 623 | | |
571 | 624 | | |
| |||
592 | 645 | | |
593 | 646 | | |
594 | 647 | | |
595 | | - | |
596 | | - | |
| 648 | + | |
| 649 | + | |
597 | 650 | | |
598 | 651 | | |
599 | 652 | | |
600 | 653 | | |
601 | 654 | | |
602 | 655 | | |
603 | | - | |
| 656 | + | |
604 | 657 | | |
605 | 658 | | |
606 | | - | |
607 | | - | |
608 | | - | |
609 | 659 | | |
610 | | - | |
| 660 | + | |
611 | 661 | | |
612 | 662 | | |
613 | 663 | | |
614 | 664 | | |
615 | | - | |
616 | | - | |
| 665 | + | |
| 666 | + | |
617 | 667 | | |
618 | 668 | | |
619 | 669 | | |
620 | 670 | | |
621 | 671 | | |
622 | 672 | | |
623 | | - | |
| 673 | + | |
624 | 674 | | |
625 | 675 | | |
626 | | - | |
627 | | - | |
628 | | - | |
629 | 676 | | |
630 | | - | |
| 677 | + | |
631 | 678 | | |
632 | 679 | | |
633 | 680 | | |
| |||
822 | 869 | | |
823 | 870 | | |
824 | 871 | | |
825 | | - | |
826 | | - | |
827 | | - | |
| 872 | + | |
| 873 | + | |
| 874 | + | |
828 | 875 | | |
829 | 876 | | |
830 | | - | |
| 877 | + | |
831 | 878 | | |
832 | 879 | | |
833 | 880 | | |
834 | 881 | | |
835 | 882 | | |
| 883 | + | |
836 | 884 | | |
837 | 885 | | |
838 | 886 | | |
| |||
845 | 893 | | |
846 | 894 | | |
847 | 895 | | |
848 | | - | |
849 | | - | |
| 896 | + | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
| 909 | + | |
| 910 | + | |
| 911 | + | |
| 912 | + | |
850 | 913 | | |
851 | 914 | | |
852 | | - | |
853 | | - | |
| 915 | + | |
| 916 | + | |
854 | 917 | | |
855 | 918 | | |
856 | 919 | | |
| |||
0 commit comments